From d8a989d3ddf0785a8eabb0d8c87a860a4069449c Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Sun, 9 Mar 2025 05:42:31 +0330 Subject: [PATCH] Fix Bullish SLs on Activated Box Signalling ... --- Documents/BKP/workingZone.zone.box.mq5 | 1165 +++++++++++++++++ .../Signals/x-121.smc.xwz.signal.class.mq5 | 63 +- .../Signals/x-121.smc.xwz.signal.lib.mq5 | 1112 ---------------- 3 files changed, 1193 insertions(+), 1147 deletions(-) create mode 100644 Documents/BKP/workingZone.zone.box.mq5 diff --git a/Documents/BKP/workingZone.zone.box.mq5 b/Documents/BKP/workingZone.zone.box.mq5 new file mode 100644 index 00000000..499b73b4 --- /dev/null +++ b/Documents/BKP/workingZone.zone.box.mq5 @@ -0,0 +1,1165 @@ +// +bool IsZoneActivated( + int &zoneIDX, + int &fvgIDX, + ENUM_X_DIRECTION &dir, + ENUM_X121SMC_XWZ_PROVIDERS &signalProvider, + X121SMCStrategySignalProviderData &provider, + int barIndex = 0 // +) +{ + // + bool result = false; + + // + fvgIDX = -1; + zoneIDX = -1; + dir = X_DIRECTION_NONE; + signalProvider = X121SMC_XWZ_PROVIDER_NONE; + + // + // Normalize Bar Index ... + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (barIndex == 0) + { + barIndex = 1; + } + + // + // Validate ... + result = IsValid() && + HasWaitingZones(); + if (!result) + { + return result; + } + + // + XOHCL bar; + result = bar.Init( + symbol, + period, + barIndex // + ); + if (!result) + { + // + bar.Clean(); + + // + return result; + } + + // + double peak = provider.decisionXConditions.peaksBuffer[1]; + double vale = provider.decisionXConditions.valesBuffer[1]; + + // + double analysePeak = provider.analyseXConditions.peaksBuffer[1]; + double analyseVale = provider.analyseXConditions.valesBuffer[1]; + + // + double consolidationPeak = provider.consolidationXConditions.peaksBuffer[1]; + double consolidationVale = provider.consolidationXConditions.valesBuffer[1]; + + // + double visionPeak = provider.visionXConditions.peaksBuffer[1]; + double visionVale = provider.visionXConditions.valesBuffer[1]; + + // + bool isPeaksSame = + peak == analysePeak && + analysePeak == consolidationPeak; + + // + bool isValesSame = + vale == analyseVale && + analyseVale == consolidationVale; + + // + // + // + + // + bool isDecisionScoreBullish = + provider.decisionBullishScore > provider.decisionBearishScore; + + // + bool isDecisionScoreBearish = + provider.decisionBearishScore > provider.decisionBullishScore; + + // + bool isAnalyseScoreBullish = + provider.analyseBullishScore > provider.analyseBearishScore; + + // + bool isAnalyseScoreBearish = + provider.analyseBearishScore > provider.analyseBullishScore; + + // + bool isConsolidationScoreBullish = + provider.consolidationBullishScore > provider.consolidationBearishScore; + + // + bool isConsolidationScoreBearish = + provider.consolidationBearishScore > provider.consolidationBullishScore; + + // + bool isVisionScoreBullish = + provider.visionBullishScore > provider.visionBearishScore; + + // + bool isVisionScoreBearish = + provider.visionBearishScore > provider.visionBullishScore; + + // + int count = CountWaitingZones(); + for (int i = 0; i < count; i++) + { + // + XOBFVG iOBFVG = waitingZones[i]; + + // + ENUM_X_DIRECTION iDir = iOBFVG.GetDirection(); + bool isBullish = iOBFVG.IsBullish(); + + // + int fvgsCount = iOBFVG.CountFVGs(); + bool has = IsValidSize(fvgsCount); + if (has) + { + // + for (int j = 0; j < fvgsCount; j++) + { + // + XCFVG *jFVG = iOBFVG.fvgs[j]; + + // + XBoxZone iBox; + has = ToBox( + iBox, + jFVG // + ); + if (has) + { + // + double iRange = iBox.lower + ((iBox.upper - iBox.lower) / 2); + + // + // Activate Zone Using PV ... + bool isPVPassed = + isBullish + ? vale <= iBox.upper && + vale >= iBox.lower + : peak <= iBox.upper && + peak >= iBox.lower; + bool isPV50Passed = + isBullish + ? vale < iBox.upper && + vale <= iRange && + vale > iBox.lower + : peak < iBox.upper && + peak >= iRange && + peak > iBox.lower; + + // + // Activate Zone using Rejection ... + bool isRejected = + isBullish + ? bar.low <= iBox.upper && + bar.GetDown() > iBox.upper + : bar.high >= iBox.lower && + bar.GetUp() < iBox.lower; + + // + // Combine Result ... + // result = isPVPassed; + // || isPVPassed + // || isPV50Passed + // || isRejected; + + // + result = isPVPassed; + + if (result) + { + // + fvgIDX = j; + iBox.Clean(); + zoneIDX = i; + + // + break; + } + } + + // + if (result) + { + // + iBox.Clean(); + ZeroMemory(jFVG); + + // + break; + } + + // + iBox.Clean(); + } + } + + // + if (result) + { + // + iOBFVG.Clean(); + break; + } + + // + iOBFVG.Clean(); + } + + // + result = + IsValidIndex(fvgIDX) && + IsValidIndex(zoneIDX); + + // + bar.Clean(); + + // + if (result) + { + bar.Clean(); + } + + // + return result; +} + +// +bool IsBoxActivated( + XBoxZone &box, + ENUM_X_DIRECTION &dir, + ENUM_X121SMC_XWZ_PROVIDERS &signalProvider, + X121SMCStrategySignalProviderData &provider, + int barIndex = 0 // +) +{ + // + bool result = false; + + // + box.Clean(); + dir = X_DIRECTION_NONE; + signalProvider = X121SMC_XWZ_PROVIDER_NONE; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + result = IsValid() && + HasWaitingBoxes(); + if (!result) + { + return result; + } + + // + XOHCL bar; + XOHCL cBar; + XOHCL pBar; + result = bar.Init( + symbol, + period, + barIndex // + ); + result = + result && + bar.GetPreviousBar(cBar); + result = + result && + cBar.GetPreviousBar(pBar); + if (!result) + { + // + bar.Clean(); + cBar.Clean(); + + // + return result; + } + + // + // Retrieve Some Required Data ... + + // + double peakZ = provider.decisionXConditions.peaksBuffer[0]; + double valeZ = provider.decisionXConditions.valesBuffer[0]; + double peak = provider.decisionXConditions.peaksBuffer[1]; + double vale = provider.decisionXConditions.valesBuffer[1]; + + // + double analysePeak = provider.analyseXConditions.peaksBuffer[1]; + double analyseVale = provider.analyseXConditions.valesBuffer[1]; + + // + double consolidationPeak = provider.consolidationXConditions.peaksBuffer[1]; + double consolidationVale = provider.consolidationXConditions.valesBuffer[1]; + + // + double visionPeak = provider.visionXConditions.peaksBuffer[1]; + double visionVale = provider.visionXConditions.valesBuffer[1]; + + // + bool isPeaksSame = + peak == analysePeak && + analysePeak == consolidationPeak; + + // + bool isValesSame = + vale == analyseVale && + analyseVale == consolidationVale; + + // + // Calculate Scores Conditions ... + + // + bool isDecisionScoreBullish = + provider.decisionBullishScore > provider.decisionBearishScore; + + // + bool isDecisionScoreBearish = + provider.decisionBearishScore > provider.decisionBullishScore; + + // + bool isAnalyseScoreBullish = + provider.analyseBullishScore > provider.analyseBearishScore; + + // + bool isAnalyseScoreBearish = + provider.analyseBearishScore > provider.analyseBullishScore; + + // + bool isConsolidationScoreBullish = + provider.consolidationBullishScore > provider.consolidationBearishScore; + + // + bool isConsolidationScoreBearish = + provider.consolidationBearishScore > provider.consolidationBullishScore; + + // + bool isVisionScoreBullish = + provider.visionBullishScore > provider.visionBearishScore; + + // + bool isVisionScoreBearish = + provider.visionBearishScore > provider.visionBullishScore; + + // + bool isScoreBullish = + isVisionScoreBullish && + isAnalyseScoreBullish && + isConsolidationScoreBullish; + + // + bool isScoreBearish = + isVisionScoreBearish && + isAnalyseScoreBearish && + isConsolidationScoreBearish; + + // + // Waiting Boxes ... + int count = CountWaitingBoxes(); + for (int i = 0; i < count; i++) + { + // + XBoxZone iBox = waitingBoxes[i]; + bool isBullish = iBox.IsBullish(); + + // + // Check Score ... + + // + bool isScorePassed = + isBullish + ? isScoreBullish + : isScoreBearish; + + // + // Check Bar Insides ... + + // + bool isPBarInside = + (pBar.high <= iBox.upper && + pBar.low >= iBox.lower) || + (isBullish + ? pBar.low < iBox.upper && + pBar.GetDown() < iBox.upper + : pBar.high > iBox.lower && + pBar.GetUp() > iBox.lower); + + // + bool isCBarInside = + (cBar.high <= iBox.upper && + cBar.low >= iBox.lower) || + (isBullish + ? cBar.low < iBox.upper && + cBar.GetDown() < iBox.upper + : cBar.high > iBox.lower && + cBar.GetUp() > iBox.lower); + + // + // Checking Rejection ... + + // + // Bullish ... + bool isBullishRejected = + isBullish && + cBar.low <= iBox.upper && + cBar.GetDown() > iBox.upper; + + // + // Bearish ... + bool isBearishRejected = + !isBullish && + cBar.high >= iBox.lower && + cBar.GetUp() < iBox.lower; + + // + // Check Breaktion ... + + // + // Bullish ... + bool isBullishBreaked = + isBullish && + cBar.high > iBox.upper && + cBar.GetUp() > iBox.upper && + cBar.low >= iBox.lower; + + // + // Bearish ... + bool isBearishBreaked = + !isBullish && + cBar.low < iBox.lower && + cBar.GetDown() < iBox.lower && + cBar.high <= iBox.upper; + + // + // Checking PV Pass ... + + // + bool isBullishPVPassed = + isBullish && + vale == valeZ && + vale > iBox.lower && + vale < iBox.upper; + + // + bool isBearishPVPassed = + !isBullish && + peak == peakZ && + peak > iBox.lower && + peak < iBox.upper; + + // + // Summarise ... + + // + // Rejection ... + bool isRejected = isBullishRejected || + isBearishRejected; + + // + // Breaktion ... + bool isBreaked = + isPBarInside && + (isBullishBreaked || + isBearishBreaked); + + // + bool isPVPassed = + (isBullishPVPassed || + isBearishPVPassed); + + // + // Trend Conditions ... + + // + bool isX3MABullish = + provider.decisionXConditions.isX3MaFastOverMid && + provider.decisionXConditions.x3maMidBuffer[1] > provider.decisionXConditions.x3maSlowBuffer[1]; + + // + bool isX3MABearish = + provider.decisionXConditions.isX3MaFastUnderMid && + provider.decisionXConditions.x3maMidBuffer[1] < provider.decisionXConditions.x3maSlowBuffer[1]; + + // + bool isVWapBullish = + provider.decisionXConditions.isVWapFastOverMid && + provider.decisionXConditions.vwapMidBuffer[1] > provider.decisionXConditions.vwapSlowBuffer[1]; + + // + bool isVWapBearish = + provider.decisionXConditions.isX3MaFastUnderMid && + provider.decisionXConditions.vwapMidBuffer[1] < provider.decisionXConditions.vwapSlowBuffer[1]; + + // + bool isTrendBullish = + isX3MABullish && + isVWapBullish; + + // + bool isTrendBearish = + isX3MABearish && + isVWapBearish; + + // + bool isTrendPassed = + isBullish + ? isTrendBullish + : isTrendBearish; + + // + // Summarize Conditions ... + + // + result = + // + // isBreaked || + // isRejected || + isPVPassed && + isRejected && + isTrendPassed && + isScorePassed + // + ; + + // + if (result) + { + // + box = iBox; + dir = iBox.dir; + signalProvider = X121SMC_XWZ_PROVIDER_ACTIVATED_BOX; + + // + iBox.Clean(); + break; + } + + // + iBox.Clean(); + + // + } + + // + // MA Trends ... + if (!result) + { + // + result = provider.analyseState.HasOrderBlocks(); + if (result) + { + // + // + // Trend Conditions ... + + // + bool isX3MABullish = + provider.decisionXConditions.isX3MaFastCrossedOverMid; + + // + bool isX3MABearish = + provider.decisionXConditions.isX3MaFastCrossedUnderMid; + + // + bool isVWapBullish = + provider.decisionXConditions.isVWapFastCrossedOverMid; + + // + bool isVWapBearish = + provider.decisionXConditions.isVWapFastCrossedUnderMid; + + // + // + // + + // + bool isTrendBullish = + (isX3MABullish || + isVWapBullish) && + provider.decisionXConditions.isNewPeakOverLast; + + // + bool isTrendBearish = + (isX3MABearish || + isVWapBearish) && + provider.decisionXConditions.isNewValeUnderLast; + + // + result = isTrendBullish || + isTrendBearish; + if (result) + { + // + // Select Signal Box ... + + // + bool isScorePassed = + isTrendBullish + ? isScoreBullish + : isScoreBearish; + + // + XBoxZone tmpBoxes[]; + ToBox( + provider.analyseState.orderBlocks, + tmpBoxes // + ); + Copy( + waitingBoxes, + tmpBoxes, + false // + ); + int idx = -1; + // bool has = false; + while (HasChild(tmpBoxes)) + { + // + if (isTrendBullish) + { + idx = GetHighest(tmpBoxes); + } + else + { + idx = GetLowest(tmpBoxes); + } + + // + result = IsValidIndex(idx); + if (!result) + { + break; + } + + // + XBoxZone iBox = tmpBoxes[idx]; + + // + ArrayRemove( + tmpBoxes, + idx, + 1 // + ); + + // + int insideIDX = -1; + bool hasInsideBox = HasInsideBox( + insideIDX, + iBox, + tmpBoxes // + ); + if (hasInsideBox) + { + // + hasInsideBox = + isTrendBullish + ? iBox.lower < tmpBoxes[insideIDX].lower + : iBox.upper > tmpBoxes[insideIDX].upper; + } + + // + bool isBullishPlacePassed = + // !hasInsideBox && + isTrendBullish && + iBox.IsBullish() && + bar.low >= iBox.upper && + cBar.low >= iBox.upper && + provider.decisionXConditions.x3maMin >= iBox.lower && + provider.decisionXConditions.vwapMin >= iBox.lower; + + // + bool isBearishPlacePassed = + // !hasInsideBox && + isTrendBearish && + iBox.IsBearish() && + bar.high <= iBox.lower && + cBar.high <= iBox.lower && + provider.decisionXConditions.x3maMax <= iBox.upper && + provider.decisionXConditions.vwapMax <= iBox.upper; + + // + result = isScorePassed && + (isBullishPlacePassed || + isBearishPlacePassed); + if (result) + { + // + box = iBox; + iBox.Clean(); + dir = + isTrendBullish + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + signalProvider = X121SMC_XWZ_PROVIDER_ACTIVATED_MA; + break; + } + + // + } + Clean(tmpBoxes); + } + } + } + + // + // Supply and Demand ... + if (false && !result) + { + // + int idx = -1; + bool has = false; + XBoxZone tmpBoxes[]; + + // + // Detecting Youngest Zones ... + + // + XBoxZone bullishBox; + bool hasBullishBox = false; + if (!hasBullishBox) + { + // + XCOrderBlock *ob = NULL; + idx = GetYoungest(provider.analyseState.bullishOrderBlocks); + has = IsValidIndex(idx); + if (has) + { + // + ob = provider.analyseState.bullishOrderBlocks[idx]; + + // + XOHCL startedBar; + bool isBodyOut = false; + bool isStarted = ob.IsStarted( + ob.GetDirection(), + startedBar, + isBodyOut // + ); + has = isStarted && + isBodyOut; + if (has) + { + // + hasBullishBox = ToBox( + bullishBox, + ob // + ); + } + } + + // + if (!hasBullishBox) + { + bullishBox.Clean(); + } + + // + ZeroMemory(ob); + } + + // + XBoxZone bearishBox; + bool hasBearishBox = false; + if (!hasBearishBox) + { + // + XCOrderBlock *ob = NULL; + idx = GetYoungest(provider.analyseState.bearishOrderBlocks); + has = IsValidIndex(idx); + if (has) + { + // + ob = provider.analyseState.bearishOrderBlocks[idx]; + + // + XOHCL startedBar; + bool isBodyOut = false; + bool isStarted = ob.IsStarted( + ob.GetDirection(), + startedBar, + isBodyOut // + ); + has = isStarted && + isBodyOut; + if (has) + { + // + hasBearishBox = ToBox( + bearishBox, + ob // + ); + } + } + + // + if (!hasBearishBox) + { + bearishBox.Clean(); + } + + // + ZeroMemory(ob); + } + + // + XBoxZone bullishCZBox; + bool hasBullishConsolidationZone = false; + XConsolidationZone bullishConsolidationZone; + hasBullishConsolidationZone = provider.decisionState.HasBullishConsolidationZones(); + if (hasBullishConsolidationZone) + { + // + idx = GetYoungest(provider.decisionState.bullishConsolidationZones); + hasBullishConsolidationZone = IsValidIndex(idx); + if (hasBullishConsolidationZone) + { + // + bullishConsolidationZone = provider.decisionState.bullishConsolidationZones[idx]; + if (hasBullishConsolidationZone) + { + // + hasBullishConsolidationZone = ToBox( + bullishCZBox, + bullishConsolidationZone // + ); + } + } + } + + // + XBoxZone bearishCZBox; + bool hasBearishConsolidationZone = false; + XConsolidationZone bearishConsolidationZone; + hasBearishConsolidationZone = provider.decisionState.HasBearishConsolidationZones(); + if (hasBearishConsolidationZone) + { + // + idx = GetYoungest(provider.decisionState.bearishConsolidationZones); + hasBearishConsolidationZone = IsValidIndex(idx); + if (hasBearishConsolidationZone) + { + // + bearishConsolidationZone = provider.decisionState.bearishConsolidationZones[idx]; + if (hasBearishConsolidationZone) + { + // + hasBearishConsolidationZone = ToBox( + bearishCZBox, + bearishConsolidationZone // + ); + } + } + } + + // + // + // + + // + // Supply Zone ... + has = provider.visionState.HasSupplyZones(); + if (has) + { + // + ToBox( + provider.visionState.supplyZones, + tmpBoxes // + ); + + // + while (HasChild(tmpBoxes)) + { + // + idx = GetYoungest(tmpBoxes); + has = IsValidIndex(idx); + if (!has) + { + break; + } + + // + XBoxZone iBox = tmpBoxes[idx]; + ArrayRemove( + tmpBoxes, + idx, + 1 // + ); + + // + // Price Must Be Inside a Zonne More Than 5 Bar ... + bool isPriceInside = + // + bar.high < iBox.upper && + bar.low > iBox.lower && + // + cBar.high < iBox.upper && + cBar.low > iBox.lower && + // + pBar.high < iBox.upper && + pBar.low > iBox.lower + // + ; + + // + bool isBearishBoxPassed = + hasBearishBox && + IsBoxInside( + bearishBox, + iBox // + ); + + // + bool isBearishCZBoxPassed = + hasBearishConsolidationZone && + IsBoxInside( + bearishCZBox, + iBox // + ); + + // + result = isPriceInside && + (isBearishBoxPassed || + isBearishCZBoxPassed); + if (result) + { + // + if (isBearishBoxPassed) + { + box = bearishBox; + } + else + { + box = bearishCZBox; + } + + // + iBox.to = TimeCurrent(); + XCBoxObject *iObj; + provider.visionCycleHelper.mPOIDrawer.DrawBox( + iBox, + iObj // + ); + + // + dir = X_DIRECTION_BEARISH; + signalProvider = X121SMC_XWZ_PROVIDER_ACTIVATED_AREA; + + // + iBox.Clean(); + + // + break; + } + + // + iBox.Clean(); + } + + // + Clean(tmpBoxes); + } + + // + // Demand Zone ... + has = provider.visionState.HasDemandZones(); + if (!result && has) + { + // + ToBox( + provider.visionState.demandZones, + tmpBoxes // + ); + + // + while (HasChild(tmpBoxes)) + { + // + idx = GetYoungest(tmpBoxes); + has = IsValidIndex(idx); + if (!has) + { + break; + } + + // + XBoxZone iBox = tmpBoxes[idx]; + ArrayRemove( + tmpBoxes, + idx, + 1 // + ); + + // + // Price Must Be Inside a Zonne More Than 5 Bar ... + bool isPriceInside = + // + bar.high < iBox.upper && + bar.low > iBox.lower && + // + cBar.high < iBox.upper && + cBar.low > iBox.lower && + // + pBar.high < iBox.upper && + pBar.low > iBox.lower + // + ; + + // + bool isBullishBoxPassed = + hasBullishBox && + IsBoxInside( + bullishBox, + iBox // + ); + + // + bool isBullishCZBoxPassed = + hasBullishConsolidationZone && + IsBoxInside( + bullishCZBox, + iBox // + ); + + // + result = isPriceInside && + (isBullishBoxPassed || + isBullishCZBoxPassed); + if (result) + { + // + if (isBullishBoxPassed) + { + box = bullishBox; + } + else + { + box = bullishCZBox; + } + + // + iBox.to = TimeCurrent(); + XCBoxObject *iObj; + provider.visionCycleHelper.mPOIDrawer.DrawBox( + iBox, + iObj // + ); + + // + dir = X_DIRECTION_BULLISH; + signalProvider = X121SMC_XWZ_PROVIDER_ACTIVATED_AREA; + + // + iBox.Clean(); + + // + break; + } + + // + iBox.Clean(); + } + + // + Clean(tmpBoxes); + } + + // + Clean(tmpBoxes); + + // + bullishBox.Clean(); + bearishBox.Clean(); + bullishCZBox.Clean(); + bearishCZBox.Clean(); + bullishConsolidationZone.Clean(); + bearishConsolidationZone.Clean(); + + // + } + + // + bar.Clean(); + cBar.Clean(); + pBar.Clean(); + + // + return result; +} + +//////////////////////////////////////////////////////////////////////// + +// // +// bool isZoneActivated = +// hasWorkingZone && +// hasWaitingZones && +// workingZone.IsZoneActivated( +// activatedZoneIDX, +// activatedFVGIDX, +// signalBoxDir, +// signalProvider, +// provider, +// zIndex // +// ); + +// +// hasSignalBox = +// hasWorkingZone && +// hasWaitingBoxes && +// workingZone.IsBoxActivated( +// signalBox, +// signalBoxDir, +// signalProvider, +// provider, +// zIndex // +// ); + +//////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////// + diff --git a/X121SMCEA/Signals/x-121.smc.xwz.signal.class.mq5 b/X121SMCEA/Signals/x-121.smc.xwz.signal.class.mq5 index e90d6772..f3142a7b 100644 --- a/X121SMCEA/Signals/x-121.smc.xwz.signal.class.mq5 +++ b/X121SMCEA/Signals/x-121.smc.xwz.signal.class.mq5 @@ -280,33 +280,6 @@ class XCX121SMCXWZSignalDetector : public XCBase // // Detect Signal Box ... - - // // - // bool isZoneActivated = - // hasWorkingZone && - // hasWaitingZones && - // workingZone.IsZoneActivated( - // activatedZoneIDX, - // activatedFVGIDX, - // signalBoxDir, - // signalProvider, - // provider, - // zIndex // - // ); - - // - // hasSignalBox = - // hasWorkingZone && - // hasWaitingBoxes && - // workingZone.IsBoxActivated( - // signalBox, - // signalBoxDir, - // signalProvider, - // provider, - // zIndex // - // ); - - // hasSignalBox = hasWorkingZone && workingZone.DetectSignalConditions( @@ -474,17 +447,37 @@ class XCX121SMCXWZSignalDetector : public XCBase else if (signalProvider == X121SMC_XWZ_PROVIDER_ACTIVATED_BOX) { // - iSL = MathMax( - provider.decisionXConditions.se1Buffer[1], - provider.decisionXConditions.se2Buffer[1] // - ); - if (iSL > 0) + if (isBullish) { // - Add( - iSL, - sls // + iSL = MathMin( + provider.decisionXConditions.le1Buffer[1], + provider.decisionXConditions.le2Buffer[1] // ); + if (iSL > 0) + { + // + Add( + iSL, + sls // + ); + } + } + else + { + // + iSL = MathMax( + provider.decisionXConditions.se1Buffer[1], + provider.decisionXConditions.se2Buffer[1] // + ); + if (iSL > 0) + { + // + Add( + iSL, + sls // + ); + } } } else if (signalProvider == X121SMC_XWZ_PROVIDER_ACTIVATED_AREA) diff --git a/X121SMCEA/Signals/x-121.smc.xwz.signal.lib.mq5 b/X121SMCEA/Signals/x-121.smc.xwz.signal.lib.mq5 index b1908d79..bc1a6fac 100644 --- a/X121SMCEA/Signals/x-121.smc.xwz.signal.lib.mq5 +++ b/X121SMCEA/Signals/x-121.smc.xwz.signal.lib.mq5 @@ -874,1118 +874,6 @@ struct X121SMCStrategyXWZWorkingZone return result; } - // - bool IsZoneActivated( - int &zoneIDX, - int &fvgIDX, - ENUM_X_DIRECTION &dir, - ENUM_X121SMC_XWZ_PROVIDERS &signalProvider, - X121SMCStrategySignalProviderData &provider, - int barIndex = 0 // - ) - { - // - bool result = false; - - // - fvgIDX = -1; - zoneIDX = -1; - dir = X_DIRECTION_NONE; - signalProvider = X121SMC_XWZ_PROVIDER_NONE; - - // - // Normalize Bar Index ... - if (barIndex < 0) - { - barIndex = 0; - } - - // - if (barIndex == 0) - { - barIndex = 1; - } - - // - // Validate ... - result = IsValid() && - HasWaitingZones(); - if (!result) - { - return result; - } - - // - XOHCL bar; - result = bar.Init( - symbol, - period, - barIndex // - ); - if (!result) - { - // - bar.Clean(); - - // - return result; - } - - // - double peak = provider.decisionXConditions.peaksBuffer[1]; - double vale = provider.decisionXConditions.valesBuffer[1]; - - // - double analysePeak = provider.analyseXConditions.peaksBuffer[1]; - double analyseVale = provider.analyseXConditions.valesBuffer[1]; - - // - double consolidationPeak = provider.consolidationXConditions.peaksBuffer[1]; - double consolidationVale = provider.consolidationXConditions.valesBuffer[1]; - - // - double visionPeak = provider.visionXConditions.peaksBuffer[1]; - double visionVale = provider.visionXConditions.valesBuffer[1]; - - // - bool isPeaksSame = - peak == analysePeak && - analysePeak == consolidationPeak; - - // - bool isValesSame = - vale == analyseVale && - analyseVale == consolidationVale; - - // - // - // - - // - bool isDecisionScoreBullish = - provider.decisionBullishScore > provider.decisionBearishScore; - - // - bool isDecisionScoreBearish = - provider.decisionBearishScore > provider.decisionBullishScore; - - // - bool isAnalyseScoreBullish = - provider.analyseBullishScore > provider.analyseBearishScore; - - // - bool isAnalyseScoreBearish = - provider.analyseBearishScore > provider.analyseBullishScore; - - // - bool isConsolidationScoreBullish = - provider.consolidationBullishScore > provider.consolidationBearishScore; - - // - bool isConsolidationScoreBearish = - provider.consolidationBearishScore > provider.consolidationBullishScore; - - // - bool isVisionScoreBullish = - provider.visionBullishScore > provider.visionBearishScore; - - // - bool isVisionScoreBearish = - provider.visionBearishScore > provider.visionBullishScore; - - // - int count = CountWaitingZones(); - for (int i = 0; i < count; i++) - { - // - XOBFVG iOBFVG = waitingZones[i]; - - // - ENUM_X_DIRECTION iDir = iOBFVG.GetDirection(); - bool isBullish = iOBFVG.IsBullish(); - - // - int fvgsCount = iOBFVG.CountFVGs(); - bool has = IsValidSize(fvgsCount); - if (has) - { - // - for (int j = 0; j < fvgsCount; j++) - { - // - XCFVG *jFVG = iOBFVG.fvgs[j]; - - // - XBoxZone iBox; - has = ToBox( - iBox, - jFVG // - ); - if (has) - { - // - double iRange = iBox.lower + ((iBox.upper - iBox.lower) / 2); - - // - // Activate Zone Using PV ... - bool isPVPassed = - isBullish - ? vale <= iBox.upper && - vale >= iBox.lower - : peak <= iBox.upper && - peak >= iBox.lower; - bool isPV50Passed = - isBullish - ? vale < iBox.upper && - vale <= iRange && - vale > iBox.lower - : peak < iBox.upper && - peak >= iRange && - peak > iBox.lower; - - // - // Activate Zone using Rejection ... - bool isRejected = - isBullish - ? bar.low <= iBox.upper && - bar.GetDown() > iBox.upper - : bar.high >= iBox.lower && - bar.GetUp() < iBox.lower; - - // - // Combine Result ... - // result = isPVPassed; - // || isPVPassed - // || isPV50Passed - // || isRejected; - - // - result = isPVPassed; - - if (result) - { - // - fvgIDX = j; - iBox.Clean(); - zoneIDX = i; - - // - break; - } - } - - // - if (result) - { - // - iBox.Clean(); - ZeroMemory(jFVG); - - // - break; - } - - // - iBox.Clean(); - } - } - - // - if (result) - { - // - iOBFVG.Clean(); - break; - } - - // - iOBFVG.Clean(); - } - - // - result = - IsValidIndex(fvgIDX) && - IsValidIndex(zoneIDX); - - // - bar.Clean(); - - // - if (result) - { - bar.Clean(); - } - - // - return result; - } - - // - bool IsBoxActivated( - XBoxZone &box, - ENUM_X_DIRECTION &dir, - ENUM_X121SMC_XWZ_PROVIDERS &signalProvider, - X121SMCStrategySignalProviderData &provider, - int barIndex = 0 // - ) - { - // - bool result = false; - - // - box.Clean(); - dir = X_DIRECTION_NONE; - signalProvider = X121SMC_XWZ_PROVIDER_NONE; - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - result = IsValid() && - HasWaitingBoxes(); - if (!result) - { - return result; - } - - // - XOHCL bar; - XOHCL cBar; - XOHCL pBar; - result = bar.Init( - symbol, - period, - barIndex // - ); - result = - result && - bar.GetPreviousBar(cBar); - result = - result && - cBar.GetPreviousBar(pBar); - if (!result) - { - // - bar.Clean(); - cBar.Clean(); - - // - return result; - } - - // - // Retrieve Some Required Data ... - - // - double peakZ = provider.decisionXConditions.peaksBuffer[0]; - double valeZ = provider.decisionXConditions.valesBuffer[0]; - double peak = provider.decisionXConditions.peaksBuffer[1]; - double vale = provider.decisionXConditions.valesBuffer[1]; - - // - double analysePeak = provider.analyseXConditions.peaksBuffer[1]; - double analyseVale = provider.analyseXConditions.valesBuffer[1]; - - // - double consolidationPeak = provider.consolidationXConditions.peaksBuffer[1]; - double consolidationVale = provider.consolidationXConditions.valesBuffer[1]; - - // - double visionPeak = provider.visionXConditions.peaksBuffer[1]; - double visionVale = provider.visionXConditions.valesBuffer[1]; - - // - bool isPeaksSame = - peak == analysePeak && - analysePeak == consolidationPeak; - - // - bool isValesSame = - vale == analyseVale && - analyseVale == consolidationVale; - - // - // Calculate Scores Conditions ... - - // - bool isDecisionScoreBullish = - provider.decisionBullishScore > provider.decisionBearishScore; - - // - bool isDecisionScoreBearish = - provider.decisionBearishScore > provider.decisionBullishScore; - - // - bool isAnalyseScoreBullish = - provider.analyseBullishScore > provider.analyseBearishScore; - - // - bool isAnalyseScoreBearish = - provider.analyseBearishScore > provider.analyseBullishScore; - - // - bool isConsolidationScoreBullish = - provider.consolidationBullishScore > provider.consolidationBearishScore; - - // - bool isConsolidationScoreBearish = - provider.consolidationBearishScore > provider.consolidationBullishScore; - - // - bool isVisionScoreBullish = - provider.visionBullishScore > provider.visionBearishScore; - - // - bool isVisionScoreBearish = - provider.visionBearishScore > provider.visionBullishScore; - - // - bool isScoreBullish = - isVisionScoreBullish && - isAnalyseScoreBullish && - isConsolidationScoreBullish; - - // - bool isScoreBearish = - isVisionScoreBearish && - isAnalyseScoreBearish && - isConsolidationScoreBearish; - - // - // Waiting Boxes ... - int count = CountWaitingBoxes(); - for (int i = 0; i < count; i++) - { - // - XBoxZone iBox = waitingBoxes[i]; - bool isBullish = iBox.IsBullish(); - - // - // Check Score ... - - // - bool isScorePassed = - isBullish - ? isScoreBullish - : isScoreBearish; - - // - // Check Bar Insides ... - - // - bool isPBarInside = - (pBar.high <= iBox.upper && - pBar.low >= iBox.lower) || - (isBullish - ? pBar.low < iBox.upper && - pBar.GetDown() < iBox.upper - : pBar.high > iBox.lower && - pBar.GetUp() > iBox.lower); - - // - bool isCBarInside = - (cBar.high <= iBox.upper && - cBar.low >= iBox.lower) || - (isBullish - ? cBar.low < iBox.upper && - cBar.GetDown() < iBox.upper - : cBar.high > iBox.lower && - cBar.GetUp() > iBox.lower); - - // - // Checking Rejection ... - - // - // Bullish ... - bool isBullishRejected = - isBullish && - cBar.low <= iBox.upper && - cBar.GetDown() > iBox.upper; - - // - // Bearish ... - bool isBearishRejected = - !isBullish && - cBar.high >= iBox.lower && - cBar.GetUp() < iBox.lower; - - // - // Check Breaktion ... - - // - // Bullish ... - bool isBullishBreaked = - isBullish && - cBar.high > iBox.upper && - cBar.GetUp() > iBox.upper && - cBar.low >= iBox.lower; - - // - // Bearish ... - bool isBearishBreaked = - !isBullish && - cBar.low < iBox.lower && - cBar.GetDown() < iBox.lower && - cBar.high <= iBox.upper; - - // - // Checking PV Pass ... - - // - bool isBullishPVPassed = - isBullish && - vale == valeZ && - vale > iBox.lower && - vale < iBox.upper; - - // - bool isBearishPVPassed = - !isBullish && - peak == peakZ && - peak > iBox.lower && - peak < iBox.upper; - - // - // Summarise ... - - // - // Rejection ... - bool isRejected = isBullishRejected || - isBearishRejected; - - // - // Breaktion ... - bool isBreaked = - isPBarInside && - (isBullishBreaked || - isBearishBreaked); - - // - bool isPVPassed = - (isBullishPVPassed || - isBearishPVPassed); - - // - // Trend Conditions ... - - // - bool isX3MABullish = - provider.decisionXConditions.isX3MaFastOverMid && - provider.decisionXConditions.x3maMidBuffer[1] > provider.decisionXConditions.x3maSlowBuffer[1]; - - // - bool isX3MABearish = - provider.decisionXConditions.isX3MaFastUnderMid && - provider.decisionXConditions.x3maMidBuffer[1] < provider.decisionXConditions.x3maSlowBuffer[1]; - - // - bool isVWapBullish = - provider.decisionXConditions.isVWapFastOverMid && - provider.decisionXConditions.vwapMidBuffer[1] > provider.decisionXConditions.vwapSlowBuffer[1]; - - // - bool isVWapBearish = - provider.decisionXConditions.isX3MaFastUnderMid && - provider.decisionXConditions.vwapMidBuffer[1] < provider.decisionXConditions.vwapSlowBuffer[1]; - - // - bool isTrendBullish = - isX3MABullish && - isVWapBullish; - - // - bool isTrendBearish = - isX3MABearish && - isVWapBearish; - - // - bool isTrendPassed = - isBullish - ? isTrendBullish - : isTrendBearish; - - // - // Summarize Conditions ... - - // - result = - // - // isBreaked || - // isRejected || - isPVPassed && - isRejected && - isTrendPassed && - isScorePassed - // - ; - - // - if (result) - { - // - box = iBox; - dir = iBox.dir; - signalProvider = X121SMC_XWZ_PROVIDER_ACTIVATED_BOX; - - // - iBox.Clean(); - break; - } - - // - iBox.Clean(); - - // - } - - // - // MA Trends ... - if (!result) - { - // - result = provider.analyseState.HasOrderBlocks(); - if (result) - { - // - // - // Trend Conditions ... - - // - bool isX3MABullish = - provider.decisionXConditions.isX3MaFastCrossedOverMid; - - // - bool isX3MABearish = - provider.decisionXConditions.isX3MaFastCrossedUnderMid; - - // - bool isVWapBullish = - provider.decisionXConditions.isVWapFastCrossedOverMid; - - // - bool isVWapBearish = - provider.decisionXConditions.isVWapFastCrossedUnderMid; - - // - // - // - - // - bool isTrendBullish = - (isX3MABullish || - isVWapBullish) && - provider.decisionXConditions.isNewPeakOverLast; - - // - bool isTrendBearish = - (isX3MABearish || - isVWapBearish) && - provider.decisionXConditions.isNewValeUnderLast; - - // - result = isTrendBullish || - isTrendBearish; - if (result) - { - // - // Select Signal Box ... - - // - bool isScorePassed = - isTrendBullish - ? isScoreBullish - : isScoreBearish; - - // - XBoxZone tmpBoxes[]; - ToBox( - provider.analyseState.orderBlocks, - tmpBoxes // - ); - Copy( - waitingBoxes, - tmpBoxes, - false // - ); - int idx = -1; - // bool has = false; - while (HasChild(tmpBoxes)) - { - // - if (isTrendBullish) - { - idx = GetHighest(tmpBoxes); - } - else - { - idx = GetLowest(tmpBoxes); - } - - // - result = IsValidIndex(idx); - if (!result) - { - break; - } - - // - XBoxZone iBox = tmpBoxes[idx]; - - // - ArrayRemove( - tmpBoxes, - idx, - 1 // - ); - - // - int insideIDX = -1; - bool hasInsideBox = HasInsideBox( - insideIDX, - iBox, - tmpBoxes // - ); - if (hasInsideBox) - { - // - hasInsideBox = - isTrendBullish - ? iBox.lower < tmpBoxes[insideIDX].lower - : iBox.upper > tmpBoxes[insideIDX].upper; - } - - // - bool isBullishPlacePassed = - // !hasInsideBox && - isTrendBullish && - iBox.IsBullish() && - bar.low >= iBox.upper && - cBar.low >= iBox.upper && - provider.decisionXConditions.x3maMin >= iBox.lower && - provider.decisionXConditions.vwapMin >= iBox.lower; - - // - bool isBearishPlacePassed = - // !hasInsideBox && - isTrendBearish && - iBox.IsBearish() && - bar.high <= iBox.lower && - cBar.high <= iBox.lower && - provider.decisionXConditions.x3maMax <= iBox.upper && - provider.decisionXConditions.vwapMax <= iBox.upper; - - // - result = isScorePassed && - (isBullishPlacePassed || - isBearishPlacePassed); - if (result) - { - // - box = iBox; - iBox.Clean(); - dir = - isTrendBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - signalProvider = X121SMC_XWZ_PROVIDER_ACTIVATED_MA; - break; - } - - // - } - Clean(tmpBoxes); - } - } - } - - // - // Supply and Demand ... - if (false && !result) - { - // - int idx = -1; - bool has = false; - XBoxZone tmpBoxes[]; - - // - // Detecting Youngest Zones ... - - // - XBoxZone bullishBox; - bool hasBullishBox = false; - if (!hasBullishBox) - { - // - XCOrderBlock *ob = NULL; - idx = GetYoungest(provider.analyseState.bullishOrderBlocks); - has = IsValidIndex(idx); - if (has) - { - // - ob = provider.analyseState.bullishOrderBlocks[idx]; - - // - XOHCL startedBar; - bool isBodyOut = false; - bool isStarted = ob.IsStarted( - ob.GetDirection(), - startedBar, - isBodyOut // - ); - has = isStarted && - isBodyOut; - if (has) - { - // - hasBullishBox = ToBox( - bullishBox, - ob // - ); - } - } - - // - if (!hasBullishBox) - { - bullishBox.Clean(); - } - - // - ZeroMemory(ob); - } - - // - XBoxZone bearishBox; - bool hasBearishBox = false; - if (!hasBearishBox) - { - // - XCOrderBlock *ob = NULL; - idx = GetYoungest(provider.analyseState.bearishOrderBlocks); - has = IsValidIndex(idx); - if (has) - { - // - ob = provider.analyseState.bearishOrderBlocks[idx]; - - // - XOHCL startedBar; - bool isBodyOut = false; - bool isStarted = ob.IsStarted( - ob.GetDirection(), - startedBar, - isBodyOut // - ); - has = isStarted && - isBodyOut; - if (has) - { - // - hasBearishBox = ToBox( - bearishBox, - ob // - ); - } - } - - // - if (!hasBearishBox) - { - bearishBox.Clean(); - } - - // - ZeroMemory(ob); - } - - // - XBoxZone bullishCZBox; - bool hasBullishConsolidationZone = false; - XConsolidationZone bullishConsolidationZone; - hasBullishConsolidationZone = provider.decisionState.HasBullishConsolidationZones(); - if (hasBullishConsolidationZone) - { - // - idx = GetYoungest(provider.decisionState.bullishConsolidationZones); - hasBullishConsolidationZone = IsValidIndex(idx); - if (hasBullishConsolidationZone) - { - // - bullishConsolidationZone = provider.decisionState.bullishConsolidationZones[idx]; - if (hasBullishConsolidationZone) - { - // - hasBullishConsolidationZone = ToBox( - bullishCZBox, - bullishConsolidationZone // - ); - } - } - } - - // - XBoxZone bearishCZBox; - bool hasBearishConsolidationZone = false; - XConsolidationZone bearishConsolidationZone; - hasBearishConsolidationZone = provider.decisionState.HasBearishConsolidationZones(); - if (hasBearishConsolidationZone) - { - // - idx = GetYoungest(provider.decisionState.bearishConsolidationZones); - hasBearishConsolidationZone = IsValidIndex(idx); - if (hasBearishConsolidationZone) - { - // - bearishConsolidationZone = provider.decisionState.bearishConsolidationZones[idx]; - if (hasBearishConsolidationZone) - { - // - hasBearishConsolidationZone = ToBox( - bearishCZBox, - bearishConsolidationZone // - ); - } - } - } - - // - // - // - - // - // Supply Zone ... - has = provider.visionState.HasSupplyZones(); - if (has) - { - // - ToBox( - provider.visionState.supplyZones, - tmpBoxes // - ); - - // - while (HasChild(tmpBoxes)) - { - // - idx = GetYoungest(tmpBoxes); - has = IsValidIndex(idx); - if (!has) - { - break; - } - - // - XBoxZone iBox = tmpBoxes[idx]; - ArrayRemove( - tmpBoxes, - idx, - 1 // - ); - - // - // Price Must Be Inside a Zonne More Than 5 Bar ... - bool isPriceInside = - // - bar.high < iBox.upper && - bar.low > iBox.lower && - // - cBar.high < iBox.upper && - cBar.low > iBox.lower && - // - pBar.high < iBox.upper && - pBar.low > iBox.lower - // - ; - - // - bool isBearishBoxPassed = - hasBearishBox && - IsBoxInside( - bearishBox, - iBox // - ); - - // - bool isBearishCZBoxPassed = - hasBearishConsolidationZone && - IsBoxInside( - bearishCZBox, - iBox // - ); - - // - result = isPriceInside && - (isBearishBoxPassed || - isBearishCZBoxPassed); - if (result) - { - // - if (isBearishBoxPassed) - { - box = bearishBox; - } - else - { - box = bearishCZBox; - } - - // - iBox.to = TimeCurrent(); - XCBoxObject *iObj; - provider.visionCycleHelper.mPOIDrawer.DrawBox( - iBox, - iObj // - ); - - // - dir = X_DIRECTION_BEARISH; - signalProvider = X121SMC_XWZ_PROVIDER_ACTIVATED_AREA; - - // - iBox.Clean(); - - // - break; - } - - // - iBox.Clean(); - } - - // - Clean(tmpBoxes); - } - - // - // Demand Zone ... - has = provider.visionState.HasDemandZones(); - if (!result && has) - { - // - ToBox( - provider.visionState.demandZones, - tmpBoxes // - ); - - // - while (HasChild(tmpBoxes)) - { - // - idx = GetYoungest(tmpBoxes); - has = IsValidIndex(idx); - if (!has) - { - break; - } - - // - XBoxZone iBox = tmpBoxes[idx]; - ArrayRemove( - tmpBoxes, - idx, - 1 // - ); - - // - // Price Must Be Inside a Zonne More Than 5 Bar ... - bool isPriceInside = - // - bar.high < iBox.upper && - bar.low > iBox.lower && - // - cBar.high < iBox.upper && - cBar.low > iBox.lower && - // - pBar.high < iBox.upper && - pBar.low > iBox.lower - // - ; - - // - bool isBullishBoxPassed = - hasBullishBox && - IsBoxInside( - bullishBox, - iBox // - ); - - // - bool isBullishCZBoxPassed = - hasBullishConsolidationZone && - IsBoxInside( - bullishCZBox, - iBox // - ); - - // - result = isPriceInside && - (isBullishBoxPassed || - isBullishCZBoxPassed); - if (result) - { - // - if (isBullishBoxPassed) - { - box = bullishBox; - } - else - { - box = bullishCZBox; - } - - // - iBox.to = TimeCurrent(); - XCBoxObject *iObj; - provider.visionCycleHelper.mPOIDrawer.DrawBox( - iBox, - iObj // - ); - - // - dir = X_DIRECTION_BULLISH; - signalProvider = X121SMC_XWZ_PROVIDER_ACTIVATED_AREA; - - // - iBox.Clean(); - - // - break; - } - - // - iBox.Clean(); - } - - // - Clean(tmpBoxes); - } - - // - Clean(tmpBoxes); - - // - bullishBox.Clean(); - bearishBox.Clean(); - bullishCZBox.Clean(); - bearishCZBox.Clean(); - bullishConsolidationZone.Clean(); - bearishConsolidationZone.Clean(); - - // - } - - // - bar.Clean(); - cBar.Clean(); - pBar.Clean(); - - // - return result; - } - // bool DetectSignalConditions( XBoxZone &box,