https://www.mql5.com/ru/docs/basis/function/events#ontrade

- www.mql5.com
Я чутка промахнулся. Значит OnTradeTransaction() мне по прежнему не нужна, как я понимаю.
Я чутка промахнулся. Значит OnTradeTransaction() мне по прежнему не нужна, как я понимаю.
Можно и OnTradeTransaction(). Это дублирующиеся функции.
Появилась необходимость мониторить момент, когда отработает ордер т.е. когда он станет рыночным. Соответственно, если он станет рыночных, нужно будет дальнейшие действия производить. Как это промониторить лучше?
Я так понимаю для подобных операций и нужно функция OnTradeTransaction() исходя из логики. Попробую щяс реализовать..
Работать нужно только с OnTradeTransaction() - это правильно:
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Vladimir Karputov, 2017.10.04 06:38
Когда отложенный ордер срабатывает - появляется позиция. Этот момент (появление позиции) отслеживается в OnTradeTransaction:
Всё. Момент появления позиции мы словили. То есть используется событийная модель и в таком случае не нужны никакие таймеры.ловим транцакцию с типом TRADE_TRANSACTION_DEAL_ADD
смотрим на направление сделки, которая породила транзакцию (ENUM_DEAL_ENTRY) - отлавливаем вход
Зачем Вы вводите людей в заблуждение?
Используя OnTrade() нужно "танцевать с бубном", чтобы узнать, что произошло с ордером,
тогда как OnTradeTransaction() сразу "скажет" что произошло.
Я смотрю мнения разделились, что логично т.к. в справке ничего не сказано о том, как с этим работать. Можно, конечно, проверять, но это времени нужно N-ое количество. А желание есть дописать алгоритм, а не догадываться))
Так всё-таки с чем работать? С OnTrade() или с OnTradeTransaction() ?
Я только что в тестере расставил точки остановка в OnTrade(), и, ни одного раза ни при какомсобытии у меня не остановился тестер. Он в тестере не работает что-ли в режиме отладчика? Как тогда тестировать бота на истории? Алгоритм то нужно протестировать, что он работает корректно..
Я ещё свой код не писал для этого т.к. только вот в эту тему начал вникать. Взял статью за пример. В том switch'е, который там приводится я расставил точки останова. В общем, какой-то OnTrade() привой, на первый взгляд. Ну а если пользоваться лишь функцией OnTradeTransaction(), тогда зачем нужна функция OnTrade()?
Я так понимаю, не только я в этом вопросе плаваю..)) Т.к. мнения разделились.. Да и не нужно было мне это до сегодняшнего утра.. Смотрел я на эти функции, видел статьи, но думал.. "зачем они ими пользуются!". Так вот теерь пришёл я к выводу, что это нужно.
Я смотрю мнения разделились, что логично т.к. в справке ничего не сказано о том, как с этим работать. Можно, конечно, проверять, но это времени нужно N-ое количество. А желание есть дописать алгоритм, а не догадываться))
Так всё-таки с чем работать? С OnTrade() или с OnTradeTransaction() ?
Я только что в тестере расставил точки остановка в OnTrade(), и, ни одного раза ни при какомсобытии у меня не остановился тестер. Он в тестере не работает что-ли в режиме отладчика? Как тогда тестировать бота на истории? Алгоритм то нужно протестировать, что он работает корректно..
Я ещё свой код не писал для этого т.к. только вот в эту тему начал вникать. Взял статью за пример. В том switch'е, который там приводится я расставил точки останова. В общем, какой-то OnTrade() привой, на первый взгляд. Ну а если пользоваться лишь функцией OnTradeTransaction(), тогда зачем нужна функция OnTrade()?
Я так понимаю, не только я в этом вопросе плаваю..)) Т.к. мнения разделились.. Да и не нужно было мне это до сегодняшнего утра.. Смотрел я на эти функции, видел статьи, но думал.. "зачем они ими пользуются!". Так вот теерь пришёл я к выводу, что это нужно.
Сначала появилась функции OnTrade. Потом появилась мощная и намного более информативная OnTradeTransaction. Только OnTradeTransaction позволяет получать обширную и точную информацию.
Я делаю так:
//--- проверка установленных ордеров if(!order_exist && my_Position.Select(Symbol()) && my_Position.Symbol()==Symbol()) { pos_price = my_Position.PriceOpen(); if(my_Position.PositionType() == POSITION_TYPE_BUY) trend = trend_up; else trend = trend_dn; if(order_exist_stop) { if(trend == trend_up) Comment("Сработал отложенный ордер на покупку.\nВзял под контроль..."); else Comment("Сработал отложенный ордер на продажу.\nВзял под контроль..."); } else { if(trend == trend_up) Comment("Найден ордер на покупку.\nВзял под контроль..."); else Comment("Найден ордер на продажу.\nВзял под контроль..."); } } // установленные вручную if(!order_exist_stop && !order_exist) { for(int k=OrdersTotal()-1;k>=0;k--) { ticket_num = OrderGetTicket(k); if(OrderSelect(ticket_num) && my_Order.Symbol() == Symbol()) { //Comment(ticket_num); if(my_Order.OrderType()==ORDER_TYPE_BUY_STOP) { Comment("Найден отложенный ордер на покупку...\nticket = "+IntegerToString(ticket_num)); .... break; } else if(my_Order.OrderType()==ORDER_TYPE_BUY_LIMIT) { Comment("Найден лимитный ордер на покупку...\nticket = "+IntegerToString(ticket_num)); .... break; } else if(my_Order.OrderType()==ORDER_TYPE_SELL_STOP) { Comment("Найден отложенный ордер на продажу...\nticket = "+IntegerToString(ticket_num)); .... break; } else if(my_Order.OrderType()==ORDER_TYPE_SELL_LIMIT) { Comment("Найден лимитный ордер на продажу...\nticket = "+IntegerToString(ticket_num)); .... break; } } } } //--- очистка удалённых вручную и по стопу if(order_exist && !my_Position.Select(Symbol())) clearData(); if(order_exist_stop && !OrderSelect(ticket_num)) clearData();
Сначала появилась функции OnTrade. Потом появилась мощная и намного более информативная OnTradeTransaction. Только OnTradeTransaction позволяет получать обширную и точную информацию.
Вот то, что в отладчиком OnTrade() не дружит, это косяк.
Я делаю так:
Можно и так. Можно вообще проверять изменение количества ордеров или позиций, но как-бы это костыль. Проще пользоваться слушателями. Хотя, нормальных слушателей в мкл нет, тем не менее, есть некоторое подобие. Поэтому, проверю я всё-таки как с отладчиком другит OnTradeTransaction(). Если не будет работать напишу в саппорт.
Вот то, что в отладчиком OnTrade() не дружит, это косяк.
Можно и так. Можно вообще проверять изменение количества ордеров или позиций, но как-бы это костыль. Проще пользоваться слушателями. Хотя, нормальных слушателей в мкл нет, тем не менее, есть некоторое подобие. Поэтому, проверю я всё-таки как с отладчиком другит OnTradeTransaction(). Если не будет работать напишу в саппорт.
Какой суппорт? Если сами не научитесь думать -никто не научит :) .
Пример, как ловить появление позиции - ловим транзакцию TRADE_TRANSACTION_DEAL_ADD (Добавление сделки в историю. Осуществляется в результате исполнения ордера или проведения операций с балансом счета), далее ловим сделку с типом DEAL_ENTRY_IN (Вход в рынок), страхуемся - это должна быть именно сделка DEAL_TYPE_BUY (Покупка) или DEAL_TYPE_SELL (Продажа)
//--- get transaction type as enumeration value ENUM_TRADE_TRANSACTION_TYPE type=trans.type; //--- if transaction is result of addition of the transaction in history if(type==TRADE_TRANSACTION_DEAL_ADD) { long deal_type=-1; long deal_entry =-1; long deal_magic =0; string deal_symbol =""; if(HistoryDealSelect(trans.deal)) { deal_type =HistoryDealGetInteger(trans.deal,DEAL_TYPE); deal_entry =HistoryDealGetInteger(trans.deal,DEAL_ENTRY); deal_magic =HistoryDealGetInteger(trans.deal,DEAL_MAGIC); deal_symbol =HistoryDealGetString(trans.deal,DEAL_SYMBOL); } else return; if(deal_symbol==m_symbol.Name() && deal_magic==m_magic) if(deal_entry==DEAL_ENTRY_IN) if(deal_type==DEAL_TYPE_BUY || deal_type==DEAL_TYPE_SELL) { DeleteAllPendingOrders(); //--- if((ENUM_DEAL_TYPE)deal_type==DEAL_TYPE_BUY) ClosePositions(POSITION_TYPE_SELL); if((ENUM_DEAL_TYPE)deal_type==DEAL_TYPE_SELL) ClosePositions(POSITION_TYPE_BUY); } }
Всё, мы словили момент, когда гарантированно появилась позиция. И никаких ордеров! Только сделки!

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Появилась необходимость мониторить момент, когда отработает ордер т.е. когда он станет рыночным. Соответственно, если он станет рыночных, нужно будет дальнейшие действия производить. Как это промониторить лучше?
Я так понимаю для подобных операций и нужно функция OnTradeTransaction() исходя из логики. Попробую щяс реализовать..