From c6cfd9b115536c5fa762308fcd36d67fc403eeec Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Fri, 10 Jan 2025 18:48:58 +0330 Subject: [PATCH] last ... --- X121SMCEA/Libraries/x-121.smc.lib.mq5 | 11 + .../Signals/x-121.smc.xobgpv.signal.lib.mq5 | 7 +- ...py.mq5 => x-121.smc.xobspv.signal.lib.mq5} | 417 ++++++++++-------- .../Strategy/x-121.smc.strategy.class.mq5 | 289 +++++++++++- 4 files changed, 538 insertions(+), 186 deletions(-) rename X121SMCEA/Signals/{x-121.smc.xtwpv.signal.lib copy.mq5 => x-121.smc.xobspv.signal.lib.mq5} (69%) diff --git a/X121SMCEA/Libraries/x-121.smc.lib.mq5 b/X121SMCEA/Libraries/x-121.smc.lib.mq5 index d1ac52ea..58fddb57 100644 --- a/X121SMCEA/Libraries/x-121.smc.lib.mq5 +++ b/X121SMCEA/Libraries/x-121.smc.lib.mq5 @@ -37,6 +37,7 @@ const string X121SMCStrategyToken = "X121SMC"; // const string X121SMCXTestToken = "X121XTest"; const string X121SMCXOBGPVToken = "X121XOBGPV"; +const string X121SMCXOBSPVToken = "X121XOBSPV"; // // X121 SMC Providers ... @@ -46,6 +47,7 @@ enum ENUM_X_121_SMC_PROVIDERS X_121_SMC_PROVIDER_NONE, X_121_SMC_PROVIDER_XTEST, X_121_SMC_PROVIDER_XOBGPV, + X_121_SMC_PROVIDER_XOBSPV, }; // @@ -677,6 +679,11 @@ string ToString(ENUM_X_121_SMC_PROVIDERS value) case X_121_SMC_PROVIDER_XOBGPV: result = X121SMCXOBGPVToken; break; + + // + case X_121_SMC_PROVIDER_XOBSPV: + result = X121SMCXOBSPVToken; + break; } // @@ -710,6 +717,10 @@ ENUM_X_121_SMC_PROVIDERS ParseProvider(string value) { result = X_121_SMC_PROVIDER_XOBGPV; } + else if (Contains(X121SMCXOBSPVToken, value)) + { + result = X_121_SMC_PROVIDER_XOBSPV; + } // return result; diff --git a/X121SMCEA/Signals/x-121.smc.xobgpv.signal.lib.mq5 b/X121SMCEA/Signals/x-121.smc.xobgpv.signal.lib.mq5 index a4f961d0..259b64bf 100644 --- a/X121SMCEA/Signals/x-121.smc.xobgpv.signal.lib.mq5 +++ b/X121SMCEA/Signals/x-121.smc.xobgpv.signal.lib.mq5 @@ -2,7 +2,7 @@ // // SaherElm IT Center MQL5 X121 SMC Signal Class // ------------------------------------------------- -// Name: +// Name: XOBGPV // Description: provide all Signalling functions ... // // @@ -184,6 +184,11 @@ struct X121SMCStrategyXOBGPVSignalConditions // }; +// +// Signaller Data Sources ... +X121SMCStrategyXOBGPVSignalConditions mXOBGPVConditions; +X121SMCStrategyXOBGPVSignalConditions mXOBGPVConditionsCollection[]; + // // Extension Functions ... diff --git a/X121SMCEA/Signals/x-121.smc.xtwpv.signal.lib copy.mq5 b/X121SMCEA/Signals/x-121.smc.xobspv.signal.lib.mq5 similarity index 69% rename from X121SMCEA/Signals/x-121.smc.xtwpv.signal.lib copy.mq5 rename to X121SMCEA/Signals/x-121.smc.xobspv.signal.lib.mq5 index 956d5dc7..d8c43cc3 100644 --- a/X121SMCEA/Signals/x-121.smc.xtwpv.signal.lib copy.mq5 +++ b/X121SMCEA/Signals/x-121.smc.xobspv.signal.lib.mq5 @@ -2,7 +2,7 @@ // // SaherElm IT Center MQL5 X121 SMC Signal Class // ------------------------------------------------- -// Name: +// Name: XOBSPV // Description: provide all Signalling functions ... // // @@ -26,7 +26,7 @@ // // Definitions ... -struct X121SMCStrategyXTWPVSignalConditions +struct X121SMCStrategyXOBSPVSignalConditions { // // Props ... @@ -49,11 +49,11 @@ struct X121SMCStrategyXTWPVSignalConditions datetime triggerTime; // - XFVGOrderBlock fvgOB; + double pivot; // // Constructor ... - X121SMCStrategyXTWPVSignalConditions() + X121SMCStrategyXOBSPVSignalConditions() { Clean(); } @@ -164,36 +164,29 @@ struct X121SMCStrategyXTWPVSignalConditions * Clean Additional Properties ... */ void ExtensionClean() - { - fvgOB.Clean(); - } - - /** - * Update Order Blocks Date ... - */ - void UpdateOrderBlocks() { // - datetime cTime = TimeCurrent(); - - // - fvgOB.orderBlock.To(cTime); - fvgOB.fairValueGap.To(cTime); + pivot = 0; } // }; +// +// Signaller Data Sources ... +X121SMCStrategyXOBSPVSignalConditions mXOBSPVConditions; +X121SMCStrategyXOBSPVSignalConditions mXOBSPVConditionsCollection[]; + // // Extension Functions ... // // Detect Setup Conditions ... -bool DetectX121SMCXTWPVSiganlSetup( +bool DetectX121SMCXOBSPVSiganlSetup( string _symbol, ENUM_TIMEFRAMES _period, // - X121SMCStrategyXTWPVSignalConditions &conditions, + X121SMCStrategyXOBSPVSignalConditions &conditions, // XC121SMCCycleHelper *triggerCycleHelper, XC121SMCCycleHelper *decisionCycleHelper, @@ -395,25 +388,191 @@ bool DetectX121SMCXTWPVSiganlSetup( // Setup Conditions ... // - ENUM_X_DIRECTION forDir; - XFVGOrderBlock bullishOrderBlocks[]; - XFVGOrderBlock bearishOrderBlocks[]; - bool isTested = DetectFVGOB( - forDir, - bullishOrderBlocks, - bearishOrderBlocks, - consolidationState, - analyseState // + // Waits for new Peak or Vale ... + + // + // Reading Previous Conditions ... + ENUM_XPOI_EVENTS consolidationPoiEventsPrev[]; + ENUM_X_CYCLE_EVENTS consolidationCycleEventsPrev[]; + X121SMCCycleConditions consolidationConditionsPrev; + result = consolidationCycleHelper.GetConditions( + consolidationCycleEventsPrev, + consolidationPoiEventsPrev, + consolidationConditionsPrev, + cIndex, + loopback // ); + if (!result) + { + return result; + } + + // + bool isStrSwitchedToBullish = analyseConditions.x121Conditions.isStrSwitchedToBullish; + bool isStrSwitchedToBearish = analyseConditions.x121Conditions.isStrSwitchedToBearish; + + // + if (isStrSwitchedToBullish || + isStrSwitchedToBearish) + { + Print("Str State Changed ..."); + } + + // + X121SMCCycleConditions conditionState = consolidationConditions; + X121SMCCycleConditions conditionStatePrev = consolidationConditionsPrev; + + // + XOHCL cCBar; + result = cCBar.Init( + conditionState.symbol, + conditionState.period, + cIndex // + ); + if (!result) + { + return result; + } + + // + XOHCL cPBar; + result = cCBar.GetPreviousBar(cPBar); + if (!result) + { + return result; + } + + // + // Engulf ... + ENUM_X_DIRECTION cCBarEngulfDir; + bool isCCBarEngulfed = consolidationCycleHelper + .mBarAnalyser + .IsEngulfBar( + cCBar, + cCBarEngulfDir, + 0 // Extended ... + ); + bool isCCBarBullishEngulfed = + isCCBarEngulfed && + IsBullish(cCBarEngulfDir); + bool isCCBarBearishEngulfed = + isCCBarEngulfed && + IsBearish(cCBarEngulfDir); + + // + // Momentum ... + ENUM_X_DIRECTION cCBarMomentumDir; + bool isCCBarMomentum = consolidationCycleHelper + .mBarAnalyser + .IsMomentumBar( + cCBar, + cCBarMomentumDir, + 1 // Extended ... + ); + bool isCCBarBullishMomentum = + isCCBarMomentum && + IsBullish(cCBarMomentumDir); + bool isCCBarBearishMomentum = + isCCBarMomentum && + IsBearish(cCBarMomentumDir); + + // + // Reject ... + ENUM_X_DIRECTION cCBarRejectDir; + bool isCCBarRejected = consolidationCycleHelper + .mBarAnalyser + .IsRejectionBar( + cCBar, + cCBarRejectDir, + 1 // Extended ... + ); + bool isCCBarBullishRejected = + isCCBarRejected && + IsBullish(cCBarRejectDir); + bool isCCBarBearishRejected = + isCCBarRejected && + IsBearish(cCBarRejectDir); + + // + // Bar Checking Summary ... + + // + // Bullish ... + bool isCCBarPassedBullish = + // + isCCBarBullishEngulfed || + isCCBarBullishMomentum || + isCCBarBullishRejected + // + ; + + // + // Bearish ... + bool isCCBarPassedBearish = + // + isCCBarBearishEngulfed || + isCCBarBearishMomentum || + isCCBarBearishRejected + // + ; + + // + double cPeakPrev = conditionStatePrev.x121Conditions.peaksBuffer[0]; + double cValePrev = conditionStatePrev.x121Conditions.valesBuffer[0]; + + // + double cPeak = conditionState.x121Conditions.peaksBuffer[1]; + double cVale = conditionState.x121Conditions.valesBuffer[1]; + + // + bool isCPeakSame = cPeak == cPeakPrev; + bool isCValeSame = cVale == cValePrev; + + // + bool isCNewPeakPrev = conditionStatePrev.x121Conditions.isNewPeak; + bool isCNewPeakOverLastPrev = conditionStatePrev.x121Conditions.isNewPeakOverLast; + bool isCNewPeakUnderLastPrev = conditionStatePrev.x121Conditions.isNewPeakUnderLast; + + // + bool isCNewValePrev = conditionStatePrev.x121Conditions.isNewVale; + bool isCNewValeOverLastPrev = conditionStatePrev.x121Conditions.isNewValeOverLast; + bool isCNewValeUnderLastPrev = conditionStatePrev.x121Conditions.isNewValeUnderLast; + + // + bool isCRSIOverSold = conditionState.x121Conditions.isRSIOverSold; + bool isCRSICrossedOverOverSold = conditionState.x121Conditions.isRSICrossedOverOverSold; + bool isCRSICrossedUnderOverSold = conditionState.x121Conditions.isRSICrossedUnderOverSold; + + // + bool isCRSIOverBought = conditionState.x121Conditions.isRSIOverBought; + bool isCRSICrossedOverOverBought = conditionState.x121Conditions.isRSICrossedOverOverBought; + bool isCRSICrossedUnderOverBought = conditionState.x121Conditions.isRSICrossedUnderOverBought; + + // + bool isCRSIOverSoldPrev = conditionStatePrev.x121Conditions.isRSIOverSold; + bool isCRSICrossedOverOverSoldPrev = conditionStatePrev.x121Conditions.isRSICrossedOverOverSold; + bool isCRSICrossedUnderOverSoldPrev = conditionStatePrev.x121Conditions.isRSICrossedUnderOverSold; + + // + bool isCRSIOverBoughtPrev = conditionStatePrev.x121Conditions.isRSIOverBought; + bool isCRSICrossedOverOverBoughtPrev = conditionStatePrev.x121Conditions.isRSICrossedOverOverBought; + bool isCRSICrossedUnderOverBoughtPrev = conditionStatePrev.x121Conditions.isRSICrossedUnderOverBought; // isBullish = - isTested && - IsBullish(forDir); + // + isCNewValePrev && + isCCBarPassedBullish + // + ; + // isBearish = - isTested && - IsBearish(forDir); + // + isCNewPeakPrev && + isCCBarPassedBearish + // + ; // result = isBullish || @@ -424,15 +583,10 @@ bool DetectX121SMCXTWPVSiganlSetup( } // - conditions.dir = forDir; - if (isBullish) - { - conditions.fvgOB = bullishOrderBlocks[0]; - } - else - { - conditions.fvgOB = bearishOrderBlocks[0]; - } + conditions.pivot = + isBullish + ? conditionState.x121Conditions.valesBuffer[1] + : conditionState.x121Conditions.peaksBuffer[1]; // conditions.setupTime = cTime; @@ -447,9 +601,9 @@ bool DetectX121SMCXTWPVSiganlSetup( // // Detect Trigger Conditions ... -bool DetectX121SMCXTWPVSiganlTrigger( +bool DetectX121SMCXOBSPVSiganlTrigger( // - X121SMCStrategyXTWPVSignalConditions &conditions, + X121SMCStrategyXOBSPVSignalConditions &conditions, // string _symbol, ENUM_TIMEFRAMES _period, @@ -663,51 +817,15 @@ bool DetectX121SMCXTWPVSiganlTrigger( // Trigger Conditions ... // - double decisionPeak = decisionConditions.x121Conditions.peaksBuffer[1]; - double isNewDecisionPeak = decisionConditions.x121Conditions.isNewPeak; + // Looking for STR Direction Change ... // - double decisionVale = decisionConditions.x121Conditions.valesBuffer[1]; - double isNewDecisionVale = decisionConditions.x121Conditions.isNewVale; + bool isStrSwitchedToBullish = analyseConditions.x121Conditions.isStrSwitchedToBullish; + bool isStrSwitchedToBearish = analyseConditions.x121Conditions.isStrSwitchedToBearish; // - bool isTriggerRSICrossedOverOverSold = triggerConditions.x121Conditions.isRSICrossedOverOverSold; - bool isTriggerRSICrossedUnderOverBought = triggerConditions.x121Conditions.isRSICrossedUnderOverBought; - - // - bool isDecisionRSICrossedOverOverSold = decisionConditions.x121Conditions.isRSICrossedOverOverSold; - bool isDecisionRSICrossedUnderOverBought = decisionConditions.x121Conditions.isRSICrossedUnderOverBought; - - // - // Waits For Price to Go Inside FVG ... - bool isPriceInsideOB = IsPriceInsideZone( - cBar, - conditions.fvgOB.orderBlock // - ); - - // - bool isPriceInsideFVG = IsPriceInsideZone( - cBar, - conditions.fvgOB.fairValueGap // - ); - - // - result = isPriceInsideOB && - isPriceInsideFVG && - conditions.fvgOB.IsValid(); - if (!result) - { - return result; - } - - // - double fvgOBUpper = 0; - double fvgOBLower = 0; - bool hasBoundary = conditions.fvgOB.GetBoundary( - fvgOBUpper, - fvgOBLower // - ); - result = hasBoundary; + result = isStrSwitchedToBullish || + isStrSwitchedToBearish; if (!result) { return result; @@ -716,23 +834,17 @@ bool DetectX121SMCXTWPVSiganlTrigger( // // Detect Bullish Conditions ... isBullish = - isBullish && - cBar.IsBullish() && - decisionVale < fvgOBUpper && - decisionVale > fvgOBLower - // && - // isTriggerRSICrossedOverOverSold + // + false + // ; // // Detect Bearish Conditions ... isBearish = - isBearish && - cBar.IsBearish() && - decisionPeak < fvgOBUpper && - decisionPeak > fvgOBLower - // && - // isTriggerRSICrossedUnderOverBought + // + false + // ; // @@ -791,22 +903,6 @@ bool DetectX121SMCXTWPVSiganlTrigger( double peak = triggerConditions.x121Conditions.peaksBuffer[1]; double vale = triggerConditions.x121Conditions.valesBuffer[1]; - // - if (conditions.fvgOB.IsValid()) - { - // - Add( - fvgOBUpper, - sls // - ); - - // - Add( - fvgOBLower, - sls // - ); - } - // if (isBullish) { @@ -898,9 +994,9 @@ bool DetectX121SMCXTWPVSiganlTrigger( } // -int AddX121SMCXTWPVConditionsIfNotExists( - X121SMCStrategyXTWPVSignalConditions &item, - X121SMCStrategyXTWPVSignalConditions &items[], +int AddX121SMCXOBSPVConditionsIfNotExists( + X121SMCStrategyXOBSPVSignalConditions &item, + X121SMCStrategyXOBSPVSignalConditions &items[], int maxAllowed = 10 // ) { @@ -917,88 +1013,59 @@ int AddX121SMCXTWPVConditionsIfNotExists( // int count = ArraySize(items); - bool canAdd = !IsValidSize(count); - if (!canAdd) + if (IsValidSize(count)) { + // + // Copy Original Items ... + X121SMCStrategyXOBSPVSignalConditions tmpItems[]; + Copy( + items, + tmpItems // + ); + // // Prese Item Data ... bool isBullish = IsBullish(item.dir); // - bool hasSame = false; for (int i = 0; i < count; i++) { // - X121SMCStrategyXTWPVSignalConditions iItem = items[i]; + X121SMCStrategyXOBSPVSignalConditions iItem = tmpItems[i]; // - hasSame = iItem.fvgOB.IsSameAs(item.fvgOB); - if (hasSame) + bool canRemove = item.dir == iItem.dir && + item.pivot == iItem.pivot; + if (canRemove) { - break; + // + ArrayRemove( + items, + i, + 1 // + ); } } // - canAdd = !hasSame; + Clean(tmpItems); } // - if (canAdd) - { - // - AddRef( - item, - items // - ); + AddRef( + item, + items // + ); - // - // Remove Olds ... - CleanupArray( - items, - maxAllowed // - ); + // + // Remove Olds ... + CleanupArray( + items, + maxAllowed // + ); - // - result = ArraySize(items); - } - // - return result; -} - -// -// Draw Signal ... -int DrawX121SMCXTWPVSiganl( - X121SMCStrategyXTWPVSignalConditions &conditions, - XCBaseObject *&drawnObjects[], - XCPOIDrawer *drawer // -) -{ - // - int result = 0; - - // - Clean(drawnObjects); - - // - if (drawer == NULL) - { - return result; - } - - // - bool isSetuped = conditions.IsSetuped(); - if (!isSetuped) - { - return result; - } - - // - bool isBullish = IsBullish(conditions.dir); - - // - result = ArraySize(drawnObjects); + result = ArraySize(items); // return result; diff --git a/X121SMCEA/Strategy/x-121.smc.strategy.class.mq5 b/X121SMCEA/Strategy/x-121.smc.strategy.class.mq5 index 2f21148c..fc386adf 100644 --- a/X121SMCEA/Strategy/x-121.smc.strategy.class.mq5 +++ b/X121SMCEA/Strategy/x-121.smc.strategy.class.mq5 @@ -29,6 +29,7 @@ // #include "../Signals/x-121.smc.test.signal.lib.mq5" #include "../Signals/x-121.smc.xobgpv.signal.lib.mq5" +#include "../Signals/x-121.smc.xobspv.signal.lib.mq5" // // Definitions ... @@ -184,11 +185,13 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy // bool useTestSignal = false; - bool useXOBGPVSignal = true; + bool useXOBGPVSignal = false; + bool useXOBSPVSignal = true; // bool hasTestSignal = false; bool hasXOBGPVSignal = false; + bool hasXOBSPVSignal = false; // // Test Signal ... @@ -208,6 +211,15 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy hasSignal = hasXOBGPVSignal; } + // + // XOBSPV Signal ... + if (useXOBSPVSignal && !hasSignal) + { + // + hasXOBSPVSignal = DetectXOBSPVSignal(conditions); + hasSignal = hasXOBSPVSignal; + } + // result = hasSignal; if (!result) @@ -477,8 +489,6 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy // // XOBGPV Signal ... - X121SMCStrategyXOBGPVSignalConditions mXOBGPVConditions; - X121SMCStrategyXOBGPVSignalConditions mXOBGPVConditionsCollection[]; bool DetectXOBGPVSignal( X121SMCStrategyConditions &conditions // ) @@ -736,6 +746,265 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy return result; } + // + // XOBSPV Signal ... + bool DetectXOBSPVSignal( + X121SMCStrategyConditions &conditions // + ) + { + // + bool result = false; + + // + bool isBullish = false; + bool isBearish = false; + + // + int zIndex = 0; + int cIndex = zIndex + 1; + int pIndex = cIndex + 1; + int ppIndex = pIndex + 1; + + // + string symbol = GetSymbol(); + ENUM_TIMEFRAMES period = GetPeriod(); + + // + 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 cLL = cBar.FindLowest(7, MODE_LOW); + double cHH = cBar.FindHighest(7, MODE_HIGH); + + // + datetime cTime = TimeCurrent(); + + // + ENUM_X_121_SMC_PROVIDERS provider = X_121_SMC_PROVIDER_XOBSPV; + string providerStr = ToString(provider); + + // + // Detect Setup Conditions ... + datetime setupTime = mXOBSPVConditions.setupTime; + bool isSetuped = mXOBSPVConditions.IsSetuped(); + ENUM_X_DIRECTION setupDir = mXOBSPVConditions.dir; + if (!isSetuped) + { + // + // Detect Signal Setup ... + isSetuped = DetectX121SMCXOBSPVSiganlSetup( + symbol, + period, + mXOBSPVConditions, + mTriggerCycleHelper, + mDecisionCycleHelper, + mAnalyseCycleHelper, + mVerificationCycleHelper, + mConsolidationCycleHelper, + mVisionCycleHelper // + ); + + // + setupDir = mXOBSPVConditions.dir; + setupTime = mXOBSPVConditions.setupTime; + + // + if (isSetuped) + { + // + int items = AddX121SMCXOBSPVConditionsIfNotExists( + mXOBSPVConditions, + mXOBSPVConditionsCollection // + ); + + // + mXOBSPVConditions.Clean(); + } + } + + // + int conditionsCount = ArraySize(mXOBSPVConditionsCollection); + result = IsValidSize(conditionsCount); + if (!result) + { + return result; + } + + // + // Looking For Conditions ... + int selectedIndex = 0; + X121SMCStrategyXOBSPVSignalConditions mTmpConditions[]; + Copy( + mXOBSPVConditionsCollection, + mTmpConditions // + ); + X121SMCStrategyXOBSPVSignalConditions mConditions; + for (int i = 0; i < conditionsCount; i++) + { + // + // Update Conditions ... + // mTmpConditions[i].UpdateOrderBlocks(); + + // + // Retrieve Required Data ... + // ENUM_X_DIRECTION iDir = mTmpConditions[i].dir; + // bool isIBullish = IsBullish(iDir); + // double iUpper = 0; + // double iLower = 0; + // bool iHasBoundary = mTmpConditions[i].fvgOB.GetBoundary( + // iUpper, + // iLower // + // ); + // if (!iHasBoundary) + // { + // continue; + // } + + // + // Draw Conditions ... + + // + // XFVGOrderBlock iFVGOB = mTmpConditions[i].fvgOB; + // XCBaseObject *drawnObjects[]; + // mPOIDrawer.DrawFVGOrderBlock( + // iFVGOB, + // drawnObjects // + // ); + // AddObjectsIfNotExists(drawnObjects); + + // + // Check Broken Order Blocks and Remove them ... + // bool isBreaked = + // isBullish + // ? (cBar.high < iLower || + // pBar.high < iLower) + // : (cBar.low > iUpper || + // cBar.low > iUpper); + // if (isBreaked) + // { + // // + // ArrayRemove( + // mXOBSPVConditionsCollection, + // i, + // 1 // + // ); + + // // + // continue; + // } + + // + // Check Triggers ... + bool canTrigger = mTmpConditions[i].CanTrigger(); + datetime triggerTime = mTmpConditions[i].triggerTime; + if (!canTrigger) + { + // + // Detect Signal Trigger ... + canTrigger = DetectX121SMCXOBSPVSiganlTrigger( + mTmpConditions[i], + symbol, + period, + mTriggerCycleHelper, + mDecisionCycleHelper, + mAnalyseCycleHelper, + mVerificationCycleHelper, + mConsolidationCycleHelper, + mVisionCycleHelper // + ); + + // + result = canTrigger; + if (!result) + { + continue; + } + + // + triggerTime = mTmpConditions[i].triggerTime; + } + + // + if (canTrigger) + { + // + selectedIndex = i; + mConditions = mTmpConditions[i]; + break; + } + } + + // + result = IsValid(mConditions.setupTime) && + HasDirection(mConditions.dir); + if (!result) + { + return result; + } + + // + // Remove Selected Index from Main Collection ... + ArrayRemove( + mXOBSPVConditionsCollection, + selectedIndex, + 1 // + ); + + // + // Check Signal Direction ... + isBullish = IsBullish(mConditions.dir); + isBearish = IsBearish(mConditions.dir); + result = isBullish || + isBearish; + if (!result) + { + return result; + } + + // + // Issues Signal on Conditions ... + conditions.sl = mConditions.sl; + conditions.provider = providerStr; + conditions.signalDir = mConditions.dir; + conditions.target = mConditions.target; + + // + return result; + } + // // Private ... private: @@ -813,14 +1082,14 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy // // XATR ... - x121Inputs.xatrInputs.showATRUpper = false; - x121Inputs.xatrInputs.showATRLower = false; + x121Inputs.xatrInputs.showATRUpper = true; + x121Inputs.xatrInputs.showATRLower = true; // // XSTR ... x121Inputs.xstrInputs.showStr = true; - x121Inputs.xstrInputs.showStrUpper = false; - x121Inputs.xstrInputs.showStrLower = false; + x121Inputs.xstrInputs.showStrUpper = true; + x121Inputs.xstrInputs.showStrLower = true; // // XDON ... @@ -831,9 +1100,9 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy // // XVWAP ... - x121Inputs.xvwapInputs.showVWapFast = false; - x121Inputs.xvwapInputs.showVWapMedium = false; - x121Inputs.xvwapInputs.showVWapSlow = false; + x121Inputs.xvwapInputs.showVWapFast = true; + x121Inputs.xvwapInputs.showVWapMedium = true; + x121Inputs.xvwapInputs.showVWapSlow = true; // // Initialize Cycle Helpers ...