رعایت SYMBOL_TRADE_STOPS_LEVEL
SL/TP ای که زیادی به قیمت فعلی نزدیکه رو میبره روی حداقل فاصلهای که بروکر اجازه میده — بدون این کنترل، OrderSend با خطای «Invalid stops» (retcode 10016) شکست میخوره.
کاربرد
محکم بودن روی چند تا بروکر: مقدار stops level بسته به سرور از 0 تا بیش از 50 پوینت فرق میکنه.
پیشنیازها
MetaTrader 5, MQL5
MQL5
double EnforceStopsLevel(string symbol, ENUM_ORDER_TYPE type,
double price, double sl)
{
long stopsLevel = SymbolInfoInteger(symbol, SYMBOL_TRADE_STOPS_LEVEL);
if(stopsLevel <= 0)
return sl; // pas de contrainte sur ce serveur
double point = SymbolInfoDouble(symbol, SYMBOL_POINT);
double minDist = stopsLevel * point;
int digits = (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS);
if(type == ORDER_TYPE_BUY && price - sl < minDist)
sl = NormalizeDouble(price - minDist, digits);
if(type == ORDER_TYPE_SELL && sl - price < minDist)
sl = NormalizeDouble(price + minDist, digits);
return sl;
}نتیجه
2026.06.10 09:47:55.221 StopsGuard (GBPUSD,M5) stops_level serveur = 20 pts (distance minimale SL/TP) 2026.06.10 09:47:55.222 StopsGuard (GBPUSD,M5) BUY @ 1.27543 : SL demandé 1.27535 trop proche (8 pts) 2026.06.10 09:47:55.222 StopsGuard (GBPUSD,M5) SL ajusté -> 1.27523 (20 pts) : « Invalid stops » 10016 évité 2026.06.10 09:48:10.118 StopsGuard (GBPUSD,M5) SELL : SL 1.27590 déjà à 47 pts -> inchangé
Stops LevelInvalid StopsBrokerValidation