![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
пусть разработчики разбираються. вот скрин на нем 3 запуска этого скрипта.
у меня к сожалению не работает
Баг - раньше работало, а теперь нет.
Спасибо за сообщение.
Будем искать.
Нашел небольшой баг в методе 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'",
Проверил, исправленная функция работает правильно.
Баг - раньше работало, а теперь нет.
Спасибо за сообщение. Будет доступно в следующем обновлении. Чтобы заработало в текущей версии используйте явный кастинг для константы или умножения в целом
{
// вот так работает
Print(TimeCurrent()+2*PeriodSeconds(PERIOD_D1));
// а вот так нет (а раньше работало)
datetime time_end=0;
time_end=TimeCurrent()+(long)2*PeriodSeconds(PERIOD_D1);
Print(time_end);
}
Нашел небольшой баг в методе PrintCheckResult (файл Trade.mqh, Торговые классы, класс CTrade).
Спасибо за сообщение.
В ближайшее время будет исправлено.
Спасибо за сообщение. Будет доступно в следующем обновлении. Чтобы заработало в текущей версии используйте явный кастинг для константы или умножения в целом
Спасибо. Если я правильно понял это происходило из-за приведения типов. Очень жаль что при компиляции нет этого сообщения, было бы легче найти
Для правильной обработки ошибок ENUM_TRADE_RETURN_CODES необходимо правильно их интерпретировать. Есть ли материал по их подробному описанию?
В частности, не до конца понятны следующие ошибки:
10008
TRADE_RETCODE_PLACED
Ордер размещен
10021
TRADE_RETCODE_PRICE_OFF
Отсутствуют котировки для обработки запроса
10028
TRADE_RETCODE_LOCKED
Запрос заблокирован для обработки
10029
TRADE_RETCODE_FROZEN
Ордер или позиция заморожены
Может ли кто-нибудь помочь с этим вопросом?
Для правильной обработки ошибок 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
Запрос заблокирован для обработки
Это пожалуй самый специфичный из выше перечисленных ответов сервера. тут скорей всего нужны пояснения разработчиков (предположу только что скорей всего стоит просто подождать определенное время)...
Что касается
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: Заявка выполнена".