Сортировка цен

 

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

Можно ли как то получить предпоследние значения по такому принципу как написал я? Или можно ли как то это сделать с помощью массива?

P.S. В данном случае мне нужно получить значение two и three.


double RRatesB(string Par)
{     
      
     
      
      double one =0;
      double two = 0;
      double three = 0;
      double four = 0;
      
    
      for(int i=PositionsTotal()-1; i>=0; i--){
        
         if(a_position.SelectByIndex(i))
         
            if(a_position.Symbol()==Symbol())
              {
              ENUM_POSITION_TYPE pos_type = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
               
               
               
               if(pos_type==POSITION_TYPE_BUY){
               
                   double tik = a_position.PriceOpen();
                 
                   if(tik>one|| one==0)
                    {
                     one = tik;

                    } 

                    
                    if(tik<four || four==0)
                    {
                     four = tik;
                     
                    }
                    
                         
                   
                 }
  
        
      }   
     }
     
      if(Par == "one") return(one);
      else if(Par == "two") return(two);
      else if(Par == "three") return(three);
      else if(Par == "four") return(four);
      return(0);
     

}
 

А документацию почитать про массивы кто запрещает?

Там ведь есть сортировка массива. Соответственно в индексе 0 будет минимальная цена, а в последнем индексе максимальная. И вывод: индекс 1 это вторая по величине цена, и соответственно предпоследний индекс —*************

 
Alexey Viktorov #:

А документацию почитать про массивы кто запрещает?

Там ведь есть сортировка массива. Соответственно в индексе 0 будет минимальная цена, а в последнем индексе максимальная. И вывод: индекс 1 это вторая по величине цена, и соответственно предпоследний индекс —*************

Я пробовал создавать динамический массив равный количеству открытых сделок, но при открытии новых сделок я получал ошибку "array out of range", если же я создаю массив с большим количеством то пустые места забиваються дубликатами и сложно отсортировать. Можете пожалуйста  что-то посоветовать по этому поводу?
double RRatesS(string Par)
{     
      int a = CountSellPos();
      double PriceSell[];
      
      double one =0;
      double two = 0;
      int three = 0;
      int four = 0;
      
      ArrayResize(PriceSell,);
      
      if(CountSellPos()==0){
         ArrayFree(PriceSell);
      }
      
      
      for(int i=PositionsTotal()-1; i>=0; i--){
        
         if(a_position.SelectByIndex(i))
         
            if(a_position.Symbol()==Symbol())
              {//int PosType = a_position.Type();
              ENUM_POSITION_TYPE pos_type = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
                
               
               
               if(pos_type==POSITION_TYPE_SELL){
               
                    
                    PriceSell[i]=a_position.PriceOpen();
                    ArraySort(PriceSell);
                    
                    one = PriceSell[a-1];
                    if(a>1)
                    two = PriceSell[a-2];
    
               
                   
                 }
    
                
        
      }   
     }
     
      if(Par == "one") return(one);
      else if(Par == "two") return(two);
      else if(Par == "three") return(three);
      else if(Par == "four") return(four);
      return(0);
     

}
 
Fletchers97 #:
Я пробовал создавать динамический массив равный количеству открытых сделок, но при открытии новых сделок я получал ошибку "array out of range", если же я создаю массив с большим количеством то пустые места забиваються дубликатами и сложно отсортировать. Можете пожалуйста  что-то посоветовать по этому поводу?

Надо менять размер массива перед заполнением, увеличивая размер на 1.

      ArrayResize(PriceSell, ArraySize(PriceSell)+1);
Причина обращения: