/** * 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 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) { return result; } // #region Reading Conditions and Scoring ... // // ATR ... bool isATRUp = kiParser.IsVolatilityHigh(barIndex) || kiParser.IsVolatilitySwitchdToHigh(barIndex); // #region KI ... // bool isKIReadyForBullish = ((kiParser.IsKIFastBearish(barIndex) || (kiParser.IsKIFastBullish(barIndex) && iBar.IsRejected(kiHelper.GetKIFast(barIndex), X_DIRECTION_BULLISH))) && kiParser.IsKISlowBullish(barIndex)); // bool isKIReadyForBearish = ((kiParser.IsKIFastBullish(barIndex) || (kiParser.IsKIFastBearish(barIndex) && iBar.IsRejected(kiHelper.GetKIFast(barIndex), X_DIRECTION_BEARISH))) && kiParser.IsKISlowBearish(barIndex)); // bool isKIBandBullish = (kiHelper.GetKIUpper(barIndex) > kiHelper.GetKIUpper(barIndex + 1) || kiHelper.GetKILower(barIndex) > kiHelper.GetKILower(barIndex + 1)); // bool isKIBandBearish = (kiHelper.GetKIUpper(barIndex) < kiHelper.GetKIUpper(barIndex + 1) || kiHelper.GetKILower(barIndex) < kiHelper.GetKILower(barIndex + 1)); // bool isKIBullish = (kiParser.IsKIFastBullish(barIndex) || kiParser.IsKIFastSwitchedToBullish(barIndex)) && (kiParser.IsKISlowBullish(barIndex) || kiParser.IsKISlowSwitchedToBullish(barIndex)); if (isKIBullish) { scoreBullish++; } // 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++; } // 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 // #endregion // #region Summarize Directional Conditions ... // isBullish = isATRUp && isLowerTFBullish && isKIReadyForBullish && isCandlestickBullish && scoreBullish >= 2 && (isKIBullish || isMaBullish || isKIWaveBullish || isKIBandBullish); // isBearish = isATRUp && isLowerTFBearish && isKIReadyForBearish && isCandlestickBearish && scoreBearish >= 2 && (isKIBearish || isMaBearish || isKIWaveBearish || isKIBandBearish); // #endregion // // Validate Conditions ... result = isBullish || isBearish; if (!result) { // iBar.Clean(); // return result; } // // Select Operational Zone ... if (isBullish) { // // Looking Bar Patterns to Detect Zone ... poiDetector.HasRecentPatternTouched(zone, iBar.close, barIndex, 5, 5, iBar.period, X_DIRECTION_BULLISH); } else if (isBearish) { // // 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) { // // Refine Zone ... poiDetector.RefineZone(zone); // // SL Refactoring ... // XOHCL toBar; if (zone.ToBar(toBar)) { // int to = zone.ToIndex(); int from = zone.FromIndex(); int length = from - to; double iValue = isBullish ? toBar.FindLowest(length, MODE_LOW) : isBearish ? toBar.FindHighest(length, MODE_HIGH) : EMPTY_VALUE; if (NotEmptyZero(iValue)) { // if (isBullish) { zone.lower = MathMin(zone.lower, iValue); } // if (isBearish) { zone.upper = MathMax(zone.upper, iValue); } } } toBar.Clean(); } // // 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(); // return result; } // // 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(); } // config.Clean(); // if (drawn > 0) { // DebugBreak(); } } // // Check and Prepare Direction ... dir = isBullish ? X_DIRECTION_BULLISH : isBearish ? X_DIRECTION_BEARISH : X_DIRECTION_NONE; result = result && HasDirection(dir); if (!result) { // iBar.Clean(); // return result; } // // Prepare Zone ... double entry = GetEntry(iBar.symbol, dir); if (result) { // double upper = isBullish ? entry : zone.upper; double lower = isBullish ? zone.lower : entry; datetime to = bar.time; datetime from = isBullish ? zone.from : zone.from; result = zone.Init( iBar.symbol, iBar.period, upper, lower, from, to, dir, "XS1" // ); } // // Cleanup Resources ... iBar.Clean(); // result = result && zone.IsValid() && HasDirection(dir); // return result; } 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(); // // Customize Patterns ... // iConfig.FullPattern(); // // iConfig.AddPattern(X_BAR_PATTERN_OB); // iConfig.AddPattern(X_BAR_PATTERN_PINNED); // iConfig.AddPattern(X_BAR_PATTERN_ENGULFED); // iConfig.AddPattern(X_BAR_PATTERN_SIGNALKEY); // // iConfig.AddPattern(X_BAR_PATTERN_FVG); // iConfig.AddPattern(X_BAR_PATTERN_PIERCING); // // iConfig.AddPattern(X_BAR_PATTERN_STAR); // iConfig.AddPattern(X_BAR_PATTERN_RISING); // iConfig.AddPattern(X_BAR_PATTERN_MOMENTUM); // iConfig.AddPattern(X_BAR_PATTERN_CONSOLIDATION); // iConfig.AddPattern(X_BAR_PATTERN_LOW, X_DIRECTION_BULLISH); // iConfig.AddPattern(X_BAR_PATTERN_HIGH, X_DIRECTION_BEARISH); // iConfig.AddPattern(X_BAR_PATTERN_SUPPORT); // iConfig.AddPattern(X_BAR_PATTERN_RESISTANCE); // // XAUUSD ... iConfig.AddPattern(X_BAR_PATTERN_FVG); iConfig.AddPattern(X_BAR_PATTERN_PIERCING); // // Looping Back ... 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; } // // Cleanup Resource ... iBar.Clean(); iAnalysis.Clean(); XClean(iBullishZones); XClean(iBearishZones); } // // Cleanup Resources ... iBar.Clean(); iConfig.Clean(); iAnalysis.Clean(); XClean(iBullishZones); XClean(iBearishZones); // return result; } // // XAUUSD ... // // // // FVG ... // Add(X_BAR_PATTERN_FVG, patterns); // Add(X_DIRECTION_NONE, patternsDir); // // // // Piercing ... // Add(X_BAR_PATTERN_PIERCING, patterns); // Add(X_DIRECTION_NONE, patternsDir);