OrderProfit() предпоследнего ордера - страница 3

 
Vladimir Deryagin:

В таком случае предпоследний по времени не 1

____________________________________________________________________

2016.08.16 15:30:30   -------------->"0"

2016.08.16 15:30:31  -------------->"1"

2016.08.16 15:30:38  -------------->"2"

2016.08.16 15:34:38  -------------->"3"  предпоследний

2016.08.16 15:39:38  -------------->"4"

и т д

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

Vladimir Deryagin, 2016.08.15 23:38

Как можно получить 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;
  }

у вас где последний?
 
pako:

у вас где последний?
По крайней мере
t=OrderOpenTime();

Равно времени последнему открытому ордеру

__________________________________________

2016.08.16 15:30:30   -------------->"0"

2016.08.16 15:30:31  -------------->"1"

2016.08.16 15:30:38  -------------->"2"

2016.08.16 15:34:38  -------------->"3"  предпоследний

2016.08.16 15:39:38  -------------->"4" t

Vladimir Deryagin:
По крайней мере Равно времени последниму открытому ордеру
 
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]=OrderTicket();
  }}}}
// если есть позиции
  if(c>0) {
   ArraySort(p, WHOLE_ARRAY, 0, MODE_DESCEND);
   pr=c>=index?index:c;
   if(OrderSelect((int)p[pr], SELECT_BY_TICKET)) {
    return((OrderProfit()+OrderSwap()+OrderCommission()));
   }
  }
  return(0);
 }
 
Vladimir Deryagin:
По крайней мере Равно времени последниму открытому ордеру
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))
     {
       Alert("индекс позиции   ", IntegerToString(j,0,' '));//
      if(OrderSymbol()==Symbol())
        {
         if(OrderType()==OP_SELL || OrderType()==OP_BUY)
           {
            if(OrderProfit())
              {
               prof=OrderProfit();
              }
           }
        }
     }
   return;
  }
посмотрите , что покажет алерт?
 
Vitaly Muzichenko:

Можете эту реализацию взять, так-же сортирует по тикетам

Конечно возьмём Спасибо! Но как я уже сказал первый код меня устраивает ваш код использую так, Сейчас всего открыто ордеров шт 12, проверял через Print

POP_2 возвращает время последнего открытого соответственно его профит

double POP_2(int index=0)
  {
   double p[];
   int c=-1,pr=0;
   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()==Symbol())
              {
               c++;
               ArrayResize(p,c+1);
               p[c]=OrderProfit()+OrderSwap();
               pr=c>=index?index:c; // если открытых меньше, чем указано в выборе по индексу, то выведет профит самой первой открытой
              }
           }
        }
     }
   return(c==-1?0:p[pr]);
  }

POP_1 предпоследний по времени возвращает соответственно его профит

double POP_1(int index=1)
  {
   double p[];
   int c=-1,pr=0;
   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()==Symbol())
              {
               c++;
               ArrayResize(p,c+1);
               p[c]=OrderProfit()+OrderSwap();
               pr=c>=index?index:c; // если открытых меньше, чем указано в выборе по индексу, то выведет профит самой первой открытой
              }
           }
        }
     }
   return(c==-1?0:p[pr]);
  }
 
Vladimir Deryagin:

Конечно возьмём Спасибо! Но как я уже сказал первый код меня устраивает ваш код использую так

Я Вам показываю несколько реализаций, а Вы для себя возьмите на вооружение работу с массивами, в предыдущей был двухмерный массив.

Если заменить:

// тут идёт сортировка к последним
ArraySort(p, WHOLE_ARRAY, 0, MODE_DESCEND); // сортируем по убыванию
// а вот тут от более старых к новым
ArraySort(p, WHOLE_ARRAY, 0, MODE_ASCEND); // сортируем по возрастанию
 
pako:
посмотрите , что покажет алерт?
Я спорить с вами не буду если бы этот код работал как надо, я не обратился к тем кто в этом разбирается. )))
 
Vitaly Muzichenko:

Я Вам показываю несколько реализаций, а Вы для себя возьмите на вооружение работу с массивами, в предыдущей был двухмерный массив.

Если заменить:

Последняя конечно более надёжней будет с сортировкой списка её сейчас и приматаю.
 
Vitaly Muzichenko:

Я Вам показываю несколько реализаций, а Вы для себя возьмите на вооружение работу с массивами, в предыдущей был двухмерный массив.

Если заменить:

// тут идёт сортировка к последним
ArraySort(p, WHOLE_ARRAY, 0, MODE_DESCEND); // сортируем по убыванию
// а вот тут от более старых к новым
ArraySort(p, WHOLE_ARRAY, 0, MODE_ASCEND); // сортируем по возрастанию

 

ArraySort

Сортирует многомерный числовой массив по возрастанию значений в первом измерении.

bool  ArraySort( 
   void&  array[]      // массив для сортировки 
   );

Параметры

array[]

[in][out]  Числовой массив для сортировки.

Возвращаемое значение

Возвращает true в случае успеха, иначе false.

Примечание

Массив всегда сортируется по возрастанию, независимо от значения флага AS_SERIES.

Функции ArraySort и ArrayBSearch принимают в качестве параметра массив любой размерности, при этом сортировка и поиск происходят только по первому (нулевому) измерению.

 
Vladimir Deryagin:
Я спорить с вами не буду если бы этот код работал как надо, я не обратился к тем кто в этом разбирается. )))
успехов
Причина обращения: