Причина закрытия сделки

 

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

      ulong last_deal=GetLastDealTicket();
      if(HistoryDealSelect(last_deal))
        {
         Print("DEAL_REASON === "+(ENUM_DEAL_REASON)HistoryDealGetInteger(last_deal,DEAL_REASON));
         if((ENUM_DEAL_REASON)HistoryDealGetInteger(last_deal,DEAL_REASON) == DEAL_REASON_TP)
           {
            A=0;
            Print("ПОСЛЕДНЯЯ СДЕЛКА С ПРОФИТОМ");
           }
        }

так вот принт выводит каждый раз цифру 3, хоть с профитом закрылась хоть с лосем. подскажите что не так?

 
Anatolii Zainchkovskii:

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

так вот принт выводит каждый раз цифру 3, хоть с профитом закрылась хоть с лосем. подскажите что не так?

Сначала надо найти сделку DEAL_ENTRY_OUT и только потом определять DEAL_REASON_TP

 
Alexey Viktorov:

Сначала надо найти сделку DEAL_ENTRY_OUT и только потом определять DEAL_REASON_TP

а разве последняя по умолчанию не будет являться DEAL_ENTRY_OUT? для тестера хотябы. так то да, нужно будет и эту проверку сделать.

 
Anatolii Zainchkovskii:

а разве последняя по умолчанию не будет являться DEAL_ENTRY_OUT? для тестера хотябы. так то да, нужно будет и эту проверку сделать.

Даже если это проверяется в OnTradeTransaction и то надо проверять входящая или исходящая сделка. Вот пример определения

/*********************TradeTransaction function**********************/
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
{
//---
 if(trans.type == TRADE_TRANSACTION_DEAL_ADD && trans.symbol == _Symbol)
  {
    /******************** Если открылась позиция********************/
   if(PositionSelectByTicket(trans.position) && PositionGetInteger(POSITION_MAGIC) == mag)
    {
     // 
    }
//---
    /******************** Если закрылась позиция********************/
   if(!PositionSelectByTicket(trans.position))
    {
     // Тут для убедительности проверить и принять решение.
    }
   }
}/*******************************************************************/

Но это вариант для полного закрытия позиции.

А откуда такая функция GetLastDealTicket() ?

 
Alexey Viktorov:

Даже если это проверяется в OnTradeTransaction и то надо проверять входящая или исходящая сделка. Вот пример определения

Но это вариант для полного закрытия позиции.

А откуда такая функция GetLastDealTicket() ?

из примера из справки по мт5 

//+------------------------------------------------------------------+ 
//| Возвращает тикет последней сделки в истории или -1               | 
//+------------------------------------------------------------------+ 
ulong GetLastDealTicket()
  {
//--- запросим историю за последние 7 дней 
   if(!GetTradeHistory(7))
     {
      //--- сообщим о неудачном вызове и вернем -1 
      Print(__FUNCTION__," HistorySelect() вернул false");
      return -1;
     }
//---  
   ulong first_deal,last_deal,deals=HistoryOrdersTotal();
//--- если ордера есть, начинаем работать с ними 
   if(deals>0)
     {
      Print("Deals = ",deals);
      first_deal=HistoryDealGetTicket(0);
      PrintFormat("first_deal = %d",first_deal);
      if(deals>1)
        {
         last_deal=HistoryDealGetTicket((int)deals-1);
         PrintFormat("last_deal = %d",last_deal);
         return last_deal;
        }
      return first_deal;
     }
//--- не нашли ни одной сделки, вернем -1 
   return -1;
  }
//+------------------------------------------------------------------+ 
//| Запрашивает историю за последние дни и вернет false при неудаче  | 
//+------------------------------------------------------------------+ 
bool GetTradeHistory(int days)
  {
//--- зададим недельный период времени для запроса торговой истории 
   datetime to=TimeCurrent();
   datetime from=to-days*PeriodSeconds(PERIOD_D1);
   ResetLastError();
//--- сделаем запрос и проверим результат 
   if(!HistorySelect(from,to))
     {
      Print(__FUNCTION__," HistorySelect=false. Error code=",GetLastError());
      return false;
     }
//--- история получена успешно 
   return true;
  }
//+------------------------------------------------------------------+

вот она, как есть.

 
Anatolii Zainchkovskii:

из примера из справки по мт5 

вот она, как есть.

Ааа, я даже не смотрю на функции из примеров документации. Потому и не знаю.
 
Как и писал Алексей Викторов,  проблема оказалась в функции определения последней закрытой сделки. А проблема собственно в том что после перехода через сутки происходит начисление свопа,  и это действие тоже определяется как сделка. Так что  да,  я добавил дополнительную проверку на то что  сделка именно типа Аут. И всё заработало. 
Причина обращения: