Ошибки, баги, вопросы - страница 2411

 

Билд 2007

Функция:

bool GetDialLastProfit (string symbol, datetime startDate, datetime endDate, long magic, double &profit, double &lot)
{
  HistorySelect (startDate, endDate);
  int deals = HistoryDealsTotal ();
  ulong ticket;

  for (int i = deals - 1; i >= 0; i--)
  //for (int i = 0; i < deals; i++)
  {
    ticket = HistoryDealGetTicket (i);
    if (ticket != 0)
    {
      if (HistoryDealGetInteger(ticket, DEAL_MAGIC) == magic)
      {
        profit = HistoryDealGetDouble (ticket, DEAL_PROFIT);
        
        //if (!HistoryDealGetDouble(ticket, DEAL_PROFIT, profit))
        //  return false;
        
        lot    = HistoryDealGetDouble (ticket, DEAL_VOLUME);
        
        return (true);
      }
    }
  }

  return (false);
}

в переменную profit должна по идее выдавать финансовый результат сделки, но получается всегда 0.0, причем в переменной lot всегда корректное значение.

Ошибка? - или я делаю что то не так

 
Andrey Dik:

Билд 2007

Функция:

в переменную profit должна по идее выдавать финансовый результат сделки, но получается всегда 0.0, причем в переменной lot всегда корректное значение.

Ошибка? - или я делаю что то не так

DEAL_ENTRY_OUT или INOUT надо смотреть. У сделок _IN профит 0

 
Andrey Barinov:

DEAL_ENTRY_OUT или INOUT надо смотреть. У сделок _IN профит 0

ну так берётся же первая с конца списка, должна быть OUT

 
Andrey Dik:

ну так берётся же первая с конца списка, должна быть OUT

Если в endDate передаете TimeCurrent(), то замените на TimeCurrent()+60 или как-то так. Должно помочь.

 
Andrey Barinov:

Если в endDate передаете TimeCurrent(), то замените на TimeCurrent()+60 или как-то так. Должно помочь.

нет, так же 0.0

 
Andrey Dik:

нет, так же 0.0

Тогда дебажте. Печатайте тикеты сделок и смотрите в тестере что там выбирается на самом деле. Фильтр по типу сделки все-таки добавьте.

 
Andrey Barinov:

Тогда дебажте. Печатайте тикеты сделок и смотрите в тестере что там выбирается на самом деле. Фильтр по типу сделки все-таки добавьте.

лот выдаёт корректно, соответсвенно тикет выбран верно.

 
Andrey Dik:

лот выдаёт корректно, соответсвенно тикет выбран верно.

Нет. У обеих сделок, In и Out лот одинаковый. А профит нет.

Вот мой код. Работает.

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
ulong LastOutDealTicket(const string symbol,const uint magic)
  {
//===============
   long lasttime=0;
//===============

//===============
   ulong ticket=0;
//===============

//===============
#ifdef __MQL5__
//===============
   ::HistorySelect(0,TimeCurrent()+60);
//===============
   const int deals=::HistoryDealsTotal();
//===============
   for(int i=deals-1;i>=0;i--)
     {
      //===============
      const ulong tempticket=::HistoryDealGetTicket(i);
      //===============

      //===============
      if(::HistoryDealGetInteger(tempticket,DEAL_ENTRY)!=DEAL_ENTRY_OUT || ::HistoryDealGetString(tempticket,DEAL_SYMBOL)!=symbol ||
         ::HistoryDealGetInteger(tempticket,DEAL_MAGIC)!=magic)continue;
      //===============

      //===============
      if(::MQLInfoInteger(MQL_TESTER))return(tempticket);
      //===============

      //===============
      if(::HistoryDealGetInteger(tempticket,DEAL_TIME)<=lasttime)continue;
      //===============

      //===============
      ticket=tempticket;
      lasttime=::HistoryDealGetInteger(tempticket,DEAL_TIME);
      //===============
     }
//===============
#endif 
//===============

//===============
#ifdef __MQL4__
//===============
   const int ordershistory=OrdersHistoryTotal();
//===============
   for(int i=ordershistory-1;i>=0;i--)
     {
      //===============
      if(!::OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) || ::OrderSymbol()!=symbol || ::OrderMagicNumber()!=magic || 
         (::OrderType()!=OP_SELL && ::OrderType()!=OP_BUY))continue;
      //===============

      //===============
      if(::MQLInfoInteger(MQL_TESTER))return(::OrderTicket());
      //===============

      //===============
      if(::OrderCloseTime()<=lasttime)continue;
      //===============

      //===============
      ticket=::OrderTicket();
      lasttime=::OrderCloseTime();
      //===============
     }
//===============
#endif 
//===============

//===============
   return(ticket);
//===============
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double LastClosedProfit(const string symbol,const uint magic)
  {
//===============
   const ulong lastoutticket=::LastOutDealTicket(symbol,magic);
//===============

//===============
   if(lastoutticket<=0)return(0);
//===============

//===============
   double result=0;
//===============

//===============
#ifdef __MQL5__
//===============
   result=::HistoryDealGetDouble(lastoutticket,DEAL_PROFIT);
//===============
#endif 
//===============

//===============
#ifdef __MQL4__
//===============
   if(::OrderSelect((int)lastoutticket,SELECT_BY_TICKET,MODE_HISTORY))result=::OrderProfit();
//===============
#endif 
//===============

//===============
   return(result);
//===============
  }
 
Andrey Barinov:

Нет. У обеих сделок, In и Out лот одинаковый. А профит нет.

Вот мой код. Работает.

попробовал, Ваш код тоже 0.0 выдаёт)))

счет хедженговый, если что.
 
Andrey Dik:

попробовал, Ваш код тоже 0.0 выдаёт)))

счет хедженговый, если что.

Только что проверил все на 2009 билде. Мой код выдает то, что и должен выдавать. Если выдает 0, значит у Вас там 0 и есть.