C'est peu être la définition du close qui te fais décaler la valeur, j'ai eu qq soucis avec ça.
Essayes de passer par les index de barres, pour croiser les résultats
Attention à ton As_Serie true ou false, ça change un peu les valeurs lol
0 la barre la plus ancienne ou la plus récente
Bonjour Gérard, après quelques recherches, j'ai l'impression qu'il faut traiter ces informations dans l'événement onCalculate pour tout ce qui touche à l'analyse des prix sur les charts.
ce que je ne comprends pas c'est s'il faut tout faire dans cet événement, et comment on le fait communiquer avec onTick ... ?
Et je découvre à l'instant que OnCalculate ne peut pas fonctionner avec EA.
Donc il faut forcément utiliser les Copy* ?
Re
Moi dans mes codes, pour diverses raisons, je préfère faire un indicateur et avoir accès à Oncalculate
Ca me permet de pouvoir vérifier assez facilement qu'il retourne bien ce que je veux.
Une fois fait, j'appelle cet indicateur via Icustom()
Tu peux passer aussi par IndicatorCreate()
Sinon effectivement tu passer par les copy mais comme dit, ton indicateur est alors dans l'EA et pour moi c'est foireux.
Pas facile à tester, à réutiliser, à maintenir, etc
Après différentes recherches sur le forum, voici le code que j'ai produit.
//+------------------------------------------------------------------+ //| Checks formation of Evening star candlestick pattern | //+------------------------------------------------------------------+ double candlePatternsHelper::isEveningStar() { MqlRates rates[]; int copied=CopyRates(NULL,0,0,3,rates); ArraySetAsSeries(rates,true); if(copied>2) { if ( (rates[2].close > rates[2].open) && // Check if the first candle is bullish (MathAbs(rates[1].close - rates[1].open) < (MathAbs(rates[1].high - rates[1].low) * 0.3)) && // Check if the second candle is a a little candle (MathAbs(rates[0].close - rates[0].open) > (MathAbs(rates[0].high - rates[0].low) * 0.7)) && // Check if the third candle is a a strong candle (MathAbs(rates[2].close - rates[2].open) > (MathAbs(rates[2].high - rates[2].low) * 0.7)) && // Check if the first candle is a a strong candle (rates[0].close < rates[0].open) && // Check if the third candle is bearish (rates[0].close < rates[2].close && rates[0].close > rates[2].open)) // Check if the third candle closes within the body of the first candle { Print("Evening Star : ", rates[1].high); // Create a rectangle object ObjectCreate(0, (string)rates[0].time, OBJ_RECTANGLE, 0, rates[2].time, rates[2].high, rates[0].time, rates[0].low); return rates[1].high; } } // No Evening Star pattern found return 0; }
A priori, si j'ai bien compris c'est la bonne façon de procéder.
Pour tester, j'ai ajouté un rectangle sur le graphique, et la plupart du temps j'obtiens bien mon résultat. Exemple :
En l'état du code écrit c'est bien le résultat attendu.
En revanche, de temps en temps j'obtiens un truc qui n'a rien à voir :
Et là j'avoue je ne comprends pas ... En gros, il y a tjs un problème avec la troisième bougie
--EDIT--
Je viens d'ajouter ce code :
Print("Candle 1 - Close : ", rates[2].close, " - Open : ", rates[2].close, " - High : ", rates[2].high, " - Low : ", rates[2].low); Print("Candle 2 - Close : ", rates[1].close, " - Open : ", rates[1].close, " - High : ", rates[1].high, " - Low : ", rates[1].low); Print("Candle 3 - Close : ", rates[0].close, " - Open : ", rates[0].close, " - High : ", rates[0].high, " - Low : ", rates[0].low);
Me renvoie ce résultat :
2023.08.22 11:24:21.795 2023.03.02 16:10:17 Candle 1 - Close : 0.6717 - Open : 0.6717 - High : 0.67176 - Low : 0.67081 2023.08.22 11:24:21.795 2023.03.02 16:10:17 Candle 2 - Close : 0.67157 - Open : 0.67157 - High : 0.67169 - Low : 0.67125 2023.08.22 11:24:21.795 2023.03.02 16:10:17 Candle 3 - Close : 0.6714 - Open : 0.6714 - High : 0.67156 - Low : 0.67137
Il s'agit de cette capture :
<0.3 c'est pour la bougie du centre, le corps doit faire -30% du haut et du bas.
>0.7 c'est pour les deux autres bougies, le corps doit faire +70% du haut et du bas.
Je crois que j'identifie le problème, mais j'ai besoin de confirmer :
rates[0] fait référence à la dernière bougie cloturée ou à la bougie en cours ? CF :
2023.08.22 11:28:43.765 2023.03.02 23:39:30 Candle 3 - Close : 0.67292 - Open : 0.67292 - High : 0.67306 - Low : 0.67291 2023.08.22 11:28:43.765 2023.03.02 23:39:59 Candle 3 - Close : 0.67294 - Open : 0.67294 - High : 0.67306 - Low : 0.67291
- 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
Bonjour,
J'ai un retour de valeur étonnant sur la fonction iClose. Et je constate une subtilité dans la documentation que je ne sais pas expliquer.
Lien vers la doc : https://www.mql5.com/fr/docs/series/iclose
C'est la seule qui soit déclarée ainsi dans l'exemple :
au lieu de (par exemple) :
D'autre part, le problème que je rencontre, c'est que la fonction ne me renvoie pas la valeur de la cloture que je retrouve sur le chart.
Par exemple sur une comparaison dans le cadre de la définition d'une Morning star, je vais avoir plusieurs Evening star dont la troisième bougie aura un prix de clôture supérieur au prix d'ouverture de la première.
VS les valeurs renvoyées dans le journal : (en analysant de près, il me renvoie dans ce cas spécifique la valeur du High)
Y a t-il une subtilité que je n'ai pas saisie ?
Merci d'avance de votre aide.