Fonction ihighest fonctionne mal ?

 
Bonjour
je dois faire erreur car je ne pense pas que la fonction native de MQL5 soit fausse, mais elle ne me retourne pas le bon résultat

Je voudrais faire un canal de donchian, donc sur DonchianPeriod j'ai besoin de savoir quel est le plus haut et ça merde

Voici mon code dans Oncalculate avec le test qui me montre que je n'ai pas le bon résultat

for(bar=first; bar<rates_total; bar++)
     {
      UpperBuffer[bar]=high[iHighest(NULL, 0, MODE_HIGH, DonchianPeriod, bar)];
      
      int highest_index = iHighest(NULL, 0, MODE_HIGH, DonchianPeriod, bar);
      double highest_value = high[highest_index];
      string str = StringFormat("iHighest travaillera sur l'intervalle [%d, %d] avec une valeur maximale de %lf à l'index %d. La valeur associée à chaque index est \n: ", bar - DonchianPeriod + 1, bar, highest_value, highest_index);
  
      for(int i = highest_index - DonchianPeriod + 1; i <= highest_index; i++)
      {
         str += StringFormat("%lf, ", high[i]);
      }
      Print(str);
  
     }

 Voici la sortie

     iHighest travaillera sur l'intervalle [1, 19] avec une valeur maximale de 1.117340 à l'index 19. La valeur associée à chaque index est 

     1.132220, 1.134620, 1.133150, 1.136460, 1.136000, 1.137500, 1.145250, 1.148160, 1.148250, 1.143410, 1.142110, 1.135680, 1.136870, 1.135950, 1.134470, 1.132800, 1.131040, 1.124300, 1.117340, 

La bonne réponse était 1,14825 à l'index 9

Pouvez vous m'aider ?

Ai-je mal compris la fonction ihighest ?

Qu'ai-je comme solution ?

Merci

 

Bonjour, vous vous compliquez un peu les choses. Essayez ceci pour analyser les choses qui se passent. (Comme je viens de Mql4 je suis rester sur 0=la bougie en cour pour me faciliter, mais chacun selon ses préférences)



int highest_index = iHighest(NULL, 0, MODE_HIGH, DonchianPeriod, 1);//On recherche le numero de la bougie qui a atteint le plus haut de 1 à DonchianPeriod( par exemple 20 ) = 5 par exemple

Print("highest_index= "+highest_index+" mais pour trouver notre bougie on utilisera "+(highest_index+1));

//Votre erreur vient surement de la:

double highest_value = high[rates_total-(highest_index+1)];//Notre variable vaut maintenant le plus haut de (rate_total - (notre bougie+1) du dessus donc rates_total-(highest_index+1))

Print("Valeur Plus Haut= "+highest_value+" à la bougie numero "+highest_index);

 

Bonsoir
Merci pour votre réponse
Comme dit sur un autre post, je suis débutant mais là sous MQL5 il me semble bien que dans oncalculate, hélas, la bougie 0 est à la plus ancienne mais ce n'est pas un gros souci
ce gros souci, c'est cette fonction ihighest qui pour moi, en l'état ne fonctionne pas


Comme montré dans le code, sur la même portion la constante high, et bien il ne me retourne pas le plus haut, mais autre chose 

En clair Ihighest ne trouve pas le plus haut, ni le plus bas d'ailleurs pour la fonction Ilowest que je n'ai pas testé, mais ça ne semble pas bon non plus


La question est 

est que certains d'entre vous on réussi à faire fonctionner ces deux fonctions avec un résultat juste ?
Si c'est le cas, je veux bien le code mais je pense que je n'aurai pas de réponse

car dans tous les codes que j'ai pu regarder, tous passe par ArrayMaximun qui est à mon sens moins performante

Merci

Donchian à travers ihighest

 
J'ai oublié que dans beaucoup de codes mql5 à télécharger. Aucun n'utilise cette fonction. Que beaucoup ont préféré faire leur propre fonction.
C'est tout de même un signe que cette fonction est buggée, non ?
 
William210 #:
J'ai oublié que dans beaucoup de codes mql5 à télécharger. Aucun n'utilise cette fonction. Que beaucoup ont préféré faire leur propre fonction.
C'est tout de même un signe que cette fonction est buggée, non ?

Oui 0 est la plus ancienne sous Mql5 mais quand vous faites une recherche avec  ihighest c'est l'inverse. https://www.mql5.com/fr/docs/series/ihighest

Avez vous essayé mon code? Il devrait fonctionner.

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
 
Bonsoir.
Pourriez vous le redonner votre ligne de code telque vous pensez quelle pourrait fonctionner dans la boucle for s'il vous plaît

 

Pourquoi faire une boucle ? L'objectif est de récupérer le plus de haut depuis un point X pendant Y Bougie. A moins de vouloir répéter le cycle avec d'autres points X ou Y je ne vois pas l'intérêt.

mais ok:

//+------------------------------------------------------------------+
//|                                                         aide.mq5 |
//|                                                   Kaliloup 2022. |
//|                                          https://www.kaliloup.fr |
//+------------------------------------------------------------------+
#property copyright "Kaliloup 2022."
#property link      "https://www.kaliloup.fr"
#property version   "1.00"
#property indicator_chart_window

int DonchianPeriod=20;
datetime TestNewBougie;
bool NewsBougie;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   TestNewBougie=iTime(Symbol(),_Period,0); 
   NewsBougie=false;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   if(TestNewBougie!=iTime(Symbol(),_Period,0)) // Si notre test est different pour la nouvelle bougie
     {NewsBougie=true; TestNewBougie=iTime(Symbol(),_Period,0); }//Si oui nouvelle valeur pour TestNewBougie est NewsBougie=true

   if(NewsBougie==true)
   {
   //Tableaux pour vos valeurs (j'aurais pu les mettres en globals et en dynamiques)
   double TableauPourMesPlusHautPrix[10],TableauPourMesPlusHautBougie[10]; for(int i=0;i<10;i++){TableauPourMesPlusHautPrix[i]=0;TableauPourMesPlusHautBougie[i]=0;}//Mis à zero des tableaux
   for (int i=0; i<10; i++)
      {
      int highest_index = iHighest(NULL, 0, MODE_HIGH, DonchianPeriod, i);//On recherche le numero de la bougie qui a atteint le plus haut de i à DonchianPeriod( par exemple 20 ) = 5 par exemple
      Print("highest_index= "+highest_index+" mais pour trouver notre bougie on utilisera rates_total-"+(highest_index+1));
      double highest_value = high[rates_total-(highest_index+1)];//Notre variable vaut maintenant le plus haut de (rate_total - (notre bougie+1) du dessus donc rates_total-(highest_index+1))
      Print("Valeur Plus Haut= "+highest_value+" à la bougie numero "+highest_index);
      TableauPourMesPlusHautPrix[i]=highest_value;TableauPourMesPlusHautBougie[i]=highest_index;//Je rempli mes tableaux au passage
      Print ("Entre La bougie "+i+" et la bougie "+(i+20)+" le plus haut est la bougie "+(highest_index+1)+ " pour une valeur de "+TableauPourMesPlusHautPrix[i]);
      Print ("En ilisible entre la bougie "+(rates_total-i)+ " et la bougie "+(rates_total-(i+20))+" le plus haut est la bougie "+(rates_total-(highest_index+1))+ " pour une valeur de "+TableauPourMesPlusHautPrix[i]);
      }
      
   }  
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Bonjour et merci.
La je ne vais pas avoir le temps car faut bien travailler, mais je regarde des que possible.

La boucle c'est parce que je veux toujours faire un canal de donchian

Très belle journée et merci encore
 

Bonjour 
Merci pour le code encore une fois 
Il fonctionne bien, à qq détails près, regarde sur l'eurusd en D1

EurSud D1

L'ancien plus haut était bien sur la bougie 17 dans le code

Là sur le graphe, un nouveau plus haut vient d'être fait et ça se voit bien dans les print et bougie 1 dans le code


Mais après il déconne et me redonne la 17 comme plus haut, alors que ce n'est plus vrai

Print

il met un peu de temps à corriger qq itérations plus loin, mais il continue à hésiter, alors qu'il n'y a pas la place et surtout ça ne devrait pas se présenter puisque le plus haut sur une période, devrait ne pas changer 

Je n'arrive pas à comprendre ta boucle For, c'est peut être ça

 for (int i=0; i<10; i++)
      {
      int highest_index = iHighest(NULL, 0, MODE_HIGH, DonchianPeriod, i)

Pourquoi 10 ?

Pourquoi pas DonchianPeriod qui vaut 20 ?

Merci pout ton aide précieuse

Belle journée

 

Je viens de regarder les captures d'écrans et je me rends compte qu'elles ne sont pas lisibles

Dans les grandes lignes, un coup il détecte la plus haute sur la dernière bougie, qq itérations plus loin et il dit que c'est une bougie plus anciennes et ce n'est pas possible, puis percute et me redonne la bonne bougie .....
Voilà

 

Bonjour, je vais regardais ceci plus en détail mais avant tout je corrige un oublie dans le code:

if(TestNewBougie!=iTime(Symbol(),_Period,0)) // Si notre test est different pour la nouvelle bougie
     {NewsBougie=true; TestNewBougie=iTime(Symbol(),_Period,0); }//Si oui nouvelle valeur pour TestNewBougie est NewsBougie=true
     else{NewsBougie=false;}

Comme tu peux le voir si NewsBougie reste constamment "true" alors forcement il affichera à chaque tick nos valeur, alors que pour la visibilité, je préfère afficher à chaque nouveau chandelier. (On verra après pour la détection en temps réel sur le chandelier en cours)

Ensuite le 10 dans ma boucle for est basé sur la taille de mes tableaux (Je t'ai expliqué (pourquoi faire une boucle alors?) , si ce n'est pour une chose concrète.) et ma boucle ici sert à remplir mes tableaux.

Et forcément à chaque augmentation de i, la recherche du plus haut sur le graphique et décalé d'un chandelier vers la gauche. (Vu que tu apprend j'essaie d'être le plus clair possible mais ca n'est pas évident, alors joue un peu avec le code pour le comprendre au mieux)

la valeur de i et DonchianPeriod sont 2 choses totalement différentes.

Raison: