Удаление открытой позиции пользователем

 

Всем привет !

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

 
Yerkin Sagandykov:

Всем привет !

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

OnTraderTransaction даёт такую информацию.
 
Yerkin Sagandykov:

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

У закрывшего позицию ордера посмотреть значение этого свойства.

ENUM_ORDER_REASON

Идентификатор

Описание

ORDER_REASON_CLIENT

Ордер выставлен из десктопного терминала

ORDER_REASON_MOBILE

Ордер выставлен из мобильного приложения

ORDER_REASON_WEB

Ордер выставлен из веб-платформы

ORDER_REASON_EXPERT

Ордер выставлен из MQL5-программы – советником или скриптом

ORDER_REASON_SL

Ордер выставлен в результате срабатывания Stop Loss

ORDER_REASON_TP

Ордер выставлен в результате срабатывания Take Profit

ORDER_REASON_SO

Ордер выставлен в результате наступления события Stop Out

 
if(trans.type == TRADE_TRANSACTION_ORDER_DELETE)        // Проверяем, что транзакция связана с удалением ордера
        {
         // удаление отытой сделки пользвоатлем
         ulong ticket = trans.order; // Тикет удаленного ордера
          CheckOrderReason(ticket);  // Определяем источник ордера
        
         PrintFormat("Удаление с тикетом %d был удален. Причина: %s", ticket, " reason");
         
        }  

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

 
Yerkin Sagandykov #:

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

Потому, что ловить надо не ордер, а сделку.

 
Alexey Viktorov #:

Потому, что ловить надо не ордер, а сделку.

Привет, Алексей! Добавлю. Не просто сделку, а сделку в результате которой был удалён тот самый ордер. А для этого сначала нужно в истории выбрать эту самую сделку, чтобы дальше обращаться к ней через соответствующую функцию.

С уважением, Владимир.

 
MrBrooklin #:

Привет, Алексей! Добавлю. Не просто сделку, а сделку в результате которой был удалён тот самый ордер. А для этого сначала нужно в истории выбрать эту самую сделку, чтобы дальше обращаться к ней через соответствующую функцию.

С уважением, Владимир.

Нет. Тут последовательность не такая. В результате исполнения ордера и переноса его в историю происходит сделка. И в свойствах сделки есть похожие на вышеуказанные…

DEAL_REASON_CLIENT

Сделка проведена в результате срабатывания ордера, выставленного из десктопного терминала

DEAL_REASON_MOBILE

Сделка проведена в результате срабатывания ордера, выставленного из мобильного приложения

DEAL_REASON_WEB

Сделка проведена в результате срабатывания ордера, выставленного из веб-платформы

DEAL_REASON_EXPERT

Сделка проведена в результате срабатывания ордера, выставленного из MQL5-программы – советником или скриптом

DEAL_REASON_SL

Сделка проведена в результате срабатывания ордера Stop Loss

DEAL_REASON_TP

Сделка проведена в результате срабатывания ордера Take Profit

DEAL_REASON_SO

Сделка проведена в результате наступления события Stop Out

DEAL_REASON_ROLLOVER

Сделка проведена по причине переноса позиции

DEAL_REASON_VMARGIN

Сделка проведена по причине начисления/списания вариационной маржи

DEAL_REASON_SPLIT

Сделка проведена по причине сплита (понижения цены) инструмента, по которому имелась позиция на момент проведения сплита

DEAL_REASON_CORPORATE_ACTION

Сделка проведена в результате корпоративного действия: объединения или переименования бумаги, переноса клиента ну другой счет и т.д.


Но, в принципе это на любителя. Можно и ордера ловить, только надо правильно выбрать тип транзакции. Да и как разделить ордер на открытие позиции или на закрытие я не знаю. Есть-ли вообще… А ведь вопрос был о закрытии позиции вручную.

 

Согласен. Не совсем внимательно прочитал заданный вопрос.

С уважением, Владимир.

 
Alexey Viktorov #:

Нет. Тут последовательность не такая. В результате исполнения ордера и переноса его в историю происходит сделка. И в свойствах сделки есть похожие на вышеуказанные…

Но, в принципе это на любителя. Можно и ордера ловить, только надо правильно выбрать тип транзакции. Да и как разделить ордер на открытие позиции или на закрытие я не знаю. Есть-ли вообще… А ведь вопрос был о закрытии позиции вручную.

На всякий случай: ордер может породить более одной сделки.

А при неттинге в случае работы нескольких роботов (или робот+ручная торговля) направление сделки (in-out) и вовсе теряет смысл - что с точки зрения общей позиции (и в свойствах сделки) in, с точки зрения конкретного робота может оказаться out и наоборот..

 
Yerkin Sagandykov:

Всем привет !

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

В большинстве случаев, если свойство  DEAL_REASON сделки закрывшей позицию не равно DEAL_REASON_EXPERT, значит она закрыта вручную.

Если в OnTradeTransaction, то типа так:

//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction & trans,
                        const MqlTradeRequest & request,
                        const MqlTradeResult & result)
  {
   if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
     {
      long     deal_reason       = -1;
      long     deal_entry        = -1;

      if(HistoryDealSelect(trans.deal))
        {
         deal_reason       = HistoryDealGetInteger(trans.deal, DEAL_REASON);
         deal_entry        = HistoryDealGetInteger(trans.deal, DEAL_ENTRY);

         if(deal_entry == DEAL_ENTRY_INOUT || deal_entry == DEAL_ENTRY_OUT || deal_entry == DEAL_ENTRY_OUT_BY)
            if(deal_reason != DEAL_REASON_EXPERT)
               Print("ticket ", trans.deal, "; No Expert");
        }
     }
  }
//+------------------------------------------------------------------+

Если в истории, то так:

//+------------------------------------------------------------------+
void Histori()
  {
   datetime from = 0;
   datetime to = TimeCurrent();
   ulong ticket = 0;

   if(HistorySelect(from, to))
      for(int i =  HistoryDealsTotal() - 1; i >= 0 ; i--)
         if((ticket = HistoryDealGetTicket(i)) > 1)
           {
            long deal_entry = HistoryDealGetInteger(ticket, DEAL_ENTRY);
            long deal_reason = HistoryDealGetInteger(ticket, DEAL_REASON);
            if(deal_entry == DEAL_ENTRY_OUT || deal_entry == DEAL_ENTRY_OUT_BY || deal_entry == DEAL_ENTRY_INOUT)
               if(deal_reason != DEAL_REASON_EXPERT)
                  Print("ticket ", ticket, "; No Expert");
           }
  }
//+------------------------------------------------------------------+
 
JRandomTrader #:

На всякий случай: ордер может породить более одной сделки.

А при неттинге в случае работы нескольких роботов (или робот+ручная торговля) направление сделки (in-out) и вовсе теряет смысл - что с точки зрения общей позиции (и в свойствах сделки) in, с точки зрения конкретного робота может оказаться out и наоборот..

И к чему всё это? Вы хотите мне экзамен устроить, или человека запутать?