Fonction ihighest fonctionne mal ? - page 2

 

Dans cette image, on peut voir le début de la boucle.

Pas de souci, de 0 à 20 il nous donne bien le plus haut.

 

Sur la fin de la boucle et partir de notre plus haut précèdent, pas de souci non plus.

Je crois que cette fonction ne calcul pas la bougie de départ (à vérifier) donc si c'est le cas et que tu souhaite comparer avec ton chandelier en cour (il te suffit de comparer le plus haut de ta bougie en cour avec ton plus haut trouvé).

Courage à toi.

 
Bonsoir et merci beaucoup.
Je vais laisser passer beaucoup de temps car je ne rends compte quand dans les bases de mql5 je ne vais pas y arriver.

Ce canal de donchian est une obligation pour toute ma stratégie.

Une très belle soirée
 

Bonjour 
Sauf erreur de ma part, elle est buguée

Voici mon code et les sorties de Print. Ca ne colle pas


#property indicator_buffers 3
#property indicator_plots   3
#property indicator_label1  "Haut"
#property indicator_label2  "Bas"
#property indicator_label3  "Milieu"
#property indicator_type1   DRAW_LINE
#property indicator_type2   DRAW_LINE
#property indicator_type3  DRAW_LINE
#property indicator_color1 clrRed
#property indicator_color2 clrRed
#property indicator_color3 clrRed

input ushort InpPeriod=20; // Period

double ExtUpperBuffer[];
double ExtLowerBuffer[];
double ExtMiddleBuffer[];

int OnInit(){
   SetIndexBuffer(0,ExtUpperBuffer,INDICATOR_DATA);
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpPeriod);
   PlotIndexSetString(0,PLOT_LABEL,"Donchian haut");
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   
   SetIndexBuffer(1,ExtLowerBuffer,INDICATOR_DATA);
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpPeriod);
   PlotIndexSetString(1,PLOT_LABEL,"Donchian bas");
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   
   SetIndexBuffer(2,ExtMiddleBuffer,INDICATOR_DATA);
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,InpPeriod);
   PlotIndexSetString(2,PLOT_LABEL,"Donchian milieu");
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,EMPTY_VALUE);
     
   return(INIT_SUCCEEDED);
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[]){
   

   /*Déclarer une variable entière max_index et lui assigner la 
   valeur minimale possible*/
   int max_index = INT_MIN;
   /*Déclarer une variable réelle max_value et lui assigner
   la valeur minimale possible*/
   double max_value = DBL_MIN ; 
   /*Déclarer une variable entière resultIhighest*/
   int resultIhighest;
   
   /* Si le nombre total de barres est inférieur à la période 
   d'entrée, retourner 0 et arrêter le calcul */
   if(rates_total<InpPeriod) return 0;
   
   /* Déclarer une variable entière start et lui assigner 
   la valeur de prev_calculated moins 1 */
   int start=prev_calculated-1;
   
   /* Si start est inférieur à InpPeriod, lui assigner la
   valeur de InpPeriod */
   if(start<InpPeriod) start=InpPeriod;
   
   for(int i=start;i<rates_total;i++){
   /* Débuter une boucle for qui parcourt les barres de 
   start à rates_total */
      datetime bar_time = time[i];
      string date_str = TimeToString( bar_time, TIME_DATE|TIME_MINUTES );
      PrintFormat( "Barre du date %s, sur high[%d] on a %f", date_str, i, high[ i ] );

      for(int j = i-InpPeriod; j <= i; j++){   
      /* Débuter une boucle for imbriquée qui parcourt
      les barres de i-InpPeriod à i */
         PrintFormat("Valeur high[ %d ] fait %f, la valeur la plus forte actuelle est %f", j, high[ j ], max_value);
         
         if(high[ j ] > max_value){
         /* Si le prix le plus haut de la barre j est
         supérieur à max_value */
            PrintFormat("%f est plus fort que %f. La nouvelle valeur est %f", high[ j ], max_value, high[ j ]);
            max_value = high[ j ];
            max_index = j;
         }
      }
      /* Appeler la fonction iHighest qui retourne l'index 
      de la barre avec le prix le plus haut dans une période donnée */
      resultIhighest = iHighest( NULL, 0, MODE_HIGH, InpPeriod, i);
      
      /* Afficher la plage de recherche */
      PrintFormat("La plage de recherche va de high[%d] à high[%d]", i-InpPeriod, i);
      
      /* Afficher l'index et la valeur trouvés par iHighest */
      PrintFormat("Ihighest trouve l'index %d avec la valeur %f", resultIhighest, high[ resultIhighest ]);
      ExtUpperBuffer[ i ] = high[ resultIhighest ];
      
            if ( max_value != high[resultIhighest] ) {
            /* Si max_value est différent du prix le 
            plus haut de la barre resultIhighest */
               PrintFormat("La bonne valeur était %f à l'index %d et non %f à l'index %d", max_value, max_index, high[resultIhighest], resultIhighest);
            }
            if ( resultIhighest < i-InpPeriod || resultIhighest > i ){
            /* Si resultIhighest est inférieur à 
            i-InpPeriod ou supérieur à i */
               PrintFormat("Erreur : max_value (%f) n'est pas égal à high[resultIhighest] (%f)", max_value, high[ resultIhighest ]);
               PrintFormat("Le résultat de Ihigest à trouvé hors de la plage !!! ???");
               PrintFormat("On devait être entre l'indeux %d - %d, il trouve %d", i-InpPeriod, i, resultIhighest);
            }
            if( max_value == resultIhighest ) {
            /* Si max_value est égal à resultIhighest */
               PrintFormat("Test et iighest ok avec %f", max_value);
            }
      Print("Contenu de high");
      ArrayPrint(high);
   }
   return(rates_total); 
}

