Skip to content

Commit

Permalink
Bug fixes and compatibility with version 2.01
Browse files Browse the repository at this point in the history
  • Loading branch information
9nix6 committed Nov 17, 2017
1 parent a91d9a0 commit 0d108cd
Show file tree
Hide file tree
Showing 33 changed files with 1,335 additions and 197 deletions.
6 changes: 3 additions & 3 deletions Experts/ExampleEA.mq5
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#property copyright "Copyright 2017, AZ-iNVEST"
#property link "http://www.az-invest.eu"
#property version "2.04"
#property version "2.05"
#property description "Example EA showing the way to use the MedianRenko class defined in MedianRenko.mqh"

//
Expand Down Expand Up @@ -96,7 +96,7 @@ void OnTick()
double MA1[]; // array to be filled by values of the first moving average
double MA2[]; // array to be filled by values of the second moving average

if(medianRenko.GetMA1(MA1,startAtBar,numberOfBars) && medianRenko.GetMA2(MA2,startAtBar,numberOfBars))
if(medianRenko.GetMA1(MA1,startAtBar,numberOfBars) && medianRenko.GetMA1(MA2,startAtBar,numberOfBars))
{
//
// Values are stored in the MA1 and MA2 arrays and are now ready for use
Expand Down Expand Up @@ -138,7 +138,7 @@ void OnTick()
(RenkoRatesInfoArray[2].open < RenkoRatesInfoArray[2].close))
{
// bearish reversal
infoString = "Previous bar formed bearich reversal";
infoString = "Previous bar formed bearish reversal";
}
else
{
Expand Down
233 changes: 233 additions & 0 deletions Experts/ExampleEA2.mq5
Original file line number Diff line number Diff line change
@@ -0,0 +1,233 @@
#property copyright "Copyright 2017, AZ-iNVEST"
#property link "http://www.az-invest.eu"
#property version "1.00"
#property description "Example EA: Trading based on Renko SuperTrend signals."
#property description "One trade at a time. Each trade has TP & SL"

//
// Helper functions for placing market orders.
//

#include <AZ-INVEST/SDK/TradeFunctions.mqh>

//
// Inputs
//

input double InpLotSize = 0.1;
input int InpSLPoints = 200;
input int InpTPPoints = 600;

input ulong InpMagicNumber=5150;
input ulong InpDeviationPoints = 0;
input int InpNumberOfRetries = 50;
input int InpBusyTimeout_ms = 1000;
input int InpRequoteTimeout_ms = 250;

//
// Globa variables
//

ENUM_POSITION_TYPE Signal;
ulong currentTicket;

//
// SHOW_INDICATOR_INPUTS *NEEDS* to be defined, if the EA needs to be *tested in MT5's backtester*
// -------------------------------------------------------------------------------------------------
// Using '#define SHOW_INDICATOR_INPUTS' will show the MedianRenko indicator's inputs
// NOT using the '#define SHOW_INDICATOR_INPUTS' statement will read the settigns a chart with
// the MedianRenko indicator attached.
//

#define SHOW_INDICATOR_INPUTS

//
// You need to include the MedianRenko.mqh header file
//

#include <AZ-INVEST/SDK/MedianRenko.mqh>
//
// To use the MedainRenko indicator in your EA you need do instantiate the indicator class (MedianRenko)
// and call the Init() method in your EA's OnInit() function.
// Don't forget to release the indicator when you're done by calling the Deinit() method.
// Example shown in OnInit & OnDeinit functions below:
//

MedianRenko * medianRenko;
CMarketOrder * marketOrder;

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
medianRenko = new MedianRenko();
if(medianRenko == NULL)
return(INIT_FAILED);

medianRenko.Init();
if(medianRenko.GetHandle() == INVALID_HANDLE)
return(INIT_FAILED);

//
// Init MarketOrder class - used for placing market ortders.
//

CMarketOrderParameters params;
{
params.m_async_mode = false;
params.m_magic = InpMagicNumber;
params.m_deviation = InpDeviationPoints;
params.m_type_filling = ORDER_FILLING_FOK;

params.numberOfRetries = InpNumberOfRetries;
params.busyTimeout_ms = InpBusyTimeout_ms;
params.requoteTimeout_ms = InpRequoteTimeout_ms;
}
marketOrder = new CMarketOrder(params);

return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(medianRenko != NULL)
{
medianRenko.Deinit();
delete medianRenko;
}

//
// delete MarketOrder class
//

if(marketOrder != NULL)
{
delete marketOrder;
}
}

