Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 327

 

Hola, tengo una pregunta sobre las matrices. He creado un array unidimensional con algunos problemas. Debería estar bien, porque no tengo ningún error en el tiempo de compilación, pero ahora debo ejecutarlo en el probador y ver el error EURUSD,M1: matriz fuera de rango en ,, (218,12) que indica exactamente la posición de mi matriz de dolor. Por favor, díganme qué tiene de malo

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];
     }
   }       
Por favor, aconséjeme, ¿quizás hay otra forma de asignar un precio de pedido a cada elemento de la matriz?
 
vikzip:

Hola, tengo una pregunta sobre las matrices. He creado un array unidimensional con algunos problemas. Debería estar bien, porque no tengo ningún error en el tiempo de compilación, pero ahora debo ejecutarlo en el probador y ver el error EURUSD,M1: matriz fuera de rango en ,, (218,12) que indica exactamente la posición de mi matriz de dolor. Por favor, díganme qué tiene de malo


Tu código es erróneo en la raíz, pero el error se debe a que el tamaño del array no se establece antes de rellenarlo

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

Tu código es fundamentalmente erróneo, pero el error se debe a que el tamaño del array no se ha establecido antes de llenarlo


¡Muchas gracias! ¿Puede decirme, por favor, si la secuencia no es correcta? La idea es determinar los precios de las órdenes más cercanas al precio de abajo y de arriba. Por favor, dígame su punto de vista.

 
vikzip:

¡Muchas gracias! ¿Puede decirme si la secuencia no es correcta? La idea es determinar los precios de las órdenes más cercanas al precio por abajo y por arriba. Por favor, dígame su punto de vista.

Tienes un montón de cosas innecesarias en tu bucle. Tienes que llenar el array con los precios en el bucle y trabajar con ellos fuera del bucle

  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:

Tienes un montón de cosas innecesarias en el bucle. Tienes que llenar el array con los precios en el bucle, y trabajar con él fuera del bucle.


Ya veo. ¡¡Muchas gracias!! ¿He entendido bien la idea?

 
vikzip:

Ya veo. ¡¡Muchas gracias!! ¿Has entendido bien la idea?

Es posible. La misma tarea puede llevarse a cabo de varias maneras.

 
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:

Es posible. Una misma tarea puede llevarse a cabo de varias maneras.


Acabo de hacer un bucle para determinar los índices de los elementos más cercanos y el probador muestra un error en Mas[Blizko2].¿Tal vez sea porque todavía no hay órdenes cuando ejecuto el EA?

(Por favor, aconsejen, ¿tal vez saben dónde buscar algo similar?)
 
vikzip:

Acabo de poner fuera de bucle la definición de los índices del elemento más cercano y en el probador muestra un error en el lugar Mas[Blizko2] .Tal vez sea porque cuando se ejecuta el EA no hay órdenes todavía?

Pruébalo así

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:

Prueba esto


¡¡¡Muchas gracias!!! Tengo otra pregunta: ¿Estoy determinando correctamente el índice del elemento menor más cercano al precio actual al cambiarMODE_DESCEND aMODE_ASCEND?

 
vikzip:

¡¡¡Muchas gracias!!! Tengo otra pregunta: ¿Estoy determinando correctamente el índice del elemento menor más cercano al precio actual al cambiarMODE_DESCEND aMODE_ASCEND?

No hay respuesta, nunca he utilizadoArrayBsearch