Как узнать, какое сообщение поступило первым в OnTradeTransaction TRADE_TRANSACTION_HISTORY_ADD или TRADE_TRANSACTION_DEAL_ADD?
Всем привет!
Собственно САБЖ
Просто распечатать тип транзакции:
//+------------------------------------------------------------------+ //| TradeTransaction function | //+------------------------------------------------------------------+ void OnTradeTransaction(const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result) { //--- string text =EnumToString(trans.type); Print(__FUNCTION__,", ",text); }
и сразу станет понятно, какое событие было первым.
Добавлено: кстати, Вы увидите, что есть не только эти два события. Ещё можно пример посмотреть OrderSendAsync: там идёт распечатка более подробная в OnTarde() и в OnTradeTransaction().
Просто распечатать тип транзакции:
и сразу станет понятно, какое событие было первым.
Добавлено: кстати, Вы увидите, что есть не только эти два события. Ещё можно пример посмотреть OrderSendAsync: там идёт распечатка более подробная в OnTarde() и в OnTradeTransaction().
Спасибо, но я хочу это "видеть" в коде, а не в журнале.
Так код я показал.
Перефразируйте, что именно нужно.
Добавлено.
Введите две переменные, в области глобальных переменных программы (советника) и сохраните в них время транзакций по типам. Одна переменная хранит время прихода TRADE_TRANSACTION_HISTORY_ADD , а вторая TRADE_TRANSACTION_DEAL_ADD.
//+------------------------------------------------------------------+ //| TradeTransaction function | //+------------------------------------------------------------------+ void OnTradeTransaction(const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result) { //--- if(trans.type==TRADE_TRANSACTION_HISTORY_ADD) time_HISTORY_ADD=GetMicrosecondCount(); if(trans.type==TRADE_TRANSACTION_DEAL_ADD) time_DEAL_ADD=GetMicrosecondCount(); }А там уже можете сравнивать эти два времени.
Видимо, я не совсем правильно поставил вопрос.
На ФОРТС, при парном трейдинге или календарном спреде, есть правило, которое минимизирует
проскальзывание, при открытии позиций.
Покупка(продажа) первой ноги происходит лимитным ордером (чтобы ухватить сколько дадут), а ответная сделка, для уравновешивания позиций,
должна производится как можно быстрее и рыночным ордером.
//+------------------------------------------------------------------+ //| Prioritet.mq5 | //| Copyright 2016, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2016, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" // bool pause_trade; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { pause_trade=false; return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| BookEvent function | //+------------------------------------------------------------------+ void OnBookEvent(const string &symbol) { if(symbol==Symbol()) { if(!pause_trade) { //Expert working.... } } } //+------------------------------------------------------------------+ //| TradeTransaction function | //+------------------------------------------------------------------+ void OnTradeTransaction(const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result) { switch(trans.type) { case TRADE_TRANSACTION_DEAL_ADD: //pause_trade=?????????????????????????? break; case TRADE_TRANSACTION_HISTORY_ADD: //Как узнать, что последнее событие TRADE_TRANSACTION_DEAL_ADD пришло или нет???? //pause_trade=?????????????????????????? break; } } //+------------------------------------------------------------------+
Но рыночный ордер может залится не одной сделкой, а несколькими, отсюда возникает проблема контроля, вызванная тем,
что нет очерёдности TRADE_TRANSACTION_DEAL_ADD и TRADE_TRANSACTION_HISTORY_ADD.
Пока мы не получили TRADE_TRANSACTION_DEAL_ADD мы не можем правильно оценить баланс позиций.
На один TRADE_TRANSACTION_HISTORY_ADD может приходится несколько TRADE_TRANSACTION_DEAL_ADD.
При открытии позиций по иструментам (до их полного выравнивания), необходимо делать паузу получения котировок pause_trade.
(чтобы небыло повторных срабатываний)
Загвоздка в том когда нужно разблокировать pause_trade.
Если первым пришло TRADE_TRANSACTION_HISTORY_ADD (всё, ордер в истории, но было ли TRADE_TRANSACTION_DEAL_ADD) мы не можем получить данные о позициях, пока не
получим TRADE_TRANSACTION_DEAL_ADD.
Вот "Эксперты"
2016.08.05 19:29:19.872 OnTradeTransactionPartialСlosure (RTS-9.16,M1) OnTradeTransaction, TRADE_TRANSACTION_ORDER_ADD 2016.08.05 19:29:19.873 OnTradeTransactionPartialСlosure (RTS-9.16,M1) OnTradeTransaction, TRADE_TRANSACTION_REQUEST 2016.08.05 19:29:19.874 OnTradeTransactionPartialСlosure (RTS-9.16,M1) OnTradeTransaction, TRADE_TRANSACTION_ORDER_UPDATE 2016.08.05 19:29:19.898 OnTradeTransactionPartialСlosure (RTS-9.16,M1) OnTradeTransaction, TRADE_TRANSACTION_ORDER_UPDATE 2016.08.05 19:29:21.105 OnTradeTransactionPartialСlosure (RTS-9.16,M1) OnTradeTransaction, TRADE_TRANSACTION_ORDER_UPDATE 2016.08.05 19:29:21.108 OnTradeTransactionPartialСlosure (RTS-9.16,M1) OnTradeTransaction, TRADE_TRANSACTION_DEAL_ADD 2016.08.05 19:29:21.636 OnTradeTransactionPartialСlosure (RTS-9.16,M1) OnTradeTransaction, TRADE_TRANSACTION_ORDER_DELETE 2016.08.05 19:29:21.640 OnTradeTransactionPartialСlosure (RTS-9.16,M1) OnTradeTransaction, TRADE_TRANSACTION_HISTORY_ADD 2016.08.05 19:29:21.640 OnTradeTransactionPartialСlosure (RTS-9.16,M1) OnTradeTransaction, TRADE_TRANSACTION_DEAL_ADD
а вот "Журнал":
2016.08.05 19:29:19.857 Trades '1006437': sell limit 3.00 RTS-9.16 at 93110 2016.08.05 19:29:19.873 Trades '1006437': sell limit 3.00 RTS-9.16 at 93110 placed for execution in 16 ms 2016.08.05 19:29:21.105 Trades '1006437': deal #7441348 sell 2.00 RTS-9.16 at 93110 done (based on order #50801677) 2016.08.05 19:29:21.640 Trades '1006437': deal #7441349 sell 1.00 RTS-9.16 at 93110 done (based on order #50801677)
Вот "Эксперты"
а вот "Журнал":
Спасибо
Как по мне - пока не прошла транзакция с типом TRADE_TRANSACTION_DEAL_ADD - нельзя ничего делать дальше - иначе может быть результат неопределённым.
Всем спасибо, проблему решил так:
Про получении TRADE_TRANSACTION_HISTORY_ADD
Проверяю объёмы сделок по данному инструменту с нужным тикетом ордера, если их меньше,
чем инициировано в рыночном ордере, то будет ещё одно TRADE_TRANSACTION_DEAL_ADD
Всем спасибо, проблему решил так:
Про получении TRADE_TRANSACTION_HISTORY_ADD
Проверяю объёмы сделок по данному инструменту с нужным тикетом ордера, если их меньше,
чем инициировано в рыночном ордере, то будет ещё одно TRADE_TRANSACTION_DEAL_ADD

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Всем привет!
Собственно САБЖ