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

 

Bonjour. En écrivant un Expert Advisor sur Mql5 j'ai rencontré un problème. Il y a un tableau avec les valeurs des chandeliers d'ouverture pour l'année. Sur chaque chandelier de ce tableau, je dois créer un tableau de n-bougies, disons 30, pour vérifier les plus hauts et les plus bas. Quelque chose comme un indicateur Zigzag.

J'ai écrit ce code, qui donne une erreur : "array out of range" ou les valeurs du maximum et du minimum dans le tableau entier, mais pas dans la période requise de 30 bougies.

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

Peut-être dois-je créer un autre tableau pour vérifier dans les fonctions ArrayMaximum() et ArrayMinimum(), mais je suis confus avec les boucles imbriquées et la taille des tableaux.

Merci de me donner un indice.

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

Voici le résultat à l'extérieur du tableau

 
if(i+30<ArraySize(opens))

Cette erreur est due à un manque d'attention. La corriger ne résout pas le problème.

Comment puis-je créer un tableau de 30 prix d'ouverture de chandeliers pour y rechercher les plus hauts et les plus bas ?

 
Dmitry Ivanushko #:
Maximum du tableau
ArrayMaximum

Retourne l'indice de la valeur maximale, et non du prix.

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

Je n'ai pas vérifié, mais il semble que ce soit la façon d'obtenir les indices des minimums et maximums des ouvertures de chandeliers (opens).

Bien que vous puissiez également obtenir le prix en une seule fois, mais pas les indices.

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

Je n'ai trouvé nulle part un exemple de boucle mql avec un pas. Cela simplifie toute la question.

Seul ChatGPT m'a conseillé de l'écrire de cette façon :

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

Je vais poursuivre l'expérience. Le code fonctionne. Je vous remercie.

L'erreur "array out of range" se produit si vous ne faites pas ArrayResize.

 
Dmitry Ivanushko #:

Cette erreur est due à un manque d'attention. La corriger ne résout pas le problème.

Comment puis-je créer un tableau de 30 prix d'ouverture de chandeliers pour y rechercher les plus hauts et les plus bas ?

Quel est le problème ? Déclarez un tableau temp[] et copiez 30 éléments dedans et cherchez l'index de la valeur minimum/maximum. Et si à la fin il y a moins de 30, il copiera combien il en reste. Et dans ce cas, je préfère utiliser une boucle while().

 
Alexey Viktorov #:
Quel est le problème ? Déclarer un tableau temp[] et y copier 30 éléments en cherchant l'indice de la valeur minimale/maximale. Et si à la fin il y a moins de 30, on recopie combien il en reste. Et dans ce cas, je préfère utiliser une boucle while().

Oui, c'est possible. Je n'ai pas les idées claires, alors je demande conseil.

 
Dmitry Ivanushko #:

Oui, vous pourriez le faire. Je n'ai pas les idées claires, alors je demande conseil.

Dans un tableau statique, la taille est constante, elle ne peut pas être modifiée, dans un tableau dynamique, elle peut être modifiée, mais la taille du tableau est fixe ! C'est-à-dire que la taille du tableau est connue ainsi que les indices des éléments de 0 à la fin. <= est hors limites simplement parce que les indices des éléments à partir de zéro et l'indice du dernier élément sont inférieurs d'une unité à la taille du tableau.

Tout est entre vos mains))))

 
Valeriy Yastremskiy #:

Dans un tableau statique, la taille est constante et ne peut pas être modifiée. Dans un tableau dynamique, elle peut être modifiée, mais la taille du tableau est fixe, c'est-à-dire que la taille du tableau est connue et que les indices des éléments sont compris entre 0 et la fin. <= est hors limites simplement parce que les indices des éléments à partir de zéro, et l'indice du dernier élément est inférieur d'une unité à la taille du tableau.

Tout est entre vos mains))))

Qu'entendez-vous par? Pensez-vous que pour copier un certain nombre d'éléments d'un tableau vers un autre, un certain temp[], vous devriez définir la taille du tableau avant de copier ArrayResize(temp, new_size) ; ? ????

 
Dmitry Ivanushko #:

Oui, vous pourriez le faire. Je n'ai pas les idées claires, alors je demande conseil.

Vous n'avez même pas besoin d'un tableau temporaire.

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

Ce code

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

recherche le maximum de 15 éléments restants malgré le fait qu'il soit configuré pour rechercher 20 éléments.

Il est donc préférable d'utiliser la boucle while() et de ne pas se préoccuper du nombre d'éléments restants dans le tableau.

Raison: