Extronpro/Scalping range pro

96 lignes
2,4 Kio
Text
Brut Lien permanent Vue normale Historique

2025-11-24 04:28:12 +00:00
//+------------------------------------------------------------------+
//| 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;
}
//+------------------------------------------------------------------+