From 9fc8892c5dee83e7f22773dd8d456622a0907a72 Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Sun, 4 Jan 2026 16:00:35 +0330 Subject: [PATCH] last ... --- Documents/BKP/X121XKI/tmps.bkp.mq5 | 290 +++++++++ Libraries/x-saherelm.x-pivot.analysis.lib.mq5 | 121 ++++ .../x-saherelm.x121.xki.parser.class.mq5 | 66 +- .../x-saherelm.x121.xki.signaller.class.mq5 | 567 +++++++++--------- ...saherelm.x121.xki.x-poi.detector.class.mq5 | 415 +++++++++++++ 5 files changed, 1181 insertions(+), 278 deletions(-) diff --git a/Documents/BKP/X121XKI/tmps.bkp.mq5 b/Documents/BKP/X121XKI/tmps.bkp.mq5 index 91933eff..294ac36d 100644 --- a/Documents/BKP/X121XKI/tmps.bkp.mq5 +++ b/Documents/BKP/X121XKI/tmps.bkp.mq5 @@ -1686,3 +1686,293 @@ bool Strategy1HasSignal( // return result; } + + // // + // isBullish = + // // majorSupport.IsValid() && + // minorSupport.IsValid() && + // poiDetector.IsKIBullishPOI(barIndex) && + // poiDetector.HasCandlestickDirection( + // iBar, + // X_DIRECTION_BULLISH // + // ) && + // IsTFBullishPattern(barIndex, PERIOD_M5) && + // // minorSupport.lower <= majorSupport.upper && + // poiDetector.IsNearZone(iBar.close, minorSupport, 10); + + // // + // isBearish = + // // majorResistance.IsValid() && + // minorResistance.IsValid() && + // poiDetector.IsKIBearishPOI(barIndex) && + // poiDetector.HasCandlestickDirection( + // iBar, + // X_DIRECTION_BEARISH // + // ) && + // IsTFBearishPattern(barIndex, PERIOD_M5) && + // // minorResistance.upper >= majorResistance.lower && + // poiDetector.IsNearZone(iBar.close, minorResistance, 10); + + // + // Retrieve Base Conditions ... + // isBullish = + // isBullish && + // IsBullishPOILongEntry(barIndex); + // isBearish = + // isBearish && + // IsBearishPOIShortEntry(barIndex); + + // // + // // Do Validation and Filtering Market Structure if required ... + + // // + // // Validate near Support / Resistance Zones ... + // bool validateNearSupRes = true; + // if (result && validateNearSupRes) + // { + // // + // // Configs ... + // int loopback = 100; + // int validationLength = 7; + // double nearThreshold = 5; + // int validationRetests = 0; + // int validationLoopback = 100; + // double validationThreshold = 5; + + // // + // // Filling Zones ... + // XBoxZone zones[]; + // if (isBullish) + // { + // // + // // Detect Supports ... + // poiDetector.DetectSupports( + // zones, + // barIndex, + // loopback, + // true, + // validationLength, // Validation Length ... + // validationRetests, // Min Retest ... + // validationThreshold, // Retest Threshold ... + // validationLoopback, // Retest Loopback ... + // symbol, + // period // + // ); + // } + // else if (isBearish) + // { + // // + // // Detect Resistances ... + // poiDetector.DetectResistances( + // zones, + // barIndex, + // loopback, + // true, + // validationLength, // Validation Length ... + // validationRetests, // Min Retest ... + // validationThreshold, // Retest Threshold ... + // validationLoopback, // Retest Loopback ... + // symbol, + // period // + // ); + // } + + // // + // if (HasChild(zones)) + // { + // // + // XPOIDrawConfig iConfig; + // iConfig.Default(); + + // // + // poiDrawer.DrawZones(zones, iConfig); + // iConfig.Clean(); + // // DebugBreak(); + // } + + // // + // // Check Has Nearest ... + // int nearIDX = -1; + // result = poiDetector.HasNearZone( + // nearIDX, + // bar.close, + // nearThreshold, + // zones // + // ); + + // // + // // Validate ... + // if (!result) + // { + // // + // isBullish = false; + // isBearish = false; + // } + // } + + // // + // // Validate by ATR Rising/Falling ... + // bool validateByATRRaisFalling = true; + // if (result && validateByATRRaisFalling) + // { + // // + // // Bullish: + // // - ATR Lower Rising ... + // // - ATR Over ATR Ma ... + // // Bearsih: + // // - ATR Upper Falling ... + // // - ATR Over ATR Ma ... + + // // + // isBullish = + // isBullish && + // // kiHelper.GetATR(barIndex) > kiHelper.GetATRSmoothed(barIndex) && + // kiHelper.GetKILower(barIndex) > kiHelper.GetKILower(barIndex + 1); + // isBearish = + // isBearish && + // // kiHelper.GetATR(barIndex) > kiHelper.GetATRSmoothed(barIndex) && + // kiHelper.GetKIUpper(barIndex) < kiHelper.GetKIUpper(barIndex + 1); + // result = isBullish || isBearish; + + // // + // if (!result) + // { + // // + // isBullish = false; + // isBearish = false; + // } + // } + + // // + // // Validate by RSI ... + // bool validatebyRSI = false; + // if (result && validatebyRSI) + // { + // // + // // Bullish: + // // - Not in Over Baught; + // // - Rising; + // // Bearish : + // // - Not in Over Sold; + // // - Falling; + + // // + // isBullish = + // isBullish && + // !kiParser.IsRSIOverbought(barIndex) && + // kiHelper.GetRSI(barIndex) > kiHelper.GetRSI(barIndex + 1); + // isBearish = + // isBearish && + // !kiParser.IsRSIOversold(barIndex) && + // kiHelper.GetRSI(barIndex) < kiHelper.GetRSI(barIndex + 1); + // result = isBullish || isBearish; + + // // + // if (!result) + // { + // // + // isBullish = false; + // isBearish = false; + // } + // } + + // // + // // Validate by iBar Pattern ... + // // in this Strategy we have PinBar or SignalKeyBar ... + // bool validateByBarPatterns = false; + // if (result && validateByBarPatterns) + // { + // // + // // Pin ... + // bool isPinBar = poiDetector.IsPinnedBar( + // iBar, + // dir // + // ); + // bool isPinBarBullish = + // isPinBar && + // IsXBullish(dir); + // bool isPinBarBearish = + // isPinBar && + // IsXBearish(dir); + + // // + // // Engulfe ... + // bool isEngulfed = poiDetector.IsEngulfedBar( + // iBar, + // dir // + // ); + // bool isEngulfedBullish = + // isEngulfed && + // IsXBullish(dir); + // bool isEngulfedBearish = + // isEngulfed && + // IsXBearish(dir); + + // // + // // Signal Key Bar ... + // bool isSignalKeyBar = poiDetector.IsSignalKeyBarPattern( + // iBar, + // dir // + // ); + // bool isSignalKeyBarBullish = + // isSignalKeyBar && + // IsXBullish(dir); + // bool isSignalKeyBarBearish = + // isSignalKeyBar && + // IsXBearish(dir); + + // // + // isBullish = + // isBullish && + // (isEngulfedBullish); + // isBearish = + // isBearish && + // (isEngulfedBearish); + + // // // + // // isBullish = + // // isBullish && + // // (isPinBarBullish || + // // isEngulfedBullish || + // // isSignalKeyBarBullish); + // // isBearish = + // // isBearish && + // // (isPinBarBearish || + // // isEngulfedBearish || + // // isSignalKeyBarBearish); + + // // + // result = isBullish || isBearish; + + // // + // if (!result) + // { + // // + // isBullish = false; + // isBearish = false; + // } + // } + + // + // Recent Support ... + // else if (HasChild(supports)) + // { + // // + // tmpSupportIDX = GetYoungestBelow(iBar.close, supports); + // if (IsValidIndex(tmpSupportIDX)) + // { + // zone = supports[tmpSupportIDX]; + // } + // } + + // + // Recent Resistance ... + // else if (HasChild(resistances)) + // { + // // + // tmpResistanceIDX = GetYoungestAbove(iBar.close, resistances); + // if (IsValidIndex(tmpResistanceIDX)) + // { + // zone = resistances[tmpResistanceIDX]; + // } + // } diff --git a/Libraries/x-saherelm.x-pivot.analysis.lib.mq5 b/Libraries/x-saherelm.x-pivot.analysis.lib.mq5 index f05366d2..5af5c4f2 100644 --- a/Libraries/x-saherelm.x-pivot.analysis.lib.mq5 +++ b/Libraries/x-saherelm.x-pivot.analysis.lib.mq5 @@ -2379,6 +2379,127 @@ struct XPatternAnalysis return result; } + /** + * Extract All Exists Patterns Pivots ... + * + * @param dest: XBoxZone, collection reference to holds Extracted Patterns ... + * @param forDir: ENUM_X_DIRECTION, Specified Direction of Extractions ... + * + * @return ( int ) + */ + int GetPatterns( + XBoxZone &dest[], + ENUM_X_DIRECTION forDir = X_DIRECTION_NONE // + ) + { + // + int result = 0; + + // + // Prepare ... + XClean(dest); + + // + // Validate ... + bool has = IsValid() && + HasChild(patterns); + if (!has) + { + return result; + } + + // + // Do ... + XOHCL iBar; + XPivot iPivot; + XBoxZone iZone; + int count = ArraySize(patterns); + for (int i = 0; i < count; i++) + { + // + has = GetPattern(iBar, iPivot, iZone, patterns[i], forDir); + if (has) + { + AddIfNotExists(iZone, dest); + } + } + + // + result = ArraySize(dest); + + // + // Cleanup ... + iBar.Clean(); + iZone.Clean(); + iPivot.Clean(); + + // + return result; + } + + /** + * Extract All Exists Patterns Pivots ... + * + * @param dest: XPivot, collection reference to holds Extracted Patterns ... + * @param zones: XBoxZone, collection reference to holds Extracted Patterns ... + * @param forDir: ENUM_X_DIRECTION, Specified Direction of Extractions ... + * + * @return ( int ) + */ + int GetPatterns( + XPivot &dest[], + XBoxZone &zones[], + ENUM_X_DIRECTION forDir = X_DIRECTION_NONE // + ) + { + // + int result = 0; + + // + // Prepare ... + XClean(dest); + XClean(zones); + + // + // Validate ... + bool has = IsValid() && + HasChild(patterns); + if (!has) + { + return result; + } + + // + // Do ... + XOHCL iBar; + XPivot iPivot; + XBoxZone iZone; + int count = ArraySize(patterns); + for (int i = 0; i < count; i++) + { + // + has = GetPattern(iBar, iPivot, iZone, patterns[i], forDir); + if (has) + { + // + AddIfNotExists(iPivot, dest); + AddIfNotExists(iZone, zones); + } + } + + // + result = ArraySize(dest); + + // + // Cleanup ... + iBar.Clean(); + iZone.Clean(); + iPivot.Clean(); + + // + return result; + } + // }; diff --git a/X121XKIEA/Classes/x-saherelm.x121.xki.parser.class.mq5 b/X121XKIEA/Classes/x-saherelm.x121.xki.parser.class.mq5 index d6a04265..02c7f7ab 100644 --- a/X121XKIEA/Classes/x-saherelm.x121.xki.parser.class.mq5 +++ b/X121XKIEA/Classes/x-saherelm.x121.xki.parser.class.mq5 @@ -925,6 +925,70 @@ class XCX121XKIHelperParser : XCBase // return result; } + + bool IsVolatilitySwitchdToHigh(int barIndex = 0) + { + // + bool result = false; + + // + // Normalize ... + barIndex = NormalizeBarIndex(barIndex); + + // + // Validate ... + result = IsValid(); + if (!result) + { + return result; + } + + // + double atr = helper.GetATR(barIndex); + double atrPrev = helper.GetATR(barIndex + 1); + double atrMa = helper.GetATRSmoothed(barIndex); + double atrMaPrev = helper.GetATRSmoothed(barIndex + 1); + + // + result = + atr > atrMa && + atrPrev <= atrMaPrev; + + // + return result; + } + + bool IsVolatilitySwitchdToLow(int barIndex = 0) + { + // + bool result = false; + + // + // Normalize ... + barIndex = NormalizeBarIndex(barIndex); + + // + // Validate ... + result = IsValid(); + if (!result) + { + return result; + } + + // + double atr = helper.GetATR(barIndex); + double atrPrev = helper.GetATR(barIndex + 1); + double atrMa = helper.GetATRSmoothed(barIndex); + double atrMaPrev = helper.GetATRSmoothed(barIndex + 1); + + // + result = + atr < atrMa && + atrPrev >= atrMaPrev; + + // + return result; + } // #endregion // #region RSI ... @@ -1251,7 +1315,7 @@ class XCX121XKIHelperParser : XCBase // MA crossover bullish ... double maFastNow = helper.GetMAFast(barIndex); double maSlowNow = helper.GetMASlow(barIndex); - bool maOk = maFastNow > maSlowNow; + bool maOk = maFastNow > maSlowNow; // result = rsiFlip && (atrOk || maOk); diff --git a/X121XKIEA/Classes/x-saherelm.x121.xki.signaller.class.mq5 b/X121XKIEA/Classes/x-saherelm.x121.xki.signaller.class.mq5 index 432a1c18..33621428 100644 --- a/X121XKIEA/Classes/x-saherelm.x121.xki.signaller.class.mq5 +++ b/X121XKIEA/Classes/x-saherelm.x121.xki.signaller.class.mq5 @@ -973,11 +973,15 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller } // + int score = 0; + int scoreBullish = 0; + int scoreBearish = 0; bool isBullish = false; bool isBearish = false; int barIndex = bar.Index() + 1; // + // Initialize Indexed Bar ... XOHCL iBar; result = iBar.Init(bar.symbol, bar.period, barIndex); if (!result) @@ -985,7 +989,7 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller return result; } - // + // #region Market Structure ... XBoxZone supports[]; XBoxZone resistances[]; XBoxZone minorSupport; @@ -1001,8 +1005,8 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller majorResistance, barIndex, bar.symbol, - bar.period, // Minor ... - PERIOD_H1, // Major ... + iBar.period, // Minor ... + PERIOD_H1, // Major ... 50, 14, 21, @@ -1010,35 +1014,166 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller ); // - isBullish = majorSupport.IsValid() && - minorSupport.IsValid() && - poiDetector.HasCandlestickDirection( - iBar, - X_DIRECTION_BULLISH // - ) && - IsTFBullishPattern(barIndex, PERIOD_M5) && - minorSupport.lower <= majorSupport.upper && - poiDetector.IsNearZone(iBar.close, minorSupport, 10); + // Refining Zones ... + int refineLoopback = 500; + double refineBreakThreshold = 10; + ENUM_X_PRICE refineBreakBy = X_PRICE_CLOSE; + poiDetector.RefineStructure( + supports, + resistances, + minorSupport, + majorSupport, + minorResistance, + majorResistance, + refineLoopback, + refineBreakThreshold, + refineBreakBy // + ); + // #endregion + + // #region Reading Conditions and Scoring ... + // + // ATR ... + bool isATRUp = kiParser.IsVolatilityHigh(barIndex) || + kiParser.IsVolatilitySwitchdToHigh(barIndex); + + // #region KI ... + // + bool isKIBullish = (kiParser.IsKIFastBullish(barIndex) || + kiParser.IsKIFastSwitchedToBullish(barIndex)) && + (kiParser.IsKISlowBullish(barIndex) || + kiParser.IsKISlowSwitchedToBullish(barIndex)); + if (isKIBullish) + { + scoreBullish++; + } // - isBearish = majorResistance.IsValid() && - minorResistance.IsValid() && - poiDetector.HasCandlestickDirection( - iBar, - X_DIRECTION_BEARISH // - ) && - IsTFBearishPattern(barIndex, PERIOD_M5) && - minorResistance.upper >= majorResistance.lower && - poiDetector.IsNearZone(iBar.close, minorResistance, 10); + bool isKIBearish = (kiParser.IsKIFastBearish(barIndex) || + kiParser.IsKIFastSwitchedToBearish(barIndex)) && + (kiParser.IsKISlowBearish(barIndex) || + kiParser.IsKISlowSwitchedToBearish(barIndex)); + if (isKIBearish) + { + scoreBearish++; + } + // #endregion + + // #region KI Wave ... + // + bool isKIWaveBullish = kiParser.IsKIWaveBullish(barIndex) || + kiParser.IsKIWaveSwitchedToBullish(barIndex); + if (isKIWaveBullish) + { + scoreBullish++; + } // - // Retrieve Base Conditions ... - // isBullish = - // isBullish && - // IsBullishPOILongEntry(barIndex); - // isBearish = - // isBearish && - // IsBearishPOIShortEntry(barIndex); + bool isKIWaveBearish = kiParser.IsKIWaveBearish(barIndex) || + kiParser.IsKIWaveSwitchedToBearish(barIndex); + if (isKIWaveBearish) + { + scoreBearish++; + } + // #endregion + + // #region MA ... + // + bool isMaBullish = kiParser.IsMACrossoverBullish(barIndex) || + kiParser.IsMACrossoverSwitchedToBullish(barIndex); + if (isMaBullish) + { + scoreBullish++; + } + + // + bool isMaBearish = kiParser.IsMACrossoverBearish(barIndex) || + kiParser.IsMACrossoverSwitchedToBearish(barIndex); + if (isMaBearish) + { + scoreBearish++; + } + // #endregion + + // #region LowerTF Candlstick ... + // + bool isLowerTFBullish = IsTFBullishPattern(barIndex, PERIOD_M5); + if (isLowerTFBullish) + { + scoreBullish++; + } + + // + bool isLowerTFBearish = IsTFBearishPattern(barIndex, PERIOD_M5); + if (isLowerTFBearish) + { + scoreBearish++; + } + // #endregion + + // #region Candlestick ... + // + bool isCandlestickBullish = poiDetector.HasCandlestickDirection( + iBar, + X_DIRECTION_BULLISH // + ); + if (isCandlestickBullish) + { + scoreBullish++; + } + + // + bool isCandlestickBearish = poiDetector.HasCandlestickDirection( + iBar, + X_DIRECTION_BEARISH // + ); + if (isCandlestickBearish) + { + scoreBearish++; + } + // #endregion + + // #region NearInside Support/Resistance ... + // + int tmpSupportIDX = -1; + bool isNearSupport = poiDetector.HasNearZone(tmpSupportIDX, iBar.close, 5, supports); + if (isNearSupport) + { + scoreBullish++; + } + + // + int tmpResistanceIDX = -1; + bool isNearResistance = poiDetector.HasNearZone(tmpResistanceIDX, iBar.close, 5, resistances); + if (isNearResistance) + { + scoreBearish++; + } + // #endregion + // #endregion + + // + // Summarize Directional Conditions ... + + // + isBullish = + isATRUp && + scoreBullish >= 4 && + (isMaBullish || + isNearSupport || + isKIWaveBullish || + isLowerTFBullish || + isCandlestickBullish); + + // + isBearish = + isATRUp && + scoreBearish >= 4 && + (isMaBearish || + isNearResistance || + isKIWaveBearish || + isLowerTFBearish || + isCandlestickBearish); // // Validate Conditions ... @@ -1059,8 +1194,110 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller } // + // Select Operational Zone ... + if (isBullish) + { + // + // Nearest Support ... + if (IsValidIndex(tmpSupportIDX)) + { + zone = supports[tmpSupportIDX]; + } + + // + // Make Sure Zone Exists ... + if (!zone.IsValid()) + { + // + // Looking Bar Patterns to Detect Zone ... + poiDetector.HasRecentPatternTouched(zone, iBar.close, barIndex, 5, 5, iBar.period, X_DIRECTION_BULLISH); + } + } + else if (isBearish) + { + // + // Nearest Resistance ... + if (IsValidIndex(tmpResistanceIDX)) + { + zone = resistances[tmpResistanceIDX]; + } + + // + // Make Sure Zone Exists ... + if (!zone.IsValid()) + { + // + // Looking Bar Patterns to Detect Zone ... + poiDetector.HasRecentPatternTouched(zone, iBar.close, barIndex, 5, 5, iBar.period, X_DIRECTION_BEARISH); + } + } + + // + // Refactor Result ... + result = result && + zone.IsValid(); + if (result) + { + poiDetector.RefineZone(zone); + } + + // + // Do Directional Validation ... + if (result) + { + // + // Bullish ... + if (isBullish) + { + // + isBullish = + isBullish && + isLowerTFBullish && + isCandlestickBullish; + } + + // + // Bearish ... + if (isBearish) + { + // + isBearish = + isBearish && + isLowerTFBearish && + isCandlestickBearish; + } + + // + result = isBullish || isBearish; + if (!result) + { + // + isBullish = false; + isBearish = false; + } + } + + // + // Validate Result ... + if (!result) + { + // + iBar.Clean(); + XClean(supports); + XClean(resistances); + minorSupport.Clean(); + majorSupport.Clean(); + minorResistance.Clean(); + majorResistance.Clean(); + + // + return result; + } + + // + // Draws ... bool draw = true; - if (draw) + if (draw && result) { // int drawn = 0; @@ -1069,6 +1306,24 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller XPOIDrawConfig config; config.Default(); + // + if (zone.IsValid()) + { + // + drawn++; + + // + config.zonesWidth = 3; + config.bullishColor = clrYellow; + config.bearishColor = clrOrange; + + // + poiDrawer.DrawZone(zone, config); + + // + config.Default(); + } + // // Minors ... if (minorSupport.IsValid()) @@ -1114,237 +1369,6 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller } } - // // - // // Do Validation and Filtering Market Structure if required ... - - // // - // // Validate near Support / Resistance Zones ... - // bool validateNearSupRes = true; - // if (result && validateNearSupRes) - // { - // // - // // Configs ... - // int loopback = 100; - // int validationLength = 7; - // double nearThreshold = 5; - // int validationRetests = 0; - // int validationLoopback = 100; - // double validationThreshold = 5; - - // // - // // Filling Zones ... - // XBoxZone zones[]; - // if (isBullish) - // { - // // - // // Detect Supports ... - // poiDetector.DetectSupports( - // zones, - // barIndex, - // loopback, - // true, - // validationLength, // Validation Length ... - // validationRetests, // Min Retest ... - // validationThreshold, // Retest Threshold ... - // validationLoopback, // Retest Loopback ... - // symbol, - // period // - // ); - // } - // else if (isBearish) - // { - // // - // // Detect Resistances ... - // poiDetector.DetectResistances( - // zones, - // barIndex, - // loopback, - // true, - // validationLength, // Validation Length ... - // validationRetests, // Min Retest ... - // validationThreshold, // Retest Threshold ... - // validationLoopback, // Retest Loopback ... - // symbol, - // period // - // ); - // } - - // // - // if (HasChild(zones)) - // { - // // - // XPOIDrawConfig iConfig; - // iConfig.Default(); - - // // - // poiDrawer.DrawZones(zones, iConfig); - // iConfig.Clean(); - // // DebugBreak(); - // } - - // // - // // Check Has Nearest ... - // int nearIDX = -1; - // result = poiDetector.HasNearZone( - // nearIDX, - // bar.close, - // nearThreshold, - // zones // - // ); - - // // - // // Validate ... - // if (!result) - // { - // // - // isBullish = false; - // isBearish = false; - // } - // } - - // // - // // Validate by ATR Rising/Falling ... - // bool validateByATRRaisFalling = true; - // if (result && validateByATRRaisFalling) - // { - // // - // // Bullish: - // // - ATR Lower Rising ... - // // - ATR Over ATR Ma ... - // // Bearsih: - // // - ATR Upper Falling ... - // // - ATR Over ATR Ma ... - - // // - // isBullish = - // isBullish && - // // kiHelper.GetATR(barIndex) > kiHelper.GetATRSmoothed(barIndex) && - // kiHelper.GetKILower(barIndex) > kiHelper.GetKILower(barIndex + 1); - // isBearish = - // isBearish && - // // kiHelper.GetATR(barIndex) > kiHelper.GetATRSmoothed(barIndex) && - // kiHelper.GetKIUpper(barIndex) < kiHelper.GetKIUpper(barIndex + 1); - // result = isBullish || isBearish; - - // // - // if (!result) - // { - // // - // isBullish = false; - // isBearish = false; - // } - // } - - // // - // // Validate by RSI ... - // bool validatebyRSI = false; - // if (result && validatebyRSI) - // { - // // - // // Bullish: - // // - Not in Over Baught; - // // - Rising; - // // Bearish : - // // - Not in Over Sold; - // // - Falling; - - // // - // isBullish = - // isBullish && - // !kiParser.IsRSIOverbought(barIndex) && - // kiHelper.GetRSI(barIndex) > kiHelper.GetRSI(barIndex + 1); - // isBearish = - // isBearish && - // !kiParser.IsRSIOversold(barIndex) && - // kiHelper.GetRSI(barIndex) < kiHelper.GetRSI(barIndex + 1); - // result = isBullish || isBearish; - - // // - // if (!result) - // { - // // - // isBullish = false; - // isBearish = false; - // } - // } - - // // - // // Validate by iBar Pattern ... - // // in this Strategy we have PinBar or SignalKeyBar ... - // bool validateByBarPatterns = false; - // if (result && validateByBarPatterns) - // { - // // - // // Pin ... - // bool isPinBar = poiDetector.IsPinnedBar( - // iBar, - // dir // - // ); - // bool isPinBarBullish = - // isPinBar && - // IsXBullish(dir); - // bool isPinBarBearish = - // isPinBar && - // IsXBearish(dir); - - // // - // // Engulfe ... - // bool isEngulfed = poiDetector.IsEngulfedBar( - // iBar, - // dir // - // ); - // bool isEngulfedBullish = - // isEngulfed && - // IsXBullish(dir); - // bool isEngulfedBearish = - // isEngulfed && - // IsXBearish(dir); - - // // - // // Signal Key Bar ... - // bool isSignalKeyBar = poiDetector.IsSignalKeyBarPattern( - // iBar, - // dir // - // ); - // bool isSignalKeyBarBullish = - // isSignalKeyBar && - // IsXBullish(dir); - // bool isSignalKeyBarBearish = - // isSignalKeyBar && - // IsXBearish(dir); - - // // - // isBullish = - // isBullish && - // (isEngulfedBullish); - // isBearish = - // isBearish && - // (isEngulfedBearish); - - // // // - // // isBullish = - // // isBullish && - // // (isPinBarBullish || - // // isEngulfedBullish || - // // isSignalKeyBarBullish); - // // isBearish = - // // isBearish && - // // (isPinBarBearish || - // // isEngulfedBearish || - // // isSignalKeyBarBearish); - - // // - // result = isBullish || isBearish; - - // // - // if (!result) - // { - // // - // isBullish = false; - // isBearish = false; - // } - // } - // // Check and Prepare Direction ... dir = @@ -1352,7 +1376,8 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller ? X_DIRECTION_BULLISH : isBearish ? X_DIRECTION_BEARISH : X_DIRECTION_NONE; - result = HasDirection(dir); + result = result && + HasDirection(dir); if (!result) { // @@ -1376,14 +1401,14 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller // double upper = isBullish ? entry - : minorSupport.upper; + : zone.upper; double lower = isBullish - ? minorResistance.lower + ? zone.lower : entry; datetime to = bar.time; datetime from = isBullish - ? minorSupport.from - : minorResistance.from; + ? zone.from + : zone.from; result = zone.Init( iBar.symbol, iBar.period, @@ -1394,18 +1419,6 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller dir, "XS1" // ); - if (result) - { - // - XPOIDrawConfig iConfig; - iConfig.Default(); - - // - poiDrawer.DrawZone(zone, iConfig); - - // - // DebugBreak(); - } } // diff --git a/X121XKIEA/Classes/x-saherelm.x121.xki.x-poi.detector.class.mq5 b/X121XKIEA/Classes/x-saherelm.x121.xki.x-poi.detector.class.mq5 index cfbbfa86..b22e236c 100644 --- a/X121XKIEA/Classes/x-saherelm.x121.xki.x-poi.detector.class.mq5 +++ b/X121XKIEA/Classes/x-saherelm.x121.xki.x-poi.detector.class.mq5 @@ -1123,6 +1123,71 @@ class XCX121XKIPOIDetector : public XCMarketPatternDetector // #endregion // #region XDetectors ... + bool IsKIPOI( + ENUM_X_DIRECTION &dir, + int barIndex = 0 // + ) + { + // + bool result = false; + + // + dir = X_DIRECTION_NONE; + + // + bool isBullish = IsKIBullishPOI(barIndex); + bool isBearish = IsKIBearishPOI(barIndex); + + // + dir = isBullish + ? X_DIRECTION_BULLISH + : isBearish + ? X_DIRECTION_BEARISH + : X_DIRECTION_NONE; + + // + result = HasDirection(dir); + + // + return result; + } + + bool IsKIBullishPOI(int barIndex = 0) + { + // + bool result = false; + + // + barIndex = kiParser.NormalizeBarIndex(barIndex); + + // + result = + kiParser.IsValid() && + kiParser.IsKISlowBullish(barIndex) && + kiParser.IsKIFastBearish(barIndex); + + // + return result; + } + + bool IsKIBearishPOI(int barIndex = 0) + { + // + bool result = false; + + // + barIndex = kiParser.NormalizeBarIndex(barIndex); + + // + result = + kiParser.IsValid() && + kiParser.IsKISlowBearish(barIndex) && + kiParser.IsKIFastBullish(barIndex); + + // + return result; + } + bool IsKISignal( ENUM_X_DIRECTION &dir, // int barIndex = 0 // @@ -1798,6 +1863,85 @@ class XCX121XKIPOIDetector : public XCMarketPatternDetector XClean(tmpResistances); } + void RefineStructure( + XBoxZone &supports[], + XBoxZone &resistances[], + XBoxZone &minorSupport, + XBoxZone &majorSupport, + XBoxZone &minorResistance, + XBoxZone &majorResistance, + int loopback = 500, + double breakThreshold = 5, + ENUM_X_PRICE breakBy = X_PRICE_CLOSE // + ) + { + // + // Support ... + if (HasChild(supports)) + { + // + for (int i = 0; i < ArraySize(supports); i++) + { + // + RefineZone( + supports[i], + loopback, + breakThreshold, + breakBy // + ); + } + } + + // + // Resistance ... + if (HasChild(resistances)) + { + // + for (int i = 0; i < ArraySize(resistances); i++) + { + // + RefineZone( + resistances[i], + loopback, + breakThreshold, + breakBy // + ); + } + } + + // + RefineZone( + minorSupport, + loopback, + breakThreshold, + breakBy // + ); + + // + RefineZone( + majorSupport, + loopback, + breakThreshold, + breakBy // + ); + + // + RefineZone( + minorResistance, + loopback, + breakThreshold, + breakBy // + ); + + // + RefineZone( + majorResistance, + loopback, + breakThreshold, + breakBy // + ); + } + int CounteZoneTouches( XBoxZone &zone, double threshold = 10, @@ -1942,6 +2086,277 @@ class XCX121XKIPOIDetector : public XCMarketPatternDetector // return result; } + + void RefineZone( + XBoxZone &zone, + int loopback = 500, + double breakThreshold = 5, + ENUM_X_PRICE breakBy = X_PRICE_CLOSE // + ) + { + // + bool has = + zone.IsValid() && + IsXValid(breakBy); + if (!has) + { + return; + } + + // + // Normalize ... + loopback = NormalizeInt(loopback, 1); + breakThreshold = NormalizeDouble(breakThreshold, 0, 50); + + // + XOHCL iBar; + int start = zone.FromIndex(); + int end = start + loopback; + double point = GetPoints(zone.symbol); + double breakDistance = point * breakThreshold; + for (int i = start; i < end; i++) + { + // + has = iBar.Init(zone.symbol, zone.period, i); + if (has) + { + // + // Check Rejections ... + has = zone.IsBullish() + ? iBar.low < zone.upper && + iBar.GetDown() > zone.upper + : iBar.high > zone.upper && + iBar.GetUp() < zone.upper; + if (has) + { + // + Add( + iBar.time, + zone.tests // + ); + } + + // + // Check Break ... + double bPrice = iBar.GetPrice(breakBy); + has = + zone.IsBullish() + ? bPrice < zone.lower - breakDistance + : bPrice > zone.upper + breakDistance; + if (has) + { + // + zone.breakAt = iBar.time; + break; + } + } + + // + iBar.Clean(); + } + + // + has = IsXValid(zone.breakAt); + if (has) + { + // + zone.at = zone.from; + zone.from = zone.breakAt; + } + } + // #endregion + + // #region VolatilitySwitchedHigh ... + bool IsVolatilitySwitchedHigh( + int barIndex = 0, + int loopback = 3 // + ) + { + // + bool result = false; + + // + barIndex = kiParser.NormalizeBarIndex(barIndex); + loopback = NormalizeInt(loopback, 1); + + // + for (int i = barIndex; i < barIndex + loopback; i++) + { + // + result = kiParser.IsVolatilitySwitchdToHigh(i); + if (result) + { + break; + } + } + + // + return result; + } + // #endregion + + // #region Bar Patterns ... + bool HasRecentPatternTouched( + XBoxZone &zone, + double price, + int barIndex = 0, + int loopback = 5, + int threshold = 5, + ENUM_TIMEFRAMES forPeriod = NULL, + ENUM_X_DIRECTION forDir = X_DIRECTION_NONE // + ) + { + // + bool result = false; + + // + zone.Clean(); + + // + // Validate ... + result = NotEmptyZero(price); + if (!result) + { + return result; + } + + // + // Normalize ... + loopback = NormalizeInt(loopback, 2); + barIndex = kiParser.NormalizeBarIndex(barIndex); + if (IsXValid(forPeriod)) + { + forPeriod = period; + } + + // + XOHCL iBar; + bool has = false; + int iBullishIDX = -1; + int iBearishIDX = -1; + bool isBullish = false; + bool isBearish = false; + XBoxZone iBullishZones[]; + XBoxZone iBearishZones[]; + XPatternAnalysis iAnalysis; + XPatternAnalysisConfig iConfig; + + // + // Preparing Pattern Analysis Config ... + iConfig.Default(); + iConfig.FullPattern(); + + // + for (int i = barIndex; i < barIndex + loopback; i++) + { + // + // Initialize Bar ... + has = iBar.Init(symbol, forPeriod, i); + if (!has) + { + continue; + } + + // + // Analyse Patterns ... + has = AnalyseBarPatterns(iBar, iAnalysis, iConfig); + if (!has) + { + // + iBar.Clean(); + continue; + } + + // + // Bullish ... + has = iAnalysis.Count(X_DIRECTION_BULLISH) > 0; + if (has) + { + // + iAnalysis.GetPatterns(iBullishZones, X_DIRECTION_BULLISH); + has = HasChild(iBullishZones); + if (has) + { + // + has = HasNearZone( + iBullishIDX, + price, + threshold, + iBullishZones // + ); + if (has) + { + isBullish = true; + } + } + } + + // + // Bearish ... + has = iAnalysis.Count(X_DIRECTION_BEARISH) > 0; + if (has) + { + // + iAnalysis.GetPatterns(iBearishZones, X_DIRECTION_BEARISH); + has = HasChild(iBearishZones); + if (has) + { + // + has = HasNearZone( + iBearishIDX, + price, + threshold, + iBearishZones // + ); + if (has) + { + isBearish = true; + } + } + } + + // + // Summarizing Result ... + has = + HasDirection(forDir) + ? (isBullish && !isBearish && IsXBullish(forDir)) || + (isBearish && !isBullish && IsXBearish(forDir)) + : (isBullish && !isBearish) || (isBearish && !isBullish); + if (has) + { + // + // Fill Zones ... + if (isBullish) + { + zone = iBullishZones[iBullishIDX]; + } + else + { + zone = iBearishZones[iBearishIDX]; + } + break; + } + + // + iBar.Clean(); + iAnalysis.Clean(); + XClean(iBullishZones); + XClean(iBearishZones); + } + + // + // Next + + // + iBar.Clean(); + iConfig.Clean(); + iAnalysis.Clean(); + XClean(iBullishZones); + XClean(iBearishZones); + + // + return result; + } // #endregion //