96 lines
2.4 KiB
Text
96 lines
2.4 KiB
Text
//+------------------------------------------------------------------+
| |||
//| 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;
| |||
}
| |||
//+------------------------------------------------------------------+
|