diff --git a/Classes/x-saherelm.x-market.pattern.class.mq5 b/Classes/x-saherelm.x-market.pattern.class.mq5 index 02b048e9..df4bea0d 100644 --- a/Classes/x-saherelm.x-market.pattern.class.mq5 +++ b/Classes/x-saherelm.x-market.pattern.class.mq5 @@ -4255,7 +4255,6 @@ class XCMarketPatternDetector : public XCBase XOHCL &bar, XBoxZone &zones[], bool validateZones = true, - bool removeUsedZones = true, bool containsOBs = true, bool containsFVGs = true, bool containsSupports = true, @@ -4411,15 +4410,6 @@ class XCMarketPatternDetector : public XCBase RemoveBreakedZones(zones, true); } - // - // Remove Filled Zones ... - if (removeUsedZones) - { - // - // Remove all Filled Zones ... - RemoveFilledZones(zones); - } - // // Apply Sorting ... Sort(zones, sortBy, sortDir); diff --git a/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 b/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 index 66c360f8..d054f598 100644 --- a/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 +++ b/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 @@ -1917,6 +1917,9 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller // // Validator Flags ... + bool validateByZones = true; + bool validateByPinBar = true; + bool validateByBarPatterns = true; bool validateByCyclesTrend = true; bool validateByMaFastSlowGrows = true; @@ -2083,6 +2086,150 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller result = isBullish || isBearish; } + // + // Validate Has a PinBar ... + if (result && validateByPinBar) + { + // + bool isPBarIsPinBar = poiDetector.IsPinnedBar(pBar, dir); + bool isPBarIsPinBarBullish = isPBarIsPinBar && IsXBullish(dir); + bool isPBarIsPinBarBearish = isPBarIsPinBar && IsXBearish(dir); + + // + bool isP2BarIsPinBar = poiDetector.IsPinnedBar(p2Bar, dir); + bool isP2BarIsPinBarBullish = isP2BarIsPinBar && IsXBullish(dir); + bool isP2BarIsPinBarBearish = isP2BarIsPinBar && IsXBearish(dir); + + // + bool isBullishPin = isPBarIsPinBarBullish || isP2BarIsPinBarBullish; + bool isBearishPin = isPBarIsPinBarBearish || isP2BarIsPinBarBearish; + + // + isBullish = + isBullish && + isBullishPin; + + // + isBearish = + isBearish && + isBearishPin; + + // + result = isBullish || isBearish; + } + + // + // Validate By Bar Patterns ... + if (result && validateByBarPatterns) + { + // + int count = 0; + int bullishCount = 0; + int bearishCount = 0; + + // + count = pBarPatterns.Count(X_DIRECTION_BULLISH); + bullishCount += count; + + // + count = p2BarPatterns.Count(X_DIRECTION_BULLISH); + bullishCount += count; + + // + count = pBarPatterns.Count(X_DIRECTION_BEARISH); + bearishCount += count; + + // + count = p2BarPatterns.Count(X_DIRECTION_BEARISH); + bearishCount += count; + + // + bool hasBullishScore = IsValidSize(bullishCount) && + bullishCount > bearishCount; + + // + bool hasBearishScore = IsValidSize(bearishCount) && + bearishCount > bullishCount; + + // + // Reading Bar Patterns ... + + // + // Bullish ... + bool isPBarHasBullishPatterns = + (pBarPatterns.HasPattern(X_BAR_PATTERN_FLAG, X_DIRECTION_BULLISH) || + pBarPatterns.HasPattern(X_BAR_PATTERN_STAR, X_DIRECTION_BULLISH) || + pBarPatterns.HasPattern(X_BAR_PATTERN_PINNED, X_DIRECTION_BULLISH) || + pBarPatterns.HasPattern(X_BAR_PATTERN_RISING, X_DIRECTION_BULLISH) || + pBarPatterns.HasPattern(X_BAR_PATTERN_ENGULFED, X_DIRECTION_BULLISH) || + pBarPatterns.HasPattern(X_BAR_PATTERN_MOMENTUM, X_DIRECTION_BULLISH) || + pBarPatterns.HasPattern(X_BAR_PATTERN_PIERCING, X_DIRECTION_BULLISH) || + pBarPatterns.HasPattern(X_BAR_PATTERN_SIGNALKEY, X_DIRECTION_BULLISH) || + pBarPatterns.HasPattern(X_BAR_PATTERN_TRUE_GAPED, X_DIRECTION_BULLISH)); + bool isP2BarHasBullishPatterns = + (p2BarPatterns.HasPattern(X_BAR_PATTERN_FLAG, X_DIRECTION_BULLISH) || + p2BarPatterns.HasPattern(X_BAR_PATTERN_STAR, X_DIRECTION_BULLISH) || + p2BarPatterns.HasPattern(X_BAR_PATTERN_PINNED, X_DIRECTION_BULLISH) || + p2BarPatterns.HasPattern(X_BAR_PATTERN_RISING, X_DIRECTION_BULLISH) || + p2BarPatterns.HasPattern(X_BAR_PATTERN_ENGULFED, X_DIRECTION_BULLISH) || + p2BarPatterns.HasPattern(X_BAR_PATTERN_MOMENTUM, X_DIRECTION_BULLISH) || + p2BarPatterns.HasPattern(X_BAR_PATTERN_PIERCING, X_DIRECTION_BULLISH) || + p2BarPatterns.HasPattern(X_BAR_PATTERN_SIGNALKEY, X_DIRECTION_BULLISH) || + p2BarPatterns.HasPattern(X_BAR_PATTERN_TRUE_GAPED, X_DIRECTION_BULLISH)); + bool hasBullishPatterns = isPBarHasBullishPatterns || isP2BarHasBullishPatterns; + + // + // Bearish ... + bool isPBarHasBearishPatterns = + (pBarPatterns.HasPattern(X_BAR_PATTERN_FLAG, X_DIRECTION_BEARISH) || + pBarPatterns.HasPattern(X_BAR_PATTERN_STAR, X_DIRECTION_BEARISH) || + pBarPatterns.HasPattern(X_BAR_PATTERN_PINNED, X_DIRECTION_BEARISH) || + pBarPatterns.HasPattern(X_BAR_PATTERN_RISING, X_DIRECTION_BEARISH) || + pBarPatterns.HasPattern(X_BAR_PATTERN_ENGULFED, X_DIRECTION_BEARISH) || + pBarPatterns.HasPattern(X_BAR_PATTERN_MOMENTUM, X_DIRECTION_BEARISH) || + pBarPatterns.HasPattern(X_BAR_PATTERN_PIERCING, X_DIRECTION_BEARISH) || + pBarPatterns.HasPattern(X_BAR_PATTERN_SIGNALKEY, X_DIRECTION_BEARISH) || + pBarPatterns.HasPattern(X_BAR_PATTERN_TRUE_GAPED, X_DIRECTION_BEARISH)); + bool isP2BarHasBearishPatterns = + (p2BarPatterns.HasPattern(X_BAR_PATTERN_FLAG, X_DIRECTION_BEARISH) || + p2BarPatterns.HasPattern(X_BAR_PATTERN_STAR, X_DIRECTION_BEARISH) || + p2BarPatterns.HasPattern(X_BAR_PATTERN_PINNED, X_DIRECTION_BEARISH) || + p2BarPatterns.HasPattern(X_BAR_PATTERN_RISING, X_DIRECTION_BEARISH) || + p2BarPatterns.HasPattern(X_BAR_PATTERN_ENGULFED, X_DIRECTION_BEARISH) || + p2BarPatterns.HasPattern(X_BAR_PATTERN_MOMENTUM, X_DIRECTION_BEARISH) || + p2BarPatterns.HasPattern(X_BAR_PATTERN_PIERCING, X_DIRECTION_BEARISH) || + p2BarPatterns.HasPattern(X_BAR_PATTERN_SIGNALKEY, X_DIRECTION_BEARISH) || + p2BarPatterns.HasPattern(X_BAR_PATTERN_TRUE_GAPED, X_DIRECTION_BEARISH)); + bool hasBearishPatterns = isPBarHasBearishPatterns || isP2BarHasBearishPatterns; + + // + isBullish = + isBullish && + hasBullishScore && + hasBullishPatterns; + + // + isBearish = + isBearish && + hasBearishScore && + hasBearishPatterns; + + // + result = isBullish || isBearish; + } + + // + // Validate By Zones ... + if (result && validateByZones) { + // + XBoxZone zones[]; + int count = poiDetector.DetectZones( + pBar, + zones, + true, // Validate Zones ... + ); + } + // if (result) {