Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Скажите пожалуйста, если функция OrderSend вернула true и result.order иметь тикет ордера (result.order!=0), гарантирует ли это что ордер принят брокером и он находится во вкладке торговля или на этом этапе запрос принят только сервером брокера но не биржей?
И второй вопрос, может ли быть ситуация когда OrderSend вернула true, а result.order==0 ?
Скажите пожалуйста, если функция OrderSend вернула true и result.order иметь тикет ордера (result.order!=0), гарантирует ли это что ордер принят брокером и он находится во вкладке торговля или на этом этапе запрос принят только сервером брокера но не биржей?
Гарантирует.
И второй вопрос, может ли быть ситуация когда OrderSend вернула true, а result.order==0 ?
Нет.
Гарантирует.
Нет.
Только на днях добавили уточнение для функции OrderSend, посмотрите онлайн справку.
Только на днях добавили уточнение для функции OrderSend, посмотрите онлайн справку.
Разве это касается маркет-ордеров?
Каждый принятый ордер хранится на торговом сервере в ожидании обработки до тех пор, пока не наступит одно из условий для его исполнения:
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Типичные ошибки и способы их устранения при работе с торговым окружением
fxsaber, 2018.02.20 12:23
Условная схема реализации штатной OrderSend (без таймаута)Из этой схемы хорошо видно, что при выставлении маркет-ордера через OrderSendAsync на том же MetaQuotes-Demo невозможно гарантированно поймать событие выставления соответствующего ордера до момента, пока ордер не будет исполнен или отклонен. Т.е. в MT5 нет никаких простых механизмов оценивания промежуточных результатов своего OrderSendAsync.
OrderSend выполняется до тех пор, пока в OnTradeTransaction не придет Result.request_id равный этом же значению у OrderSendAsync. Либо же завершается аварийно по таймауту. Поэтому результат OrderSend зависит только от типа сообщения в OnTradeTransaction с соответствующим request_id.
Было бы полезно услышать про формирование самого request_id. Если правильно понимаю, то это счетчик отправленных на торговый сервер приказов с момента запуска/коннекта Терминала/Счета. Сам Терминал анализирует приходы сообщений от торгового сервера и либо только одному присваивает нужный request_id (что сомнительно), либо обнуляет request_id до определенного сообщения (вероятнее всего). Такое поведение позволило некоторое время назад добиться соответствия Истории торгов с выходом из OrderSend. Но из-за того, что только одно сообщение в OnTradeTransaction видно с нужным request_id, возникает неприятная ситуация в асинхронном режиме, приведенная в цитате выше.
Доброе время суток, обнаружил несоответствия для MqlTradeResult.deal и MqlTradeResult.order
1) Описание (Справочник MQL5)
2) Торговля в реальном времени
Ставлю рыночные ордера (TRADE_ACTION_DEAL). Вывожу функцией Print значения MqlTradeResult:
при этом в журнале deal фигурирует:
Пробовал "засыпать" функцией Sleep на пару секунд и выводить данные снова (когда сделка уже точно совершена и позиция открыта), номер сделки не появлялся.
3) Тестер Стратегий
Здесь заполняются все поля:
Чем вызваны такие различия?
Доброе время суток, обнаружил несоответствия для MqlTradeResult.deal и MqlTradeResult.order
https://www.mql5.com/ru/docs/trading/ordersend
При отправке рыночного ордера (MqlTradeRequest.action=TRADE_ACTION_DEAL) успешный результат функции OrderSend() не означает, что ордер был выполнен (исполнены соответствующие сделки): true в этом случае означает только то, что ордер был успешно размещен в торговой системе для дальнейшего выполнения. Торговый сервер может в возвращаемой структуре результата result заполнить значения полей deal или order, если эти данные будут ему известны в момент формирования ответа на вызов OrderSend(). В общем случае событие или события исполнения сделок, соответствующих ордеру, могут произойти уже после того, как будет отправлен ответ на вызов OrderSend(). Поэтому для любого типа торгового запроса при получении результата выполнения OrderSend() необходимо в первую очередь проверять код возврата торгового сервера retcode и код ответа внешней торговой системы retcode_external (при необходимости), которые доступны в возвращаемой структуре результатаresult.
Спасибо за столь информативную статью. @MetaQuotes
Запросы: Как можно коллективно перебрать все открытые ордера и открытые позиции в одном цикле for() (аналогично тому, как мы перебираем все ордера в MQL4, а затем проверяем, является ли ордер уже исполненным или отложенным)?
Спасибо за столь информативную статью. @MetaQuotes
Запросы: Как можно коллективно перебрать все открытые ордера и открытые позиции в одном цикле for() (аналогично тому, как мы перебираем все ордера в MQL4, а затем проверяем, является ли ордер уже исполненным или отложенным)?
Для вычисления ПОЗИЦИЙ и ОТЛОЖЕННЫХ ОРДЕРОВ необходимо использовать два независимых цикла. Один цикл перечисляет ПОЗИЦИИ, а второй - ОТЛОЖЕННЫЕ ОРДЕРЫ. Пример: вычисление позиций и отложенных ордеров
Я знаю, что вы не особо беспокоитесь о тех, кто только начинает изучать язык mql5, учитывая, что у вас сильное сообщество, несмотря на многочисленные критические замечания, вот еще одно:
Перевод и сама формулировка текста мешают пониманию... Я вспотел, мне пришлось далеко идти, чтобы выяснить, кто должен быть первым, так как документация сама противоречит себе, в тексте:
Чтобы получить информацию о заказе из истории, сначала нужно создать кэш истории заказов с помощью одной из трех функций: HistorySelect(start, end), HistorySelectByPosition() или HistoryOrderSelect(ticket). При успешном выполнении в кэше будет храниться количество заказов, возвращаемое функциейHistoryOrdersTotal(). Доступ к свойствам этих заказов осуществляется по каждому из элементов тикета с помощью соответствующей функции:
В отличие от: https: //www.mql5.com/pt/docs/trading/historyorderstotal, транскрибированного ниже.
HistoryOrdersTotalВозвращает количество ордеров в истории. Перед вызовом HistoryOrdersTotal() необходимо сначала получить историю сделок и ордеров с помощью функцииHistorySelect() или HistorySelectByPosition().
int HistoryOrdersTotal();
Возвращаемое значение
Значение типаdouble.
Примечание
Не путайте ордера из истории торговли сотложенными ордерами, которые отображаются на вкладке "Торговля" панели инструментов. Списокордеров, которые были отменены или привели к сделке, можно увидеть на вкладке "История" панели инструментов клиентского терминала.
Также см.
Первый отрывок противоречит сам себе, ему не нужна помощь, но тут появляется второй и доводит дело до осложнений....: в конце концов, кто стоит на первом месте, HistoryOrdersTotal или одна из трех функций HistorySelect (start, end) HistorySelectByPosition() или HistoryOrderSelect(ticket), или даже HistorySelectByPosition(), упомянутая во втором тексте.
Это было сложно, можно было бы и проще... но я думаю, что первое, что приходит на ум, это одна из трех функций HistorySelect(start, end) HistorySelectByPosition () или HistoryOrderSelect(ticket), или даже HistorySelectByPosition(), упомянутых во втором тексте...
Добрый день,
вопрос к разработчикам: можете дать примерную инфу, какой объем памяти занимает кэш истории? приблизительно кбайт на одну сделку и на один ордер.
Я запустил в терминале с небольшой историей скрипт и получил такой результат:
Это значит, что при истории в пару миллионов сделок и миллион ордеров кэш займет порядка гигабайта?
И так для каждой mql программы?