From ba492bf2056d265b03887b0ef4d2389d51121fab Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Sun, 19 Oct 2025 01:00:24 +0330 Subject: [PATCH] last ... --- Classes/x-saherelm.x-bar.analyser.class.mq5 | 16 +- Classes/x-saherelm.x-market.pattern.class.mq5 | 131 ++++++++++++ Libraries/x-saherelm.x-poi.lib.mq5 | 10 + .../x-saherelm.xfima.signaller.class.mq5 | 189 +++++++++++++++++- 4 files changed, 330 insertions(+), 16 deletions(-) diff --git a/Classes/x-saherelm.x-bar.analyser.class.mq5 b/Classes/x-saherelm.x-bar.analyser.class.mq5 index a9481fb9..32477c41 100644 --- a/Classes/x-saherelm.x-bar.analyser.class.mq5 +++ b/Classes/x-saherelm.x-bar.analyser.class.mq5 @@ -1882,7 +1882,7 @@ class XCBarAnalyser : public XCBase * Check Specified Bar is Doji Pattern or not ... * * @param bar: XOHCL instance reference, Specified Bar to Check ... - * @param dir: ENUM_X_DIRECTION member, Specified Doji Direction ... + * @param dir: ENUM_X_DIRECTION member, Specified Direction ... * @param shadowMultiplier: double, Specified Shadow Multiplier ... * * @return ( bool ) @@ -1938,7 +1938,7 @@ class XCBarAnalyser : public XCBase * Check Specified Bar is Swing or not ... * * @param bar: XOHCL instance reference, Specified Bar to Check ... - * @param dir: ENUM_X_DIRECTION member, Specified Doji Direction ... + * @param dir: ENUM_X_DIRECTION member, Specified Direction ... * @param loopback: int, Specified Loopback ... * * @return ( bool ) @@ -2062,7 +2062,7 @@ class XCBarAnalyser : public XCBase * Check Specified Bar's Prev Bar is Simple Swing or not ... * * @param bar: XOHCL instance reference, Specified Bar to it's Prev Check ... - * @param dir: ENUM_X_DIRECTION member, Specified Doji Direction ... + * @param dir: ENUM_X_DIRECTION member, Specified Direction ... * * @return ( bool ) */ @@ -2145,7 +2145,7 @@ class XCBarAnalyser : public XCBase * Check Specified Bar is Hammer Pattern or not ... * * @param bar: XOHCL instance reference, Specified Bar to Check ... - * @param dir: ENUM_X_DIRECTION member, Specified Doji Direction ... + * @param dir: ENUM_X_DIRECTION member, Specified Direction ... * @param bodyMultiplier: double, Specified Body Multiplier ... * * @return ( bool ) @@ -2205,7 +2205,7 @@ class XCBarAnalyser : public XCBase * Check Specified Bar is Engulfed Prev Bar or not ... * * @param bar: XOHCL instance reference, Specified Bar to Check ... - * @param dir: ENUM_X_DIRECTION member, Specified Doji Direction ... + * @param dir: ENUM_X_DIRECTION member, Specified Direction ... * * @return ( bool ) */ @@ -2286,7 +2286,7 @@ class XCBarAnalyser : public XCBase * Check Specified Bar is Momentum Bar or not ... * * @param bar: XOHCL instance reference, Specified Bar to Check ... - * @param dir: ENUM_X_DIRECTION member, Specified Doji Direction ... + * @param dir: ENUM_X_DIRECTION member, Specified Direction ... * @param forceBarType: bool, Force Apply Bar Type ... * @param forceFiboPressure: bool, Force Apply Bar Type ... * @@ -2431,7 +2431,7 @@ class XCBarAnalyser : public XCBase * Check Specified Bar is Momentum Bar or not ... * * @param bar: XOHCL instance reference, Specified Bar to Check ... - * @param dir: ENUM_X_DIRECTION member, Specified Doji Direction ... + * @param dir: ENUM_X_DIRECTION member, Specified Direction ... * @param loopback: int, Specified Loopback ... * * @return ( bool ) @@ -2538,7 +2538,7 @@ class XCBarAnalyser : public XCBase * Check Specified Bar is Pullback or not ... * * @param bar: XOHCL instance reference, Specified Bar to Check ... - * @param dir: ENUM_X_DIRECTION member, Specified Doji Direction ... + * @param dir: ENUM_X_DIRECTION member, Specified Direction ... * @param loopback: int, Specified Loopback ... * @param forceBody: bool, Force Using Body ... * diff --git a/Classes/x-saherelm.x-market.pattern.class.mq5 b/Classes/x-saherelm.x-market.pattern.class.mq5 index 64f1c37d..d0dd987f 100644 --- a/Classes/x-saherelm.x-market.pattern.class.mq5 +++ b/Classes/x-saherelm.x-market.pattern.class.mq5 @@ -1300,6 +1300,137 @@ class XCMarketPatternDetector : public XCBase return result; } + /** + * Check Specified Bar has Pullback Bar Pattern or not ... + * + * @param bar: XOHCL, Specified Bar ... + * @param zone: XBoxZone, refrence to hold pullback zone ... + * @param dir: ENUM_X_DIRECTION a reference for Direction ... + * @param pullbackLength: int, min required indirectional bars to confirm pullback ... + * @param forceBreak: bool, force pullback bar breaks peak or vale of Zone ... + * + * @return ( bool ) + */ + bool IsPullbackPattern( + XOHCL &bar, + XBoxZone &zone, + ENUM_X_DIRECTION &dir, + int pullbackLength = 2, + bool forceBreak = false // + ) + { + // + bool result = false; + + // + // Prepare ... + zone.Clean(); + CleanDirection(dir); + + // + // Normalize ... + pullbackLength = NormalizeInt(pullbackLength, 2); + + // + // Validate ... + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + // First Bar Direction ... + dir = bar.GetDirection(); + result = HasDirection(dir); + if (!result) + { + return result; + } + + // + // Loop through Pullback Length ... + XOHCL iBar; + datetime from = NULL; + double max = EMPTY_VALUE; + double min = EMPTY_VALUE; + int start = bar.Index() + 1; + int end = start + pullbackLength; + for (int i = start; i < end; i++) + { + // + // Initialize Indexed Bar ... + iBar.Clean(); + result = bar.BarAt(i, iBar) && + iBar.GetDirection() == Opposit(dir); + if (!result) + { + break; + } + + // + // Calculate Max and Min ... + max = + !NotEmptyZero(max) + ? iBar.high + : MathMax(max, iBar.high); + min = + !NotEmptyZero(min) + ? iBar.low + : MathMin(min, iBar.low); + from = iBar.time; + } + + // + // Apply Force Break ... + if (result && + forceBreak) + { + // + result = + result && + NotEmptyZero(min) && + NotEmptyZero(max) && + (IsXBullish(dir) + ? bar.close > max + : bar.close < min); + } + + // + // Prepare Zone ... + if (result) + { + // + ToBox( + bar, + zone, + dir, + ToXString(X_BAR_PATTERN_PULLBACK) // + ); + zone.upper = max; + zone.lower = min; + zone.from = from; + zone.at = bar.time; + zone.to = bar.time; + + // + result = zone.IsValid(); + } + + // + // Cleanup ... + if (!result) + { + // + zone.Clean(); + CleanDirection(dir); + } + iBar.Clean(); + + // + return result; + } + // // FVG ... diff --git a/Libraries/x-saherelm.x-poi.lib.mq5 b/Libraries/x-saherelm.x-poi.lib.mq5 index 1e92bb5c..ce243745 100644 --- a/Libraries/x-saherelm.x-poi.lib.mq5 +++ b/Libraries/x-saherelm.x-poi.lib.mq5 @@ -49,6 +49,7 @@ enum ENUM_X_BAR_PATTERN X_BAR_PATTERN_FVG = 13, X_BAR_PATTERN_SUPPORT = 14, X_BAR_PATTERN_RESISTANCE = 15, + X_BAR_PATTERN_PULLBACK = 16, }; /** @@ -157,6 +158,11 @@ string ToXString(ENUM_X_BAR_PATTERN value) case X_BAR_PATTERN_RESISTANCE: result = "XRESISTANCE"; break; + + // + case X_BAR_PATTERN_PULLBACK: + result = "XPULLBACK"; + break; } // @@ -247,6 +253,10 @@ ENUM_X_BAR_PATTERN ToBarPattern(string value) { result = X_BAR_PATTERN_RESISTANCE; } + else if (value == ToXString(X_BAR_PATTERN_PULLBACK)) + { + result = X_BAR_PATTERN_PULLBACK; + } // return result; diff --git a/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 b/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 index f38dd1e5..b29a2e53 100644 --- a/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 +++ b/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 @@ -406,11 +406,26 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller // // Strategy 3 ... + if (!has) + { + // + // has = Strategy3HasSignal( + // iBar, + // iZone, + // iTargets, + // iDir, + // iFIMAConditions, + // structure // + // ); + } + + // + // Strategy 4 ... has = false; if (!has) { // - has = Strategy3HasSignal( + has = Strategy4HasSignal( iBar, iZone, iTargets, @@ -423,13 +438,13 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller // has = HasDirection(iDir) && iZone.IsValid(); - // if (has) - // { - // // - // has = false; - // iZone.Clean(); - // iDir = X_DIRECTION_NONE; - // } + if (has) + { + // + has = false; + iZone.Clean(); + iDir = X_DIRECTION_NONE; + } // if (has) @@ -1478,6 +1493,164 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller return result; } + /** + * Check Bar Has Signal Based on Strategy 4 ... + * + * @param bar: XOHCL, reference to Bar ... + * @param zone: XBoxZone, reference to holds affected zone ... + * @param targets: XTarget, reference to detected Signal's Targets collections ... + * @param dir: ENUM_X_DIRECTION, detected Signal's direction ... + * @param conditions: XFIMAConditions, reference to Bar Specified XFIMA Conditions ... + * @param structure: XFIMAMarketStructure, refrence to Provides Market Structure ... + * + * @return ( bool ) + */ + bool Strategy4HasSignal( + XOHCL &bar, + XBoxZone &zone, + XTarget &targets[], + ENUM_X_DIRECTION &dir, + XFIMAConditions &conditions, + XFIMAMarketStructure &_structure // + ) + { + // + bool result = false; + + // + // Prepare ... + zone.Clean(); + XClean(targets); + dir = X_DIRECTION_NONE; + + // + // Validate ... + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + // Define Requirements ... + bool isBullish = false; + bool isBearish = false; + + // + XOHCL pBar; + int barIndex = bar.Index(); + int pBarIndex = barIndex + 1; + result = bar.GetPreviousBar(pBar); + if (!result) + { + return result; + } + + // + // Do Conditions Checking ... + + // + // Reading HK Bond ... + double hkBondUpper = fimaHelper.GetHKBondUpper(pBarIndex); + double hkBondLower = fimaHelper.GetHKBondLower(pBarIndex); + bool hasHKBoundary = + NotEmptyZero(hkBondUpper) && + NotEmptyZero(hkBondLower); + + // + // Pullback Detection ... + bool isPullback = poiDetector.IsPullbackPattern( + pBar, + zone, + dir, + 2, + false // + ); + + // + isBullish = + isPullback && + hasHKBoundary && + IsXBullish(dir) && + zone.lower > hkBondLower; + + // + isBearish = + isPullback && + hasHKBoundary && + IsXBearish(dir) && + zone.upper < hkBondUpper; + + // + result = + isBullish || + isBearish; + + // + // Do Validations ... + if (result) + { + // + // Direction Assignment ... + dir = + isBullish + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + + // + // TEMP ... + poiDrawer.DrawZone( + zone, + structureDrawConfig.drawConfig // + ); + } + + // + // Prepare Decision Zone ... + if (result) + { + // + // Zone Detection ... + zone.Clean(); + + // + // zone.dir = dir; + // zone.type = name; + // zone.to = bar.time; + // zone.at = pBar.time; + // zone.from = pBar.time; + // zone.symbol = bar.symbol; + // zone.period = bar.period; + // zone.lower = MathMin(pBar.low, bar.low); + // zone.upper = MathMax(pBar.high, bar.high); + + // + result = zone.IsValid(); + } + + // + // Prepare Targets ... + if (result) + { + // + // Target Handling ... + } + + // + // Cleanup ... + if (!result) + { + // + zone.Clean(); + XClean(targets); + dir = X_DIRECTION_NONE; + } + pBar.Clean(); + + // + return result; + } + // };