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