/** * 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; } // // Validator Flags ... bool validateByZones = true; bool validateByPinBar = true; bool validateByBarPatterns = true; bool validateByCyclesTrend = true; bool validateByMaFastSlowGrows = true; // // Define Requirements ... // XOHCL pBar; XOHCL p2Bar; XOHCL p3Bar; bool isBullish = false; bool isBearish = false; XPatternAnalysis pBarPatterns; XPatternAnalysis p2BarPatterns; XPatternAnalysis p3BarPatterns; XPatternAnalysisConfig iPatternsConfig; // // Reading Bars ... result = bar.GetPreviousBar(pBar); result = result && pBar.GetPreviousBar(p2Bar); result = result && p2Bar.GetPreviousBar(p3Bar); if (!result) { // pBar.Clean(); p2Bar.Clean(); p3Bar.Clean(); // return result; } // // Reading Bar Patterns ... iPatternsConfig.Default(); iPatternsConfig.FullPattern(); result = result && poiDetector.AnalyseBarPatterns( pBar, pBarPatterns, iPatternsConfig // ); result = result && poiDetector.AnalyseBarPatterns( p2Bar, p2BarPatterns, iPatternsConfig // ); result = result && poiDetector.AnalyseBarPatterns( p3Bar, p3BarPatterns, iPatternsConfig // ); if (!result) { // pBar.Clean(); p2Bar.Clean(); p3Bar.Clean(); pBarPatterns.Clean(); p2BarPatterns.Clean(); p3BarPatterns.Clean(); iPatternsConfig.Clean(); // return result; } // // Detect a Cross of MAs ... bool isFastCrossedOverSlow = fimaParser.IsMAFastCrossedOverSlow(p2Bar.Index()); bool isFastCrossedUnderSlow = fimaParser.IsMAFastCrossedUnderSlow(p2Bar.Index()); // isBullish = isFastCrossedOverSlow; isBearish = isFastCrossedUnderSlow; // result = isBullish || isBearish; // // Validate Cross By Over/Under Last ... if (result && validateByMaFastSlowGrows) { // // Bullish ... bool isFastOverLast = fimaParser.IsMAFastOverLast(pBar.Index()); bool isSlowOverLast = fimaParser.IsMASlowOverLast(pBar.Index()); bool isOverLast = isFastOverLast && isSlowOverLast; // // Bearish ... bool isFastUnderLast = fimaParser.IsMAFastUnderLast(pBar.Index()); bool isSlowUnderLast = fimaParser.IsMASlowUnderLast(pBar.Index()); bool isUnderLast = isFastUnderLast && isSlowUnderLast; // isBullish = isBullish && isOverLast; // isBearish = isBearish && isUnderLast; // result = isBullish || isBearish; } // // Validate By Cycles Trend ... if (result && validateByCyclesTrend) { // // Reading Cycles Trend ... // // Bullish ... // bool isLCMABullish = fimaParser.IsLCMABullish(pBar.Index()); bool isHCMABullish = fimaParser.IsHCMABullish(pBar.Index()); // bool isLCMAOverLast = fimaParser.IsLCMAOverLast(pBar.Index()); bool isHCMAOverLast = fimaParser.IsHCMAOverLast(pBar.Index()); // bool isCyclesMABullish = isLCMABullish && isHCMABullish && isLCMAOverLast && isHCMAOverLast; // // Bearish ... // bool isLCMABearish = fimaParser.IsLCMABearish(pBar.Index()); bool isHCMABearish = fimaParser.IsHCMABearish(pBar.Index()); // bool isLCMAUnderLast = fimaParser.IsLCMAUnderLast(pBar.Index()); bool isHCMAUnderLast = fimaParser.IsHCMAUnderLast(pBar.Index()); // bool isCyclesMABearish = isLCMABearish && isHCMABearish && isLCMAUnderLast && isHCMAUnderLast; // isBullish = isBullish && isCyclesMABullish; // isBearish = isBearish && isCyclesMABearish; // result = isBullish || isBearish; } // // Validate Has a PinBar ... if (result && validateByPinBar) { // bool isPBarIsPinBar = poiDetector.IsPinnedBar(pBar, dir); bool isPBarIsPinBarBullish = isPBarIsPinBar && IsXBullish(dir); bool isPBarIsPinBarBearish = isPBarIsPinBar && IsXBearish(dir); // bool isP2BarIsPinBar = poiDetector.IsPinnedBar(p2Bar, dir); bool isP2BarIsPinBarBullish = isP2BarIsPinBar && IsXBullish(dir); bool isP2BarIsPinBarBearish = isP2BarIsPinBar && IsXBearish(dir); // bool isBullishPin = isPBarIsPinBarBullish || isP2BarIsPinBarBullish; bool isBearishPin = isPBarIsPinBarBearish || isP2BarIsPinBarBearish; // isBullish = isBullish && isBullishPin; // isBearish = isBearish && isBearishPin; // result = isBullish || isBearish; } // // Validate By Bar Patterns ... if (result && validateByBarPatterns) { // int count = 0; int bullishCount = 0; int bearishCount = 0; // count = pBarPatterns.Count(X_DIRECTION_BULLISH); bullishCount += count; // count = p2BarPatterns.Count(X_DIRECTION_BULLISH); bullishCount += count; // count = pBarPatterns.Count(X_DIRECTION_BEARISH); bearishCount += count; // count = p2BarPatterns.Count(X_DIRECTION_BEARISH); bearishCount += count; // bool hasBullishScore = IsValidSize(bullishCount) && bullishCount > bearishCount; // bool hasBearishScore = IsValidSize(bearishCount) && bearishCount > bullishCount; // // Reading Bar Patterns ... // // Bullish ... bool isPBarHasBullishPatterns = (pBarPatterns.HasPattern(X_BAR_PATTERN_FLAG, X_DIRECTION_BULLISH) || pBarPatterns.HasPattern(X_BAR_PATTERN_STAR, X_DIRECTION_BULLISH) || pBarPatterns.HasPattern(X_BAR_PATTERN_PINNED, X_DIRECTION_BULLISH) || pBarPatterns.HasPattern(X_BAR_PATTERN_RISING, X_DIRECTION_BULLISH) || pBarPatterns.HasPattern(X_BAR_PATTERN_ENGULFED, X_DIRECTION_BULLISH) || pBarPatterns.HasPattern(X_BAR_PATTERN_MOMENTUM, X_DIRECTION_BULLISH) || pBarPatterns.HasPattern(X_BAR_PATTERN_PIERCING, X_DIRECTION_BULLISH) || pBarPatterns.HasPattern(X_BAR_PATTERN_SIGNALKEY, X_DIRECTION_BULLISH) || pBarPatterns.HasPattern(X_BAR_PATTERN_TRUE_GAPED, X_DIRECTION_BULLISH)); bool isP2BarHasBullishPatterns = (p2BarPatterns.HasPattern(X_BAR_PATTERN_FLAG, X_DIRECTION_BULLISH) || p2BarPatterns.HasPattern(X_BAR_PATTERN_STAR, X_DIRECTION_BULLISH) || p2BarPatterns.HasPattern(X_BAR_PATTERN_PINNED, X_DIRECTION_BULLISH) || p2BarPatterns.HasPattern(X_BAR_PATTERN_RISING, X_DIRECTION_BULLISH) || p2BarPatterns.HasPattern(X_BAR_PATTERN_ENGULFED, X_DIRECTION_BULLISH) || p2BarPatterns.HasPattern(X_BAR_PATTERN_MOMENTUM, X_DIRECTION_BULLISH) || p2BarPatterns.HasPattern(X_BAR_PATTERN_PIERCING, X_DIRECTION_BULLISH) || p2BarPatterns.HasPattern(X_BAR_PATTERN_SIGNALKEY, X_DIRECTION_BULLISH) || p2BarPatterns.HasPattern(X_BAR_PATTERN_TRUE_GAPED, X_DIRECTION_BULLISH)); bool hasBullishPatterns = isPBarHasBullishPatterns || isP2BarHasBullishPatterns; // // Bearish ... bool isPBarHasBearishPatterns = (pBarPatterns.HasPattern(X_BAR_PATTERN_FLAG, X_DIRECTION_BEARISH) || pBarPatterns.HasPattern(X_BAR_PATTERN_STAR, X_DIRECTION_BEARISH) || pBarPatterns.HasPattern(X_BAR_PATTERN_PINNED, X_DIRECTION_BEARISH) || pBarPatterns.HasPattern(X_BAR_PATTERN_RISING, X_DIRECTION_BEARISH) || pBarPatterns.HasPattern(X_BAR_PATTERN_ENGULFED, X_DIRECTION_BEARISH) || pBarPatterns.HasPattern(X_BAR_PATTERN_MOMENTUM, X_DIRECTION_BEARISH) || pBarPatterns.HasPattern(X_BAR_PATTERN_PIERCING, X_DIRECTION_BEARISH) || pBarPatterns.HasPattern(X_BAR_PATTERN_SIGNALKEY, X_DIRECTION_BEARISH) || pBarPatterns.HasPattern(X_BAR_PATTERN_TRUE_GAPED, X_DIRECTION_BEARISH)); bool isP2BarHasBearishPatterns = (p2BarPatterns.HasPattern(X_BAR_PATTERN_FLAG, X_DIRECTION_BEARISH) || p2BarPatterns.HasPattern(X_BAR_PATTERN_STAR, X_DIRECTION_BEARISH) || p2BarPatterns.HasPattern(X_BAR_PATTERN_PINNED, X_DIRECTION_BEARISH) || p2BarPatterns.HasPattern(X_BAR_PATTERN_RISING, X_DIRECTION_BEARISH) || p2BarPatterns.HasPattern(X_BAR_PATTERN_ENGULFED, X_DIRECTION_BEARISH) || p2BarPatterns.HasPattern(X_BAR_PATTERN_MOMENTUM, X_DIRECTION_BEARISH) || p2BarPatterns.HasPattern(X_BAR_PATTERN_PIERCING, X_DIRECTION_BEARISH) || p2BarPatterns.HasPattern(X_BAR_PATTERN_SIGNALKEY, X_DIRECTION_BEARISH) || p2BarPatterns.HasPattern(X_BAR_PATTERN_TRUE_GAPED, X_DIRECTION_BEARISH)); bool hasBearishPatterns = isPBarHasBearishPatterns || isP2BarHasBearishPatterns; // isBullish = isBullish && hasBullishScore && hasBullishPatterns; // isBearish = isBearish && hasBearishScore && hasBearishPatterns; // result = isBullish || isBearish; } // // Validate By Zones ... if (result && validateByZones) { // XBoxZone zones[]; int count = poiDetector.DetectZones( pBar, zones, true, // Validate Zones ... false, // OB ... true, // FVG ... true, // Supports ... true, // Resistances ... X_DIRECTION_NONE, // All Directions ... X_SORT_BY_DATE, // Sort By ... X_DIRECTION_BEARISH, // Sort Direction ... 5, // Zones Loopback ... 5, // Zones Validation ... 100 // Loopback ... ); // bool has = IsValidSize(count); if (has) { poiDrawer.DrawZones(zones, structureDrawConfig.drawConfig); } } // if (result) { // DebugBreak(); // result = false; isBullish = false; isBearish = false; } // // Detecting Direction ... if (result) { // dir = isBullish ? X_DIRECTION_BULLISH : X_DIRECTION_BEARISH; // result = HasDirection(dir); } // // Prepare Zone ... if (result) { // // Since Zone Prepared in Above Steps ... // here we only Validate it ... result = zone.IsValid(); } // // Draws ... if (result) { // XPOIDrawConfig iConfig = structureDrawConfig.drawConfig; XPatternAnalysisDrawConfig iPatternsConfig = structureDrawConfig.barAnalysisDrawConfig; iConfig.trendRayLeft = false; iConfig.trendRayRight = false; // // Draw Zone ... if (zone.IsValid()) { // iConfig.zonesStyle = STYLE_DASHDOT; iConfig.bullishColor = clrYellow; iConfig.bearishColor = clrDarkOrange; // poiDrawer.DrawZone(zone, iConfig); } // // poiDrawer.DrawZone(mcPVZone, iConfig); // poiDrawer.DrawZone(lcPVZone, iConfig); // poiDrawer.DrawZone(hcPVZone, iConfig); // // poiDrawer.DrawZone(pinBarZone, iConfig); // poiDrawer.DrawZone(pullbackZone, iConfig); // poiDrawer.DrawTrendLine(pinBarZoneTrend, iConfig); // poiDrawer.DrawPatternAnalysis(pBarPatterns, iPatternsConfig); poiDrawer.DrawPatternAnalysis(p2BarPatterns, iPatternsConfig); poiDrawer.DrawPatternAnalysis(p3BarPatterns, iPatternsConfig); // // if (hasATRBox) // { // poiDrawer.DrawZone(atrBox, iConfig); // } // // if (hasDoublePatterns) // { // // // poiDrawer.DrawPatternAnalysis(iPatterns, iPatternsConfig); // poiDrawer.DrawPatternAnalysis(iPPatterns, iPatternsConfig); // } // iConfig.Clean(); iPatternsConfig.Clean(); // DebugBreak(); // // // result = false; // isBullish = false; // isBearish = false; // zone.Clean(); } // // Prepare Targets ... if (result) { } // // Cleanup ... if (!result) { // zone.Clean(); XClean(targets); dir = X_DIRECTION_NONE; } pBar.Clean(); p2Bar.Clean(); p3Bar.Clean(); pBarPatterns.Clean(); p2BarPatterns.Clean(); p3BarPatterns.Clean(); iPatternsConfig.Clean(); // return result; }