Andrey Kisselyov: добрый день. лучше запрашивать данные о минимально доступном расстоянии через так как этот уровень может меняться, в зависимости от ситуации, например при новостях он может увеличиваться.
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+bool CheckStops(ENUM_ORDER_TYPE type,double SL,double TP)
{
//--- получим уровень SYMBOL_TRADE_STOPS_LEVELint stops_level=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
if(stops_level!=0)
{
PrintFormat("STOP LEVEL=%d: StopLoss and TakeProfit must be"+
" closer %d points from the closing price",stops_level,stops_level);
}
//---bool SL_check=false,TP_check=false;
//--- проверяем только два типа ордеровswitch(type)
{
//--- операция покупкаcaseOP_BUY:
{
//--- проверим StopLoss
SL_check=(Bid-SL>stops_level*_Point);
if(!SL_check)
PrintFormat("For order %s StopLoss=%.5f must be less than %.5f"+
" (Bid=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)",
EnumToString(type),SL,Bid-stops_level*_Point,Bid,stops_level);
//--- проверим TakeProfit
TP_check=(TP-Bid>stops_level*_Point);
if(!TP_check)
PrintFormat("For order %s TakeProfit=%.5f must be greater than %.5f"+
" (Bid=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)",
EnumToString(type),TP,Bid+stops_level*_Point,Bid,stops_level);
//--- вернем результат проверкиreturn(SL_check&&TP_check);
}
//--- операция продажаcaseOP_SELL:
{
//--- проверим StopLoss
SL_check=(SL-Ask>stops_level*_Point);
if(!SL_check)
PrintFormat("For order %s StopLoss=%.5f must be greater than %.5f "+
" (Ask=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)",
EnumToString(type),SL,Ask+stops_level*_Point,Ask,stops_level);
//--- проверим TakeProfit
TP_check=(Ask-TP>stops_level*_Point);
if(!TP_check)
PrintFormat("For order %s TakeProfit=%.5f must be less than %.5f "+
" (Ask=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)",
EnumToString(type),TP,Ask-stops_level*_Point,Ask,stops_level);
//--- вернем результат проверкиreturn(TP_check&&SL_check);
}
break;
}
returnfalse;
}
Перед установкой ордера проверяем на стоплевел, если удачно открываем позицию, нет - идет только сообщение в журнале о неверных стопах:
if(CheckStops(type,sl,tp))r=OrderSend(NULL,type,Lot(),NormalizeDouble(price,_Digits),slip,sl,tp,"",Magic,0,clr);
elsePrint("The level of StopLoss or TakeProfit is incorrect!");
Все продукты Маркета перед публикацией проходят обязательную предварительную проверку для обеспечения единого стандарта качества. В этой статье мы расскажем о наиболее частых ошибках, которые допускают разработчики в своих технических индикаторах и торговых роботах. А также покажем как самостоятельно проверить свой продукт перед отправкой в Маркет.
видно ненормализованный тейк, хотя нормализация есть
Это нормализованное так выводится
Результат
0.9987200000000001Сегодня была проверка, другого эксперта. В нем минстоп стоит 20п по 5-ти знаку. Видимо этого мало. В предыдущем эксперте минстоп был 40.
Поставлю 30, плюс вывод в лог стоплевела, чтобы потом на него можно было ориентироваться.
лучше запрашивать данные о минимально доступном расстоянии через
так как этот уровень может меняться, в зависимости от ситуации, например при новостях он может увеличиваться.
с уважением.
добрый день.
лучше запрашивать данные о минимально доступном расстоянии через
так как этот уровень может меняться, в зависимости от ситуации, например при новостях он может увеличиваться.
с уважением.
и добавить проверку, если "SYMBOL_TRADE_STOPS_LEVEL" == 0 то то брать один-два спреда.
и добавить проверку, если "SYMBOL_TRADE_STOPS_LEVEL" == 0 то то брать один-два спреда.
При стоплевеле 0 и стопом в 1,2 спреда не проходит. Ставил 3, тоже. Видимо при проверке плавающий спред доходит до 0.
Советник с фиксированным минстопом 40п по 5-ти знаку прошел.
Второй советник прошел с проверкой из примера: https://www.mql5.com/ru/articles/2555#invalid_SL_TP_for_position
Перед установкой ордера проверяем на стоплевел, если удачно открываем позицию, нет - идет только сообщение в журнале о неверных стопах: