И еще - как отловить когда ордер закрылся по ТП или СЛ ?
void OnTradeTransaction(const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result) { if (trans.type == TRADE_TRANSACTION_DEAL_ADD && trans.order_state == ORDER_STATE_STARTED) { ENUM_DEAL_ENTRY entry = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(trans.deal, DEAL_ENTRY); if (entry != DEAL_ENTRY_OUT) return; ENUM_DEAL_REASON reason = (ENUM_DEAL_REASON)HistoryDealGetInteger(trans.deal, DEAL_REASON); if (reason != DEAL_REASON_SL && reason != DEAL_REASON_TP) return; // Сюда попадают закрытия по SL и TP. return; } }
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Edgar Akhmadeev, 2024.10.27 02:04
void OnTradeTransaction(const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result) { if (trans.type == TRADE_TRANSACTION_DEAL_ADD && trans.order_state == ORDER_STATE_STARTED) { ENUM_DEAL_ENTRY entry = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(trans.deal, DEAL_ENTRY); if (entry != DEAL_ENTRY_OUT) return; ENUM_DEAL_REASON reason = (ENUM_DEAL_REASON)HistoryDealGetInteger(trans.deal, DEAL_REASON); if (reason != DEAL_REASON_SL && reason != DEAL_REASON_TP) return; // Сюда попадают закрытия по SL и TP. return; } }
Внимательно посмотрите состав структуры MqlTradeTransaction
struct MqlTradeTransaction { ulong deal; // Тикет сделки ulong order; // Тикет ордера string symbol; // Имя торгового инструмента ENUM_TRADE_TRANSACTION_TYPE type; // Тип торговой транзакции ENUM_ORDER_TYPE order_type; // Тип ордера ENUM_ORDER_STATE order_state; // Состояние ордера ENUM_DEAL_TYPE deal_type; // Тип сделки ENUM_ORDER_TYPE_TIME time_type; // Тип ордера по времени действия datetime time_expiration; // Срок истечения ордера double price; // Цена double price_trigger; // Цена срабатывания стоп-лимитного ордера double price_sl; // Уровень Stop Loss double price_tp; // Уровень Take Profit double volume; // Объем в лотах ulong position; // Тикет позиции ulong position_by; // Тикет встречной позиции };
В вашем случае не надо выбирать позицию. Тикет позиции есть в структуре… И работать в этом случае надо не с ордером, а со сделкой.
- www.mql5.com
На всякий случай, не забываем, что DEAL_ENTRY актуально для хеджинга, а при неттинге для работы на символе только одного робота и отсутствии ручной торговли.
Ну почему только для хеджинга актуально?
Свойства сделокСделки различаются не только по типу, задаваемого в перечислении ENUM_DEAL_TYPE, но и по способу изменения позиции. Это может быть простое открытие позиции или наращивание объема ранее открытой позиции (вход в рынок), закрытие позиции сделкой противоположного направления соответствующим объемом (выход их рынка) или переворот позиции в том случае, когда объем сделки в противоположном направлении перекрывает объем ранее открытой позиции.
А вот переворот позиции, для хеджинга быть не может…
Ну почему только для хеджинга актуально?
Потому, что для неттинга это изменение совокупной позиции, и, например, то, что для конкрентого робота - закрытие, для совокупной позиции может оказаться наращиванием.
Роботы, работающие на символе, могут иметь разные стратегии, кто-то - по тренду, кто-то - против, позиции каких-то роботов могут оказаться противонаправленными.
Потому, что для неттинга это изменение совокупной позиции, и, например, то, что для конкрентого робота - закрытие, для совокупной позиции может оказаться наращиванием.
Роботы, работающие на символе, могут иметь разные стратегии, кто-то - по тренду, кто-то - против, позиции каких-то роботов могут оказаться противонаправленными.
На мой взгляд работа разных роботов на одном инструменте, на счёте netting, вообще за пределами разумного.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования