diff --git a/X121SMCEA/Strategy/x-121.smc.test.strategy.class.mq5 b/X121SMCEA/Strategy/x-121.smc.test.strategy.class.mq5 index 83fe6806..5289141b 100644 --- a/X121SMCEA/Strategy/x-121.smc.test.strategy.class.mq5 +++ b/X121SMCEA/Strategy/x-121.smc.test.strategy.class.mq5 @@ -182,6 +182,88 @@ class XCX121SMCTestStrategy : public XCX121SMCBaseStrategy return result; } + // + XPVPivot lastPivot; + result = GetLastItem( + lastPivot, + mOrderFlow // + ); + if (!result) + { + return result; + } + XPOIState pivotState; + DetectPivotPOIs( + lastPivot, + pivotState // + ); + + // + // Prepare Areas ... + double bid = GetBid(_symbol); + bool isBullish = IsBullish(mOrderFlowDir); + bool isBearish = IsBearish(mOrderFlowDir); + double pivotMid = lastPivot.CalculateMid(); + + // + // Looks For Long ... + // - [] Bullish Direction; + // - [] Discount Area; + bool lookupLong = + isBullish && + bid < pivotMid && + bid > lastPivot.lower; + + // + // Looks For Short ... + // - [] Bearish Direction ... + // - [] Premium Area ... + bool lookupShort = + isBearish && + bid > pivotMid && + bid < lastPivot.upper; + + // + // Check Order Flow Validation ... + + // + // For Bullish Order Flow ... + // if Price Breakes Lower to Down, means Change of Charcter Happens ... + bool isCHOCHHappens = + isBullish ? bid < lastPivot.lower - pip + : bid > lastPivot.upper + pip; + + // + // For Bullish Order Flow ... + // if Price Breakes Upper to Up, means Breake of Structure Happens ... + bool isBOSHappens = + isBullish ? bid > lastPivot.upper + pip + : bid < lastPivot.lower - pip; + + // + if (isCHOCHHappens) + { + // + DrawStateSwings(_5MState); + Print("CHOCH ..."); + } + + // + if (isBOSHappens) + { + // + DrawStateSwings(_5MState); + Print("BOS ..."); + } + + // + result = lookupLong || + lookupShort; + if (!result) + { + return result; + } + // result = hasLong || hasShort; @@ -459,11 +541,12 @@ class XCX121SMCTestStrategy : public XCX121SMCBaseStrategy } // - if (result) + // Check Order Flow Direction ... + result = mOrderFlowDir != X_DIRECTION_NONE; + if (!result) { - Print("Result: ", result); + return result; } - return false; // return result; @@ -765,6 +848,300 @@ class XCX121SMCTestStrategy : public XCX121SMCBaseStrategy return result; } + void DetectPivotPOIs( + XPVPivot &pivot, + XPOIState &state, + bool lookupSwingHighs = true, + bool lookupSwingLows = true, + bool lookupSupportZones = true, + bool lookupResistanceZones = true, + bool lookupSupplyZones = true, + bool lookupDemandZones = true, + bool lookupBullishOrderBlocks = true, + bool lookupBearishOrderBlocks = true, + bool lookupBullishFairValueGaps = true, + bool lookupBearishFairValueGaps = true, + bool lookupBullishRejectionBars = true, + bool lookupBearishRejectionBars = true, + bool lookupBullishMomentumBars = true, + bool lookupBearishMomentumBars = true // + ) + { + // + state.Clean(); + + // + if (!pivot.IsValid()) + { + return; + } + + // + int count = 0; + + // + // Swings ... + + // + // Swing High ... + if (lookupSwingHighs) + { + // + count = ArraySize(state.swingHighs); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + // + XCSwing iSwing = state.swingHighs[i]; + + // + + } + } + } + + // + // Swing Low ... + if (lookupSwingLows) + { + // + count = ArraySize(state.swingLows); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + } + } + } + + // + // Support and Resistance Zones ... + + // + // Support Zones ... + if (lookupSupportZones) + { + // + count = ArraySize(state.supportZones); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + } + } + } + + // + // Resistance Zones ... + if (lookupResistanceZones) + { + // + count = ArraySize(state.resistanceZones); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + } + } + } + + // + // Supply and Demand Zones ... + + // + // Supply Zones ... + if (lookupSupplyZones) + { + // + count = ArraySize(state.supplyZones); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + } + } + } + + // + // Demand Zones ... + if (lookupDemandZones) + { + // + count = ArraySize(state.demandZones); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + } + } + } + + // + // Order Blocks ... + + // + // Bullish Order Blocks ... + if (lookupBullishOrderBlocks) + { + // + count = ArraySize(state.bullishOrderBlocks); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + } + } + } + + // + // Bearish Order Blocks ... + if (lookupBearishOrderBlocks) + { + // + count = ArraySize(state.bearishOrderBlocks); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + } + } + } + + // + // Fair Value Gaps ... + + // + // Bullish Fair Value Gaps ... + if (lookupBullishFairValueGaps) + { + // + count = ArraySize(state.bullishFairValueGaps); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + } + } + } + + // + // Bearish Fair Value Gaps ... + if (lookupBearishFairValueGaps) + { + // + count = ArraySize(state.bearishFairValueGaps); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + } + } + } + + // + // Rejection Bars ... + + // + // Bullish Rejection Bars ... + if (lookupBullishRejectionBars) + { + // + count = ArraySize(state.bullishRejectionBars); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + } + } + } + + // + // Bearish Rejection Bars ... + if (lookupBearishRejectionBars) + { + // + count = ArraySize(state.bearishRejectionBars); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + } + } + } + + // + // Momentum Bars ... + + // + // Bullish Momentum Bars ... + if (lookupBullishMomentumBars) + { + // + count = ArraySize(state.bullishMomentumBars); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + } + } + } + + // + // Bearish Momenum Bars ... + if (lookupBearishMomentumBars) + { + // + count = ArraySize(state.bearishMomentumBars); + if (IsValidSize(count)) + { + // + for (int i = 0; i < count; i++) + { + } + } + } + } + + /** + * This function fulfills the will of the developer + * @param state: Argument 1 + */ + void DrawStateSwings(XPOIState &state) + { + // + DrawState( + state, // State ... + true, // Draw SwingHighs .. + true, // Draw SwingLows .. + false, // Draw SupportZones .. + false, // Draw ResistanceZones .. + false, // Draw SupplyZones .. + false, // Draw DemandZones .. + true, // Draw BullishOrderBlocks .. + true, // Draw BearishOrderBlocks .. + true, // Draw BullishFairValueGaps .. + true, // Draw BearishFairValueGaps .. + true, // Draw BullishRejectionBars .. + true, // Draw BearishRejectionBars .. + true, // Draw BullishMomentumBars .. + true // Draw BearishMomentumBars .. + ); + } + // // Private ... private: