| //+------------------------------------------------------------------+
|
| //| 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;
|
| }
|
| //+------------------------------------------------------------------+
|