/////////////////////////////////////////////////////// // // SaherElm IT Center MQL5 X121 SMC Signal Class // ------------------------------------------------- // Name: // Description: provide all Signalling functions ... // // // Maintainer: // ------------ // Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) // ////////////////////////////////////////////////////// // // Global Properties ... #property library #property copyright "Copyright 2023, SaherElm IT Center" #property link "https://www.saherelm.ir" #property version "1.00" #property strict // // Imports ... #include "../Classes/x-121.smc.market.cycle.helper.class.mq5" #include "../Libraries/x-121.smc.lib.mq5" // // Definitions ... struct X121SMCStrategyTestSignalConditions { // // Props ... // string symbol; ENUM_TIMEFRAMES period; // double sl; ENUM_X_DIRECTION dir; ENUM_X_POSITION_TYPES type; // // Setup Props ... // datetime setupTime; datetime triggerTime; // XCOrderBlock *bullishOBs[]; XCOrderBlock *bearishOBs[]; // XCFVG *activeFVG; XCFVG *bullishFVGs[]; XCFVG *bearishFVGs[]; // // Trigger Props ... // // Constructor ... X121SMCStrategyTestSignalConditions() { Clean(); } // // Tools ... /** * Cleaning Up ... */ void Clean() { // sl = 0; // dir = X_DIRECTION_NONE; type = X_POSITION_TYPE_NONE; // symbol = NULL; period = NULL; setupTime = NULL; triggerTime = NULL; // activeFVG = NULL; Clean(bullishOBs); Clean(bearishOBs); } /** * Check Condition is Setting Up ... * * @param dir: ENUM_X_DIRECTION member, Setting Up Direction ... * * @return ( bool ) */ bool IsSetuped() { // bool result = false; // result = IsValid(setupTime) && HasDirection(dir); if (!result) { return result; } // return result; } /** * Calculate Setup Age ... * * @return ( int ) */ int GetSetupAge() { // int result = 0; // if (!IsSetuped()) { return result; } // result = (int)(TimeCurrent() - setupTime) / PeriodSeconds(period); // return result; } /** * Detect How we Can Trigger Signal ... * * @return ( bool ) */ bool CanTrigger() { // bool result = false; // result = // sl > 0 && IsValid(symbol) && IsValid(period) && IsValid(triggerTime) && type != X_POSITION_TYPE_ALL && type != X_POSITION_TYPE_NONE // ; // return result; } // // Extensions ... // int CountBullishOBs() { return ArraySize(bullishOBs); } // int CountBearishOBs() { return ArraySize(bearishOBs); } // bool HasBullishOB() { return IsValidSize(CountBullishOBs()); } // bool HasBearishOB() { return IsValidSize(CountBearishOBs()); } // int CountBullishFVGs() { return ArraySize(bullishFVGs); } // int CountBearishFVGs() { return ArraySize(bearishFVGs); } // bool HasBullishFVG() { return IsValidSize(CountBullishFVGs()); } // bool HasBearishFVG() { return IsValidSize(CountBearishFVGs()); } // }; // // Extension Functions ... // // Detect Setup Conditions ... bool DetectX121SMCTestSiganlSetup( string _symbol, ENUM_TIMEFRAMES _period, // X121SMCStrategyTestSignalConditions &conditions, // XC121SMCCycleHelper *triggerCycleHelper, XC121SMCCycleHelper *decisionCycleHelper, XC121SMCCycleHelper *analyseCycleHelper, XC121SMCCycleHelper *verificationCycleHelper, XC121SMCCycleHelper *consolidationCycleHelper, XC121SMCCycleHelper *visionCycleHelper // ) { // bool result = false; // bool isBullish = false; bool isBearish = false; // int zIndex = 0; int cIndex = zIndex + 1; int pIndex = cIndex + 1; int ppIndex = pIndex + 1; // int loopback = 10; // string symbol = _symbol; ENUM_TIMEFRAMES period = _period; // conditions.symbol = symbol; conditions.period = period; // XOHCL zBar; result = zBar.Init( symbol, period, zIndex // ); if (!result) { return result; } // XOHCL cBar; result = cBar.Init( symbol, period, cIndex // ); if (!result) { return result; } // double ask = GetAsk(symbol); double bid = GetBid(symbol); datetime cTime = TimeCurrent(); // double ll = cBar.FindLowest(9, MODE_LOW); double hh = cBar.FindHighest(9, MODE_HIGH); // int zoneValidationDivider = 10; int validPivotRepetition = triggerCycleHelper.mX121Helper .GetDonChainLength(); // double selectedSL = 0; // // Cycles Conditions ... // // Trigger ... ENUM_XPOI_EVENTS triggerPoiEvents[]; ENUM_X_CYCLE_EVENTS triggerCycleEvents[]; X121SMCCycleConditions triggerConditions; result = triggerCycleHelper.GetConditions( triggerCycleEvents, triggerPoiEvents, triggerConditions, zIndex, loopback // ); if (!result) { return result; } // // Decision ... ENUM_XPOI_EVENTS decisionPoiEvents[]; ENUM_X_CYCLE_EVENTS decisionCycleEvents[]; X121SMCCycleConditions decisionConditions; result = decisionCycleHelper.GetConditions( decisionCycleEvents, decisionPoiEvents, decisionConditions, zIndex, loopback // ); if (!result) { return result; } // // Analyse ... ENUM_XPOI_EVENTS analysePoiEvents[]; ENUM_X_CYCLE_EVENTS analyseCycleEvents[]; X121SMCCycleConditions analyseConditions; result = analyseCycleHelper.GetConditions( analyseCycleEvents, analysePoiEvents, analyseConditions, zIndex, loopback // ); if (!result) { return result; } // // Verification ... ENUM_XPOI_EVENTS verificationPoiEvents[]; ENUM_X_CYCLE_EVENTS verificationCycleEvents[]; X121SMCCycleConditions verificationConditions; result = verificationCycleHelper.GetConditions( verificationCycleEvents, verificationPoiEvents, verificationConditions, zIndex, loopback // ); if (!result) { return result; } // // Consolidation ... ENUM_XPOI_EVENTS consolidationPoiEvents[]; ENUM_X_CYCLE_EVENTS consolidationCycleEvents[]; X121SMCCycleConditions consolidationConditions; result = consolidationCycleHelper.GetConditions( consolidationCycleEvents, consolidationPoiEvents, consolidationConditions, zIndex, loopback // ); if (!result) { return result; } // // Vision ... ENUM_XPOI_EVENTS visionPoiEvents[]; ENUM_X_CYCLE_EVENTS visionCycleEvents[]; X121SMCCycleConditions visionConditions; result = visionCycleHelper.GetConditions( visionCycleEvents, visionPoiEvents, visionConditions, zIndex, loopback // ); if (!result) { return result; } // // Cycles POI States ... XPOIState triggerState = triggerConditions.state; XPOIState decisionState = decisionConditions.state; XPOIState analyseState = analyseConditions.state; XPOIState verificationState = verificationConditions.state; XPOIState consolidationState = consolidationConditions.state; XPOIState visionState = visionConditions.state; // // Detect Imbalances ... // XPOIState state = decisionState; // bool hasBullishOB = conditions.HasBullishOB(); if (!hasBullishOB) { // int count = state.CountBullishOrderBlocks(); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XCOrderBlock *iOB = state.bullishOrderBlocks[i]; // // Validate Order Block ... bool isValid = // cBar.low > iOB.Upper() // ; if (isValid) { // Add( iOB, conditions.bullishOBs // ); } } } // hasBullishOB = conditions.HasBullishOB(); } // bool hasBearishOB = conditions.HasBearishOB(); if (!hasBearishOB) { // int count = state.CountBearishOrderBlocks(); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XCOrderBlock *iOB = state.bearishOrderBlocks[i]; // // Validate Order Block ... bool isValid = // cBar.high < iOB.Lower() // ; if (isValid) { // Add( iOB, conditions.bearishOBs // ); } } } // hasBearishOB = conditions.HasBearishOB(); } // result = hasBullishOB || hasBearishOB; if (!result) { return result; } // int fvgValidationLength = 5; // bool hasBullishFVG = conditions.HasBullishFVG(); if (!hasBullishFVG) { // if (hasBullishOB) { // int obsCount = conditions.CountBullishOBs(); int count = state.CountBullishFairValueGaps(); for (int i = 0; i < obsCount; i++) { // XCOrderBlock *iOB = conditions.bullishOBs[i]; // for (int j = 0; j < count; j++) { // XCFVG *jFVG = state.bullishFairValueGaps[j]; // bool isValid = // cBar.low > iOB.Upper() && cBar.low > jFVG.Upper() && // jFVG.From() > iOB.From() && (((int)(jFVG.From() - iOB.From())) / PeriodSeconds(state.period)) <= fvgValidationLength // ; if (isValid) { // Add( jFVG, conditions.bullishFVGs // ); } } } } // hasBullishFVG = conditions.HasBullishFVG(); } // bool hasBearishFVG = conditions.HasBearishFVG(); if (!hasBearishFVG) { // if (hasBullishOB) { // int obsCount = conditions.CountBearishOBs(); int count = state.CountBearishFairValueGaps(); for (int i = 0; i < obsCount; i++) { // XCOrderBlock *iOB = conditions.bearishOBs[i]; // for (int j = 0; j < count; j++) { // XCFVG *jFVG = state.bearishFairValueGaps[j]; // bool isValid = // cBar.high < iOB.Lower() && cBar.high < jFVG.Lower() && // jFVG.From() > iOB.From() && (((int)(jFVG.From() - iOB.From())) / PeriodSeconds(state.period)) <= fvgValidationLength // ; if (isValid) { // Add( jFVG, conditions.bearishFVGs // ); } } } } // hasBearishFVG = conditions.HasBearishFVG(); } // result = (hasBullishOB && hasBullishFVG) || (hasBearishOB && hasBearishFVG); if (!result) { return result; } // // Detect new Peak or new Vale ... // bool isNewPeak = triggerConditions.x121Conditions.isNewPeak; double peak = triggerConditions.x121Conditions.peaksBuffer[1]; bool isNewPeakOverLast = triggerConditions.x121Conditions.isNewPeakOverLast; bool isNewPeakUnderLast = triggerConditions.x121Conditions.isNewPeakUnderLast; // bool isNewVale = triggerConditions.x121Conditions.isNewVale; double vale = triggerConditions.x121Conditions.valesBuffer[1]; bool isNewValeOverLast = triggerConditions.x121Conditions.isNewValeOverLast; bool isNewValeUnderLast = triggerConditions.x121Conditions.isNewValeUnderLast; // result = isNewPeak || isNewVale; if (!result) { return result; } // // Detect Setup Conditions based on Peaks or Vales Occurance ... bool lookupForLong = isNewVale && hasBullishOB && hasBullishFVG; bool lookupForShort = isNewPeak && hasBearishOB && hasBearishFVG; result = lookupForLong || lookupForShort; if (!result) { return result; } // XCFVG *fvg = NULL; double fvgZoneValidationRangePercent = 0; if (lookupForLong) { // // Long Conditions ... // Vales must be Happens Inside Bullish Fair Value Gaps ... int count = conditions.CountBullishFVGs(); for (int i = 0; i < count; i++) { // XCFVG *iFVG = conditions.bullishFVGs[i]; // bool isValid = // vale <= iFVG.Upper() && vale >= iFVG.Lower() && (fvgZoneValidationRangePercent <= 0 ? true : (vale < iFVG.Upper() - (iFVG.RangePercent() * fvgZoneValidationRangePercent))) // ; if (isValid) { // fvg = iFVG; break; } } // isBullish = // fvg != NULL && fvg.IsValid() // ; if (isBullish) { conditions.activeFVG = fvg; } } else if (lookupForShort) { // // Short Conditions ... // Peaks Must be Happens Inside Bearish Fair Value Gaps ... int count = conditions.CountBearishFVGs(); for (int i = 0; i < count; i++) { // XCFVG *iFVG = conditions.bearishFVGs[i]; // bool isValid = // peak <= iFVG.Upper() && peak >= iFVG.Lower() && (fvgZoneValidationRangePercent <= 0 ? true : (peak > iFVG.Lower() + (iFVG.RangePercent() * fvgZoneValidationRangePercent))) // ; if (isValid) { // fvg = iFVG; break; } } // isBearish = // fvg != NULL && fvg.IsValid() // ; if (isBearish) { conditions.activeFVG = fvg; } } // result = isBullish || isBearish; if (!result) { // if (lookupForLong) { // conditions.activeFVG = NULL; Clean(conditions.bullishOBs); Clean(conditions.bullishFVGs); } else if (lookupForShort) { // conditions.activeFVG = NULL; Clean(conditions.bearishOBs); Clean(conditions.bearishFVGs); } // return result; } // conditions.setupTime = cTime; conditions.dir = isBullish ? X_DIRECTION_BULLISH : X_DIRECTION_BEARISH; // return result; } // // Detect Trigger Conditions ... bool DetectX121SMCTestSiganlTrigger( // X121SMCStrategyTestSignalConditions &conditions, // string _symbol, ENUM_TIMEFRAMES _period, // XC121SMCCycleHelper *triggerCycleHelper, XC121SMCCycleHelper *decisionCycleHelper, XC121SMCCycleHelper *analyseCycleHelper, XC121SMCCycleHelper *verificationCycleHelper, XC121SMCCycleHelper *consolidationCycleHelper, XC121SMCCycleHelper *visionCycleHelper, // int maxAllowedSetupAge = 60 // // ) { // bool result = false; // result = conditions.IsSetuped(); if (!result) { return result; } // datetime setupTime = conditions.setupTime; ENUM_X_DIRECTION setupDir = conditions.dir; // bool isBullish = false; bool isBearish = false; // int zIndex = 0; int cIndex = zIndex + 1; int pIndex = cIndex + 1; int ppIndex = pIndex + 1; // int loopback = 10; // ENUM_X_121_SMC_PROVIDERS provider = X_121_SMC_PROVIDER_SMPV; string providerStr = ToString(provider); // string symbol = _symbol; ENUM_TIMEFRAMES period = _period; // XOHCL zBar; result = zBar.Init( symbol, period, zIndex // ); if (!result) { return result; } // XOHCL cBar; result = cBar.Init( symbol, period, cIndex // ); if (!result) { return result; } // double ask = GetAsk(symbol); double bid = GetBid(symbol); datetime cTime = TimeCurrent(); // double ll = cBar.FindLowest(9, MODE_LOW); double hh = cBar.FindHighest(9, MODE_HIGH); // int zoneValidationDivider = 10; int validPivotRepetition = triggerCycleHelper.mX121Helper .GetDonChainLength(); // double selectedSL = 0; // // Cycles Conditions ... // // Trigger ... ENUM_XPOI_EVENTS triggerPoiEvents[]; ENUM_X_CYCLE_EVENTS triggerCycleEvents[]; X121SMCCycleConditions triggerConditions; result = triggerCycleHelper.GetConditions( triggerCycleEvents, triggerPoiEvents, triggerConditions, zIndex, loopback // ); if (!result) { return result; } // // Decision ... ENUM_XPOI_EVENTS decisionPoiEvents[]; ENUM_X_CYCLE_EVENTS decisionCycleEvents[]; X121SMCCycleConditions decisionConditions; result = decisionCycleHelper.GetConditions( decisionCycleEvents, decisionPoiEvents, decisionConditions, zIndex, loopback // ); if (!result) { return result; } // // Analyse ... ENUM_XPOI_EVENTS analysePoiEvents[]; ENUM_X_CYCLE_EVENTS analyseCycleEvents[]; X121SMCCycleConditions analyseConditions; result = analyseCycleHelper.GetConditions( analyseCycleEvents, analysePoiEvents, analyseConditions, zIndex, loopback // ); if (!result) { return result; } // // Verification ... ENUM_XPOI_EVENTS verificationPoiEvents[]; ENUM_X_CYCLE_EVENTS verificationCycleEvents[]; X121SMCCycleConditions verificationConditions; result = verificationCycleHelper.GetConditions( verificationCycleEvents, verificationPoiEvents, verificationConditions, zIndex, loopback // ); if (!result) { return result; } // // Consolidation ... ENUM_XPOI_EVENTS consolidationPoiEvents[]; ENUM_X_CYCLE_EVENTS consolidationCycleEvents[]; X121SMCCycleConditions consolidationConditions; result = consolidationCycleHelper.GetConditions( consolidationCycleEvents, consolidationPoiEvents, consolidationConditions, zIndex, loopback // ); if (!result) { return result; } // // Vision ... ENUM_XPOI_EVENTS visionPoiEvents[]; ENUM_X_CYCLE_EVENTS visionCycleEvents[]; X121SMCCycleConditions visionConditions; result = visionCycleHelper.GetConditions( visionCycleEvents, visionPoiEvents, visionConditions, zIndex, loopback // ); if (!result) { return result; } // // Cycles POI States ... XPOIState triggerState = triggerConditions.state; XPOIState decisionState = decisionConditions.state; XPOIState analyseState = analyseConditions.state; XPOIState verificationState = verificationConditions.state; XPOIState consolidationState = consolidationConditions.state; XPOIState visionState = visionConditions.state; // // Trigger Conditions ... XCFVG *iFVG = conditions.activeFVG; result = iFVG != NULL && iFVG.IsValid(); if (!result) { return result; } // bool lookupLong = IsBullish(setupDir) && iFVG.IsBullish(); bool lookupShort = IsBearish(setupDir) && iFVG.IsBearish(); result = lookupLong || lookupShort; if (!result) { return result; } // // Check PEAKS and Vales ... // // Trigger ... // // Peaks and Vales ... double triggerPeak = triggerConditions.x121Conditions.peaksBuffer[1]; double triggerVale = triggerConditions.x121Conditions.valesBuffer[1]; // bool isTriggerPeakInsideFVG = // triggerPeak <= iFVG.Upper() && triggerPeak >= iFVG.Lower() // ; bool isTriggerValeInsideFVG = // triggerVale <= iFVG.Upper() && triggerVale >= iFVG.Lower() // ; // // VWap ... // bool isTriggerVWapFastBullish = triggerConditions.x121Conditions.isVWapFastBullish; bool isTriggerVWapMidBullish = triggerConditions.x121Conditions.isVWapMidBullish; bool isTriggerVWapSlowBullish = triggerConditions.x121Conditions.isVWapSlowBullish; // bool isTriggerVWapFastOverMid = triggerConditions.x121Conditions.isVWapFastOverMid; bool isTriggerVWapMidOverSlow = triggerConditions.x121Conditions.isVWapMidOverSlow; // bool isTriggerVWapFastBearish = triggerConditions.x121Conditions.isVWapFastBearish; bool isTriggerVWapMidBearish = triggerConditions.x121Conditions.isVWapMidBearish; bool isTriggerVWapSlowBearish = triggerConditions.x121Conditions.isVWapSlowBearish; // bool isTriggerVWapFastUnderMid = triggerConditions.x121Conditions.isVWapFastUnderMid; bool isTriggerVWapMidUnderSlow = triggerConditions.x121Conditions.isVWapMidUnderSlow; // bool isTriggerMarketBullish = // // State ... ( // (isTriggerVWapFastBullish && isTriggerVWapMidBullish && isTriggerVWapSlowBullish) // || // (isTriggerVWapMidBullish && isTriggerVWapSlowBullish) // ) // && // // Order ... ( // (isTriggerVWapFastOverMid && isTriggerVWapMidOverSlow) // || // isTriggerVWapMidOverSlow // ) // ; // bool isTriggerMarketBearish = // // State ... ( // (isTriggerVWapFastBearish && isTriggerVWapMidBearish && isTriggerVWapSlowBearish) // || // (isTriggerVWapMidBearish && isTriggerVWapSlowBearish) // ) // && // // Order ... ( // (isTriggerVWapFastUnderMid && isTriggerVWapMidUnderSlow) // || // isTriggerVWapMidUnderSlow // ) // ; // // Decision ... // double decisionPeak = decisionConditions.x121Conditions.peaksBuffer[1]; double decisionVale = decisionConditions.x121Conditions.valesBuffer[1]; // bool isDecisionPeakInsideFVG = // decisionPeak <= iFVG.Upper() && decisionPeak >= iFVG.Lower() // ; bool isDecisionValeInsideFVG = // decisionVale <= iFVG.Upper() && decisionVale >= iFVG.Lower() // ; // // VWap ... // bool isDecisionVWapFastBullish = decisionConditions.x121Conditions.isVWapFastBullish; bool isDecisionVWapMidBullish = decisionConditions.x121Conditions.isVWapMidBullish; bool isDecisionVWapSlowBullish = decisionConditions.x121Conditions.isVWapSlowBullish; // bool isDecisionVWapFastOverMid = decisionConditions.x121Conditions.isVWapFastOverMid; bool isDecisionVWapMidOverSlow = decisionConditions.x121Conditions.isVWapMidOverSlow; // bool isDecisionVWapFastBearish = decisionConditions.x121Conditions.isVWapFastBearish; bool isDecisionVWapMidBearish = decisionConditions.x121Conditions.isVWapMidBearish; bool isDecisionVWapSlowBearish = decisionConditions.x121Conditions.isVWapSlowBearish; // bool isDecisionVWapFastUnderMid = decisionConditions.x121Conditions.isVWapFastUnderMid; bool isDecisionVWapMidUnderSlow = decisionConditions.x121Conditions.isVWapMidUnderSlow; // bool isDecisionMarketBullish = // // State ... ( // (isDecisionVWapFastBullish && isDecisionVWapMidBullish && isDecisionVWapSlowBullish) // || // (isDecisionVWapMidBullish && isDecisionVWapSlowBullish) // ) // && // // Order ... ( // (isDecisionVWapFastOverMid && isDecisionVWapMidOverSlow) // || // isDecisionVWapMidOverSlow // ) // ; // bool isDecisionMarketBearish = // // State ... ( // (isDecisionVWapFastBearish && isDecisionVWapMidBearish && isDecisionVWapSlowBearish) // || // (isDecisionVWapMidBearish && isDecisionVWapSlowBearish) // ) // && // // Order ... ( // (isDecisionVWapFastUnderMid && isDecisionVWapMidUnderSlow) // || // isDecisionVWapMidUnderSlow // ) // ; // // Analyse ... // double analysePeak = analyseConditions.x121Conditions.peaksBuffer[1]; double analyseVale = analyseConditions.x121Conditions.valesBuffer[1]; // bool isAnalysePeakInsideFVG = // analysePeak <= iFVG.Upper() && analysePeak >= iFVG.Lower() // ; bool isAnalyseValeInsideFVG = // analyseVale <= iFVG.Upper() && analyseVale >= iFVG.Lower() // ; // // VWap ... // bool isAnalyseVWapFastBullish = analyseConditions.x121Conditions.isVWapFastBullish; bool isAnalyseVWapMidBullish = analyseConditions.x121Conditions.isVWapMidBullish; bool isAnalyseVWapSlowBullish = analyseConditions.x121Conditions.isVWapSlowBullish; // bool isAnalyseVWapFastOverMid = analyseConditions.x121Conditions.isVWapFastOverMid; bool isAnalyseVWapMidOverSlow = analyseConditions.x121Conditions.isVWapMidOverSlow; // bool isAnalyseVWapFastBearish = analyseConditions.x121Conditions.isVWapFastBearish; bool isAnalyseVWapMidBearish = analyseConditions.x121Conditions.isVWapMidBearish; bool isAnalyseVWapSlowBearish = analyseConditions.x121Conditions.isVWapSlowBearish; // bool isAnalyseVWapFastUnderMid = analyseConditions.x121Conditions.isVWapFastUnderMid; bool isAnalyseVWapMidUnderSlow = analyseConditions.x121Conditions.isVWapMidUnderSlow; // bool isAnalyseMarketBullish = // // State ... ( // (isAnalyseVWapFastBullish && isAnalyseVWapMidBullish && isAnalyseVWapSlowBullish) // || // (isAnalyseVWapMidBullish && isAnalyseVWapSlowBullish) // ) // && // // Order ... ( // (isAnalyseVWapFastOverMid && isAnalyseVWapMidOverSlow) // || // isAnalyseVWapMidOverSlow // ) // ; // bool isAnalyseMarketBearish = // // State ... ( // (isAnalyseVWapFastBearish && isAnalyseVWapMidBearish && isAnalyseVWapSlowBearish) // || // (isAnalyseVWapMidBearish && isAnalyseVWapSlowBearish) // ) // && // // Order ... ( // (isAnalyseVWapFastUnderMid && isAnalyseVWapMidUnderSlow) // || // isAnalyseVWapMidUnderSlow // ) // ; // // Verification ... // double verificationPeak = verificationConditions.x121Conditions.peaksBuffer[1]; double verificationVale = verificationConditions.x121Conditions.valesBuffer[1]; // bool isVerificationPeakInsideFVG = // verificationPeak <= iFVG.Upper() && verificationPeak >= iFVG.Lower() // ; bool isVerificationValeInsideFVG = // verificationVale <= iFVG.Upper() && verificationVale >= iFVG.Lower() // ; // // VWap ... // bool isVerificationVWapFastBullish = verificationConditions.x121Conditions.isVWapFastBullish; bool isVerificationVWapMidBullish = verificationConditions.x121Conditions.isVWapMidBullish; bool isVerificationVWapSlowBullish = verificationConditions.x121Conditions.isVWapSlowBullish; // bool isVerificationVWapFastOverMid = verificationConditions.x121Conditions.isVWapFastOverMid; bool isVerificationVWapMidOverSlow = verificationConditions.x121Conditions.isVWapMidOverSlow; // bool isVerificationVWapFastBearish = verificationConditions.x121Conditions.isVWapFastBearish; bool isVerificationVWapMidBearish = verificationConditions.x121Conditions.isVWapMidBearish; bool isVerificationVWapSlowBearish = verificationConditions.x121Conditions.isVWapSlowBearish; // bool isVerificationVWapFastUnderMid = verificationConditions.x121Conditions.isVWapFastUnderMid; bool isVerificationVWapMidUnderSlow = verificationConditions.x121Conditions.isVWapMidUnderSlow; // bool isVerificationMarketBullish = // // State ... ( // (isVerificationVWapFastBullish && isVerificationVWapMidBullish && isVerificationVWapSlowBullish) // || // (isVerificationVWapMidBullish && isVerificationVWapSlowBullish) // ) // && // // Order ... ( // (isVerificationVWapFastOverMid && isVerificationVWapMidOverSlow) // || // isVerificationVWapMidOverSlow // ) // ; // bool isVerificationMarketBearish = // // State ... ( // (isVerificationVWapFastBearish && isVerificationVWapMidBearish && isVerificationVWapSlowBearish) // || // (isVerificationVWapMidBearish && isVerificationVWapSlowBearish) // ) // && // // Order ... ( // (isVerificationVWapFastUnderMid && isVerificationVWapMidUnderSlow) // || // isVerificationVWapMidUnderSlow // ) // ; // // Consolidation ... // double consolidationPeak = consolidationConditions.x121Conditions.peaksBuffer[1]; double consolidationVale = consolidationConditions.x121Conditions.valesBuffer[1]; // bool isConsolidationPeakInsideFVG = // consolidationPeak <= iFVG.Upper() && consolidationPeak >= iFVG.Lower() // ; bool isConsolidationValeInsideFVG = // consolidationVale <= iFVG.Upper() && consolidationVale >= iFVG.Lower() // ; // // VWap ... // bool isConsolidationVWapFastBullish = consolidationConditions.x121Conditions.isVWapFastBullish; bool isConsolidationVWapMidBullish = consolidationConditions.x121Conditions.isVWapMidBullish; bool isConsolidationVWapSlowBullish = consolidationConditions.x121Conditions.isVWapSlowBullish; // bool isConsolidationVWapFastOverMid = consolidationConditions.x121Conditions.isVWapFastOverMid; bool isConsolidationVWapMidOverSlow = consolidationConditions.x121Conditions.isVWapMidOverSlow; // bool isConsolidationVWapFastBearish = consolidationConditions.x121Conditions.isVWapFastBearish; bool isConsolidationVWapMidBearish = consolidationConditions.x121Conditions.isVWapMidBearish; bool isConsolidationVWapSlowBearish = consolidationConditions.x121Conditions.isVWapSlowBearish; // bool isConsolidationVWapFastUnderMid = consolidationConditions.x121Conditions.isVWapFastUnderMid; bool isConsolidationVWapMidUnderSlow = consolidationConditions.x121Conditions.isVWapMidUnderSlow; // bool isConsolidationMarketBullish = // // State ... ( // (isConsolidationVWapFastBullish && isConsolidationVWapMidBullish && isConsolidationVWapSlowBullish) // || // (isConsolidationVWapMidBullish && isConsolidationVWapSlowBullish) // ) // && // // Order ... ( // (isConsolidationVWapFastOverMid && isConsolidationVWapMidOverSlow) // || // isConsolidationVWapMidOverSlow // ) // ; // bool isConsolidationMarketBearish = // // State ... ( // (isConsolidationVWapFastBearish && isConsolidationVWapMidBearish && isConsolidationVWapSlowBearish) // || // (isConsolidationVWapMidBearish && isConsolidationVWapSlowBearish) // ) // && // // Order ... ( // (isConsolidationVWapFastUnderMid && isConsolidationVWapMidUnderSlow) // || // isConsolidationVWapMidUnderSlow // ) // ; // // Sar ... // bool isSarSwitchedToBullish = triggerConditions.x121Conditions.isSarSwitchedToBullish; bool isSarSwitchedToBearish = triggerConditions.x121Conditions.isSarSwitchedToBearish; // // Summarize Conditions ... // bool isSamePeak = triggerPeak == decisionPeak && triggerPeak == analysePeak && triggerPeak == verificationPeak; // bool isPeaksInsideFVG = // isTriggerPeakInsideFVG && isDecisionPeakInsideFVG && isAnalysePeakInsideFVG && isVerificationPeakInsideFVG // ; // bool isSameVale = triggerVale == decisionVale && triggerVale == analyseVale && triggerVale == verificationVale; // bool isValesInsideFVG = // isTriggerValeInsideFVG && isDecisionValeInsideFVG && isAnalyseValeInsideFVG && isVerificationValeInsideFVG // ; // bool isMarketReadyForLong = // // !isTriggerMarketBearish && // !isDecisionMarketBearish && !isAnalyseMarketBearish && !isVerificationMarketBearish && !isConsolidationMarketBearish // ; // bool isMarketReadyForShort = // // !isTriggerMarketBullish && // !isDecisionMarketBullish && !isAnalyseMarketBullish && !isVerificationMarketBullish && !isConsolidationMarketBullish // ; // // Create Trigger ... // isBullish = // isSameVale && lookupLong && isValesInsideFVG && isMarketReadyForLong && isSarSwitchedToBullish && triggerVale <= iFVG.Upper() && triggerVale >= iFVG.Lower(); // isBearish = // isSamePeak && lookupShort && isPeaksInsideFVG && isMarketReadyForShort && isSarSwitchedToBearish && triggerPeak <= iFVG.Upper() && triggerPeak >= iFVG.Lower(); // result = isBullish || isBearish; if (!result) { // // Cleanup Setup Conditions ... int setupAge = conditions.GetSetupAge(); if (IsValidSize(setupAge) && IsValidSize(maxAllowedSetupAge) && setupAge >= maxAllowedSetupAge) { conditions.Clean(); } // return result; } // conditions.triggerTime = cTime; conditions.sl = isBullish ? iFVG.Lower() : iFVG.Upper(); conditions.type = isBullish ? X_POSITION_TYPE_LONG : X_POSITION_TYPE_SHORT; // return result; } // // Tools Functions ... //