From fc563e29efba4e1e8ddb93c485a7e1e3b5fe2a11 Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Fri, 27 Dec 2024 13:44:03 +0330 Subject: [PATCH] last works ... --- .../Signals/x-121.smc.test.signal.lib.mq5 | 7 + .../Signals/x-121.smc.xpvdp.signal.lib.mq5 | 7 + .../Signals/x-121.smc.xvwpb.signal.lib.mq5 | 137 ++++++++++++++++-- .../Strategy/x-121.smc.strategy.class.mq5 | 17 +++ 4 files changed, 157 insertions(+), 11 deletions(-) diff --git a/X121SMCEA/Signals/x-121.smc.test.signal.lib.mq5 b/X121SMCEA/Signals/x-121.smc.test.signal.lib.mq5 index da1af321..eac77ea9 100644 --- a/X121SMCEA/Signals/x-121.smc.test.signal.lib.mq5 +++ b/X121SMCEA/Signals/x-121.smc.test.signal.lib.mq5 @@ -634,6 +634,13 @@ bool DetectX121SMCTestSiganlTrigger( { // // Cleanup Setup Conditions ... + int setupAge = conditions.GetSetupAge(); + if (IsValidSize(setupAge) && + IsValidSize(maxAllowedSetupAge) && + setupAge >= maxAllowedSetupAge) + { + conditions.Clean(); + } // return result; diff --git a/X121SMCEA/Signals/x-121.smc.xpvdp.signal.lib.mq5 b/X121SMCEA/Signals/x-121.smc.xpvdp.signal.lib.mq5 index fb1ad562..91cd77f5 100644 --- a/X121SMCEA/Signals/x-121.smc.xpvdp.signal.lib.mq5 +++ b/X121SMCEA/Signals/x-121.smc.xpvdp.signal.lib.mq5 @@ -965,6 +965,13 @@ bool DetectX121SMCXPVDPSiganlTrigger( { // // Cleanup Setup Conditions ... + int setupAge = conditions.GetSetupAge(); + if (IsValidSize(setupAge) && + IsValidSize(maxAllowedSetupAge) && + setupAge >= maxAllowedSetupAge) + { + conditions.Clean(); + } // return result; diff --git a/X121SMCEA/Signals/x-121.smc.xvwpb.signal.lib.mq5 b/X121SMCEA/Signals/x-121.smc.xvwpb.signal.lib.mq5 index db7007e2..1b7a995a 100644 --- a/X121SMCEA/Signals/x-121.smc.xvwpb.signal.lib.mq5 +++ b/X121SMCEA/Signals/x-121.smc.xvwpb.signal.lib.mq5 @@ -854,6 +854,30 @@ bool DetectX121SMCXVWPBSiganlTrigger( // // 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]; @@ -870,6 +894,14 @@ bool DetectX121SMCXVWPBSiganlTrigger( // bool isPeaksSameFormed = + // + ( + // + triggerPeak == decisionPeak + // + ) + // + || // ( // @@ -903,6 +935,14 @@ bool DetectX121SMCXVWPBSiganlTrigger( // bool isValesSameFormed = + // + ( + // + triggerVale == decisionVale + // + ) + // + || // ( // @@ -953,21 +993,69 @@ bool DetectX121SMCXVWPBSiganlTrigger( } // - conditions.Clean(); + // 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 = - // - false - // - ; + (isNewValeOverLast || + isNewPeakOverLast) && + isDonBullishFormed && + hasLastVWapStateChanged && + (isBullish && + IsBullish(lastVWapStateChnged.dir)); // isBearish = - // - false - // - ; + (isNewPeakUnderLast || + isNewValeUnderLast) && + isDonBearishFormed && + hasLastVWapStateChanged && + (isBearish && + IsBearish(lastVWapStateChnged.dir)); // result = isBullish || @@ -976,19 +1064,46 @@ bool DetectX121SMCXVWPBSiganlTrigger( { // // 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 - ? 0 - : 0; + ? vwapMin + : vwapMax; conditions.type = isBullish ? X_POSITION_TYPE_LONG : X_POSITION_TYPE_SHORT; + // return result; } diff --git a/X121SMCEA/Strategy/x-121.smc.strategy.class.mq5 b/X121SMCEA/Strategy/x-121.smc.strategy.class.mq5 index d9b48fa5..7d12479d 100644 --- a/X121SMCEA/Strategy/x-121.smc.strategy.class.mq5 +++ b/X121SMCEA/Strategy/x-121.smc.strategy.class.mq5 @@ -321,6 +321,23 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy signal.trailSLStartOnReachTPLevel = 3; } + // + // Configure Signal Protecting ... + if (hasXVWPBSignal) { + // + signal.fullTPLevel = r2r; + signal.partialCloseOnTPLevel = 2; + signal.partialCloseMultiplier = 0.5; + + // + signal.riskFreeOnBreakEven = true; + signal.tpLevelForBreakEven = 1; + + // + signal.trailSL = true; + signal.trailSLStartOnReachTPLevel = 2; + } + // result = PrepareSignal(signal); if (result)