//
// At this point you may use the renko data fetching methods in your EA.
// Brief demonstration presented below in the OnTick() function:
//

//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//
// It is considered good trading & EA coding practice to perform calculations
// when a new bar is fully formed.
// The IsNewBar() method is used for checking if a new renko bar has formed
//

if(medianRenko.IsNewBar())
{

//
// Getting SuperTrend values is done using the
// GetSuperTrend(double &SuperTrendHighArray[], double &SuperTrendArray[], double &SuperTrendLowArray[], int start, int count)
// method. Example below:
//

double HighArray[]; // This array will store the values of the high SuperTrend line
double MidArray[]; // This array will store the values of the middle SuperTrend line
double LowArray[]; // This array will store the values of the low SuperTrend line

int startAtBar = 1; // get values starting from the last completed bar.
int numberOfBars = 2; // gat a total of 3 values (for 3 bars starting from bar 1 (last completed))

if(medianRenko.GetSuperTrend(HighArray,MidArray,LowArray,startAtBar,numberOfBars))
{
//
// Read signal bar's time for optional debug log
//

string barTime = "";
MqlRates RenkoRatesInfoArray[]; // This array will store the MqlRates data for renkos
if(medianRenko.GetMqlRates(RenkoRatesInfoArray,startAtBar,numberOfBars))
barTime = (string)RenkoRatesInfoArray[0].time;
//
//
//

if(SuperTrendSignal(HighArray,MidArray,LowArray,Signal,barTime))
{
if(Signal == POSITION_TYPE_NONE)
return;

//
// Trade signal on the SuperTrend indicator
// Open trade only if there are currntly no active trades
//

if(!marketOrder.IsOpen(currentTicket,_Symbol,InpMagicNumber))
{
if(Signal == POSITION_TYPE_BUY)
{
Print("BUY signal at "+barTime); // optional debug log

if(marketOrder.Long(_Symbol,InpLotSize,InpSLPoints,InpTPPoints))
Print("Long position opened.");
}
else if(Signal == POSITION_TYPE_SELL)
{
Print("SELL singal at "+barTime); // optional debug log

if(marketOrder.Short(_Symbol,InpLotSize,InpSLPoints,InpTPPoints))
Print("Short position opened.");
}
}


}
}

}
}

//
// Function determines the trade signal on the SuperTrend indicator
//

bool SuperTrendSignal(double &H[], double &M[], double &L[], ENUM_POSITION_TYPE &signal,string time)
{
if((H[1] == 0) && (L[1] == 0)) // no data to process
{
signal = POSITION_TYPE_NONE;
return false;
}

// Uncomment line below for optional debug output:
//Print(time+": H[1] = "+DoubleToString(H[1],_Digits)+" L[0] = "+DoubleToString(L[0],_Digits)+" | L[1] = "+DoubleToString(L[1],_Digits)+" H[0] = "+DoubleToString(H[0],_Digits));

if((H[1] == M[1]) && (L[0] == M[0]))
{
//
// Super trend shifted from Low to High band => Buy Signal
//

signal = POSITION_TYPE_BUY;
return true;
}
else if((L[1] == M[1]) && (H[0] == M[0]))
{
//
// Super trend shifted from High to Low band => Sell Signal
//

signal = POSITION_TYPE_SELL;
return true;
}

//
// No signal detected
//

signal = POSITION_TYPE_NONE;
return false;
}
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
#ifdef P_RENKO_BR
#define RENKO_INDICATOR_NAME "P-RENKO BR Lite"
#else
//#define RENKO_INDICATOR_NAME "MedianRenko\\MedianRenkoOverlay200h"
//#define RENKO_INDICATOR_NAME "MedianRenko\\MedianRenkoOverlay201"
#define RENKO_INDICATOR_NAME "Market\\Median and Turbo renko indicator bundle"
#endif

Expand Down Expand Up @@ -310,16 +310,16 @@ void MedianRenko::Deinit()
bool MedianRenko::IsNewBar()
{
MqlRates currentRenko[1];
static MqlRates prevRenko;
static datetime prevRenkoTime;

GetMqlRates(currentRenko,1,1);
GetMqlRates(currentRenko,0,1);

if(currentRenko[0].time == 0)
return false;

if(prevRenko.time < currentRenko[0].time)
if(prevRenkoTime < currentRenko[0].time)
{
prevRenko.time = currentRenko[0].time;
prevRenkoTime = currentRenko[0].time;
return true;
}

Expand Down
Loading

0 comments on commit 0d108cd

Please sign in to comment.