Ошибки, баги, вопросы - страница 123

 

пусть разработчики разбираються. вот скрин на нем 3 запуска этого скрипта. 

 

у меня к сожалению не работает 

 
Prival:

Баг - раньше работало, а теперь нет. 

 

Спасибо за сообщение.

Будем искать.

 

Нашел небольшой баг в методе PrintCheckResult (файл Trade.mqh, Торговые классы, класс CTrade).

void CTrade::PrintCheckResult(void) const
  {
   printf("CheckResult");
//   printf("%d,%f,%f,%f,%f,%f,%f,'%s'",            - предпоследний параметр - лишний
   printf("%d,%f,%f,%f,%f,%f,'%s'",
           m_check_result.retcode,m_check_result.balance,m_check_result.equity,
           m_check_result.margin,m_check_result.margin_free,m_check_result.margin_level,
           m_check_result.comment);
  } 

 

Вместо строки:  printf("%d,%f,%f,%f,%f,%f,%f,'%s'", - закомментирована мной

должна быть строка: printf("%d,%f,%f,%f,%f,%f,'%s'",

Проверил, исправленная функция работает правильно. 

 
Prival:

Баг - раньше работало, а теперь нет. 

 

Спасибо за сообщение. Будет доступно в следующем обновлении. Чтобы заработало в текущей версии используйте явный кастинг для константы или умножения в целом

void OnStart()
  {
  // вот так работает
     Print(TimeCurrent()+2*PeriodSeconds(PERIOD_D1));
  // а вот так нет (а раньше работало)  
     datetime    time_end=0;
     time_end=TimeCurrent()+(long)2*PeriodSeconds(PERIOD_D1);
     Print(time_end);
  }
 
retired:

Нашел небольшой баг в методе PrintCheckResult (файл Trade.mqh, Торговые классы, класс CTrade).


 

Спасибо за сообщение.

В ближайшее время будет исправлено.

 
mql5:

Спасибо за сообщение. Будет доступно в следующем обновлении. Чтобы заработало в текущей версии используйте явный кастинг для константы или умножения в целом

Спасибо. Если я правильно понял это происходило из-за приведения типов. Очень жаль что при компиляции нет этого сообщения, было бы легче найти
Документация по MQL5: Основы языка / Типы данных / Приведение типов
Документация по MQL5: Основы языка / Типы данных / Приведение типов
  • www.mql5.com
Основы языка / Типы данных / Приведение типов - Документация по MQL5
 
Prival:
Спасибо. Если я правильно понял это происходило из-за приведения типов. Очень жаль что при компиляции нет этого сообщения, было бы легче найти
Ваш код правильный, там не на что ругаться. Ошибка действительно в приведении операнда под x64 и она была исправлена. Ждите обновлений.
 

Для правильной обработки ошибок ENUM_TRADE_RETURN_CODES необходимо правильно их интерпретировать. Есть ли материал по их подробному описанию?

В частности, не до конца понятны следующие ошибки:

10008

TRADE_RETCODE_PLACED

Ордер размещен

10021

TRADE_RETCODE_PRICE_OFF

Отсутствуют котировки для обработки запроса


10028

TRADE_RETCODE_LOCKED

Запрос заблокирован для обработки

10029

TRADE_RETCODE_FROZEN

Ордер или позиция заморожены

Может ли кто-нибудь помочь с этим вопросом? 

 
retired:

Для правильной обработки ошибок ENUM_TRADE_RETURN_CODES необходимо правильно их интерпретировать. Есть ли материал по их подробному описанию?

В частности, не до конца понятны следующие ошибки:

10008

TRADE_RETCODE_PLACED

Ордер размещен

10021

TRADE_RETCODE_PRICE_OFF

Отсутствуют котировки для обработки запроса


10028

TRADE_RETCODE_LOCKED

Запрос заблокирован для обработки

10029

TRADE_RETCODE_FROZEN

Ордер или позиция заморожены

Может ли кто-нибудь помочь с этим вопросом? 

 

Все выше перечисленное относится к кодам которые возвращает сервер в ответ на запрос терминала. Поэтому все и приведено в разделе "Коды возврата торгового сервера"

Логично будет предположить, что в списке содержатся не только ошибки.

Теперь по порядку

Что касается

10008

TRADE_RETCODE_PLACED

Ордер размещен


Логично предположить что данный ответ как раз не является ошибкой, а просто сообщает клиенту (торговому терминалу) об успешном размещении ордера.

В данном случае можно поступить тремя способами:

1. Вообще не обрабатывать ответ;

2. Обработать выставление ордера в блоке OnTrade() - Вполне приемлемый, но на мой взгляд не очень правильный вариант;

3. Обработать ответ по месту установки ордера - На мой взгляд самый оптимальный способ обработки механической торговли.

PS

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

К примеру в OnTrade можно отлавливать торговые операции трейдера (установку или удаление ордера, а также работу с позициями).


Что касается


10029

TRADE_RETCODE_FROZEN

Ордер или позиция заморожены


Существует опредеоенный уровень при достижении которого позиция или ордер "замораживаются" (с ними запрещены любые операции).

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

Узнать ее можно при помощи SymbolInfoInteger() с параметром SYMBOL_TRADE_FREEZE_LEVEL.

Если был получен такой ответ от сервера необходимо дождаться пока не случиться одно из двух:

1. Цена не отойдет на необходимое расстояние (большее чем то что указано в свойствах символа);

2. Ордер или позиция не отработают те условия которые в них указаны.


Что касается

10021

TRADE_RETCODE_PRICE_OFF

Отсутствуют котировки для обработки запроса


Наверно при получении такого ответа стоит проверить имя символа (на всякий случай), убедиться в том что символ выбран (актуально для тестера и мультиков), убедиться в наличии истории, в том числе и на сервере (если требуется пдгрузить ее), наверно убедиться в том что рынок открыт и торговля по инструменту возможна.

PS

Хотя тут нужно будет уточнить у разработчиков


Что качается

10028

TRADE_RETCODE_LOCKED

Запрос заблокирован для обработки


Это пожалуй самый специфичный из выше перечисленных ответов сервера. тут скорей всего нужны пояснения разработчиков (предположу только что скорей всего стоит просто подождать определенное время)...

 
Interesting:

Что касается


10029

TRADE_RETCODE_FROZEN

Ордер или позиция заморожены


Существует опредеоенный уровень при достижении которого позиция или ордер "замораживаются" (с ними запрещены любые операции).

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

Узнать ее можно при помощи SymbolInfoInteger() с параметром SYMBOL_TRADE_FREEZE_LEVEL.

Если был получен такой ответ от сервера необходимо дождаться пока не случиться одно из двух:

1. Цена не отойдет на необходимое расстояние (большее чем то что указано в свойствах символа);

2. Ордер или позиция не отработают те условия которые в них указаны.


 

Спасибо за развернутый ответ. С кодом "10029: TRADE_RETCODE_FROZEN: Ордер или позиция заморожены" понятно.

Однако вопросы по остальным остались (хотелось бы услышать точный ответ, а не предположения):

10008

TRADE_RETCODE_PLACED

Ордер размещен

10021

TRADE_RETCODE_PRICE_OFF

Отсутствуют котировки для обработки запроса


10028

TRADE_RETCODE_LOCKED

Запрос заблокирован для обработки

В частности, не совсем понятно, что значит "10008: Ордер размещен", ведь когда ордер поставлен в очередь на сервере, то ему присваивается тикет и возвращается код "10009: TRADE_RETCODE_DONE: Заявка выполнена".

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