Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 327

 

Здравствуйте! У меня вопрос по массивам. С горем пополам создали одномерный массив. Все бы хорошо, ведь на этапе компиляции ни каких ошибок, но вот стоит запустить в тестере и появляется ошибка EURUSD,M1: array out of range in ,, (218,12) указывающая как раз на положение моего горе-массива. Подскажите пожалуйста что с ним не так

int Totall=OrdersTotal();
  double Price;                                                               // Цена выбранного ордера
  double Mas[];                                                                //массив для упорядочивания всех ордеров
  for(int i=0; i<OrdersTotal(); i++)                                           // Цикл перебора ордер
   {
    if(OrderSelect(i,SELECT_BY_POS))                                           // Если есть следующий
     {
       Price=OrderOpenPrice();
       Mas [i] = Price;                                                        //Как раз перед квадратной скобкой и есть ошибка array out of range in ,, (218,12)
         
         ArraySort (Mas,WHOLE_ARRAY,0,MODE_ASCEND);                           // Теперь цены открытия упорядочены по убыванию
          
        int Blizko2=ArrayBsearch(Mas,Ask,WHOLE_ARRAY,0,MODE_DESCEND);          //Определен индекс ближайшего большего по значению елемента к текущей цене
             PriceBlizko2 = Mas[Blizko2];                                      // Цена выбранного ордера

          ArraySort (Mas,WHOLE_ARRAY,0,MODE_ASCEND);                           // Теперь цены открытия упорядочены по убыванию
          
        int Blizko1=ArrayBsearch(Mas,Bid,WHOLE_ARRAY,0,MODE_ASCEND);           //Определен индекс ближайшего меньшего по значению елемента к текущей цене
            PriceBlizko1=Mas[Blizko1];
     }
   }       
Подскажите пожалуйста, может еще есть способы присвоить каждому элементу массива цену ордера?
 
vikzip:

Здравствуйте! У меня вопрос по массивам. С горем пополам создали одномерный массив. Все бы хорошо, ведь на этапе компиляции ни каких ошибок, но вот стоит запустить в тестере и появляется ошибка EURUSD,M1: array out of range in ,, (218,12) указывающая как раз на положение моего горе-массива. Подскажите пожалуйста что с ним не так


У вас в корне неверный код, но ошибка связана с тем, что перед заполнением не задан размер массива

