From fda0da2d2e8743d0aa13d3301cd91d44d539fcb5 Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Tue, 28 Oct 2025 02:06:48 +0330 Subject: [PATCH] last ... --- .../Classes/x-saherelm.xfima.parser.class.mq5 | 105 +++++++++++++++++- .../x-saherelm.xfima.signaller.class.mq5 | 65 ++++++++++- .../x-saherelm.xfima.x-poi.detector.class.mq5 | 102 ++++++++++++++++- 3 files changed, 266 insertions(+), 6 deletions(-) diff --git a/XFIMAEA/Classes/x-saherelm.xfima.parser.class.mq5 b/XFIMAEA/Classes/x-saherelm.xfima.parser.class.mq5 index 19dccbc8..274b42ca 100644 --- a/XFIMAEA/Classes/x-saherelm.xfima.parser.class.mq5 +++ b/XFIMAEA/Classes/x-saherelm.xfima.parser.class.mq5 @@ -2809,7 +2809,7 @@ class XCXFIMAHelperParser : XCBase // // Reading Boundary Values ... - + // double maBandUpper = EMPTY_VALUE; double maBandLower = EMPTY_VALUE; @@ -3497,6 +3497,109 @@ class XCXFIMAHelperParser : XCBase return result; } + /** + * Check Has Boundary Trend or not ... + * + * @param trend: XTrend, refrence to holds Detected trend ... + * @param barIndex: int, Specified Bar Index ... + * + * @return ( bool ) + */ + bool HasBoundaryTrend( + XTrend &trend, + int barIndex = 0 // + ) + { + // + bool result = false; + + // + // Prepare ... + trend.Clean(); + + // + // Normalize ... + barIndex = NormalizeBarIndex(barIndex); + + // + // Validate ... + result = IsValid(); + if (!result) + { + return result; + } + + // + int pIDX = barIndex + 1; + + // + // Select Times ... + datetime toTime = GetBarTime(symbol, period, barIndex); + datetime fromTime = GetBarTime(symbol, period, pIDX); + + // + // Reading Min and Max ... + + // + double bMax = GetBoundaryMax(barIndex); + double pBMax = GetBoundaryMax(pIDX); + + // + double bMin = GetBoundaryMin(barIndex); + double pBMin = GetBoundaryMin(pIDX); + + // + bool isBullish = + pBMax < bMax && + pBMin < bMin; + + // + bool isBearish = + pBMax > bMax && + pBMin > bMin; + + // + // Initialize Trend ... + result = isBullish || isBearish; + if (result) + { + // + result = trend.Init( + symbol, + period, + toTime, + isBullish + ? pBMin + : pBMax, + fromTime, + isBullish + ? bMin + : bMax, + toTime // + ); + + // + if (!result) + { + trend.Clean(); + } + } + + // + result = trend.IsValid() && + trend.HasTrend(); + + // + // Cleanup ... + if (!result) + { + trend.Clean(); + } + + // + return result; + } + // // Protected ... protected: diff --git a/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 b/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 index 8c6225c4..699b1a98 100644 --- a/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 +++ b/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 @@ -1395,7 +1395,7 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller bool useSignaller1 = false; bool useSignaller2 = false; bool useSignaller3 = true; - bool useSignaller4 = true; + bool useSignaller4 = false; // // Validator Flags ... @@ -2565,6 +2565,67 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller zone.lower = MathMin(zone.lower, _fvg.lower); } + // + // Zone Validation Base ... + result = zone.IsValid(); + if (result) + { + // + // Validate By Trend of Zone ... + XTrend zoneTrend; + XTrend zoneToTrend; + + // + // Detecting Trends ... + result = poiDetector.HasBoundaryTrend(zone, zoneTrend, false); + result = result && + poiDetector.HasBoundaryTrend(zone, zoneToTrend, true); + + // + // Validate Trend ... + result = + result && + zone.dir == zoneTrend.dir && + zone.dir == zoneToTrend.dir; + + // + // Draw ... + if (result) + { + // + XPOIDrawConfig iConfig = structureDrawConfig.drawConfig; + iConfig.trendRayLeft = false; + iConfig.trendRayRight = false; + + // + poiDrawer.DrawTrendLine(zoneTrend, iConfig); + poiDrawer.DrawTrendLine(zoneToTrend, iConfig); + + // + iConfig.Clean(); + } + + // + if (result) + { + DebugBreak(); + } + + // + // Cleanup ... + zoneTrend.Clean(); + zoneToTrend.Clean(); + + // + // Reset Flags ... + if (!result) { + // + zone.Clean(); + isBullish = false; + isBearish = false; + } + } + // result = zone.IsValid(); } @@ -2591,7 +2652,7 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller } // - // DebugBreak(); + DebugBreak(); } // diff --git a/XFIMAEA/Classes/x-saherelm.xfima.x-poi.detector.class.mq5 b/XFIMAEA/Classes/x-saherelm.xfima.x-poi.detector.class.mq5 index 0f1de116..222f78d8 100644 --- a/XFIMAEA/Classes/x-saherelm.xfima.x-poi.detector.class.mq5 +++ b/XFIMAEA/Classes/x-saherelm.xfima.x-poi.detector.class.mq5 @@ -1607,7 +1607,7 @@ class XCXFIMAPOIDetector : public XCMarketPatternDetector // // Validate ... bool has = zone.IsValid() && - fimaParser.IsValid(); + fimaParser.IsValid(); if (!has) { return result; @@ -1646,7 +1646,8 @@ class XCXFIMAPOIDetector : public XCMarketPatternDetector zone.period, X_PIVOT_TYPE_PEAK // ); - if (has) { + if (has) + { upperPivot.prefix = "XBNDUP"; } @@ -1661,7 +1662,8 @@ class XCXFIMAPOIDetector : public XCMarketPatternDetector zone.period, X_PIVOT_TYPE_VALE // ); - if (has) { + if (has) + { lowerPivot.prefix = "XBNDLO"; } @@ -1689,6 +1691,100 @@ class XCXFIMAPOIDetector : public XCMarketPatternDetector return result; } + /** + * Check Zone Has Boundary Trend or not ... + * + * @param zone: XBoxZOne, reference to Specified Zone for Checking Trend ... + * @param trend: XTrend, reference to holds Detected Trend Result ... + * @param basedOnToTime: bool, if set true, do based on to and it's prev bar ... + * + * @return ( bool ) + */ + bool HasBoundaryTrend( + XBoxZone &zone, + XTrend &trend, + bool basedOnToTime = false // + ) + { + // + bool result = false; + + // + // Prepare ... + trend.Clean(); + + // + // Validate ... + result = + zone.IsValid() && + fimaParser.IsValid(); + if (!result) + { + return result; + } + + // + // Do ... + + // + int toIDX = zone.ToIndex(); + int fromIDX = + basedOnToTime + ? toIDX + 1 + : zone.FromIndex(); + datetime fromTime = GetBarTime(zone.symbol, zone.period, fromIDX); + + // + double toMin = fimaParser.GetBoundaryMin(toIDX); + double toMax = fimaParser.GetBoundaryMax(toIDX); + + // + double fromMin = fimaParser.GetBoundaryMin(fromIDX); + double fromMax = fimaParser.GetBoundaryMax(fromIDX); + + // + bool isMinBullish = fromMin < toMin; + bool isMaxBullish = fromMax < toMax; + bool isBullish = isMinBullish && isMaxBullish; + + // + bool isMinBearish = fromMin > toMin; + bool isMaxBearish = fromMax > toMax; + bool isBearish = isMinBearish && isMaxBearish; + + // + result = isBullish || isBearish; + if (result) + { + // + result = trend.Init( + zone.symbol, + zone.period, + TimeCurrent(), + isBullish + ? fromMin + : fromMax, + fromTime, + isBullish + ? toMin + : toMax, + zone.to // + ); + } + + // + // Validate Result ... + result = trend.IsValid() && + trend.HasTrend(); + if (!result) + { + trend.Clean(); + } + + // + return result; + } + // // Others ...