From 07d56d4f8b8563403f74f3c5f501d98106fde837 Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Thu, 11 Sep 2025 14:20:21 +0330 Subject: [PATCH] last ... --- Classes/x-saherelm.x-trade-manager.class.mq5 | 70 +++++++++++++------- XOM1EA/Classes/xom1ea.expert.class.mq5 | 1 + 2 files changed, 46 insertions(+), 25 deletions(-) diff --git a/Classes/x-saherelm.x-trade-manager.class.mq5 b/Classes/x-saherelm.x-trade-manager.class.mq5 index e70ee377..d5282b4a 100644 --- a/Classes/x-saherelm.x-trade-manager.class.mq5 +++ b/Classes/x-saherelm.x-trade-manager.class.mq5 @@ -26,6 +26,7 @@ #include "../Classes/x-saherelm.x-guard.class.mq5" #include "../Classes/x-saherelm.x-poi.drawer.class.mq5" #include "../Classes/x-saherelm.x-trade.class.mq5" +#include "../Classes/x-saherelm.x-volume.class.mq5" // // Implementation ... @@ -39,6 +40,7 @@ class XCTradeManager : public XCBase XCAlert *alert; XCGuard *guard; XCTrade *trader; + XCVolume *volume; XTimeTracker timeTracker; XCDataCollector *collector; @@ -50,12 +52,14 @@ class XCTradeManager : public XCBase XCTradeManager( XCAlert *_alert, XCTrade *_trader, + XCVolume *_volume, XCGuard *_guard // ) { // alert = _alert; guard = _guard; + volume = _volume; trader = _trader; // @@ -666,12 +670,12 @@ class XCTradeManager : public XCBase if (canPC) { // - double volume = jTarget.volumeMultiplier * iPosition.volume; - volume = NormalizeVolume(volume, iPosition.symbol); + double _volume = jTarget.volumeMultiplier * iPosition.volume; + _volume = NormalizeVolume(_volume, iPosition.symbol); string comment = "RF On Target ..."; isPCDone = trader.ClosePartial( iPosition.ticket, - volume, + _volume, comment // ); } @@ -803,7 +807,8 @@ class XCTradeManager : public XCBase // // Check Trade Permission ... - if (!allowTrade) + result = AllowTrade(signal.type); + if (!result) { // result = false; @@ -814,34 +819,21 @@ class XCTradeManager : public XCBase } // - bool isLong = IsLong(signal.type); - bool isShort = IsShort(signal.type); - - // - bool isLongAndAllowed = - isLong && - allowLongs; - - // - bool isShortAndAllowed = - isShort && - allowShorts; - - // - result = isLongAndAllowed || - isShortAndAllowed; + // Check Sessions and Restrictions ... + result = CanAnalyse( + signal.symbol, + signal.period, + signal.time // + ); if (!result) { // - executionResult = X_SIGNAL_EXECUTION_FAILED_NOT_ALLOWED; + executionResult = X_SIGNAL_EXECUTION_FAILED_DELAY_NOT_PASSED; // return result; } - // - // TODO: Complete this ... - // return result; } @@ -1079,6 +1071,7 @@ class XCTradeManager : public XCBase // // Check Signal ... + bool isExecuted = false; ENUM_X_SIGNAL_EXECUTION_RESULT signalExecutionResult; bool canExecute = CheckSignal( signal, @@ -1086,7 +1079,9 @@ class XCTradeManager : public XCBase ); if (canExecute) { - bool isExecuted = Execute(signal); + // + HandleSignalVolume(signal); + isExecuted = Execute(signal); } // @@ -1491,6 +1486,31 @@ class XCTradeManager : public XCBase { } + /** + * Apply Signal Volume ... + * + * @param signal: XSignal + */ + void HandleSignalVolume(XSignal &signal) + { + // + // Validate ... + if (!signal.IsValid()) + { + return; + } + + // + // Handle Volume Management ... + double iVolume = volume.CalculateVolume(signal); + bool has = iVolume > X_MIN_VOLUME && + iVolume != signal.volume; + if (has) + { + signal.volume = iVolume; + } + } + /** * Find Executed Trade by Providing Position Ticket ... * diff --git a/XOM1EA/Classes/xom1ea.expert.class.mq5 b/XOM1EA/Classes/xom1ea.expert.class.mq5 index a4521836..5f0f1452 100644 --- a/XOM1EA/Classes/xom1ea.expert.class.mq5 +++ b/XOM1EA/Classes/xom1ea.expert.class.mq5 @@ -507,6 +507,7 @@ class XCXOM1EAExpert : public XCBase eaTradeManager = new XCTradeManager( eaAlert, eaTrade, + eaVolume, eaGuard // );