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
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.
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](https://c.mql5.com/36/61/documentation-sur-mql5-acc-s-aux.png)
- www.mql5.com
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
Merci pour le code encore une fois
Il fonctionne bien, à qq détails près, regarde sur l'eurusd en 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
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.
![MQL5 - Langage des stratégies de trading intégré au terminal client MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Vous acceptez la politique du site Web et les conditions d'utilisation
Voici mon code dans Oncalculate avec le test qui me montre que je n'ai pas le bon résultat
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