Questions des débutants MQL5 MT5 MetaTrader 5 - page 1496

 
Aleksandr Slavskii #:

"Find the maximum value in the ticks array" - la valeur maximale de ce que nous trouvons ?

ticks[copié-1].bid ou ticks[copié-1].flags

Pour rire)))))


Il est fort probable que vous ayez confondu CopyTicks avec CopyRates, bien que dans ce dernier cas, vous disposiez également d'un tableau de structures et que vous spécifiez l'élément de la structure dont vous avez besoin.

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

Vousavez une ligne supplémentaire dans votre code.

Vous n'en avez pas besoin car CopyTicks et CopyRates allouent eux-mêmes la taille du tableau lors de la copie.

Merci pour l'astuce. Je ne le savais pas. J'insère cette ligne au cas où.

Est-ce que je comprends bien votre blague, à savoir que dans les rates, tous les prix sont moyennés et prennent en compte la barre, alors que dans les ticks, ce n'est pas le cas ? C'est la raison pour laquelle j'ai utilisé le terme tick pour désigner un intervalle de temps arbitraire, et non les prix de la barre. CopyRates dans ma formule similaire a rempli la variable copiée avec la valeur maximale de type ulong pour l'intervalle d'heure. Je n'ai pas pu résoudre ce problème non plus.

 
maxvoronin74 #:

Merci pour le conseil. Je ne le savais pas. J'insère cette ligne au cas où.

Est-ce que je comprends bien votre plaisanterie selon laquelle les taux font la moyenne de tous les prix et tiennent compte de la barre, mais pas les ticks ? C'est pourquoi j'ai considéré que les ticks utilisaient un intervalle de temps arbitraire, et non les prix de la barre. CopyRates dans ma formule similaire a rempli la variable copiée avec la valeur maximale de type ulong pour l'intervalle d'heure. Je n'ai pas pu résoudre ce problème non plus.

Tout est faux.

MqlRates est une structure, et vous la traitez comme une variable.

MqlTick est également une structure.

Vous essayez de combiner le chaud et le mou, et le compilateur ne vous comprend pas.

Moi non plus, je ne comprends pas I)))))

Je pourrais peut-être vous suggérer quelque chose d'utile, mais votre code n'indique pas clairement ce que vous essayez de trouver.

 
Aleksandr Slavskii #:

Tout est faux.

MqlRates est une structure, et vous la traitez comme une variable.

MqlTick est également une structure.

Vous essayez de combiner le chaud et le mou, et le compilateur ne vous comprend pas.

Moi non plus, je ne comprends pas I))))

Je pourrais peut-être vous suggérer quelque chose d'utile, mais votre code n'indique pas clairement ce que vous essayez de trouver.

Il s'agit de modifier le WPR (Williams Percent Range) de manière à obtenir la différence des valeurs WPR pour une période de temps arbitraire, sans tenir compte des barres.
 
maxvoronin74 #:
Il s'agit de modifier le WPR (Williams Percent Range) de manière à obtenir la différence des valeurs WPR pour une période de temps arbitraire, sans tenir compte des barres.

Il est possible (mais pas certain) que ce soit ce que vous vouliez obtenir.

   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) ;

Je vous remercie. Voici ce que j'ai obtenu, si j'ai bien compris la leçon :

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
Mais, malheureusement, à la ligne bid_arr[i] = ticks[i].bid ; le conseiller expert est sorti du graphique à cause d'un tableau hors plage dans 'namemyexpert.mq5' (204,12).
 
maxvoronin74 #:

Je vous remercie. Voici le résultat, si j'ai bien compris la leçon :

Puisque nous passons en boucle par tous les ticks de toute façon, nous ne pouvons pas copier dans cette boucle, mais chercher les maximums-minimums en une seule fois.

D'ailleurs, si nous copions, il serait bon de définir d'abord les tailles des tableaux où nous copions, la boucle ne le fera pas pour nous, nous sortirons du tableau à la première itération. Seul CopyTicksRange redimensionne le tableau cible lui-même.

 
JRandomTrader #:

Puisque nous parcourons tous les ticks de toute façon, nous ne pouvons pas copier dans ce cycle, mais rechercher ces maximums-minimums en une seule fois.

D'ailleurs, si nous copions, il serait bon de définir d'abord les tailles des tableaux où nous copions, la boucle ne le fera pas pour nous, nous sortirons du tableau à la première itération. Seul CopyTicksRange redimensionne le tableau cible lui-même.

Je suis un perfectionniste, trier des éléments séparés d'un tableau de structures est comme frapper du verre avec du polystyrène.
A propos du tableau non alloué, j'ai une bonne raison. Il est une heure du matin et ma femme me dit dans l'oreille "il est temps de dormir, il est temps de dormir". ))))))
 
Aleksandr Slavskii #:
Je suis un perfectionniste, trier des éléments individuels d'un tableau de structures est comme frapper du verre avec du polystyrène.
J'ai une bonne raison de ne pas distribuer les tableaux. Il est une heure du matin et ma femme me souffle à l'oreille "c'est l'heure de dormir, c'est l'heure de dormir". ))))))
Quoi, nuit ou matin ?)
Oui, vous avez raison de chercher le maximum en une seule fois. Je suis un peu bête ce matin.
 
JRandomTrader #:

Puisque nous parcourons tous les ticks de toute façon, nous ne pouvons pas copier dans ce cycle, mais rechercher ces maximums-minimums en une seule fois.

D'ailleurs, si nous copions, il serait bon de définir d'abord les tailles des tableaux où nous copions, la boucle ne le fera pas pour nous, nous sortirons du tableau à la première itération. Seul CopyTicksRange redimensionne le tableau cible lui-même.

Je suis désolé. Mon inattention. Corrigé. J'ai oublié que la valeur ArrayMaximum est un indice et non un prix. J'ai oublié que la valeur ArrayMaximum est un indice, pas un prix. Mais c'est corrigé maintenant.

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

Comme ArrayMaximum ne fonctionnait pas avec le tableau de ticks, j'ai essayé d'autres calculs, avec if dans une boucle. Pourquoi est-ce mieux ?

 
maxvoronin74 #:

Pourquoi est-ce mieux ?

   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;
     }