diff --git a/Libraries/x-saherelm.x-poi.lib.mq5 b/Libraries/x-saherelm.x-poi.lib.mq5 index f0cb0485..6261295a 100644 --- a/Libraries/x-saherelm.x-poi.lib.mq5 +++ b/Libraries/x-saherelm.x-poi.lib.mq5 @@ -9743,6 +9743,370 @@ double CalculateTarget( return result; } +/** + * Test Market for Detect Order Block FVG ... + * + * @param forDir: Direction + * @param bullishOrderBlocks: Detected Bullish Order Blocks ... + * @param bearishOrderBlocks: Detected Bearish Order Blocks ... + * @param orderBlockState: Order Block Detection POIState ... + * @param fairValueGapState: Fair Value Gap Detection POIState ... + * @param barIndex: Bar Index ... + * + * @return ( bool ) + */ +bool DetectFVGOB( + ENUM_X_DIRECTION &forDir, // Test For Specified Direction ... + XFVGOrderBlock &bullishOrderBlocks[], // Bullish Order Blocks ... + XFVGOrderBlock &bearishOrderBlocks[], // Bearish Order Blocks ... + XPOIState &orderBlockState, // Order Block Detection TF POI(s) ... + XPOIState &fairValueGapState, // Fair Value Gap Detection TF POI(s) ... + int barIndex = 0 // Bar Index ... +) +{ + // + bool result = false; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + forDir = X_DIRECTION_NONE; + + // + // Validate Args ... + result = + orderBlockState.HasChild() && + fairValueGapState.HasChild(); + if (!result) + { + return result; + } + + // + string symbol = orderBlockState.symbol; + ENUM_TIMEFRAMES period = orderBlockState.period; + + // + // Retrieve Bars ... + XOHCL triggerCBar; + result = triggerCBar.Init( + symbol, + period, + barIndex // + ); + + // + // Select Order Blocks Which Has Big Changes ... + int count = 0; + datetime cTime = TimeCurrent(); + + // + XOHCL jBar; + result = jBar.Init( + fairValueGapState.symbol, + fairValueGapState.period, + barIndex // + ); + if (!result) + { + return result; + } + double jBarLL = jBar.FindLowest(3, MODE_LOW); + double jBarHH = jBar.FindHighest(3, MODE_HIGH); + + // + // Bullish ... + int bullishOrderBlocksCount = orderBlockState.CountBullishOrderBlocks(); + count = bullishOrderBlocksCount; + if (IsValidSize(count)) + { + // + for (int i = count - 1; i >= 0; i--) + { + // + XCFVG *iFVG = NULL; + XStateZones iStateZones; + XCOrderBlock *iOb = orderBlockState.bullishOrderBlocks[i]; + iOb.To(cTime); + + // + // Find Exit Bar of Bullish OrderBlock Upper ... + XOHCL breakerBar; + bool hasBreakerBar = iOb.DetectBreakerBar(breakerBar); + if (!hasBreakerBar) + { + continue; + } + + // + // Detect Order Block is Hunted Or Not ... + XOHCL huntedBar; + bool isHunted = iOb.IsHunted(huntedBar); + if (isHunted) + { + continue; + } + + // + // Check Validation of Order Block ... + bool isValid = iOb.IsValidOrderBlock(); + if (!isValid) + { + continue; + } + + // + // Check Order Block Has Fair Value Gap ... + int fvgsCount = fairValueGapState.CountBullishFairValueGaps(); + bool hasFVG = IsValidSize(fvgsCount); + if (!hasFVG) + { + continue; + } + + // + // Detect an FVG for Order Block ... + for (int j = fvgsCount - 1; j >= 0; j--) + { + // + XCFVG *jFVG = fairValueGapState.bullishFairValueGaps[j]; + + // + bool isValid = + // + jFVG.IsBullish() && + jBarLL > jFVG.Upper() && + jBar.low > jFVG.Upper() && + jFVG.From() >= iOb.From() && + ((jFVG.Upper() > iOb.Upper() && + jFVG.Lower() <= iOb.Upper()) || + (jFVG.Upper() <= iOb.Upper() && + jFVG.Lower() >= iOb.Lower())) + // + ; + if (isValid) + { + // + jFVG.To(cTime); + iFVG = jFVG; + break; + } + } + + // + hasFVG = iFVG != NULL; + result = hasFVG; + if (!result) + { + continue; + } + + // // + // double upper = MathMax(iOb.Upper(), iFVG.Upper()); + // double lower = MathMin(iOb.Lower(), iFVG.Lower()); + // datetime from = iFVG.From(); + + // // + // // Detect Price Zones ... + // // Based On Decision State ... + // bool hasStateZones = CalculateStateZones( + // iStateZones, + // decisionState, + // upper, + // lower, + // from // + // ); + // result = hasStateZones; + // if (!result) + // { + // continue; + // } + + // + XFVGOrderBlock iModel; + iModel.orderBlock = iOb; + iModel.fairValueGap = iFVG; + // iModel.stateZones = iStateZones; + + // + AddRef( + iModel, + bullishOrderBlocks // + ); + } + } + + // + // Bearish ... + int bearishOrderBlocksCount = orderBlockState.CountBearishOrderBlocks(); + count = bearishOrderBlocksCount; + if (IsValidSize(count)) + { + // + for (int i = count - 1; i >= 0; i--) + { + // + XCFVG *iFVG = NULL; + XStateZones iStateZones; + XCOrderBlock *iOb = orderBlockState.bearishOrderBlocks[i]; + iOb.To(cTime); + + // + // Find Exit Bar of Bullish OrderBlock Upper ... + XOHCL breakerBar; + bool hasBreakerBar = iOb.DetectBreakerBar(breakerBar); + if (!hasBreakerBar) + { + continue; + } + + // + // Detect Order Block is Hunted Or Not ... + XOHCL huntedBar; + bool isHunted = iOb.IsHunted(huntedBar); + if (isHunted) + { + continue; + } + + // + // Check Validation of Order Block ... + bool isValid = iOb.IsValidOrderBlock(); + if (!isValid) + { + continue; + } + + // + // Check Order Block Has Fair Value Gap ... + int fvgsCount = fairValueGapState.CountBearishFairValueGaps(); + bool hasFVG = IsValidSize(fvgsCount); + if (!hasFVG) + { + continue; + } + + // + // Detect an FVG for Order Block ... + for (int j = fvgsCount - 1; j >= 0; j--) + { + // + XCFVG *jFVG = fairValueGapState.bearishFairValueGaps[j]; + + // + bool isValid = + // + jFVG.IsBearish() && + jBarHH < jFVG.Lower() && + jBar.high < jFVG.Lower() && + jFVG.From() >= iOb.From() && + ((jFVG.Upper() > iOb.Lower() && + jFVG.Lower() <= iOb.Lower()) || + (jFVG.Upper() <= iOb.Upper() && + jFVG.Lower() >= iOb.Lower())) + // + ; + if (isValid) + { + // + jFVG.To(cTime); + iFVG = jFVG; + break; + } + } + + // + hasFVG = iFVG != NULL; + result = hasFVG; + if (!result) + { + continue; + } + + // + double upper = MathMax(iOb.Upper(), iFVG.Upper()); + double lower = MathMin(iOb.Lower(), iFVG.Lower()); + datetime from = iFVG.From(); + + // // + // // Detect Price Zones ... + // // Based On Decision State ... + // bool hasStateZones = CalculateStateZones( + // iStateZones, + // decisionState, + // upper, + // lower, + // from // + // ); + // result = hasStateZones; + // if (!result) + // { + // continue; + // } + + // + XFVGOrderBlock iModel; + iModel.orderBlock = iOb; + iModel.fairValueGap = iFVG; + // iModel.stateZones = iStateZones; + + // + AddRef( + iModel, + bearishOrderBlocks // + ); + } + } + + // + // Check Order Blocks ... + bullishOrderBlocksCount = ArraySize(bullishOrderBlocks); + bool hasBullishOrderBlocks = IsValidSize(bullishOrderBlocksCount); + + // + // Check Order Blocks ... + bearishOrderBlocksCount = ArraySize(bearishOrderBlocks); + bool hasBearishOrderBlocks = IsValidSize(bearishOrderBlocksCount); + + // + result = + // + hasBullishOrderBlocks || + hasBearishOrderBlocks + // + ; + if (!result) + { + return result; + } + + // + bool isBullish = hasBullishOrderBlocks && !hasBearishOrderBlocks; + bool isBearish = hasBearishOrderBlocks && !hasBullishOrderBlocks; + + // + forDir = + isBullish + ? X_DIRECTION_BULLISH + : isBearish + ? X_DIRECTION_BEARISH + : X_DIRECTION_NONE; + + // + result = forDir != X_DIRECTION_NONE; + if (!result) + { + return result; + } + + // + return result; +} + // typedef void (*TOnPOIEvent)(ENUM_XPOI_EVENTS event, XCBasePOI *param // diff --git a/X121SMCEA/Libraries/x-121.smc.lib.mq5 b/X121SMCEA/Libraries/x-121.smc.lib.mq5 index 310b298c..4ceca0b2 100644 --- a/X121SMCEA/Libraries/x-121.smc.lib.mq5 +++ b/X121SMCEA/Libraries/x-121.smc.lib.mq5 @@ -715,360 +715,4 @@ ENUM_X_121_SMC_PROVIDERS ParseProvider(string value) return result; } -// - -// -bool TestPOIState( - ENUM_X_DIRECTION &forDir, // Test For Specified Direction ... - XFVGOrderBlock &bullishOrderBlocks[], // Bullish Order Blocks ... - XFVGOrderBlock &bearishOrderBlocks[], // Bearish Order Blocks ... - XPOIState &orderBlockState, // Order Block Detection TF POI(s) ... - XPOIState &fairValueGapState, // Fair Value Gap Detection TF POI(s) ... - XPOIState &decisionState, // Decision TF POI(s) ... - int barIndex = 0 // Bar Index ... -) -{ - // - bool result = false; - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - forDir = X_DIRECTION_NONE; - - // - // Validate Args ... - result = - orderBlockState.HasChild() && - fairValueGapState.HasChild() && - decisionState.HasChild(); - if (!result) - { - return result; - } - - // - string symbol = orderBlockState.symbol; - ENUM_TIMEFRAMES period = orderBlockState.period; - - // - // Retrieve Bars ... - XOHCL triggerCBar; - result = triggerCBar.Init( - symbol, - period, - barIndex // - ); - - // - // Select Order Blocks Which Has Big Changes ... - int count = 0; - datetime cTime = TimeCurrent(); - - // - XOHCL jBar; - result = jBar.Init( - fairValueGapState.symbol, - fairValueGapState.period, - barIndex // - ); - if (!result) - { - return result; - } - double jBarLL = jBar.FindLowest(3, MODE_LOW); - double jBarHH = jBar.FindHighest(3, MODE_HIGH); - - // - // Bullish ... - int bullishOrderBlocksCount = orderBlockState.CountBullishOrderBlocks(); - count = bullishOrderBlocksCount; - if (IsValidSize(count)) - { - // - for (int i = count - 1; i >= 0; i--) - { - // - XCFVG *iFVG = NULL; - XStateZones iStateZones; - XCOrderBlock *iOb = orderBlockState.bullishOrderBlocks[i]; - iOb.To(cTime); - - // - // Find Exit Bar of Bullish OrderBlock Upper ... - XOHCL breakerBar; - bool hasBreakerBar = iOb.DetectBreakerBar(breakerBar); - if (!hasBreakerBar) - { - continue; - } - - // - // Detect Order Block is Hunted Or Not ... - XOHCL huntedBar; - bool isHunted = iOb.IsHunted(huntedBar); - if (isHunted) - { - continue; - } - - // - // Check Validation of Order Block ... - bool isValid = iOb.IsValidOrderBlock(); - if (!isValid) - { - continue; - } - - // - // Check Order Block Has Fair Value Gap ... - int fvgsCount = fairValueGapState.CountBullishFairValueGaps(); - bool hasFVG = IsValidSize(fvgsCount); - if (!hasFVG) - { - continue; - } - - // - // Detect an FVG for Order Block ... - for (int j = fvgsCount - 1; j >= 0; j--) - { - // - XCFVG *jFVG = fairValueGapState.bullishFairValueGaps[j]; - - // - bool isValid = - // - jFVG.IsBullish() && - jBarLL > jFVG.Upper() && - jBar.low > jFVG.Upper() && - jFVG.From() >= iOb.From() && - ((jFVG.Upper() > iOb.Upper() && - jFVG.Lower() <= iOb.Upper()) || - (jFVG.Upper() <= iOb.Upper() && - jFVG.Lower() >= iOb.Lower())) - // - ; - if (isValid) - { - // - jFVG.To(cTime); - iFVG = jFVG; - break; - } - } - - // - hasFVG = iFVG != NULL; - result = hasFVG; - if (!result) - { - continue; - } - - // // - // double upper = MathMax(iOb.Upper(), iFVG.Upper()); - // double lower = MathMin(iOb.Lower(), iFVG.Lower()); - // datetime from = iFVG.From(); - - // // - // // Detect Price Zones ... - // // Based On Decision State ... - // bool hasStateZones = CalculateStateZones( - // iStateZones, - // decisionState, - // upper, - // lower, - // from // - // ); - // result = hasStateZones; - // if (!result) - // { - // continue; - // } - - // - XFVGOrderBlock iModel; - iModel.orderBlock = iOb; - iModel.fairValueGap = iFVG; - // iModel.stateZones = iStateZones; - - // - AddRef( - iModel, - bullishOrderBlocks // - ); - } - } - - // - // Bearish ... - int bearishOrderBlocksCount = orderBlockState.CountBearishOrderBlocks(); - count = bearishOrderBlocksCount; - if (IsValidSize(count)) - { - // - for (int i = count - 1; i >= 0; i--) - { - // - XCFVG *iFVG = NULL; - XStateZones iStateZones; - XCOrderBlock *iOb = orderBlockState.bearishOrderBlocks[i]; - iOb.To(cTime); - - // - // Find Exit Bar of Bullish OrderBlock Upper ... - XOHCL breakerBar; - bool hasBreakerBar = iOb.DetectBreakerBar(breakerBar); - if (!hasBreakerBar) - { - continue; - } - - // - // Detect Order Block is Hunted Or Not ... - XOHCL huntedBar; - bool isHunted = iOb.IsHunted(huntedBar); - if (isHunted) - { - continue; - } - - // - // Check Validation of Order Block ... - bool isValid = iOb.IsValidOrderBlock(); - if (!isValid) - { - continue; - } - - // - // Check Order Block Has Fair Value Gap ... - int fvgsCount = fairValueGapState.CountBearishFairValueGaps(); - bool hasFVG = IsValidSize(fvgsCount); - if (!hasFVG) - { - continue; - } - - // - for (int j = fvgsCount - 1; j >= 0; j--) - { - // - XCFVG *jFVG = fairValueGapState.bearishFairValueGaps[j]; - - // - bool isValid = - // - jFVG.IsBearish() && - jBarHH < jFVG.Lower() && - jBar.high < jFVG.Lower() && - jFVG.From() >= iOb.From() && - ((jFVG.Upper() > iOb.Lower() && - jFVG.Lower() <= iOb.Lower()) || - (jFVG.Upper() <= iOb.Upper() && - jFVG.Lower() >= iOb.Lower())) - // - ; - if (isValid) - { - // - jFVG.To(cTime); - iFVG = jFVG; - break; - } - } - - // - hasFVG = iFVG != NULL; - result = hasFVG; - if (!result) - { - continue; - } - - // - double upper = MathMax(iOb.Upper(), iFVG.Upper()); - double lower = MathMin(iOb.Lower(), iFVG.Lower()); - datetime from = iFVG.From(); - - // // - // // Detect Price Zones ... - // // Based On Decision State ... - // bool hasStateZones = CalculateStateZones( - // iStateZones, - // decisionState, - // upper, - // lower, - // from // - // ); - // result = hasStateZones; - // if (!result) - // { - // continue; - // } - - // - XFVGOrderBlock iModel; - iModel.orderBlock = iOb; - iModel.fairValueGap = iFVG; - // iModel.stateZones = iStateZones; - - // - AddRef( - iModel, - bearishOrderBlocks // - ); - } - } - - // - // Check Order Blocks ... - bullishOrderBlocksCount = ArraySize(bullishOrderBlocks); - bool hasBullishOrderBlocks = IsValidSize(bullishOrderBlocksCount); - - // - // Check Order Blocks ... - bearishOrderBlocksCount = ArraySize(bearishOrderBlocks); - bool hasBearishOrderBlocks = IsValidSize(bearishOrderBlocksCount); - - // - result = - // - hasBullishOrderBlocks || - hasBearishOrderBlocks - // - ; - if (!result) - { - return result; - } - - // - bool isBullish = hasBullishOrderBlocks && !hasBearishOrderBlocks; - bool isBearish = hasBearishOrderBlocks && !hasBullishOrderBlocks; - - // - forDir = - isBullish - ? X_DIRECTION_BULLISH - : isBearish - ? X_DIRECTION_BEARISH - : X_DIRECTION_NONE; - - // - result = forDir != X_DIRECTION_NONE; - if (!result) - { - return result; - } - - // - return result; -} - // \ No newline at end of file diff --git a/X121SMCEA/Signals/x-121.smc.xtwpv.signal.lib.mq5 b/X121SMCEA/Signals/x-121.smc.xtwpv.signal.lib.mq5 index c21531e0..956d5dc7 100644 --- a/X121SMCEA/Signals/x-121.smc.xtwpv.signal.lib.mq5 +++ b/X121SMCEA/Signals/x-121.smc.xtwpv.signal.lib.mq5 @@ -398,13 +398,12 @@ bool DetectX121SMCXTWPVSiganlSetup( ENUM_X_DIRECTION forDir; XFVGOrderBlock bullishOrderBlocks[]; XFVGOrderBlock bearishOrderBlocks[]; - bool isTested = TestPOIState( + bool isTested = DetectFVGOB( forDir, bullishOrderBlocks, bearishOrderBlocks, consolidationState, - analyseState, - decisionState // + analyseState // ); // @@ -671,6 +670,10 @@ bool DetectX121SMCXTWPVSiganlTrigger( double decisionVale = decisionConditions.x121Conditions.valesBuffer[1]; double isNewDecisionVale = decisionConditions.x121Conditions.isNewVale; + // + bool isTriggerRSICrossedOverOverSold = triggerConditions.x121Conditions.isRSICrossedOverOverSold; + bool isTriggerRSICrossedUnderOverBought = triggerConditions.x121Conditions.isRSICrossedUnderOverBought; + // bool isDecisionRSICrossedOverOverSold = decisionConditions.x121Conditions.isRSICrossedOverOverSold; bool isDecisionRSICrossedUnderOverBought = decisionConditions.x121Conditions.isRSICrossedUnderOverBought; @@ -716,8 +719,10 @@ bool DetectX121SMCXTWPVSiganlTrigger( isBullish && cBar.IsBullish() && decisionVale < fvgOBUpper && - decisionVale > fvgOBLower && - isDecisionRSICrossedOverOverSold; + decisionVale > fvgOBLower + // && + // isTriggerRSICrossedOverOverSold + ; // // Detect Bearish Conditions ... @@ -725,8 +730,10 @@ bool DetectX121SMCXTWPVSiganlTrigger( isBearish && cBar.IsBearish() && decisionPeak < fvgOBUpper && - decisionPeak > fvgOBLower && - isDecisionRSICrossedUnderOverBought; + decisionPeak > fvgOBLower + // && + // isTriggerRSICrossedUnderOverBought + ; // result = isBullish || @@ -893,7 +900,8 @@ bool DetectX121SMCXTWPVSiganlTrigger( // int AddX121SMCXTWPVConditionsIfNotExists( X121SMCStrategyXTWPVSignalConditions &item, - X121SMCStrategyXTWPVSignalConditions &items[] // + X121SMCStrategyXTWPVSignalConditions &items[], + int maxAllowed = 10 // ) { // @@ -946,6 +954,10 @@ int AddX121SMCXTWPVConditionsIfNotExists( // // Remove Olds ... + CleanupArray( + items, + maxAllowed // + ); // result = ArraySize(items); diff --git a/X121SMCEA/Strategy/x-121.smc.strategy.class.mq5 b/X121SMCEA/Strategy/x-121.smc.strategy.class.mq5 index b19f8237..02da18d5 100644 --- a/X121SMCEA/Strategy/x-121.smc.strategy.class.mq5 +++ b/X121SMCEA/Strategy/x-121.smc.strategy.class.mq5 @@ -583,14 +583,6 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy // mXTWPVConditions.Clean(); - - // - // Try to Normalize Conditions Collection ... - int maxAllowed = 6; - CleanupArray( - mXTWPVConditionsCollection, - maxAllowed // - ); } } @@ -648,10 +640,10 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy // Check Broken Order Blocks and Remove them ... bool isBreaked = isBullish - ? (cBar.close < iLower || - pBar.close < iLower) - : (cBar.close > iUpper || - cBar.close > iUpper); + ? (cBar.high < iLower || + pBar.high < iLower) + : (cBar.low > iUpper || + cBar.low > iUpper); if (isBreaked) { //