diff --git a/Libraries/x-saherelm.x-poi.lib.mq5 b/Libraries/x-saherelm.x-poi.lib.mq5 index 857331d6..f0cb0485 100644 --- a/Libraries/x-saherelm.x-poi.lib.mq5 +++ b/Libraries/x-saherelm.x-poi.lib.mq5 @@ -6509,7 +6509,7 @@ struct XFVGOrderBlock // result = // - dir = valueDir + dir == valueDir // && // diff --git a/X121SMCEA/Libraries/x-121.smc.lib.mq5 b/X121SMCEA/Libraries/x-121.smc.lib.mq5 index 1d281d6a..310b298c 100644 --- a/X121SMCEA/Libraries/x-121.smc.lib.mq5 +++ b/X121SMCEA/Libraries/x-121.smc.lib.mq5 @@ -834,6 +834,7 @@ bool TestPOIState( } // + // Detect an FVG for Order Block ... for (int j = fvgsCount - 1; j >= 0; j--) { // diff --git a/X121SMCEA/Signals/x-121.smc.xtwpv.signal.lib.mq5 b/X121SMCEA/Signals/x-121.smc.xtwpv.signal.lib.mq5 index 8422b9e3..c21531e0 100644 --- a/X121SMCEA/Signals/x-121.smc.xtwpv.signal.lib.mq5 +++ b/X121SMCEA/Signals/x-121.smc.xtwpv.signal.lib.mq5 @@ -671,6 +671,10 @@ bool DetectX121SMCXTWPVSiganlTrigger( double decisionVale = decisionConditions.x121Conditions.valesBuffer[1]; double isNewDecisionVale = decisionConditions.x121Conditions.isNewVale; + // + bool isDecisionRSICrossedOverOverSold = decisionConditions.x121Conditions.isRSICrossedOverOverSold; + bool isDecisionRSICrossedUnderOverBought = decisionConditions.x121Conditions.isRSICrossedUnderOverBought; + // // Waits For Price to Go Inside FVG ... bool isPriceInsideOB = IsPriceInsideZone( @@ -711,14 +715,18 @@ bool DetectX121SMCXTWPVSiganlTrigger( isBullish = isBullish && cBar.IsBullish() && - isNewDecisionVale; + decisionVale < fvgOBUpper && + decisionVale > fvgOBLower && + isDecisionRSICrossedOverOverSold; // // Detect Bearish Conditions ... isBearish = isBearish && cBar.IsBearish() && - isNewDecisionPeak; + decisionPeak < fvgOBUpper && + decisionPeak > fvgOBLower && + isDecisionRSICrossedUnderOverBought; // result = isBullish || diff --git a/X121SMCEA/Strategy/x-121.smc.strategy.class.mq5 b/X121SMCEA/Strategy/x-121.smc.strategy.class.mq5 index f4331115..b19f8237 100644 --- a/X121SMCEA/Strategy/x-121.smc.strategy.class.mq5 +++ b/X121SMCEA/Strategy/x-121.smc.strategy.class.mq5 @@ -536,6 +536,10 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy return result; } + // + double cLL = cBar.FindLowest(7, MODE_LOW); + double cHH = cBar.FindHighest(7, MODE_HIGH); + // datetime cTime = TimeCurrent(); @@ -572,12 +576,21 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy if (isSetuped) { // - AddRef( + int items = AddX121SMCXTWPVConditionsIfNotExists( mXTWPVConditions, - mXTWPVConditionsCollection); + mXTWPVConditionsCollection // + ); // mXTWPVConditions.Clean(); + + // + // Try to Normalize Conditions Collection ... + int maxAllowed = 6; + CleanupArray( + mXTWPVConditionsCollection, + maxAllowed // + ); } } @@ -592,18 +605,38 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy // // Looking For Conditions ... int selectedIndex = 0; + X121SMCStrategyXTWPVSignalConditions mTmpConditions[]; + Copy( + mXTWPVConditionsCollection, + mTmpConditions // + ); X121SMCStrategyXTWPVSignalConditions mConditions; for (int i = 0; i < conditionsCount; i++) { // // Update Conditions ... - mXTWPVConditionsCollection[i].UpdateOrderBlocks(); + 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 = mXTWPVConditionsCollection[i].fvgOB; + XFVGOrderBlock iFVGOB = mTmpConditions[i].fvgOB; XCBaseObject *drawnObjects[]; mPOIDrawer.DrawFVGOrderBlock( iFVGOB, @@ -611,16 +644,37 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy ); AddObjectsIfNotExists(drawnObjects); + // + // Check Broken Order Blocks and Remove them ... + bool isBreaked = + isBullish + ? (cBar.close < iLower || + pBar.close < iLower) + : (cBar.close > iUpper || + cBar.close > iUpper); + if (isBreaked) + { + // + ArrayRemove( + mXTWPVConditionsCollection, + i, + 1 // + ); + + // + continue; + } + // // Check Triggers ... - bool canTrigger = mXTWPVConditionsCollection[i].CanTrigger(); - datetime triggerTime = mXTWPVConditionsCollection[i].triggerTime; + bool canTrigger = mTmpConditions[i].CanTrigger(); + datetime triggerTime = mTmpConditions[i].triggerTime; if (!canTrigger) { // // Detect Signal Trigger ... canTrigger = DetectX121SMCXTWPVSiganlTrigger( - mXTWPVConditionsCollection[i], + mTmpConditions[i], symbol, period, mTriggerCycleHelper, @@ -635,11 +689,11 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy result = canTrigger; if (!result) { - return result; + continue; } // - triggerTime = mXTWPVConditionsCollection[i].triggerTime; + triggerTime = mTmpConditions[i].triggerTime; } // @@ -647,7 +701,7 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy { // selectedIndex = i; - mConditions = mXTWPVConditionsCollection[i]; + mConditions = mTmpConditions[i]; break; } }