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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Anatolii Zainchkovskii
1759
Anatolii Zainchkovskii  

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

      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, хоть с профитом закрылась хоть с лосем. подскажите что не так?

Alexey Viktorov
25773
Alexey Viktorov  
Anatolii Zainchkovskii:

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

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

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

Anatolii Zainchkovskii
1759
Anatolii Zainchkovskii  
Alexey Viktorov:

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

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

Alexey Viktorov
25773
Alexey Viktorov  
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() ?

Anatolii Zainchkovskii
1759
Anatolii Zainchkovskii  
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;
  }
//+------------------------------------------------------------------+

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

Alexey Viktorov
25773
Alexey Viktorov  
Anatolii Zainchkovskii:

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

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

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