Проверка минимального стопа в советниках, публикуемых в маркете.

 

Всем привет, друзья! 

есть такая особенность маркета: нужно проверять все значения на мин стоп.

Если значение переменной меньше чем мин стоп то присваивать мин стоп, чтоб не было ошибки 130.

Сейчас же в 90 % брокеров спред и минстоп плавающий и выдают 0 .

есть такая конструкция кода, присваивающая всем переменным значения мин стопа.  

 int OnInitLevels(string symToWorkmodify)
  {
   if(lot<SymbolInfoDouble(symToWorkmodify,SYMBOL_VOLUME_MIN))lots=SymbolInfoDouble(symToWorkmodify,SYMBOL_VOLUME_MIN);else
   if(lot>SymbolInfoDouble(symToWorkmodify,SYMBOL_VOLUME_MAX))lots=SymbolInfoDouble(symToWorkmodify,SYMBOL_VOLUME_MAX);else lots=lot;
   if(StopLoss>0 && StopLoss<SymbolInfoInteger(symToWorkmodify,SYMBOL_TRADE_STOPS_LEVEL))StopLosss=(int)SymbolInfoInteger(symToWorkmodify,SYMBOL_TRADE_STOPS_LEVEL);else StopLosss=StopLoss;
   if(TakeProfit>0 && TakeProfit<SymbolInfoInteger(symToWorkmodify,SYMBOL_TRADE_STOPS_LEVEL))TakeProfits=(int)SymbolInfoInteger(symToWorkmodify,SYMBOL_TRADE_STOPS_LEVEL);else TakeProfits=TakeProfit;
   if(TrailingStop>0 && TrailingStop<SymbolInfoInteger(symToWorkmodify,SYMBOL_TRADE_STOPS_LEVEL))TrallingStops=(int)SymbolInfoInteger(symToWorkmodify,SYMBOL_TRADE_STOPS_LEVEL);else TrallingStops=TrailingStop;
   if(TakeProfitALL>0 && TakeProfitALL<SymbolInfoInteger(symToWorkmodify,SYMBOL_TRADE_STOPS_LEVEL))TakeProfitsAver=(int)SymbolInfoInteger(symToWorkmodify,SYMBOL_TRADE_STOPS_LEVEL);else TakeProfitsAver=(int)TakeProfitALL;
   if(TrailingStop>0 && TrailingStop<SymbolInfoInteger(symToWorkmodify,SYMBOL_TRADE_STOPS_LEVEL))TrallingStops=(int)SymbolInfoInteger(symToWorkmodify,SYMBOL_TRADE_STOPS_LEVEL);else TrallingStops=TrailingStop;
   return(0);
  }

 но она в маркете более не проходит, потому что теперь везде мин стоп = 0 ,

кто как справляется с этой бедой?

 

Конечно, не проходит ))) Устанавливать нужно минимальными не SL, TP и TS, а значение Stop Level. Да и не один раз при запуске программы, а на каждом тике:

   digits          = (int) SymbolInfoInteger(symbol, SYMBOL_DIGITS);
   point           = SymbolInfoDouble(symbol, SYMBOL_POINT);
   
   tickSize        = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE);
   
   ask             = SymbolInfoDouble(symbol, SYMBOL_ASK);
   bid             = SymbolInfoDouble(symbol, SYMBOL_BID);
   spread          = ask - bid;

   stopLevel       = MarketInfo(symbol, MODE_STOPLEVEL) * point;
   
   if (stopLevel == 0)
   {
      if (!isECN)
         stopLevel = NormalizeDouble(2 * spread, digits);
   }
   else
      stopLevel = NormalizeDouble(stopLevel + tickSize, digits);
isECN - должен быть доступным для настройки пользователю. Есть счета типа "true ECN", на которых действительно нет никаких ограничений на минимальные расстояния, т. е. стопы/профиты/отложки можно ставить внутри спреда.
 

Спасибо. но у Вас та же конструкция что и у меня, только Вы умножили при мин стопе = 0 просто на спред*2, но как известно на многих брокерах мин стоп = 3 спреда, почему Вы сделали 2? 

проверку на мин стоп проверяю на каждом тике.  

 
StopLevel не поможет, так как тоже возвращается ноль, использую разницу Ask-Bid, можно с некоторым множителем
 
Alexander Bereznyak:
StopLevel не поможет, так как тоже возвращается ноль, использую разницу Ask-Bid
это для спреда, а для мин стопа? 
 
и для мин стопа тоже
 
Alexander Bereznyak:
и для мин стопа тоже
тоесть Вы мин стоп делаете равным спреду? 
 
Vladislav Andruschenko:

Всем привет, друзья! 

есть такая особенность маркета: нужно проверять все значения на мин стоп.

Если значение переменной меньше чем мин стоп то присваивать мин стоп, чтоб не было ошибки 130.

Сейчас же в 90 % брокеров спред и минстоп плавающий и выдают 0 .

есть такая конструкция кода, присваивающая всем переменным значения мин стопа.  

 но она в маркете более не проходит, потому что теперь везде мин стоп = 0 ,

кто как справляется с этой бедой?

Как вариант самому ввести  ограничение на минимальный размер стопа. Например в OnInit() проверять если пользователь указал стоп меньше 2-х пунктов выдать предупреждение и вернуть код возврата INIT_PARAMETERS_INCORRECT.

Еще вариант вообще не давать пользователю возможность управлять размером стопа, а вычислять его динамически в эксперте исходя из торговых условий.  

 
так как брокер заявляет мин стоп равным нулю, то ничего больше не остается, можно подобрать множитель, если спреда не достаточно
 
Vitalii Ananev:

Как вариант самому ввести  ограничение на минимальный размер стопа. Например в OnInit() проверять если пользователь указал стоп меньше 2-х пунктов выдать предупреждение и вернуть код возврата INIT_PARAMETERS_INCORRECT.

Еще вариант вообще не давать пользователю возможность управлять размером стопа, а вычислять его динамически в эксперте исходя из торговых условий.  

согласен - не давать управление, но Вы же знаете как этого требуют по типу: хочу задать свой стоп. сделайте настройку. 

а насчет вывод сообщения - спасибо подумаю.  

 
Alexander Bereznyak:
так как брокер заявляет мин стоп равным нулю, то ничего больше не остается, можно подобрать множитель, если спреда не достаточно

нда, это только для маркета - а вот универсальности тут нет для люого брокера

получается чтобы в маркете приняли - нужно сделать мин стоп на 3 спреда,

но по сути это неправильно - так как если у брокера минстоп = 1 спреду - то пользователь не сможет поставить меньше 3 спредов.

Засада.  

Причина обращения: