From edd8141c40ad3ae9f198ffbd4224af83f6584694 Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Fri, 9 May 2025 13:06:11 +0330 Subject: [PATCH] last ... --- Experts/x-saherelm.xcaea.ea.mq5 | 497 ++++++++++++++++++++------------ 1 file changed, 311 insertions(+), 186 deletions(-) diff --git a/Experts/x-saherelm.xcaea.ea.mq5 b/Experts/x-saherelm.xcaea.ea.mq5 index a631acc9..77d20a1f 100644 --- a/Experts/x-saherelm.xcaea.ea.mq5 +++ b/Experts/x-saherelm.xcaea.ea.mq5 @@ -35,9 +35,30 @@ // // Common ... input group "Common"; -input long eaMagicNumber = 78692110; // Magic Number -input int eaSlippage = 10; // Slippgae -input string eaLogSuffix = ""; // Log Suffix +input long eaMagicNumber = 78692110; // Magic Number +input int eaSlippage = 10; // Slippgae +input string eaLogSuffix = ""; // Log Suffix +input ENUM_TIMEFRAMES eaAnalysisPeriod = PERIOD_H1; // Analysis Period + +// +// Symbols ... +// +// ------------------------------------------------------- +// eaSymbols: +// ---------- +// - if EMPTY use Current Symbol; +// - for Multi Symbol use Comma Separated Symbols: +// EURUSDb,XAUUSDb +// +// eaSymbolSessions: +// ------------------ +// - if EMPTY use WHOLE Times; +// - for each Symbol use Comma Separated: +// (Name,[hh:mm],[hh:mm]), +// ------------------------------------------------------- +input group "Symbols"; +input string eaSymbols = "EURUSDb,XAUUSDb"; // Symbols Description +input string eaSymbolSessions = "()"; // Symbols Sessions // // Volume ... @@ -60,8 +81,6 @@ input ENUM_XCAEA_TRADE_RESTRICTION_PERIOD eaRestrictionsPeriod = XCAEA_TRADE_RES input int eaMaxAllowedTPs = 2; // Max Allowed TP(s) per Day input int eaMaxAllowedSLs = 2; // Max Allowed SL(s) per Day input int eaMaxAllowedTrades = 3; // Max Allowed Trades per Day -input string eaSessionStartTime = ""; // Trade Start Time -input string eaSessionEndTime = ""; // Trade End Time input int eaMaxAllowedPositions = 5; // Max Allowed Same Time Trades input double eaMaxAllowedSpread = 25; // Max Allowed Spread For Trade input double eaMaxAllowedDrawdownFactor = 0.3; // Max Allowed DrawDown for Trade @@ -97,7 +116,7 @@ XCTrade *eaTrade; XSignal eaSignal; XCVolume *eaVolume; XTimeTracker eaTimeTracker; -XCXCAEASignaller *eaSignaller; +XCXCAEASignaller *eaSignallers[]; XCXCAEATradeManager *eaTradeManager; XCAEAStrategyConditions eaConditions; @@ -159,19 +178,27 @@ void OnDeinit(const int reason) // REASON_CLOSE 9 Terminal closed // - eaSignaller.DeInit(); // ZeroMemory(eaAlert); ZeroMemory(eaTrade); ZeroMemory(eaVolume); - ZeroMemory(eaSignaller); // eaSignal.Clean(); eaConditions.Clean(); eaTimeTracker.Clean(); + // + int count = ArraySize(eaSignallers); + for (int i = 0; i < count; i++) + { + // + eaSignallers[i].DeInit(); + ZeroMemory(eaSignallers[i]); + } + Clean(eaSignallers); + // DestroyTimer(); } @@ -199,6 +226,7 @@ void OnTick() // double r2r = 4; string provider = "XCAEA"; + datetime cTime = TimeCurrent(); ENUM_POSITION_TYPE type = POSITION_TYPE_BUY; ENUM_X_ORDER_MODES mode = X_ORDER_MODE_MARKET; @@ -207,191 +235,204 @@ void OnTick() bool hasShort = false; // - // Start Calculations ... - - // - // Retrieve Common Data ... - string symbol = eaSignaller.GetSymbol(); - ENUM_TIMEFRAMES period = eaSignaller.GetPeriod(); - - // - datetime cTime = TimeCurrent(); - - // - // Required Value For SL/TP Calculations ... - double points = GetPoints(symbol); - double pip = GetPipPrice(symbol); - double pip2 = 2 * pip; - - // - has = eaSignaller.DetectSignalSetup( - r2r, - 300 // Max Allowed SL Distance ... - ); - if (has) - { - // - count = eaSignaller - .AddConditionsIfNotExists(); - - // - eaSignaller.mConditions.Clean(); - } - - // - // Check Setuped Conditions Exists ... - count = ArraySize(eaSignaller.mConditionsCollection); - has = IsValidSize(count); + // Checking Signallers ... + has = HasChild(eaSignallers); if (!has) { return; } // - for (int i = 0; i < count; i++) + int signallersCount = ArraySize(eaSignallers); + for (int is = 0; is < signallersCount; is++) { // - has = eaSignaller - .DetectSignalTrigger(eaSignaller - .mConditionsCollection[i]); + // Start Calculations ... // - // If Triggered ... + // Retrieve Common Data ... + string symbol = eaSignallers[is].GetSymbol(); + ENUM_TIMEFRAMES period = eaSignallers[is].GetPeriod(); + + // + // Required Value For SL/TP Calculations ... + double points = GetPoints(symbol); + double pip = GetPipPrice(symbol); + double pip2 = 2 * pip; + + // + // Detect Signal Setups ... + has = eaSignallers[is].DetectSignalSetup( + r2r, + 300 // Max Allowed SL Distance ... + ); if (has) { // - idx = i; - eaConditions = eaSignaller.mConditionsCollection[i]; - break; + count = eaSignallers[is] + .AddConditionsIfNotExists(); + + // + eaSignallers[is].mConditions.Clean(); } // - // Check Condition Validation ... - has = eaSignaller.mConditionsCollection[i].IsValid() && - eaSignaller.mConditionsCollection[i].IsSetuped(); + // Check Setuped Conditions Exists ... + count = ArraySize(eaSignallers[is].mConditionsCollection); + has = IsValidSize(count); if (!has) { - idx = i; + continue; } - } - // - // Remove Setuped Condition if provided IDX ... - has = IsValidIndex(idx); - if (has) - { // - ArrayRemove( - eaSignaller.mConditionsCollection, - idx, - 1 // + // Loop through Setuped Conditions for + // Validating or Looking up Triggers ... + for (int i = 0; i < count; i++) + { + // + // Check Signal Triggered or not ... + has = eaSignallers[is] + .DetectSignalTrigger(eaSignallers[is] + .mConditionsCollection[i]); + + // + // If Triggered ... + if (has) + { + // + idx = i; + eaConditions = eaSignallers[is].mConditionsCollection[i]; + break; + } + + // + // Check Condition Validation ... + has = eaSignallers[is].mConditionsCollection[i].IsValid() && + eaSignallers[is].mConditionsCollection[i].IsSetuped(); + if (!has) + { + idx = i; + } + } + + // + // Remove Setuped Condition if provided IDX ... + has = IsValidIndex(idx); + if (has) + { + // + ArrayRemove( + eaSignallers[is].mConditionsCollection, + idx, + 1 // + ); + } + + // + // Check EA Conditions is Valid or not ... + has = eaConditions.IsSetuped() && + eaConditions.CanTrigger(); + if (!has) + { + // + eaSignal.Clean(); + eaConditions.Clean(); + + // + continue; + } + + // + // Setting Time to Conditions ... + eaConditions.time = cTime; + has = ToPositionType( + type, + eaConditions.type // ); - } + if (!has) + { + // + eaSignal.Clean(); + eaConditions.Clean(); + + // + continue; + } - // - // Check EA Conditions is Valid or not ... - has = eaConditions.IsSetuped() && - eaConditions.CanTrigger(); - if (!has) - { // - eaConditions.Clean(); - return; - } + // Checking Trigger Direction ... + hasLong = eaConditions.HasBullishSignal(); + hasShort = eaConditions.HasBearishSignal(); + has = hasLong || + hasShort; + if (!has) + { + // + eaSignal.Clean(); + eaConditions.Clean(); + + // + continue; + } + + // + // Preparing Signal ... + eaSignal.mode = mode; + eaSignal.type = type; + eaSignal.entry = GetEntry( + eaConditions.symbol, + eaConditions.dir // + ); + eaSignal.provider = provider; + eaSignal.sl = eaConditions.sl; + eaSignal.tp = eaConditions.tp; + eaSignal.volume = X_MIN_VOLUME; + eaSignal.time = eaConditions.time; + eaSignal.symbol = eaConditions.symbol; + eaSignal.period = eaConditions.period; + eaSignal.partialCloseOnTPLevel = eaConditions.partialCloseOnTPLevel; + eaSignal.partialCloseMultiplier = eaConditions.partialCloseMultiplier; + + // + Copy( + eaConditions.targets, + eaSignal.targets // + ); + + // + // Validate Signal ... + has = eaSignal.IsValid(); + if (!has) + { + // + eaSignal.Clean(); + eaConditions.Clean(); + + // + continue; + } + + // + // Handle Volume Management ... + double iVolume = eaVolume.CalculateVolume(eaSignal); + if (iVolume > X_MIN_VOLUME && + iVolume != eaSignal.volume) + { + eaSignal.volume = iVolume; + } + + // + // Execute Signal ... + has = eaTradeManager.Execute( + eaSignal, + eaConditions // + ); - // - // Setting Time to Conditions ... - eaConditions.time = cTime; - has = ToPositionType( - type, - eaConditions.type // - ); - if (!has) - { // eaSignal.Clean(); eaConditions.Clean(); - - // - return; } - - // - // Checking Trigger Direction ... - hasLong = eaConditions.HasBullishSignal(); - hasShort = eaConditions.HasBearishSignal(); - has = hasLong || - hasShort; - if (!has) - { - // - eaSignal.Clean(); - eaConditions.Clean(); - - // - return; - } - - // - // Preparing Signal ... - // - eaSignal.mode = mode; - eaSignal.type = type; - eaSignal.entry = GetEntry( - eaConditions.symbol, - eaConditions.dir // - ); - eaSignal.provider = provider; - eaSignal.sl = eaConditions.sl; - eaSignal.tp = eaConditions.tp; - eaSignal.volume = X_MIN_VOLUME; - eaSignal.time = eaConditions.time; - eaSignal.symbol = eaConditions.symbol; - eaSignal.period = eaConditions.period; - eaSignal.partialCloseOnTPLevel = eaConditions.partialCloseOnTPLevel; - eaSignal.partialCloseMultiplier = eaConditions.partialCloseMultiplier; - - // - Copy( - eaConditions.targets, - eaSignal.targets // - ); - - // - has = eaSignal.IsValid(); - if (!has) - { - // - eaSignal.Clean(); - eaConditions.Clean(); - return; - } - - // - // Handle Volume Management ... - double iVolume = eaVolume.CalculateVolume(eaSignal); - if (iVolume > X_MIN_VOLUME && - iVolume != eaSignal.volume) - { - eaSignal.volume = iVolume; - } - - // - // Draw Signal ... - - // - // Execute Signal ... - - // - // eaSignal.sl = 0; - has = eaTradeManager.Execute( - eaSignal, - eaConditions // - ); - - // - eaSignal.Clean(); - eaConditions.Clean(); } // @@ -673,32 +714,116 @@ void InitRequirements() eaMaxAllowedTrades // ); + // + InitSymbolSessions(); + + // +} + +/** + * Initial Symbols and Active Sessions of EA ... + */ +void InitSymbolSessions() +{ + // + string symbols[]; + string sessions[]; + string iSymbol = NULL; + XCXCAEASignaller *iSignaller; + + // + // Parse Symbols ... + int symbolsCount = 0; + bool isMultiSymbol = IsValid(eaSymbols); + if (isMultiSymbol) + { + // + symbolsCount = SplitContent( + symbols, + eaSymbols // + ); + isMultiSymbol = IsValidSize(symbolsCount); + } + if (!isMultiSymbol) + { + // + Add( + _Symbol, + symbols // + ); + + // + symbolsCount = 1; + } + + // + // Parse Sessions ... + int sessionsCount = 0; + bool hasSession = IsValid(eaSymbolSessions); + if (hasSession) + { + // + sessionsCount = SplitContent( + sessions, + eaSymbolSessions // + ); + } + + // + // Setting Up Symbols ... + + // + for (int i = 0; i < symbolsCount; i++) + { + // + iSymbol = symbols[i]; + + // + // EA Signaller ... + iSignaller = new XCXCAEASignaller( + iSymbol, + _Period, + eaAnalysisPeriod // Analysing Period ... + ); + + // + Add( + iSignaller, + eaSignallers // + ); + + // + ZeroMemory(iSignaller); + } + + // + // Setting Up Sessions ... + if (hasSession) + { + // + } + // // Setting Sessions ... - eaTradeManager - .SetTradeSession( - _Symbol, - "01:30", // Start ... - "14:25", // End ... - "XSaherSession" // Name ... - ); - eaTradeManager - .SetTradeSession( - _Symbol, - "19:30", // Start ... - "11:30", // End ... - "XSaherSession" // Name ... - ); - - // - // EA Signaller ... - eaSignaller = new XCXCAEASignaller( - _Symbol, - _Period, - PERIOD_H1 // Analysing Period ... - ); + // eaTradeManager + // .SetTradeSession( + // _Symbol, + // "01:30", // Start ... + // "14:25", // End ... + // "XSaherSession" // Name ... + // ); + // eaTradeManager + // .SetTradeSession( + // _Symbol, + // "19:30", // Start ... + // "11:30", // End ... + // "XSaherSession" // Name ... + // ); // + Clean(symbols); + Clean(sessions); + ZeroMemory(iSignaller); } /**