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

 
Vladimir Deryagin:

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

Можно так доработать, небольшие изменения:

void prof2()
  {

   datetime tm1=0;
   datetime tm2=0;
   int tk1=0;
   int tk2=0;
     
   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(OrderOpenTime()>tm1){
                     tm2=tm1;
                     tk2=tk1;
                     tm1=OrderOpenTime();
                     tk1=OrderTicket();
                  }
                  else if(OrderOpenTime()>tm2){
                     tm2=OrderOpenTime();
                     tk1=OrderTicket();   
                  } 


              }
           }
        }
     }
   
   if(tk2!=0){  
      if(OrderSelect(tk2,SELECT_BY_TICKET))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_SELL || OrderType()==OP_BUY)
              {
               if(OrderProfit())
                 {
                  double prof=OrderProfit();
                 }
              }
           }
        }
   }
   return;
  }
 
Vladimir Zubov:
Согласен с вами, тикет уменьшиться неможет и хаотично присвоиться номер, ни в тестере ни на демо, не на реале, номер только в сторону увеличения.

Вам хочется верить, что я типа гоню? Вам никто этого не запрещаете, верьте во что хотите, и никто не запрещает кодить как хотите.

Мой пост был адресован тем, у кого есть разум. 

 

Ладно, тогда сделаем по времени, но как-то ни разу за столько лет не сталкивался с таким, чтоб тикет был меньше, чем у ранее открытой:

 Comment( GetProfitOpenPosCurrIndex( 1 /*Индекс*/, OP_BUY /*OP_BUY\\OP_SELL\\-1=все*/, 0 /*Magic: -1=все*/ ) );
 Comment( GetProfitOpenPosCurrIndex( 1 /*Индекс*/) ); // остальное по-умолчанию
//===============================================================================================
//------------- Возвращает суммарный профит открытых позиций в валюте депозита -----------------+
//===============================================================================================
double GetProfitOpenPosCurrIndex(int index=0, int type=-1, int mg=-1) {
 int p[][2], 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())&&(type<0||OrderType()==type)&&(mg<0||OrderMagicNumber()==mg)) {
      c++;
      ArrayResize(p, c+1);
      p[c][0]=OrderOpenTime();
      p[c][1]=OrderTicket();
  }}}}
// если есть позиции
  if(c>0) {
   ArraySort(p, WHOLE_ARRAY, 0, MODE_DESCEND);
   pr=c>=index?index:c;
   if(OrderSelect(p[pr][1], SELECT_BY_TICKET)) {
    return((OrderProfit()+OrderSwap()+OrderCommission()));
   }}
  return(0);
 }
Маленький и культурный универсальный код функции, а не портянка на пол-страницы.