diff --git a/Classes/x-saherelm.x-poi.drawer.class.mq5 b/Classes/x-saherelm.x-poi.drawer.class.mq5 index 3aeeb722..55671829 100644 --- a/Classes/x-saherelm.x-poi.drawer.class.mq5 +++ b/Classes/x-saherelm.x-poi.drawer.class.mq5 @@ -3328,6 +3328,13 @@ class XCPOIDrawer : public XCBase return result; } + /** + * Draw Specified State Zone ... + * + * @param source: XStateZones instance Reference ... + * + * @return ( int ) + */ int DrawStateZones( XStateZones &source, XCBaseObject *&drawnObjects[] // diff --git a/Documents/BKP/1/3.mq5 b/Documents/BKP/1/3.mq5 new file mode 100644 index 00000000..80c7244b --- /dev/null +++ b/Documents/BKP/1/3.mq5 @@ -0,0 +1,285 @@ + + // + // 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; + } + + // + 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 = + // + isCNewValePrev && + isCCBarPassedBullish + // + ; + + // + isBearish = + // + isCNewPeakPrev && + isCCBarPassedBearish + // + ; + + // + result = isBullish || + isBearish; + if (!result) + { + return result; + } + + // + conditions.pivot = + isBullish + ? conditionState.x121Conditions.valesBuffer[1] + : conditionState.x121Conditions.peaksBuffer[1]; + + // + double peak = analyseConditions.x121Conditions.peaksBuffer[1]; + double vale = analyseConditions.x121Conditions.valesBuffer[1]; + + // + double strUpper = analyseConditions.x121Conditions.strUpBuffer[1]; + double strLower = analyseConditions.x121Conditions.strDownBuffer[1]; + + // + bool isStrSwitchedToBullish = analyseConditions.x121Conditions.isStrSwitchedToBullish; + bool isStrSwitchedToBearish = analyseConditions.x121Conditions.isStrSwitchedToBearish; + + // + isBullish = isStrSwitchedToBullish; + isBearish = isStrSwitchedToBearish; + + // + result = isBullish || + isBearish; + if (!result) + { + return result; + } + + // + conditions.pivot = + isBullish + ? peak + : vale; + + + + // + // Looking For Sar Change ... + + // + double sar = analyseConditions.x121Conditions.sarBuffer[1]; + + // + double peak = analyseConditions.x121Conditions.peaksBuffer[1]; + double vale = analyseConditions.x121Conditions.valesBuffer[1]; + + // + bool isSarEqualsToPeak = analyseConditions.x121Conditions.isSarEqualsToPeak; + bool isSarEqualsToVale = analyseConditions.x121Conditions.isSarEqualsToVale; + + // + bool isSarSwitchedToBullish = analyseConditions.x121Conditions.isSarSwitchedToBullish; + bool isSarSwitchedToBearish = analyseConditions.x121Conditions.isSarSwitchedToBearish; + + // + isBullish = + isBullish && + isSarEqualsToPeak && + isSarSwitchedToBullish; + + // + isBearish = + isBearish && + isSarEqualsToVale && + isSarSwitchedToBearish; + + // + result = isBullish || + isBearish; + if (!result) + { + return result; + } + + // + Print("Sar Switched ..."); + + + + // + // Detect a Zone Arround Price Zone ... + int supplyZonesCount = consolidationState.CountSupplyZones(); + if (IsValidSize(supplyZonesCount)) { + // + for (int i = 0; i < supplyZonesCount; i++) { + // + XCSupplyZone *iZone = consolidationState.supplyZones[i]; + + // + bool isOver = iZone.Lower() > pzUpper; + bool isUnder = iZone.Upper() < pzLower; + + // + bool isValid = + isOver || + isUnder; + if (isValid) { + + } + } + } diff --git a/Helpers/x-saherelm.x121.helper.mq5 b/Helpers/x-saherelm.x121.helper.mq5 index 1becd3da..15c4c538 100644 --- a/Helpers/x-saherelm.x121.helper.mq5 +++ b/Helpers/x-saherelm.x121.helper.mq5 @@ -186,34 +186,34 @@ struct X121Conditions // // Conditions ... - bool isRSIOverBought; - bool isRSICrossedOverOverBought; - bool isRSICrossedUnderOverBought; - bool isRSIOverSold; - bool isRSICrossedUnderOverSold; - bool isRSICrossedOverOverSold; + bool isRsiOverBought; + bool isRsiCrossedOverOverBought; + bool isRsiCrossedUnderOverBought; + bool isRsiOverSold; + bool isRsiCrossedUnderOverSold; + bool isRsiCrossedOverOverSold; // - bool isCloseOverATRUpper; - bool isCloseOverATRLower; - bool isCloseUnderATRUpper; - bool isCloseUnderATRLower; + bool isCloseOverAtrUpper; + bool isCloseOverAtrLower; + bool isCloseUnderAtrUpper; + bool isCloseUnderAtrLower; // - bool isRejectUpATRUpper; - bool isRejectDownATRUpper; + bool isRejectUpAtrUpper; + bool isRejectDownAtrUpper; // - bool isRejectUpATRLower; - bool isRejectDownATRLower; + bool isRejectUpAtrLower; + bool isRejectDownAtrLower; // - bool isBreakUpATRUpper; - bool isBreakDownATRUpper; + bool isBreakUpAtrUpper; + bool isBreakDownAtrUpper; // - bool isBreakUpATRLower; - bool isBreakDownATRLower; + bool isBreakUpAtrLower; + bool isBreakDownAtrLower; // bool isRejectDonOpenUpper; @@ -294,20 +294,76 @@ struct X121Conditions bool isSarEqualsToVale; // - bool isNewPeakOverATRUpper; - bool isNewValeUnderATRLower; + bool isSarCrossedUnderPeak; + bool isSarCrossedOverVale; + + // + bool isStrEqualsToPeak; + bool isStrEqualsToVale; + + // + bool isStrCrossedUnderPeak; + bool isStrCrossedOverVale; + + // + bool isPeakOverAtrUpper; + bool isValeUnderAtrLower; + + // + bool isNewPeakOverAtrUpper; + bool isNewValeUnderAtrLower; + + // + bool isStrUpperOverPeak; + bool isStrUpperUnderPeak; + + // + bool isStrUpperCrossedOverPeak; + bool isStrUpperCrossedUnderPeak; + + // + bool isStrLowerOverVale; + bool isStrLowerUnderVale; + + // + bool isStrLowerCrossedOverVale; + bool isStrLowerCrossedUnderVale; // bool isDonHighUpperEqualsToPeak; bool isDonLowLowerEqualsToVale; // - bool isSTRUpperCrossedOverATRUpper; - bool isSTRLowerCrossedUnderATRLower; + bool isStrUpperOverAtrUpper; + bool isStrUpperUnderAtrUpper; // - bool isSTRUpperCrossedOverDonHighUpper; - bool isSTRLowerCrossedUnderDonLowLower; + bool isStrLowerOverAtrLower; + bool isStrLowerUnderAtrLower; + + // + bool isStrUpperCrossedOverAtrUpper; + bool isStrUpperCrossedUnderAtrUpper; + + // + bool isStrLowerCrossedOverAtrLower; + bool isStrLowerCrossedUnderAtrLower; + + // + bool isStrUpperOverDonHighUpper; + bool isStrUpperUnderDonHighUpper; + + // + bool isStrLowerOverDonLowLower; + bool isStrLowerUnderDonLowLower; + + // + bool isStrUpperCrossedOverDonHighUpper; + bool isStrUpperCrossedUnderDonHighUpper; + + // + bool isStrLowerCrossedOverDonLowLower; + bool isStrLowerCrossedUnderDonLowLower; // // Constructor ... @@ -424,41 +480,41 @@ struct X121Conditions // RSI ... // - isRSIOverBought = false; - isRSICrossedOverOverBought = false; - isRSICrossedUnderOverBought = false; + isRsiOverBought = false; + isRsiCrossedOverOverBought = false; + isRsiCrossedUnderOverBought = false; // - isRSIOverSold = false; - isRSICrossedUnderOverSold = false; - isRSICrossedOverOverSold = false; + isRsiOverSold = false; + isRsiCrossedUnderOverSold = false; + isRsiCrossedOverOverSold = false; // // ATR ... // - isCloseOverATRUpper = false; - isCloseOverATRLower = false; + isCloseOverAtrUpper = false; + isCloseOverAtrLower = false; // - isCloseUnderATRUpper = false; - isCloseUnderATRLower = false; + isCloseUnderAtrUpper = false; + isCloseUnderAtrLower = false; // - isRejectUpATRUpper = false; - isRejectDownATRUpper = false; + isRejectUpAtrUpper = false; + isRejectDownAtrUpper = false; // - isRejectUpATRLower = false; - isRejectDownATRLower = false; + isRejectUpAtrLower = false; + isRejectDownAtrLower = false; // - isBreakUpATRUpper = false; - isBreakDownATRUpper = false; + isBreakUpAtrUpper = false; + isBreakDownAtrUpper = false; // - isBreakUpATRLower = false; - isBreakDownATRLower = false; + isBreakUpAtrLower = false; + isBreakDownAtrLower = false; // // DON ... @@ -574,20 +630,76 @@ struct X121Conditions isSarEqualsToVale = false; // - isNewPeakOverATRUpper = false; - isNewValeUnderATRLower = false; + isSarCrossedUnderPeak = false; + isSarCrossedOverVale = false; + + // + isStrEqualsToPeak = false; + isStrEqualsToVale = false; + + // + isStrCrossedUnderPeak = false; + isStrCrossedOverVale = false; + + // + isPeakOverAtrUpper = false; + isValeUnderAtrLower = false; + + // + isNewPeakOverAtrUpper = false; + isNewValeUnderAtrLower = false; + + // + isStrUpperOverPeak = false; + isStrUpperUnderPeak = false; + + // + isStrUpperCrossedOverPeak = false; + isStrUpperCrossedUnderPeak = false; + + // + isStrLowerOverVale = false; + isStrLowerUnderVale = false; + + // + isStrLowerCrossedOverVale = false; + isStrLowerCrossedUnderVale = false; // isDonHighUpperEqualsToPeak = false; isDonLowLowerEqualsToVale = false; // - isSTRUpperCrossedOverATRUpper = false; - isSTRLowerCrossedUnderATRLower = false; + isStrUpperOverAtrUpper = false; + isStrUpperUnderAtrUpper = false; // - isSTRUpperCrossedOverDonHighUpper = false; - isSTRLowerCrossedUnderDonLowLower = false; + isStrLowerOverAtrLower = false; + isStrLowerUnderAtrLower = false; + + // + isStrUpperCrossedOverAtrUpper = false; + isStrUpperCrossedUnderAtrUpper = false; + + // + isStrLowerCrossedOverAtrLower = false; + isStrLowerCrossedUnderAtrLower = false; + + // + isStrUpperOverDonHighUpper = false; + isStrUpperUnderDonHighUpper = false; + + // + isStrLowerOverDonLowLower = false; + isStrLowerUnderDonLowLower = false; + + // + isStrUpperCrossedOverDonHighUpper = false; + isStrUpperCrossedUnderDonHighUpper = false; + + // + isStrLowerCrossedOverDonLowLower = false; + isStrLowerCrossedUnderDonLowLower = false; } /** @@ -657,6 +769,7 @@ struct X121Conditions // string conditionsStr = // + "-----------------------" + separator + "SAR ..." + separator + "-----------------------" + separator + ToString("isSarBullish", isSarBullish, ignoreFalseConditions, separator) + @@ -664,6 +777,7 @@ struct X121Conditions ToString("isSarSwitchedToBullish", isSarSwitchedToBullish, ignoreFalseConditions, separator) + ToString("isSarSwitchedToBearish", isSarSwitchedToBearish, ignoreFalseConditions, separator) + // + "-----------------------" + separator + "STR ..." + separator + "-----------------------" + separator + ToString("isStrBullish", isStrBullish, ignoreFalseConditions, separator) + @@ -671,6 +785,7 @@ struct X121Conditions ToString("isStrSwitchedToBullish", isStrSwitchedToBullish, ignoreFalseConditions, separator) + ToString("isStrSwitchedToBearish", isStrSwitchedToBearish, ignoreFalseConditions, separator) + // + "-----------------------" + separator + "PV ..." + separator + "-----------------------" + separator + ToString("isNewPeak", isNewPeak, ignoreFalseConditions, separator) + @@ -680,32 +795,35 @@ struct X121Conditions ToString("isNewValeOverLast", isNewValeOverLast, ignoreFalseConditions, separator) + ToString("isNewValeUnderLast", isNewValeUnderLast, ignoreFalseConditions, separator) + // + "-----------------------" + separator + "> RSI ..." + separator + "-----------------------" + separator + - ToString("isRSIOverBought", isRSIOverBought, ignoreFalseConditions, separator) + - ToString("isRSICrossedOverOverBought", isRSICrossedOverOverBought, ignoreFalseConditions, separator) + - ToString("isRSICrossedUnderOverBought", isRSICrossedUnderOverBought, ignoreFalseConditions, separator) + - ToString("isRSIOverSold", isRSIOverSold, ignoreFalseConditions, separator) + - ToString("isRSICrossedUnderOverSold", isRSICrossedUnderOverSold, ignoreFalseConditions, separator) + - ToString("isRSICrossedOverOverSold", isRSICrossedOverOverSold, ignoreFalseConditions, separator) + + ToString("isRsiOverBought", isRsiOverBought, ignoreFalseConditions, separator) + + ToString("isRsiCrossedOverOverBought", isRsiCrossedOverOverBought, ignoreFalseConditions, separator) + + ToString("isRsiCrossedUnderOverBought", isRsiCrossedUnderOverBought, ignoreFalseConditions, separator) + + ToString("isRsiOverSold", isRsiOverSold, ignoreFalseConditions, separator) + + ToString("isRsiCrossedUnderOverSold", isRsiCrossedUnderOverSold, ignoreFalseConditions, separator) + + ToString("isRsiCrossedOverOverSold", isRsiCrossedOverOverSold, ignoreFalseConditions, separator) + // + "-----------------------" + separator + "ATR ..." + separator + "-----------------------" + separator + - ToString("isCloseOverATRUpper", isCloseOverATRUpper, ignoreFalseConditions, separator) + - ToString("isCloseOverATRLower", isCloseOverATRLower, ignoreFalseConditions, separator) + - ToString("isCloseUnderATRUpper", isCloseUnderATRUpper, ignoreFalseConditions, separator) + - ToString("isCloseUnderATRLower", isCloseUnderATRLower, ignoreFalseConditions, separator) + - ToString("isRejectUpATRUpper", isRejectUpATRUpper, ignoreFalseConditions, separator) + - ToString("isRejectDownATRUpper", isRejectDownATRUpper, ignoreFalseConditions, separator) + - ToString("isRejectUpATRLower", isRejectUpATRLower, ignoreFalseConditions, separator) + - ToString("isRejectDownATRLower", isRejectDownATRLower, ignoreFalseConditions, separator) + - ToString("isBreakUpATRUpper", isBreakUpATRUpper, ignoreFalseConditions, separator) + - ToString("isBreakDownATRUpper", isBreakDownATRUpper, ignoreFalseConditions, separator) + - ToString("isBreakUpATRLower", isBreakUpATRLower, ignoreFalseConditions, separator) + + ToString("isCloseOverAtrUpper", isCloseOverAtrUpper, ignoreFalseConditions, separator) + + ToString("isCloseOverAtrLower", isCloseOverAtrLower, ignoreFalseConditions, separator) + + ToString("isCloseUnderAtrUpper", isCloseUnderAtrUpper, ignoreFalseConditions, separator) + + ToString("isCloseUnderAtrLower", isCloseUnderAtrLower, ignoreFalseConditions, separator) + + ToString("isRejectUpAtrUpper", isRejectUpAtrUpper, ignoreFalseConditions, separator) + + ToString("isRejectDownAtrUpper", isRejectDownAtrUpper, ignoreFalseConditions, separator) + + ToString("isRejectUpAtrLower", isRejectUpAtrLower, ignoreFalseConditions, separator) + + ToString("isRejectDownAtrLower", isRejectDownAtrLower, ignoreFalseConditions, separator) + + ToString("isBreakUpAtrUpper", isBreakUpAtrUpper, ignoreFalseConditions, separator) + + ToString("isBreakDownAtrUpper", isBreakDownAtrUpper, ignoreFalseConditions, separator) + + ToString("isBreakUpAtrLower", isBreakUpAtrLower, ignoreFalseConditions, separator) + // + "-----------------------" + separator + "DON ..." + separator + "-----------------------" + separator + - ToString("isBreakDownATRLower", isBreakDownATRLower, ignoreFalseConditions, separator) + + ToString("isBreakDownAtrLower", isBreakDownAtrLower, ignoreFalseConditions, separator) + ToString("isRejectDonOpenUpper", isRejectDonOpenUpper, ignoreFalseConditions, separator) + ToString("isRejectDonHighUpper", isRejectDonHighUpper, ignoreFalseConditions, separator) + ToString("isRejectDonLowUpper", isRejectDonLowUpper, ignoreFalseConditions, separator) + @@ -723,6 +841,7 @@ struct X121Conditions ToString("isBreakDonLowLower", isBreakDonLowLower, ignoreFalseConditions, separator) + ToString("isBreakDonCloseLower", isBreakDonCloseLower, ignoreFalseConditions, separator) + // + "-----------------------" + separator + "VWAP ..." + separator + "-----------------------" + separator + ToString("isVWapFastBullish", isVWapFastBullish, ignoreFalseConditions, separator) + @@ -754,14 +873,42 @@ struct X121Conditions "-----------------------" + separator + ToString("isSarEqualsToPeak", isSarEqualsToPeak, ignoreFalseConditions, separator) + ToString("isSarEqualsToVale", isSarEqualsToVale, ignoreFalseConditions, separator) + - ToString("isNewPeakOverATRUpper", isNewPeakOverATRUpper, ignoreFalseConditions, separator) + - ToString("isNewValeUnderATRLower", isNewValeUnderATRLower, ignoreFalseConditions, separator) + + ToString("isSarCrossedUnderPeak", isSarCrossedUnderPeak, ignoreFalseConditions, separator) + + ToString("isSarCrossedOverVale", isSarCrossedOverVale, ignoreFalseConditions, separator) + + ToString("isStrEqualsToPeak", isStrEqualsToPeak, ignoreFalseConditions, separator) + + ToString("isStrEqualsToVale", isStrEqualsToVale, ignoreFalseConditions, separator) + + ToString("isStrCrossedUnderPeak", isStrCrossedUnderPeak, ignoreFalseConditions, separator) + + ToString("isStrCrossedOverVale", isStrCrossedOverVale, ignoreFalseConditions, separator) + + ToString("isPeakOverAtrUpper", isPeakOverAtrUpper, ignoreFalseConditions, separator) + + ToString("isValeUnderAtrLower", isValeUnderAtrLower, ignoreFalseConditions, separator) + + ToString("isNewPeakOverAtrUpper", isNewPeakOverAtrUpper, ignoreFalseConditions, separator) + + ToString("isNewValeUnderAtrLower", isNewValeUnderAtrLower, ignoreFalseConditions, separator) + + ToString("isStrUpperOverPeak", isStrUpperOverPeak, ignoreFalseConditions, separator) + + ToString("isStrUpperUnderPeak", isStrUpperUnderPeak, ignoreFalseConditions, separator) + + ToString("isStrUpperCrossedOverPeak", isStrUpperCrossedOverPeak, ignoreFalseConditions, separator) + + ToString("isStrUpperCrossedUnderPeak", isStrUpperCrossedUnderPeak, ignoreFalseConditions, separator) + + ToString("isStrLowerOverVale", isStrLowerOverVale, ignoreFalseConditions, separator) + + ToString("isStrLowerUnderVale", isStrLowerUnderVale, ignoreFalseConditions, separator) + + ToString("isStrLowerCrossedOverVale", isStrLowerCrossedOverVale, ignoreFalseConditions, separator) + + ToString("isStrLowerCrossedUnderVale", isStrLowerCrossedUnderVale, ignoreFalseConditions, separator) + ToString("isDonHighUpperEqualsToPeak", isDonHighUpperEqualsToPeak, ignoreFalseConditions, separator) + ToString("isDonLowLowerEqualsToVale", isDonLowLowerEqualsToVale, ignoreFalseConditions, separator) + - ToString("isSTRUpperCrossedOverATRUpper", isSTRUpperCrossedOverATRUpper, ignoreFalseConditions, separator) + - ToString("isSTRLowerCrossedUnderATRLower", isSTRLowerCrossedUnderATRLower, ignoreFalseConditions, separator) + - ToString("isSTRUpperCrossedOverDonHighUpper", isSTRUpperCrossedOverDonHighUpper, ignoreFalseConditions, separator) + - ToString("isSTRLowerCrossedUnderDonLowLower", isSTRLowerCrossedUnderDonLowLower, ignoreFalseConditions, separator) + + ToString("isStrUpperOverAtrUpper", isStrUpperOverAtrUpper, ignoreFalseConditions, separator) + + ToString("isStrUpperUnderAtrUpper", isStrUpperUnderAtrUpper, ignoreFalseConditions, separator) + + ToString("isStrLowerOverAtrLower", isStrLowerOverAtrLower, ignoreFalseConditions, separator) + + ToString("isStrLowerUnderAtrLower", isStrLowerUnderAtrLower, ignoreFalseConditions, separator) + + ToString("isStrUpperCrossedOverAtrUpper", isStrUpperCrossedOverAtrUpper, ignoreFalseConditions, separator) + + ToString("isStrUpperCrossedUnderAtrUpper", isStrUpperCrossedUnderAtrUpper, ignoreFalseConditions, separator) + + ToString("isStrLowerCrossedOverAtrLower", isStrLowerCrossedOverAtrLower, ignoreFalseConditions, separator) + + ToString("isStrLowerCrossedUnderAtrLower", isStrLowerCrossedUnderAtrLower, ignoreFalseConditions, separator) + + ToString("isStrUpperOverDonHighUpper", isStrUpperOverDonHighUpper, ignoreFalseConditions, separator) + + ToString("isStrUpperUnderDonHighUpper", isStrUpperUnderDonHighUpper, ignoreFalseConditions, separator) + + ToString("isStrLowerOverDonLowLower", isStrLowerOverDonLowLower, ignoreFalseConditions, separator) + + ToString("isStrLowerUnderDonLowLower", isStrLowerUnderDonLowLower, ignoreFalseConditions, separator) + + ToString("isStrUpperCrossedOverDonHighUpper", isStrUpperCrossedOverDonHighUpper, ignoreFalseConditions, separator) + + ToString("isStrUpperCrossedUnderDonHighUpper", isStrUpperCrossedUnderDonHighUpper, ignoreFalseConditions, separator) + + ToString("isStrLowerCrossedOverDonLowLower", isStrLowerCrossedOverDonLowLower, ignoreFalseConditions, separator) + + ToString("isStrLowerCrossedUnderDonLowLower", isStrLowerCrossedUnderDonLowLower, ignoreFalseConditions, separator) + // "" // @@ -1378,24 +1525,24 @@ class XCX121Helper : public XCBase // Conditions ... // - conditions.isRSIOverSold = xatrConditions.isRSIOverSold; - conditions.isRSIOverBought = xatrConditions.isRSIOverBought; - conditions.isBreakUpATRUpper = xatrConditions.isBreakUpATRUpper; - conditions.isBreakUpATRLower = xatrConditions.isBreakUpATRLower; - conditions.isCloseOverATRUpper = xatrConditions.isCloseOverATRUpper; - conditions.isRejectUpATRUpper = xatrConditions.isRejectUpATRUpper; - conditions.isRejectUpATRLower = xatrConditions.isRejectUpATRLower; - conditions.isCloseOverATRLower = xatrConditions.isCloseOverATRLower; - conditions.isBreakDownATRUpper = xatrConditions.isBreakDownATRUpper; - conditions.isBreakDownATRLower = xatrConditions.isBreakDownATRLower; - conditions.isCloseUnderATRUpper = xatrConditions.isCloseUnderATRUpper; - conditions.isCloseUnderATRLower = xatrConditions.isCloseUnderATRLower; - conditions.isRejectDownATRUpper = xatrConditions.isRejectDownATRUpper; - conditions.isRejectDownATRLower = xatrConditions.isRejectDownATRLower; - conditions.isRSICrossedOverOverSold = xatrConditions.isRSICrossedOverOverSold; - conditions.isRSICrossedUnderOverSold = xatrConditions.isRSICrossedUnderOverSold; - conditions.isRSICrossedOverOverBought = xatrConditions.isRSICrossedOverOverBought; - conditions.isRSICrossedUnderOverBought = xatrConditions.isRSICrossedUnderOverBought; + conditions.isRsiOverSold = xatrConditions.isRsiOverSold; + conditions.isRsiOverBought = xatrConditions.isRsiOverBought; + conditions.isBreakUpAtrUpper = xatrConditions.isBreakUpAtrUpper; + conditions.isBreakUpAtrLower = xatrConditions.isBreakUpAtrLower; + conditions.isCloseOverAtrUpper = xatrConditions.isCloseOverAtrUpper; + conditions.isRejectUpAtrUpper = xatrConditions.isRejectUpAtrUpper; + conditions.isRejectUpAtrLower = xatrConditions.isRejectUpAtrLower; + conditions.isCloseOverAtrLower = xatrConditions.isCloseOverAtrLower; + conditions.isBreakDownAtrUpper = xatrConditions.isBreakDownAtrUpper; + conditions.isBreakDownAtrLower = xatrConditions.isBreakDownAtrLower; + conditions.isCloseUnderAtrUpper = xatrConditions.isCloseUnderAtrUpper; + conditions.isCloseUnderAtrLower = xatrConditions.isCloseUnderAtrLower; + conditions.isRejectDownAtrUpper = xatrConditions.isRejectDownAtrUpper; + conditions.isRejectDownAtrLower = xatrConditions.isRejectDownAtrLower; + conditions.isRsiCrossedOverOverSold = xatrConditions.isRsiCrossedOverOverSold; + conditions.isRsiCrossedUnderOverSold = xatrConditions.isRsiCrossedUnderOverSold; + conditions.isRsiCrossedOverOverBought = xatrConditions.isRsiCrossedOverOverBought; + conditions.isRsiCrossedUnderOverBought = xatrConditions.isRsiCrossedUnderOverBought; // // XSTR ... @@ -1613,13 +1760,77 @@ class XCX121Helper : public XCBase conditions.sarBuffer[cIDX] == conditions.valesBuffer[cIDX]; // - bool isNewPeakOverATRUpper = - conditions.isNewPeak && + bool isSarCrossedUnderPeak = + conditions.sarBuffer[cIDX] < conditions.peaksBuffer[cIDX] && + !(conditions.sarBuffer[pIDX] < conditions.peaksBuffer[pIDX]); + bool isSarCrossedOverVale = + conditions.sarBuffer[cIDX] > conditions.valesBuffer[cIDX] && + !(conditions.sarBuffer[pIDX] > conditions.valesBuffer[pIDX]); + + // + bool isStrEqualsToPeak = + conditions.strBuffer[cIDX] == conditions.peaksBuffer[cIDX]; + bool isStrEqualsToVale = + conditions.strBuffer[cIDX] == conditions.valesBuffer[cIDX]; + + // + bool isStrCrossedUnderPeak = + conditions.strBuffer[cIDX] < conditions.peaksBuffer[cIDX] && + !(conditions.strBuffer[pIDX] < conditions.peaksBuffer[pIDX]); + bool isStrCrossedOverVale = + conditions.strBuffer[cIDX] > conditions.valesBuffer[cIDX] && + !(conditions.strBuffer[pIDX] > conditions.valesBuffer[pIDX]); + + // + bool isPeakOverAtrUpper = conditions.peaksBuffer[cIDX] > conditions.atrUpperBuffer[cIDX]; - bool isNewValeUnderATRLower = - conditions.isNewVale && + bool isValeUnderAtrLower = conditions.valesBuffer[cIDX] > conditions.atrLowerBuffer[cIDX]; + // + bool isNewPeakOverAtrUpper = + isPeakOverAtrUpper && + conditions.isNewPeak; + bool isNewValeUnderAtrLower = + isValeUnderAtrLower && + conditions.isNewVale; + + // + bool isStrUpperOverPeak = + conditions.strBuffer[cIDX] > conditions.peaksBuffer[cIDX]; + bool isStrUpperOverPeakPrev = + conditions.strBuffer[pIDX] > conditions.peaksBuffer[pIDX]; + + // + bool isStrUpperUnderPeak = + conditions.strBuffer[cIDX] < conditions.peaksBuffer[cIDX]; + bool isStrUpperUnderPeakPrev = + conditions.strBuffer[pIDX] < conditions.peaksBuffer[pIDX]; + + // + bool isStrUpperCrossedOverPeak = isStrUpperOverPeak && + !isStrUpperOverPeakPrev; + bool isStrUpperCrossedUnderPeak = isStrUpperUnderPeak && + !isStrUpperUnderPeakPrev; + + // + bool isStrLowerOverVale = + conditions.strBuffer[cIDX] > conditions.valesBuffer[cIDX]; + bool isStrLowerOverValePrev = + conditions.strBuffer[pIDX] > conditions.valesBuffer[pIDX]; + + // + bool isStrLowerUnderVale = + conditions.strBuffer[cIDX] < conditions.valesBuffer[cIDX]; + bool isStrLowerUnderValePrev = + conditions.strBuffer[pIDX] < conditions.valesBuffer[pIDX]; + + // + bool isStrLowerCrossedOverVale = isStrLowerOverVale && + !isStrLowerOverValePrev; + bool isStrLowerCrossedUnderVale = isStrLowerUnderVale && + !isStrLowerUnderValePrev; + // bool isDonHighUpperEqualsToPeak = conditions.donHighUpperBuffer[cIDX] == conditions.peaksBuffer[cIDX]; @@ -1627,48 +1838,108 @@ class XCX121Helper : public XCBase conditions.donLowLowerBuffer[cIDX] == conditions.valesBuffer[cIDX]; // - bool isSTRUpperOverATRUpper = + bool isStrUpperOverAtrUpper = conditions.strUpBuffer[cIDX] > conditions.atrUpperBuffer[cIDX]; - bool isSTRUpperOverATRUpperPrev = + bool isStrUpperOverAtrUpperPrev = conditions.strUpBuffer[pIDX] > conditions.atrUpperBuffer[pIDX]; - bool isSTRUpperCrossedOverATRUpper = isSTRUpperOverATRUpper && - !isSTRUpperOverATRUpperPrev; + bool isStrUpperCrossedOverAtrUpper = isStrUpperOverAtrUpper && + !isStrUpperOverAtrUpperPrev; // - bool isSTRLowerUnderATRLower = + bool isStrUpperUnderAtrUpper = + conditions.strUpBuffer[cIDX] < conditions.atrUpperBuffer[cIDX]; + bool isStrUpperUnderAtrUpperPrev = + conditions.strUpBuffer[pIDX] < conditions.atrUpperBuffer[pIDX]; + bool isStrUpperCrossedUnderAtrUpper = isStrUpperUnderAtrUpper && + !isStrUpperUnderAtrUpperPrev; + + // + bool isStrLowerOverAtrLower = + conditions.strDownBuffer[cIDX] > conditions.atrLowerBuffer[cIDX]; + bool isStrLowerOverAtrLowerPrev = + conditions.strDownBuffer[pIDX] > conditions.atrLowerBuffer[pIDX]; + bool isStrLowerCrossedOverAtrLower = isStrLowerOverAtrLower && + !isStrLowerOverAtrLowerPrev; + + // + bool isStrLowerUnderAtrLower = conditions.strDownBuffer[cIDX] < conditions.atrLowerBuffer[cIDX]; - bool isSTRLowerUnderATRLowerPrev = + bool isStrLowerUnderAtrLowerPrev = conditions.strDownBuffer[pIDX] < conditions.atrLowerBuffer[pIDX]; - bool isSTRLowerCrossedUnderATRLower = isSTRLowerUnderATRLower && - !isSTRLowerUnderATRLowerPrev; + bool isStrLowerCrossedUnderAtrLower = isStrLowerUnderAtrLower && + !isStrLowerUnderAtrLowerPrev; // - bool isSTRUpperOverDonHighUpper = + bool isStrUpperOverDonHighUpper = conditions.strUpBuffer[cIDX] > conditions.donHighUpperBuffer[cIDX]; - bool isSTRUpperOverDonHighUpperPrev = + bool isStrUpperOverDonHighUpperPrev = conditions.strUpBuffer[pIDX] > conditions.donHighUpperBuffer[pIDX]; - bool isSTRUpperCrossedOverDonHighUpper = isSTRUpperOverDonHighUpper && - !isSTRUpperOverDonHighUpperPrev; + bool isStrUpperCrossedOverDonHighUpper = isStrUpperOverDonHighUpper && + !isStrUpperOverDonHighUpperPrev; // - bool isSTRLowerUnderDonLowLower = + bool isStrUpperUnderDonHighUpper = + conditions.strUpBuffer[cIDX] < conditions.donHighUpperBuffer[cIDX]; + bool isStrUpperUnderDonHighUpperPrev = + conditions.strUpBuffer[pIDX] < conditions.donHighUpperBuffer[pIDX]; + bool isStrUpperCrossedUnderDonHighUpper = isStrUpperUnderDonHighUpper && + !isStrUpperUnderDonHighUpperPrev; + + // + bool isStrLowerOverDonLowLower = + conditions.strDownBuffer[cIDX] > conditions.donLowLowerBuffer[cIDX]; + bool isStrLowerOverDonLowLowerPrev = + conditions.strDownBuffer[pIDX] > conditions.donLowLowerBuffer[pIDX]; + bool isStrLowerCrossedOverDonLowLower = isStrLowerOverDonLowLower && + !isStrLowerOverDonLowLowerPrev; + + // + bool isStrLowerUnderDonLowLower = conditions.strDownBuffer[cIDX] < conditions.donLowLowerBuffer[cIDX]; - bool isSTRLowerUnderDonLowLowerPrev = + bool isStrLowerUnderDonLowLowerPrev = conditions.strDownBuffer[pIDX] < conditions.donLowLowerBuffer[pIDX]; - bool isSTRLowerCrossedUnderDonLowLower = isSTRLowerUnderDonLowLower && - !isSTRLowerUnderDonLowLowerPrev; + bool isStrLowerCrossedUnderDonLowLower = isStrLowerUnderDonLowLower && + !isStrLowerUnderDonLowLowerPrev; // conditions.isSarEqualsToPeak = isSarEqualsToPeak; conditions.isSarEqualsToVale = isSarEqualsToVale; - conditions.isNewPeakOverATRUpper = isNewPeakOverATRUpper; - conditions.isNewValeUnderATRLower = isNewValeUnderATRLower; - conditions.isDonHighUpperEqualsToPeak = isDonHighUpperEqualsToPeak; + conditions.isStrEqualsToPeak = isStrEqualsToPeak; + conditions.isStrEqualsToVale = isStrEqualsToVale; + conditions.isStrUpperOverPeak = isStrUpperOverPeak; + conditions.isPeakOverAtrUpper = isPeakOverAtrUpper; + conditions.isStrLowerOverVale = isStrLowerOverVale; + conditions.isStrLowerUnderVale = isStrLowerUnderVale; + conditions.isStrUpperUnderPeak = isStrUpperUnderPeak; + conditions.isValeUnderAtrLower = isValeUnderAtrLower; + conditions.isSarCrossedOverVale = isSarCrossedOverVale; + conditions.isStrCrossedOverVale = isStrCrossedOverVale; + conditions.isSarCrossedUnderPeak = isSarCrossedUnderPeak; + conditions.isStrCrossedUnderPeak = isStrCrossedUnderPeak; + conditions.isNewPeakOverAtrUpper = isNewPeakOverAtrUpper; + conditions.isNewValeUnderAtrLower = isNewValeUnderAtrLower; + conditions.isStrUpperOverAtrUpper = isStrUpperOverAtrUpper; + conditions.isStrLowerOverAtrLower = isStrLowerOverAtrLower; + conditions.isStrUpperUnderAtrUpper = isStrUpperUnderAtrUpper; + conditions.isStrLowerUnderAtrLower = isStrLowerUnderAtrLower; conditions.isDonLowLowerEqualsToVale = isDonLowLowerEqualsToVale; - conditions.isSTRUpperCrossedOverATRUpper = isSTRUpperCrossedOverATRUpper; - conditions.isSTRLowerCrossedUnderATRLower = isSTRLowerCrossedUnderATRLower; - conditions.isSTRUpperCrossedOverDonHighUpper = isSTRUpperCrossedOverDonHighUpper; - conditions.isSTRLowerCrossedUnderDonLowLower = isSTRLowerCrossedUnderDonLowLower; + conditions.isStrUpperCrossedOverPeak = isStrUpperCrossedOverPeak; + conditions.isStrLowerCrossedOverVale = isStrLowerCrossedOverVale; + conditions.isStrLowerOverDonLowLower = isStrLowerOverDonLowLower; + conditions.isStrUpperOverDonHighUpper = isStrUpperOverDonHighUpper; + conditions.isStrLowerUnderDonLowLower = isStrLowerUnderDonLowLower; + conditions.isDonHighUpperEqualsToPeak = isDonHighUpperEqualsToPeak; + conditions.isStrUpperCrossedUnderPeak = isStrUpperCrossedUnderPeak; + conditions.isStrLowerCrossedUnderVale = isStrLowerCrossedUnderVale; + conditions.isStrUpperUnderDonHighUpper = isStrUpperUnderDonHighUpper; + conditions.isStrLowerCrossedOverAtrLower = isStrLowerCrossedOverAtrLower; + conditions.isStrUpperCrossedOverAtrUpper = isStrUpperCrossedOverAtrUpper; + conditions.isStrUpperCrossedUnderAtrUpper = isStrUpperCrossedUnderAtrUpper; + conditions.isStrLowerCrossedUnderAtrLower = isStrLowerCrossedUnderAtrLower; + conditions.isStrLowerCrossedOverDonLowLower = isStrLowerCrossedOverDonLowLower; + conditions.isStrUpperCrossedOverDonHighUpper = isStrUpperCrossedOverDonHighUpper; + conditions.isStrLowerCrossedUnderDonLowLower = isStrLowerCrossedUnderDonLowLower; + conditions.isStrUpperCrossedUnderDonHighUpper = isStrUpperCrossedUnderDonHighUpper; // return result; diff --git a/Helpers/x-saherelm.x121.xatr.helper.mq5 b/Helpers/x-saherelm.x121.xatr.helper.mq5 index 20b5848c..dc3aa17a 100644 --- a/Helpers/x-saherelm.x121.xatr.helper.mq5 +++ b/Helpers/x-saherelm.x121.xatr.helper.mq5 @@ -197,41 +197,41 @@ struct X121XATRConditions // RSI ... // - bool isRSIOverBought; - bool isRSICrossedOverOverBought; - bool isRSICrossedUnderOverBought; + bool isRsiOverBought; + bool isRsiCrossedOverOverBought; + bool isRsiCrossedUnderOverBought; // - bool isRSIOverSold; - bool isRSICrossedUnderOverSold; - bool isRSICrossedOverOverSold; + bool isRsiOverSold; + bool isRsiCrossedUnderOverSold; + bool isRsiCrossedOverOverSold; // // ATR ... // - bool isCloseOverATRUpper; - bool isCloseOverATRLower; + bool isCloseOverAtrUpper; + bool isCloseOverAtrLower; // - bool isCloseUnderATRUpper; - bool isCloseUnderATRLower; + bool isCloseUnderAtrUpper; + bool isCloseUnderAtrLower; // - bool isRejectUpATRUpper; - bool isRejectDownATRUpper; + bool isRejectUpAtrUpper; + bool isRejectDownAtrUpper; // - bool isRejectUpATRLower; - bool isRejectDownATRLower; + bool isRejectUpAtrLower; + bool isRejectDownAtrLower; // - bool isBreakUpATRUpper; - bool isBreakDownATRUpper; + bool isBreakUpAtrUpper; + bool isBreakDownAtrUpper; // - bool isBreakUpATRLower; - bool isBreakDownATRLower; + bool isBreakUpAtrLower; + bool isBreakDownAtrLower; // // bool isCloseLower @@ -283,41 +283,41 @@ struct X121XATRConditions // RSI ... // - isRSIOverBought = false; - isRSICrossedOverOverBought = false; - isRSICrossedUnderOverBought = false; + isRsiOverBought = false; + isRsiCrossedOverOverBought = false; + isRsiCrossedUnderOverBought = false; // - isRSIOverSold = false; - isRSICrossedUnderOverSold = false; - isRSICrossedOverOverSold = false; + isRsiOverSold = false; + isRsiCrossedUnderOverSold = false; + isRsiCrossedOverOverSold = false; // // ATR ... // - isCloseOverATRUpper = false; - isCloseOverATRLower = false; + isCloseOverAtrUpper = false; + isCloseOverAtrLower = false; // - isCloseUnderATRUpper = false; - isCloseUnderATRLower = false; + isCloseUnderAtrUpper = false; + isCloseUnderAtrLower = false; // - isRejectUpATRUpper = false; - isRejectDownATRUpper = false; + isRejectUpAtrUpper = false; + isRejectDownAtrUpper = false; // - isRejectUpATRLower = false; - isRejectDownATRLower = false; + isRejectUpAtrLower = false; + isRejectDownAtrLower = false; // - isBreakUpATRUpper = false; - isBreakDownATRUpper = false; + isBreakUpAtrUpper = false; + isBreakDownAtrUpper = false; // - isBreakUpATRLower = false; - isBreakDownATRLower = false; + isBreakUpAtrLower = false; + isBreakDownAtrLower = false; // // XDON ... @@ -394,26 +394,26 @@ struct X121XATRConditions string conditionsStr = // // RSI ... - ToString("isRSIOverBought", isRSIOverBought, ignoreFalseConditions, separator) + - ToString("isRSICrossedOverOverBought", isRSICrossedOverOverBought, ignoreFalseConditions, separator) + - ToString("isRSICrossedUnderOverBought", isRSICrossedUnderOverBought, ignoreFalseConditions, separator) + - ToString("isRSIOverSold", isRSIOverSold, ignoreFalseConditions, separator) + - ToString("isRSICrossedUnderOverSold", isRSICrossedUnderOverSold, ignoreFalseConditions, separator) + - ToString("isRSICrossedOverOverSold", isRSICrossedOverOverSold, ignoreFalseConditions, separator) + + ToString("isRsiOverBought", isRsiOverBought, ignoreFalseConditions, separator) + + ToString("isRsiCrossedOverOverBought", isRsiCrossedOverOverBought, ignoreFalseConditions, separator) + + ToString("isRsiCrossedUnderOverBought", isRsiCrossedUnderOverBought, ignoreFalseConditions, separator) + + ToString("isRsiOverSold", isRsiOverSold, ignoreFalseConditions, separator) + + ToString("isRsiCrossedUnderOverSold", isRsiCrossedUnderOverSold, ignoreFalseConditions, separator) + + ToString("isRsiCrossedOverOverSold", isRsiCrossedOverOverSold, ignoreFalseConditions, separator) + // // ATR ... - ToString("isCloseOverATRUpper", isCloseOverATRUpper, ignoreFalseConditions, separator) + - ToString("isCloseOverATRLower", isCloseOverATRLower, ignoreFalseConditions, separator) + - ToString("isCloseUnderATRUpper", isCloseUnderATRUpper, ignoreFalseConditions, separator) + - ToString("isCloseUnderATRLower", isCloseUnderATRLower, ignoreFalseConditions, separator) + - ToString("isRejectUpATRUpper", isRejectUpATRUpper, ignoreFalseConditions, separator) + - ToString("isRejectDownATRUpper", isRejectDownATRUpper, ignoreFalseConditions, separator) + - ToString("isRejectUpATRLower", isRejectUpATRLower, ignoreFalseConditions, separator) + - ToString("isRejectDownATRLower", isRejectDownATRLower, ignoreFalseConditions, separator) + - ToString("isBreakUpATRUpper", isBreakUpATRUpper, ignoreFalseConditions, separator) + - ToString("isBreakDownATRUpper", isBreakDownATRUpper, ignoreFalseConditions, separator) + - ToString("isBreakUpATRLower", isBreakUpATRLower, ignoreFalseConditions, separator) + - ToString("isBreakDownATRLower", isBreakDownATRLower, ignoreFalseConditions, separator) + + ToString("isCloseOverAtrUpper", isCloseOverAtrUpper, ignoreFalseConditions, separator) + + ToString("isCloseOverAtrLower", isCloseOverAtrLower, ignoreFalseConditions, separator) + + ToString("isCloseUnderAtrUpper", isCloseUnderAtrUpper, ignoreFalseConditions, separator) + + ToString("isCloseUnderAtrLower", isCloseUnderAtrLower, ignoreFalseConditions, separator) + + ToString("isRejectUpAtrUpper", isRejectUpAtrUpper, ignoreFalseConditions, separator) + + ToString("isRejectDownAtrUpper", isRejectDownAtrUpper, ignoreFalseConditions, separator) + + ToString("isRejectUpAtrLower", isRejectUpAtrLower, ignoreFalseConditions, separator) + + ToString("isRejectDownAtrLower", isRejectDownAtrLower, ignoreFalseConditions, separator) + + ToString("isBreakUpAtrUpper", isBreakUpAtrUpper, ignoreFalseConditions, separator) + + ToString("isBreakDownAtrUpper", isBreakDownAtrUpper, ignoreFalseConditions, separator) + + ToString("isBreakUpAtrLower", isBreakUpAtrLower, ignoreFalseConditions, separator) + + ToString("isBreakDownAtrLower", isBreakDownAtrLower, ignoreFalseConditions, separator) + // "" // @@ -999,56 +999,56 @@ class XCX121XATRHelper : public XCBaseHelper // RSI ... // - bool isRSIOverBought = conditions.rsiBuffer[cIDX] > mInputs.rsiOverBoughtLevel; - bool isRSIOverBoughtPrev = conditions.rsiBuffer[pIDX] > mInputs.rsiOverBoughtLevel; + bool isRsiOverBought = conditions.rsiBuffer[cIDX] > mInputs.rsiOverBoughtLevel; + bool isRsiOverBoughtPrev = conditions.rsiBuffer[pIDX] > mInputs.rsiOverBoughtLevel; // - bool isRSICrossedOverOverBought = isRSIOverBought && - !isRSIOverBoughtPrev; - bool isRSICrossedUnderOverBought = !isRSIOverBought && - isRSIOverBoughtPrev; + bool isRsiCrossedOverOverBought = isRsiOverBought && + !isRsiOverBoughtPrev; + bool isRsiCrossedUnderOverBought = !isRsiOverBought && + isRsiOverBoughtPrev; // - bool isRSIOverSold = conditions.rsiBuffer[cIDX] < mInputs.rsiOverSoldLevel; - bool isRSIOverSoldPrev = conditions.rsiBuffer[pIDX] < mInputs.rsiOverSoldLevel; + bool isRsiOverSold = conditions.rsiBuffer[cIDX] < mInputs.rsiOverSoldLevel; + bool isRsiOverSoldPrev = conditions.rsiBuffer[pIDX] < mInputs.rsiOverSoldLevel; // - bool isRSICrossedUnderOverSold = isRSIOverSold && - !isRSIOverSoldPrev; - bool isRSICrossedOverOverSold = !isRSIOverSold && - isRSIOverSoldPrev; + bool isRsiCrossedUnderOverSold = isRsiOverSold && + !isRsiOverSoldPrev; + bool isRsiCrossedOverOverSold = !isRsiOverSold && + isRsiOverSoldPrev; // // ATR ... // - bool isCloseOverATRUpper = cBar.close > conditions.atrUpperBuffer[cIDX]; - bool isCloseOverATRLower = cBar.close > conditions.atrLowerBuffer[cIDX]; + bool isCloseOverAtrUpper = cBar.close > conditions.atrUpperBuffer[cIDX]; + bool isCloseOverAtrLower = cBar.close > conditions.atrLowerBuffer[cIDX]; // - bool isCloseUnderATRUpper = cBar.close < conditions.atrUpperBuffer[cIDX]; - bool isCloseUnderATRLower = cBar.close < conditions.atrLowerBuffer[cIDX]; + bool isCloseUnderAtrUpper = cBar.close < conditions.atrUpperBuffer[cIDX]; + bool isCloseUnderAtrLower = cBar.close < conditions.atrLowerBuffer[cIDX]; // - bool isRejectUpATRUpper = IsBarReject( + bool isRejectUpAtrUpper = IsBarReject( atrUpperBuffer[cIDX], X_DIRECTION_BULLISH, cBar // ); - bool isRejectDownATRUpper = IsBarReject( + bool isRejectDownAtrUpper = IsBarReject( atrUpperBuffer[cIDX], X_DIRECTION_BEARISH, cBar // ); // - bool isRejectUpATRLower = IsBarReject( + bool isRejectUpAtrLower = IsBarReject( atrLowerBuffer[cIDX], X_DIRECTION_BULLISH, cBar // ); ; - bool isRejectDownATRLower = IsBarReject( + bool isRejectDownAtrLower = IsBarReject( atrLowerBuffer[cIDX], X_DIRECTION_BEARISH, cBar // @@ -1056,48 +1056,48 @@ class XCX121XATRHelper : public XCBaseHelper ; // - bool isBreakUpATRUpper = IsBarBreak( + bool isBreakUpAtrUpper = IsBarBreak( atrUpperBuffer[cIDX], X_DIRECTION_BULLISH, cBar // ); - bool isBreakDownATRUpper = IsBarBreak( + bool isBreakDownAtrUpper = IsBarBreak( atrUpperBuffer[cIDX], X_DIRECTION_BEARISH, cBar // ); // - bool isBreakUpATRLower = IsBarBreak( + bool isBreakUpAtrLower = IsBarBreak( atrLowerBuffer[cIDX], X_DIRECTION_BULLISH, cBar // ); - bool isBreakDownATRLower = IsBarBreak( + bool isBreakDownAtrLower = IsBarBreak( atrLowerBuffer[cIDX], X_DIRECTION_BEARISH, cBar // ); // - conditions.isRSIOverSold = isRSIOverSold; - conditions.isRSIOverBought = isRSIOverBought; - conditions.isRejectUpATRUpper = isRejectUpATRUpper; - conditions.isRejectUpATRLower = isRejectUpATRLower; - conditions.isBreakUpATRUpper = isBreakUpATRUpper; - conditions.isBreakUpATRLower = isBreakUpATRLower; - conditions.isRejectDownATRUpper = isRejectDownATRUpper; - conditions.isRejectDownATRLower = isRejectDownATRLower; - conditions.isCloseOverATRUpper = isCloseOverATRUpper; - conditions.isCloseOverATRLower = isCloseOverATRLower; - conditions.isBreakDownATRUpper = isBreakDownATRUpper; - conditions.isBreakDownATRLower = isBreakDownATRLower; - conditions.isCloseUnderATRUpper = isCloseUnderATRUpper; - conditions.isCloseUnderATRLower = isCloseUnderATRLower; - conditions.isRSICrossedOverOverSold = isRSICrossedOverOverSold; - conditions.isRSICrossedUnderOverSold = isRSICrossedUnderOverSold; - conditions.isRSICrossedOverOverBought = isRSICrossedOverOverBought; - conditions.isRSICrossedUnderOverBought = isRSICrossedUnderOverBought; + conditions.isRsiOverSold = isRsiOverSold; + conditions.isRsiOverBought = isRsiOverBought; + conditions.isRejectUpAtrUpper = isRejectUpAtrUpper; + conditions.isRejectUpAtrLower = isRejectUpAtrLower; + conditions.isBreakUpAtrUpper = isBreakUpAtrUpper; + conditions.isBreakUpAtrLower = isBreakUpAtrLower; + conditions.isRejectDownAtrUpper = isRejectDownAtrUpper; + conditions.isRejectDownAtrLower = isRejectDownAtrLower; + conditions.isCloseOverAtrUpper = isCloseOverAtrUpper; + conditions.isCloseOverAtrLower = isCloseOverAtrLower; + conditions.isBreakDownAtrUpper = isBreakDownAtrUpper; + conditions.isBreakDownAtrLower = isBreakDownAtrLower; + conditions.isCloseUnderAtrUpper = isCloseUnderAtrUpper; + conditions.isCloseUnderAtrLower = isCloseUnderAtrLower; + conditions.isRsiCrossedOverOverSold = isRsiCrossedOverOverSold; + conditions.isRsiCrossedUnderOverSold = isRsiCrossedUnderOverSold; + conditions.isRsiCrossedOverOverBought = isRsiCrossedOverOverBought; + conditions.isRsiCrossedUnderOverBought = isRsiCrossedUnderOverBought; // return result; diff --git a/Helpers/x-saherelm.x121.xstr.helper.mq5 b/Helpers/x-saherelm.x121.xstr.helper.mq5 index 83e60eaa..f559415b 100644 --- a/Helpers/x-saherelm.x121.xstr.helper.mq5 +++ b/Helpers/x-saherelm.x121.xstr.helper.mq5 @@ -743,6 +743,59 @@ class XCX121XSTRHelper : public XCBaseHelper ); } + // + double GetLastSTR( + ENUM_X_DIRECTION dir, + int barIndex = 0 // + ) + { + // + double result = 0; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + if (!HasDirection(dir)) + { + return result; + } + + // + int index = barIndex; + bool isBullish = IsBullish(dir); + + // + bool canContinue = true; + while (canContinue) + { + // + double iStr = GetSTR(index); + double iState = GetSTRState(index); + + // + canContinue = + isBullish + ? iState < 0 + : iState > 0; + if (!canContinue) + { + // + result = iStr; + break; + } + + // + index++; + } + + // + return result; + } + // bool GetConditions( X121XSTRConditions &conditions, // diff --git a/X121SMCEA/Signals/x-121.smc.xobgpv.signal.lib.mq5 b/X121SMCEA/Signals/x-121.smc.xobgpv.signal.lib.mq5 index 259b64bf..5f501653 100644 --- a/X121SMCEA/Signals/x-121.smc.xobgpv.signal.lib.mq5 +++ b/X121SMCEA/Signals/x-121.smc.xobgpv.signal.lib.mq5 @@ -676,12 +676,12 @@ bool DetectX121SMCXOBGPVSiganlTrigger( double isNewDecisionVale = decisionConditions.x121Conditions.isNewVale; // - bool isTriggerRSICrossedOverOverSold = triggerConditions.x121Conditions.isRSICrossedOverOverSold; - bool isTriggerRSICrossedUnderOverBought = triggerConditions.x121Conditions.isRSICrossedUnderOverBought; + bool isTriggerRSICrossedOverOverSold = triggerConditions.x121Conditions.isRsiCrossedOverOverSold; + bool isTriggerRSICrossedUnderOverBought = triggerConditions.x121Conditions.isRsiCrossedUnderOverBought; // - bool isDecisionRSICrossedOverOverSold = decisionConditions.x121Conditions.isRSICrossedOverOverSold; - bool isDecisionRSICrossedUnderOverBought = decisionConditions.x121Conditions.isRSICrossedUnderOverBought; + bool isDecisionRSICrossedOverOverSold = decisionConditions.x121Conditions.isRsiCrossedOverOverSold; + bool isDecisionRSICrossedUnderOverBought = decisionConditions.x121Conditions.isRsiCrossedUnderOverBought; // // Waits For Price to Go Inside FVG ... diff --git a/X121SMCEA/Signals/x-121.smc.xobspv.signal.lib.mq5 b/X121SMCEA/Signals/x-121.smc.xobspv.signal.lib.mq5 index d8c43cc3..da75d5bd 100644 --- a/X121SMCEA/Signals/x-121.smc.xobspv.signal.lib.mq5 +++ b/X121SMCEA/Signals/x-121.smc.xobspv.signal.lib.mq5 @@ -50,6 +50,7 @@ struct X121SMCStrategyXOBSPVSignalConditions // double pivot; + XPriceZones priceZone; // // Constructor ... @@ -167,6 +168,9 @@ struct X121SMCStrategyXOBSPVSignalConditions { // pivot = 0; + + // + priceZone.Clean(); } // @@ -408,169 +412,213 @@ bool DetectX121SMCXOBSPVSiganlSetup( } // - bool isStrSwitchedToBullish = analyseConditions.x121Conditions.isStrSwitchedToBullish; - bool isStrSwitchedToBearish = analyseConditions.x121Conditions.isStrSwitchedToBearish; + double decisionPeak = decisionConditions.x121Conditions.peaksBuffer[1]; + double decisionVale = decisionConditions.x121Conditions.valesBuffer[1]; // - if (isStrSwitchedToBullish || - isStrSwitchedToBearish) + // Find Price Inside Zone ... + XPriceZones priceZone = conditions.priceZone; + bool hasPriceZones = conditions.priceZone.IsValid(); + if (!hasPriceZones) { - Print("Str State Changed ..."); + // + hasPriceZones = CalculatePriceInsideZones( + priceZone, + analyseState, + cBar // + ); + + // + if (hasPriceZones) + { + // + // Validate Price Zone ... + double upper = 0; + double lower = 0; + hasPriceZones = priceZone.GetBoundary( + X_DIRECTION_ALL, + upper, + lower // + ); + result = hasPriceZones; + if (!result) + { + return result; + } + + // + bool isValid = decisionPeak <= upper || + decisionVale >= lower; + hasPriceZones = isValid; + result = hasPriceZones; + if (!result) + { + return result; + } + + // + conditions.priceZone = priceZone; + } } // - X121SMCCycleConditions conditionState = consolidationConditions; - X121SMCCycleConditions conditionStatePrev = consolidationConditionsPrev; + // Detect Str Change Direction ... // - XOHCL cCBar; - result = cCBar.Init( - conditionState.symbol, - conditionState.period, - cIndex // - ); - if (!result) - { - return result; - } + bool isDecisionSarBullish = decisionConditions.x121Conditions.isSarBullish; + bool isDecisionSarBearish = decisionConditions.x121Conditions.isSarBearish; // - XOHCL cPBar; - result = cCBar.GetPreviousBar(cPBar); - if (!result) - { - return result; - } + bool isDecisionStrBullish = decisionConditions.x121Conditions.isStrBullish; + bool isDecisionStrBearish = decisionConditions.x121Conditions.isStrBearish; // - // Engulf ... - ENUM_X_DIRECTION cCBarEngulfDir; - bool isCCBarEngulfed = consolidationCycleHelper - .mBarAnalyser - .IsEngulfBar( - cCBar, - cCBarEngulfDir, - 0 // Extended ... - ); - bool isCCBarBullishEngulfed = - isCCBarEngulfed && - IsBullish(cCBarEngulfDir); - bool isCCBarBearishEngulfed = - isCCBarEngulfed && - IsBearish(cCBarEngulfDir); + bool isDecisionSarCrossedOverVale = decisionConditions.x121Conditions.isSarCrossedOverVale; + bool isDecisionSarCrossedUnderPeak = decisionConditions.x121Conditions.isSarCrossedUnderPeak; // - // Momentum ... - ENUM_X_DIRECTION cCBarMomentumDir; - bool isCCBarMomentum = consolidationCycleHelper - .mBarAnalyser - .IsMomentumBar( - cCBar, - cCBarMomentumDir, - 1 // Extended ... - ); - bool isCCBarBullishMomentum = - isCCBarMomentum && - IsBullish(cCBarMomentumDir); - bool isCCBarBearishMomentum = - isCCBarMomentum && - IsBearish(cCBarMomentumDir); + bool isDecisionStrCrossedOverVale = decisionConditions.x121Conditions.isStrCrossedOverVale; + bool isDecisionStrCrossedUnderPeak = decisionConditions.x121Conditions.isStrCrossedUnderPeak; // - // Reject ... - ENUM_X_DIRECTION cCBarRejectDir; - bool isCCBarRejected = consolidationCycleHelper - .mBarAnalyser - .IsRejectionBar( - cCBar, - cCBarRejectDir, - 1 // Extended ... - ); - bool isCCBarBullishRejected = - isCCBarRejected && - IsBullish(cCBarRejectDir); - bool isCCBarBearishRejected = - isCCBarRejected && - IsBearish(cCBarRejectDir); + bool isDecisionPeakOverAtrUpper = decisionConditions.x121Conditions.isPeakOverAtrUpper; + bool isDecisionValeUnderAtrLower = decisionConditions.x121Conditions.isValeUnderAtrLower; // - // Bar Checking Summary ... + bool isDecisionVWapBullishState = decisionConditions.x121Conditions.isVWapBullishState; + bool isDecisionVWapSwitchedToBullishState = decisionConditions.x121Conditions.isVWapSwitchedToBullishState; // - // Bullish ... - bool isCCBarPassedBullish = - // - isCCBarBullishEngulfed || - isCCBarBullishMomentum || - isCCBarBullishRejected - // - ; + bool isDecisionVWapBullishOrdered = decisionConditions.x121Conditions.isVWapBullishOrdered; + bool isDecisionVWapSwitchedToBullishOrdered = decisionConditions.x121Conditions.isVWapSwitchedToBullishOrdered; // - // Bearish ... - bool isCCBarPassedBearish = - // - isCCBarBearishEngulfed || - isCCBarBearishMomentum || - isCCBarBearishRejected - // - ; + bool isDecisionVWapBearishState = decisionConditions.x121Conditions.isVWapBearishState; + bool isDecisionVWapSwitchedToBearishState = decisionConditions.x121Conditions.isVWapSwitchedToBearishState; // - double cPeakPrev = conditionStatePrev.x121Conditions.peaksBuffer[0]; - double cValePrev = conditionStatePrev.x121Conditions.valesBuffer[0]; + bool isDecisionVWapBearishOrdered = decisionConditions.x121Conditions.isVWapBearishOrdered; + bool isDecisionVWapSwitchedToBearishOrdered = decisionConditions.x121Conditions.isVWapSwitchedToBearishOrdered; // - double cPeak = conditionState.x121Conditions.peaksBuffer[1]; - double cVale = conditionState.x121Conditions.valesBuffer[1]; + bool isDecisionStrUpperOverPeak = decisionConditions.x121Conditions.isStrUpperOverPeak; + bool isDecisionStrLowerOverVale = decisionConditions.x121Conditions.isStrLowerOverVale; // - bool isCPeakSame = cPeak == cPeakPrev; - bool isCValeSame = cVale == cValePrev; + bool isDecisionStrUpperUnderPeak = decisionConditions.x121Conditions.isStrUpperUnderPeak; + bool isDecisionStrLowerUnderVale = decisionConditions.x121Conditions.isStrLowerUnderVale; // - bool isCNewPeakPrev = conditionStatePrev.x121Conditions.isNewPeak; - bool isCNewPeakOverLastPrev = conditionStatePrev.x121Conditions.isNewPeakOverLast; - bool isCNewPeakUnderLastPrev = conditionStatePrev.x121Conditions.isNewPeakUnderLast; + bool isDecisionDonLowUpperLesserThanDonCloseUpper = + decisionConditions.x121Conditions.donLowUpperBuffer[1] < + decisionConditions.x121Conditions.donCloseUpperBuffer[1]; // - bool isCNewValePrev = conditionStatePrev.x121Conditions.isNewVale; - bool isCNewValeOverLastPrev = conditionStatePrev.x121Conditions.isNewValeOverLast; - bool isCNewValeUnderLastPrev = conditionStatePrev.x121Conditions.isNewValeUnderLast; + bool isDecisionDonHighLowerGreaterThanDonCloseLower = + decisionConditions.x121Conditions.donHighLowerBuffer[1] < + decisionConditions.x121Conditions.donCloseLowerBuffer[1]; // - 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; + // Summarize Conditions ... // isBullish = // - isCNewValePrev && - isCCBarPassedBullish + isDecisionValeUnderAtrLower + // + && + // + isDecisionDonHighLowerGreaterThanDonCloseLower + // + && + // + ( + // + isDecisionVWapBullishState || + isDecisionVWapBullishOrdered + // + ) + // + && + // + ( + // + isDecisionStrUpperOverPeak || + isDecisionStrLowerOverVale + // + ) + // + && + // + ( + // + ( + // + isDecisionStrBullish && + isDecisionSarCrossedOverVale + // + ) + // + || + // + ( + // + isDecisionSarBullish && + isDecisionStrCrossedOverVale + // + ) + // + ) // ; // isBearish = // - isCNewPeakPrev && - isCCBarPassedBearish + isDecisionPeakOverAtrUpper + // + && + // + isDecisionDonLowUpperLesserThanDonCloseUpper + // + && + // + ( + // + isDecisionVWapBearishState || + isDecisionVWapBearishOrdered + // + ) + // + && + // + ( + // + isDecisionStrUpperUnderPeak || + isDecisionStrLowerUnderVale + // + ) + // + && + // + ( + // + ( + // + isDecisionStrBearish && + isDecisionSarCrossedUnderPeak + // + ) + // + || + // + ( + // + isDecisionSarBearish && + isDecisionStrCrossedUnderPeak // + ) + // + ) // ; @@ -582,12 +630,6 @@ bool DetectX121SMCXOBSPVSiganlSetup( return result; } - // - conditions.pivot = - isBullish - ? conditionState.x121Conditions.valesBuffer[1] - : conditionState.x121Conditions.peaksBuffer[1]; - // conditions.setupTime = cTime; conditions.dir = @@ -615,7 +657,7 @@ bool DetectX121SMCXOBSPVSiganlTrigger( XC121SMCCycleHelper *consolidationCycleHelper, XC121SMCCycleHelper *visionCycleHelper, // - int maxAllowedSetupAge = 576 // + int maxAllowedSetupAge = 60 // // ) { @@ -817,25 +859,29 @@ bool DetectX121SMCXOBSPVSiganlTrigger( // Trigger Conditions ... // - // Looking for STR Direction Change ... + double decisionLastBullishStr = decisionCycleHelper.mX121Helper.xstrHelper.GetLastSTR(X_DIRECTION_BULLISH); + double decisionLastBearishStr = decisionCycleHelper.mX121Helper.xstrHelper.GetLastSTR(X_DIRECTION_BEARISH); // - bool isStrSwitchedToBullish = analyseConditions.x121Conditions.isStrSwitchedToBullish; - bool isStrSwitchedToBearish = analyseConditions.x121Conditions.isStrSwitchedToBearish; + bool isDecisionLastBearishStrBreakedUp = IsBarBreak( + decisionLastBearishStr, + X_DIRECTION_BULLISH, + cBar // + ); // - result = isStrSwitchedToBullish || - isStrSwitchedToBearish; - if (!result) - { - return result; - } + bool isDecisionLastBullishStrBreakedDown = IsBarBreak( + decisionLastBullishStr, + X_DIRECTION_BEARISH, + cBar // + ); // // Detect Bullish Conditions ... isBullish = // - false + isBullish && + isDecisionLastBearishStrBreakedUp // ; @@ -843,7 +889,8 @@ bool DetectX121SMCXOBSPVSiganlTrigger( // Detect Bearish Conditions ... isBearish = // - false + isBearish && + isDecisionLastBullishStrBreakedDown // ; @@ -854,6 +901,13 @@ bool DetectX121SMCXOBSPVSiganlTrigger( { // // Cleanup Setup Conditions ... + int setupAge = conditions.GetSetupAge(); + if (IsValidSize(setupAge) && + IsValidSize(maxAllowedSetupAge) && + setupAge >= maxAllowedSetupAge) + { + conditions.Clean(); + } // return result; @@ -899,15 +953,15 @@ bool DetectX121SMCXOBSPVSiganlTrigger( double sls[]; // - double atr = triggerConditions.x121Conditions.atrBuffer[1]; - double peak = triggerConditions.x121Conditions.peaksBuffer[1]; - double vale = triggerConditions.x121Conditions.valesBuffer[1]; + double iAtr = triggerConditions.x121Conditions.atrBuffer[1]; + double iPeak = triggerConditions.x121Conditions.peaksBuffer[1]; + double iVale = triggerConditions.x121Conditions.valesBuffer[1]; // if (isBullish) { // - double lowerVale = triggerCycleHelper.mX121Helper.xpvHelper.GetLowerVale(vale); + double lowerVale = triggerCycleHelper.mX121Helper.xpvHelper.GetLowerVale(iVale); if (lowerVale > 0) { // @@ -919,14 +973,14 @@ bool DetectX121SMCXOBSPVSiganlTrigger( // Add( - vale, + iVale, sls // ); } else if (isBearish) { // - double higherPeak = triggerCycleHelper.mX121Helper.xpvHelper.GetHigherPeak(peak); + double higherPeak = triggerCycleHelper.mX121Helper.xpvHelper.GetHigherPeak(iPeak); if (higherPeak > 0) { // @@ -938,7 +992,7 @@ bool DetectX121SMCXOBSPVSiganlTrigger( // Add( - peak, + iPeak, sls // ); } @@ -949,8 +1003,8 @@ bool DetectX121SMCXOBSPVSiganlTrigger( // double sl = isBullish - ? slsMin - atr - : slsMax + atr; + ? slsMin - iAtr + : slsMax + iAtr; double risk = MathAbs(entry - sl); double targetDelta = 2 * (risk / 3); if (target == 0) diff --git a/X121SMCEA/Signals/x-121.smc.xstrpv.signal.lib.mq5 b/X121SMCEA/Signals/x-121.smc.xstrpv.signal.lib.mq5 new file mode 100644 index 00000000..da75d5bd --- /dev/null +++ b/X121SMCEA/Signals/x-121.smc.xstrpv.signal.lib.mq5 @@ -0,0 +1,1128 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 X121 SMC Signal Class +// ------------------------------------------------- +// Name: XOBSPV +// 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 X121SMCStrategyXOBSPVSignalConditions +{ + // + // 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; + + // + double pivot; + XPriceZones priceZone; + + // + // Constructor ... + X121SMCStrategyXOBSPVSignalConditions() + { + 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() + { + // + pivot = 0; + + // + priceZone.Clean(); + } + + // +}; + +// +// Signaller Data Sources ... +X121SMCStrategyXOBSPVSignalConditions mXOBSPVConditions; +X121SMCStrategyXOBSPVSignalConditions mXOBSPVConditionsCollection[]; + +// +// Extension Functions ... + +// +// Detect Setup Conditions ... +bool DetectX121SMCXOBSPVSiganlSetup( + string _symbol, + ENUM_TIMEFRAMES _period, + // + X121SMCStrategyXOBSPVSignalConditions &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 points = GetPoints(symbol); + + // + int swingLoopback = 9; + double ll = cBar.FindLowest(swingLoopback, MODE_LOW); + double hh = cBar.FindHighest(swingLoopback, MODE_HIGH); + double llDown = cBar.FindLowesttDown(swingLoopback); + double hhUp = cBar.FindHighestUp(swingLoopback); + + // + // 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 ... + + // + // 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; + } + + // + double decisionPeak = decisionConditions.x121Conditions.peaksBuffer[1]; + double decisionVale = decisionConditions.x121Conditions.valesBuffer[1]; + + // + // Find Price Inside Zone ... + XPriceZones priceZone = conditions.priceZone; + bool hasPriceZones = conditions.priceZone.IsValid(); + if (!hasPriceZones) + { + // + hasPriceZones = CalculatePriceInsideZones( + priceZone, + analyseState, + cBar // + ); + + // + if (hasPriceZones) + { + // + // Validate Price Zone ... + double upper = 0; + double lower = 0; + hasPriceZones = priceZone.GetBoundary( + X_DIRECTION_ALL, + upper, + lower // + ); + result = hasPriceZones; + if (!result) + { + return result; + } + + // + bool isValid = decisionPeak <= upper || + decisionVale >= lower; + hasPriceZones = isValid; + result = hasPriceZones; + if (!result) + { + return result; + } + + // + conditions.priceZone = priceZone; + } + } + + // + // Detect Str Change Direction ... + + // + bool isDecisionSarBullish = decisionConditions.x121Conditions.isSarBullish; + bool isDecisionSarBearish = decisionConditions.x121Conditions.isSarBearish; + + // + bool isDecisionStrBullish = decisionConditions.x121Conditions.isStrBullish; + bool isDecisionStrBearish = decisionConditions.x121Conditions.isStrBearish; + + // + bool isDecisionSarCrossedOverVale = decisionConditions.x121Conditions.isSarCrossedOverVale; + bool isDecisionSarCrossedUnderPeak = decisionConditions.x121Conditions.isSarCrossedUnderPeak; + + // + bool isDecisionStrCrossedOverVale = decisionConditions.x121Conditions.isStrCrossedOverVale; + bool isDecisionStrCrossedUnderPeak = decisionConditions.x121Conditions.isStrCrossedUnderPeak; + + // + bool isDecisionPeakOverAtrUpper = decisionConditions.x121Conditions.isPeakOverAtrUpper; + bool isDecisionValeUnderAtrLower = decisionConditions.x121Conditions.isValeUnderAtrLower; + + // + bool isDecisionVWapBullishState = decisionConditions.x121Conditions.isVWapBullishState; + bool isDecisionVWapSwitchedToBullishState = decisionConditions.x121Conditions.isVWapSwitchedToBullishState; + + // + bool isDecisionVWapBullishOrdered = decisionConditions.x121Conditions.isVWapBullishOrdered; + bool isDecisionVWapSwitchedToBullishOrdered = decisionConditions.x121Conditions.isVWapSwitchedToBullishOrdered; + + // + bool isDecisionVWapBearishState = decisionConditions.x121Conditions.isVWapBearishState; + bool isDecisionVWapSwitchedToBearishState = decisionConditions.x121Conditions.isVWapSwitchedToBearishState; + + // + bool isDecisionVWapBearishOrdered = decisionConditions.x121Conditions.isVWapBearishOrdered; + bool isDecisionVWapSwitchedToBearishOrdered = decisionConditions.x121Conditions.isVWapSwitchedToBearishOrdered; + + // + bool isDecisionStrUpperOverPeak = decisionConditions.x121Conditions.isStrUpperOverPeak; + bool isDecisionStrLowerOverVale = decisionConditions.x121Conditions.isStrLowerOverVale; + + // + bool isDecisionStrUpperUnderPeak = decisionConditions.x121Conditions.isStrUpperUnderPeak; + bool isDecisionStrLowerUnderVale = decisionConditions.x121Conditions.isStrLowerUnderVale; + + // + bool isDecisionDonLowUpperLesserThanDonCloseUpper = + decisionConditions.x121Conditions.donLowUpperBuffer[1] < + decisionConditions.x121Conditions.donCloseUpperBuffer[1]; + + // + bool isDecisionDonHighLowerGreaterThanDonCloseLower = + decisionConditions.x121Conditions.donHighLowerBuffer[1] < + decisionConditions.x121Conditions.donCloseLowerBuffer[1]; + + // + // Summarize Conditions ... + + // + isBullish = + // + isDecisionValeUnderAtrLower + // + && + // + isDecisionDonHighLowerGreaterThanDonCloseLower + // + && + // + ( + // + isDecisionVWapBullishState || + isDecisionVWapBullishOrdered + // + ) + // + && + // + ( + // + isDecisionStrUpperOverPeak || + isDecisionStrLowerOverVale + // + ) + // + && + // + ( + // + ( + // + isDecisionStrBullish && + isDecisionSarCrossedOverVale + // + ) + // + || + // + ( + // + isDecisionSarBullish && + isDecisionStrCrossedOverVale + // + ) + // + ) + // + ; + + // + isBearish = + // + isDecisionPeakOverAtrUpper + // + && + // + isDecisionDonLowUpperLesserThanDonCloseUpper + // + && + // + ( + // + isDecisionVWapBearishState || + isDecisionVWapBearishOrdered + // + ) + // + && + // + ( + // + isDecisionStrUpperUnderPeak || + isDecisionStrLowerUnderVale + // + ) + // + && + // + ( + // + ( + // + isDecisionStrBearish && + isDecisionSarCrossedUnderPeak + // + ) + // + || + // + ( + // + isDecisionSarBearish && + isDecisionStrCrossedUnderPeak // + ) + // + ) + // + ; + + // + result = isBullish || + isBearish; + if (!result) + { + return result; + } + + // + conditions.setupTime = cTime; + conditions.dir = + isBullish + ? X_DIRECTION_BULLISH + : X_DIRECTION_BEARISH; + + // + return result; +} + +// +// Detect Trigger Conditions ... +bool DetectX121SMCXOBSPVSiganlTrigger( + // + X121SMCStrategyXOBSPVSignalConditions &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 = IsBullish(setupDir); + bool isBearish = IsBearish(setupDir); + + // + 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 points = GetPoints(symbol); + + // + int swingLoopback = 9; + double ll = cBar.FindLowest(swingLoopback, MODE_LOW); + double hh = cBar.FindHighest(swingLoopback, MODE_HIGH); + double llDown = cBar.FindLowesttDown(swingLoopback); + double hhUp = cBar.FindHighestUp(swingLoopback); + + // + // 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 decisionLastBullishStr = decisionCycleHelper.mX121Helper.xstrHelper.GetLastSTR(X_DIRECTION_BULLISH); + double decisionLastBearishStr = decisionCycleHelper.mX121Helper.xstrHelper.GetLastSTR(X_DIRECTION_BEARISH); + + // + bool isDecisionLastBearishStrBreakedUp = IsBarBreak( + decisionLastBearishStr, + X_DIRECTION_BULLISH, + cBar // + ); + + // + bool isDecisionLastBullishStrBreakedDown = IsBarBreak( + decisionLastBullishStr, + X_DIRECTION_BEARISH, + cBar // + ); + + // + // Detect Bullish Conditions ... + isBullish = + // + isBullish && + isDecisionLastBearishStrBreakedUp + // + ; + + // + // Detect Bearish Conditions ... + isBearish = + // + isBearish && + isDecisionLastBullishStrBreakedDown + // + ; + + // + result = isBullish || + isBearish; + if (!result) + { + // + // Cleanup Setup Conditions ... + int setupAge = conditions.GetSetupAge(); + if (IsValidSize(setupAge) && + IsValidSize(maxAllowedSetupAge) && + setupAge >= maxAllowedSetupAge) + { + conditions.Clean(); + } + + // + return result; + } + + // + // Detect Nearest Pivot Point ... + + // + // Detect Target ... + double target = CalculateTarget( + cBar, + analyseState, + setupDir // + ); + if (target == 0) + { + // + target = CalculateTarget( + cBar, + verificationState, + setupDir // + ); + } + + // + double oppositTarget = CalculateTarget( + cBar, + analyseState, + Opposit(setupDir) // + ); + + // + double entry = GetEntry( + conditions.symbol, + setupDir // + ); + + // + // Filling SL Candidates ... + + // + double sls[]; + + // + double iAtr = triggerConditions.x121Conditions.atrBuffer[1]; + double iPeak = triggerConditions.x121Conditions.peaksBuffer[1]; + double iVale = triggerConditions.x121Conditions.valesBuffer[1]; + + // + if (isBullish) + { + // + double lowerVale = triggerCycleHelper.mX121Helper.xpvHelper.GetLowerVale(iVale); + if (lowerVale > 0) + { + // + Add( + lowerVale, + sls // + ); + } + + // + Add( + iVale, + sls // + ); + } + else if (isBearish) + { + // + double higherPeak = triggerCycleHelper.mX121Helper.xpvHelper.GetHigherPeak(iPeak); + if (higherPeak > 0) + { + // + Add( + higherPeak, + sls // + ); + } + + // + Add( + iPeak, + sls // + ); + } + + // + double slsMin = GetMin(sls); + double slsMax = GetMax(sls); + + // + double sl = isBullish + ? slsMin - iAtr + : slsMax + iAtr; + double risk = MathAbs(entry - sl); + double targetDelta = 2 * (risk / 3); + if (target == 0) + { + // + int minTargetPint = 50; + double minTargetPointValue = minTargetPint * points; + if (targetDelta < minTargetPointValue) + { + targetDelta = minTargetPointValue; + } + + // + // Force Target On Half Risk ... + target = + isBullish + ? entry + targetDelta + : entry - targetDelta; + + // + target = 0; + + // + } + + // + // Ignore Target ... + target = 0; + + // + // Filling Conditions Props ... + conditions.sl = sl; + conditions.target = target; + conditions.triggerTime = cTime; + conditions.type = isBullish + ? X_POSITION_TYPE_LONG + : X_POSITION_TYPE_SHORT; + + // + return result; +} + +// +int AddX121SMCXOBSPVConditionsIfNotExists( + X121SMCStrategyXOBSPVSignalConditions &item, + X121SMCStrategyXOBSPVSignalConditions &items[], + int maxAllowed = 10 // +) +{ + // + int result = 0; + + // + bool isSetuped = IsValid(item.setupTime) && + HasDirection(item.dir); + if (!isSetuped) + { + return result; + } + + // + int count = ArraySize(items); + if (IsValidSize(count)) + { + // + // Copy Original Items ... + X121SMCStrategyXOBSPVSignalConditions tmpItems[]; + Copy( + items, + tmpItems // + ); + + // + // Prese Item Data ... + bool isBullish = IsBullish(item.dir); + + // + for (int i = 0; i < count; i++) + { + // + X121SMCStrategyXOBSPVSignalConditions iItem = tmpItems[i]; + + // + bool canRemove = item.dir == iItem.dir && + item.pivot == iItem.pivot; + if (canRemove) + { + // + ArrayRemove( + items, + i, + 1 // + ); + } + } + + // + Clean(tmpItems); + } + + // + AddRef( + item, + items // + ); + + // + // Remove Olds ... + CleanupArray( + items, + maxAllowed // + ); + + // + 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 fc386adf..95e4df6d 100644 --- a/X121SMCEA/Strategy/x-121.smc.strategy.class.mq5 +++ b/X121SMCEA/Strategy/x-121.smc.strategy.class.mq5 @@ -185,7 +185,7 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy // bool useTestSignal = false; - bool useXOBGPVSignal = false; + bool useXOBGPVSignal = true; bool useXOBSPVSignal = true; // @@ -874,58 +874,6 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy 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(); @@ -950,6 +898,17 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy result = canTrigger; if (!result) { + // + bool isISetuped = mTmpConditions[i].IsSetuped(); + if (!isISetuped) + { + // + ArrayRemove( + mXOBSPVConditionsCollection, + i, + 1 // + ); + } continue; } @@ -1057,7 +1016,7 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy x121Inputs.Default(); // - x121Inputs.showRSI = true; + x121Inputs.showRSI = false; // bool isInited = false; @@ -1082,27 +1041,27 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy // // XATR ... - x121Inputs.xatrInputs.showATRUpper = true; - x121Inputs.xatrInputs.showATRLower = true; + x121Inputs.xatrInputs.showATRUpper = false; + x121Inputs.xatrInputs.showATRLower = false; // // XSTR ... x121Inputs.xstrInputs.showStr = true; - x121Inputs.xstrInputs.showStrUpper = true; - x121Inputs.xstrInputs.showStrLower = true; + x121Inputs.xstrInputs.showStrUpper = false; + x121Inputs.xstrInputs.showStrLower = false; // // XDON ... x121Inputs.xdonInputs.showOpen = false; - x121Inputs.xdonInputs.showClose = false; - x121Inputs.xdonInputs.showLow = false; - x121Inputs.xdonInputs.showHigh = false; + x121Inputs.xdonInputs.showClose = true; + x121Inputs.xdonInputs.showLow = true; + x121Inputs.xdonInputs.showHigh = true; // // XVWAP ... - x121Inputs.xvwapInputs.showVWapFast = true; - x121Inputs.xvwapInputs.showVWapMedium = true; - x121Inputs.xvwapInputs.showVWapSlow = true; + x121Inputs.xvwapInputs.showVWapFast = false; + x121Inputs.xvwapInputs.showVWapMedium = false; + x121Inputs.xvwapInputs.showVWapSlow = false; // // Initialize Cycle Helpers ...