From 831f32cf22aa1695a2641fb759ee90bbc31147f0 Mon Sep 17 00:00:00 2001 From: Toh4iem9 Date: Thu, 4 Sep 2025 16:46:09 +0200 Subject: [PATCH] new files added --- Experts/MyEAs/Indicator_Tester_EA.mq5 | 140 ++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 Experts/MyEAs/Indicator_Tester_EA.mq5 diff --git a/Experts/MyEAs/Indicator_Tester_EA.mq5 b/Experts/MyEAs/Indicator_Tester_EA.mq5 new file mode 100644 index 0000000..f6998c5 --- /dev/null +++ b/Experts/MyEAs/Indicator_Tester_EA.mq5 @@ -0,0 +1,140 @@ +//+------------------------------------------------------------------+ +//| Indicator_Tester_EA.mq5 | +//| Copyright 2025, xxxxxxxx| +//| | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2025, xxxxxxxx" +#property version "1.03" +#property description "A universal EA to test and optimize indicator strategies." + +#include +#include + +//--- Enum to select which indicator to test +enum ENUM_SIGNAL_TYPE + { + SIGNAL_SUPERTREND + }; + +//--- EA Input Parameters --- +input group "Strategy Settings" +input ENUM_SIGNAL_TYPE InpSignalType = SIGNAL_SUPERTREND; +input ulong InpMagicNumber = 12345; +input double InpLotSize = 0.01; +input int InpStopLossPips = 200; +input int InpTakeProfitPips = 600; + +input group "Supertrend Settings" +input int InpSupertrendPeriod = 10; +input double InpSupertrendMultiplier = 3.0; + +//--- Global Objects --- +CTrade g_trade; +CSignalBase *g_signal_module; + +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + switch(InpSignalType) + { + case SIGNAL_SUPERTREND: + { + CSignalSupertrend *st_module = new CSignalSupertrend(); + if(CheckPointer(st_module) == POINTER_INVALID) + return(INIT_FAILED); + if(!st_module.Init(_Symbol, _Period, InpSupertrendPeriod, InpSupertrendMultiplier)) + { + delete st_module; + return(INIT_FAILED); + } + g_signal_module = st_module; + break; + } + } + + if(CheckPointer(g_signal_module) == POINTER_INVALID) + { + Print("Failed to initialize a signal module."); + return(INIT_FAILED); + } + + g_trade.SetExpertMagicNumber(InpMagicNumber); + + return(INIT_SUCCEEDED); + } + +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { + if(CheckPointer(g_signal_module) != POINTER_INVALID) + delete g_signal_module; + } + +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- We only work on the open of a new bar for stability + static datetime last_bar_time = 0; + datetime time[1]; + if(CopyTime(_Symbol, _Period, 0, 1, time) <= 0) + return; + + if(time[0] == last_bar_time) + return; + last_bar_time = time[0]; + + if(CheckPointer(g_signal_module) == POINTER_INVALID) + return; + +//--- Get signals from the previous (closed) bar (shift=1) and the one before that (shift=2) + int current_signal = g_signal_module.GetSignal(1); + int previous_signal = g_signal_module.GetSignal(2); + +//--- Check for a new BUY signal (transition from not-buy to buy) + if(current_signal == 1 && previous_signal != 1) + { + //--- Close any open SELL positions with the same magic number + if(PositionSelect(_Symbol)) + { + if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL && PositionGetInteger(POSITION_MAGIC) == InpMagicNumber) + g_trade.PositionClose(_Symbol); + } + + //--- Open a new BUY position if no position for this EA exists + if(!PositionSelect(_Symbol) || PositionGetInteger(POSITION_MAGIC) != InpMagicNumber) + { + double price = SymbolInfoDouble(_Symbol, SYMBOL_ASK); + double sl = (InpStopLossPips > 0) ? price - InpStopLossPips * _Point : 0; + double tp = (InpTakeProfitPips > 0) ? price + InpTakeProfitPips * _Point : 0; + g_trade.Buy(InpLotSize, _Symbol, price, sl, tp, "Indicator Tester"); + } + } + +//--- Check for a new SELL signal (transition from not-sell to sell) + if(current_signal == -1 && previous_signal != -1) + { + //--- Close any open BUY positions with the same magic number + if(PositionSelect(_Symbol)) + { + if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && PositionGetInteger(POSITION_MAGIC) == InpMagicNumber) + g_trade.PositionClose(_Symbol); + } + + //--- Open a new SELL position if no position for this EA exists + if(!PositionSelect(_Symbol) || PositionGetInteger(POSITION_MAGIC) != InpMagicNumber) + { + double price = SymbolInfoDouble(_Symbol, SYMBOL_BID); + double sl = (InpStopLossPips > 0) ? price + InpStopLossPips * _Point : 0; + double tp = (InpTakeProfitPips > 0) ? price - InpTakeProfitPips * _Point : 0; + g_trade.Sell(InpLotSize, _Symbol, price, sl, tp, "Indicator Tester"); + } + } + } +//+------------------------------------------------------------------+ +//+------------------------------------------------------------------+