Skip to content

Commit

Permalink
Updated for ver.
Browse files Browse the repository at this point in the history
  • Loading branch information
9nix6 committed May 10, 2021
1 parent 848a552 commit 5f42483
Show file tree
Hide file tree
Showing 22 changed files with 414 additions and 181 deletions.
Binary file modified Experts/2MA_Cross.ex5
Binary file not shown.
147 changes: 110 additions & 37 deletions Experts/2MA_Cross.mq5
Original file line number Diff line number Diff line change
@@ -1,30 +1,37 @@
#property copyright "Copyright 2017-2021, Artur Zas"
// GNU General Public License v3.0 -> https://github.com/9nix6/Median-and-Turbo-Renko-indicator-bundle/blob/master/LICENSE
#property link "https://www.az-invest.eu"
#property version "1.15"
#define VERSION "1.20"
#property version VERSION
#property description "Example EA: Trading based on 2 moving average crossover."
#property description "MA1 && MA2 need to be enabled on the inicator creating the chart."
#property description "MA1 - Fast moving average"
#property description "MA2 - Slow moving average"
#property description " "
#property description "GNU General Public License v3.0"

//#define RANGEBAR_LICENSE // uncomment when used on a Tick & Volume bar chart from https://www.az-invest.eu/rangebars-for-metatrader-5
//#define ULTIMATE_RENKO_LICENSE // uncomment when used on Ultimate Renko chart from https://www.az-invest.eu/ultimate-renko-indicator-generator-for-metatrader-5
//#define VOLUMECHART_LICENSE // uncomment when used on a Tick & Volume bar chart from https://www.az-invest.eu/Tick-chart-and-volume-chart-for-mt5
//#define RANGEBAR_LICENSE // uncomment when used on a Tick & Volume bar chart from https://www.az-invest.eu/rangebars-for-metatrader-5
//#define SECONDSCHART_LICENSE // uncomment when used on a Seconds TF bar chart from https://www.az-invest.eu/seconds-timeframe-chart-for-metatrader-5

//#define LINEBREAKCHART_LICENSE // uncomment when used on a Line Break chart from https://www.az-invest.eu/linebreak-chart-for-metatrader-5
//
// Uncomment only ONE of the 5 directives listed below and recompile
// -----------------------------------------------------------------
//
//
//#define EA_ON_RANGE_BARS // Use EA on RangeBar chart
#define EA_ON_RENKO // Use EA on Renko charts
//#define EA_ON_XTICK_CHART // Use EA on XTick Chart
//#define EA_ON_TICK_VOLUME_CHART // Use EA on Tick & Volume Bar Chart
//#define EA_ON_SECONDS_CHART // Use EA on Seconds Interval chart
//#define EA_ON_RANGE_BARS // Use EA on RangeBar chart
#define EA_ON_RENKO // Use EA on Renko charts
//#define EA_ON_XTICK_CHART // Use EA on XTick Chart (obsolete)
//#define EA_ON_TICK_VOLUME_CHART // Use EA on Tick & Volume Bar Chart
//#define EA_ON_SECONDS_CHART // Use EA on Seconds Interval chart
//#define EA_ON_LINEBREAK_CHART // Use EA on LineBreak charts

//#define DEVELOPER_VERSION // used when I develop ;) should always be commented out

// Uncomment the directive below and recompile if EA is used with P-Renko BR Ultimate
// ----------------------------------------------------------------------------------
//
// #define P_RENKO_BR_PRO // Use in P-Renko BR Ultimate version
//#define P_RENKO_BR_PRO // Use in P-Renko BR Ultimate version

//
// Uncomment the directive below and recompile for use in a backtest only
Expand Down Expand Up @@ -54,9 +61,14 @@
#include <AZ-INVEST/SDK/SecondsChart.mqh>
SecondsChart *customBars = NULL;
#endif
#ifdef EA_ON_LINEBREAK_CHART
#include <AZ-INVEST/SDK/LineBreakChart.mqh>
LineBreakChart *customBars = NULL;
#endif

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

enum ENUM_TRADE_DIRECTION
{
Expand All @@ -65,24 +77,31 @@ enum ENUM_TRADE_DIRECTION
TRADE_DIRECTION_ALL = 1000, // Buy & Sell
};


#ifdef SHOW_INDICATOR_INPUTS
input group "EA parameters"
input group "### EA parameters"
#endif
input double Lots = 0.1; // Traded lots
input uint StopLoss = 100; // Stop Loss (in points)
input uint TakeProfit = 250; // Take profit (in points)
input uint TakeProfit = 300; // Take profit (in points)
input ENUM_TRADE_DIRECTION ValidTradeDirection = TRADE_DIRECTION_ALL; // Valid trading type
input bool ForceSR = false; // Force Stop & Reverse
input bool ReverseOnMACrossInsideGap = true; // Reverse trade if MA cross inside a gap
input bool CloseTradeAfterTradingHours = true; // Close trade after trading hours
input ulong DeviationPoints = 0; // Maximum defiation (in points)
input double ManualTickSize = 0.000; // Tick Size (0 = auto detect)
input group "### Trading schedule (Non stop if start = 0 & end = 0)"
input string Start="9:00"; // Start trading at
input string End="17:55"; // End trading at
input bool CloseTradeAfterTradingHours = false; // Close trade after trading hours
input group "### Trade management";
input int InpBEPoints = 0; // BreakEven (Points) [ 0 = OFF ]
input int InpTrailByPoints = 0; // Trail by (Points) [ 0 = OFF ]
input int InpTrailStartPoints = 150; // Start trailing after (Points)
input int InpPartialCloseAtProfitPoints = 0; // Partial close at (Points) [ 0 = OFF ]
input int InpPartialClosePercentage = 50; // Partial close %
input group "### Misc";
input ulong MagicNumber=5150; // Assign trade ID
input ulong DeviationPoints = 0; // Maximum deviation (in points)
input double ManualTickSize = 0.000; // Tick Size (0 = auto detect)
input int NumberOfRetries = 50; // Maximum number of retries
input int BusyTimeout_ms = 1000; // Wait [ms] before retry on bussy errors
input int BusyTimeout_ms = 1000; // Wait [ms] before retry on busy errors
input int RequoteTimeout_ms = 250; // Wait [ms] before retry on requotes

// Global data buffers
Expand All @@ -99,8 +118,10 @@ int numberOfBars = 3;

CMarketOrder *marketOrder = NULL;
CTimeControl *timeControl = NULL;
CTradeManager *tradeManager = NULL;

ulong currentTicket;
CTradeManagerState tradeManagerState;
ENUM_POSITION_TYPE currentPositionType;
ENUM_POSITION_TYPE signal;
ENUM_POSITION_TYPE validation;
Expand All @@ -125,6 +146,10 @@ ENUM_POSITION_TYPE validation;
static int _MA1 = SECONDS_MA1;
static int _MA2 = SECONDS_MA2;
#endif
#ifdef EA_ON_LINEBREAK_CHART
static int _MA1 = LINEBREAK_MA1;
static int _MA2 = LINEBREAK_MA2;
#endif

//+------------------------------------------------------------------+
//| Expert initialization function |
Expand All @@ -148,6 +173,9 @@ int OnInit()
#ifdef EA_ON_SECONDS_CHART
customBars = new SecondsChart(MQLInfoInteger((int)MQL5_TESTING) ? false : true);
#endif
#ifdef EA_ON_LINEBREAK_CHART
customBars = new LineBreakChart(MQLInfoInteger((int)MQL5_TESTING) ? false : true);
#endif
}

customBars.Init();
Expand Down Expand Up @@ -177,7 +205,25 @@ int OnInit()

timeControl.SetValidTraingHours(Start,End);

return(INIT_SUCCEEDED);
//
// Init TradeManager
//

CTradeManagerParameters params2;
{
params2.BEPoints = InpBEPoints;
params2.TrailByPoints = InpTrailByPoints;
params2.TrailStartPoints = InpTrailStartPoints;
params2.PartialCloseAtProfitPoints = InpPartialCloseAtProfitPoints;
params2.PartialClosePercentage = InpPartialClosePercentage;
}

if(tradeManager == NULL)
{
tradeManager = new CTradeManager(params2, marketOrder);
}

return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
Expand Down Expand Up @@ -209,28 +255,29 @@ void OnDeinit(const int reason)
delete customBars;
customBars = NULL;
}


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

Comment("");
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if(marketOrder == NULL || customBars == NULL || timeControl == NULL)
if(marketOrder == NULL || customBars == NULL || timeControl == NULL || tradeManager == NULL)
return;

if(customBars.IsNewBar())
// trade management

if(marketOrder.IsOpen(currentTicket, _Symbol, MagicNumber))
{
if(timeControl.IsScheduleEnabled())
{
Comment("EA trading schedule ON ("+Start+" to "+End+") | trading enabled = "+(string)timeControl.IsTradingTimeValid());
}
else
{
Comment("EA trading schedule OFF");
}

// checks done on every tick

if(!timeControl.IsTradingTimeValid())
{
if(marketOrder.IsOpen(currentTicket,_Symbol,MagicNumber))
Expand All @@ -244,6 +291,22 @@ void OnTick()

return;
}

tradeManager.Manage(currentTicket, tradeManagerState);
}

// Signal handler

if(customBars.IsNewBar())
{
if(timeControl.IsScheduleEnabled())
{
Comment("EA trading schedule ON ("+Start+" to "+End+") | trading enabled = "+(string)timeControl.IsTradingTimeValid());
}
else
{
Comment("EA trading schedule OFF");
}

//
// Get moving average values for current, last completed bar and the bar before that...
Expand All @@ -266,19 +329,21 @@ void OnTick()
if(timeControl.IsScheduleEnabled())
{
Comment("EA trading schedule ("+Start+" to "+End+") | trading enabled = "+(string)timeControl.IsTradingTimeValid()+
"\n MA1 [2]: "+DoubleToString(MA1[2],_Digits)+" [1]: "+DoubleToString(MA1[1],_Digits)+
"\n MA2 [2]: "+DoubleToString(MA2[2],_Digits)+" [1]: "+DoubleToString(MA2[1],_Digits)+
// "\n MA1 [2]: "+DoubleToString(MA1[2],_Digits)+" [1]: "+DoubleToString(MA1[1],_Digits)+
// "\n MA2 [2]: "+DoubleToString(MA2[2],_Digits)+" [1]: "+DoubleToString(MA2[1],_Digits)+
"\n MA cross signal = "+marketOrder.PositionTypeToString(signal)+
"\n MA validation = "+marketOrder.PositionTypeToString(validation)+
"\n Trade manager: "+tradeManager.ToString()+
"\n");
}
else
{
Comment("EA trading schedule not used. Trading is enabled."+
"\n MA1 [2]: "+DoubleToString(MA1[2],_Digits)+" [1]: "+DoubleToString(MA1[1],_Digits)+
"\n MA2 [2]: "+DoubleToString(MA2[2],_Digits)+" [1]: "+DoubleToString(MA2[1],_Digits)+
// "\n MA1 [2]: "+DoubleToString(MA1[2],_Digits)+" [1]: "+DoubleToString(MA1[1],_Digits)+
// "\n MA2 [2]: "+DoubleToString(MA2[2],_Digits)+" [1]: "+DoubleToString(MA2[1],_Digits)+
"\n MA cross signal = "+marketOrder.PositionTypeToString(signal)+
"\n MA validation = "+marketOrder.PositionTypeToString(validation)+
"\n Trade manager: "+tradeManager.ToString()+
"\n");
}

Expand All @@ -292,15 +357,18 @@ void OnTick()
{
PrintFormat("Reversing %s position on Stop&Reverse condition (ticket:%d)", _Symbol, currentTicket);
marketOrder.Reverse(currentTicket,Lots,StopLoss,TakeProfit);
tradeManagerState.Clear();
}
}
return;
}
else if(!marketOrder.IsOpen(_Symbol,POSITION_TYPE_BUY,MagicNumber))
{
if(IsTradeDirectionValid(POSITION_TYPE_BUY))
{
marketOrder.Long(_Symbol,Lots,StopLoss,TakeProfit);

tradeManagerState.Clear();
}
return;
}
}
Expand All @@ -314,15 +382,18 @@ void OnTick()
{
PrintFormat("Reversing %s position on Stop&Reverse condition (ticket:%d)", _Symbol, currentTicket);
marketOrder.Reverse(currentTicket,Lots,StopLoss,TakeProfit);
tradeManagerState.Clear();
}
}
return;
}
else if(!marketOrder.IsOpen(_Symbol,POSITION_TYPE_SELL,MagicNumber))
{
if(IsTradeDirectionValid(POSITION_TYPE_SELL))
{
tradeManagerState.Clear();
marketOrder.Short(_Symbol,Lots,StopLoss,TakeProfit);

}
return;
}
}
Expand All @@ -343,18 +414,20 @@ void OnTick()
// reverse position on signal change inside gap.
PrintFormat("Reversing %s position on signal change inside gap (ticket:%d)", _Symbol, currentTicket);
marketOrder.Reverse(currentTicket,Lots,StopLoss,TakeProfit);
tradeManagerState.Clear();
}
else
{
// close position on signal change inside gap.
PrintFormat("Closing %s position on signal change inside gap (ticket:%d)", _Symbol, currentTicket);
marketOrder.Close(currentTicket);
tradeManagerState.Clear();
}
}
}
}
}
}
}
}

