/////////////////////////////////////////////////////// // // SaherElm IT Center MQL5 Class // ------------------------------------------------- // Name: XCX121XKIPoiDetector ... // Description: X121XKI POI Detector 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 X121XKI POI Detector Class" #property strict // // Imports ... #include "../../Classes/x-saherelm.base.class.mq5" #include "../../Classes/x-saherelm.x-bar.analyser.class.mq5" #include "../../Classes/x-saherelm.x-market.pattern.class.mq5" #include "../../Helpers/x-saherelm.x121.xki.helper.mq5" #include "../Classes/x-saherelm.x121.xki.parser.class.mq5" // // Definitions ... // // Implementation ... class XCX121XKIPOIDetector : public XCMarketPatternDetector { // // Public ... public: // // Props ... // string symbol; ENUM_TIMEFRAMES period; // XCBarAnalyser *barAnalyser; // Bar Analyser ... XCX121XKIHelper *kiHelper; // X121XKI Helper ... XCX121XKIHelperParser *kiParser; // X121XKI Helper Parser ... // // Constructor ... XCX121XKIPOIDetector( XCX121XKIHelper *_kiHelper, XCX121XKIHelperParser *_kiParser // ) : XCMarketPatternDetector() { // barAnalyser = new XCBarAnalyser(); kiHelper = _kiHelper; kiParser = _kiParser; // symbol = kiHelper.GetSymbol(); period = kiHelper.GetPeriod(); } // // Deconstructor ... ~XCX121XKIPOIDetector() { Destroy(); } // // Actions and Tools ... // #region POI Detectors ... bool NearestKIFastBullish( int &index, int barIndex = 0, int loopback = 50 // ) { // bool result = false; // index = -1; // // Normalize ... barIndex = kiParser.NormalizeBarIndex(barIndex); // // Loop Back ... bool isPassed = false; for (int i = barIndex; i < barIndex + loopback; i++) { // isPassed = kiParser.IsKIFastBullish(i); if (isPassed) { // index = i; break; } } // result = IsValidIndex(index); // return result; } bool NearestKIFastBearish( int &index, int barIndex = 0, int loopback = 50 // ) { // bool result = false; // index = -1; // // Normalize ... barIndex = kiParser.NormalizeBarIndex(barIndex); // // Loop Back ... bool isPassed = false; for (int i = barIndex; i < barIndex + loopback; i++) { // isPassed = kiParser.IsKIFastBearish(i); if (isPassed) { // index = i; break; } } // result = IsValidIndex(index); // return result; } bool NearestKIFastSwitchedToBullish( int &index, int barIndex = 0, int loopback = 50 // ) { // bool result = false; // index = -1; // // Normalize ... barIndex = kiParser.NormalizeBarIndex(barIndex); // // Loop Back ... bool isPassed = false; for (int i = barIndex; i < barIndex + loopback; i++) { // isPassed = kiParser.IsKIFastSwitchedToBullish(i); if (isPassed) { // index = i; break; } } // result = IsValidIndex(index); // return result; } bool NearestKIFastSwitchedToBearish( int &index, int barIndex = 0, int loopback = 50 // ) { // bool result = false; // index = -1; // // Normalize ... barIndex = kiParser.NormalizeBarIndex(barIndex); // // Loop Back ... bool isPassed = false; for (int i = barIndex; i < barIndex + loopback; i++) { // isPassed = kiParser.IsKIFastSwitchedToBearish(i); if (isPassed) { // index = i; break; } } // result = IsValidIndex(index); // return result; } bool NearestKISlowBullish( int &index, int barIndex = 0, int loopback = 50 // ) { // bool result = false; // index = -1; // // Normalize ... barIndex = kiParser.NormalizeBarIndex(barIndex); // // Loop Back ... bool isPassed = false; for (int i = barIndex; i < barIndex + loopback; i++) { // isPassed = kiParser.IsKISlowBullish(i); if (isPassed) { // index = i; break; } } // result = IsValidIndex(index); // return result; } bool NearestKISlowBearish( int &index, int barIndex = 0, int loopback = 50 // ) { // bool result = false; // index = -1; // // Normalize ... barIndex = kiParser.NormalizeBarIndex(barIndex); // // Loop Back ... bool isPassed = false; for (int i = barIndex; i < barIndex + loopback; i++) { // isPassed = kiParser.IsKISlowBearish(i); if (isPassed) { // index = i; break; } } // result = IsValidIndex(index); // return result; } bool NearestKISlowSwitchedToBullish( int &index, int barIndex = 0, int loopback = 50 // ) { // bool result = false; // index = -1; // // Normalize ... barIndex = kiParser.NormalizeBarIndex(barIndex); // // Loop Back ... bool isPassed = false; for (int i = barIndex; i < barIndex + loopback; i++) { // isPassed = kiParser.IsKISlowSwitchedToBullish(i); if (isPassed) { // index = i; break; } } // result = IsValidIndex(index); // return result; } bool NearestKISlowSwitchedToBearish( int &index, int barIndex = 0, int loopback = 50 // ) { // bool result = false; // index = -1; // // Normalize ... barIndex = kiParser.NormalizeBarIndex(barIndex); // // Loop Back ... bool isPassed = false; for (int i = barIndex; i < barIndex + loopback; i++) { // isPassed = kiParser.IsKISlowSwitchedToBearish(i); if (isPassed) { // index = i; break; } } // result = IsValidIndex(index); // return result; } // #endregion // #region Detectors ... bool IsBullishPOI(int barIndex = 0) { // bool result = false; // barIndex = kiParser.NormalizeBarIndex(barIndex); // result = kiParser.IsTrendBullish(barIndex) && kiParser.IsRSIBullish(barIndex); if (!result) { return result; } // // Add candlestick confirmation ... XOHCL bar; ENUM_X_DIRECTION dir; result = result && bar.Init(symbol, period, barIndex); if (!result) { return result; } // result = result && IsPinnedBar(bar, dir) && IsXBullish(dir); // bar.Clean(); // return result; } bool IsBearishPOI(int barIndex = 0) { // bool result = false; // barIndex = kiParser.NormalizeBarIndex(barIndex); // result = kiParser.IsTrendBearish(barIndex) && kiParser.IsRSIBearish(barIndex); if (!result) { return result; } // // Add candlestick confirmation ... XOHCL bar; ENUM_X_DIRECTION dir; result = result && bar.Init(symbol, period, barIndex); if (!result) { return result; } // result = result && IsPinnedBar(bar, dir) && IsXBearish(dir); // bar.Clean(); // return result; } bool IsBullishBreakoutPOI(int barIndex = 0) { // bool result = false; // barIndex = kiParser.NormalizeBarIndex(barIndex); // result = kiParser.IsBullishBreakout(barIndex); if (!result) { return result; } // // Add candlestick confirmation ... XOHCL bar; ENUM_X_DIRECTION dir; result = result && bar.Init(symbol, period, barIndex); if (!result) { return result; } // result = result && IsMomentumBar(bar, dir) && IsXBullish(dir); // bar.Clean(); // return result; } bool IsBearishBreakoutPOI(int barIndex = 0) { // bool result = false; // barIndex = kiParser.NormalizeBarIndex(barIndex); // result = kiParser.IsBearishBreakout(barIndex); if (!result) { return result; } // // Add candlestick confirmation ... XOHCL bar; ENUM_X_DIRECTION dir; result = result && bar.Init(symbol, period, barIndex); if (!result) { return result; } // result = result && IsMomentumBar(bar, dir) && IsXBearish(dir); // bar.Clean(); // return result; } bool IsBullishReversalPOI(int barIndex = 0) { // bool result = false; // barIndex = kiParser.NormalizeBarIndex(barIndex); // result = kiParser.IsBullishReversal(barIndex); if (!result) { return result; } // // Add candlestick confirmation ... XOHCL bar; ENUM_X_DIRECTION dir; result = result && bar.Init(symbol, period, barIndex); if (!result) { return result; } // result = result && IsStarPattern(bar, dir) && IsXBullish(dir); // bar.Clean(); // return result; } bool IsBearishReversalPOI(int barIndex = 0) { // bool result = false; // barIndex = kiParser.NormalizeBarIndex(barIndex); // result = kiParser.IsBearishReversal(barIndex); if (!result) { return result; } // // Add candlestick confirmation ... XOHCL bar; ENUM_X_DIRECTION dir; result = result && bar.Init(symbol, period, barIndex); if (!result) { return result; } // result = result && IsStarPattern(bar, dir) && IsXBearish(dir); // bar.Clean(); // return result; } bool IsBullishContinuationPOI(int barIndex = 0) { // bool result = false; // barIndex = kiParser.NormalizeBarIndex(barIndex); // result = kiParser.IsTrendStrongBullish(barIndex); if (!result) { return result; } // // Add candlestick confirmation ... XOHCL bar; ENUM_X_DIRECTION dir; result = result && bar.Init(symbol, period, barIndex); if (!result) { return result; } // XOHCL swingBar; result = result && IsFlagPattern(bar, dir, swingBar) && IsXBullish(dir); // bar.Clean(); swingBar.Clean(); // return result; } bool IsBearishContinuationPOI(int barIndex = 0) { // bool result = false; // barIndex = kiParser.NormalizeBarIndex(barIndex); // result = kiParser.IsTrendStrongBearish(barIndex); if (!result) { return result; } // // Add candlestick confirmation ... XOHCL bar; ENUM_X_DIRECTION dir; result = result && bar.Init(symbol, period, barIndex); if (!result) { return result; } // XOHCL swingBar; result = result && IsFlagPattern(bar, dir, swingBar) && IsXBearish(dir); // bar.Clean(); swingBar.Clean(); // return result; } bool IsBullishExhaustionPOI(int barIndex = 0) { // bool result = false; // barIndex = kiParser.NormalizeBarIndex(barIndex); // result = kiParser.IsTrendStrongBullish(barIndex) && kiParser.IsRSIOverbought(barIndex); if (!result) { return result; } // // Add candlestick confirmation ... XOHCL bar; ENUM_X_DIRECTION dir; result = result && bar.Init(symbol, period, barIndex); if (!result) { return result; } // result = result && IsPiercingPattern(bar, dir) && IsXBullish(dir); // bar.Clean(); // return result; } bool IsBearishExhaustionPOI(int barIndex = 0) { // bool result = false; // barIndex = kiParser.NormalizeBarIndex(barIndex); // result = kiParser.IsTrendStrongBearish(barIndex) && kiParser.IsRSIOversold(barIndex); if (!result) { return result; } // // Add candlestick confirmation ... XOHCL bar; ENUM_X_DIRECTION dir; result = result && bar.Init(symbol, period, barIndex); if (!result) { return result; } // result = result && IsPiercingPattern(bar, dir) && IsXBearish(dir); // bar.Clean(); // return result; } bool IsBullishTrendExhaustedPOI(int barIndex = 0) { // bool result = false; // barIndex = kiParser.NormalizeBarIndex(barIndex); // result = kiParser.IsTrendStrongBullish(barIndex) && kiParser.IsVolatilityLow(barIndex, 20) && kiParser.IsRSIOverbought(barIndex); if (!result) { return result; } // // Add candlestick confirmation ... XOHCL bar; ENUM_X_DIRECTION dir; result = result && bar.Init(symbol, period, barIndex); if (!result) { return result; } // result = result && IsPiercingPattern(bar, dir) && IsXBullish(dir); // bar.Clean(); // return result; } bool IsBearishTrendExhaustedPOI(int barIndex = 0) { // bool result = false; // barIndex = kiParser.NormalizeBarIndex(barIndex); // result = kiParser.IsTrendStrongBearish(barIndex) && kiParser.IsVolatilityLow(barIndex, 20) && kiParser.IsRSIOversold(barIndex); if (!result) { return result; } // // Add candlestick confirmation ... XOHCL bar; ENUM_X_DIRECTION dir; result = result && bar.Init(symbol, period, barIndex); if (!result) { return result; } // result = result && IsPiercingPattern(bar, dir) && IsXBearish(dir); // bar.Clean(); // return result; } // #endregion // #region XDetectors ... bool IsKISignal( ENUM_X_DIRECTION &dir, // int barIndex = 0 // ) { // bool result = false; // dir = X_DIRECTION_NONE; barIndex = kiParser.NormalizeBarIndex(barIndex); // // Retrieve KI State ... bool isBullish = kiParser.IsKIFastSwitchedToBullish(barIndex + 1) && kiParser.IsKIFastBullish(barIndex) && kiParser.IsKISlowBullish(barIndex); bool isBearish = kiParser.IsKIFastSwitchedToBearish(barIndex + 1) && kiParser.IsKIFastBearish(barIndex) && kiParser.IsKISlowBearish(barIndex); result = isBullish || isBearish; if (!result) { return result; } // dir = isBullish ? X_DIRECTION_BULLISH : isBearish ? X_DIRECTION_BEARISH : X_DIRECTION_NONE; result = HasDirection(dir); if (!result) { return result; } // XOHCL bar; result = bar.Init(symbol, period, barIndex + 1); if (!result) { return result; } // // Bar Direction Same as Dir ... // // Price Place Check ... double kiFast = kiHelper.GetKIFast(barIndex + 1); double kiSlow = kiHelper.GetKISlow(barIndex + 1); isBullish = isBullish && bar.close > kiFast && kiFast > kiSlow && (kiParser.IsKIFastOverLast(barIndex + 1) || kiParser.IsKISlowOverLast(barIndex + 1)); isBearish = isBearish && bar.close < kiFast && kiFast < kiSlow && (kiParser.IsKIFastUnderLast(barIndex + 1) || kiParser.IsKISlowUnderLast(barIndex + 1)); // result = result && (isBullish || isBearish); // // Cleanup Resources ... bar.Clean(); // return result; } // #endregion // // Others ... /** * Destroy ... */ void Destroy() { // delete barAnalyser; ZeroMemory(barAnalyser); // ZeroMemory(kiHelper); ZeroMemory(kiParser); } // // Testers ... // // Protected ... protected: // // Props ... // // Private ... private: // // }; //