Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vladislav Andruschenko
106695
Vladislav Andruschenko  

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

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

Если значение переменной меньше чем мин стоп то присваивать мин стоп, чтоб не было ошибки 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 ,

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

Ihor Herasko
13820
Ihor Herasko  

Конечно, не проходит ))) Устанавливать нужно минимальными не 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", на которых действительно нет никаких ограничений на минимальные расстояния, т. е. стопы/профиты/отложки можно ставить внутри спреда.
Vladislav Andruschenko
106695
Vladislav Andruschenko  

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Засада.  

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий