
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Нет, OnTradeTransaction будет только при успешном выполнении:
OnTradeTransaction
В результате выполнения определенных действий с торговым счетом, его состояние изменяется. К таким действиям относятся:
·Отсылка торгового запроса любым MQL5-приложением в клиентском терминале при помощи функций OrderSend и OrderSendAsync и его последующее исполнение;
Нет, OnTradeTransaction будет только при успешном выполнении:
OnTradeTransaction
В результате выполнения определенных действий с торговым счетом, его состояние изменяется. К таким действиям относятся:
·Отсылка торгового запроса любым MQL5-приложением в клиентском терминале при помощи функций OrderSend и OrderSendAsync и его последующее исполнение;
Задний ход делать нечем, если запрос на открытие уже ушел и висит в очереди.
Вообще приведенный код плох с многих позиций. Например, нельзя все ошибки грести одной гребенкой (есть критические, при которых продолжать не имеет смысла, а при некоторых таких как 10010 нужно бы подредактировать запрос). Бесконечный цикл - это в данном случае антипаттерн. И ждать результата нужно не в нем, а в OnTradeTransaction как уже сказали.
Открываю сделку в цикле следующим кодом:
Цикл задуман как средство повышения надежности открытия сделки, то есть, если не открывается с первого раза, пробовать снова.
Проблема в том, что, пока терминал получает ответ сервера, цикл успевает послать команду OrderSend() несколько раз.
Как можно заставить его ждать ответа?
На каком сервере и на каком инструменте чаще всего OrderSend() возвращает false? Хочу кое что проверить.
Добавлено: хочу проверить догадку, что пока OrderSend() == false, в Results.retcode храниться мусор, а значит проверять его нет смысла.
На каком сервере и на каком инструменте чаще всего OrderSend() возвращает false? Хочу кое что проверить.
Добавлено: хочу проверить догадку, что пока OrderSend() == false, в Results.retcode храниться мусор, а значит проверять его нет смысла.
Что было? Расскажите поподробней.
В кратце - не получив ответа от сервера через паузу происходил повторный запрос на сервер - выставлялась отложка.
Подробней тут https://www.mql5.com/ru/forum/83456
Официальный ответ от разработчиков сводится к тому, что:
- Нужно увеличивать пинг
- Нельзя работать с большим количеством ордеров одновременно, не смотря на то, что терминал может работать со 100 ордерами
А почему-бы не следить за транзакциями? Событие OnTradeTransaction() прошло, анализируйте что случилось.
Событие OnTradeTransaction() можно отследить изнутри цикла? Мне же нужно внутри цикла ждать прерывания от функции OnTradeTransaction(). А если я могу заставит его ждать ответа этой функции, то мне проще прямо внутри цикла дождаться получения реткода, и дальше действовать в зависимости от его значения.
Вот если бы была функция PauseAfterTrade.... :)
Попробуйте между посылкой запросов сделать паузу. Используйте функцию PauseBeforeTrade
Не просто OnTradeTransaction(), а именно тип транзакции TRADE_TRANSACTION_DEAL_ADD - событие добавления сделки в историю.
На каком сервере и на каком инструменте чаще всего OrderSend() возвращает false? Хочу кое что проверить.
Добавлено: хочу проверить догадку, что пока OrderSend() == false, в Results.retcode храниться мусор, а значит проверять его нет смысла.
Так оно и есть. Я заметил, что проверка Rsults.retcode и OrderSend() == true - это одно и тоже.
У Альфабанка и ВТБ не открывались сделки. Поэтому я поставил цикл. Мне нужно надежное открытие.
Попробовал, стало открываться по несколько сделок. Хотя не уверен, что это связано с циклом. Возможно, в другом месте косяк.
Я пока не понимаю, как мне внутри цикла дожидаться ответа функции OnTradeTransaction.