Узнать тип ордера

 
Всем привет !

как узнать что открылась позиция от лимитного ордера ,а не по рынку ?



void OnTradeTransaction(const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result)
  {
   Print("Запуск OnTradeTransaction type = ", TradeTransactionTypeToString(trans.type),
         " trans.order_type = ", (int)trans.order_type, " ", trans.type == TRADE_TRANSACTION_ORDER_ADD);

   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
   ENUM_ORDER_TYPE orderType = trans.order_type;


   if(type == TRADE_TRANSACTION_DEAL_ADD)
     {
      if(PositionSelect(trans.symbol))
        {
         // Получаем magic номер позиции
         int position_magic = (int)PositionGetInteger(POSITION_MAGIC);

         // Проверяем, совпадает ли magic номер
         if(position_magic == MagicNumber)
           {
            
            Print("тип ордера ",orderType );
            // Обработка открытия позиции
            if(orderType == ORDER_TYPE_BUY)
              {
               Print("Пользователь открыл новый ордер на покупку. Цена: ", trans.price, " TP: ", trans.price_tp);
               UpdateTakeProfitForPositions(trans.price_tp);
               return;
              }
           }
        }
      else
        {
         Print("Не удалось выбрать позицию по символу: ", trans.symbol);
        }
     }
  }
 
И еще - как отловить когда ордер закрылся по ТП или СЛ ?
 
Yerkin Sagandykov #:
И еще - как отловить когда ордер закрылся по ТП или СЛ ?
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;
    }
}
А разве дальше этой строки код будет когда ни будь выполняться?
 
Yerkin Sagandykov:

Внимательно посмотрите состав структуры 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;      // Тикет встречной позиции
  };

В вашем случае не надо выбирать позицию. Тикет позиции есть в структуре… И работать в этом случае надо не с ордером, а со сделкой.

Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торговой транзакции
Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торговой транзакции
  • www.mql5.com
В результате выполнения определенных действий с торговым счетом, его состояние изменяется. К таким действиям относятся: Отсылка торгового запроса...
 
Alexey Viktorov #:
А разве дальше этой строки код будет когда ни будь выполняться?

Не будет в том случае если направление сделки не на выход из рынка.
Т.е. автор анализирует только закрытие позиции.

В 4-ке приходилось сравнивать цену закрытия позиции с ценой СЛ/ТП.
 
Grigori.S.B #:

Не будет в том случае если направление сделки не на выход из рынка.
Т.е. автор анализирует только закрытие позиции.

В 4-ке приходилось сравнивать цену закрытия позиции с ценой СЛ/ТП.

Даже нет желания продолжать обсуждение такого бреда.

 
На всякий случай, не забываем, что DEAL_ENTRY актуально для хеджинга, а при неттинге для работы на символе только одного робота и отсутствии ручной торговли.
 
JRandomTrader #:
На всякий случай, не забываем, что DEAL_ENTRY актуально для хеджинга, а при неттинге для работы на символе только одного робота и отсутствии ручной торговли.

Ну почему только для хеджинга актуально?

Свойства сделок

Сделки различаются не только по типу, задаваемого в перечислении ENUM_DEAL_TYPE, но и по способу изменения позиции. Это может быть простое открытие позиции или наращивание объема ранее открытой позицииход в рынок), закрытие позиции сделкой противоположного направления соответствующим объемом (выход их рынка) или переворот позиции в том случае, когда объем сделки в противоположном направлении перекрывает объем ранее открытой позиции.

А вот переворот позиции,  для хеджинга быть не может…

 
Alexey Viktorov #:
Ну почему только для хеджинга актуально?

Потому, что для неттинга это изменение совокупной позиции, и, например, то, что для конкрентого робота - закрытие, для совокупной позиции может оказаться наращиванием.

Роботы, работающие на символе, могут иметь разные стратегии, кто-то - по тренду, кто-то - против, позиции каких-то роботов могут оказаться противонаправленными.

 
JRandomTrader #:

Потому, что для неттинга это изменение совокупной позиции, и, например, то, что для конкрентого робота - закрытие, для совокупной позиции может оказаться наращиванием.

Роботы, работающие на символе, могут иметь разные стратегии, кто-то - по тренду, кто-то - против, позиции каких-то роботов могут оказаться противонаправленными.

На мой взгляд работа разных роботов на одном инструменте, на счёте netting, вообще за пределами разумного.