From 2b48fa569e3e3b2c1a55775e504d761ff8bbc992 Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Sun, 5 Oct 2025 23:39:29 +0330 Subject: [PATCH] last works ... --- Helpers/x-saherelm.xfima.helper.mq5 | 202 ++++++---------- Libraries/x-saherelm.x-poi.extensions.lib.mq5 | 1 + Libraries/x-saherelm.x-poi.lib.mq5 | 227 ++++++++++++++++++ .../x-saherelm.xfima.signaller.class.mq5 | 30 ++- 4 files changed, 320 insertions(+), 140 deletions(-) diff --git a/Helpers/x-saherelm.xfima.helper.mq5 b/Helpers/x-saherelm.xfima.helper.mq5 index bf4fb3f8..6f9bf09e 100644 --- a/Helpers/x-saherelm.xfima.helper.mq5 +++ b/Helpers/x-saherelm.xfima.helper.mq5 @@ -4073,7 +4073,8 @@ class XCXFIMAHelper : public XCBaseHelper bool isBearish = false; double iMin = EMPTY_VALUE; double iMax = EMPTY_VALUE; - ENUM_X_DIRECTION iDir = X_DIRECTION_NONE; + bool isCond1Bullish = false; + bool isCond1Bearish = false; for (int i = 0; i < decisionBarsCount; i++) { // @@ -4092,15 +4093,21 @@ class XCXFIMAHelper : public XCBaseHelper // // Validate ... + // + isCond1Bullish = decisionBars[i].IsBullish(); + + // + isCond1Bearish = decisionBars[i].IsBearish(); + // isBullish = isBullish && - decisionBars[i].IsBullish(); + (isCond1Bullish); // isBearish = isBearish && - decisionBars[i].IsBearish(); + (isCond1Bearish); // if (forceTouchBoundary) @@ -4119,24 +4126,9 @@ class XCXFIMAHelper : public XCBaseHelper } // - has = (isBullish && !isBearish) || - (isBearish && !isBullish); - if (!has) - { - continue; - } - - // - iDir = - isBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - // Validate For Dir ... - has = !HasDirection(forDir) - ? HasDirection(iDir) - : iDir == forDir; + has = + isBullish || + isBearish; if (has) { // @@ -4147,7 +4139,7 @@ class XCXFIMAHelper : public XCBaseHelper // Add( - iDir, + decisionBarDirs[i], dirs // ); } @@ -4225,56 +4217,78 @@ class XCXFIMAHelper : public XCBaseHelper bool isBearish = false; double iMin = EMPTY_VALUE; double iMax = EMPTY_VALUE; - ENUM_X_DIRECTION iDir = X_DIRECTION_NONE; + bool isCond1Bullish = false; + bool isCond1Bearish = false; for (int i = 0; i < decisionBarsCount; i++) { // - // Read Boundary Values ... - has = GetBoundaryValues(iMin, iMax, i); + // Read Indexed Bars Boundaries ... + has = GetBoundaryValues(iMin, iMax, decisionBars[i].Index()); if (!has) { continue; } // - // Validate ... + // Make Direction Opposit ... + decisionBarDirs[i] = Opposit(decisionBarDirs[i]); + + // + isBullish = IsXBullish(decisionBarDirs[i]); + isBearish = IsXBearish(decisionBarDirs[i]); + + // + // Check Bar Validations ... + + // + // Cond 1 ... + + // + isCond1Bullish = + decisionBars[i].IsBearish() && + (decisionBars[i].low >= iMax || + (decisionBars[i].low <= iMax && + decisionBars[i].GetUp() >= iMax)); + + // + isCond1Bearish = + decisionBars[i].IsBullish() && + (decisionBars[i].high <= iMin || + (decisionBars[i].high >= iMin && + decisionBars[i].GetDown() <= iMin)); // isBullish = - decisionBars[i].high > iMax && - IsXBearish(decisionBarDirs[i]); - // && - // decisionBars[i].IsBullish(); + isBullish && + (isCond1Bullish); // isBearish = - decisionBars[i].low < iMin && - IsXBullish(decisionBarDirs[i]); - // && - // decisionBars[i].IsBearish(); + isBearish && + (isCond1Bearish); // - // Check Direction ... - has = - isBullish || - !isBearish; - // has = (isBullish && !isBearish) || - // (isBearish && !isBullish); - if (!has) + if (forceTouchBoundary) { - continue; + // + isBullish = + isBullish && + (decisionBars[i].low >= iMax || + (decisionBars[i].low <= iMax && + decisionBars[i].GetUp() >= iMax)); + + // + isBearish = + isBearish && + (decisionBars[i].high <= iMin || + (decisionBars[i].high >= iMin && + decisionBars[i].GetDown() <= iMin)); } // - iDir = isBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - // Validate For Dir ... - has = !HasDirection(forDir) - ? HasDirection(iDir) - : iDir == forDir; + has = + isBullish || + isBearish; if (has) { // @@ -4285,90 +4299,14 @@ class XCXFIMAHelper : public XCBaseHelper // Add( - iDir, + decisionBarDirs[i], dirs // ); } - - // // - // isBullish = - // (decisionBars[i].low > iMax || - // decisionBars[i].GetDown() > iMax) && - // IsXBearish(decisionBarDirs[i]) && - // decisionBars[i].IsBullish(); - - // // - // isBearish = - // (decisionBars[i].high < iMin || - // decisionBars[i].GetUp() < iMin) && - // IsXBullish(decisionBarDirs[i]) && - // decisionBars[i].IsBearish(); - - // // - // if (forceTouchBoundary) - // { - // // - // isBullish = - // isBullish && - // decisionBars[i].low < iMax && - // decisionBars[i].GetUp() > iMax; - - // // - // isBearish = - // isBearish && - // decisionBars[i].high > iMin && - // decisionBars[i].GetDown() < iMin; - // } - - // // - // has = (isBullish && !isBearish) || - // (isBearish && !isBullish); - // if (!has) - // { - // continue; - // } - - // // - // iDir = - // isBullish - // ? X_DIRECTION_BULLISH - // : X_DIRECTION_BEARISH; - - // // - // // Validate For Dir ... - // has = !HasDirection(forDir) - // ? HasDirection(iDir) - // : iDir == forDir; - // if (has) - // { - // // - // AddRef( - // decisionBars[i], - // bars // - // ); - - // // - // Add( - // iDir, - // dirs // - // ); - // } - - // - AddRef( - decisionBars[i], - bars // - ); - - // - Add( - decisionBarDirs[i], - dirs // - ); } // - result = ArraySize(bars); + result = MathMin(ArraySize(bars), ArraySize(dirs)); // // Cleanup Resources ... @@ -4379,6 +4317,12 @@ class XCXFIMAHelper : public XCBaseHelper return result; } + int DetectXFIMAPOIBarPatterns( + XOHCL &bars[], + XOHCL &dirs[], + int barIndex = 0, + ) + // // Values Retrievers ... diff --git a/Libraries/x-saherelm.x-poi.extensions.lib.mq5 b/Libraries/x-saherelm.x-poi.extensions.lib.mq5 index e9b84969..7052b50b 100644 --- a/Libraries/x-saherelm.x-poi.extensions.lib.mq5 +++ b/Libraries/x-saherelm.x-poi.extensions.lib.mq5 @@ -3985,6 +3985,7 @@ bool ToBox( return result; } + // // Flags for Patterns ... diff --git a/Libraries/x-saherelm.x-poi.lib.mq5 b/Libraries/x-saherelm.x-poi.lib.mq5 index 48ab8708..30d89115 100644 --- a/Libraries/x-saherelm.x-poi.lib.mq5 +++ b/Libraries/x-saherelm.x-poi.lib.mq5 @@ -28,6 +28,233 @@ // // Definitions ... +/** + * All Available Market Patterns ... + **/ +enum ENUM_X_BAR_PATTERN +{ + X_BAR_PATTERN_NONE = 0, + X_BAR_PATTERN_HIGH = 1, + X_BAR_PATTERN_LOW = 2, + X_BAR_PATTERN_MOMENTUM = 3, + X_BAR_PATTERN_ENGULFED = 4, + X_BAR_PATTERN_TRUE_GAPPED = 5, + X_BAR_PATTERN_PINNED = 6, + X_BAR_PATTERN_STAR = 7, + X_BAR_PATTERN_PIERCING = 8, + X_BAR_PATTERN_RISING = 9, + X_BAR_PATTERN_FLAG = 10, + X_BAR_PATTERN_SIGNALKEY = 11, + X_BAR_PATTERN_OB = 12, + X_BAR_PATTERN_FVG = 13, + X_BAR_PATTERN_SUPPORT = 14, + X_BAR_PATTERN_RESISTANCE = 15, +}; + +/** + * Validate an ENUM member ... + * + * @param value: ENUM_X_BAR_PATTERN ... + * + * @return ( bool ) + */ +bool IsXValid(ENUM_X_BAR_PATTERN value) +{ + return value != X_BAR_PATTERN_NONE; +} + +/** + * Converts a Pattern ENUM to String Representation ... + * + * @param value: ENUM_X_BAR_PATTERN, member ... + * + * @return ( string ) + */ +string ToXString(ENUM_X_BAR_PATTERN value) +{ + // + string result = NULL; + + // + switch (value) + { + // + case X_BAR_PATTERN_NONE: + result = "X_NONE"; + break; + + // + case X_BAR_PATTERN_HIGH: + result = "XHIGH"; + break; + + // + case X_BAR_PATTERN_LOW: + result = "XLOW"; + break; + + // + case X_BAR_PATTERN_MOMENTUM: + result = "XMOMENTUM"; + break; + + // + case X_BAR_PATTERN_ENGULFED: + result = "XENGULFED"; + break; + + // + case X_BAR_PATTERN_TRUE_GAPPED: + result = "XGAPPED"; + break; + + // + case X_BAR_PATTERN_PINNED: + result = "XPINNED"; + break; + + // + case X_BAR_PATTERN_STAR: + result = "XSTAR"; + break; + + // + case X_BAR_PATTERN_PIERCING: + result = "XPIERCING"; + break; + + // + case X_BAR_PATTERN_RISING: + result = "XRISING"; + break; + + // + case X_BAR_PATTERN_FLAG: + result = "XFLAG"; + break; + + // + case X_BAR_PATTERN_SIGNALKEY: + result = "XSIGNALKEY"; + break; + + // + case X_BAR_PATTERN_OB: + result = "XOB"; + break; + + // + case X_BAR_PATTERN_FVG: + result = "XFVG"; + break; + + // + case X_BAR_PATTERN_SUPPORT: + result = "XSUPPORT"; + break; + + // + case X_BAR_PATTERN_RESISTANCE: + result = "XRESISTANCE"; + break; + } + + // + return result; +} + +/** + * Parse an String Representation to it's Corresponding Bar Pattern ENUM ... + * + * @param value: string, provided pattern's string ... + * + * @return ( ENUM_X_BAR_PATTERN ) + */ +ENUM_X_BAR_PATTERN ToBarPattern(string value) +{ + // + ENUM_X_BAR_PATTERN result = X_BAR_PATTERN_NONE; + + // + // Validate ... + if (!IsXValid(value)) + { + return result; + } + + // + if (value == ToXString(X_BAR_PATTERN_NONE)) + { + result = X_BAR_PATTERN_NONE; + } + else if (value == ToXString(X_BAR_PATTERN_HIGH)) + { + result = X_BAR_PATTERN_HIGH; + } + else if (value == ToXString(X_BAR_PATTERN_LOW)) + { + result = X_BAR_PATTERN_LOW; + } + else if (value == ToXString(X_BAR_PATTERN_MOMENTUM)) + { + result = X_BAR_PATTERN_MOMENTUM; + } + else if (value == ToXString(X_BAR_PATTERN_ENGULFED)) + { + result = X_BAR_PATTERN_ENGULFED; + } + else if (value == ToXString(X_BAR_PATTERN_TRUE_GAPPED)) + { + result = X_BAR_PATTERN_TRUE_GAPPED; + } + else if (value == ToXString(X_BAR_PATTERN_PINNED)) + { + result = X_BAR_PATTERN_PINNED; + } + else if (value == ToXString(X_BAR_PATTERN_STAR)) + { + result = X_BAR_PATTERN_STAR; + } + else if (value == ToXString(X_BAR_PATTERN_PIERCING)) + { + result = X_BAR_PATTERN_PIERCING; + } + else if (value == ToXString(X_BAR_PATTERN_RISING)) + { + result = X_BAR_PATTERN_RISING; + } + else if (value == ToXString(X_BAR_PATTERN_FLAG)) + { + result = X_BAR_PATTERN_FLAG; + } + else if (value == ToXString(X_BAR_PATTERN_SIGNALKEY)) + { + result = X_BAR_PATTERN_SIGNALKEY; + } + else if (value == ToXString(X_BAR_PATTERN_OB)) + { + result = X_BAR_PATTERN_OB; + } + else if (value == ToXString(X_BAR_PATTERN_FVG)) + { + result = X_BAR_PATTERN_FVG; + } + else if (value == ToXString(X_BAR_PATTERN_SUPPORT)) + { + result = X_BAR_PATTERN_SUPPORT; + } + else if (value == ToXString(X_BAR_PATTERN_RESISTANCE)) + { + result = X_BAR_PATTERN_RESISTANCE; + } + + // + return result; +} + +// +// Structures ... + /** * Represent a Pivot ... **/ diff --git a/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 b/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 index 34d94e52..bfa61f9e 100644 --- a/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 +++ b/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 @@ -726,8 +726,24 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller // // Detect DecisionBars ... XOHCL decisionBars[]; + int decisionBarsCount = 0; ENUM_X_DIRECTION decisionBarDirs[]; - int decisionBarsCount = fimaHelper.DetectXFIMAContinuationalPOIBars( + // decisionBarsCount = fimaHelper.DetectXFIMAPOIBars( + // decisionBars, + // decisionBarDirs, + // iBar.Index(), + // X_DIRECTION_ALL, // For Dir ... + // 300 // Required Number of Bars ... + // ); + // decisionBarsCount = fimaHelper.DetectXFIMAReversalPOIBars( + // decisionBars, + // decisionBarDirs, + // iBar.Index(), + // true, // Force Touch Boundary ... + // X_DIRECTION_ALL, // For Dir ... + // 300 // Required Number of Bars ... + // ); + decisionBarsCount = fimaHelper.DetectXFIMAContinuationalPOIBars( decisionBars, decisionBarDirs, iBar.Index(), @@ -735,14 +751,6 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller X_DIRECTION_ALL, // For Dir ... 300 // Required Number of Bars ... ); - // int decisionBarsCount = fimaHelper.DetectXFIMAPOIBars( - // decisionBars, - // decisionBarDirs, - // iBar.Index(), - // true, - // X_DIRECTION_ALL, // For Dir ... - // 300 // Required Number of Bars ... - // ); // has = IsValidSize(decisionBarsCount); @@ -758,9 +766,9 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller iObj, IsXBullish(decisionBarDirs[i]) ? X_PRICE_LOW : X_PRICE_HIGH, 159, - IsXBullish(decisionBarDirs[i]) ? clrYellow : clrDarkOrange, + IsXBullish(decisionBarDirs[i]) ? clrAqua : clrMagenta, 5, - IsXBullish(decisionBarDirs[i]) ? ANCHOR_BOTTOM : ANCHOR_TOP, + IsXBullish(decisionBarDirs[i]) ? ANCHOR_TOP : ANCHOR_BOTTOM, "XOHCL_" + ToXString(TimeToSeconds(decisionBars[i].time)), true, // Ignore Bar Tag ... 5 // Threshold ...