//
Expand Down
Binary file added Experts/ExampleEA.ex5
Binary file not shown.
19 changes: 12 additions & 7 deletions Experts/ExampleEA.mq5
Original file line number Diff line number Diff line change
@@ -1,27 +1,32 @@
//
// Copyright 2017-2020, Artur Zas
// Copyright 2017-2021, Artur Zas
// https://www.az-invest.eu
// https://www.mql5.com/en/users/arturz
//

#property copyright "Copyright 2017-2020, Artur Zas"
#property link "https://www.mql5.com/en/users/arturz"
#property version "3.01"
#property copyright "Copyright 2017-2021, Artur Zas"
#property link "https://www.az-invest.eu"
#property version "3.02"
#property description "Example EA showing the way to use the MedianRenko class defined in MedianRenko.mqh"
#property strict
//#define ULTIMATE_RENKO_LICENSE // uncomment when used on Ultimate Renko chart from https://www.az-invest.eu/ultimate-renko-indicator-generator-for-metatrader-5

//
// 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
// NOT using the '#define SHOW_INDICATOR_INPUTS' statement will read the settings a chart with
// the MedianRenko indicator attached.
// Uncomment the directive below and recompile for use in a backtest only
//
// #define SHOW_INDICATOR_INPUTS

//#define SHOW_INDICATOR_INPUTS
// #define DEVELOPER_VERSION // used when I develop ;) should always be commented out

// Uncomment the directive below and recompile if EA is used with P-Renko BR Ultimate
// ----------------------------------------------------------------------------------
//#define P_RENKO_BR_PRO // Use in P-Renko BR Ultimate version
//
// #define P_RENKO_BR_PRO // Use in P-Renko BR Ultimate version

//
// You need to include the MedianRenko.mqh header file
Expand Down
Binary file added Experts/ExampleEA2.ex5
Binary file not shown.
Loading

0 comments on commit 5f42483

Please sign in to comment.