Советник не проходит в маркет. Ошибка 130.

 

Приветствую всех! При проверке в маркете ошибка 130.


В коде стопы ставит не ближе чем спред на 3:

   if(stop<(int)SPREAD*3 && StopLoss>0)
     {
      Print("The parameter is incorrect! StopLoss will be set to the size of the Spread*3");
      stop=(int)SPREAD*3;
     }

   if(take<(int)SPREAD*3 && TakeProfit>0)
     {
      Print("The parameter is incorrect! TakeProfit will be set to the size of the Spread*3");
      take=(int)SPREAD*3;
     }


Попросил модератора прислать более подробный скрин, хотя бы примерно такой:

Тогда была опечатка в программе и видно ненормализованный тейк, хотя нормализация есть:

      if(StopLoss>0)   sl=NormalizeDouble(price+stop*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price-take*Point,Digits);


Получил следующий ответ:

Здравствуйте.

Продукты тестируются на отказоустойчивость на специальном сервере в различных торговых окружениях,
на различных торговых инструментах и таймфреймах. Тестовый сервер недоступен для Продавцов и других пользователей.

Информацию об ошибках и способах их исправления вы найдете в статье "Какие проверки должен пройти торговый робот перед публикацией в Маркете".
В статье "Как протестировать торгового робота перед покупкой" вы можете узнать об основных способах тестирования продуктов на отказоустойчивость.
Не забывайте пользоваться Документаций при разработке и улучшении программ.


При тесте у трех брокеров ошибок нет. Картинки в файле.

Подскажите, пожалуйста кто чем может? :-)

Файлы:
4.png  155 kb
5.png  144 kb
6.png  155 kb
 
Используйте правильную нормализацию уровней stop loos и take profit: CSymbolInfo::NormalizePrice
 
Vladimir Karputov:
Используйте правильную нормализацию уровней stop loos и take profit: CSymbolInfo::NormalizePrice

Благодарствую!

Добавлю этот момент. А можно еще поинтересоваться когда может возникнуть ошибка 130, если в коде прописан минимальный стоп = спред на 3?
Или какой минимальный стоп установить в эксперте чтобы проходил проверку?
Ставил 2,3 спреда не проходит.

 
Andrew Kornishkin:

Благодарствую!

Добавлю этот момент. А можно еще поинтересоваться когда может возникнуть ошибка 130, если в коде прописан минимальный стоп = спред на 3?
Или какой минимальный стоп установить в эксперте чтобы проходил проверку?
Ставил 2,3 спреда не проходит.



Перенесено в раздел: MQL4 и MetaTrader 4

 

Для себя выбрал варианты из ветки: https://www.mql5.com/ru/forum/76084

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

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

2. 
Я делал так

   if ((StopLimit<10 && StopLimit!=0)  || (StopLoss<10 && StopLoss!=0))
   {
      Alert("Error in parameters. Too small size of a parametr of 'Stop loss' or 'Stop Loss limit'");
      return(INIT_PARAMETERS_INCORRECT);
   }

 В советнике есть возможность регулировать стоп 3-мя способами. Вручную задать размер стопа (StopLoss) или установить его равным нулю.

Если StopLoss равен нулю то его размер вычисляется исходя из рыночных условий но ограничивается переменной StopLimit.

А в OnInit() проверяются эти параметры на корректность, так как менее 10 пунктов ставить стоп нет смысла.

3. Ставить стопы 0 и далее модифицировать.

4. тут размещенный код:

   double ask=SymbolInfoDouble(symToWorkmodify,SYMBOL_ASK);
   double bid=SymbolInfoDouble(symToWorkmodify,SYMBOL_BID);
   double point=SymbolInfoDouble(symToWorkmodify,SYMBOL_POINT);
   int spread=(ask-bid)/point;

тоже не подходит для маркета, ведь говорят что бывает Форекс-брокеры с нулевым спредом, значит получаем ноль. Ну а ноль умноженная на X дает ноль, в этом случае "2 * spread = stopLevel = 0".

для избежания подобного рода ошибки: 

stopLevel=MathMax(2.0*spread,1.0);


5.  для модификации стоп-лосса и тейка

if(op_type==OP_BUY)
              {
               SL=NormalizeDouble(OrderOpenPrice()-MathMax(StopLoss,(int)MarketInfo(_Symbol,MODE_STOPLEVEL))*_Point,_Digits);
               TP=NormalizeDouble(OrderOpenPrice()+MathMax(TakeProfit,(int)MarketInfo(_Symbol,MODE_STOPLEVEL))*_Point,_Digits);
              }

и проблем ни в работе ни в проверке модераторами не возникает.


П.С. Остановился на следующем варианте:

1. Установка фиксированного минимального стопа в советнике (скажем 40п - 5-ти знак)
2. Предупреждение в OnInit()  о фиксированном минимальном стопе и код возврата INIT_PARAMETERS_INCORRECT. 
3. Выставление ордеров со стопами 0 и дальнейшей модификацией.

Проверка минимального стопа в советниках, публикуемых в маркете.
Проверка минимального стопа в советниках, публикуемых в маркете.
  • 2016.03.14
  • www.mql5.com
Проверка минимального стопа в советниках, публикуемых в маркете.
 
код возврата INIT_PARAMETERS_INCORRECT

Так нельзя, не проходит даже предварительную проверку. 

test on EURUSD,H1
 2016.04.01 00:00:00  HedgeMartin EURUSD,H1: initialization failed (32767)
there are no trading operations
 
Andrew Kornishkin:

Так нельзя, не проходит даже предварительную проверку: код возврата INIT_PARAMETERS_INCORRECT. 

Конечно не пройдёт. Даже если параметр поставить заведомо глупый и проверив это удалить сов с графика с распечаткой причины удаления тоже не пройдёт.

 

бывают такие брокеры где нельзя в функции ордер сенд сразу проставлять тейки и стопы, с начало надо отправлять ордер с нулевыми параметрами а потом модифицировать его... была как то такая промблема - с тех пор только так и делаю - с начало ордерсенд с нулями потом модификация на стопы и тейки ... 

 
elmucon:

бывают такие брокеры где нельзя в функции ордер сенд сразу проставлять тейки и стопы, с начало надо отправлять ордер с нулевыми параметрами а потом модифицировать его... была как то такая промблема - с тех пор только так и делаю - с начало ордерсенд с нулями потом модификация на стопы и тейки ... 


Отправил такой вариант: 

1. Установка фиксированного минимального стопа в советнике (4п - 4-х знак) 
2. Предупреждение в OnInit()  о фиксированном минимальном стопе. 
3. Выставление ордеров со стопами 0 и дальнейшей модификацией.

Ручная проверка раз в неделю, обычно в четверг. На этой неделе была во вторник. Ждемс )

 

На этой неделе было 2 проверки, еще одна в четверг. Пока советник застыл в статусе "Проверяется". У некоторых советников с маркета заметил что вместо стопов позиции закрываются по профиту в пунктах. Так тоже не будет ошибки 130.

 

Сегодня была проверка, другого эксперта. В нем минстоп стоит 20п по 5-ти знаку. Видимо этого мало. В предыдущем эксперте минстоп был 40.

Поставлю 30, плюс вывод в лог стоплевела, чтобы потом на него можно было ориентироваться.