MQL5: Валидация :-( Уже сломал голову над поиском что это такое и как решается. - страница 2

 
Alexandr Gavrilin:

на нехватку маржи другие сообщения приходят.

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

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

Ошибка

 
Alexandr Gavrilin:

....

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

Попробуйте открыть позицию заведомо очень большим объемом. Посмотрите выловит ли эту ошибку ваш советник или нет.

 
Alexandr Gavrilin:

на нехватку маржи другие сообщения приходят.

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

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

Можно проверить Margin Level. Допустим если меньше 5000%, то не выполнить никакие сделки.

 
Vladimir Karputov:

Ошибка

Решил. 

//в функции до открытия ордера.

double max_volume=SymbolInfoDouble(m_name,SYMBOL_VOLUME_LIMIT);

      double current_lots=getAllVolume();

      if(max_volume>0 && max_volume-current_lots-dlot<=0)
        {
         //PrintFormat("%.2f - %.2f",max_volume , dlot);
         return 0;
        }
//...
//функция подсчета объема
double getAllVolume()
     {
      int itotal=PositionsTotal();
      ulong uticket=-1;
      double dVolume=0;

      for(int i=itotal-1;i>=0;i--)
        {
         if(!(uticket=PositionGetTicket(i))) continue;

         if(PositionGetString(POSITION_SYMBOL)==m_symbol.Name())
            dVolume+=PositionGetDouble(POSITION_VOLUME);
        }

      itotal=OrdersTotal();

      for(int i=itotal-1;i>=0;i--)
        {
         if(!(uticket=OrderGetTicket(i))) continue;

         if(OrderGetString(ORDER_SYMBOL)==m_symbol.Name())
            dVolume+=OrderGetDouble(ORDER_VOLUME_CURRENT);
        }

      return dVolume;
     }
После этого продукт успешно прошел проверки.
 
Alexandr Gavrilin:

Решил. 

После этого продукт успешно прошел проверки.

:)

 

Да, кстати, учитывайте в расчётах, что SYMBOL_VOLUME_LIMIT может быть равен "0.0".

Чтобы не попасться на проверку:

if(check_volume > SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_LIMIT))
   return;
 
Vladimir Karputov:

Да, кстати, учитывайте в расчётах, что SYMBOL_VOLUME_LIMIT может быть равен "0.0".

Чтобы не попасться на проверку:

На счет этого сообщения, что-то не так:  failed instant sell 3.30 EURUSD at 1.14380 [Volume limit reached]

У меня был неттинговый счет, и никаких лимитных или отложенных ордеров не было. Присутствовали все проверки.

Вот сейчас проверил SYMBOL_VOLUME_LIMIT, независимо от того, есть открытый ордер или нет, всегда возвращает 0. У меня всегда одна позиция(поскольку неттинговый тип), и это сообщение появляется только при увеличения лота и только при автовалидации.

 
Petros Shatakhtsyan:

На счет этого сообщения, что-то не так:  failed instant sell 3.30 EURUSD at 1.14380 [Volume limit reached]

У меня был неттинговый счет, и никаких лимитных или отложенных ордеров не было. Присутствовали все проверки.

Вот сейчас проверил SYMBOL_VOLUME_LIMIT, независимо от того, есть открытый ордер или нет, всегда возвращает 0. У меня всегда одна позиция(поскольку неттинговый тип), и это сообщение появляется только при увеличения лота и только при автовалидации.

Если Вы работаете на каком-то сервере, это не означает, что вокруг все сервера имеют такие же настройки :) . 

 
Vladimir Karputov:

Если Вы работаете на каком-то сервере, это не означает, что вокруг все сервера имеют такие же настройки :) . 

И поэтому я проверяю на разных серверах, около 5-6, где есть разные типы исполнения. Вот на этом сообщении тип исполнения Instant.

Но это не главное. Автовалидация мало информации дает, и это затрудняет найти ошибку. А обойти её всегда можно.  

 
Вчера на обновление проходил Автовалидацию. На MT5 с пол тычка, а MT4весь вечер почти потратил все ордера не брал. Спред какой только не ставил. Надоело, зашел через пару часиков. проскочил ее без проблем. Так иногда проблема не в эксперте бывает а в сервисе.
Причина обращения: