From 69e155e0501b2f4b2470da33bb89a0584a6ef7a0 Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Tue, 7 Oct 2025 18:09:38 +0330 Subject: [PATCH] last ... --- Classes/x-saherelm.x-expert.class.mq5 | 48 +- Classes/x-saherelm.x-market.pattern.class.mq5 | 9 +- Classes/x-saherelm.x-trade-manager.class.mq5 | 4 + .../x-saherelm.common.extensions.lib.mq5 | 3 +- Libraries/x-saherelm.x-pivot.analysis.lib.mq5 | 187 +++++- Libraries/x-saherelm.x-poi.extensions.lib.mq5 | 81 ++- Libraries/x-saherelm.x-poi.lib.mq5 | 33 + .../x-saherelm.xfima.signaller.class.mq5 | 621 ++++++++++++++---- 8 files changed, 802 insertions(+), 184 deletions(-) diff --git a/Classes/x-saherelm.x-expert.class.mq5 b/Classes/x-saherelm.x-expert.class.mq5 index 5dac991d..59e4d1a2 100644 --- a/Classes/x-saherelm.x-expert.class.mq5 +++ b/Classes/x-saherelm.x-expert.class.mq5 @@ -26,6 +26,7 @@ #include "../Classes/x-saherelm.x-alert.class.mq5" #include "../Classes/x-saherelm.x-chart.helper.class.mq5" #include "../Classes/x-saherelm.x-guard.class.mq5" +#include "../Classes/x-saherelm.x-position.drawer.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" @@ -121,13 +122,14 @@ class XCBaseExpert : public XCBase // Requirements ... // - XCAlert *eaAlert; // EA Scope Alert Handler ... - XCGuard *eaGuard; // EA Scope Guard Handler ... - XCTrade *eaTrader; // 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 ... + XCAlert *eaAlert; // EA Scope Alert Handler ... + XCGuard *eaGuard; // EA Scope Guard Handler ... + XCTrade *eaTrader; // 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 ... + XCPositionDrawer *eaPositionDrawer; // EA Scope Position Drawer ... // // Specified Event Handlers ... @@ -349,6 +351,10 @@ class XCBaseExpert : public XCBase // Initialize Target Handler ... eaTarget = new XCTarget(eaTrader, eaAlert); + // + // Init Position Drawer ... + eaPositionDrawer = new XCPositionDrawer(eaTrader); + // // Initialize Trae Manager ... eaTradeManager = new XCTradeManager( @@ -452,6 +458,11 @@ class XCBaseExpert : public XCBase delete eaTradeManager; ZeroMemory(eaTradeManager); + // + eaPositionDrawer.Destroy(); + delete eaPositionDrawer; + ZeroMemory(eaPositionDrawer); + // eaTimeTracker.Clean(); @@ -494,6 +505,10 @@ class XCBaseExpert : public XCBase // Manage Trades ... eaTradeManager.Manage(); + // + // Manage Positions Drawings ... + eaPositionDrawer.Update(); + // int count = ArraySize(eaSignallers); bool has = IsValidSize(count); @@ -567,6 +582,8 @@ class XCBaseExpert : public XCBase */ void HandleOnSignalExecuted(XSignal &signal) { + // + eaPositionDrawer.AddExecutedSignal(signal); eaTradeManager.target.AddExecutedSignal(signal); } @@ -675,6 +692,7 @@ class XCBaseExpert : public XCBase { // eaTradeManager.HandleSL(deal); + eaPositionDrawer.HandleStopLossTriggered(deal); UpdatePanelPositionButtons(); } @@ -686,8 +704,9 @@ class XCBaseExpert : public XCBase void virtual HandleOnTakeProfitTriggered(const XDeal &deal) { // - eaTradeManager.HandleTP(deal); UpdatePanelPositionButtons(); + eaTradeManager.HandleTP(deal); + eaPositionDrawer.HandleOnTakeProfitTriggered(deal); } /** @@ -704,8 +723,13 @@ class XCBaseExpert : public XCBase ) { // - eaTradeManager.HandleForceClose(position); UpdatePanelPositionButtons(); + eaTradeManager.HandleForceClose(position); + eaPositionDrawer.HandleOnPositionForceClosed( + ticket, + position, + comment // + ); } /** @@ -776,6 +800,12 @@ class XCBaseExpert : public XCBase const string comment // ) { + // + eaPositionDrawer.HandleOnPositionModified( + ticket, + profit, + comment // + ); } /** diff --git a/Classes/x-saherelm.x-market.pattern.class.mq5 b/Classes/x-saherelm.x-market.pattern.class.mq5 index 73a27ce0..776cba52 100644 --- a/Classes/x-saherelm.x-market.pattern.class.mq5 +++ b/Classes/x-saherelm.x-market.pattern.class.mq5 @@ -2025,6 +2025,7 @@ class XCMarketPatternDetector : public XCBase // Support and Resistance ... int supportAndResistanceValidationLength = 21, int supportAndResistanceLoopbackLength = 50 // + // ) { // @@ -2394,7 +2395,8 @@ class XCMarketPatternDetector : public XCBase bool has = ToSupportBox( iSwing, iZone, - bar.time // + bar.time, + supportAndResistanceValidationLength // ); if (has) { @@ -2417,7 +2419,7 @@ class XCMarketPatternDetector : public XCBase supportAndResistanceValidationLength, supportAndResistanceLoopbackLength // ); - if (isMomentum) + if (isResistance) { // iPattern = X_BAR_PATTERN_RESISTANCE; @@ -2426,7 +2428,8 @@ class XCMarketPatternDetector : public XCBase bool has = ToResistanceBox( iSwing, iZone, - bar.time // + bar.time, + supportAndResistanceValidationLength // ); if (has) { diff --git a/Classes/x-saherelm.x-trade-manager.class.mq5 b/Classes/x-saherelm.x-trade-manager.class.mq5 index 4cb32a6c..4098a6b2 100644 --- a/Classes/x-saherelm.x-trade-manager.class.mq5 +++ b/Classes/x-saherelm.x-trade-manager.class.mq5 @@ -408,6 +408,10 @@ class XCTradeManager : public XCBase // Handle Restrictions ... HandleRestrictions(); + // + // Managing Targets ... + target.Manage(); + // // Check Contains Trades for Managing ... bool has = HasChild(trades); diff --git a/Libraries/x-saherelm.common.extensions.lib.mq5 b/Libraries/x-saherelm.common.extensions.lib.mq5 index 1a3e7c5f..d794115e 100644 --- a/Libraries/x-saherelm.common.extensions.lib.mq5 +++ b/Libraries/x-saherelm.common.extensions.lib.mq5 @@ -4051,7 +4051,8 @@ bool SpecifiedHasChild(T &buffer[]) template bool Remove( T item, - T &buffer[]) + T &buffer[] // +) { // bool result = false; diff --git a/Libraries/x-saherelm.x-pivot.analysis.lib.mq5 b/Libraries/x-saherelm.x-pivot.analysis.lib.mq5 index f3724b0b..ab3fb598 100644 --- a/Libraries/x-saherelm.x-pivot.analysis.lib.mq5 +++ b/Libraries/x-saherelm.x-pivot.analysis.lib.mq5 @@ -1410,7 +1410,7 @@ struct XPatternAnalysis bool result = false; // - result = HasPattern(X_BAR_PATTERN_HIGH); + result = HasPattern(X_BAR_PATTERN_LOW); // return result; @@ -1637,7 +1637,8 @@ struct XPatternAnalysis XPivot &_pivot, XBoxZone &_zone, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, - ENUM_X_PRICE _valePriceType = X_PRICE_LOW // + ENUM_X_PRICE _valePriceType = X_PRICE_LOW, + datetime _toTime = NULL // ) { // @@ -1659,7 +1660,8 @@ struct XPatternAnalysis XPivot &_pivot, XBoxZone &_zone, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, - ENUM_X_PRICE _valePriceType = X_PRICE_LOW // + ENUM_X_PRICE _valePriceType = X_PRICE_LOW, + datetime _toTime = NULL // ) { // @@ -1681,7 +1683,8 @@ struct XPatternAnalysis XPivot &_pivot, XBoxZone &_zone, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, - ENUM_X_PRICE _valePriceType = X_PRICE_LOW // + ENUM_X_PRICE _valePriceType = X_PRICE_LOW, + datetime _toTime = NULL // ) { // @@ -1703,7 +1706,8 @@ struct XPatternAnalysis XPivot &_pivot, XBoxZone &_zone, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, - ENUM_X_PRICE _valePriceType = X_PRICE_LOW // + ENUM_X_PRICE _valePriceType = X_PRICE_LOW, + datetime _toTime = NULL // ) { // @@ -1726,7 +1730,8 @@ struct XPatternAnalysis XBoxZone &_zone, ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, - ENUM_X_PRICE _valePriceType = X_PRICE_LOW // + ENUM_X_PRICE _valePriceType = X_PRICE_LOW, + datetime _toTime = NULL // ) { // @@ -1748,7 +1753,8 @@ struct XPatternAnalysis XBoxZone &_zone, ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, - ENUM_X_PRICE _valePriceType = X_PRICE_LOW // + ENUM_X_PRICE _valePriceType = X_PRICE_LOW, + datetime _toTime = NULL // ) { // @@ -1770,7 +1776,8 @@ struct XPatternAnalysis XBoxZone &_zone, ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, - ENUM_X_PRICE _valePriceType = X_PRICE_LOW // + ENUM_X_PRICE _valePriceType = X_PRICE_LOW, + datetime _toTime = NULL // ) { // @@ -1792,7 +1799,8 @@ struct XPatternAnalysis XBoxZone &_zone, ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, - ENUM_X_PRICE _valePriceType = X_PRICE_LOW // + ENUM_X_PRICE _valePriceType = X_PRICE_LOW, + datetime _toTime = NULL // ) { // @@ -1814,7 +1822,8 @@ struct XPatternAnalysis XBoxZone &_zone, ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, - ENUM_X_PRICE _valePriceType = X_PRICE_LOW // + ENUM_X_PRICE _valePriceType = X_PRICE_LOW, + datetime _toTime = NULL // ) { // @@ -1836,7 +1845,8 @@ struct XPatternAnalysis XBoxZone &_zone, ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, - ENUM_X_PRICE _valePriceType = X_PRICE_LOW // + ENUM_X_PRICE _valePriceType = X_PRICE_LOW, + datetime _toTime = NULL // ) { // @@ -1858,7 +1868,8 @@ struct XPatternAnalysis XBoxZone &_zone, ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, - ENUM_X_PRICE _valePriceType = X_PRICE_LOW // + ENUM_X_PRICE _valePriceType = X_PRICE_LOW, + datetime _toTime = NULL // ) { // @@ -1880,7 +1891,8 @@ struct XPatternAnalysis XBoxZone &_zone, ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, - ENUM_X_PRICE _valePriceType = X_PRICE_LOW // + ENUM_X_PRICE _valePriceType = X_PRICE_LOW, + datetime _toTime = NULL // ) { // @@ -1902,7 +1914,8 @@ struct XPatternAnalysis XBoxZone &_zone, ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, - ENUM_X_PRICE _valePriceType = X_PRICE_LOW // + ENUM_X_PRICE _valePriceType = X_PRICE_LOW, + datetime _toTime = NULL // ) { // @@ -1924,7 +1937,8 @@ struct XPatternAnalysis XBoxZone &_zone, ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, - ENUM_X_PRICE _valePriceType = X_PRICE_LOW // + ENUM_X_PRICE _valePriceType = X_PRICE_LOW, + datetime _toTime = NULL // ) { // @@ -1946,7 +1960,8 @@ struct XPatternAnalysis XBoxZone &_zone, ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, - ENUM_X_PRICE _valePriceType = X_PRICE_LOW // + ENUM_X_PRICE _valePriceType = X_PRICE_LOW, + datetime _toTime = NULL // ) { // @@ -2057,6 +2072,7 @@ struct XPatternAnalysis * @param _patternDir: ENUM_X_DIRECTION, Specified Pattern Direction ... * @param _peakPriceType: ENUM_X_PRICE, Specified Peak Price Type ... * @param _valePriceType: ENUM_X_PRICE, Specified Vale Price Type ... + * @param _toTime: datetime, Specified Time to Update Pivot and Zones ... * * @return ( bool ) */ @@ -2067,7 +2083,8 @@ struct XPatternAnalysis ENUM_X_BAR_PATTERN _pattern, ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, - ENUM_X_PRICE _valePriceType = X_PRICE_LOW // + ENUM_X_PRICE _valePriceType = X_PRICE_LOW, + datetime _toTime = NULL // ) { // @@ -2089,6 +2106,7 @@ struct XPatternAnalysis { _valePriceType = X_PRICE_LOW; } + _toTime = NormalizeTime(_toTime); // // Validate ... @@ -2131,6 +2149,10 @@ struct XPatternAnalysis _peakPriceType, _valePriceType // ); + if (result) + { + _zone.to = _toTime; + } // // Use Custom Data if Pattern Staisfied ... @@ -2281,4 +2303,135 @@ struct XPatternAnalysis // }; +struct XPatternAnalysisDrawConfig +{ + // + // Props ... + ENUM_X_BAR_PATTERN allowedDraws[]; // Allowed Draw Patterns + ENUM_X_BAR_PATTERN allowedDrawZones[]; // Allowed Draw Pattern Zones + ENUM_X_BAR_PATTERN allowedDrawPivots[]; // Allowed Draw Pattern Pivots + + // + // Constructor ... + XPatternAnalysisDrawConfig() + { + Clean(); + } + + // + // Tools ... + + /** + * Cleanup ... + */ + void Clean() + { + // + XClean(allowedDraws); + XClean(allowedDrawZones); + XClean(allowedDrawPivots); + } + + /** + * Default Drawing Config ... + */ + void Default() + { + // + FullDraw(); + + // + // Remove Unused From Zones ... + Remove(X_BAR_PATTERN_PINNED, allowedDrawZones); + Remove(X_BAR_PATTERN_MOMENTUM, allowedDrawZones); + Remove(X_BAR_PATTERN_ENGULFED, allowedDrawZones); + Remove(X_BAR_PATTERN_TRUE_GAPED, allowedDrawZones); + + // + // Remove Unused From Pivots ... + Remove(X_BAR_PATTERN_OB, allowedDrawPivots); + Remove(X_BAR_PATTERN_FVG, allowedDrawPivots); + Remove(X_BAR_PATTERN_SUPPORT, allowedDrawPivots); + Remove(X_BAR_PATTERN_RESISTANCE, allowedDrawPivots); + } + + /** + * Configure Full Draws ... + */ + void FullDraw() + { + // + GetAllBarPatters(allowedDraws); + GetAllBarPatters(allowedDrawZones); + GetAllBarPatters(allowedDrawPivots); + } + + // + // Checkers ... + + /** + * Check Can Draw Specified Pattern ... + * + * @param pattern: ENUM_X_BAR_PATTERN, Specified Pattern ... + * + * @return ( bool ) + */ + bool CanDraw(ENUM_X_BAR_PATTERN pattern) + { + // + bool result = false; + + // + result = HasChild(allowedDraws) && + Contains(pattern, allowedDraws); + + // + return result; + } + + /** + * Check Can Draw Specified Pattern's Zone ... + * + * @param pattern: ENUM_X_BAR_PATTERN, Specified Pattern ... + * + * @return ( bool ) + */ + bool CanDrawZone(ENUM_X_BAR_PATTERN pattern) + { + // + bool result = false; + + // + result = + CanDraw(pattern) && + HasChild(allowedDrawZones) && + Contains(pattern, allowedDrawZones); + + // + return result; + } + + /** + * Check Can Draw Specified Pattern's Pivot ... + * + * @param pattern: ENUM_X_BAR_PATTERN, Specified Pattern ... + * + * @return ( bool ) + */ + bool CanDrawPivot(ENUM_X_BAR_PATTERN pattern) + { + // + bool result = false; + + // + result = + CanDraw(pattern) && + HasChild(allowedDrawPivots) && + Contains(pattern, allowedDrawPivots); + + // + return result; + } +}; + // \ No newline at end of file diff --git a/Libraries/x-saherelm.x-poi.extensions.lib.mq5 b/Libraries/x-saherelm.x-poi.extensions.lib.mq5 index a20148f0..3c02577b 100644 --- a/Libraries/x-saherelm.x-poi.extensions.lib.mq5 +++ b/Libraries/x-saherelm.x-poi.extensions.lib.mq5 @@ -4433,32 +4433,64 @@ bool ToFVGBox( bool ToSupportBox( XOHCL &bar, XBoxZone &box, - datetime toTime = NULL // + datetime toTime = NULL, + int validationLength = 0 // ) { // bool result = false; // + // Prepare ... box.Clean(); - toTime = NormalizeTime(toTime); // + // Normalize ... + toTime = NormalizeTime(toTime); + validationLength = NormalizeInt(validationLength, 0); + + // + // Validate ... result = bar.IsValid(); if (!result) { return result; } + // + XOHCL breaker; + result = GetBreakerBar( + bar, + breaker, + X_PRICE_LOW, + X_PRICE_DOWN, + X_DIRECTION_BEARISH, + 500 // + ); + if (!result) + { + breaker.Clean(); + } + // box.to = toTime; - box.from = bar.time; + box.at = bar.time; + box.from = + breaker.IsValid() + ? breaker.time + : validationLength <= 0 + ? bar.time + : GetBarTime( + bar.symbol, + bar.period, + bar.Index() + validationLength // + ); box.lower = bar.low; box.symbol = bar.symbol; box.period = bar.period; box.upper = bar.GetDown(); box.dir = X_DIRECTION_BULLISH; - box.type = "Support"; + box.type = ToXString(X_BAR_PATTERN_SUPPORT); // result = box.IsValid(); @@ -4483,32 +4515,65 @@ bool ToSupportBox( bool ToResistanceBox( XOHCL &bar, XBoxZone &box, - datetime toTime = NULL // + datetime toTime = NULL, + int validationLength = 0 // ) { // bool result = false; // + // Prepare ... box.Clean(); - toTime = NormalizeTime(toTime); // + // Normalize ... + toTime = NormalizeTime(toTime); + validationLength = NormalizeInt(validationLength, 0); + + // + // Validate ... result = bar.IsValid(); if (!result) { return result; } + // + XOHCL breaker; + result = GetBreakerBar( + bar, + breaker, + X_PRICE_HIGH, + X_PRICE_UP, + X_DIRECTION_BULLISH, + 500 // + ); + if (!result) + { + breaker.Clean(); + } + // box.to = toTime; - box.from = bar.time; + box.at = bar.time; + box.from = + breaker.IsValid() + ? breaker.time + : validationLength <= 0 + ? bar.time + : GetBarTime( + bar.symbol, + bar.period, + bar.Index() + validationLength // + ); box.upper = bar.high; box.symbol = bar.symbol; box.period = bar.period; box.lower = bar.GetUp(); box.dir = X_DIRECTION_BEARISH; - box.type = "Resistance"; + box.type = ToXString(X_BAR_PATTERN_RESISTANCE); + ; // result = box.IsValid(); diff --git a/Libraries/x-saherelm.x-poi.lib.mq5 b/Libraries/x-saherelm.x-poi.lib.mq5 index 140f49cf..82c8f707 100644 --- a/Libraries/x-saherelm.x-poi.lib.mq5 +++ b/Libraries/x-saherelm.x-poi.lib.mq5 @@ -252,6 +252,39 @@ ENUM_X_BAR_PATTERN ToBarPattern(string value) return result; } +/** + * Get All Available Valid Bar Patterns ... + * + * @param dest: ENUM_X_BAR_PATTERN, reference collection to fill ... + * + * @return ( int ) + */ +int GetAllBarPatters(ENUM_X_BAR_PATTERN &dest[]) +{ + // + XClean(dest); + + // + Add(X_BAR_PATTERN_HIGH, dest); + Add(X_BAR_PATTERN_LOW, dest); + Add(X_BAR_PATTERN_MOMENTUM, dest); + Add(X_BAR_PATTERN_ENGULFED, dest); + Add(X_BAR_PATTERN_TRUE_GAPED, dest); + Add(X_BAR_PATTERN_PINNED, dest); + Add(X_BAR_PATTERN_STAR, dest); + Add(X_BAR_PATTERN_PIERCING, dest); + Add(X_BAR_PATTERN_RISING, dest); + Add(X_BAR_PATTERN_FLAG, dest); + Add(X_BAR_PATTERN_SIGNALKEY, dest); + Add(X_BAR_PATTERN_OB, dest); + Add(X_BAR_PATTERN_FVG, dest); + Add(X_BAR_PATTERN_SUPPORT, dest); + Add(X_BAR_PATTERN_RESISTANCE, dest); + + // + return ArraySize(dest); +} + // // Structures ... diff --git a/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 b/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 index b7a15615..0e5f3f39 100644 --- a/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 +++ b/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 @@ -585,6 +585,7 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller // // Use Default Config ... ); + DrawBarPatternAnalysis(iBarAnalysis); // // Disable Signallers ... @@ -594,14 +595,14 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller // // Strategy 1 ... // Works on Support or Resistances Areas ... - has = Strategy1HasSignal( - iBar, - iZone, - iTargets, - iDir, - iFIMAConditions, - iStructure // - ); + // has = Strategy1HasSignal( + // iBar, + // iZone, + // iTargets, + // iDir, + // iFIMAConditions, + // iStructure // + // ); // // Strategy 2 ... @@ -1247,7 +1248,7 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller IsXBullish(_patternDir) ? ANCHOR_TOP : ANCHOR_BOTTOM, - _pivot.prefix + "_" + ToXString(TimeToSeconds(_pivot.time)), + "Pivot_" + _pivot.prefix + "_" + ToXString(TimeToSeconds(_pivot.time)), true, // Ignore Bar Tag ... arrowThreshold // Threshold ... ); @@ -1270,7 +1271,7 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller _zone, iObj, ignoreBoxAt, - _zone.type + "_" + ToXString(TimeToSeconds(_zone.from)) // + "Zone_" + _zone.type + "_" + ToXString(TimeToSeconds(_zone.from)) // ); if (has) { @@ -1319,6 +1320,44 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller return; } + // + // Configure Draws ... + XPatternAnalysisDrawConfig config; + config.Default(); + XClean(config.allowedDraws); + XClean(config.allowedDrawZones); + XClean(config.allowedDrawPivots); + + // + // MOMENTUM ... + Add( + X_BAR_PATTERN_MOMENTUM, + config.allowedDraws // + ); + Add( + X_BAR_PATTERN_MOMENTUM, + config.allowedDrawZones // + ); + Add( + X_BAR_PATTERN_MOMENTUM, + config.allowedDrawPivots // + ); + + // + // ENGULFED ... + Add( + X_BAR_PATTERN_ENGULFED, + config.allowedDraws // + ); + Add( + X_BAR_PATTERN_ENGULFED, + config.allowedDrawZones // + ); + Add( + X_BAR_PATTERN_ENGULFED, + config.allowedDrawPivots // + ); + // // Draw Bar Patterns Analysis ... @@ -1331,6 +1370,11 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller ENUM_X_BAR_PATTERN pattern; ENUM_X_DIRECTION patternDir; + // + bool canDraw; + bool canDrawZone; + bool canDrawPivot; + // // Support and Resistance ... @@ -1344,23 +1388,42 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller // pattern = X_BAR_PATTERN_SUPPORT; patternDir = X_DIRECTION_BULLISH; - has = barAnalysis.GetPattern( - patternBar, - patternPivot, - patternBox, - pattern, - patternDir // - ); - if (has) + canDraw = config.CanDraw(pattern); + if (canDraw) { // - DrawPattern( + has = barAnalysis.GetPattern( patternBar, patternPivot, patternBox, pattern, patternDir // ); + if (has) + { + // + canDrawZone = config.CanDrawZone(pattern); + if (!canDrawZone) + { + patternBox.Clean(); + } + + // + canDrawPivot = config.CanDrawPivot(pattern); + if (!canDrawPivot) + { + patternPivot.Clean(); + } + + // + DrawPattern( + patternBar, + patternPivot, + patternBox, + pattern, + patternDir // + ); + } } } @@ -1372,25 +1435,44 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller if (has) { // - pattern = X_BAR_PATTERN_SUPPORT; + pattern = X_BAR_PATTERN_RESISTANCE; patternDir = X_DIRECTION_BEARISH; - has = barAnalysis.GetPattern( - patternBar, - patternPivot, - patternBox, - pattern, - patternDir // - ); - if (has) + canDraw = config.CanDraw(pattern); + if (canDraw) { // - DrawPattern( + has = barAnalysis.GetPattern( patternBar, patternPivot, patternBox, pattern, patternDir // ); + if (has) + { + // + canDrawZone = config.CanDrawZone(pattern); + if (!canDrawZone) + { + patternBox.Clean(); + } + + // + canDrawPivot = config.CanDrawPivot(pattern); + if (!canDrawPivot) + { + patternPivot.Clean(); + } + + // + DrawPattern( + patternBar, + patternPivot, + patternBox, + pattern, + patternDir // + ); + } } } @@ -1407,23 +1489,42 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller // pattern = X_BAR_PATTERN_LOW; patternDir = X_DIRECTION_BULLISH; - has = barAnalysis.GetPattern( - patternBar, - patternPivot, - patternBox, - pattern, - patternDir // - ); - if (has) + canDraw = config.CanDraw(pattern); + if (canDraw) { // - DrawPattern( + has = barAnalysis.GetPattern( patternBar, patternPivot, patternBox, pattern, patternDir // ); + if (has) + { + // + canDrawZone = config.CanDrawZone(pattern); + if (!canDrawZone) + { + patternBox.Clean(); + } + + // + canDrawPivot = config.CanDrawPivot(pattern); + if (!canDrawPivot) + { + patternPivot.Clean(); + } + + // + DrawPattern( + patternBar, + patternPivot, + patternBox, + pattern, + patternDir // + ); + } } } @@ -1437,23 +1538,42 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller // pattern = X_BAR_PATTERN_HIGH; patternDir = X_DIRECTION_BEARISH; - has = barAnalysis.GetPattern( - patternBar, - patternPivot, - patternBox, - pattern, - patternDir // - ); - if (has) + canDraw = config.CanDraw(pattern); + if (canDraw) { // - DrawPattern( + has = barAnalysis.GetPattern( patternBar, patternPivot, patternBox, pattern, patternDir // ); + if (has) + { + // + canDrawZone = config.CanDrawZone(pattern); + if (!canDrawZone) + { + patternBox.Clean(); + } + + // + canDrawPivot = config.CanDrawPivot(pattern); + if (!canDrawPivot) + { + patternPivot.Clean(); + } + + // + DrawPattern( + patternBar, + patternPivot, + patternBox, + pattern, + patternDir // + ); + } } } @@ -1470,23 +1590,42 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller isBullish ? X_DIRECTION_BULLISH : X_DIRECTION_BEARISH; - has = barAnalysis.GetPattern( - patternBar, - patternPivot, - patternBox, - pattern, - patternDir // - ); - if (has) + canDraw = config.CanDraw(pattern); + if (canDraw) { // - DrawPattern( + has = barAnalysis.GetPattern( patternBar, patternPivot, patternBox, pattern, patternDir // ); + if (has) + { + // + canDrawZone = config.CanDrawZone(pattern); + if (!canDrawZone) + { + patternBox.Clean(); + } + + // + canDrawPivot = config.CanDrawPivot(pattern); + if (!canDrawPivot) + { + patternPivot.Clean(); + } + + // + DrawPattern( + patternBar, + patternPivot, + patternBox, + pattern, + patternDir // + ); + } } } @@ -1503,23 +1642,42 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller isBullish ? X_DIRECTION_BULLISH : X_DIRECTION_BEARISH; - has = barAnalysis.GetPattern( - patternBar, - patternPivot, - patternBox, - pattern, - patternDir // - ); - if (has) + canDraw = config.CanDraw(pattern); + if (canDraw) { // - DrawPattern( + has = barAnalysis.GetPattern( patternBar, patternPivot, patternBox, pattern, patternDir // ); + if (has) + { + // + canDrawZone = config.CanDrawZone(pattern); + if (!canDrawZone) + { + patternBox.Clean(); + } + + // + canDrawPivot = config.CanDrawPivot(pattern); + if (!canDrawPivot) + { + patternPivot.Clean(); + } + + // + DrawPattern( + patternBar, + patternPivot, + patternBox, + pattern, + patternDir // + ); + } } } @@ -1536,23 +1694,42 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller isBullish ? X_DIRECTION_BULLISH : X_DIRECTION_BEARISH; - has = barAnalysis.GetPattern( - patternBar, - patternPivot, - patternBox, - pattern, - patternDir // - ); - if (has) + canDraw = config.CanDraw(pattern); + if (canDraw) { // - DrawPattern( + has = barAnalysis.GetPattern( patternBar, patternPivot, patternBox, pattern, patternDir // ); + if (has) + { + // + canDrawZone = config.CanDrawZone(pattern); + if (!canDrawZone) + { + patternBox.Clean(); + } + + // + canDrawPivot = config.CanDrawPivot(pattern); + if (!canDrawPivot) + { + patternPivot.Clean(); + } + + // + DrawPattern( + patternBar, + patternPivot, + patternBox, + pattern, + patternDir // + ); + } } } @@ -1569,23 +1746,42 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller isBullish ? X_DIRECTION_BULLISH : X_DIRECTION_BEARISH; - has = barAnalysis.GetPattern( - patternBar, - patternPivot, - patternBox, - pattern, - patternDir // - ); - if (has) + canDraw = config.CanDraw(pattern); + if (canDraw) { // - DrawPattern( + has = barAnalysis.GetPattern( patternBar, patternPivot, patternBox, pattern, patternDir // ); + if (has) + { + // + canDrawZone = config.CanDrawZone(pattern); + if (!canDrawZone) + { + patternBox.Clean(); + } + + // + canDrawPivot = config.CanDrawPivot(pattern); + if (!canDrawPivot) + { + patternPivot.Clean(); + } + + // + DrawPattern( + patternBar, + patternPivot, + patternBox, + pattern, + patternDir // + ); + } } } @@ -1602,23 +1798,42 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller isBullish ? X_DIRECTION_BULLISH : X_DIRECTION_BEARISH; - has = barAnalysis.GetPattern( - patternBar, - patternPivot, - patternBox, - pattern, - patternDir // - ); - if (has) + canDraw = config.CanDraw(pattern); + if (canDraw) { // - DrawPattern( + has = barAnalysis.GetPattern( patternBar, patternPivot, patternBox, pattern, patternDir // ); + if (has) + { + // + canDrawZone = config.CanDrawZone(pattern); + if (!canDrawZone) + { + patternBox.Clean(); + } + + // + canDrawPivot = config.CanDrawPivot(pattern); + if (!canDrawPivot) + { + patternPivot.Clean(); + } + + // + DrawPattern( + patternBar, + patternPivot, + patternBox, + pattern, + patternDir // + ); + } } } @@ -1635,23 +1850,42 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller isBullish ? X_DIRECTION_BULLISH : X_DIRECTION_BEARISH; - has = barAnalysis.GetPattern( - patternBar, - patternPivot, - patternBox, - pattern, - patternDir // - ); - if (has) + canDraw = config.CanDraw(pattern); + if (canDraw) { // - DrawPattern( + has = barAnalysis.GetPattern( patternBar, patternPivot, patternBox, pattern, patternDir // ); + if (has) + { + // + canDrawZone = config.CanDrawZone(pattern); + if (!canDrawZone) + { + patternBox.Clean(); + } + + // + canDrawPivot = config.CanDrawPivot(pattern); + if (!canDrawPivot) + { + patternPivot.Clean(); + } + + // + DrawPattern( + patternBar, + patternPivot, + patternBox, + pattern, + patternDir // + ); + } } } @@ -1668,23 +1902,42 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller isBullish ? X_DIRECTION_BULLISH : X_DIRECTION_BEARISH; - has = barAnalysis.GetPattern( - patternBar, - patternPivot, - patternBox, - pattern, - patternDir // - ); - if (has) + canDraw = config.CanDraw(pattern); + if (canDraw) { // - DrawPattern( + has = barAnalysis.GetPattern( patternBar, patternPivot, patternBox, pattern, patternDir // ); + if (has) + { + // + canDrawZone = config.CanDrawZone(pattern); + if (!canDrawZone) + { + patternBox.Clean(); + } + + // + canDrawPivot = config.CanDrawPivot(pattern); + if (!canDrawPivot) + { + patternPivot.Clean(); + } + + // + DrawPattern( + patternBar, + patternPivot, + patternBox, + pattern, + patternDir // + ); + } } } @@ -1701,23 +1954,42 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller isBullish ? X_DIRECTION_BULLISH : X_DIRECTION_BEARISH; - has = barAnalysis.GetPattern( - patternBar, - patternPivot, - patternBox, - pattern, - patternDir // - ); - if (has) + canDraw = config.CanDraw(pattern); + if (canDraw) { // - DrawPattern( + has = barAnalysis.GetPattern( patternBar, patternPivot, patternBox, pattern, patternDir // ); + if (has) + { + // + canDrawZone = config.CanDrawZone(pattern); + if (!canDrawZone) + { + patternBox.Clean(); + } + + // + canDrawPivot = config.CanDrawPivot(pattern); + if (!canDrawPivot) + { + patternPivot.Clean(); + } + + // + DrawPattern( + patternBar, + patternPivot, + patternBox, + pattern, + patternDir // + ); + } } } @@ -1734,23 +2006,42 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller isBullish ? X_DIRECTION_BULLISH : X_DIRECTION_BEARISH; - has = barAnalysis.GetPattern( - patternBar, - patternPivot, - patternBox, - pattern, - patternDir // - ); - if (has) + canDraw = config.CanDraw(pattern); + if (canDraw) { // - DrawPattern( + has = barAnalysis.GetPattern( patternBar, patternPivot, patternBox, pattern, patternDir // ); + if (has) + { + // + canDrawZone = config.CanDrawZone(pattern); + if (!canDrawZone) + { + patternBox.Clean(); + } + + // + canDrawPivot = config.CanDrawPivot(pattern); + if (!canDrawPivot) + { + patternPivot.Clean(); + } + + // + DrawPattern( + patternBar, + patternPivot, + patternBox, + pattern, + patternDir // + ); + } } } @@ -1767,23 +2058,42 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller isBullish ? X_DIRECTION_BULLISH : X_DIRECTION_BEARISH; - has = barAnalysis.GetPattern( - patternBar, - patternPivot, - patternBox, - pattern, - patternDir // - ); - if (has) + canDraw = config.CanDraw(pattern); + if (canDraw) { // - DrawPattern( + has = barAnalysis.GetPattern( patternBar, patternPivot, patternBox, pattern, patternDir // ); + if (has) + { + // + canDrawZone = config.CanDrawZone(pattern); + if (!canDrawZone) + { + patternBox.Clean(); + } + + // + canDrawPivot = config.CanDrawPivot(pattern); + if (!canDrawPivot) + { + patternPivot.Clean(); + } + + // + DrawPattern( + patternBar, + patternPivot, + patternBox, + pattern, + patternDir // + ); + } } } @@ -1800,23 +2110,42 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller isBullish ? X_DIRECTION_BULLISH : X_DIRECTION_BEARISH; - has = barAnalysis.GetPattern( - patternBar, - patternPivot, - patternBox, - pattern, - patternDir // - ); - if (has) + canDraw = config.CanDraw(pattern); + if (canDraw) { // - DrawPattern( + has = barAnalysis.GetPattern( patternBar, patternPivot, patternBox, pattern, patternDir // ); + if (has) + { + // + canDrawZone = config.CanDrawZone(pattern); + if (!canDrawZone) + { + patternBox.Clean(); + } + + // + canDrawPivot = config.CanDrawPivot(pattern); + if (!canDrawPivot) + { + patternPivot.Clean(); + } + + // + DrawPattern( + patternBar, + patternPivot, + patternBox, + pattern, + patternDir // + ); + } } }