diff --git a/Libraries/x-saherelm.x-poi.lib.mq5 b/Libraries/x-saherelm.x-poi.lib.mq5 index c2543003..fae4b2e2 100644 --- a/Libraries/x-saherelm.x-poi.lib.mq5 +++ b/Libraries/x-saherelm.x-poi.lib.mq5 @@ -2700,6 +2700,60 @@ class XCTicksZone : public XCTwoBarZone return mZones.At(index); } + /** + * Calculate Liquidity Percent for Specified Direction ... + * + * @param forDirection: ENUM_X_DIRECTION member, Specified Liquidity ... + * @param price: Double, Specified Price ... + * + * @return ( double ) + */ + double CalculateLiquidityPercent( + ENUM_X_DIRECTION forDirection, + double price // + ) + { + // + double result = 0; + + // + int count = Count(); + if (price <= 0 || + !IsValid() || + !IsValidSize(count) || + forDirection == X_DIRECTION_ALL || + forDirection == X_DIRECTION_NONE) + { + return result; + } + + // + bool isBullish = forDirection == X_DIRECTION_BULLISH; + + // + for (int i = 0; i < count; i++) + { + // + XCTickZone *iZone = GetZone(i); + + // + if (iZone.IsValid()) + { + // + result += !isBullish && + price > iZone.high + ? iZone.percent + : isBullish && + price < iZone.low + ? iZone.percent + : 0; + } + } + + // + return result; + } + // // Overrides ... bool IsValid() override @@ -3144,6 +3198,56 @@ struct XPOIState // } + /** + * Calculate Liquidity Percent for Specified Direction ... + * + * @param forDirection: ENUM_X_DIRECTION member, Specified Liquidity ... + * @param price: Double, Specified Price ... + * + * @return ( double ) + */ + double CalculateLiquidityPercent( + ENUM_X_DIRECTION forDirection, + double price = 0 // + ) + { + // + double result = 0; + + // + if (!IsValid() || + ticksZone == NULL) + { + return result; + } + + // + // Normalize Price for Actions ... + if (price <= 0) + { + // + MqlTick mTick; + bool isTickRetrieved = GetTick( + symbol, + mTick // + ); + if (isTickRetrieved) + { + price = mTick.bid; + } + } + + // + result = ticksZone + .CalculateLiquidityPercent( + forDirection, + price // + ); + + // + return result; + } + // // Counters ... diff --git a/X121SMCEA/Libraries/x-121.smc.lib.mq5 b/X121SMCEA/Libraries/x-121.smc.lib.mq5 index a0a46180..80b23001 100644 --- a/X121SMCEA/Libraries/x-121.smc.lib.mq5 +++ b/X121SMCEA/Libraries/x-121.smc.lib.mq5 @@ -324,6 +324,39 @@ struct XPVPivot return result; } + /** + * Calculate Liquidity Percent for Specified Direction ... + * + * @param forDirection: ENUM_X_DIRECTION member, Specified Liquidity ... + * @param price: Double, Specified Price ... + * + * @return ( double ) + */ + double CalculateLiquidityPercent( + ENUM_X_DIRECTION forDirection, + double price = 0 // + ) + { + // + double result = 0; + + // + if (!IsValid()) + { + return result; + } + + // + result = state + .CalculateLiquidityPercent( + forDirection, + price // + ); + + // + return result; + } + // /** diff --git a/X121SMCEA/Strategy/x-121.smc.test.strategy.class.mq5 b/X121SMCEA/Strategy/x-121.smc.test.strategy.class.mq5 index d539b754..c31048df 100644 --- a/X121SMCEA/Strategy/x-121.smc.test.strategy.class.mq5 +++ b/X121SMCEA/Strategy/x-121.smc.test.strategy.class.mq5 @@ -206,22 +206,29 @@ class XCX121SMCTestStrategy : public XCX121SMCBaseStrategy double pivotMid = lastPivot.CalculateMid(); // - // Looks For Long ... - // - [] Bullish Direction; - // - [] Discount Area; - bool lookupLong = - isBullish && - bid < pivotMid && - bid > lastPivot.lower; + // Calculate Liquidity Percent ... + double bullishLiquidityPercent = lastPivot + .CalculateLiquidityPercent(X_DIRECTION_BULLISH); + double bearishLiquidityPercent = lastPivot + .CalculateLiquidityPercent(X_DIRECTION_BEARISH); // - // Looks For Short ... - // - [] Bearish Direction ... - // - [] Premium Area ... - bool lookupShort = - isBearish && + bool isInDiscount = + bid < pivotMid && + bid > lastPivot.lower; + if (isInDiscount) + { + Print("In Disount Zone ..."); + } + + // + bool IsInPremium = bid > pivotMid && bid < lastPivot.upper; + if (IsInPremium) + { + Print("In Premium Zone ..."); + } // // Check Order Flow Validation ... @@ -272,14 +279,6 @@ class XCX121SMCTestStrategy : public XCX121SMCBaseStrategy return result; } - // - result = lookupLong || - lookupShort; - if (!result) - { - return result; - } - // result = hasLong || hasShort;