// ======================================= // Temp Signaller: // ======================================= /** * Check Bar Has Signal Based on Strategy X ... * * @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 StrategyXHasSignal( XOHCL &bar, XBoxZone &zone, XTarget &targets[], ENUM_X_DIRECTION &dir // ) { // bool result = false; // // Prepare ... zone.Clean(); XClean(targets); dir = X_DIRECTION_NONE; // // Validate ... result = bar.IsValid(); if (!result) { return result; } // // Define Requirements ... // XOHCL pBar; XOHCL p2Bar; bool isBullish = false; bool isBearish = false; // // Read PBar ... result = bar.GetPreviousBar(pBar); result = result && pBar.GetPreviousBar(p2Bar); if (!result) { // pBar.Clean(); p2Bar.Clean(); // return result; } // // Reading pBar Patterns ... XPatternAnalysis pBarAnalysis; poiDetector.AnalyseBarPatterns( pBar, pBarAnalysis, structureConfig.barsAnalysisConfig // ); // // Check Bar Patterns ... bool isPBarHasBullishPatterns = (bar.close > pBar.low || bar.open > pBar.low) && ( // pBarAnalysis.IsPinned(X_DIRECTION_BULLISH) || pBarAnalysis.IsEngulfed(X_DIRECTION_BULLISH) || pBarAnalysis.IsMomentum(X_DIRECTION_BULLISH) || pBarAnalysis.IsPiercing(X_DIRECTION_BULLISH) || pBarAnalysis.IsSignalKey(X_DIRECTION_BULLISH) // ); bool isPBarHasBearishPatterns = (bar.close < pBar.high || bar.open < pBar.high) && ( // pBarAnalysis.IsPinned(X_DIRECTION_BEARISH) || pBarAnalysis.IsEngulfed(X_DIRECTION_BEARISH) || pBarAnalysis.IsMomentum(X_DIRECTION_BEARISH) || pBarAnalysis.IsPiercing(X_DIRECTION_BEARISH) || pBarAnalysis.IsSignalKey(X_DIRECTION_BEARISH) // ); // // Do ... // isBullish = // false // ; // isBearish = // false // ; // // Validate ... result = isBullish || isBearish; if (result) { // dir = isBullish ? X_DIRECTION_BULLISH : X_DIRECTION_BEARISH; // result = HasDirection(dir); } // // Prepare Zone ... if (result) { // zone.Clean(); result = ToBox( p2Bar, zone, dir, X_BAR_PATTERN_PINNED // ); // // Manage Stops ... if (result) { } // result = zone.IsValid(); } // // Prepare Targets ... if (result) { } // // Cleanup ... if (!result) { // zone.Clean(); XClean(targets); dir = X_DIRECTION_NONE; } pBar.Clean(); p2Bar.Clean(); // return result; } // ======================================= // Signallers: // ======================================= /** * Check Bar Has Signal Based on Strategy 3 ... * * @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; // // Prepare ... zone.Clean(); XClean(targets); dir = X_DIRECTION_NONE; // // Validate ... result = bar.IsValid(); if (!result) { return result; } // // Define Requirements ... // XOHCL pBar; bool isBullish = false; bool isBearish = false; // // Read PBar ... result = bar.GetPreviousBar(pBar); if (!result) { // pBar.Clean(); return result; } // // Reading Conditions ... int pullBackStartBar = -1; bool isPullBack = result && poiDetector.IsPullbackPattern( pBar, zone, dir, 2, false // Force Break ... ); bool isPullbackBullish = isPullBack && IsXBullish(dir); bool isPullbackBearish = isPullBack && IsXBearish(dir); if (isPullBack) { pullBackStartBar = zone.FromIndex(); } // // Reading HK Bond ... // double pHKBondUpper = fimaHelper.GetHKBondUpper(pBar.Index()); double pHKBondLower = fimaHelper.GetHKBondLower(pBar.Index()); int overHKBondUpperCount = fimaHelper.CountOverHKBondUpper(pullBackStartBar, X_PRICE_LOW); int underHKBondLowerCount = fimaHelper.CountUnderHKBondLower(pullBackStartBar, X_PRICE_HIGH); // // Reading PV Requirements ... // int lastPeakOverLastIDX = -1; int lastValeUnderLastIDX = -1; double pPeak = fimaHelper.GetPeak(pBar.Index()); double pVale = fimaHelper.GetVale(pBar.Index()); int samePeaks = fimaHelper.CountSamePeaks(pBar.Index()); int sameVales = fimaHelper.CountSameVales(pBar.Index()); fimaHelper.FindLastPeakOverLast(lastPeakOverLastIDX, pBar.Index()); fimaHelper.FindLastValeUnderLast(lastValeUnderLastIDX, pBar.Index()); // // Reading pBar Patterns ... XPatternAnalysis pBarAnalysis; poiDetector.AnalyseBarPatterns( pBar, pBarAnalysis, structureConfig.barsAnalysisConfig // ); // // Check Bar Patterns ... bool isPBarHasBullishPatterns = (bar.close > pBar.low || bar.open > pBar.low) && ( // pBarAnalysis.IsPinned(X_DIRECTION_BULLISH) || pBarAnalysis.IsEngulfed(X_DIRECTION_BULLISH) || pBarAnalysis.IsMomentum(X_DIRECTION_BULLISH) || pBarAnalysis.IsPiercing(X_DIRECTION_BULLISH) || pBarAnalysis.IsSignalKey(X_DIRECTION_BULLISH) // ); bool isPBarHasBearishPatterns = (bar.close < pBar.high || bar.open < pBar.high) && ( // pBarAnalysis.IsPinned(X_DIRECTION_BEARISH) || pBarAnalysis.IsEngulfed(X_DIRECTION_BEARISH) || pBarAnalysis.IsMomentum(X_DIRECTION_BEARISH) || pBarAnalysis.IsPiercing(X_DIRECTION_BEARISH) || pBarAnalysis.IsSignalKey(X_DIRECTION_BEARISH) // ); // // Check PBar Close Over Under Fast Ma ... bool isPBarCloseOverFast = pBar.close > fimaHelper.GetMAFast(pBar.Index()); bool isPBarCloseUnderFast = pBar.close < fimaHelper.GetMAFast(pBar.Index()); // // Try To Find Affected Zone ... // // Collecting Zones ... XBoxZone zones[]; XBoxZone affectedZones[]; XBoxZone affectedZonesBullish[]; XBoxZone affectedZonesBearish[]; int zonesCount = poiDetector.CollectZones( pBar, zones, // 5, // Zones Loopback ... 3 // Zones Validation Length ... // Required Zones ... // Loopback ... ); int affectedZonesCount = ExtractAffectedZones( pBar, zones, affectedZones // ); int affectedZonesBullishCount = ExtractByDirection( affectedZonesBullish, affectedZones, X_DIRECTION_BULLISH // ); int affectedZonesBearishCount = ExtractByDirection( affectedZonesBearish, affectedZones, X_DIRECTION_BEARISH // ); // int insideBullishIDX = -1; int insideBearishIDX = -1; bool hasBullishInside = pBar.IsBullish() && HasInside( insideBullishIDX, pBar, affectedZonesBullish // ); bool hasBearishInside = pBar.IsBearish() && HasInside( insideBearishIDX, pBar, affectedZonesBearish // ); // // Do ... // isBullish = // hasBullishInside && isPullbackBullish && isPBarHasBullishPatterns && fimaHelper.IsSarBullish(pBar.Index()) && (pVale >= affectedZonesBullish[insideBullishIDX].lower && pVale <= affectedZonesBullish[insideBullishIDX].upper) // ; // isBearish = // hasBearishInside && isPullbackBearish && isPBarHasBearishPatterns && fimaHelper.IsSarBearish(pBar.Index()) && (pPeak >= affectedZonesBearish[insideBearishIDX].lower && pPeak <= affectedZonesBearish[insideBearishIDX].upper) // ; // // Validate ... result = isBullish || isBearish; if (result) { // if (isBullish) { // poiDrawer.DrawZone( affectedZonesBullish[insideBullishIDX], structureDrawConfig.drawConfig // ); } else { // poiDrawer.DrawZone( affectedZonesBearish[insideBearishIDX], structureDrawConfig.drawConfig // ); } // dir = isBullish ? X_DIRECTION_BULLISH : X_DIRECTION_BEARISH; // result = HasDirection(dir); } // // Prepare Zone ... if (result) { // zone.Clean(); if (isBullish) { zone = affectedZonesBullish[insideBullishIDX]; } else { zone = affectedZonesBearish[insideBearishIDX]; } // result = zone.IsValid(); } // // Prepare Targets ... if (result) { } // // Cleanup ... if (!result) { // zone.Clean(); XClean(targets); dir = X_DIRECTION_NONE; } pBar.Clean(); XClean(zones); pBarAnalysis.Clean(); XClean(affectedZones); XClean(affectedZonesBullish); XClean(affectedZonesBearish); // return result; } /** * Check Bar Has Signal Based on Strategy 3 ... * * @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 Strategy2HasSignal( XOHCL &bar, XBoxZone &zone, XTarget &targets[], ENUM_X_DIRECTION &dir // ) { // bool result = false; // // Prepare ... zone.Clean(); XClean(targets); dir = X_DIRECTION_NONE; // // Validate ... result = bar.IsValid(); if (!result) { return result; } // // Define Requirements ... // XOHCL pBar; XOHCL p2Bar; bool isBullish = false; bool isBearish = false; // // Read PBar ... result = bar.GetPreviousBar(pBar); result = result && pBar.GetPreviousBar(p2Bar); if (!result) { // pBar.Clean(); p2Bar.Clean(); // return result; } // // Reading pBar Patterns ... XPatternAnalysis pBarAnalysis; poiDetector.AnalyseBarPatterns( pBar, pBarAnalysis, structureConfig.barsAnalysisConfig // ); // // Check Bar Patterns ... bool isPBarHasBullishPatterns = (bar.close > pBar.low || bar.open > pBar.low) && ( // pBarAnalysis.IsPinned(X_DIRECTION_BULLISH) || pBarAnalysis.IsEngulfed(X_DIRECTION_BULLISH) || pBarAnalysis.IsMomentum(X_DIRECTION_BULLISH) || pBarAnalysis.IsPiercing(X_DIRECTION_BULLISH) || pBarAnalysis.IsSignalKey(X_DIRECTION_BULLISH) // ); bool isPBarHasBearishPatterns = (bar.close < pBar.high || bar.open < pBar.high) && ( // pBarAnalysis.IsPinned(X_DIRECTION_BEARISH) || pBarAnalysis.IsEngulfed(X_DIRECTION_BEARISH) || pBarAnalysis.IsMomentum(X_DIRECTION_BEARISH) || pBarAnalysis.IsPiercing(X_DIRECTION_BEARISH) || pBarAnalysis.IsSignalKey(X_DIRECTION_BEARISH) // ); // double peak = fimaHelper.GetPeak(bar.Index()); double vale = fimaHelper.GetVale(bar.Index()); double pPeak = fimaHelper.GetPeak(pBar.Index()); double pVale = fimaHelper.GetVale(pBar.Index()); double p2Peak = fimaHelper.GetPeak(p2Bar.Index()); double p2Vale = fimaHelper.GetVale(p2Bar.Index()); bool isPPeakOverLast = fimaHelper.IsPeakOverLast(pBar.Index()); bool isPValeUnderLast = fimaHelper.IsValeUnderLast(pBar.Index()); bool isP2PeakOverLast = fimaHelper.IsPeakOverLast(p2Bar.Index()); bool isP2ValeUnderLast = fimaHelper.IsValeUnderLast(p2Bar.Index()); bool isPeakOverLast = isPPeakOverLast || isP2PeakOverLast; bool isValeUnderLast = isPValeUnderLast || isP2ValeUnderLast; bool isP2ValeOverLast = pVale > p2Vale; bool isP2PeakUnderLast = pPeak < p2Peak; // // Check PBar Close Over Under Fast Ma ... bool isPBarCloseOverFast = pBar.close > fimaHelper.GetMAFast(pBar.Index()); bool isPBarCloseUnderFast = pBar.close < fimaHelper.GetMAFast(pBar.Index()); bool isFastOverLast = fimaHelper.GetMAFast(pBar.Index()) > fimaHelper.GetMAFast(p2Bar.Index()); bool isFastUnderLast = fimaHelper.GetMAFast(pBar.Index()) < fimaHelper.GetMAFast(p2Bar.Index()); // // Force P2Bar is Pin Bar ... ENUM_X_DIRECTION p2Dir; bool isP2BarPinned = poiDetector.IsPinnedBar( p2Bar, p2Dir // ); bool isP2BarBullishPinned = isP2BarPinned && IsXBullish(p2Dir); bool isP2BarBearishPinned = isP2BarPinned && IsXBearish(p2Dir); // // Do ... // isBullish = // isFastOverLast && isValeUnderLast && !isP2PeakUnderLast && isPBarCloseOverFast && isP2BarBullishPinned && isPBarHasBullishPatterns // ; // isBearish = // isPeakOverLast && isFastUnderLast && !isP2ValeOverLast && isPBarCloseUnderFast && isP2BarBearishPinned && isPBarHasBearishPatterns // ; // // Validate ... result = isBullish || isBearish; if (result) { // dir = isBullish ? X_DIRECTION_BULLISH : X_DIRECTION_BEARISH; // result = HasDirection(dir); } // // Prepare Zone ... if (result) { // zone.Clean(); result = ToBox( p2Bar, zone, dir, X_BAR_PATTERN_PINNED // ); // // Manage Stops ... if (result) { // double entry = GetEntry(zone.symbol, zone.dir); double riskSide = zone.IsBullish() ? zone.lower : zone.upper; double risk = MathAbs(entry - riskSide); // // Collecting Affected Zones ... XBoxZone tmps[]; XBoxZone zones[]; XBoxZone actedZones[]; XBoxZone insideZones[]; XBoxZone breakedZones[]; XBoxZone affectedZones[]; // // Support and Resistances ... poiDetector.CollectZones(bar, tmps); Copy(tmps, zones, false); // // OBS ... poiDetector.CollectOBs(bar, tmps); Copy(tmps, zones, false); // // FVGs ... poiDetector.CollectFVGs(bar, tmps); Copy(tmps, zones, false); // ExtractAffectedZones(bar, zones, affectedZones); // // Acteds Zones ... ExtractActeds(bar, actedZones, affectedZones); // // Inside Zones ... ExtractInsides(bar, insideZones, affectedZones); // // Breaked Zones ... ExtractBreakeds(bar, breakedZones, affectedZones); // // Draw Affected Zones ... if (HasChild(affectedZones)) { // UpdateToTime(affectedZones, bar.time); poiDrawer.DrawZones(affectedZones, structureDrawConfig.drawConfig); } // // Draw Acted Zones ... // if (HasChild(actedZones)) // { // poiDrawer.DrawZones(actedZones, structureDrawConfig.drawConfig); // } // // Draw Inside Zones ... // if (HasChild(insideZones)) // { // poiDrawer.DrawZones(insideZones, structureDrawConfig.drawConfig); // } // // // // Draw Breaked Zones ... // if (HasChild(breakedZones)) // { // poiDrawer.DrawZones(breakedZones, structureDrawConfig.drawConfig); // } // // Cleanup ... XClean(tmps); XClean(zones); XClean(actedZones); XClean(insideZones); XClean(breakedZones); XClean(affectedZones); } // if (result) { // zone.to = bar.time; // poiDrawer.DrawZone( zone, structureDrawConfig.drawConfig // ); } // result = zone.IsValid(); } // // Prepare Targets ... if (result) { } // // Cleanup ... if (!result) { // zone.Clean(); XClean(targets); dir = X_DIRECTION_NONE; } pBar.Clean(); p2Bar.Clean(); // return result; } /** * Check Bar Has Signal Based on Strategy 4 ... * * @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 Strategy3HasSignal( XOHCL &bar, XBoxZone &zone, XTarget &targets[], ENUM_X_DIRECTION &dir // ) { // bool result = false; // // Prepare ... zone.Clean(); XClean(targets); dir = X_DIRECTION_NONE; // // Validate ... result = bar.IsValid(); if (!result) { return result; } // // Define Requirements ... // XOHCL pBar; XOHCL p2Bar; bool isBullish = false; bool isBearish = false; // // Read PBar ... result = bar.GetPreviousBar(pBar); result = result && pBar.GetPreviousBar(p2Bar); if (!result) { // pBar.Clean(); p2Bar.Clean(); // return result; } // // Do ... // XFIMA Consolidation ... // bool isConsolidation = fimaHelper.HasPVConsolidationZone( zone, pBar.Index(), true, // Force PV Break ... true // Force Has Sar Switch ... ); // isBullish = isConsolidation && zone.IsBullish(); // isBearish = isConsolidation && zone.IsBearish(); // // Validate based on Bars Patterns ... bool validateByBarPatterns = true; if (validateByBarPatterns) { // // Reading pBar Patterns ... XPatternAnalysis pBarAnalysis; poiDetector.AnalyseBarPatterns( pBar, pBarAnalysis, structureConfig.barsAnalysisConfig // ); // // Bullish ... bool isPBarHasBullishPatterns = (bar.close > pBar.low || bar.open > pBar.low) && ( // pBarAnalysis.IsPinned(X_DIRECTION_BULLISH) || pBarAnalysis.IsEngulfed(X_DIRECTION_BULLISH) || pBarAnalysis.IsMomentum(X_DIRECTION_BULLISH) || pBarAnalysis.IsPiercing(X_DIRECTION_BULLISH) || pBarAnalysis.IsSignalKey(X_DIRECTION_BULLISH) // ); // // Bearish ... bool isPBarHasBearishPatterns = (bar.close < pBar.high || bar.open < pBar.high) && ( // pBarAnalysis.IsPinned(X_DIRECTION_BEARISH) || pBarAnalysis.IsEngulfed(X_DIRECTION_BEARISH) || pBarAnalysis.IsMomentum(X_DIRECTION_BEARISH) || pBarAnalysis.IsPiercing(X_DIRECTION_BEARISH) || pBarAnalysis.IsSignalKey(X_DIRECTION_BEARISH) // ); // isBullish = isBullish && isPBarHasBullishPatterns && !isPBarHasBearishPatterns; // isBearish = isBearish && isPBarHasBearishPatterns && !isPBarHasBullishPatterns; // // Summarize Result ... result = isBullish || isBearish; } // // Checking PullBack ... bool validateByPullback = false; if (validateByPullback) { // XBoxZone pullback; ENUM_X_DIRECTION pullbackDir; bool isPullBack = result && poiDetector.IsPullbackPattern( pBar, pullback, pullbackDir, 2, false // Force Break ... ); bool isPullbackBullish = isPullBack && IsXBullish(pullbackDir); bool isPullbackBearish = isPullBack && IsXBearish(pullbackDir); // isBullish = isBullish && isPullbackBullish; // isBearish = isBearish && isPullbackBearish; // // Summarize Result ... result = isBullish || isBearish; } // // Validate ... result = isBullish || isBearish; if (result) { // dir = zone.dir; zone.to = bar.time; XPOIDrawConfig iConfig = structureDrawConfig.drawConfig; iConfig.zonesWidth = 3; iConfig.bullishColor = clrYellow; iConfig.bearishColor = clrDarkOrange; poiDrawer.DrawZone(zone, iConfig); Print("Consolidation"); } // // Prepare Zone ... if (result) { // // zone.Clean(); // result = ToBox( // p2Bar, // zone, // dir, // X_BAR_PATTERN_PINNED // // ); // // Manage Stops ... if (result) { } // result = zone.IsValid(); } // // Prepare Targets ... if (result) { } // // Cleanup ... if (!result) { // zone.Clean(); XClean(targets); dir = X_DIRECTION_NONE; } pBar.Clean(); p2Bar.Clean(); // return result; }