Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1466

 

Buon pomeriggio. Scrivendo un Expert Advisor su Mql5 ho riscontrato un problema. C'è un array con i valori delle candele che aprono l'anno. Su ogni candela di questo array devo creare un array di n-candele, diciamo 30, per controllare i massimi e i minimi. Qualcosa di simile a un indicatore Zigzag.

Ho scritto questo codice, che dà un errore: "array out of range" ovvero i valori di massimo e minimo nell'intero array, ma non nel periodo di 30 candele richiesto.

for(int i=0; i<ArraySize(opens); i++)
  {
    if(i+30<=ArraySize(opens))
      {
       double maximum=0;
       double minimum=9;
       for(int j=0; j<30; j++)
        {
         maximum = ArrayMaximum(opens, i, i+j);
         minimum = ArrayMaximum(opens, i, i+j);
        }
     }
  }

Forse devo creare un altro array da controllare nelle funzioni ArrayMaximum() e ArrayMinimum(), ma sono confuso con i loop annidati e la dimensione dell'array.

Per favore, datemi un suggerimento.

 
Dmitry Ivanushko #:
if(i+30<=dimensione array(opens))
if(i+30<ArraySize(opens))

Ecco l' output al di fuori dell'array

 
if(i+30<ArraySize(opens))

Questo errore è dovuto a una disattenzione. La correzione non risolve il problema.

Come posso creare un array di 30 prezzi di apertura delle candele per cercare i massimi e i minimi in esso?

 
Dmitry Ivanushko #:
ArrayMaximum
ArrayMaximum

Restituisce indice del valore massimo, non del prezzo.

//+------------------------------------------------------------------+
int indexMax[];
int indexMin[];
int sizeArray = ArraySize(opens);
int size = 0;
int n = 30;

for(int i = n; i < sizeArray; i + n)
  {
   ArrayResize(indexMax, size + 1);
   indexMax[size] = ArrayMaximum(opens, i - n, i);
   indexMin[size] = ArrayMinimum(opens, i - n, i);
   size++;
  }
//+------------------------------------------------------------------+

Non ho controllato, ma sembra essere il modo per ottenere gli indici dei minimi e dei massimi delle aperture delle candele (aperture).

Anche se è possibile ottenere il prezzo in una volta sola, ma non gli indici.

double PriseMin = opens[ArrayMinimum(opens, i - n, i)];
 
for(int i = n; i < sizeArray; i + n)

Non ho trovato da nessuna parte un esempio di ciclo mql con un passo. Questo semplifica l'intera questione.

Solo ChatGPT mi ha consigliato di scriverlo in questo modo:

for(int i = n; i < sizeArray; i += n)

Sperimenterò ulteriormente. Il codice funziona. Grazie.

L'errore "array out of range" si verifica se non si esegue ArrayResize.

 
Dmitry Ivanushko #:

Questo errore è dovuto a una disattenzione. La correzione non risolve il problema.

Come posso creare un array di 30 prezzi di apertura delle candele per cercare i massimi e i minimi in esso?

Qual è il problema? Dichiarare un array temp[], copiarvi 30 elementi e cercare l'indice del valore minimo/massimo. E se alla fine è inferiore a 30, copierà quanti ne sono rimasti. In questo caso, preferirei usare un ciclo while().

 
Alexey Viktorov #:
Qual è il problema? Dichiarare un array temp[], copiarvi 30 elementi e cercare l'indice del valore minimo/massimo. E se alla fine il valore è inferiore a 30, copierà quanti ne sono rimasti. In questo caso, preferirei usare un ciclo while().

Sì, si può fare. Non ho le idee chiare, quindi chiedo un consiglio.

 
Dmitry Ivanushko #:

Sì, potresti farlo. Non ho le idee chiare, quindi ti chiedo un consiglio.

In un array statico la dimensione è costante, non può essere modificata, in un array dinamico può essere modificata, ma la dimensione dell'array è impostata! Cioè la dimensione dell'array è nota e gli indici degli elementi da 0 alla fine. <= è fuori limite solo perché gli indici degli elementi da zero e l'indice dell'ultimo elemento sono inferiori di un'unità della dimensione dell'array.

Tutto è nelle vostre mani))))

 
Valeriy Yastremskiy #:

In un array statico la dimensione è costante e non può essere modificata, in un array dinamico può essere modificata, ma la dimensione dell'array è impostata! Cioè la dimensione dell'array è nota e gli indici degli elementi sono da 0 alla fine. <= è fuori limite solo perché gli indici degli elementi partono da zero e l'indice dell'ultimo elemento è inferiore di un'unità della dimensione dell'array.

Tutto è nelle vostre mani))))

Che cosa intendedire ? Pensate che per copiare un certo numero di elementi da un array a un altro, un certo temp[], si debba impostare la dimensione dell'array prima della copia ArrayResize(temp, new_size); ?????

 
Dmitry Ivanushko #:

Sì, potresti farlo. Non ho le idee chiare, quindi ti chiedo un consiglio.

Non serve nemmeno un array temporaneo.

int  ArrayMaximum( 
   const void&   array[],             // массив для поиска 
   int           start=0,             // с какого индекса начинаем поиск 
   int           count=WHOLE_ARRAY    // количество проверяемых 
   );

Questo codice

  double open[];
  int copy = CopyOpen(_Symbol, PERIOD_CURRENT, 0, 100, open);
  int arrMaximum = ArrayMaximum(open, 85, 20);

cerca al massimo i 15 elementi rimanenti, nonostante sia impostato per cercare 20 elementi.

Quindi è meglio usare il ciclo while() e non preoccuparsi del numero di elementi rimanenti dell'array.