Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1496

 
Aleksandr Slavskii #:

"Trova il valore massimo nell'array ticks" - il valore massimo di cosa stiamo trovando?

ticks[copied-1].bid o ticks[copied-1].flags

Scherzo)))))


Molto probabilmente avete confuso CopyTicks con CopyRates, sebbene anche in questo caso abbiate un array di strutture e specifichiate quale elemento della struttura vi serve.

double PrevClose = rates[copied-1].close;

Nelcodice c'è una riga in più.

Non è necessaria perché CopyTicks e CopyRates allocano la dimensione dell'array durante la copia.

Grazie per il suggerimento. Non lo sapevo. Inserisco questa riga per sicurezza.

Ho capito bene la tua battuta che nei tassi tutti i prezzi sono mediati e tengono conto della barra, mentre nei tick no? Per questo motivo ho considerato i tick come un intervallo di tempo arbitrario e non come i prezzi delle barre. CopyRates nella mia formula simile riempiva la variabile copiata con il valore massimo di tipo ulong per l'intervallo di ore. Non sono riuscito a risolvere nemmeno questo problema.

 
maxvoronin74 #:

Grazie per il suggerimento. Non lo sapevo. Inserisco questa riga per sicurezza.

Ho capito bene la tua battuta sul fatto che i tassi hanno tutti i prezzi mediati e tengono conto della barra, ma i tick no? Per questo motivo ho inteso il tick come un intervallo di tempo arbitrario e non come i prezzi delle barre. CopyRates nella mia formula simile riempiva la variabile copiata con il valore massimo di tipo ulong per l'intervallo di ore. Non sono riuscito a risolvere nemmeno questo problema.

Tutto è sbagliato.

MqlRates è una struttura e tu la tratti come una variabile.

AncheMqlTick è una struttura.

State cercando di combinare caldo e morbido, quindi il compilatore non vi capisce.

Nemmeno io)))))

Forse potrei suggerire qualcosa di utile, ma dal vostro codice non è chiaro cosa stiate cercando di trovare.

 
Aleksandr Slavskii #:

È tutto sbagliato.

MqlRates è una struttura e voi la trattate come una variabile.

AncheMqlTick è una struttura.

Si sta cercando di combinare caldo e morbido, quindi il compilatore non lo capisce.

Nemmeno io))))

Forse potrei suggerire qualcosa di utile, ma dal codice non è chiaro cosa si stia cercando di trovare.

Si tratta di modificare il WPR (Williams Percent Range) in modo da ottenere la differenza dei valori WPR per un periodo di tempo arbitrario, indipendentemente dalle barre.
 
maxvoronin74 #:
Il compito è quello di modificare il WPR (Williams Percent Range) in modo da ottenere la differenza dei valori WPR per un periodo di tempo arbitrario, indipendentemente dalle barre.

È possibile (ma non certo) che questo sia ciò che si voleva ottenere.

   MqlTick ticks[];
   int copied = CopyTicksRange(Symbol(), ticks, COPY_TICKS_INFO, t0, t1);
   double bid[];
   for(int i = 0; i < copied; i++)
      bid[i] = ticks[i].bid;
   double PrevClose = bid[copied - 1]; // Получаем последний элемент массива как значение PrevClose
   double highestHigh = ArrayMaximum(bid, 0, copied); // Находим максимальное значение в массиве ticks
   double lowestLow = ArrayMinimum(bid, 0, copied); // Находим минимальное значение в массиве ticks
 
Aleksandr Slavskii #:
double lowestLow = ArrayMinimum(bid, 0, copied);

Grazie. Ecco cosa ho ottenuto, se ho capito bene la lezione:

MqlTick ticks[];
int copied=CopyTicksRange(Symbol(),ticks,COPY_TICKS_INFO,t0,t1);
double bid_arr[];
double ask_arr[];
for(int i = 0; i < copied; i++)
{
   bid_arr[i] = ticks[i].bid;
   ask_arr[i] = ticks[i].ask;
}
double highestBid = ArrayMaximum(bid_arr, 0, copied-1);
double lowestBid = ArrayMinimum(bid_arr, 0, copied-1);
double highestAsk = ArrayMaximum(ask_arr, 0, copied-1);
double lowestAsk = ArrayMinimum(ask_arr, 0, copied-1);
double highestHigh = (highestBid+highestAsk)/2; // Средняя наибольшего ask и наибольшего bid элемента
double lowestLow = (lowestBid+lowestAsk)/2; // Средняя наименьшего ask и наименьшего bid элемента
double PrevClose = (bid_arr[copied-1]+ask_arr[copied-1])/2; // Средняя ask и bid последнего элемента
double WPR_Past = -100 * (NormalizeDouble((highestHigh - PrevClose) / (highestHigh - lowestLow),_Digits)); // Формула предыдущего WPR
Ma, sfortunatamente, sulla linea bid_arr[i] = ticks[i].bid; l'Expert Advisor è uscito dal grafico a causa di un array fuori range in 'namemyexpert.mq5' (204,12).
 
maxvoronin74 #:

Grazie. Ecco cosa è venuto fuori, se ho imparato bene la lezione:

Dal momento che stiamo comunque eseguendo un loop su tutti i tick, non possiamo copiare in questo ciclo, ma cercare i massimi e i minimi in una volta sola.

A proposito, se copiamo, sarebbe bene impostare prima le dimensioni degli array in cui copiamo, il ciclo non lo farà per noi, voleremo fuori dall'array alla prima iterazione. Solo CopyTicksRange ridimensiona l'array di destinazione.

 
JRandomTrader #:

Poiché il ciclo si svolge comunque attraverso tutti i tick, non possiamo copiare in questo ciclo, ma cercare i massimi e i minimi in una sola volta.

A proposito, se copiamo, sarebbe bene impostare prima le dimensioni degli array in cui copiamo, perché il ciclo non lo farà per noi, che voleremo fuori dall'array alla prima iterazione. Solo CopyTicksRange ridimensionerà l'array di destinazione.

Sono un perfezionista, ordinare elementi separati di un array di strutture è come colpire un vetro con del polistirolo.
Per quanto riguarda l'array non allocato, ho una buona ragione. È l'una di notte e mia moglie mi sta dicendo "è ora di dormire, è ora di dormire". ))))))
 
Aleksandr Slavskii #:
Sono un perfezionista, ordinare i singoli elementi di un array di strutture è come colpire il vetro con il polistirolo.
Per quanto riguarda la mancata distribuzione dell'array, ho una buona ragione. È l'una di notte e mia moglie mi dice "è ora di dormire, è ora di dormire". ))))))
Cosa, notte o mattina un fico secco).
Sì, hai ragione a cercare il massimo in una volta sola. È molto più comodo così. Stamattina sono un po' tonto.
 
JRandomTrader #:

Poiché il ciclo si svolge comunque attraverso tutti i tick, non possiamo copiare in questo ciclo, ma cercare i massimi e i minimi in una sola volta.

A proposito, se copiamo, sarebbe bene impostare prima le dimensioni degli array in cui copiamo, perché il ciclo non lo farà per noi, che voleremo fuori dall'array alla prima iterazione. Solo CopyTicksRange ridimensiona l'array di destinazione.

Scusate. La mia disattenzione. Corretto. Grazie. Ho dimenticato che il valore ArrayMaximum è un indice, non un prezzo. Ma ora è stato corretto.

MqlTick ticks[];
int copied=CopyTicksRange(Symbol(),ticks,COPY_TICKS_INFO,t0,t1);
double bid_arr[];
ArrayResize(bid_arr,copied,100000);
double ask_arr[];
ArrayResize(ask_arr,copied,100000);
for(int i = 0; i < copied; i++)
{
   bid_arr[i] = ticks[i].bid;
   ask_arr[i] = ticks[i].ask;
}
int IndMaxBid = ArrayMaximum(bid_arr, 0, copied-1); // Индекс элемента массива bid_arr с максимальной ценой
double highestBid = bid_arr[IndMaxBid]; // Самая высокая цена bid за период
int IndMinBid = ArrayMinimum(bid_arr, 0, copied-1); // Индекс элемента массива bid_arr с минимальной ценой
double lowestBid = bid_arr[IndMinBid]; // Самая низкая цена bid за период
int IndMaxAsk = ArrayMaximum(ask_arr, 0, copied-1); // Индекс элемента массива ask_arr с максимальной ценой
double highestAsk = ask_arr[IndMaxAsk]; // Самая высокая цена ask за период
int IndMinAsk = ArrayMinimum(ask_arr, 0, copied-1); // Индекс элемента массива ask_arr с минимальной ценой
double lowestAsk = ask_arr[IndMinAsk]; // Самая низкая цена ask за период
double highestHigh = (highestBid+highestAsk)/2; // Средняя наибольшего ask и наибольшего bid элемента
double lowestLow = (lowestBid+lowestAsk)/2; // Средняя наименьшего ask и наименьшего bid элемента
double PrevClose = (bid_arr[copied-1]+ask_arr[copied-1])/2; // Средняя ask и bid последнего элемента
double WPR_Past = -100 * (NormalizeDouble((highestHigh - PrevClose) / (highestHigh - lowestLow),_Digits)); // Формула предыдущего WPR

Poiché ArrayMaximum non funzionava con l'array di ticks, ho provato a fare dei calcoli alternativi, con if in un ciclo. Perché è meglio?

 
maxvoronin74 #:

Perché è meglio?

   MqlTick ticks[];
   int copied = CopyTicksRange(Symbol(), ticks, COPY_TICKS_INFO, t0, t1);
   double highestHigh = 0, lowestLow = DBL_MAX;
   for(int i = 0; i < copied; i++)
     {
      if(highestHigh < ticks[i].ask) // Находим максимальное значение в массиве ticks
         highestHigh = ticks[i].ask;
      if(lowestLow > ticks[i].bid) // Находим минимальное значение в массиве ticks
         lowestLow = ticks[i].bid;
     }
Motivazione: