From bfd5bd4f69258d7d0e91cc59792745bf414d7751 Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Mon, 27 Oct 2025 06:11:00 +0330 Subject: [PATCH] last works on Strategy 3 ... --- .../x-saherelm.xfima.signaller.class.mq5 | 423 +++++++++++------- 1 file changed, 251 insertions(+), 172 deletions(-) diff --git a/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 b/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 index 88e5c304..5182a1d0 100644 --- a/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 +++ b/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 @@ -446,6 +446,7 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller // XClean(guards); + return result; // int positionsCount = ArraySize(positions); @@ -1393,8 +1394,8 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller // Signaller Flags ... bool useSignaller1 = false; bool useSignaller2 = false; - bool useSignaller3 = false; - bool useSignaller4 = true; + bool useSignaller3 = true; + bool useSignaller4 = false; // // Validator Flags ... @@ -1412,20 +1413,20 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller // Draw Flags ... bool draw = true; bool drawZone = true; - bool drawMarketStructurePivots = true; - bool drawMarketStructureAnalysis = true; - bool drawMarketStructureOrderFlow = true; + bool drawMarketStructurePivots = false; + bool drawMarketStructureAnalysis = false; + bool drawMarketStructureOrderFlow = false; XPOIDrawConfig iDrawConfig; // drawLeg = false; - drawZones = true; - drawIZones = true; - drawSupport = true; - drawISupport = true; + drawZones = false; + drawIZones = false; + drawSupport = false; + drawISupport = false; drawOrderFlow = false; - drawResistance = true; - drawIResistance = true; + drawResistance = false; + drawIResistance = false; // // Signal Checking ... @@ -2345,191 +2346,269 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller } // - // Configurations ... - // int patternsFillValidation = 3; + // Validation Flags ... - // // - // // Validation Flags ... - // bool validateByBarPatterns = true; + // + bool validateByPVChanges = true; + bool validateByGapExists = true; + bool validateByBarShadows = true; + bool validateHasDirectionalZone = true; - // // - // // Define Requirements ... + // + // Define Requirements ... - // // - // XOHCL pBar; - // XOHCL p2Bar; - // XOHCL p3Bar; - // bool isBullish = false; - // bool isBearish = false; + // + XOHCL pBar; + XOHCL p2Bar; + XOHCL p3Bar; + bool isBullish = false; + bool isBearish = false; - // // - // // Read PBar ... - // result = bar.GetPreviousBar(pBar); - // result = result && - // pBar.GetPreviousBar(p2Bar); - // result = result && - // p2Bar.GetPreviousBar(p3Bar); - // if (!result) - // { - // // - // pBar.Clean(); - // p2Bar.Clean(); - // p3Bar.Clean(); + // + // Read PBar ... + result = bar.GetPreviousBar(pBar); + result = result && + pBar.GetPreviousBar(p2Bar); + result = result && + p2Bar.GetPreviousBar(p3Bar); + if (!result) + { + // + pBar.Clean(); + p2Bar.Clean(); + p3Bar.Clean(); - // // - // return result; - // } + // + return result; + } - // // - // // Do ... + // + // Do ... - // // - // // Retrieve pBar Patterns ... - // XPatternAnalysis pBarPatterns; - // XPatternAnalysisConfig patternConfig = structureConfig.barsAnalysisConfig; - // poiDetector.AnalyseBarPatterns( - // pBar, - // pBarPatterns, - // patternConfig // - // ); + // + // Retrieve pBar Patterns ... + XBoxZone _fvg; + XBoxZone _support; + XBoxZone _resistance; + XPatternAnalysis pBarPatterns; + XPatternAnalysis p2BarPatterns; + XPatternAnalysisConfig patternConfig = structureConfig.barsAnalysisConfig; - // // - // int pBarBullishPatternsCount = - // !pBarPatterns.IsValid() - // ? 0 - // : pBarPatterns.Count(X_DIRECTION_BULLISH); - // bool isPBarFillBullishPatterns = - // IsValidSize(pBarBullishPatternsCount) && - // pBarBullishPatternsCount >= patternsFillValidation; - // bool isPBarHasBullishPatterns = - // pBarPatterns.IsValid() && - // ( - // // - // pBarPatterns.IsPinned(X_DIRECTION_BULLISH) || - // pBarPatterns.IsEngulfed(X_DIRECTION_BULLISH) || - // pBarPatterns.IsMomentum(X_DIRECTION_BULLISH) || - // pBarPatterns.IsPiercing(X_DIRECTION_BULLISH) || - // pBarPatterns.IsSignalKey(X_DIRECTION_BULLISH) - // // - // ); + // + poiDetector.AnalyseBarPatterns( + pBar, + pBarPatterns, + patternConfig // + ); + poiDetector.AnalyseBarPatterns( + p2Bar, + p2BarPatterns, + patternConfig // + ); - // // - // int pBarBearishPatternsCount = - // !pBarPatterns.IsValid() - // ? 0 - // : pBarPatterns.Count(X_DIRECTION_BEARISH); - // bool isPBarFillBearishPatterns = - // IsValidSize(pBarBearishPatternsCount) && - // pBarBearishPatternsCount >= patternsFillValidation; - // bool isPBarHasBearishPatterns = - // pBarPatterns.IsValid() && - // ( - // // - // pBarPatterns.IsPinned(X_DIRECTION_BEARISH) || - // pBarPatterns.IsEngulfed(X_DIRECTION_BEARISH) || - // pBarPatterns.IsMomentum(X_DIRECTION_BEARISH) || - // pBarPatterns.IsPiercing(X_DIRECTION_BEARISH) || - // pBarPatterns.IsSignalKey(X_DIRECTION_BEARISH) - // // - // ); + // + // Price Must Break Support or Resistance ... - // // - // bool hasSupport = HasSupport(); - // bool hasResistance = HasResistance(); + // + // Extract Support and Resistance ... + bool hasSupport = p2BarPatterns.IsSupport(); + bool hasResistance = p2BarPatterns.IsResistance(); + if (hasSupport) + { + // + XOHCL tmpBar; + XPivot tmpPivot; + hasSupport = p2BarPatterns.GetSupport(tmpBar, tmpPivot, _support); + tmpBar.Clean(); + tmpPivot.Clean(); + } + if (hasResistance) + { + // + XOHCL tmpBar; + XPivot tmpPivot; + hasResistance = p2BarPatterns.GetResistance(tmpBar, tmpPivot, _resistance); + tmpBar.Clean(); + tmpPivot.Clean(); + } - // // - // bool isP2BarInSupport = hasSupport && - // pBar.low > support.lower && - // p2Bar.low < support.upper && - // p2Bar.low > support.lower; + // + bool hasBreakedSupport = hasSupport && + pBar.close < _support.lower && + p2Bar.close > _support.lower; + bool hasBreakedResistance = hasResistance && + pBar.close > _resistance.upper && + p2Bar.close < _resistance.upper; - // // - // bool isP2BarInResistance = hasResistance && - // pBar.high < resistance.upper && - // p2Bar.high > resistance.lower && - // p2Bar.high < resistance.upper; + // + isBullish = hasBreakedResistance; + isBearish = hasBreakedSupport; - // // - // isBullish = - // hasSupport && - // isP2BarInSupport; + // + result = isBullish || isBearish; - // // - // isBearish = - // hasResistance && - // isP2BarInResistance; + // + // Validate By PV Changed ... + // Breaker Bar must Change Peak or Value ... + if (result && validateByPVChanges) + { + // + bool isPeakOverLast = fimaParser.IsPeakOverLast(pBar.Index()); + bool isValeUnderLast = fimaParser.IsValeUnderLast(pBar.Index()); - // // - // // Summarize Result ... - // result = isBullish || isBearish; + // + isBullish = + isBullish && + isPeakOverLast; - // // - // // Validate Bar Patterns ... - // if (result && validateByBarPatterns) - // { - // // - // isBullish = - // isBullish && - // isPBarHasBullishPatterns && - // isPBarFillBullishPatterns; + // + isBearish = + isBearish && + isValeUnderLast; - // // - // isBearish = - // isBearish && - // isPBarHasBearishPatterns && - // isPBarFillBearishPatterns; + // + // Summarize Result ... + result = isBullish || isBearish; + } - // // - // // Summarize result ... - // result = isBullish || isBearish; - // } + // + // Validate by Bar Shadows ... + // Breakre Bar Side Shadow must not Reached ... + if (result && validateByBarShadows) + { + // + isBullish = + isBullish && + pBar.low > p2Bar.low; - // // - // if (result) - // { - // // - // poiDrawer.DrawPatternAnalysis(pBarPatterns, structureDrawConfig.barAnalysisDrawConfig); - // // poiDrawer.DrawPatternAnalysis(p2BarPatterns, structureDrawConfig.barAnalysisDrawConfig); - // DebugBreak(); + // + isBearish = + isBearish && + pBar.high < p2Bar.high; - // // - // result = false; - // isBullish = false; - // isBearish = false; - // } + // + // Summarize Result ... + result = isBullish || isBearish; + } - // // - // // Validate ... - // result = isBullish || - // isBearish; + // + // Validate Has Directional Zone ... + if (result && validateHasDirectionalZone) + { + // + isBullish = + isBullish && + hasSupport; - // // - // // Prepare Zone ... - // if (result) - // { - // } + // + isBearish = + isBearish && + hasResistance; - // // - // // Prepare Targets ... - // if (result) - // { - // } + // + // Summarize Result ... + result = isBullish || isBearish; + } - // // - // // Cleanup ... - // if (!result) - // { - // // - // zone.Clean(); - // XClean(targets); - // dir = X_DIRECTION_NONE; - // } - // pBar.Clean(); - // p2Bar.Clean(); - // p3Bar.Clean(); - // // pBarPatterns.Clean(); - // // patternConfig.Clean(); - // // p2BarPatterns.Clean(); + // + // Validate By Gap Exists ... + if (result && validateByGapExists) + { + // + ENUM_X_DIRECTION tmpDir; + bool hasFVG = poiDetector.HasFVG( + pBar, + tmpDir, + _fvg // + ); + + // + isBullish = + isBullish && + hasFVG && + IsXBullish(tmpDir); + + // + isBearish = + isBearish && + hasFVG && + IsXBearish(tmpDir); + + // + // Summarize Result ... + result = isBullish || isBearish; + } + + // + // Prepare Direction and Zone ... + if (result) + { + // + if (isBullish) + { + // + zone = _resistance; + zone.dir = Opposit(_resistance.dir); + dir = zone.dir; + zone.upper = MathMax(zone.upper, _fvg.upper); + zone.lower = MathMin(zone.lower, _fvg.lower); + } + + // + if (isBearish) + { + // + zone = _support; + zone.dir = Opposit(_support.dir); + dir = zone.dir; + zone.upper = MathMax(zone.upper, _fvg.upper); + zone.lower = MathMin(zone.lower, _fvg.lower); + } + + // + result = zone.IsValid(); + } + + // + if (result) + { + // + if (_support.IsValid()) + { + poiDrawer.DrawZone(_support, structureDrawConfig.drawConfig); + } + + // + if (_resistance.IsValid()) + { + poiDrawer.DrawZone(_resistance, structureDrawConfig.drawConfig); + } + + // + if (pBarPatterns.IsValid()) + { + poiDrawer.DrawPatternAnalysis(pBarPatterns, structureDrawConfig.barAnalysisDrawConfig); + } + + // + // DebugBreak(); + } + + // + // Cleanup ... + if (!result) + { + // + zone.Clean(); + XClean(targets); + dir = X_DIRECTION_NONE; + } + pBar.Clean(); + p2Bar.Clean(); + p3Bar.Clean(); + pBarPatterns.Clean(); + p2BarPatterns.Clean(); + patternConfig.Clean(); // return result;