OrderProfit() предпоследнего ордера

 

Как можно получить OrderProfit() предпоследнего открытого ордера, пробую как на примере  с низу даёт OrderProfit() только последнего

void prof2()
  {
   datetime t=0;
   int j=-2;
   for(int i=OrdersTotal()-2;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_SELL || OrderType()==OP_BUY)
              {
               if(t<OrderOpenTime())
                 {
                  t=OrderOpenTime();
                  j=i;
                 }
              }
           }
        }
     }
   if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderSymbol()==Symbol())
        {
         if(OrderType()==OP_SELL || OrderType()==OP_BUY)
           {
            if(OrderProfit())
              {
               prof=OrderProfit();
              }
           }
        }
     }
   return;
  }
 
Vladimir Deryagin:

Как можно получить OrderProfit() предпоследнего открытого ордера, пробую как на примере  с низу даёт OrderProfit() только последнего

Время открытия в массив, отсортировать, посмотреть.

Или еще один цикл, время последнего уже известно,

находите минимальное неравное последнему. 

   for(int i=OrdersTotal()-2;i>=0;i--)// неправильно


   for(int i=OrdersTotal()-1;i>=0;i--)// правильно
     
 
Vladimir Deryagin:

Как можно получить OrderProfit() предпоследнего открытого ордера, пробую как на примере  с низу даёт OrderProfit() только последнего

Вот, выбираете номер нужного, не забывайте, первая с индексом "0"

 Comment( GetProfitOpenPosInCurrency(_Symbol, OP_SELL, -1, 1) ); // GetProfitOpenPosInCurrency( symbol, бай или селл(-1 - все), Magic(-1 - любой), индекс позиции (1-предпоследняя, 0-последняя)) 

//===============================================================================================
//------------- Возвращает суммарный профит открытых позиций в валюте депозита -----------------+
//===============================================================================================
double GetProfitOpenPosInCurrency(string symb="0", int type=-1, int mg=-1,int index=0) {
 double p[];
 int c=-1, pr=0;
  if(symb=="0") { symb=Symbol();}
   for (int i=OrdersTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
     if(OrderType()==OP_BUY || OrderType()==OP_SELL) {
      if((OrderSymbol()==symb||symb=="")&&(type<0||OrderType()==type)&&(mg<0||OrderMagicNumber()==mg)) {
       c++;
       ArrayResize(p, c+1);
       p[c]=OrderProfit()+OrderSwap()+OrderCommission();
       pr=c>=index?index:c; // если открытых меньше, чем указано в выборе по индексу, то выведет профит самой первой открытой
 }}}}
  return(p[pr]);
 }
 
Vitaly Muzichenko:

Вот, выбираете номер нужного, не забывайте, первая с индексом "0"

То что нужно, Спасибо!!!
 
Vladimir Deryagin:
То что нужно, Спасибо!!!

Исправил, а то если не было открытых, была ошибка

//+------------------------------------------------------------------+
//===============================================================================================
//------------- Возвращает суммарный профит открытых позиций в валюте депозита -----------------+
//===============================================================================================
double GetProfitOpenPosInCurrency(string symb="0", int type=-1, int mg=-1,int index=0) {
 double p[];
 int c=-1, pr=0;
  if(symb=="0") { symb=Symbol();}
   for (int i=OrdersTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
     if(OrderType()==OP_BUY || OrderType()==OP_SELL) {
      if((OrderSymbol()==symb||symb=="")&&(type<0||OrderType()==type)&&(mg<0||OrderMagicNumber()==mg)) {
       c++;
       ArrayResize(p, c+1);
       p[c]=OrderProfit()+OrderSwap()+OrderCommission();
       pr=c>=index?index:c;
       
 }}}}
  return(c==-1?0:p[pr]);
 }
 
Vitaly Muzichenko:

Исправил, а то если не было открытых, была ошибка

Ну да начало выдавать ошибку массива, сейчас всё супер!
 

Зачем так усложнять?

Вопрос стоит четко "Как получить профит предпоследнего ордера?".


if(OrdersTotal()>=2)

{

   if(OrderSelekt(OrdersTotal()-2, SELEKT_BY_POS)

   {

      profit=OrderProfit();

   }

}

 
Andrey Maslov:

Зачем так усложнять?

Вопрос стоит четко "Как получить профит предпоследнего ордера?".


if(OrdersTotal()>=2)

{

   if(OrderSelekt(OrdersTotal()-2, SELEKT_BY_POS)

   {

      profit=OrderProfit();

   }

}

Потому, что может быть открыто десяток позиций по разным инструментам, и ваши -2 попадут на второстепенный символ от того, который нужен в расчёте.

 
Vitaly Muzichenko:

Вот, выбираете номер нужного, не забывайте, первая с индексом "0"

Ненадежный способ. Как ордера сортируются после перезапуска терминала никто не знает, по времени ли, по тикету ли. 

Поэтому надо надеться только на себя - сортировать по времени.  

 
Vladimir Deryagin:

Как можно получить OrderProfit() предпоследнего открытого ордера, пробую как на примере  с низу даёт OrderProfit() только последнего

Можно первый раз найти последний, потом второй раз такой же поиск, но найденный ранее игнорировать и будет предпоследний.
 
Dmitry Fedoseev:
Можно первый раз найти последний, потом второй раз такой же поиск, но найденный ранее игнорировать и будет предпоследний.
Хорошо возьму на вооружение (до первого сбоя), но то что дал Vitaly Muzichenko пока работает как часики. Да, я и не знаю как последний полученный ордер можно проигнорировать при повторном цикле.
Причина обращения: