Не могу получить Профит и объем последнего лота

 

Делаю выборку по истории, так как это советовали на форуме.
Однако профит и лотность показывает 0

Делала 2 варианта,что не так не понимаю

for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_TICKET,MODE_HISTORY))
        {
         if((OrderMagicNumber()==Magic) && (OrderSymbol()==sy))
           {
            t = OrderCloseTime();
            if(t>lasttime)
              {
               lasttime= t;
               ticket = OrderTicket();
               Lots = OrderLots();
               Profit = OrderProfit();
              }
           }
        }
     }

Второй вариант

 for(int i = OrdersHistoryTotal() - 1; i >= 0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == Magic && OrderSymbol() == _Symbol)
        {
         ticket = OrderTicket();
         Lots = OrderLots();
         Profit = OrderProfit();
        }
        }

Далее у меня исходя из суммы лота и профита делается расчет.
Т.е. мне важно просто понять профит плюс или минус.
Привожу код что делается вообще в данном месте.


int Shag()
  {
 /*  for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_TICKET,MODE_HISTORY))
        {
         if((OrderMagicNumber()==Magic) && (OrderSymbol()==sy))
           {
            t = OrderCloseTime();
            if(t>lasttime)
              {
               lasttime= t;
               ticket = OrderTicket();
               Lots = OrderLots();
               Profit = OrderProfit();
              }
           }
        }
     }
*/

   for(int i = OrdersHistoryTotal() - 1; i >= 0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == Magic && OrderSymbol() == _Symbol)
        {
         ticket = OrderTicket();
         Lots = OrderLots();
         Profit = OrderProfit();
        }
        }

      if(OldTicket != ticket)
        {
         OldTicket = ticket;

         KOL++;
         Print(" Profit " + DoubleToStr(Profit,1)  + " ticket " + IntegerToString(ticket,0) + " Lots " + DoubleToStr(Lots,0));

         if(Profit > 0)
           {
            Plus = Plus + (Lots * kef);
           }

         if(Profit < 0)
           {
            Minus = Minus + Lots;
           }

         Balance = Plus - Minus;


         if(Profit > 0)
           {
            Shag++;
           }

         if(Profit < 0)
           {
            Shag=0;
           }


        }
      return Shag;
     }

Советник для бинарных опционов поэтому такие функции.
Может быть это потому-что в истории счета отображается вот так:


 

Получается, что при таком подходе к начислению нужен чуть более сложный алгоритм:

  1. Найти последний закрытый ордер с типом OP_BUY или OP_SELL. Все также, как Вы и делаете, но с добавлением проверки типа ордера, чтобы не посчитать балансовую операцию или отложенный ордер.
  2. Найти в истории счета запись с типом балансовой операции, у которой тикет больше, чем тикет найденного последнего ордера, и в комментарии (OrderComment()) есть подстрока с тикетом последнего ордера. У балансовых операций OrderType() должен быть равен 6, но возможны варианты. Для проверки выберите запись с тикетом 148446952 и посмотрите, какой у нее OrderType().

Так найдем тикет последнего ордера:

int GetTicketOfLastOrder()
{
   int nTicket = -1;
   datetime dtCloseTime = 0;
   for (int i = OrdersHistoryTotal() - 1; i >= 0; --i)
   {
      if (!OrderSelect(i, SELECT_BY_TICKET, MODE_HISTORY))
         continue;

      if (OrderType() != OP_BUY && OrderType() != OP_SELL)      // Некоторым нравится поставить здесь OrderType() < 2
         continue;

      if (OrderMagicNumber() != Magic || OrderSymbol() == sy)
         continue;

      if (OrderCloseTime() > dtCloseTime)
      {
         dtCloseTime = OrderCloseTime();
         nTicket = OrderTicket();
      }
   }

   return nTicket;
}

Затем найдем прибыль балансовой операции, ссылающейся на нужный тикет:

double GetProfitOfBalanceOPerationByTicket(const int nTicket)
{
   string sStr = IntegerToString(nTicket);
   for (int i = OrdersHistoryTotal() - 1; i >= 0; --i)
   {
      if (!OrderSelect(i, SELECT_BY_TICKET, MODE_HISTORY))
         continue;

      if (OrderType() != 6)                                     // Вместо 6, возможно, потребуется другой код
         continue;

      if (OrderTicket() > nTicket && StringFind(OrderComment(), sStr) >= 0)
         return OrderProfit();
   }

   return 0.0;
}

Все это используется таким образом:

int nTicket = GetTicketOfLastOrder();
if (nTicket > 0)
   Alert("Last order profit: ", DoubleToString(GetProfitOfBalanceOPerationByTicket(nTicket), 2));
P. S. Писал сразу на форум, не используя ME. Возможны опечатки.
 
Ihor Herasko #:

Получается, что при таком подходе к начислению нужен чуть более сложный алгоритм:

  1. Найти последний закрытый ордер с типом OP_BUY или OP_SELL. Все также, как Вы и делаете, но с добавлением проверки типа ордера, чтобы не посчитать балансовую операцию или отложенный ордер.
  2. Найти в истории счета запись с типом балансовой операции, у которой тикет больше, чем тикет найденного последнего ордера, и в комментарии (OrderComment()) есть подстрока с тикетом последнего ордера. У балансовых операций OrderType() должен быть равен 6, но возможны варианты. Для проверки выберите запись с тикетом 148446952 и посмотрите, какой у нее OrderType().

Так найдем тикет последнего ордера:

Затем найдем прибыль балансовой операции, ссылающейся на нужный тикет:

Все это используется таким образом:

P. S. Писал сразу на форум, не используя ME. Возможны опечатки.
Большое Вам спасибо, за столь подробный ответ.
Сейчас буду пробовать, заодно и границы знаний своих расширять.
Спасибо.
Причина обращения: