diff --git a/Classes/x-saherelm.x-expert.class.mq5 b/Classes/x-saherelm.x-expert.class.mq5 index ab3942bb..5dac991d 100644 --- a/Classes/x-saherelm.x-expert.class.mq5 +++ b/Classes/x-saherelm.x-expert.class.mq5 @@ -27,6 +27,7 @@ #include "../Classes/x-saherelm.x-chart.helper.class.mq5" #include "../Classes/x-saherelm.x-guard.class.mq5" #include "../Classes/x-saherelm.x-signaller.class.mq5" +#include "../Classes/x-saherelm.x-target.class.mq5" #include "../Classes/x-saherelm.x-trade-manager.class.mq5" #include "../Classes/x-saherelm.x-volume.class.mq5" @@ -121,11 +122,12 @@ class XCBaseExpert : public XCBase // XCAlert *eaAlert; // EA Scope Alert Handler ... - XCVolume *eaVolume; // EA Scope Voluem Handler ... XCGuard *eaGuard; // EA Scope Guard Handler ... XCTrade *eaTrader; // EA Scope Trade Handler ... - XCTradeManager *eaTradeManager; // EA Scope Trade Handler ... + XCVolume *eaVolume; // EA Scope Voluem Handler ... + XCTarget *eaTarget; // EA Scope Target Handler ... XTimeTracker eaTimeTracker; // EA Scope Time Tracker ... + XCTradeManager *eaTradeManager; // EA Scope Trade Manager Handler ... // // Specified Event Handlers ... @@ -319,6 +321,19 @@ class XCBaseExpert : public XCBase } } + // + // Signal Executed Event Handlers ... + count = ArraySize(mOnSignalExecutedEventHandlers); + has = IsValidSize(count); + if (has) + { + // + for (int i = 0; i < count; i++) + { + eaTrader.AddOnSignalExecutedEventHandler(mOnSignalExecutedEventHandlers[i]); + } + } + // // Initialize Guard Handler ... eaGuard = new XCGuard( @@ -330,13 +345,18 @@ class XCBaseExpert : public XCBase // Attach Event Handler ... eaGuard.onGuardEventListener = onGuardedEventHandler; + // + // Initialize Target Handler ... + eaTarget = new XCTarget(eaTrader, eaAlert); + // // Initialize Trae Manager ... eaTradeManager = new XCTradeManager( eaAlert, eaTrader, eaVolume, - eaGuard // + eaGuard, + eaTarget // ); // @@ -423,6 +443,11 @@ class XCBaseExpert : public XCBase delete eaVolume; ZeroMemory(eaVolume); + // + eaTarget.Destroy(); + delete eaTarget; + ZeroMemory(eaTarget); + // delete eaTradeManager; ZeroMemory(eaTradeManager); @@ -536,13 +561,29 @@ class XCBaseExpert : public XCBase } /** - * Check For Guard Event Handler ... + * Handle Signal Executed Event ... * - * @param guards: XGuard[] + * @param signal: XSignal, reference to Executed Signal ... + */ + void HandleOnSignalExecuted(XSignal &signal) + { + eaTradeManager.target.AddExecutedSignal(signal); + } + + /** + * Check For Guard ... + * + * @param guards: XGuard, reference Collection to holds result ... + * @param positions: XPosition, refrence collection to Provides Positions ... + * @param barIndex: int, Specified Bar index ... * * @return ( int ) */ - int CheckForGuardTriggered(XGuard &guards[]) + int CheckForGuardTriggered( + XGuard &guards[], + XPosition &positions[], + int barIndex = 0 // + ) { // int result = 0; @@ -559,7 +600,11 @@ class XCBaseExpert : public XCBase { // XGuard iGuards[]; - int iGuardsCount = eaSignallers[i].CheckForGuard(iGuards); + int iGuardsCount = eaSignallers[i].CheckForGuard( + iGuards, + positions, + barIndex // + ); if (IsValidSize(iGuardsCount)) { // @@ -803,6 +848,23 @@ class XCBaseExpert : public XCBase ); } + // + // Add New Signal Executed Event Handler ... + void AddOnSignalExecutedEventHandler(TOnSignal handler) + { + // + if (handler == NULL) + { + return; + } + + // + Add( + handler, + mOnSignalExecutedEventHandlers // + ); + } + // // Trade Event Handlers ... @@ -1077,6 +1139,7 @@ class XCBaseExpert : public XCBase TOnSignal mOnSignalEventHandlers[]; TOnStopLoss mStopLossEventHandlers[]; TOnTakeProfit mTakeProfitEventHandlers[]; + TOnSignal mOnSignalExecutedEventHandlers[]; TOnForceClose mOnForceCloseEventHandlers[]; TOnDealsChanged mDealsChangedEventHandlers[]; TOnOrdersChanged mOrdersChangedEventHandlers[]; diff --git a/Classes/x-saherelm.x-trade-manager.class.mq5 b/Classes/x-saherelm.x-trade-manager.class.mq5 index 5126caf1..222a2046 100644 --- a/Classes/x-saherelm.x-trade-manager.class.mq5 +++ b/Classes/x-saherelm.x-trade-manager.class.mq5 @@ -40,6 +40,7 @@ class XCTradeManager : public XCBase XCAlert *alert; XCGuard *guard; XCTrade *trader; + XCTarget *target; XCVolume *volume; XTimeTracker timeTracker; XCDataCollector *collector; @@ -56,7 +57,8 @@ class XCTradeManager : public XCBase XCAlert *_alert, XCTrade *_trader, XCVolume *_volume, - XCGuard *_guard // + XCGuard *_guard, + XCTarget *_target // ) { // @@ -64,6 +66,7 @@ class XCTradeManager : public XCBase guard = _guard; volume = _volume; trader = _trader; + target = _target; // drawer = new XCPOIDrawer(); @@ -104,10 +107,6 @@ class XCTradeManager : public XCBase // timeTracker.Clean(); - // - ZeroMemory(alert); - ZeroMemory(trader); - // delete drawer; ZeroMemory(drawer); @@ -1202,6 +1201,9 @@ class XCTradeManager : public XCBase // RemoveTrade(idx); + + // + target.HandleOnTakeProfitTriggered(deal); } /** @@ -1284,6 +1286,9 @@ class XCTradeManager : public XCBase // RemoveTrade(idx); + + // + target.HandleOnStopLossTriggered(deal); } /** @@ -1371,6 +1376,13 @@ class XCTradeManager : public XCBase // RemoveTrade(idx); + + // + target.HandleOnPositionForceClosed( + position.ticket, + position, + position.comment // + ); } /** @@ -1501,6 +1513,16 @@ class XCTradeManager : public XCBase { } + /** + * Handle Signal Executed Event ... + * + * @param signal: XSignal, reference to Executed Signal ... + */ + void HandleSignalExecuted(XSignal &signal) + { + target.AddExecutedSignal(signal); + } + // // Protected ... protected: diff --git a/Experts/x-saherelm.x-expert.ea.mq5 b/Experts/x-saherelm.x-expert.ea.mq5 index 09b90543..b43d7a0e 100644 --- a/Experts/x-saherelm.x-expert.ea.mq5 +++ b/Experts/x-saherelm.x-expert.ea.mq5 @@ -241,6 +241,7 @@ int OnInit() eaExpert.AddOnDealsChangedEventHandler(OnDealsChanged); eaExpert.AddOnStopLossEventHandler(OnStopLossTriggered); eaExpert.AddOnOrdersChangedEventHandler(OnOrdersChanged); + eaExpert.AddOnSignalExecutedEventHandler(OnSignalExecuted); eaExpert.canAnalyseEventHandler = CanAnalyseEventTriggered; eaExpert.AddOnTakeProfitEventHandler(OnTakeProfitTriggered); eaExpert.checkForGuardEventHandler = CheckForGuardTriggered; @@ -401,6 +402,16 @@ void OnSignalTriggered(XSignal &signal) eaExpert.HandleOnSignalTriggered(signal); } +/** + * Trigger OnSignal Executed Event ... + * + * @param signal: XSignal + */ +void OnSignalExecuted(XSignal &signal) +{ + eaExpert.HandleOnSignalExecuted(signal); +} + /** * Handle StopLoss Triggered Positions ... * diff --git a/Experts/x-saherelm.xfima.ea.mq5 b/Experts/x-saherelm.xfima.ea.mq5 index 64054827..a455809c 100644 --- a/Experts/x-saherelm.xfima.ea.mq5 +++ b/Experts/x-saherelm.xfima.ea.mq5 @@ -363,6 +363,7 @@ bool CanAnalyseEventTriggered( datetime time // ) { + // return eaExpert.HandleCanAnalyseEventTriggered( symbol, period, @@ -371,15 +372,26 @@ bool CanAnalyseEventTriggered( } /** - * Check For Guard Event Handler ... + * Check For Guard ... * - * @param guards: XGuard[] + * @param guards: XGuard, reference Collection to holds result ... + * @param positions: XPosition, refrence collection to Provides Positions ... + * @param barIndex: int, Specified Bar index ... * * @return ( int ) */ -int CheckForGuardTriggered(XGuard &guards[]) +int CheckForGuardTriggered( + XGuard &guards[], + XPosition &positions[], + int barIndex = 0 // +) { - return eaExpert.CheckForGuardTriggered(guards); + // + return eaExpert.CheckForGuardTriggered( + guards, + positions, + barIndex // + ); } /**