Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 327

 

Ciao, ho una domanda sugli array. Ho creato un array unidimensionale con qualche problema. Dovrei essere a posto, perché non ho nessun errore al momento della compilazione, ma ora dovrei eseguirlo nel tester e vedere l'errore EURUSD,M1: array out of range in ,, (218,12) che indica esattamente la posizione del mio array di dolore. Per favore, ditemi cosa c'è che non va

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];
     }
   }       
Per favore consigliatemi, forse c'è un altro modo per assegnare un prezzo d'ordine ad ogni elemento dell'array?
 
vikzip:

Ciao, ho una domanda sugli array. Ho creato un array unidimensionale con qualche problema. Dovrei essere a posto, perché non ho nessun errore al momento della compilazione, ma ora dovrei eseguirlo nel tester e vedere l'errore EURUSD,M1: array out of range in ,, (218,12) che indica esattamente la posizione del mio array di dolore. Per favore, ditemi cosa c'è che non va


Il tuo codice è sbagliato alla radice, ma l'errore è dovuto al fatto che la dimensione dell'array non è stata impostata prima di essere riempita

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

Il tuo codice è fondamentalmente sbagliato, ma l'errore è dovuto al fatto che la dimensione dell'array non è stata impostata prima del riempimento


Grazie mille! Potete dirmi, per favore, se la sequenza non è corretta? L'idea è quella di determinare i prezzi degli ordini più vicini al prezzo dal basso e dall'alto. Per favore, mi dica il suo punto di vista.

 
vikzip:

Grazie mille! Potete dirmi se la sequenza non è corretta? L'idea è di determinare i prezzi degli ordini più vicini al prezzo dal basso e dall'alto. Per favore, mi dica il suo punto di vista.

Hai un sacco di cose inutili nel tuo giro. Dovete riempire l'array con i prezzi nel ciclo e lavorare con loro fuori dal ciclo

  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:

Hai un sacco di cose inutili nel circuito. Dovete riempire l'array con i prezzi nel ciclo, e lavorare con esso fuori dal ciclo.


Capisco, grazie mille!!! Ho reso bene l'idea?

 
vikzip:

Capisco, grazie mille!!! Hai capito bene l'idea?

È possibile. Lo stesso compito può essere realizzato in diversi modi.

 
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:

È possibile. Uno stesso compito può essere implementato in diversi modi.


Ho appena fatto un ciclo per determinare gli indici degli elementi più vicini e il tester mostra un errore a Mas[Blizko2].Forse è perché non ci sono ancora ordini quando lancio l'EA?

(Per favore consigliatemi, forse sapete dove cercare qualcosa di simile?)
 
vikzip:

Ho appena messo fuori dal loop la definizione degli indici degli elementi più vicini e nel tester mostra un errore nel posto Mas[Blizko2] .Forse è perché quando si esegue l'EA non ci sono ancora ordini?

Prova così

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:

Prova questo


Grazie mille!!! Ho un'altra domanda: sto determinando correttamente l'indice dell'elemento più piccolo più vicino al prezzo corrente cambiandoMODE_DESCEND inMODE_ASCEND?

 
vikzip:

Grazie mille!!! Ho un'altra domanda: sto determinando correttamente l'indice dell'elemento minore più vicino al prezzo corrente cambiandoMODE_DESCEND inMODE_ASCEND?

Nessuna risposta, non ho mai usatoArrayBsearch

Motivazione: