Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Что-то не получается у меня пояснить, видимо. Вот реальный пример. Вот такой код:
и так далее.
Видно, что время отработки OnTradeTransaction в двух советниках совпадает до миллисекунд. Вот и возник вопрос, событие "сделка" приходит вначале в один OnTradeTransaction в одном советнике, затем в следующий в другом советнике или каким-то образом параллельно сразу во все обработчики во всех советниках поступает? Ну типа параллельная многопоточная работа или как это называется в программировании. Я уверен, что все происходит последовательно, просто отрабатыается быстро в одну миллисекунду, но на всякий случай спросил.
Что-то не получается у меня пояснить, видимо. Вот реальный пример. Вот такой код:
void OnTradeTransaction(const MqlTradeTransaction& trans,
const MqlTradeRequest& request,
const MqlTradeResult& result)
{
Count++;
Print("Ontrade_test = ",Count);
}
Обработчик стоит в двух советниках, при совершении 1 сделки он отрабатывается множество раз в двух советниках. Код выдает:
18:31:06.495 ontrade_trans_functions (MXI-12.17,H1) Ontrade_test = 1
18:31:06.495 ontrade_trans_functions2 (MXI-12.17,H1) Ontrade_test = 1
18:31:06.497 ontrade_trans_functions (MXI-12.17,H1) Ontrade_test = 2
18:31:06.497 ontrade_trans_functions2 (MXI-12.17,M5) Ontrade_test = 2
18:31:06.498 ontrade_trans_functions (MXI-12.17,M5) Ontrade_test = 3
18:31:06.498 ontrade_trans_functions2 (MXI-12.17,H1) Ontrade_test = 3
18:31:06.500 ontrade_trans_functions (MXI-12.17,M5) Ontrade_test = 4
18:31:06.500 ontrade_trans_functions2 (MXI-12.17,H1) Ontrade_test = 4 ...
и так далее.
Видно, что время отработки OnTradeTransaction в двух советниках совпадает до миллисекунд. Вот и возник вопрос, событие "сделка" приходит вначале в один OnTradeTransaction в одном советнике, затем в следующий в другом советнике или каким-то образом параллельно сразу во все обработчики во всех советниках поступает? Ну типа параллельная многопоточная работа или как это называется в программировании. Я уверен, что все происходит последовательно, просто отрабатыается быстро в одну миллисекунду, но на всякий случай спросил.
Обработчик OnTradeTransaction для ОДНОГО символа (m_symbol.Name()) и одного magic'a (m_magic).
Отлавливаем сначала транзакцию
TRADE_TRANSACTION_DEAL_ADD
Добавление сделки в историю. Осуществляется в результате исполнения ордера или проведения операций с балансом счета.
затем смотрим, чтобы это была сделка
DEAL_ENTRY_OUT
Выход из рынка
Событие OnTradeTransaction - широковещательное, туда "валятся" все действия, которые совершаются Вашим терминалом.
Просто каждый советник должен фильтровать свои действия.
далее в каждом типе мы фильтруем по тикету, если ассинхронная отправка ордера, то
сначала по request ID получаем тикет, а затем по тикету фильтруем.
Событие TRADE_TRANSACTION_REQUEST всегда приходит первым, остальные "как захотят"
Добавлено
Всё это уже много раз обсуждалось
Поищите в разделе "Биржевой трейдинг"
Спасибо, вроде, получается "записывать" нужные сделки.
Обработчик OnTradeTransaction для ОДНОГО символа (m_symbol.Name()) и одного magic'a (m_magic).
Отлавливаем сначала транзакцию
TRADE_TRANSACTION_DEAL_ADD
Добавление сделки в историю. Осуществляется в результате исполнения ордера или проведения операций с балансом счета.
затем смотрим, чтобы это была сделка
DEAL_ENTRY_OUT
Выход из рынка
Здравствуйте, коллеги.
Столкнулся с ситуацией, когда событие TRADE_TRANSACTION_DEAL_ADD для одной и той же сделки "отлавливается" несколько раз. Не всегда, но регулярно.
Написал все проверки, но сделка определённо одна и та же. Работает вот такой код
Для понимания, та же ли это ловится сделка, проверяю её тикет и свойства. Это отложенный лимитный ордер срабатывает по частям, брокер Открытие. Логи получаю следующие
Выделил, где несколько раз ловилась одна и та же сделка. Там ещё сделки 17157068 и 17157069 несколько раз ловилась, не стал уж выделять. По таймингу это происходит практически мгновенно.
У меня вопрос, разве не должна функция только один раз отлавливать событие? Или ещё какую то проверку нужно сделать?
Здравствуйте, коллеги.
Столкнулся с ситуацией, когда событие TRADE_TRANSACTION_DEAL_ADD для одной и той же сделки "отлавливается" несколько раз. Не всегда, но регулярно.
Написал все проверки, но сделка определённо одна и та же. Работает вот такой код
Для понимания, та же ли это ловится сделка, проверяю её тикет и свойства. Это отложенный лимитный ордер срабатывает по частям, брокер Открытие. Логи получаю следующие
Выделил, где несколько раз ловилась одна и та же сделка. Там ещё сделки 17157068 и 17157069 несколько раз ловилась, не стал уж выделять. По таймингу это происходит практически мгновенно.
У меня вопрос, разве не должна функция только один раз отлавливать событие? Или ещё какую то проверку нужно сделать?
Не знаю, но я вижу три функции печати
И три записи одновременно
Если это условие выполнено, то выполняются следующие две функции печати…
Все правильно вы пишите. Только суть не уловили. А она в том, что функция OnTradeTransaction по условию (событию)
Вы можете повторить частичное исполнение ордера? Попробуйте поставить в режиме отладки поставив точку останова на строке
и потом пройдите пошагово наблюдая тип транзакции, тикет сделки и всё что можно посмотреть…
У меня ни разу не получалось неоднократное выполнение OnTradeTransaction() с типом TRADE_TRANSACTION_DEAL_ADD
Конечно если в ордере 3 лота, а выполняется 3 раза по 1 лоту, то и выполнение TRADE_TRANSACTION_DEAL_ADD должно быть трижды. Но никак не больше.
Я тоже не замечал ранее такого поведения функции OnTradeTransaction. Но в этом советнике требуется открыть позиции по другим инструментам объёмом, пропорционально сработавшему объёму отложенному ордеру. И косяк сразу всплыл. По другим инструментам пошли бОльшие объёмы, чем требовалось.
Вы можете повторить частичное исполнение ордера? Попробуйте поставить в режиме отладки поставив точку останова на строке
и потом пройдите пошагово наблюдая тип транзакции, тикет сделки и всё что можно посмотреть…
У меня ни разу не получалось неоднократное выполнение OnTradeTransaction() с типом TRADE_TRANSACTION_DEAL_ADD
Конечно если в ордере 3 лота, а выполняется 3 раза по 1 лоту, то и выполнение TRADE_TRANSACTION_DEAL_ADD должно быть трижды. Но никак не больше.
Конечно, если речь про ордер то трижды. Я пишу про сделку. По каждой сделке должно быть одно срабатывание. А там несколько, и это видно в логах (номер сделки один, это тоже видно). Отложенный ордер там был № 823878027 (14 лотов), и это не все логи его открытия. Там 7 лотов уходило на закрытие BUY (они и отражены в логах) и остальные 7 на открытие SELL, переворот был. Со сделки № 17157069 началось открытие SELL. Можно несложно посчитать, учитывая задублированные срабатывания по сделкам, что 7 (первая сделка 3 лота, остальные по 1) лотов закрыли BUY, и далее пошло открытие.
Но в логах ясно видно, что срабатывание функции OnTradeTransaction по типу TRADE_TRANSACTION_DEAL_ADD происходит для одной сделки несколько раз. Мне не к чему в режиме отладки смотреть, я и так всё вижу по результату и по логам.
Я тоже не замечал ранее такого поведения функции OnTradeTransaction. Но в этом советнике требуется открыть позиции по другим инструментам объёмом, пропорционально сработавшему объёму отложенному ордеру. И косяк сразу всплыл. По другим инструментам пошли бОльшие объёмы, чем требовалось.
Конечно, если речь про ордер то трижды. Я пишу про сделку. По каждой сделке должно быть одно срабатывание. А там несколько, и это видно в логах (номер сделки один, это тоже видно). Отложенный ордер там был № 823878027 (14 лотов), и это не все логи его открытия. Там 7 лотов уходило на закрытие BUY (они и отражены в логах) и остальные 7 на открытие SELL, переворот был. Со сделки № 17157069 началось открытие SELL. Можно несложно посчитать, учитывая задублированные срабатывания по сделкам, что 7 (первая сделка 3 лота, остальные по 1) лотов закрыли BUY, и далее пошло открытие.
Но в логах ясно видно, что срабатывание функции OnTradeTransaction по типу TRADE_TRANSACTION_DEAL_ADD происходит для одной сделки несколько раз. Мне не к чему в режиме отладки смотреть, я и так всё вижу по результату и по логам.
Вот даже как… Оказывается не просто 14 лотов, а ещё и закрытие… Так и отсеивайте по DEAL_ENTRY_IN или DEAL_ENTRY_OUT, а потом можно выбрать все ордера и сделки по ID позиции и проверить и количество и объёмы и всё что нужно. В распечатке только последняя сделка DEAL_ENTRY_IN, а все предыдущие DEAL_ENTRY_OUT. Вот их и надо посчитать сколько лотов набралось…
Я не сталкивался с частичным исполнением, с уверенностью не знаю может-ли быть тикет сделки один… Тут все карты в ваших руках… Только многократными проверками можно всё понять…