/////////////////////////////////////////////////////// // // 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 X121SMCStrategyXVWPBSignalConditions { // // Props ... // string symbol; ENUM_TIMEFRAMES period; // double sl; double target; ENUM_X_DIRECTION dir; ENUM_X_POSITION_TYPES type; // // Setup Props ... // datetime setupTime; datetime triggerTime; // // Constructor ... X121SMCStrategyXVWPBSignalConditions() { Clean(); } // // Tools ... /** * Cleaning Up ... */ void Clean() { // sl = 0; target = 0; // dir = X_DIRECTION_NONE; type = X_POSITION_TYPE_NONE; // symbol = NULL; period = NULL; setupTime = NULL; triggerTime = NULL; // ExtensionClean(); } /** * 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 ... /** * Clean Additional Properties ... */ void ExtensionClean() { } // }; // // Extension Functions ... // // Detect Setup Conditions ... bool DetectX121SMCXVWPBSiganlSetup( string _symbol, ENUM_TIMEFRAMES _period, // X121SMCStrategyXVWPBSignalConditions &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; } // XOHCL pBar; result = pBar.Init( symbol, period, pIndex // ); 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; // // Setup Conditions ... // // Detect Market Trend ... // ENUM_X_DIRECTION trend; // bool hasTrend = consolidationCycleHelper // .DetectTrend(trend); // bool hasBullishTrend = hasTrend && // IsBullish(trend); // bool hasBearishTrend = hasTrend && // IsBearish(trend); // result = hasBullishTrend || // hasBearishTrend; // if (!result) // { // return result; // } // // Detect VWAP Bearish ... // double vwapFast = triggerConditions.x121Conditions.vwapFastBuffer[1]; double vwapMid = triggerConditions.x121Conditions.vwapMidBuffer[1]; double vwapSlow = triggerConditions.x121Conditions.vwapSlowBuffer[1]; // double vwaps[3] = { vwapFast, vwapMid, vwapSlow, }; double vwapMax = GetMax(vwaps); double vwapMin = GetMin(vwaps); // bool isCloseOverVwapMax = // ask > vwapMax && bid > vwapMax && (cBar.low > vwapMax || cBar.close > vwapMax) // ; // bool isCloseUnderVwapMin = // ask < vwapMin && bid < vwapMin && (cBar.high < vwapMin || cBar.close < vwapMin) // ; // bool isVWapBullishState = triggerConditions.x121Conditions.isVWapBullishState; bool isVWapSwitchedToBullishState = triggerConditions.x121Conditions.isVWapSwitchedToBullishState; // bool isVWapBearishState = triggerConditions.x121Conditions.isVWapBearishState; bool isVWapSwitchedToBearishState = triggerConditions.x121Conditions.isVWapSwitchedToBearishState; // bool isVWapBullishOrdered = triggerConditions.x121Conditions.isVWapBullishOrdered; bool isVWapSwitchedToBullishOrdered = triggerConditions.x121Conditions.isVWapSwitchedToBullishOrdered; // bool isVWapBearishOrdered = triggerConditions.x121Conditions.isVWapBearishOrdered; bool isVWapSwitchedToBearishOrdered = triggerConditions.x121Conditions.isVWapSwitchedToBearishOrdered; // // Summary VWap ... // bool isVwapBullishFormed = // isVWapSwitchedToBullishState // isCloseOverVwapMax // // // && // // ( // // // // (isVWapBullishOrdered && // // isVWapSwitchedToBullishState) // // // // // || // // // // // (isVWapBullishState && // // isVWapSwitchedToBullishOrdered) // // // ) // ; // bool isVwapBearishFormed = // isVWapSwitchedToBearishState // isCloseUnderVwapMin // // // && // // ( // // // // (isVWapBearishOrdered && // // isVWapSwitchedToBearishState) // // // // // || // // // // // (isVWapBearishState && // // isVWapSwitchedToBearishOrdered) // // // ) // ; // isBullish = // hasBullishTrend && isVwapBullishFormed; // isBearish = // hasBearishTrend && isVwapBearishFormed; // result = isBullish || isBearish; // // if (!result) // { // return result; // } // // // double sar = triggerConditions.x121Conditions.sarBuffer[1]; // // // bool isSarBullish = triggerConditions.x121Conditions.isSarBullish; // bool isSarSwitchedToBullish = triggerConditions.x121Conditions.isSarSwitchedToBullish; // // // bool isSarBearish = triggerConditions.x121Conditions.isSarBearish; // bool isSarSwitchedToBearish = triggerConditions.x121Conditions.isSarSwitchedToBearish; // // // bool isSarBullishFormed = isSarBullish || // isSarSwitchedToBullish; // // // bool isSarBearishFormed = isSarBearish || // isSarSwitchedToBearish; // // // isBullish = // isBullish && // isSarBullishFormed; // // // isBearish = // isBearish && // isSarBearishFormed; // // // result = isBullish || // isBearish; // if (!result) // { // return result; // } // // // // Detect Pull Backs ... // // // bool isSignalBarBullishPullBackFormed = // cBar.IsBearish() && // pBar.IsBullish() && // cBar.low > pBar.low; // // // bool isSignalBarBearishPullBackFormed = // cBar.IsBullish() && // pBar.IsBearish() && // cBar.high < pBar.high; // // // // Summary Pull Backs ... // // // bool isBullishBarFormed = // isSignalBarBullishPullBackFormed; // // // bool isBearishhBarFormed = // isSignalBarBearishPullBackFormed; // // // isBullish = // isBullish && // isBullishBarFormed; // // // isBearish = // isBearish && // isBearishhBarFormed; // // // result = isBullish || // isBearish; // if (!result) // { // return result; // } // // // isBullish = // // // false // // // ; // // // isBearish = // // // false // // // ; // result = isBullish || isBearish; if (!result) { // // Clean Conditions for Regenerate ... // return result; } // conditions.setupTime = cTime; conditions.dir = isBullish ? X_DIRECTION_BULLISH : X_DIRECTION_BEARISH; // return result; } // // Detect Trigger Conditions ... bool DetectX121SMCXVWPBSiganlTrigger( // X121SMCStrategyXVWPBSignalConditions &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; // 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; } // XOHCL pBar; result = pBar.Init( symbol, period, pIndex // ); 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 ... // double vwapFast = triggerConditions.x121Conditions.vwapFastBuffer[1]; double vwapMid = triggerConditions.x121Conditions.vwapMidBuffer[1]; double vwapSlow = triggerConditions.x121Conditions.vwapSlowBuffer[1]; // double vwaps[3] = { vwapFast, vwapMid, vwapSlow, }; double vwapMax = GetMax(vwaps); double vwapMin = GetMin(vwaps); // bool isNewPeak = triggerConditions.x121Conditions.isNewPeak; bool isNewPeakOverLast = triggerConditions.x121Conditions.isNewPeakOverLast; bool isNewPeakUnderLast = triggerConditions.x121Conditions.isNewPeakUnderLast; // bool isNewVale = triggerConditions.x121Conditions.isNewVale; bool isNewValeOverLast = triggerConditions.x121Conditions.isNewValeOverLast; bool isNewValeUnderLast = triggerConditions.x121Conditions.isNewValeUnderLast; // double triggerPeak = triggerConditions.x121Conditions.peaksBuffer[1]; double decisionPeak = decisionConditions.x121Conditions.peaksBuffer[1]; double analysePeak = analyseConditions.x121Conditions.peaksBuffer[1]; double verificationPeak = verificationConditions.x121Conditions.peaksBuffer[1]; double consolidationPeak = consolidationConditions.x121Conditions.peaksBuffer[1]; // double triggerVale = triggerConditions.x121Conditions.valesBuffer[1]; double decisionVale = decisionConditions.x121Conditions.valesBuffer[1]; double analyseVale = analyseConditions.x121Conditions.valesBuffer[1]; double verificationVale = verificationConditions.x121Conditions.valesBuffer[1]; double consolidationVale = consolidationConditions.x121Conditions.valesBuffer[1]; // bool isPeaksSameFormed = // ( // triggerPeak == decisionPeak // ) // || // ( // triggerPeak == decisionPeak && triggerPeak == analysePeak // ) // || // ( // triggerPeak == decisionPeak && triggerPeak == analysePeak && triggerPeak == verificationPeak // ) // || // ( // triggerPeak == decisionPeak && triggerPeak == analysePeak && triggerPeak == verificationPeak && triggerPeak == consolidationPeak // ) // ; // bool isValesSameFormed = // ( // triggerVale == decisionVale // ) // || // ( // triggerVale == decisionVale && triggerVale == analyseVale // ) // || // ( // triggerVale == decisionVale && triggerVale == analyseVale && triggerVale == verificationVale // ) // || // ( // triggerVale == decisionVale && triggerVale == analyseVale && triggerVale == verificationVale && triggerVale == consolidationVale // ) // ; // isBullish = // isValesSameFormed && IsBullish(setupDir); // isBearish = // isPeaksSameFormed && IsBearish(setupDir); // result = isBullish || isBearish; if (!result) { return result; } // // Check Last VWap State Change ... XValueChange vwapStateChnges[]; int vwapStateChngesCount = triggerCycleHelper .FillVWapStateChanges(vwapStateChnges); XValueChange lastVWapStateChnged; bool hasLastVWapStateChanged = false; if (IsValidSize(vwapStateChngesCount) && vwapStateChngesCount >= 2) { // lastVWapStateChnged = vwapStateChnges[vwapStateChngesCount - 2]; hasLastVWapStateChanged = lastVWapStateChnged.IsValid(); } // double donOpenUpper = triggerConditions.x121Conditions.donOpenUpperBuffer[1]; double donOpenLower = triggerConditions.x121Conditions.donOpenLowerBuffer[1]; // double donCloseUpper = triggerConditions.x121Conditions.donCloseUpperBuffer[1]; double donCloseLower = triggerConditions.x121Conditions.donCloseLowerBuffer[1]; // bool isDonUpperBullish = donCloseUpper > donOpenUpper; bool isDonUpperBearish = donCloseUpper < donOpenUpper; // bool isDonLowerBullish = donCloseLower > donOpenLower; bool isDonLowerBearish = donCloseLower < donOpenLower; // bool isDonBullishFormed = // (isDonUpperBullish || isDonLowerBullish) // ; // bool isDonBearishFormed = // (isDonUpperBearish || isDonLowerBearish) // ; // isBullish = (isNewValeOverLast || isNewPeakOverLast) && isDonBullishFormed && hasLastVWapStateChanged && (isBullish && IsBullish(lastVWapStateChnged.dir)); // isBearish = (isNewPeakUnderLast || isNewValeUnderLast) && isDonBearishFormed && hasLastVWapStateChanged && (isBearish && IsBearish(lastVWapStateChnged.dir)); // result = isBullish || isBearish; if (!result) { // // Cleanup Setup Conditions ... int setupAge = conditions.GetSetupAge(); if (IsValidSize(setupAge) && IsValidSize(maxAllowedSetupAge) && setupAge >= maxAllowedSetupAge) { conditions.Clean(); } // return result; } // // Selecting SL ... // double longSL = 0; double shortSL = 0; double entry = GetEntry( conditions.symbol, setupDir // ); // double longDistance = MathAbs(vwapMax - MathMax(triggerVale, donCloseLower)) / 2; double shortDistance = MathAbs(vwapMin - MathMin(triggerPeak, donCloseUpper)) / 2; // longSL = entry - longDistance; shortSL = entry + shortDistance; // conditions.triggerTime = cTime; conditions.sl = isBullish ? vwapMin : vwapMax; conditions.type = isBullish ? X_POSITION_TYPE_LONG : X_POSITION_TYPE_SHORT; // return result; } //