/////////////////////////////////////////////////////// // // 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; // // Bullish Order Blocks ... datetime bullishOrderBlockTime; XCOrderBlock *bullishOrderBlock; // // Bearish Order Blocks ... XCOrderBlock *bearishOrderBlock; datetime bearishOrderBlockTime; // // 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; // // Additional ... // bullishOrderBlock = NULL; bearishOrderBlock = NULL; bullishOrderBlockTime = NULL; bearishOrderBlockTime = NULL; } /** * 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; } /** * 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 ... bool HasBullishOrderBlock() { // bool result = bullishOrderBlock != NULL && bullishOrderBlock.IsValid() && bullishOrderBlock.IsBullish() && IsValid(bullishOrderBlockTime); // return result; } bool HasBearishOrderBlock() { // bool result = bearishOrderBlock != NULL && bearishOrderBlock.IsValid() && bearishOrderBlock.IsBullish() && IsValid(bearishOrderBlockTime); // return result; } bool HasOrderBlock() { // bool result = HasBullishOrderBlock() && HasBearishOrderBlock(); // return result; } // }; // // 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; // // Check Order Block ... // TODO: Later ... // bool hasOrderBlock = conditions.HasOrderBlock(); // if (hasOrderBlock) // { // // // DetectX121SMCTestSiganlOrderBlock( // zBar, // consolidationState, // conditions // // ); // } // bool isMarketBullish = // // VWap State ... decisionConditions.x121Conditions.isVWapBullishState && analyseConditions.x121Conditions.isVWapBullishState && verificationConditions.x121Conditions.isVWapBullishState // && // // VWap Order ... decisionConditions.x121Conditions.isVWapBullishOrdered && analyseConditions.x121Conditions.isVWapBullishOrdered && verificationConditions.x121Conditions.isVWapBullishOrdered // && // // Sar ... decisionConditions.x121Conditions.isSarBullish && analyseConditions.x121Conditions.isSarBullish && verificationConditions.x121Conditions.isSarBullish // ; // bool isMarketBearish = // // VWap State ... decisionConditions.x121Conditions.isVWapBearishState && analyseConditions.x121Conditions.isVWapBearishState && verificationConditions.x121Conditions.isVWapBearishState // && // // VWap Order ... decisionConditions.x121Conditions.isVWapBearishOrdered && analyseConditions.x121Conditions.isVWapBearishOrdered && verificationConditions.x121Conditions.isVWapBearishOrdered // && // // Sar ... decisionConditions.x121Conditions.isSarBearish && analyseConditions.x121Conditions.isSarBearish && verificationConditions.x121Conditions.isSarBearish // ; // // Step 1 // Detect Market Direction ... isBullish = isMarketBullish; isBearish = isMarketBearish; // result = isBullish || isBearish; if (!result) { return result; } // // Step 2 // VWap Switches or Sar Switches ... // bool isSarBullish = triggerConditions.x121Conditions.isSarBullish; bool isSarBearish = triggerConditions.x121Conditions.isSarBearish; // bool isSarSwitchedToBullish = triggerConditions.x121Conditions.isSarSwitchedToBullish; bool isSarSwitchedToBearish = triggerConditions.x121Conditions.isSarSwitchedToBearish; // bool isVWapBullishState = triggerConditions.x121Conditions.isVWapBullishState; bool isVWapBearishState = triggerConditions.x121Conditions.isVWapBearishState; // bool isVWapSwitchedToBullishState = triggerConditions.x121Conditions.isVWapSwitchedToBullishState; bool isVWapSwitchedToBearishState = triggerConditions.x121Conditions.isVWapSwitchedToBearishState; // bool isVWapBullishOrdered = triggerConditions.x121Conditions.isVWapBullishOrdered; bool isVWapBearishOrdered = triggerConditions.x121Conditions.isVWapBearishOrdered; // bool isVWapSwitchedToBullishOrdered = triggerConditions.x121Conditions.isVWapSwitchedToBullishOrdered; bool isVWapSwitchedToBearishOrdered = triggerConditions.x121Conditions.isVWapSwitchedToBearishOrdered; // // // // bool isSarStartedBullishStructure = // isSarSwitchedToBullish && isVWapBullishState && isVWapBullishOrdered // ; // bool isSarStartedBearishStructure = // isSarSwitchedToBearish && isVWapBearishState && isVWapBearishOrdered // ; // // // // bool isVWapStateStartedBullishStructure = // isVWapSwitchedToBullishState && isSarBullish && isVWapBullishOrdered // ; // bool isVWapStateStartedBearishStructure = // isVWapSwitchedToBearishState && isSarBearish && isVWapBearishOrdered // ; // // // // bool isVWapOrderStartedBullishStructure = // isVWapSwitchedToBullishOrdered && isSarBullish && isVWapBullishState // ; // bool isVWapOrderStartedBearishStructure = // isVWapSwitchedToBearishOrdered && isSarBearish && isVWapBearishState // ; // // // // isBullish = // isBullish // && // ( // isSarStartedBullishStructure || isVWapStateStartedBullishStructure || isVWapOrderStartedBullishStructure // ) // ; // isBearish = // isBearish // && // ( // isSarStartedBearishStructure || isVWapStateStartedBearishStructure || isVWapOrderStartedBearishStructure // ) // ; // result = isBullish || isBearish; if (!result) { 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 // ) { // bool result = false; // result = conditions.IsSetuped(); if (!result) { return result; } // 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; // result = false; // return result; } // // Tools Functions ... // // We Have to Find Valid Order Blocks ... // - Order Block Must Not Touched; bool DetectX121SMCTestSiganlOrderBlock( XOHCL &bar, XPOIState &state, X121SMCStrategyTestSignalConditions &conditions // ) { // bool result = false; // result = bar.IsValid() && state.IsValid() && state.HasChild(); if (!result) { return result; } // int start = bar.Index(); // // Bullish Order Block Check ... bool hasBullishOB = conditions.HasBullishOrderBlock(); if (!hasBullishOB) { // int count = state.CountBullishOrderBlocks(); result = IsValidSize(count); if (!result) { return result; } // XCOrderBlock *tmpOB[]; for (int i = 0; i < count; i++) { // XCOrderBlock *iOB = state.bullishOrderBlocks[i]; // bool isOBTouched = DetectOrderBlockTouch(iOB); } // hasBullishOB = conditions.HasBullishOrderBlock(); result = hasBullishOB; if (!result) { return result; } } // // Bearish Order Block Check ... bool hasBearishOB = conditions.HasBearishOrderBlock(); if (!hasBearishOB) { // // hasBearishOB = conditions.HasBearishOrderBlock(); result = hasBearishOB; if (!result) { return result; } } // return result; } // // TODO: Complete this ... bool DetectOrderBlockTouch( XCOrderBlock *ob // ) { // bool result = false; // result = ob != NULL && ob.IsValid(); if (!result) { return result; } // return result; } //