//+------------------------------------------------------------------+ //| Expert: Strong Rejection + Confirmation EA | //+------------------------------------------------------------------+ #property strict input double WickToBodyRatio = 2.0; // Wick must be >= body * ratio input double BodyMinPercent = 0.10; // Body at least 10% of total range input double ConfirmFactor = 1.0; // Confirmation candle body multiplier //--- check if candle is a strong rejection (bullish or bearish) int CheckRejection(int i) { double open = Open[i]; double close = Close[i]; double high = High[i]; double low = Low[i]; double body = MathAbs(close - open); double range = high - low; if(range == 0) return 0; double upper_wick = high - MathMax(open, close); double lower_wick = MathMin(open, close) - low; // body must be small relative to full candle if(body < range * BodyMinPercent) return 0; // bullish rejection (long lower wick) if(lower_wick >= body * WickToBodyRatio && close > open) return 1; // bearish rejection (long upper wick) if(upper_wick >= body * WickToBodyRatio && close < open) return -1; return 0; } //--- check confirmation candle bool CheckConfirmation(int dir) { double open1 = Open[1]; double close1 = Close[1]; double open0 = Open[0]; double close0 = Close[0]; double body0 = MathAbs(close0 - open0); double body1 = MathAbs(close1 - open1); // confirmation must be same direction & stronger if(dir == 1) // bullish { if(close0 > open0 && body0 >= body1 * ConfirmFactor) return true; } else if(dir == -1) // bearish { if(close0 < open0 && body0 >= body1 * ConfirmFactor) return true; } return false; } //+------------------------------------------------------------------+ int OnTick() { if(Bars < 5) return 0; // Check candle #1 (closed) for rejection int direction = CheckRejection(1); if(direction == 0) return 0; // Check candle #0 for confirmation if(!CheckConfirmation(direction)) return 0; //--- Avoid multiple orders if(PositionsTotal() == 0) { if(direction == 1) { // BUY trade.Buy(0.10, _Symbol); } else if(direction == -1) { // SELL trade.Sell(0.10, _Symbol); } } return 0; } //+------------------------------------------------------------------+