if(OrderSelect(i,SELECT_BY_POS))                                           // Если есть следующий
     {
       Price=OrderOpenPrice();
       ArrayResize(Mas, i+1);
       Mas [i] = Price; 
 
Vitaly Muzichenko:

У вас в корне неверный код, но ошибка связана с тем, что перед заполнением не задан размер массива


Огромное спасибо! Подскажите пожалуйста, не верно выстроена последовательность? Задумка в определении цен ближайших к цене ордеров с низу и сверху. Скажите пожалуйста свою точку зрения.

 
vikzip:

Огромное спасибо! Подскажите пожалуйста, не верно выстроена последовательность? Задумка в определении цен ближайших к цене ордеров с низу и сверху. Скажите пожалуйста свою точку зрения.

У вас в цикле много лишнего. В цикле нужно забить массив ценами, а вне цикла уже с ним работать

  for(int i=0; i<OrdersTotal(); i++)                                           // Цикл перебора ордер
   {
    if(OrderSelect(i,SELECT_BY_POS))                                           // Если есть следующий
     {
       ArrayResize(Mas, i+1);
       Mas[i] = OrderOpenPrice();                                                        //Как раз перед квадратной скобкой и есть ошибка array out of range in ,, (218,12)
   /*
         ArraySort (Mas,WHOLE_ARRAY,0,MODE_ASCEND);                           // Теперь цены открытия упорядочены по убыванию
          
        int Blizko2=ArrayBsearch(Mas,Ask,WHOLE_ARRAY,0,MODE_DESCEND);          //Определен индекс ближайшего большего по значению елемента к текущей цене
             PriceBlizko2 = Mas[Blizko2];                                      // Цена выбранного ордера

          ArraySort (Mas,WHOLE_ARRAY,0,MODE_ASCEND);                           // Теперь цены открытия упорядочены по убыванию
          
        int Blizko1=ArrayBsearch(Mas,Bid,WHOLE_ARRAY,0,MODE_ASCEND);           //Определен индекс ближайшего меньшего по значению елемента к текущей цене
            PriceBlizko1=Mas[Blizko1];
   */
     }
   }       
 
Vitaly Muzichenko:

У вас в цикле много лишнего. В цикле нужно забить массив ценами, а вне цикла уже с ним работать


Ясно. Огромное спасибо!! А задумку верно выразил?

 
vikzip:

Ясно. Огромное спасибо!! А задумку верно выразил?

Возможно. Одну и ту-же задачу можно реализовать несколькими способами.

 
double Price;                                                               // Цена выбранного ордера
  double Mas[];                                                                //массив для упорядочивания всех ордеров
  for(int i=0; i<OrdersTotal(); i++)                                           // Цикл перебора ордер
   {
    if(OrderSelect(i,SELECT_BY_POS))                                           // Если есть следующий
     {
       Price=OrderOpenPrice();
       ArrayResize(Mas, i+1);
       Mas [i] = Price; 
     }
   } 
          ArraySort (Mas,WHOLE_ARRAY,0,MODE_ASCEND);                           // Теперь цены открытия упорядочены по убыванию
          
        int Blizko2=ArrayBsearch(Mas,Ask,WHOLE_ARRAY,0,MODE_DESCEND);          //Определен индекс ближайшего большего по значению елемента к текущей цене
             PriceBlizko2 = Mas[Blizko2];                                      // Цена выбранного ордера                                                             Вот в этой строке

          ArraySort (Mas,WHOLE_ARRAY,0,MODE_ASCEND);                           // Теперь цены открытия упорядочены по убыванию
          
        int Blizko1=ArrayBsearch(Mas,Bid,WHOLE_ARRAY,0,MODE_ASCEND);           //Определен индекс ближайшего меньшего по значению елемента к текущей цене
            PriceBlizko1=Mas[Blizko1];


Vitaly Muzichenko:

Возможно. Одну и ту-же задачу можно реализовать несколькими способами.


Я только что вынес за цикл опредиление индексов ближайших елементов и в тестере указывает на ошибку в месте Mas[Blizko2] .Может это потому что при запуске советника еще нет ордеров?

Подскажите пожалуйста, возможно вы знаете где возможно посмотреть на что либо похожее?!)
 
vikzip:

Я только что вынес за цикл опредиление индексов ближайших елементов и в тестере указывает на ошибку в месте Mas[Blizko2] .Может это потому что при запуске советника еще нет ордеров?

Попробуйте так

if(ArraySize(Mas)>0) { // если массив не пустой, то

         ArraySort (Mas,WHOLE_ARRAY,0,MODE_ASCEND);                           // Теперь цены открытия упорядочены по убыванию
          
        int Blizko2=ArrayBsearch(Mas,Ask,WHOLE_ARRAY,0,MODE_DESCEND);          //Определен индекс ближайшего большего по значению елемента к текущей цене
             PriceBlizko2 = Mas[Blizko2];                                      // Цена выбранного ордера

          ArraySort (Mas,WHOLE_ARRAY,0,MODE_ASCEND);                           // Теперь цены открытия упорядочены по убыванию
          
        int Blizko1=ArrayBsearch(Mas,Bid,WHOLE_ARRAY,0,MODE_ASCEND);           //Определен индекс ближайшего меньшего по значению елемента к текущей цене
            PriceBlizko1=Mas[Blizko1];

 }
 
Vitaly Muzichenko:

Попробуйте так


Спасибо Огромное!! У меня еще вопрос: А я верно определяю индекс ближайшего меньшего по значению элемента к текушей цене, поменяв MODE_DESCEND на MODE_ASCEND??

 
vikzip:

Спасибо Огромное!! У меня еще вопрос: А я верно определяю индекс ближайшего меньшего по значению элемента к текушей цене, поменяв MODE_DESCEND на MODE_ASCEND??

Не отвечу, Я никогда не пользовался ArrayBsearch

Причина обращения: