Пожалуйста помогите, как найти, не пойму где ошибка.

 

Задача состоит в поиске предыдущего МАКС значения цены открытия ордера.  То же самое для Минимальной цены открытия ордера.


Необходимо узнать  по отдельности:

1. Бай с самой высокой ценой открытия. Бай на 2й по уровню открытия. Бай Третий. 

То есть сортировка :

МаксБайОпенПрайс0.

МаксБайОпенПрайс1. (т.е. максимальный за исключением предыдущего)

МаксБайОпенПрайс2.   (т.е. максимальный за исключением предыдущих двух)

Ну по каждому прибыль и тикет чтобы его закрыть.

OnTick(){....  

MaxOrderBuyPRICE0= GetMaxPriceFromOpenPos(OP_BUY,-1,MAGIC); //максимальный ордер BUY
MaxOrderBuyPRICE1= GetMaxPriceFromOpenPos(OP_BUY, MaxOrderBuyPRICE0,MAGIC ); //максимальный ордер BUY

}
double GetMaxPriceFromOpenPos( int op=-1,double lastmax=-1, int mn=-1) {
  double l=0;
  double OOP=0;
  int    i, k=OrdersTotal();
  int ticket=-1;
  string sy="";
  
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              //if (l<OrderLots()) l=OrderLots();
             
             if(lastmax<0){  // нет максимального ордера
              if (OOP<OrderOpenPrice()){ 
              OOP=OrderOpenPrice();
              ticket=OrderTicket();
              }
              }
             
             if(lastmax>0){  // есть выше 1 максимальный ордер
              if (OOP<OrderOpenPrice() )
              {
              if(OrderOpenPrice()<lastmax ){ 
              OOP=OrderOpenPrice();
              ticket=OrderTicket();
                              }
               if(OrderOpenPrice()>=lastmax ){ 
              OOP=-1;
              ticket=OrderTicket();
                              }
                              
              }
              if (OOP<OrderOpenPrice()){
              if(OOP==lastmax ){  //если только один ордер в рынке
              OOP=-1;//OrderOpenPrice();  // ошибка -1
              ticket=-1;//OrderTicket();  // ошибка -1
              }
              }
              
              
              }
               
              
            }
          }
        }
      }
    }
  }
  return(OOP);
}
 

Удобнее всего записать все нужные ордера в массив:

#define ARRAY_RESERVE_SIZE                      int(100)

struct OrderInfo
{
   int         nTicket;
   int         nType;
   double      fOP;
                                                                                                   
   OrderInfo(const int _nTicket = -1, const int _nType = -1, const double _fOP = 0.0)
     : nTicket(_nTicket)
     , nType(_nType)
     , fOP(_fOP)
   {
   }           
};

OrderInfo m_arrstBuyOrders[],
          m_arrstSellOrders[];

bool FindExpertOrders()
{
   ArrayResize(m_arrstBuyOrders, 0, ARRAY_RESERVE_SIZE);
   ArrayResize(m_arrstSellOrders, 0, ARRAY_RESERVE_SIZE);

   for (int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS))          
         continue;
         
      if (OrderSymbol() != Symbol())
         continue;  
      
      if (OrderMagicNumber() != m_nExpertID) 
         continue;

      if (OrderType() == OP_BUY)
         if (!SaveOrderInfo(m_arrstBuyOrders))
            return false;
            
      if (OrderType() == OP_SELL)
         if (!SaveOrderInfo(m_arrstSellOrders))
            return false;
   }
   
   return true;
}

bool SaveOrderInfo(OrderInfo &arrstOrders[])
{
   int nTotal = ArraySize(arrstOrders);
   if (ArrayResize(arrstOrders, nTotal + 1, ARRAY_RESERVE_SIZE) != nTotal + 1)
      return false;

   OrderInfo stOrder(OrderTicket(), OrderType(), OrderOpenPrice());
   arrstOrders[nTotal] = stOrder;
   
   return true;
}

А потом отсортировать. Пузырьком, например:

void BubbleSort(OrderInfo &arrstOrders[], const bool bAscend)
{
   int nTotal = ArraySize(arrstOrders);
   for (int i = 0; i < nTotal; ++i)
      for (int j = i + 1; j < nTotal; ++j)
         if ((arrstOrders[i].fOP > arrstOrders[j].fOP && !bAscend) || (arrstOrders[i].fOP < arrstOrders[j].fOP && bAscend))
         {
            OrderInfo stOrder = arrstOrders[i];
            arrstOrders[i] = arrstOrders[j];
            arrstOrders[j] = stOrder;
         }
}

Если bAscend равен true, то в начале массива будут ордера с наименьшей ценой открытия. В противном случае - с наибольшей.