From 30c89368c140a67b9c5ed9b9d849b0904aa65b08 Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Mon, 20 Oct 2025 20:21:17 +0330 Subject: [PATCH] last works ... --- Classes/x-saherelm.x-market.pattern.class.mq5 | 230 ++++ Documents/BKP/XFIMA Signals/signallers.mq5 | 792 ++++++++++++++ Documents/BKP/test.fima.conditions.mq5 | 364 +++++-- Libraries/x-saherelm.x-poi.extensions.lib.mq5 | 115 ++ .../x-saherelm.xfima.signaller.class.mq5 | 523 ++++++---- .../x-saherelm.xfima.signaller.class_@!!@.mq5 | 986 ------------------ 6 files changed, 1750 insertions(+), 1260 deletions(-) create mode 100644 Documents/BKP/XFIMA Signals/signallers.mq5 delete mode 100644 XFIMAEA/Classes/x-saherelm.xfima.signaller.class_@!!@.mq5 diff --git a/Classes/x-saherelm.x-market.pattern.class.mq5 b/Classes/x-saherelm.x-market.pattern.class.mq5 index d0dd987f..145cdb94 100644 --- a/Classes/x-saherelm.x-market.pattern.class.mq5 +++ b/Classes/x-saherelm.x-market.pattern.class.mq5 @@ -1431,6 +1431,225 @@ class XCMarketPatternDetector : public XCBase return result; } + bool IsContinuationPullbackPattern( + XOHCL &bar, + XBoxZone &zone, + XBoxZone &continuationalZones[], + ENUM_X_DIRECTION &dir, + XOHCL &continuationalBar, + int continuationLength = 3, + bool forceContinuationHasZone = true, + bool forceContinuationHasPattern = true, + int pullbackLength = 2, + bool forcePullbackBreak = false, + int zonesLoopback = 5, + int zonesValidationLength = 5 // + ) + { + // + bool result = false; + + // + // Prepare ... + zone.Clean(); + CleanDirection(dir); + continuationalBar.Clean(); + XClean(continuationalZones); + + // + // Normalize ... + zonesLoopback = NormalizeInt(zonesLoopback, 3); + pullbackLength = NormalizeInt(pullbackLength, 2); + continuationLength = NormalizeInt(continuationLength, 2); + zonesValidationLength = NormalizeInt(zonesValidationLength, 3); + + // + // Validate ... + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + // First we Have to Detect a Pullback ... + result = IsPullbackPattern(bar, zone, dir, pullbackLength, forcePullbackBreak); + + // + // Select PullBack Start Bar ... + XOHCL startBar; + result = result && + zone.FromBar(startBar); + + // + // Check Continuation Direction ... + XOHCL iBar; + int start = startBar.Index() + 1; + int end = start + continuationLength; + for (int i = start; i < end && result; i++) + { + // + // Initialize Indexed Bar ... + iBar.Clean(); + result = + result && + bar.BarAt(i, iBar); + + // + // Check Direction Same ... + result = + result && + dir == iBar.GetDirection(); + + // + if (!result) + { + break; + } + } + + // + // Setting Continuational Bar ... + if (result) + { + continuationalBar = iBar; + } + + // + // Apply Zone Force ... + if (result && forceContinuationHasZone) + { + // + XBoxZone tmps[]; + + // + // Collectiong Support and Resistances ... + CollectZones(startBar, tmps, zonesLoopback, zonesValidationLength, 0, zonesLoopback * 2); + Copy(tmps, continuationalZones, false); + + // + // Collecting Order Blocks ... + // CollectOBs(startBar, tmps, zonesLoopback, 0, zonesLoopback * 2); + // Copy(tmps, continuationalZones, false); + + // + // Collectiong Fair Value Gaps ... + CollectFVGs(startBar, tmps, zonesLoopback, 0, zonesLoopback * 2); + Copy(tmps, continuationalZones, false); + + // + // Extract Directional Zones ... + XClean(tmps); + ExtractByDirection(tmps, continuationalZones, zone.dir); + Copy(tmps, continuationalZones); + + // + // Validate Result ... + result = result && + HasChild(continuationalZones); + + // + XClean(tmps); + } + + // + // Apply Pattern Force ... + if (result && forceContinuationHasPattern) + { + // + bool has = false; + int pattersCount = 0; + ENUM_X_DIRECTION iPatternDir; + for (int i = start; i < end; i++) + { + // + iBar.Clean(); + CleanDirection(iPatternDir); + + // + has = bar.BarAt(i, iBar); + if (!has) + { + break; + } + + // + // Checking Required Patterns ... + + // + // Pin Bar ... + has = IsPinnedBar(iBar, iPatternDir); + has = has && + iPatternDir == zone.dir; + if (has) + { + pattersCount++; + } + + // + // Engulfed Bar ... + has = IsEngulfedBar(iBar, iPatternDir); + has = has && + iPatternDir == zone.dir; + if (has) + { + pattersCount++; + } + + // + // Momentum Bar ... + has = IsMomentumBar(iBar, iPatternDir); + has = has && + iPatternDir == zone.dir; + if (has) + { + pattersCount++; + } + + // + // Piercing ... + has = IsPiercingPattern(iBar, iPatternDir); + has = has && + iPatternDir == zone.dir; + if (has) + { + pattersCount++; + } + + // + // SignalKey ... + has = IsSignalKeyBarPattern(iBar, iPatternDir); + has = has && + iPatternDir == zone.dir; + if (has) + { + pattersCount++; + } + } + + // + result = + result && + IsValidSize(pattersCount); + } + + // + // Cleanup ... + if (!result) + { + // + zone.Clean(); + CleanDirection(dir); + continuationalBar.Clean(); + XClean(continuationalZones); + } + iBar.Clean(); + startBar.Clean(); + + // + return result; + } + // // FVG ... @@ -3911,6 +4130,17 @@ class XCMarketPatternDetector : public XCBase return result; } + /** + * Filter Zones ... + * + * @param bar: XOHCL, reference to Specified Filtering Bar ... + * @param source: XBoxZone, reference collection to hold's filtered zones ... + * @param filterDir: ENUM_X_DIRECTION, specified Filter Direction ... + * @param priceType: ENUM_X_PRICE, Specified Bar's Price type to Use for Filtering Zones ... + * @param forDir: ENUM_X_DIRECTION, Specified Zone's Direction to Handle Filtering ... + * + * @return ( int ) + */ int FilterZones( XOHCL &bar, XBoxZone &source[], diff --git a/Documents/BKP/XFIMA Signals/signallers.mq5 b/Documents/BKP/XFIMA Signals/signallers.mq5 new file mode 100644 index 00000000..5578c043 --- /dev/null +++ b/Documents/BKP/XFIMA Signals/signallers.mq5 @@ -0,0 +1,792 @@ + +// ======================================= +// Temp Signaller: +// ======================================= + +/** + * Check Bar Has Signal Based on Strategy X ... + * + * @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 ... + * + * @return ( bool ) + */ +bool StrategyXHasSignal( + XOHCL &bar, + XBoxZone &zone, + XTarget &targets[], + ENUM_X_DIRECTION &dir // +) +{ + // + bool result = false; + + // + // Prepare ... + zone.Clean(); + XClean(targets); + dir = X_DIRECTION_NONE; + + // + // Validate ... + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + // Define Requirements ... + + // + XOHCL pBar; + XOHCL p2Bar; + bool isBullish = false; + bool isBearish = false; + + // + // Read PBar ... + result = bar.GetPreviousBar(pBar); + result = result && + pBar.GetPreviousBar(p2Bar); + if (!result) + { + // + pBar.Clean(); + p2Bar.Clean(); + + // + return result; + } + + // + // Reading pBar Patterns ... + XPatternAnalysis pBarAnalysis; + poiDetector.AnalyseBarPatterns( + pBar, + pBarAnalysis, + structureConfig.barsAnalysisConfig // + ); + + // + // Check Bar Patterns ... + bool isPBarHasBullishPatterns = + (bar.close > pBar.low || + bar.open > pBar.low) && + ( + // + pBarAnalysis.IsPinned(X_DIRECTION_BULLISH) || + pBarAnalysis.IsEngulfed(X_DIRECTION_BULLISH) || + pBarAnalysis.IsMomentum(X_DIRECTION_BULLISH) || + pBarAnalysis.IsPiercing(X_DIRECTION_BULLISH) || + pBarAnalysis.IsSignalKey(X_DIRECTION_BULLISH) + // + ); + bool isPBarHasBearishPatterns = + (bar.close < pBar.high || + bar.open < pBar.high) && + ( + // + pBarAnalysis.IsPinned(X_DIRECTION_BEARISH) || + pBarAnalysis.IsEngulfed(X_DIRECTION_BEARISH) || + pBarAnalysis.IsMomentum(X_DIRECTION_BEARISH) || + pBarAnalysis.IsPiercing(X_DIRECTION_BEARISH) || + pBarAnalysis.IsSignalKey(X_DIRECTION_BEARISH) + // + ); + + // + // Do ... + + // + isBullish = + // + false + // + ; + + // + isBearish = + // + false + // + ; + + // + // Validate ... + result = isBullish || + isBearish; + if (result) + { + // + dir = + isBullish + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + + // + result = HasDirection(dir); + } + + // + // Prepare Zone ... + if (result) + { + // + zone.Clean(); + result = ToBox( + p2Bar, + zone, + dir, + X_BAR_PATTERN_PINNED // + ); + + // + // Manage Stops ... + if (result) + { + } + + // + result = zone.IsValid(); + } + + // + // Prepare Targets ... + if (result) + { + } + + // + // Cleanup ... + if (!result) + { + // + zone.Clean(); + XClean(targets); + dir = X_DIRECTION_NONE; + } + pBar.Clean(); + p2Bar.Clean(); + + // + return result; +} + +// ======================================= +// Signaller 1: +// ======================================= + +/** + * Check Bar Has Signal Based on Strategy 1 ... + * + * @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 ... + * + * @return ( bool ) + */ +bool Strategy1HasSignal( + XOHCL &bar, + XBoxZone &zone, + XTarget &targets[], + ENUM_X_DIRECTION &dir // +) +{ + // + bool result = false; + + // + // Prepare ... + zone.Clean(); + XClean(targets); + dir = X_DIRECTION_NONE; + + // + // Validate ... + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + // Define Requirements ... + + // + XOHCL pBar; + XOHCL p2Bar; + bool isBullish = false; + bool isBearish = false; + + // + // Read PBar ... + result = bar.GetPreviousBar(pBar); + result = result && + pBar.GetPreviousBar(p2Bar); + if (!result) + { + // + pBar.Clean(); + p2Bar.Clean(); + + // + return result; + } + + // + // Reading pBar Patterns ... + XPatternAnalysis pBarAnalysis; + poiDetector.AnalyseBarPatterns( + pBar, + pBarAnalysis, + structureConfig.barsAnalysisConfig // + ); + + // + // Check Bar Patterns ... + bool isPBarHasBullishPatterns = + (bar.close > pBar.low || + bar.open > pBar.low) && + ( + // + pBarAnalysis.IsPinned(X_DIRECTION_BULLISH) || + pBarAnalysis.IsEngulfed(X_DIRECTION_BULLISH) || + pBarAnalysis.IsMomentum(X_DIRECTION_BULLISH) || + pBarAnalysis.IsPiercing(X_DIRECTION_BULLISH) || + pBarAnalysis.IsSignalKey(X_DIRECTION_BULLISH) + // + ); + bool isPBarHasBearishPatterns = + (bar.close < pBar.high || + bar.open < pBar.high) && + ( + // + pBarAnalysis.IsPinned(X_DIRECTION_BEARISH) || + pBarAnalysis.IsEngulfed(X_DIRECTION_BEARISH) || + pBarAnalysis.IsMomentum(X_DIRECTION_BEARISH) || + pBarAnalysis.IsPiercing(X_DIRECTION_BEARISH) || + pBarAnalysis.IsSignalKey(X_DIRECTION_BEARISH) + // + ); + + // + double peak = fimaHelper.GetPeak(bar.Index()); + double vale = fimaHelper.GetVale(bar.Index()); + double pPeak = fimaHelper.GetPeak(pBar.Index()); + double pVale = fimaHelper.GetVale(pBar.Index()); + double p2Peak = fimaHelper.GetPeak(p2Bar.Index()); + double p2Vale = fimaHelper.GetVale(p2Bar.Index()); + bool isPPeakOverLast = fimaHelper.IsPeakOverLast(pBar.Index()); + bool isPValeUnderLast = fimaHelper.IsValeUnderLast(pBar.Index()); + bool isP2PeakOverLast = fimaHelper.IsPeakOverLast(p2Bar.Index()); + bool isP2ValeUnderLast = fimaHelper.IsValeUnderLast(p2Bar.Index()); + bool isPeakOverLast = isPPeakOverLast || + isP2PeakOverLast; + bool isValeUnderLast = isPValeUnderLast || + isP2ValeUnderLast; + bool isP2ValeOverLast = pVale > p2Vale; + bool isP2PeakUnderLast = pPeak < p2Peak; + + // + // Check PBar Close Over Under Fast Ma ... + bool isPBarCloseOverFast = pBar.close > fimaHelper.GetMAFast(pBar.Index()); + bool isPBarCloseUnderFast = pBar.close < fimaHelper.GetMAFast(pBar.Index()); + bool isFastOverLast = fimaHelper.GetMAFast(pBar.Index()) > fimaHelper.GetMAFast(p2Bar.Index()); + bool isFastUnderLast = fimaHelper.GetMAFast(pBar.Index()) < fimaHelper.GetMAFast(p2Bar.Index()); + + // + // Force P2Bar is Pin Bar ... + ENUM_X_DIRECTION p2Dir; + bool isP2BarPinned = poiDetector.IsPinnedBar( + p2Bar, + p2Dir // + ); + bool isP2BarBullishPinned = + isP2BarPinned && + IsXBullish(p2Dir); + bool isP2BarBearishPinned = + isP2BarPinned && + IsXBearish(p2Dir); + + // + // Do ... + + // + isBullish = + // + isFastOverLast && + isValeUnderLast && + !isP2PeakUnderLast && + isPBarCloseOverFast && + isP2BarBullishPinned && + isPBarHasBullishPatterns + // + ; + + // + isBearish = + // + isPeakOverLast && + isFastUnderLast && + !isP2ValeOverLast && + isPBarCloseUnderFast && + isP2BarBearishPinned && + isPBarHasBearishPatterns + // + ; + + // + // Validate ... + result = isBullish || + isBearish; + if (result) + { + // + dir = + isBullish + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + + // + result = HasDirection(dir); + } + + // + // Prepare Zone ... + if (result) + { + // + zone.Clean(); + result = ToBox( + p2Bar, + zone, + dir, + X_BAR_PATTERN_PINNED // + ); + + // + // Manage Stops ... + if (result) + { + // + double entry = GetEntry(zone.symbol, zone.dir); + double riskSide = zone.IsBullish() ? zone.lower : zone.upper; + double risk = MathAbs(entry - riskSide); + + // + // Collecting Affected Zones ... + XBoxZone tmps[]; + XBoxZone zones[]; + XBoxZone actedZones[]; + XBoxZone insideZones[]; + XBoxZone breakedZones[]; + XBoxZone affectedZones[]; + + // + // Support and Resistances ... + poiDetector.CollectZones(bar, tmps); + Copy(tmps, zones, false); + + // + // OBS ... + poiDetector.CollectOBs(bar, tmps); + Copy(tmps, zones, false); + + // + // FVGs ... + poiDetector.CollectFVGs(bar, tmps); + Copy(tmps, zones, false); + + // + ExtractAffectedZones(bar, zones, affectedZones); + + // + // Acteds Zones ... + ExtractActeds(bar, actedZones, affectedZones); + + // + // Inside Zones ... + ExtractInsides(bar, insideZones, affectedZones); + + // + // Breaked Zones ... + ExtractBreakeds(bar, breakedZones, affectedZones); + + // + // Draw Affected Zones ... + if (HasChild(affectedZones)) + { + // + UpdateToTime(affectedZones, bar.time); + poiDrawer.DrawZones(affectedZones, structureDrawConfig.drawConfig); + } + + // + // Draw Acted Zones ... + // if (HasChild(actedZones)) + // { + // poiDrawer.DrawZones(actedZones, structureDrawConfig.drawConfig); + // } + + // + // Draw Inside Zones ... + // if (HasChild(insideZones)) + // { + // poiDrawer.DrawZones(insideZones, structureDrawConfig.drawConfig); + // } + + // // + // // Draw Breaked Zones ... + // if (HasChild(breakedZones)) + // { + // poiDrawer.DrawZones(breakedZones, structureDrawConfig.drawConfig); + // } + + // + // Cleanup ... + XClean(tmps); + XClean(zones); + XClean(actedZones); + XClean(insideZones); + XClean(breakedZones); + XClean(affectedZones); + } + + // + if (result) + { + // + zone.to = bar.time; + + // + poiDrawer.DrawZone( + zone, + structureDrawConfig.drawConfig // + ); + } + + // + result = zone.IsValid(); + } + + // + // Prepare Targets ... + if (result) + { + } + + // + // Cleanup ... + if (!result) + { + // + zone.Clean(); + XClean(targets); + dir = X_DIRECTION_NONE; + } + pBar.Clean(); + p2Bar.Clean(); + + // + return result; +} + +// ======================================= +// Signaller 2: +// ======================================= + +/** + * Check Bar Has Signal Based on Strategy 1 ... + * + * @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 ... + * + * @return ( bool ) + */ +bool Strategy2HasSignal( + XOHCL &bar, + XBoxZone &zone, + XTarget &targets[], + ENUM_X_DIRECTION &dir // +) +{ + // + bool result = false; + + // + // Prepare ... + zone.Clean(); + XClean(targets); + dir = X_DIRECTION_NONE; + + // + // Validate ... + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + // Define Requirements ... + + // + XOHCL pBar; + bool isBullish = false; + bool isBearish = false; + + // + // Read PBar ... + result = bar.GetPreviousBar(pBar); + if (!result) + { + // + pBar.Clean(); + return result; + } + + // + // Reading Conditions ... + int pullBackStartBar = -1; + bool isPullBack = result && + poiDetector.IsPullbackPattern( + pBar, + zone, + dir, + 2, + false // Force Break ... + ); + bool isPullbackBullish = isPullBack && + IsXBullish(dir); + bool isPullbackBearish = isPullBack && + IsXBearish(dir); + if (isPullBack) + { + pullBackStartBar = zone.FromIndex(); + } + + // + // Reading HK Bond ... + + // + double pHKBondUpper = fimaHelper.GetHKBondUpper(pBar.Index()); + double pHKBondLower = fimaHelper.GetHKBondLower(pBar.Index()); + int overHKBondUpperCount = fimaHelper.CountOverHKBondUpper(pullBackStartBar, X_PRICE_LOW); + int underHKBondLowerCount = fimaHelper.CountUnderHKBondLower(pullBackStartBar, X_PRICE_HIGH); + + // + // Reading PV Requirements ... + + // + int lastPeakOverLastIDX = -1; + int lastValeUnderLastIDX = -1; + double pPeak = fimaHelper.GetPeak(pBar.Index()); + double pVale = fimaHelper.GetVale(pBar.Index()); + int samePeaks = fimaHelper.CountSamePeaks(pBar.Index()); + int sameVales = fimaHelper.CountSameVales(pBar.Index()); + fimaHelper.FindLastPeakOverLast(lastPeakOverLastIDX, pBar.Index()); + fimaHelper.FindLastValeUnderLast(lastValeUnderLastIDX, pBar.Index()); + + // + // Reading pBar Patterns ... + XPatternAnalysis pBarAnalysis; + poiDetector.AnalyseBarPatterns( + pBar, + pBarAnalysis, + structureConfig.barsAnalysisConfig // + ); + + // + // Check Bar Patterns ... + bool isPBarHasBullishPatterns = + (bar.close > pBar.low || + bar.open > pBar.low) && + ( + // + pBarAnalysis.IsPinned(X_DIRECTION_BULLISH) || + pBarAnalysis.IsEngulfed(X_DIRECTION_BULLISH) || + pBarAnalysis.IsMomentum(X_DIRECTION_BULLISH) || + pBarAnalysis.IsPiercing(X_DIRECTION_BULLISH) || + pBarAnalysis.IsSignalKey(X_DIRECTION_BULLISH) + // + ); + bool isPBarHasBearishPatterns = + (bar.close < pBar.high || + bar.open < pBar.high) && + ( + // + pBarAnalysis.IsPinned(X_DIRECTION_BEARISH) || + pBarAnalysis.IsEngulfed(X_DIRECTION_BEARISH) || + pBarAnalysis.IsMomentum(X_DIRECTION_BEARISH) || + pBarAnalysis.IsPiercing(X_DIRECTION_BEARISH) || + pBarAnalysis.IsSignalKey(X_DIRECTION_BEARISH) + // + ); + + // + // Check PBar Close Over Under Fast Ma ... + bool isPBarCloseOverFast = pBar.close > fimaHelper.GetMAFast(pBar.Index()); + bool isPBarCloseUnderFast = pBar.close < fimaHelper.GetMAFast(pBar.Index()); + + // + // Try To Find Affected Zone ... + + // + // Collecting Zones ... + XBoxZone zones[]; + XBoxZone affectedZones[]; + XBoxZone affectedZonesBullish[]; + XBoxZone affectedZonesBearish[]; + int zonesCount = poiDetector.CollectZones( + pBar, + zones, // + 5, // Zones Loopback ... + 3 // Zones Validation Length ... + // Required Zones ... + // Loopback ... + ); + int affectedZonesCount = ExtractAffectedZones( + pBar, + zones, + affectedZones // + ); + int affectedZonesBullishCount = ExtractByDirection( + affectedZonesBullish, + affectedZones, + X_DIRECTION_BULLISH // + ); + int affectedZonesBearishCount = ExtractByDirection( + affectedZonesBearish, + affectedZones, + X_DIRECTION_BEARISH // + ); + + // + int insideBullishIDX = -1; + int insideBearishIDX = -1; + bool hasBullishInside = + pBar.IsBullish() && + HasInside( + insideBullishIDX, + pBar, + affectedZonesBullish // + ); + bool hasBearishInside = + pBar.IsBearish() && + HasInside( + insideBearishIDX, + pBar, + affectedZonesBearish // + ); + + // + // Do ... + + // + isBullish = + // + hasBullishInside && + isPullbackBullish && + isPBarHasBullishPatterns && + fimaHelper.IsSarBullish(pBar.Index()) && + (pVale >= affectedZonesBullish[insideBullishIDX].lower && + pVale <= affectedZonesBullish[insideBullishIDX].upper) + // + ; + + // + isBearish = + // + hasBearishInside && + isPullbackBearish && + isPBarHasBearishPatterns && + fimaHelper.IsSarBearish(pBar.Index()) && + (pPeak >= affectedZonesBearish[insideBearishIDX].lower && + pPeak <= affectedZonesBearish[insideBearishIDX].upper) + // + ; + + // + // Validate ... + result = isBullish || + isBearish; + if (result) + { + // + if (isBullish) + { + // + poiDrawer.DrawZone( + affectedZonesBullish[insideBullishIDX], + structureDrawConfig.drawConfig // + ); + } + else + { + // + poiDrawer.DrawZone( + affectedZonesBearish[insideBearishIDX], + structureDrawConfig.drawConfig // + ); + } + + // + dir = + isBullish + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + + // + result = HasDirection(dir); + } + + // + // Prepare Zone ... + if (result) + { + // + zone.Clean(); + if (isBullish) + { + zone = affectedZonesBullish[insideBullishIDX]; + } + else + { + zone = affectedZonesBearish[insideBearishIDX]; + } + + // + result = zone.IsValid(); + } + + // + // Prepare Targets ... + if (result) + { + } + + // + // Cleanup ... + if (!result) + { + // + zone.Clean(); + XClean(targets); + dir = X_DIRECTION_NONE; + } + pBar.Clean(); + XClean(zones); + pBarAnalysis.Clean(); + XClean(affectedZones); + XClean(affectedZonesBullish); + XClean(affectedZonesBearish); + + // + return result; +} diff --git a/Documents/BKP/test.fima.conditions.mq5 b/Documents/BKP/test.fima.conditions.mq5 index 8e2d667a..0e983ce1 100644 --- a/Documents/BKP/test.fima.conditions.mq5 +++ b/Documents/BKP/test.fima.conditions.mq5 @@ -1,97 +1,295 @@ - // // - // isBullish = - // // - // // Vales Same ... - // sameVales >= 7 && - // // - // // PBar Patterns ... - // isBarPatternsPassed && - // isPBarCloseOverFast && - // // - // // Validate PullBack based on HK Bond ... - // isPullbackBullish && - // pBar.close > pHKBondLower; +// // +// isBullish = +// // +// // Vales Same ... +// sameVales >= 7 && +// // +// // PBar Patterns ... +// isBarPatternsPassed && +// isPBarCloseOverFast && +// // +// // Validate PullBack based on HK Bond ... +// isPullbackBullish && +// pBar.close > pHKBondLower; - // - // poiDrawer.DrawPatternAnalysis( - // pBarAnalysis, - // structureDrawConfig.barAnalysisDrawConfig // - // ); +// +// poiDrawer.DrawPatternAnalysis( +// pBarAnalysis, +// structureDrawConfig.barAnalysisDrawConfig // +// ); - // // - // if (IsValidSize(zonesCount)) - // { - // // - // poiDrawer.DrawZones( - // zones, - // structureDrawConfig.drawConfig // - // ); - // } +// // +// if (IsValidSize(zonesCount)) +// { +// // +// poiDrawer.DrawZones( +// zones, +// structureDrawConfig.drawConfig // +// ); +// } - // // - // if (IsValidSize(affectedZonesCount)) - // { - // // - // poiDrawer.DrawZones( - // affectedZones, - // structureDrawConfig.drawConfig // - // ); - // } +// // +// if (IsValidSize(affectedZonesCount)) +// { +// // +// poiDrawer.DrawZones( +// affectedZones, +// structureDrawConfig.drawConfig // +// ); +// } - // - // poiDrawer.DrawZones( - // affectedZonesBullish, - // structureDrawConfig.drawConfig // - // ); +// +// poiDrawer.DrawZones( +// affectedZonesBullish, +// structureDrawConfig.drawConfig // +// ); - // // - // poiDrawer.DrawZones( - // affectedZonesBearish, - // structureDrawConfig.drawConfig // - // ); +// // +// poiDrawer.DrawZones( +// affectedZonesBearish, +// structureDrawConfig.drawConfig // +// ); +// // +// // Update POI Zones ... +// ENUM_X_DETECTOR_ZONE_ACTION zoneActions[]; +// poiDetector.UpdateZones( +// iBar, +// zoneActions // +// // Validation Length ... +// // Required Zones ... +// // Loopback ... +// ); +// +// Retrieve Conditions ... +// conditions.Clean(); +// has = fimaHelper.GetConditions( +// conditions, +// barIndex, +// 10 // Loopback ... +// ); +// if (!has) +// { +// // +// iBar.Clean(); +// conditions.Clean(); - - // // - // // Update POI Zones ... - // ENUM_X_DETECTOR_ZONE_ACTION zoneActions[]; - // poiDetector.UpdateZones( - // iBar, - // zoneActions // - // // Validation Length ... - // // Required Zones ... - // // Loopback ... - // ); +// // +// return; +// } + +// +// structure.Clean(); +// poiDetector.AnalyseMarket( +// structure, +// structureConfig, +// barIndex // +// ); +// poiDrawer.drawnObjects.Clear(); +// poiDrawer.DrawMarketStructure( +// structure, +// structureDrawConfig // +// ); + +/** + * Check Bar Has Signal Based on Strategy X ... + * + * @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 ... + * + * @return ( bool ) + */ +bool StrategyXHasSignal( + XOHCL &bar, + XBoxZone &zone, + XTarget &targets[], + ENUM_X_DIRECTION &dir // +) +{ + // + bool result = false; + + // + // Prepare ... + zone.Clean(); + XClean(targets); + dir = X_DIRECTION_NONE; + + // + // Validate ... + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + // Define Requirements ... + + // + XOHCL pBar; + XOHCL p2Bar; + bool isBullish = false; + bool isBearish = false; + XOHCL continuationalBar; + XBoxZone continuationalZones[]; + + // + // Read PBar ... + result = bar.GetPreviousBar(pBar); + result = result && + pBar.GetPreviousBar(p2Bar); + if (!result) + { + // + pBar.Clean(); + p2Bar.Clean(); // - // Retrieve Conditions ... - // conditions.Clean(); - // has = fimaHelper.GetConditions( - // conditions, - // barIndex, - // 10 // Loopback ... - // ); - // if (!has) - // { - // // - // iBar.Clean(); - // conditions.Clean(); + return result; + } - // // - // return; - // } + // + // Reading pBar Patterns ... + XPatternAnalysis pBarAnalysis; + poiDetector.AnalyseBarPatterns( + pBar, + pBarAnalysis, + structureConfig.barsAnalysisConfig // + ); + + // + // Check Continuational Pullback ... + bool isContinuationPullBack = poiDetector.IsContinuationPullbackPattern( + pBar, + zone, + continuationalZones, + dir, + continuationalBar, + 3, // Continuational Length ... + true, // Force Continuational Loopback Has Zones ... + true, // Force Continuational Loopback Has Patterns ... + 2, // Pullback Length ... + false // Force Pullback Break ... + ); + + // + // Do ... + + // + isBullish = + // + IsXBullish(dir) && + isContinuationPullBack && + continuationalBar.GetUp() < pBar.GetDown() && + true + // isPBarHasBullishPatterns + // + ; + + // + isBearish = + // + IsXBearish(dir) && + isContinuationPullBack && + continuationalBar.GetDown() > pBar.GetUp() && + true + // isPBarHasBearishPatterns + // + ; + + // + // Validate ... + result = isBullish || + isBearish; + if (result) + { + // + dir = + isBullish + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; // - // structure.Clean(); - // poiDetector.AnalyseMarket( - // structure, - // structureConfig, - // barIndex // - // ); - // poiDrawer.drawnObjects.Clear(); - // poiDrawer.DrawMarketStructure( - // structure, - // structureDrawConfig // - // ); + result = HasDirection(dir); + } + + // + // Prepare Zone ... + if (result) + { + // + // zone.to = bar.time; + // poiDrawer.DrawZone(zone, structureDrawConfig.drawConfig); + + // + // Draw Continuational Zones ... + UpdateToTime(continuationalZones, bar.time); + poiDrawer.DrawZones(continuationalZones, structureDrawConfig.drawConfig); + + // + zone.Clean(); + + // + int idx = -1; + if (isBullish) + { + idx = GetHighestBelow(bar.GetDown(), continuationalZones); + } + else + { + idx = GetLowestAbove(bar.GetUp(), continuationalZones); + } + result = IsValidIndex(idx); + if (result) + { + zone = continuationalZones[idx]; + } + + // + if (zone.IsValid()) + { + // + XPOIDrawConfig iConfig = structureDrawConfig.drawConfig; + iConfig.bullishColor = clrYellow; + iConfig.bearishColor = clrYellow; + poiDrawer.DrawZones(continuationalZones, iConfig); + } + + // + // Manage Stops ... + if (result) + { + } + + // + result = zone.IsValid(); + } + + // + // Prepare Targets ... + if (result) + { + } + + // + // Cleanup ... + if (!result) + { + // + zone.Clean(); + XClean(targets); + dir = X_DIRECTION_NONE; + } + pBar.Clean(); + p2Bar.Clean(); + continuationalBar.Clean(); + XClean(continuationalZones); + + // + return result; +} diff --git a/Libraries/x-saherelm.x-poi.extensions.lib.mq5 b/Libraries/x-saherelm.x-poi.extensions.lib.mq5 index a8947f70..938fa5bb 100644 --- a/Libraries/x-saherelm.x-poi.extensions.lib.mq5 +++ b/Libraries/x-saherelm.x-poi.extensions.lib.mq5 @@ -5351,6 +5351,121 @@ int ExtractInsides( return result; } +/** + * Extract all Items which Specified Bar is Acted them ... + * + * @param bar: reference to Specified Bar ... + * @param dest: reference to result ... + * @param source: reference collection to provide source ... + * + * @return ( int ) + */ +int ExtractActeds( + XOHCL &bar, + XBoxZone &dest[], + XBoxZone &source[] // +) +{ + // + int result = 0; + + // + // Prepare ... + XClean(dest); + + // + // Validate ... + bool has = bar.IsValid() && + HasChild(source); + if (!result) + { + return result; + } + + // + int count = ArraySize(source); + for (int i = 0; i < count; i++) + { + // + has = IsActed( + bar, + source[i] // + ); + if (has) + { + // + AddIfNotExists( + source[i], + dest // + ); + } + } + + // + result = ArraySize(dest); + + // + return result; +} + +/** + * Extract all Items which Specified Bar is Breaked them ... + * + * @param bar: reference to Specified Bar ... + * @param dest: reference to result ... + * @param source: reference collection to provide source ... + * + * @return ( int ) + */ +int ExtractBreakeds( + XOHCL &bar, + XBoxZone &dest[], + XBoxZone &source[] // +) +{ + // + int result = 0; + + // + // Prepare ... + SpecifiedClean(dest); + + // + // Validate ... + bool has = bar.IsValid() && + HasChild(source); + if (!result) + { + return result; + } + + // + int count = ArraySize(source); + for (int i = 0; i < count; i++) + { + // + has = IsBreaked( + bar, + source[i] // + ); + if (has) + { + // + AddIfNotExists( + source[i], + dest // + ); + } + } + + // + result = ArraySize(dest); + + // + return result; +} + + /** * Collect all Bars which Breakes Specified Zone ... * diff --git a/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 b/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 index 4bf7dab9..473b0f93 100644 --- a/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 +++ b/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 @@ -349,8 +349,8 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller } // - // Strategy 1 ... - has = Strategy1HasSignal( + // Strategy X ... + has = StrategyXHasSignal( iBar, iZone, iTargets, @@ -465,18 +465,16 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller // Implementing Strategies ... /** - * Check Bar Has Signal Based on Strategy 1 ... + * Check Bar Has Signal Based on Strategy X ... * * @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 Strategy1HasSignal( + bool StrategyXHasSignal( XOHCL &bar, XBoxZone &zone, XTarget &targets[], @@ -487,214 +485,41 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller bool result = false; // - // Prepare ... - zone.Clean(); - XClean(targets); - dir = X_DIRECTION_NONE; - - // - // Validate ... - result = bar.IsValid(); - if (!result) - { - return result; - } - - // - // Define Requirements ... - - // - XOHCL pBar; - XOHCL p2Bar; - bool isBullish = false; - bool isBearish = false; - - // - // Read PBar ... - result = bar.GetPreviousBar(pBar); - result = result && - pBar.GetPreviousBar(p2Bar); - if (!result) - { - // - pBar.Clean(); - p2Bar.Clean(); - - // - return result; - } - - // - // Reading pBar Patterns ... - XPatternAnalysis pBarAnalysis; - poiDetector.AnalyseBarPatterns( - pBar, - pBarAnalysis, - structureConfig.barsAnalysisConfig // + result = Strategy2HasSignal( + bar, + zone, + targets, + dir // ); // - // Check Bar Patterns ... - bool isPBarHasBullishPatterns = - (bar.close > pBar.low || - bar.open > pBar.low) && - ( - // - pBarAnalysis.IsPinned(X_DIRECTION_BULLISH) || - pBarAnalysis.IsEngulfed(X_DIRECTION_BULLISH) || - pBarAnalysis.IsMomentum(X_DIRECTION_BULLISH) || - pBarAnalysis.IsPiercing(X_DIRECTION_BULLISH) || - pBarAnalysis.IsSignalKey(X_DIRECTION_BULLISH) - // - ); - bool isPBarHasBearishPatterns = - (bar.close < pBar.high || - bar.open < pBar.high) && - ( - // - pBarAnalysis.IsPinned(X_DIRECTION_BEARISH) || - pBarAnalysis.IsEngulfed(X_DIRECTION_BEARISH) || - pBarAnalysis.IsMomentum(X_DIRECTION_BEARISH) || - pBarAnalysis.IsPiercing(X_DIRECTION_BEARISH) || - pBarAnalysis.IsSignalKey(X_DIRECTION_BEARISH) - // - ); - - // - double pPeak = fimaHelper.GetPeak(pBar.Index()); - double pVale = fimaHelper.GetVale(pBar.Index()); - bool isPPeakOverLast = fimaHelper.IsPeakOverLast(pBar.Index()); - bool isPValeUnderLast = fimaHelper.IsValeUnderLast(pBar.Index()); - bool isP2PeakOverLast = fimaHelper.IsPeakOverLast(p2Bar.Index()); - bool isP2ValeUnderLast = fimaHelper.IsValeUnderLast(p2Bar.Index()); - bool isPeakOverLast = isPPeakOverLast || - isP2PeakOverLast; - bool isValeUnderLast = isPValeUnderLast || - isP2ValeUnderLast; - - // - // Check PBar Close Over Under Fast Ma ... - bool isPBarCloseOverFast = pBar.close > fimaHelper.GetMAFast(pBar.Index()); - bool isPBarCloseUnderFast = pBar.close < fimaHelper.GetMAFast(pBar.Index()); - bool isFastOverLast = fimaHelper.GetMAFast(pBar.Index()) > fimaHelper.GetMAFast(p2Bar.Index()); - bool isFastUnderLast = fimaHelper.GetMAFast(pBar.Index()) < fimaHelper.GetMAFast(p2Bar.Index()); - - // - // Force P2Bar is Pin Bar ... - ENUM_X_DIRECTION p2Dir; - bool isP2BarPinned = poiDetector.IsPinnedBar( - p2Bar, - p2Dir // - ); - bool isP2BarBullishPinned = - isP2BarPinned && - IsXBullish(p2Dir); - bool isP2BarBearishPinned = - isP2BarPinned && - IsXBearish(p2Dir); - - // - // Do ... - - // - isBullish = - // - isFastOverLast && - isValeUnderLast && - isPBarCloseOverFast && - isP2BarBullishPinned && - isPBarHasBullishPatterns - // - ; - - // - isBearish = - // - isPeakOverLast && - isFastUnderLast && - isPBarCloseUnderFast && - isP2BarBearishPinned && - isPBarHasBearishPatterns - // - ; - - // - // Validate ... - result = isBullish || - isBearish; - if (result) + if (!result) { - // - dir = - isBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - result = HasDirection(dir); - } - - // - // Prepare Zone ... - if (result) - { - // - zone.Clean(); - result = ToBox( - p2Bar, + result = Strategy3HasSignal( + bar, zone, - dir, - X_BAR_PATTERN_PINNED // + targets, + dir // ); - - // - if (result) - { - // - zone.to = bar.time; - - // - poiDrawer.DrawZone( - zone, - structureDrawConfig.drawConfig // - ); - } - - // - result = zone.IsValid(); } // - // Prepare Targets ... if (result) { + Print("Salam"); } - // - // Cleanup ... - if (!result) - { - // - zone.Clean(); - XClean(targets); - dir = X_DIRECTION_NONE; - } - pBar.Clean(); - p2Bar.Clean(); - // return result; } /** - * Check Bar Has Signal Based on Strategy 1 ... + * Check Bar Has Signal Based on Strategy 3 ... * * @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 ) */ @@ -980,6 +805,322 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller return result; } + /** + * Check Bar Has Signal Based on Strategy 3 ... + * + * @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 ... + * + * @return ( bool ) + */ + bool Strategy3HasSignal( + XOHCL &bar, + XBoxZone &zone, + XTarget &targets[], + ENUM_X_DIRECTION &dir // + ) + { + // + bool result = false; + + // + // Prepare ... + zone.Clean(); + XClean(targets); + dir = X_DIRECTION_NONE; + + // + // Validate ... + result = bar.IsValid(); + if (!result) + { + return result; + } + + // + // Define Requirements ... + + // + XOHCL pBar; + XOHCL p2Bar; + bool isBullish = false; + bool isBearish = false; + + // + // Read PBar ... + result = bar.GetPreviousBar(pBar); + result = result && + pBar.GetPreviousBar(p2Bar); + if (!result) + { + // + pBar.Clean(); + p2Bar.Clean(); + + // + return result; + } + + // + // Reading pBar Patterns ... + XPatternAnalysis pBarAnalysis; + poiDetector.AnalyseBarPatterns( + pBar, + pBarAnalysis, + structureConfig.barsAnalysisConfig // + ); + + // + // Check Bar Patterns ... + bool isPBarHasBullishPatterns = + (bar.close > pBar.low || + bar.open > pBar.low) && + ( + // + pBarAnalysis.IsPinned(X_DIRECTION_BULLISH) || + pBarAnalysis.IsEngulfed(X_DIRECTION_BULLISH) || + pBarAnalysis.IsMomentum(X_DIRECTION_BULLISH) || + pBarAnalysis.IsPiercing(X_DIRECTION_BULLISH) || + pBarAnalysis.IsSignalKey(X_DIRECTION_BULLISH) + // + ); + bool isPBarHasBearishPatterns = + (bar.close < pBar.high || + bar.open < pBar.high) && + ( + // + pBarAnalysis.IsPinned(X_DIRECTION_BEARISH) || + pBarAnalysis.IsEngulfed(X_DIRECTION_BEARISH) || + pBarAnalysis.IsMomentum(X_DIRECTION_BEARISH) || + pBarAnalysis.IsPiercing(X_DIRECTION_BEARISH) || + pBarAnalysis.IsSignalKey(X_DIRECTION_BEARISH) + // + ); + + // + double peak = fimaHelper.GetPeak(bar.Index()); + double vale = fimaHelper.GetVale(bar.Index()); + double pPeak = fimaHelper.GetPeak(pBar.Index()); + double pVale = fimaHelper.GetVale(pBar.Index()); + double p2Peak = fimaHelper.GetPeak(p2Bar.Index()); + double p2Vale = fimaHelper.GetVale(p2Bar.Index()); + bool isPPeakOverLast = fimaHelper.IsPeakOverLast(pBar.Index()); + bool isPValeUnderLast = fimaHelper.IsValeUnderLast(pBar.Index()); + bool isP2PeakOverLast = fimaHelper.IsPeakOverLast(p2Bar.Index()); + bool isP2ValeUnderLast = fimaHelper.IsValeUnderLast(p2Bar.Index()); + bool isPeakOverLast = isPPeakOverLast || + isP2PeakOverLast; + bool isValeUnderLast = isPValeUnderLast || + isP2ValeUnderLast; + bool isP2ValeOverLast = pVale > p2Vale; + bool isP2PeakUnderLast = pPeak < p2Peak; + + // + // Check PBar Close Over Under Fast Ma ... + bool isPBarCloseOverFast = pBar.close > fimaHelper.GetMAFast(pBar.Index()); + bool isPBarCloseUnderFast = pBar.close < fimaHelper.GetMAFast(pBar.Index()); + bool isFastOverLast = fimaHelper.GetMAFast(pBar.Index()) > fimaHelper.GetMAFast(p2Bar.Index()); + bool isFastUnderLast = fimaHelper.GetMAFast(pBar.Index()) < fimaHelper.GetMAFast(p2Bar.Index()); + + // + // Force P2Bar is Pin Bar ... + ENUM_X_DIRECTION p2Dir; + bool isP2BarPinned = poiDetector.IsPinnedBar( + p2Bar, + p2Dir // + ); + bool isP2BarBullishPinned = + isP2BarPinned && + IsXBullish(p2Dir); + bool isP2BarBearishPinned = + isP2BarPinned && + IsXBearish(p2Dir); + + // + // Do ... + + // + isBullish = + // + isFastOverLast && + isValeUnderLast && + !isP2PeakUnderLast && + isPBarCloseOverFast && + isP2BarBullishPinned && + isPBarHasBullishPatterns + // + ; + + // + isBearish = + // + isPeakOverLast && + isFastUnderLast && + !isP2ValeOverLast && + isPBarCloseUnderFast && + isP2BarBearishPinned && + isPBarHasBearishPatterns + // + ; + + // + // Validate ... + result = isBullish || + isBearish; + if (result) + { + // + dir = + isBullish + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + + // + result = HasDirection(dir); + } + + // + // Prepare Zone ... + if (result) + { + // + zone.Clean(); + result = ToBox( + p2Bar, + zone, + dir, + X_BAR_PATTERN_PINNED // + ); + + // + // Manage Stops ... + if (result) + { + // + double entry = GetEntry(zone.symbol, zone.dir); + double riskSide = zone.IsBullish() ? zone.lower : zone.upper; + double risk = MathAbs(entry - riskSide); + + // + // Collecting Affected Zones ... + XBoxZone tmps[]; + XBoxZone zones[]; + XBoxZone actedZones[]; + XBoxZone insideZones[]; + XBoxZone breakedZones[]; + XBoxZone affectedZones[]; + + // + // Support and Resistances ... + poiDetector.CollectZones(bar, tmps); + Copy(tmps, zones, false); + + // + // OBS ... + poiDetector.CollectOBs(bar, tmps); + Copy(tmps, zones, false); + + // + // FVGs ... + poiDetector.CollectFVGs(bar, tmps); + Copy(tmps, zones, false); + + // + ExtractAffectedZones(bar, zones, affectedZones); + + // + // Acteds Zones ... + ExtractActeds(bar, actedZones, affectedZones); + + // + // Inside Zones ... + ExtractInsides(bar, insideZones, affectedZones); + + // + // Breaked Zones ... + ExtractBreakeds(bar, breakedZones, affectedZones); + + // + // Draw Affected Zones ... + if (HasChild(affectedZones)) + { + // + UpdateToTime(affectedZones, bar.time); + poiDrawer.DrawZones(affectedZones, structureDrawConfig.drawConfig); + } + + // + // Draw Acted Zones ... + // if (HasChild(actedZones)) + // { + // poiDrawer.DrawZones(actedZones, structureDrawConfig.drawConfig); + // } + + // + // Draw Inside Zones ... + // if (HasChild(insideZones)) + // { + // poiDrawer.DrawZones(insideZones, structureDrawConfig.drawConfig); + // } + + // // + // // Draw Breaked Zones ... + // if (HasChild(breakedZones)) + // { + // poiDrawer.DrawZones(breakedZones, structureDrawConfig.drawConfig); + // } + + // + // Cleanup ... + XClean(tmps); + XClean(zones); + XClean(actedZones); + XClean(insideZones); + XClean(breakedZones); + XClean(affectedZones); + } + + // + if (result) + { + // + zone.to = bar.time; + + // + poiDrawer.DrawZone( + zone, + structureDrawConfig.drawConfig // + ); + } + + // + result = zone.IsValid(); + } + + // + // Prepare Targets ... + if (result) + { + } + + // + // Cleanup ... + if (!result) + { + // + zone.Clean(); + XClean(targets); + dir = X_DIRECTION_NONE; + } + pBar.Clean(); + p2Bar.Clean(); + + // + return result; + } + // }; diff --git a/XFIMAEA/Classes/x-saherelm.xfima.signaller.class_@!!@.mq5 b/XFIMAEA/Classes/x-saherelm.xfima.signaller.class_@!!@.mq5 deleted file mode 100644 index 4bf7dab9..00000000 --- a/XFIMAEA/Classes/x-saherelm.xfima.signaller.class_@!!@.mq5 +++ /dev/null @@ -1,986 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Class -// ------------------------------------------------- -// Name: XCXFIMASignaller ... -// Description: XFIMA Signaller Class ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property library -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://saherelm.ir" -#property version "1.00" -#property description "SaherElm XFIMA Signaller Class" -#property strict - -// -// Imports ... -#include "../../Classes/x-saherelm.x-signaller.class.mq5" -#include "../../Helpers/x-saherelm.xfima.helper.mq5" -#include "../Classes/x-saherelm.xfima.x-poi.detector.class.mq5" -#include "../Classes/x-saherelm.xfima.x-poi.drawer.class.mq5" - -// -// Implementation ... - -// -// Base XFIMA base Signaller ... -class XCXFIMABaseSignaller : public XCBaseSignaller -{ - // - // Public ... - public: - // - // Props ... - - // - bool ignoreTargets; // Ignore Signal Targets ... - CArrayObj drawnObjects; // Drawing Objects Holder ... - XFIMAInputs fimaInputs; // XFIMA Inputs ... - XCXFIMAHelper *fimaHelper; // XFIMA Indicator Helper ... - XCXFIMAPOIDrawer *poiDrawer; // XFIMA POI Drawer ... - XCXFIMAPOIDetector *poiDetector; // XFIMA POI Detector ... - XFIMAMarketStructureConfig structureConfig; // XFIMA Market Structure Detector Config ... - XFIMAMarketStructureDrawerConfig structureDrawConfig; // XFIMA Market Structure Draw Config ... - - // - // Constructor ... - XCXFIMABaseSignaller( - string _name, // Name ... - string _symbol, // Symbol ... - ENUM_TIMEFRAMES _period, // Period ... - XFIMAInputs &_fimaInputs, // XFIMAInputs ... - bool _processAllTicks = false, // Process All Ticks ... - double _defaultSignalR2R = 1.5, // Default Signal Risk To Reward Ratio ... - double _defaultSignalRiskInPoint = 50, // Default Signal Risk In Point ... - double _defaultSignalVolume = 0.01 // Default Signal Volume ... - ) : XCBaseSignaller(_name, - _symbol, - _period, - _processAllTicks, - _defaultSignalR2R, - _defaultSignalRiskInPoint, - _defaultSignalVolume // - ) - { - // - // Instantiating XFIMA Indicator Helper Class ... - if (_fimaInputs.IsValid()) - { - // - fimaHelper = new XCXFIMAHelper(); - bool isInited = fimaHelper.Init( - _symbol, - _period, - _fimaInputs // - ); - if (isInited) - { - fimaInputs = _fimaInputs; - } - else - { - // - delete fimaHelper; - ZeroMemory(fimaHelper); - } - } - - // - poiDrawer = new XCXFIMAPOIDrawer(); - poiDetector = new XCXFIMAPOIDetector(fimaHelper); - - // - // Configure ... - structureConfig.Default(); - structureDrawConfig.Default(); - } - - // - // Deconstructor ... - ~XCXFIMABaseSignaller() - { - Destroy(); - } - - // - // Overrides ... - - // - // Actions ... - - /** - * Destroy ... - */ - void Destroy() - { - // - BeforeDestroy(); - - // - fimaInputs.Clean(); - - // - delete fimaHelper; - ZeroMemory(fimaHelper); - - // - delete poiDrawer; - ZeroMemory(poiDrawer); - - // - delete poiDetector; - ZeroMemory(poiDetector); - - // - structureConfig.Clean(); - structureDrawConfig.Clean(); - } - - // - // Virtuals ... - - /** - * Before Destroy ... - */ - void virtual BeforeDestroy() - { - } - - /** - * Processing Tick ... - * - * @param barIndex: int, Specified Bar Index ... - */ - virtual void ProcessTick(int barIndex = 0) - { - } - - /** - * Processing New Bar ... - * - * @param barIndex: int, Specified Bar Index ... - */ - virtual void ProcessNewBar(int barIndex = 0) - { - } - - /** - * Check Guards Based on MarketConditions ... - * - * @param guards: XGuard, reference collection to holds result ... - * @param positions: XPosition, reference collection to provides positions ... - * @param barIndex: int - * - * @return ( int ) - */ - int virtual CheckForGuard( - XGuard &guards[], - XPosition &positions[], - int barIndex = 0 // - ) - { - // - int result = 0; - - // - SpecifiedClean(guards); - - // - result = ArraySize(guards); - - // - return result; - } - - /** - * Check Additional Validations on Childs Instances ... - * - * @return ( bool virtual ) - */ - bool virtual CheckAdditionslSignallerValidations() - { - // - bool result = false; - - // - // Validate Fima Helper Requirements ... - result = fimaInputs.IsValid() && - fimaHelper != NULL && - poiDetector != NULL; - - // - return result; - } - - /** - * Normalizing Signal by Signaller Custom Props ... - * - * @param signal: XSignal ... - */ - void virtual NormalizeSignal(XSignal &signal) - { - } - - // - // Protected ... - protected: - // - - // - // Protected Actions ... - - // - // Private ... - private: - // -}; - -// -// XFIMA Strategy 2 Signaller Class ... -class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller -{ - // - // Public ... - public: - // - // Props ... - XFIMAConditions conditions; // XFIMA Conditions ... - XFIMAMarketStructure structure; // XFIMA Market Structure ... - - // - // Constructor ... - XCXFIMAStrategy1Signaller( - string _symbol, // Symbol ... - ENUM_TIMEFRAMES _period, // Period ... - XFIMAInputs &_fimaInputs, // XFIMAInputs ... - bool _processAllTicks = false, // Process All Ticks ... - double _defaultSignalR2R = 1.5, // Default Signal Risk To Reward Ratio ... - double _defaultSignalRiskInPoint = 50, // Default Signal Risk In Point ... - double _defaultSignalVolume = 0.01 // Default Signal Volume ... - ) : XCXFIMABaseSignaller("XFIMA1", - _symbol, - _period, - _fimaInputs, - _processAllTicks, - _defaultSignalR2R, - _defaultSignalRiskInPoint, - _defaultSignalVolume // - ) - { - // - // Configure ... - structureConfig.Default(); - structureDrawConfig.Default(); - - // - structure.Clean(); - - // - // Ignore Signal Targets ... - ignoreTargets = false; - } - - // - // Deconstructor ... - ~XCXFIMAStrategy1Signaller() - { - // - Destroy(); - - // - structure.Clean(); - } - - // - // Overrides ... - - /** - * Processing Tick ... - * - * @param barIndex: int, Specified Bar Index ... - */ - virtual void ProcessTick(int barIndex = 0) - { - } - - /** - * Processing New Bar ... - * - * @param barIndex: int, Specified Bar Index ... - */ - virtual void ProcessNewBar(int barIndex = 0) - { - // - // Normalize ... - barIndex = NormalizeInt(barIndex, 0); - - // - XOHCL iBar; - int count = 0; - XBoxZone iZone; - XSignal iSignal; - bool has = false; - XTarget iTargets[]; - string iName = NULL; - bool isBullish = false; - bool isBearish = false; - ENUM_X_DIRECTION iDir = X_DIRECTION_NONE; - - // - // Initialize Bar as CBar ... - has = iBar.Init( - symbol, - period, - barIndex // - ); - if (!has) - { - // - iBar.Clean(); - return; - } - - // - // Strategy 1 ... - has = Strategy1HasSignal( - iBar, - iZone, - iTargets, - iDir // - ); - - // - has = HasDirection(iDir) && - iZone.IsValid(); - if (has) - { - // - // Draw Zone ... - - // - // has = false; - // iZone.Clean(); - // iDir = X_DIRECTION_NONE; - } - - // - if (has) - { - // - isBullish = IsXBullish(iDir); - isBearish = IsXBearish(iDir); - - // - // TODO: Provided SL ... - double _point = GetPoints(iBar.symbol); - double slAddition = 10 * _point; - double atrAddition = GetAverageTrueRange( - iZone.symbol, - iZone.period, - 0 // - ); - double slPrice = - isBullish - ? iZone.lower - slAddition - : iZone.upper + slAddition; - - // - // Prepare Founded Signal ... - - // - // Handle Signal Targets ... - if (ignoreTargets) - { - XClean(iTargets); - } - - // - has = PrepareSignal( - iSignal, - iDir, - iTargets, - 0, // Use Default R2R ... - slPrice, // Provided Price for SL ... - 0 // Specified Risk in Point .... - ); - if (has) - { - // - // Notify On Signal Event ... - NotifySignalEventListeners(iSignal); - } - } - - // - // Cleanup Resources ... - iBar.Clean(); - iZone.Clean(); - iSignal.Clean(); - SpecifiedClean(iTargets); - } - - /** - * Check Guards Based on MarketConditions ... - * - * @param guards: XGuard, reference collection to holds result ... - * @param positions: XPosition, reference collection to provides positions ... - * @param barIndex: int - * - * @return ( int ) - */ - int virtual CheckForGuard( - XGuard &guards[], - XPosition &positions[], - int barIndex = 0 // - ) - { - // - int result = 0; - - // - SpecifiedClean(guards); - - // - result = ArraySize(guards); - - // - return result; - } - - // - // Private ... - private: - // - // Props ... - - // - // Implementing Strategies ... - - /** - * Check Bar Has Signal Based on Strategy 1 ... - * - * @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 Strategy1HasSignal( - XOHCL &bar, - XBoxZone &zone, - XTarget &targets[], - ENUM_X_DIRECTION &dir // - ) - { - // - bool result = false; - - // - // Prepare ... - zone.Clean(); - XClean(targets); - dir = X_DIRECTION_NONE; - - // - // Validate ... - result = bar.IsValid(); - if (!result) - { - return result; - } - - // - // Define Requirements ... - - // - XOHCL pBar; - XOHCL p2Bar; - bool isBullish = false; - bool isBearish = false; - - // - // Read PBar ... - result = bar.GetPreviousBar(pBar); - result = result && - pBar.GetPreviousBar(p2Bar); - if (!result) - { - // - pBar.Clean(); - p2Bar.Clean(); - - // - return result; - } - - // - // Reading pBar Patterns ... - XPatternAnalysis pBarAnalysis; - poiDetector.AnalyseBarPatterns( - pBar, - pBarAnalysis, - structureConfig.barsAnalysisConfig // - ); - - // - // Check Bar Patterns ... - bool isPBarHasBullishPatterns = - (bar.close > pBar.low || - bar.open > pBar.low) && - ( - // - pBarAnalysis.IsPinned(X_DIRECTION_BULLISH) || - pBarAnalysis.IsEngulfed(X_DIRECTION_BULLISH) || - pBarAnalysis.IsMomentum(X_DIRECTION_BULLISH) || - pBarAnalysis.IsPiercing(X_DIRECTION_BULLISH) || - pBarAnalysis.IsSignalKey(X_DIRECTION_BULLISH) - // - ); - bool isPBarHasBearishPatterns = - (bar.close < pBar.high || - bar.open < pBar.high) && - ( - // - pBarAnalysis.IsPinned(X_DIRECTION_BEARISH) || - pBarAnalysis.IsEngulfed(X_DIRECTION_BEARISH) || - pBarAnalysis.IsMomentum(X_DIRECTION_BEARISH) || - pBarAnalysis.IsPiercing(X_DIRECTION_BEARISH) || - pBarAnalysis.IsSignalKey(X_DIRECTION_BEARISH) - // - ); - - // - double pPeak = fimaHelper.GetPeak(pBar.Index()); - double pVale = fimaHelper.GetVale(pBar.Index()); - bool isPPeakOverLast = fimaHelper.IsPeakOverLast(pBar.Index()); - bool isPValeUnderLast = fimaHelper.IsValeUnderLast(pBar.Index()); - bool isP2PeakOverLast = fimaHelper.IsPeakOverLast(p2Bar.Index()); - bool isP2ValeUnderLast = fimaHelper.IsValeUnderLast(p2Bar.Index()); - bool isPeakOverLast = isPPeakOverLast || - isP2PeakOverLast; - bool isValeUnderLast = isPValeUnderLast || - isP2ValeUnderLast; - - // - // Check PBar Close Over Under Fast Ma ... - bool isPBarCloseOverFast = pBar.close > fimaHelper.GetMAFast(pBar.Index()); - bool isPBarCloseUnderFast = pBar.close < fimaHelper.GetMAFast(pBar.Index()); - bool isFastOverLast = fimaHelper.GetMAFast(pBar.Index()) > fimaHelper.GetMAFast(p2Bar.Index()); - bool isFastUnderLast = fimaHelper.GetMAFast(pBar.Index()) < fimaHelper.GetMAFast(p2Bar.Index()); - - // - // Force P2Bar is Pin Bar ... - ENUM_X_DIRECTION p2Dir; - bool isP2BarPinned = poiDetector.IsPinnedBar( - p2Bar, - p2Dir // - ); - bool isP2BarBullishPinned = - isP2BarPinned && - IsXBullish(p2Dir); - bool isP2BarBearishPinned = - isP2BarPinned && - IsXBearish(p2Dir); - - // - // Do ... - - // - isBullish = - // - isFastOverLast && - isValeUnderLast && - isPBarCloseOverFast && - isP2BarBullishPinned && - isPBarHasBullishPatterns - // - ; - - // - isBearish = - // - isPeakOverLast && - isFastUnderLast && - isPBarCloseUnderFast && - isP2BarBearishPinned && - isPBarHasBearishPatterns - // - ; - - // - // Validate ... - result = isBullish || - isBearish; - if (result) - { - // - dir = - isBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - result = HasDirection(dir); - } - - // - // Prepare Zone ... - if (result) - { - // - zone.Clean(); - result = ToBox( - p2Bar, - zone, - dir, - X_BAR_PATTERN_PINNED // - ); - - // - if (result) - { - // - zone.to = bar.time; - - // - poiDrawer.DrawZone( - zone, - structureDrawConfig.drawConfig // - ); - } - - // - result = zone.IsValid(); - } - - // - // Prepare Targets ... - if (result) - { - } - - // - // Cleanup ... - if (!result) - { - // - zone.Clean(); - XClean(targets); - dir = X_DIRECTION_NONE; - } - pBar.Clean(); - p2Bar.Clean(); - - // - return result; - } - - /** - * Check Bar Has Signal Based on Strategy 1 ... - * - * @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 Strategy2HasSignal( - XOHCL &bar, - XBoxZone &zone, - XTarget &targets[], - ENUM_X_DIRECTION &dir // - ) - { - // - bool result = false; - - // - // Prepare ... - zone.Clean(); - XClean(targets); - dir = X_DIRECTION_NONE; - - // - // Validate ... - result = bar.IsValid(); - if (!result) - { - return result; - } - - // - // Define Requirements ... - - // - XOHCL pBar; - bool isBullish = false; - bool isBearish = false; - - // - // Read PBar ... - result = bar.GetPreviousBar(pBar); - if (!result) - { - // - pBar.Clean(); - return result; - } - - // - // Reading Conditions ... - int pullBackStartBar = -1; - bool isPullBack = result && - poiDetector.IsPullbackPattern( - pBar, - zone, - dir, - 2, - false // Force Break ... - ); - bool isPullbackBullish = isPullBack && - IsXBullish(dir); - bool isPullbackBearish = isPullBack && - IsXBearish(dir); - if (isPullBack) - { - pullBackStartBar = zone.FromIndex(); - } - - // - // Reading HK Bond ... - - // - double pHKBondUpper = fimaHelper.GetHKBondUpper(pBar.Index()); - double pHKBondLower = fimaHelper.GetHKBondLower(pBar.Index()); - int overHKBondUpperCount = fimaHelper.CountOverHKBondUpper(pullBackStartBar, X_PRICE_LOW); - int underHKBondLowerCount = fimaHelper.CountUnderHKBondLower(pullBackStartBar, X_PRICE_HIGH); - - // - // Reading PV Requirements ... - - // - int lastPeakOverLastIDX = -1; - int lastValeUnderLastIDX = -1; - double pPeak = fimaHelper.GetPeak(pBar.Index()); - double pVale = fimaHelper.GetVale(pBar.Index()); - int samePeaks = fimaHelper.CountSamePeaks(pBar.Index()); - int sameVales = fimaHelper.CountSameVales(pBar.Index()); - fimaHelper.FindLastPeakOverLast(lastPeakOverLastIDX, pBar.Index()); - fimaHelper.FindLastValeUnderLast(lastValeUnderLastIDX, pBar.Index()); - - // - // Reading pBar Patterns ... - XPatternAnalysis pBarAnalysis; - poiDetector.AnalyseBarPatterns( - pBar, - pBarAnalysis, - structureConfig.barsAnalysisConfig // - ); - - // - // Check Bar Patterns ... - bool isPBarHasBullishPatterns = - (bar.close > pBar.low || - bar.open > pBar.low) && - ( - // - pBarAnalysis.IsPinned(X_DIRECTION_BULLISH) || - pBarAnalysis.IsEngulfed(X_DIRECTION_BULLISH) || - pBarAnalysis.IsMomentum(X_DIRECTION_BULLISH) || - pBarAnalysis.IsPiercing(X_DIRECTION_BULLISH) || - pBarAnalysis.IsSignalKey(X_DIRECTION_BULLISH) - // - ); - bool isPBarHasBearishPatterns = - (bar.close < pBar.high || - bar.open < pBar.high) && - ( - // - pBarAnalysis.IsPinned(X_DIRECTION_BEARISH) || - pBarAnalysis.IsEngulfed(X_DIRECTION_BEARISH) || - pBarAnalysis.IsMomentum(X_DIRECTION_BEARISH) || - pBarAnalysis.IsPiercing(X_DIRECTION_BEARISH) || - pBarAnalysis.IsSignalKey(X_DIRECTION_BEARISH) - // - ); - - // - // Check PBar Close Over Under Fast Ma ... - bool isPBarCloseOverFast = pBar.close > fimaHelper.GetMAFast(pBar.Index()); - bool isPBarCloseUnderFast = pBar.close < fimaHelper.GetMAFast(pBar.Index()); - - // - // Try To Find Affected Zone ... - - // - // Collecting Zones ... - XBoxZone zones[]; - XBoxZone affectedZones[]; - XBoxZone affectedZonesBullish[]; - XBoxZone affectedZonesBearish[]; - int zonesCount = poiDetector.CollectZones( - pBar, - zones, // - 5, // Zones Loopback ... - 3 // Zones Validation Length ... - // Required Zones ... - // Loopback ... - ); - int affectedZonesCount = ExtractAffectedZones( - pBar, - zones, - affectedZones // - ); - int affectedZonesBullishCount = ExtractByDirection( - affectedZonesBullish, - affectedZones, - X_DIRECTION_BULLISH // - ); - int affectedZonesBearishCount = ExtractByDirection( - affectedZonesBearish, - affectedZones, - X_DIRECTION_BEARISH // - ); - - // - int insideBullishIDX = -1; - int insideBearishIDX = -1; - bool hasBullishInside = - pBar.IsBullish() && - HasInside( - insideBullishIDX, - pBar, - affectedZonesBullish // - ); - bool hasBearishInside = - pBar.IsBearish() && - HasInside( - insideBearishIDX, - pBar, - affectedZonesBearish // - ); - - // - // Do ... - - // - isBullish = - // - hasBullishInside && - isPullbackBullish && - isPBarHasBullishPatterns && - fimaHelper.IsSarBullish(pBar.Index()) && - (pVale >= affectedZonesBullish[insideBullishIDX].lower && - pVale <= affectedZonesBullish[insideBullishIDX].upper) - // - ; - - // - isBearish = - // - hasBearishInside && - isPullbackBearish && - isPBarHasBearishPatterns && - fimaHelper.IsSarBearish(pBar.Index()) && - (pPeak >= affectedZonesBearish[insideBearishIDX].lower && - pPeak <= affectedZonesBearish[insideBearishIDX].upper) - // - ; - - // - // Validate ... - result = isBullish || - isBearish; - if (result) - { - // - if (isBullish) - { - // - poiDrawer.DrawZone( - affectedZonesBullish[insideBullishIDX], - structureDrawConfig.drawConfig // - ); - } - else - { - // - poiDrawer.DrawZone( - affectedZonesBearish[insideBearishIDX], - structureDrawConfig.drawConfig // - ); - } - - // - dir = - isBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - result = HasDirection(dir); - } - - // - // Prepare Zone ... - if (result) - { - // - zone.Clean(); - if (isBullish) - { - zone = affectedZonesBullish[insideBullishIDX]; - } - else - { - zone = affectedZonesBearish[insideBearishIDX]; - } - - // - result = zone.IsValid(); - } - - // - // Prepare Targets ... - if (result) - { - } - - // - // Cleanup ... - if (!result) - { - // - zone.Clean(); - XClean(targets); - dir = X_DIRECTION_NONE; - } - pBar.Clean(); - XClean(zones); - pBarAnalysis.Clean(); - XClean(affectedZones); - XClean(affectedZonesBullish); - XClean(affectedZonesBearish); - - // - return result; - } - - // -}; - -// \ No newline at end of file