/** * Check Bar Has Signal Based on Strategy 1 ... * * Pattern‑based reversal: * - Detects Pin Bar or Signal Key Bar. * - Confirms with POI detector. * - Good for reversals at support/resistance. * * @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; // zone.Clean(); XClean(targets); dir = X_DIRECTION_NONE; // result = bar.IsValid(); if (!result) { return result; } // result = poiDetector.IsKISignal( dir, bar.Index() // ); bool isBullish = result && IsXBullish(dir); bool isBearish = result && IsXBearish(dir); result = isBullish || isBearish; if (!result) { return result; } // // Detect Nearest Directional ... int nearestDirectionalSwitchIndex = -1; if (isBullish) { // isBullish = poiDetector.NearestKIFastSwitchedToBullish( nearestDirectionalSwitchIndex, bar.Index() + 2 // ); } else { // isBearish = poiDetector.NearestKIFastSwitchedToBearish( nearestDirectionalSwitchIndex, bar.Index() + 2 // ); } result = IsValidIndex(nearestDirectionalSwitchIndex) && (isBullish || isBearish); if (!result) { // bar.Clean(); return result; } // // Preparing Zone ... double upper = bar.FindHighest(nearestDirectionalSwitchIndex - bar.Index(), MODE_HIGH); double lower = bar.FindLowest(nearestDirectionalSwitchIndex - bar.Index(), MODE_LOW); // result = zone.Init( symbol, period, upper, lower, GetBarTime(symbol, period, nearestDirectionalSwitchIndex), bar.time, dir, "XKI1" // ); // // Support and Resistance ... XBoxZone supports[]; XBoxZone resistances[]; if (result) { // // Supports ... poiDetector.DetectSupports( supports, bar.Index(), 50, // Loopback ... true, // Force Validation ... 7, // Validation Length ... symbol, // For Symbol ... period // For Period ... ); // // Resistances ... poiDetector.DetectResistances( resistances, bar.Index(), 50, // Loopback ... true, // Force Validation ... 7, // Validation Length ... symbol, // For Symbol ... period // For Period ... ); } // // TODO: Rempve ... if (result) { // // Other Drawing Materials ... XPOIDrawConfig drawConfig; drawConfig.Default(); // // this for Selected Zone ... poiDrawer.DrawZone(zone, drawConfig); // // Drawing Supports and Resistances ... drawConfig.bearishColor = clrRed; drawConfig.bullishColor = clrLime; // if (HasChild(supports)) { poiDrawer.DrawZones(supports, drawConfig); } // if (HasChild(resistances)) { poiDrawer.DrawZones(resistances, drawConfig); } // drawConfig.Clean(); // DebugBreak(); } // result = result && zone.IsValid() && HasDirection(dir); // return result; } /** * Check Bar Has Signal Based on Strategy 1 ... * * Pattern‑based reversal: * - Detects Pin Bar or Signal Key Bar. * - Confirms with POI detector. * - Good for reversals at support/resistance. * * @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; // zone.Clean(); XClean(targets); dir = X_DIRECTION_NONE; // result = bar.IsValid(); if (!result) { return result; } // result = poiDetector.IsKISignal( dir, bar.Index() // ); bool isBullish = result && IsXBullish(dir); bool isBearish = result && IsXBearish(dir); result = isBullish || isBearish; if (!result) { return result; } // // Detect Nearest Directional ... int nearestDirectionalSwitchIndex = -1; if (isBullish) { // isBullish = poiDetector.NearestKIFastSwitchedToBullish( nearestDirectionalSwitchIndex, bar.Index() + 2 // ); } else { // isBearish = poiDetector.NearestKIFastSwitchedToBearish( nearestDirectionalSwitchIndex, bar.Index() + 2 // ); } result = IsValidIndex(nearestDirectionalSwitchIndex) && (isBullish || isBearish); if (!result) { // bar.Clean(); return result; } // // Preparing Zone ... double upper = bar.FindHighest(nearestDirectionalSwitchIndex - bar.Index(), MODE_HIGH); double lower = bar.FindLowest(nearestDirectionalSwitchIndex - bar.Index(), MODE_LOW); // result = zone.Init( symbol, period, upper, lower, GetBarTime(symbol, period, nearestDirectionalSwitchIndex), bar.time, dir, "XKI1" // ); // // Support and Resistance ... XBoxZone supports[]; XBoxZone resistances[]; XBoxZone minorSupport; XBoxZone majorSupport; XBoxZone minorResistance; XBoxZone majorResistance; if (result) { // // Supports ... poiDetector.GetCurrentStructure( supports, resistances, minorSupport, majorSupport, minorResistance, majorResistance, bar.Index(), symbol, // For Symbol ... period, // For Period ... 50, // Loopback ... 7, // Minor Validation Length ... 14 // Major Validation Length ... ); } // // TODO: Rempve ... if (result) { // // Other Drawing Materials ... XPOIDrawConfig drawConfig; drawConfig.Default(); // // this for Selected Zone ... poiDrawer.DrawZone(zone, drawConfig); // // Drawing Supports and Resistances ... drawConfig.bearishColor = clrRed; drawConfig.bullishColor = clrLime; // // Minors ... // drawConfig.zonesStyle = STYLE_DOT; if (minorSupport.IsValid()) { poiDrawer.DrawZone(minorSupport, drawConfig); } if (minorResistance.IsValid()) { poiDrawer.DrawZone(minorResistance, drawConfig); } // // Majors ... // drawConfig.zonesStyle = STYLE_DASH; if (majorSupport.IsValid()) { poiDrawer.DrawZone(majorSupport, drawConfig); } if (majorResistance.IsValid()) { poiDrawer.DrawZone(majorResistance, drawConfig); } // // // if (HasChild(supports)) // { // poiDrawer.DrawZones(supports, drawConfig); // } // // // if (HasChild(resistances)) // { // poiDrawer.DrawZones(resistances, drawConfig); // } // drawConfig.Clean(); // DebugBreak(); } // result = result && zone.IsValid() && HasDirection(dir); // return result; } /** * Check Bar Has Signal Based on Strategy 1 ... * * Pattern‑based reversal: * - Detects Pin Bar or Signal Key Bar. * - Confirms with POI detector. * - Good for reversals at support/resistance. * * @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; // zone.Clean(); XClean(targets); dir = X_DIRECTION_NONE; // result = bar.IsValid(); if (!result) { return result; } // result = poiDetector.IsKISignal( dir, bar.Index() // ); bool isBullish = result && IsXBullish(dir); bool isBearish = result && IsXBearish(dir); result = isBullish || isBearish; if (!result) { return result; } // // Detect Nearest Directional ... int nearestDirectionalSwitchIndex = -1; if (isBullish) { // isBullish = poiDetector.NearestKIFastSwitchedToBullish( nearestDirectionalSwitchIndex, bar.Index() + 2 // ); } else { // isBearish = poiDetector.NearestKIFastSwitchedToBearish( nearestDirectionalSwitchIndex, bar.Index() + 2 // ); } result = IsValidIndex(nearestDirectionalSwitchIndex) && (isBullish || isBearish); if (!result) { // bar.Clean(); return result; } // // Preparing Zone ... double upper = bar.FindHighest(nearestDirectionalSwitchIndex - bar.Index(), MODE_HIGH); double lower = bar.FindLowest(nearestDirectionalSwitchIndex - bar.Index(), MODE_LOW); // result = zone.Init( symbol, period, upper, lower, GetBarTime(symbol, period, nearestDirectionalSwitchIndex), bar.time, dir, "XKI1" // ); // // Support and Resistance ... XBoxZone supports[]; XBoxZone resistances[]; XBoxZone minorSupport; XBoxZone majorSupport; XBoxZone minorResistance; XBoxZone majorResistance; if (result) { // // Supports ... poiDetector.GetCurrentStructure( supports, resistances, minorSupport, majorSupport, minorResistance, majorResistance, bar.Index(), symbol, // For Symbol ... period, // For Period ... 50, // Loopback ... 7, // Minor Validation Length ... 14 // Major Validation Length ... ); } // // TODO: Rempve ... if (result) { // // Other Drawing Materials ... XPOIDrawConfig drawConfig; drawConfig.Default(); // // this for Selected Zone ... poiDrawer.DrawZone(zone, drawConfig); // // Drawing Supports and Resistances ... drawConfig.bearishColor = clrRed; drawConfig.bullishColor = clrLime; // // Minors ... // drawConfig.zonesStyle = STYLE_DOT; if (minorSupport.IsValid()) { poiDrawer.DrawZone(minorSupport, drawConfig); } if (minorResistance.IsValid()) { poiDrawer.DrawZone(minorResistance, drawConfig); } // // Majors ... // drawConfig.zonesStyle = STYLE_DASH; if (majorSupport.IsValid()) { poiDrawer.DrawZone(majorSupport, drawConfig); } if (majorResistance.IsValid()) { poiDrawer.DrawZone(majorResistance, drawConfig); } // // // if (HasChild(supports)) // { // poiDrawer.DrawZones(supports, drawConfig); // } // // // if (HasChild(resistances)) // { // poiDrawer.DrawZones(resistances, drawConfig); // } // drawConfig.Clean(); // DebugBreak(); } // result = result && zone.IsValid() && HasDirection(dir); // return result; } /** * Check Bar Has Signal Based on Strategy 1 ... * * Pattern‑based reversal: * - Detects Pin Bar or Signal Key Bar. * - Confirms with POI detector. * - Good for reversals at support/resistance. * * @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; // zone.Clean(); XClean(targets); dir = X_DIRECTION_NONE; // result = bar.IsValid(); if (!result) { return result; } // int barIndex = bar.Index() + 1; // // Safe for Entry ... bool isSafeForBullishEntry = kiParser.IsSafeBullishEntry(barIndex); bool isSafeForBearishEntry = kiParser.IsSafeBearishEntry(barIndex); // // POI ... bool isPOI = poiDetector.IsPOI(dir, barIndex); bool isBullishPOI = isPOI && IsXBullish(dir); bool isBearishPOI = isPOI && IsXBearish(dir); if (isPOI) { // // Print("isPOI: ", ToXString(dir)); // DebugBreak(); } // // Breakout POI ... bool isBreakoutPOI = poiDetector.IsBreakoutPOI(dir, barIndex); bool isBullishBreakoutPOI = isBreakoutPOI && IsXBullish(dir); bool isBearishBreakoutPOI = isBreakoutPOI && IsXBearish(dir); if (isBreakoutPOI) { // // Print("isBreakoutPOI: ", ToXString(dir)); // DebugBreak(); } // // Reversal POI ... bool isReversalPOI = poiDetector.IsReversalPOI(dir, barIndex); bool isBullishReversalPOI = isReversalPOI && IsXBullish(dir); bool isBearishReversalPOI = isReversalPOI && IsXBearish(dir); if (isReversalPOI) { // // // Print("isReversalPOI: ", ToXString(dir)); // DebugBreak(); } // // Continuation POI ... bool isContinuationPOI = poiDetector.IsContinuationPOI(dir, barIndex); bool isBullishContinuationPOI = isContinuationPOI && IsXBullish(dir); bool isBearishContinuationPOI = isContinuationPOI && IsXBearish(dir); if (isContinuationPOI) { // // Print("isContinuationPOI: ", ToXString(dir)); // DebugBreak(); } // // Exhaustion POI ... bool isExhaustionPOI = poiDetector.IsExhaustionPOI(dir, barIndex); bool isBullishExhaustionPOI = isExhaustionPOI && IsXBullish(dir); bool isBearishExhaustionPOI = isExhaustionPOI && IsXBearish(dir); if (isExhaustionPOI) { // // Print("isExhaustionPOI: ", ToXString(dir)); // DebugBreak(); } // // TrendExhausted POI ... bool isTrendExhaustedPOI = poiDetector.IsTrendExhaustedPOI(dir, barIndex); bool isBullishTrendExhaustedPOI = isTrendExhaustedPOI && IsXBullish(dir); bool isBearishTrendExhaustedPOI = isTrendExhaustedPOI && IsXBearish(dir); if (isTrendExhaustedPOI) { // Print("isTrendExhaustedPOI: ", ToXString(dir)); DebugBreak(); } /** * Check Bar Has Signal Based on Strategy 2 ... * * Trend‑following: * - Requires KI Fast + KI Slow alignment. * - Confirms with MA crossover. * - RSI filter to avoid false signals. * * @return ( bool ) */ bool Strategy2HasSignal( XOHCL & bar, XBoxZone & zone, XTarget & targets[], ENUM_X_DIRECTION & dir // ) { // bool result = false; // zone.Clean(); XClean(targets); dir = X_DIRECTION_NONE; // result = bar.IsValid(); if (!result) { return result; } // int barIndex = bar.Index() + 1; // bool isBullish = kiParser.IsBullishMomentumTrend(bar.Index()); bool isBearish = kiParser.IsBearishMomentumTrend(bar.Index()); result = isBullish || isBearish; if (!result) { return result; } // dir = isBullish ? X_DIRECTION_BULLISH : isBearish ? X_DIRECTION_BEARISH : X_DIRECTION_NONE; result = ToBox(bar, zone, dir, X_BAR_PATTERN_MOMENTUM); result = result && zone.IsValid() && HasDirection(dir); // return result; } /** * Check Bar Has Signal Based on Strategy 3 ... * * Breakout: * - Detects price breaking KI bands with ATR confirmation. * - Confirms with Momentum Bar pattern. * * @return ( bool ) */ bool Strategy3HasSignal( XOHCL & bar, XBoxZone & zone, XTarget & targets[], ENUM_X_DIRECTION & dir // ) { // bool result = false; // zone.Clean(); XClean(targets); dir = X_DIRECTION_NONE; // result = bar.IsValid(); if (!result) { return result; } // bool isBullish = poiDetector.IsBullishBreakoutPOI(bar.Index()); bool isBearish = poiDetector.IsBearishBreakoutPOI(bar.Index()); result = isBullish || isBearish; if (!result) { return result; } // dir = isBullish ? X_DIRECTION_BULLISH : isBearish ? X_DIRECTION_BEARISH : X_DIRECTION_NONE; result = ToBox(bar, zone, dir, X_BAR_PATTERN_TRUE_GAPED); result = result && zone.IsValid() && HasDirection(dir); // return result; } /** * Check Bar Has Signal Based on Strategy 4 ... * * Exhaustion: * - Strong trend + RSI extreme + volatility low. * - Confirms with Piercing/Dark Cloud Cover candlestick. * * @return ( bool ) */ bool Strategy4HasSignal( XOHCL & bar, XBoxZone & zone, XTarget & targets[], ENUM_X_DIRECTION & dir // ) { // bool result = false; // zone.Clean(); XClean(targets); dir = X_DIRECTION_NONE; // result = bar.IsValid(); if (!result) { return result; } // bool isBullish = poiDetector.IsBullishTrendExhaustedPOI(bar.Index()); bool isBearish = poiDetector.IsBearishTrendExhaustedPOI(bar.Index()); result = isBullish || isBearish; if (!result) { return result; } // dir = isBullish ? X_DIRECTION_BULLISH : isBearish ? X_DIRECTION_BEARISH : X_DIRECTION_NONE; result = ToBox(bar, zone, dir, X_BAR_PATTERN_PIERCING); result = result && zone.IsValid() && HasDirection(dir); // return result; } /** * Check Bar Has Signal Based on Strategy 5 ... * * Continuation: * - Requires strong trend confirmation (KI fast/slow + MA crossover + RSI filter). * - Confirms with continuation candlestick patterns (Flag or Rising pattern). * - Ensures zone validity for entry. * * @return ( bool ) */ bool Strategy5HasSignal( XOHCL & bar, XBoxZone & zone, XTarget & targets[], ENUM_X_DIRECTION & dir // ) { // bool result = false; // zone.Clean(); XClean(targets); dir = X_DIRECTION_NONE; // result = bar.IsValid(); if (!result) { return result; } // bool isBullish = kiParser.IsTrendStrongBullish(bar.Index()); bool isBearish = kiParser.IsTrendStrongBearish(bar.Index()); result = isBullish || isBearish; if (!result) { return result; } // // Confirm Direction by Candlestick Continuation Patterns ... isBullish = isBullish && poiDetector.IsBullishContinuationPOI(bar.Index()); isBearish = isBearish && poiDetector.IsBearishContinuationPOI(bar.Index()); result = isBullish || isBearish; if (!result) { return result; } // dir = isBullish ? X_DIRECTION_BULLISH : isBearish ? X_DIRECTION_BEARISH : X_DIRECTION_NONE; result = ToBox(bar, zone, dir, X_BAR_PATTERN_PIERCING); result = result && zone.IsValid() && HasDirection(dir); // return result; } /// // // /// result = isBullish ? // entry > iBar.low && entry < iBar.high // && // iBar.GetLowShadow() > iBar.GetHighShadow() : // entry < iBar.high && entry > iBar.low // && // iBar.GetHighShadow() > iBar.GetLowShadow() ; /// /// /** * Check Bar Has Signal Based on Strategy 1 ... * POI ... * * @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; // zone.Clean(); XClean(targets); dir = X_DIRECTION_NONE; // result = bar.IsValid(); if (!result) { return result; } // int barIndex = bar.Index() + 1; // // Retrieve Base Conditions ... bool isBullish = IsBullishPOILongEntry(barIndex); bool isBearish = IsBearishPOIShortEntry(barIndex); // // Validate Conditions ... result = isBullish || isBearish; if (!result) { return result; } // XOHCL iBar; result = iBar.Init(bar.symbol, bar.period, barIndex); if (!result) { return result; } // // 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 = false; 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 = isBullish ? X_DIRECTION_BULLISH : isBearish ? X_DIRECTION_BEARISH : X_DIRECTION_NONE; result = HasDirection(dir); if (!result) { // iBar.Clean(); return result; } // // Prepare Zone ... double entry = GetEntry(iBar.symbol, dir); if (result) { // double upper = isBullish ? entry : iBar.high; double lower = isBullish ? iBar.low : entry; datetime to = bar.time; datetime from = iBar.BeforeOn(); result = zone.Init( iBar.symbol, iBar.period, upper, lower, from, to, dir, "XS1" // ); if (result) { // XPOIDrawConfig iConfig; iConfig.Default(); // poiDrawer.DrawZone(zone, iConfig); // // DebugBreak(); } } // iBar.Clean(); // result = result && zone.IsValid() && HasDirection(dir); // return result; } /** * Check Bar Has Signal Based on Strategy 1 ... * POI ... * * @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; // zone.Clean(); XClean(targets); dir = X_DIRECTION_NONE; // result = bar.IsValid(); if (!result) { return result; } // int barIndex = bar.Index() + 1; // // Retrieve Base Conditions ... bool isBullish = IsBullishPOILongEntry(barIndex); bool isBearish = IsBearishPOIShortEntry(barIndex); // // Validate Conditions ... result = isBullish || isBearish; if (!result) { return result; } // XOHCL iBar; result = iBar.Init(bar.symbol, bar.period, barIndex); if (!result) { return result; } // // 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 = isBullish ? X_DIRECTION_BULLISH : isBearish ? X_DIRECTION_BEARISH : X_DIRECTION_NONE; result = HasDirection(dir); if (!result) { // iBar.Clean(); return result; } // // Prepare Zone ... double entry = GetEntry(iBar.symbol, dir); if (result) { // double upper = isBullish ? entry : iBar.high; double lower = isBullish ? iBar.low : entry; datetime to = bar.time; datetime from = iBar.BeforeOn(); result = zone.Init( iBar.symbol, iBar.period, upper, lower, from, to, dir, "XS1" // ); if (result) { // XPOIDrawConfig iConfig; iConfig.Default(); // poiDrawer.DrawZone(zone, iConfig); // // DebugBreak(); } } // iBar.Clean(); // result = result && zone.IsValid() && HasDirection(dir); // 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]; // } // } // // // // #region Market Structure ... XBoxZone supports[]; XBoxZone resistances[]; XBoxZone minorSupport; XBoxZone majorSupport; XBoxZone minorResistance; XBoxZone majorResistance; poiDetector.GetCurrentStructure( supports, resistances, minorSupport, majorSupport, minorResistance, majorResistance, barIndex, bar.symbol, iBar.period, // Minor ... PERIOD_H1, // Major ... 50, 14, 21, 0 // ); // // 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 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 // // Cleanup Resources ... iBar.Clean(); XClean(supports); XClean(resistances); minorSupport.Clean(); majorSupport.Clean(); minorResistance.Clean(); majorResistance.Clean(); // // Draws ... bool draw = true; if (draw && result) { // int drawn = 0; // 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()) { // drawn++; poiDrawer.DrawZone(minorSupport, config); } if (minorResistance.IsValid()) { // drawn++; poiDrawer.DrawZone(minorResistance, config); } // // Majors ... config.bullishColor = clrLime; config.bearishColor = clrRed; config.zonesWidth = 4; // if (majorSupport.IsValid()) { // drawn++; poiDrawer.DrawZone(majorSupport, config); } if (majorResistance.IsValid()) { // drawn++; poiDrawer.DrawZone(majorResistance, config); } // config.Clean(); // if (drawn > 0) { DebugBreak(); } }