Voici les premières sorties, mais laissé le courir et regardez bien

Dites moi SVP


Barre du date 2022.01.31 00:00, sur high[20] on a 1.124740
Valeur high[ 0 ] fait 1.137840, la valeur la plus forte actuelle est 0.000000
1.137840 est plus fort que 0.000000. La nouvelle valeur est 1.137840
Valeur high[ 1 ] fait 1.132220, la valeur la plus forte actuelle est 1.137840
Valeur high[ 2 ] fait 1.134620, la valeur la plus forte actuelle est 1.137840
Valeur high[ 3 ] fait 1.133150, la valeur la plus forte actuelle est 1.137840
Valeur high[ 4 ] fait 1.136460, la valeur la plus forte actuelle est 1.137840
Valeur high[ 5 ] fait 1.136000, la valeur la plus forte actuelle est 1.137840
Valeur high[ 6 ] fait 1.137500, la valeur la plus forte actuelle est 1.137840
Valeur high[ 7 ] fait 1.145250, la valeur la plus forte actuelle est 1.137840
1.145250 est plus fort que 1.137840. La nouvelle valeur est 1.145250
Valeur high[ 8 ] fait 1.148160, la valeur la plus forte actuelle est 1.145250
1.148160 est plus fort que 1.145250. La nouvelle valeur est 1.148160
Valeur high[ 9 ] fait 1.148250, la valeur la plus forte actuelle est 1.148160
1.148250 est plus fort que 1.148160. La nouvelle valeur est 1.148250
Valeur high[ 10 ] fait 1.143410, la valeur la plus forte actuelle est 1.148250
Valeur high[ 11 ] fait 1.142110, la valeur la plus forte actuelle est 1.148250
Valeur high[ 12 ] fait 1.135680, la valeur la plus forte actuelle est 1.148250
Valeur high[ 13 ] fait 1.136870, la valeur la plus forte actuelle est 1.148250
Valeur high[ 14 ] fait 1.135950, la valeur la plus forte actuelle est 1.148250
Valeur high[ 15 ] fait 1.134470, la valeur la plus forte actuelle est 1.148250
Valeur high[ 16 ] fait 1.132800, la valeur la plus forte actuelle est 1.148250
Valeur high[ 17 ] fait 1.131040, la valeur la plus forte actuelle est 1.148250
Valeur high[ 18 ] fait 1.124300, la valeur la plus forte actuelle est 1.148250
Valeur high[ 19 ] fait 1.117340, la valeur la plus forte actuelle est 1.148250
Valeur high[ 20 ] fait 1.124740, la valeur la plus forte actuelle est 1.148250
La plage de recherche va de high[0] à high[20]
Ihighest trouve l'index 20 avec la valeur 1.124740
La bonne valeur était 1.148250 à l'index 9 et non 1.124740 à l'index 20
Contenu de high
[  0] 1.13784 1.13222 1.13462 1.13315 1.13646 1.13600 1.13750 1.14525 1.14816 1.14825 1.14341 1.14211 1.13568 1.13687 1.13595 1.13447 1.13280 1.13104
[ 18] 1.12430 1.11734 1.12474 1.12783 1.13298 1.14511 1.14834 1.14616 1.14484 1.14477 1.14947 1.14294 1.13690 1.13680 1.13955 1.13857 1.13767 1.13903


Barre du date 2022.02.01 00:00, sur high[21] on a 1.127830
2023.01.01 00:00:00   Valeur high[ 1 ] fait 1.132220, la valeur la plus forte actuelle est 1.148250
2023.01.01 00:00:00   Valeur high[ 2 ] fait 1.134620, la valeur la plus forte actuelle est 1.148250
2023.01.01 00:00:00   Valeur high[ 3 ] fait 1.133150, la valeur la plus forte actuelle est 1.148250
2023.01.01 00:00:00   Valeur high[ 4 ] fait 1.136460, la valeur la plus forte actuelle est 1.148250
2023.01.01 00:00:00   Valeur high[ 5 ] fait 1.136000, la valeur la plus forte actuelle est 1.148250
2023.01.01 00:00:00   Valeur high[ 6 ] fait 1.137500, la valeur la plus forte actuelle est 1.148250
2023.01.01 00:00:00   Valeur high[ 7 ] fait 1.145250, la valeur la plus forte actuelle est 1.148250
2023.01.01 00:00:00   Valeur high[ 8 ] fait 1.148160, la valeur la plus forte actuelle est 1.148250
2023.01.01 00:00:00   Valeur high[ 9 ] fait 1.148250, la valeur la plus forte actuelle est 1.148250
2023.01.01 00:00:00   Valeur high[ 10 ] fait 1.143410, la valeur la plus forte actuelle est 1.148250
2023.01.01 00:00:00   Valeur high[ 11 ] fait 1.142110, la valeur la plus forte actuelle est 1.148250
2023.01.01 00:00:00   Valeur high[ 12 ] fait 1.135680, la valeur la plus forte actuelle est 1.148250
2023.01.01 00:00:00   Valeur high[ 13 ] fait 1.136870, la valeur la plus forte actuelle est 1.148250
2023.01.01 00:00:00   Valeur high[ 14 ] fait 1.135950, la valeur la plus forte actuelle est 1.148250
2023.01.01 00:00:00   Valeur high[ 15 ] fait 1.134470, la valeur la plus forte actuelle est 1.148250
2023.01.01 00:00:00   Valeur high[ 16 ] fait 1.132800, la valeur la plus forte actuelle est 1.148250
2023.01.01 00:00:00   Valeur high[ 17 ] fait 1.131040, la valeur la plus forte actuelle est 1.148250
2023.01.01 00:00:00   Valeur high[ 18 ] fait 1.124300, la valeur la plus forte actuelle est 1.148250
2023.01.01 00:00:00   Valeur high[ 19 ] fait 1.117340, la valeur la plus forte actuelle est 1.148250
2023.01.01 00:00:00   Valeur high[ 20 ] fait 1.124740, la valeur la plus forte actuelle est 1.148250
2023.01.01 00:00:00   Valeur high[ 21 ] fait 1.127830, la valeur la plus forte actuelle est 1.148250
2023.01.01 00:00:00   La plage de recherche va de high[1] à high[21]
2023.01.01 00:00:00   Ihighest trouve l'index 23 avec la valeur 1.145110
2023.01.01 00:00:00   La bonne valeur était 1.148250 à l'index 9 et non 1.145110 à l'index 23
2023.01.01 00:00:00   Le résultat de Ihigest à trouvé hors de la plage !!! ???
2023.01.01 00:00:00   On devait être entre l'indeux 1 - 21, il trouve 23
2023.01.01 00:00:00   Contenu de high
[  0] 1.13784 1.13222 1.13462 1.13315 1.13646 1.13600 1.13750 1.14525 1.14816 1.14825 1.14341 1.14211 1.13568 1.13687 1.13595 1.13447 1.13280 1.13104
[ 18] 1.12430 1.11734 1.12474 1.12783 1.13298 1.14511 1.14834 1.14616 1.14484 1.14477 1.14947 1.14294 1.13690 1.13680 1.13955 1.13857 1.13767 1.13903
 
William210 #:

Bonjour 
Sauf erreur de ma part, elle est buguée

Voici mon code et les sorties de Print. Ca ne colle pas


Voici les premières sorties, mais laissé le courir et regardez bien

Dites moi SVP


Vous mélangez les index, c'est pour cela que vous pensez avoir des mauvais résultats avec iHighest().

Les tableaux retournés par OnCalculate() (open[], high[], etc...) sont par défaut indexés "standard', c'est-à-dire que l'index 0 est celui de la chandelle la plus ancienne. La chandelle la plus récente a un index de rates_total-1.

iHighest() par contre fonctionne avec des index "as series", donc ici la chandelle la plus récente à l'index le plus petit (0 si on considére un tableau de valeurs en entier), et donc la valeurs la plus ancienne a l'index le plus grand.

Lisez bien la documentation :

iHighest

Retourne l'indice de la valeur la plus haute trouvée sur le graphique correspondant (décalée relativement à la barre courante).

Il vous faut donc convertir vos index pour passer de l'un à l'autre. Ou alors vous pouvez changer l'indexation par défaut de high[] et autres avec ArraySetAsSeries().

Veuillez noter par ailleurs qu'il est conseillé d'utiliser ArrayMaximum()/ArrayMinimum() qui sont plus performantes. iHighest()/ILowest() sont des vieilles fonctions obsolètes présentes pour la compatibilité avec mql4.
Documentation sur MQL5: Accès aux Séries de Données et aux Indicateurs / iHighest
Documentation sur MQL5: Accès aux Séries de Données et aux Indicateurs / iHighest
  • www.mql5.com
iHighest - Accès aux Séries de Données et aux Indicateurs - Référence MQL5 - Référence sur le langage de trading algorithmique/automatisé pour MetaTrader 5
 

Bonjour et merci 
Je trouve que cette doc n'est pas assez précise surtout ce qui oblige à toutes les tester

Du coup toutes les ambiguïtés sont autant de bugs à chercher

Et pour vous reprendre, il n'est pas précisé si les fonctions sont obsolètes ou des recommandations à utiliser une version plus récentes

Merci et très belle journée
William

 
William210 #:

Bonjour et merci 
Je trouve que cette doc n'est pas assez précise surtout ce qui oblige à toutes les tester

Du coup toutes les ambiguïtés sont autant de bugs à chercher

Et pour vous reprendre, il n'est pas précisé si les fonctions sont obsolètes ou des recommandations à utiliser une version plus récentes

Merci et très belle journée
William

Certes la documentation pourrait souvent être plus claire, mais il faut faire avec malheureusement.

N'hésitez pas à demander sur le forum en cas d'ambiguïté.

Raison: