From 7a26df1194a603e953ccb7746056a7d163c063ff Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Thu, 12 Feb 2026 18:01:52 +0330 Subject: [PATCH] last ... --- Classes/x-saherelm.x-market.pattern.class.mq5 | 33 +++++ .../x-saherelm.x121.xki.signaller.class.mq5 | 126 +++++++++++++++++- ...saherelm.x121.xki.x-poi.detector.class.mq5 | 43 ++++++ .../Libraries/x-saherelm.x121.xki.lib.mq5 | 9 ++ 4 files changed, 209 insertions(+), 2 deletions(-) diff --git a/Classes/x-saherelm.x-market.pattern.class.mq5 b/Classes/x-saherelm.x-market.pattern.class.mq5 index 84fba2c6..be4d215f 100644 --- a/Classes/x-saherelm.x-market.pattern.class.mq5 +++ b/Classes/x-saherelm.x-market.pattern.class.mq5 @@ -227,6 +227,17 @@ class XCMarketPatternDetector : public XCBase return result; } + /** + * Check a Bar has Same Sequence Directionalo Bar or Not ... + * + * @param bar: XOHCL, Specified Bar ... + * @param dir: ENUM_X_DIRECTION, Detected Bars Direction ... + * @param count: int, Number of Same Bars ... + * @param validation: int, Validation of Same Bars ... + * @param loopback: int, Loopback for Detection ... + * + * @return ( bool ) + */ bool HasSameBars( XOHCL &bar, ENUM_X_DIRECTION &dir, @@ -252,12 +263,34 @@ class XCMarketPatternDetector : public XCBase return result; } + // + XOHCL tmpBar; + bar.GetPreviousBar(tmpBar); + while (tmpBar.GetDirection() == bar.GetDirection()) + { + // + count++; + tmpBar.GetPreviousBar(tmpBar); + } + + // + // Validate Count ... + result = count >= validation; + if (result) + { + dir = bar.GetDirection(); + } + // result = + result && count > 0 && HasDirection(dir) && count >= validation; + // + tmpBar.Clean(); + // return result; } diff --git a/X121XKIEA/Classes/x-saherelm.x121.xki.signaller.class.mq5 b/X121XKIEA/Classes/x-saherelm.x121.xki.signaller.class.mq5 index 06f71b88..e2f67cd7 100644 --- a/X121XKIEA/Classes/x-saherelm.x121.xki.signaller.class.mq5 +++ b/X121XKIEA/Classes/x-saherelm.x121.xki.signaller.class.mq5 @@ -533,12 +533,13 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller // // Signaller Flags ... - bool useSignaller1 = true; + bool useSignaller1 = false; bool useSignaller2 = false; bool useSignaller3 = false; bool useSignaller4 = false; bool useSignaller5 = false; bool useSignaller6 = false; + bool useSignaller7 = true; // XBoxZone tmpZone; @@ -552,6 +553,7 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller bool signaller4HasSignal = false; bool signaller5HasSignal = false; bool signaller6HasSignal = false; + bool signaller7HasSignal = false; // // Validator Flags ... @@ -772,6 +774,39 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller tmpDir = X_DIRECTION_NONE; } + // + // Signaller 7 ... + // Supply and Demand ... + if (useSignaller7) + { + // + signaller7HasSignal = Strategy7HasSignal( + bar, + tmpZone, + targets, + tmpDir // + ); + + // + if (signaller7HasSignal) + { + // + provider += ToXString(X121_XKI_STRATEGY_7); + + // + if (!zone.IsValid()) + { + // + dir = tmpDir; + zone = tmpZone; + } + } + + // + tmpZone.Clean(); + tmpDir = X_DIRECTION_NONE; + } + // // Summarize Signallers Result ... result = signaller1HasSignal || @@ -779,7 +814,8 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller signaller3HasSignal || signaller4HasSignal || signaller5HasSignal || - signaller6HasSignal; + signaller6HasSignal || + signaller7HasSignal; // // Signal Validating ... @@ -1688,6 +1724,92 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller // return result; } + + /** + * Check Bar Has Signal Based on Strategy 7 ... + * ُSupply and Demand ... + * + * @return ( bool ) + */ + bool Strategy7HasSignal( + XOHCL &bar, + XBoxZone &zone, + XTarget &targets[], + ENUM_X_DIRECTION &dir // + ) + { + // + bool result = false; + + // + zone.Clean(); + XClean(targets); + dir = X_DIRECTION_NONE; + + // + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + int barIndex = bar.Index() + 1; + + // + // Retrieve Base Conditions ... + bool isBullish = false; + bool isBearish = false; + + // + XBoxZone demandZones[]; + int demandZonesCount = poiDetector.DetectDemands( + demandZones, + barIndex, + bar.symbol, + bar.period, + 100, + 4, + 2, + 100 // + ); + + // + // Validate Conditions ... + result = isBullish || isBearish; + if (!result) + { + return result; + } + + // + // Do Validation and Filtering Market Structure if required ... + + // + // Check and Prepare Direction ... + dir = + isBullish + ? X_DIRECTION_BULLISH + : isBearish ? X_DIRECTION_BEARISH + : X_DIRECTION_NONE; + result = HasDirection(dir); + if (!result) + { + return result; + } + + // + // Prepare Zone ... + + // + result = + result && + zone.IsValid() && + HasDirection(dir); + + // + return result; + } // #endregion // #region TF Patterns ... diff --git a/X121XKIEA/Classes/x-saherelm.x121.xki.x-poi.detector.class.mq5 b/X121XKIEA/Classes/x-saherelm.x121.xki.x-poi.detector.class.mq5 index a46d475c..990c2355 100644 --- a/X121XKIEA/Classes/x-saherelm.x121.xki.x-poi.detector.class.mq5 +++ b/X121XKIEA/Classes/x-saherelm.x121.xki.x-poi.detector.class.mq5 @@ -85,6 +85,7 @@ class XCX121XKIPOIDetector : public XCMarketPatternDetector ENUM_TIMEFRAMES forPeriod = NULL, int loopback = 50, int minAllowedSameDirectionalBars = 4, + double minFVGAllowedPoints = 30, int confluence = 1, int confluenceLoopback = 50 // ) @@ -134,6 +135,11 @@ class XCX121XKIPOIDetector : public XCMarketPatternDetector confluenceLoopback = 0; } + // + if (minFVGAllowedPoints < 0) { + minFVGAllowedPoints = 0; + } + // if (minAllowedSameDirectionalBars < 0) { @@ -148,11 +154,14 @@ class XCX121XKIPOIDetector : public XCMarketPatternDetector double upper = 0; double lower = 0; XBoxZone tmpZone; + int tmpCount = 0; + XBoxZone tmpFVGs[]; string type = NULL; double tmpValue = 0; datetime from = NULL; int start = barIndex; int end = barIndex + loopback; + ENUM_X_DIRECTION tmpDir = X_DIRECTION_NONE; datetime to = GetBarTime(forSymbol, forPeriod, barIndex); for (int i = start; i < end; i++) { @@ -163,6 +172,40 @@ class XCX121XKIPOIDetector : public XCMarketPatternDetector { // // Next Step is Detect Sequence Same Directional Bars ... + has = HasSameBars(tmpBar, tmpDir, tmpCount, minAllowedSameDirectionalBars); + if (has) + { + // + // Zone Bar ... + XOHCL zoneBar; + has = zoneBar.Init(tmpBar.symbol, tmpBar.period, i + tmpCount + 1); + + // + // Validate Zone Bar Direction ... + has = has && + zoneBar.GetDirection() != tmpBar.GetDirection(); + if (has) + { + // + // Validate FVG Exists ... + CollectFVGs(tmpBar, tmpFVGs, 5, 0, zoneBar.Index() - tmpBar.Index()); + FilterZones(tmpBar, tmpFVGs, tmpBar.GetDirection(), X_PRICE_CLOSE, tmpBar.GetDirection()); + has = ArraySize(tmpFVGs) > 0; + if (has && minFVGAllowedPoints > 0) { + // + // Validate FVG Gap + } + + // + if (has) + { + DebugBreak(); + } + } + + // + zoneBar.Clean(); + } // tmpBar.Clean(); diff --git a/X121XKIEA/Libraries/x-saherelm.x121.xki.lib.mq5 b/X121XKIEA/Libraries/x-saherelm.x121.xki.lib.mq5 index afb85cfe..3bc3aa60 100644 --- a/X121XKIEA/Libraries/x-saherelm.x121.xki.lib.mq5 +++ b/X121XKIEA/Libraries/x-saherelm.x121.xki.lib.mq5 @@ -37,6 +37,7 @@ enum X121XKIStrategies X121_XKI_STRATEGY_4 = 4, X121_XKI_STRATEGY_5 = 5, X121_XKI_STRATEGY_6 = 6, + X121_XKI_STRATEGY_7 = 7, }; bool IsXValid(X121XKIStrategies value) { @@ -77,6 +78,10 @@ string ToXString(X121XKIStrategies value) case X121_XKI_STRATEGY_6: result = "6"; break; + // + case X121_XKI_STRATEGY_7: + result = "7"; + break; } } @@ -116,6 +121,10 @@ X121XKIStrategies ToX121XKIStrategy(string value) { result = X121_XKI_STRATEGY_6; } + else if (value == ToXString(X121_XKI_STRATEGY_7)) + { + result = X121_XKI_STRATEGY_7; + } } //