Mon indicateur disparaît chaque fois que je change de cadre temporel. - page 3

 

Salut SDC,

J'ai compris. Merci beaucoup.

s'il y a 100 bar, les taux totaux commencent de 0 à 99.

Au début, pre_cal =0 --> limit=100 bar - 0 =100.

for(int=1 to limit=100 ; I++)

à la toute fin, I=100(valeur de l'index) et il n'y a pas de barre 100.

Donc pour que le maximum soit I=99, j'ai mis limit -1 ;

Je me demande s'il existe une meilleure méthode.

De plus, ce qui me rend confus, c'est que dans de nombreux autres indicateurs, j'utilise la même approche et il n'y a pas de problème de dépassement de plage.

Aussi, merci pour l'onglet Expert.

SCFX


   int limit=rates_total-prev_calculated;
   if(limit<=0) limit=2;
//---
 
 for(int i=1;i<limit-1  ;i++)
{  if((High[i]-Low[i])==0) continue;

   if(   MathAbs(Close[i]-Open[i])/(High[i]-Low[i])<0.50     ) 
      boring[i]=Close[i];
 
scfx:

De plus, ce qui me rend confus, c'est que dans de nombreux autres indicateurs, j'utilise la même approche et il n'y a pas de problème de dépassement de plage.



Avant que le B600 ne soit hors de portée , ce n'était pas une erreur critique.
 
scfx:.

Par conséquent, pour que le maximum I=99, je mets la limite -1 ;

Je me demande s'il existe une meilleure méthode.

Votre code va maintenant dessiner l'historique du graphique à partir de la barre 1 sans erreur, mais il ne dessinera pas de nouvelles barres. Il y a de nombreuses façons de le coder en fonction de ce que vous voulez qu'il fasse. Regardez les indicateurs inclus dans metaeditor pour voir comment les codeurs MQ le font. Lorsque vous pourrez lire leur code et comprendre la raison de chaque ligne, vous n'aurez aucun problème à créer des indicateurs.

 

J'ai compris maintenant DDC.

Personnellement, c'est difficile à imaginer quand je lis le document. Je ne sais toujours pas pourquoi prev_calculated= Total_rates -1.

J'ai donc fait un exemple numérique ici. J'espère qu'il pourra aider quelqu'un de nouveau comme moi.

Normalement, nous voyons :

Limite= taux_total- prev_calculé ; //(no-1)

OU

for(i=1;i<limit;i++) or for(i=1;i<=limit;i++)

L'important est de s'assurer que LIMIT >=1. Dans ma situation, LIMIT=0 et donc, l'indicateur n'est pas REFESHED quand un nouveau tick arrive.

Pourquoi, voyons voir. (Je pense que la cause est le prev_calculé au moins dans mon cas)

En supposant que j'attache l'indicateur quand il y a 100 barres sur le graphique. Voici les valeurs des variables :

Premier tableau des valeurs
Variable
Total_rates 100
Index de la barre 0-99
prev_calculated 0
Limit 100
Loop i value 1-99

Tout est bon. La valeur apparaîtra pour la première fois de la barre 1 au début du graphique.Combien de barres ont déjà été calculées ? C'est un point critique de mon erreur et je ne suis pas 100% clair.

Quand une nouvelle barre commence, sur le graphique il y a maintenant 101 barres. L'indicateur n'est pas mis à jour sur la barre déjà fermée, qui est maintenant la barre 1.

Deuxième tableau de valeurs
Variable
Total_rates 101
Index de la barre 0-100
prev_calculated 99 OR 100 (voir ci-dessous)
Limite2 OU 1
Boucle i valeur 1à1 OU 1 à 0

En se basant sur le 1er tableau, l'indicateur calcule 99 barres (car il boucle de 1 à 99).
Cependant, dans le document il est dit : "MAIS si ce n'est pas le premier appel de start(), la valeur égale à Bars-1 sera retournée). Il renverra donc 101-1=100.
Cette seule barre différente cause des problèmes. Si le système renvoie 100 comme prev_calculé.
Vous voyez que, si prev_calculated=99, la boucle fonctionnera.
Cependant, il semble que prev_calculated = 100 et donc la boucle ne fonctionnera pas car la limite =0 ou -1 dépend.
Quelqu'un peut-il m'aider à voir la logique derrière le prev_calculated= Bars-1 dans ce cas ?

La solution est donc assez claire : Faire for(i=1 ; ___ celui-ci doit être supérieur à 1 pour (<) ou supérieur ou égal à 1 pour (<=)___ ; i++). Dans mon dernier code, il est égal à 0.

   int pcal=prev_calculated;
   
   if(prev_calculated>0)
   pcal--; 
      
   int limit=rates_total-pcal;
   for(int i=1;i<=limit  ;i++)	//it is <=


//--------------OR ------------------------

  int limit=rates_total-prev_calculated-1;
  if(limit<=0) limit=2; //NOT limit

for(int i=1;i<=limit  ;i++) //it is <=

J'espère que cela vous aidera.

SCFX

 

prev_calculé == taux_total

scfx:

J'ai compris maintenant DDC.

Personnellement, c'est difficile à imaginer quand je lis le document. Je ne sais toujours pas pourquoi prev_calculated= Total_rates -1.

SCFX

Créez un nouvel indicateur, mettez ce code dans la fonction de démarrage, attachez-le à un graphique de 1 minute et observez les alertes lorsque les ticks arrivent.

Alert("rt = ",rates_total,"  pc = ",prev_calculated);

Vous verrez que rates_total est le nombre actuel de barres.

prev_calculated est le nombre de barres qu'il y avait au tick précédent.

 
SDC:

prev_calculé == taux_total

Créez un nouvel indicateur, mettez ce code dans la fonction de démarrage, attachez-le à un graphique d'une minute et observez les alertes lorsque les ticks arrivent.

Vous verrez que rates_total est le nombre actuel de barres.

prev_calculated est le nombre de barres qu'il y avait au tick précédent.


Wow, c'est bizarre.

Dans le lien posté précédemment, ils disent que si : MAIS si ce n'est pas le premier appel de start(), la valeur égale à Bars-1 sera retournée.

Comment se fait-il qu'il renvoie Bars (Rate_totals).

 

Oui, je sais qu'on dit ça, mais ce n'est pas tout à fait exact.

Ce qui se passe réellement est le suivant.

rates_total == nombre total de barres lorsque le tick actuel est arrivé. prev_calculated == nombre total de barres lorsque le tick précédent est arrivé.

Barres dans le graphique État de l'indicateur rates-total prev-calculé rates_total-prev_calculated
1000 première exécution au chargement 1000 0 1000
1000 tic-tac suivant 1000 1000 0
1000 tic-tac suivant 1000 1000 0
1001 1er tick de la nouvelle barre 1001 1000 1
1001 tick suivant 1001 1001 0
1001 tic-tac suivant 1001 1001 0

Vous avez donc 3 états principaux de prev-calculated vs rates_total : indicateur chargé, ticks de milieu de barre, premier tick de la nouvelle barre.

prev_calculated == 0 à la première exécution car il n'y a pas eu de tick précédent depuis le chargement de l'indicateur.

De plus, si le graphique est modifié ou si un historique est ajouté, prev_calculated se remet à zéro.

La valeur de retour de OnCalculate n'est pas utilisée mais il est préférable d'utiliser le retour par défaut (rates_total) au cas où ils corrigeraient cela.

 
Barres dans le graphique Indicateur État taux-total pré-calculés taux_total-prev_calculé
1000 première exécution au chargement 1000 0 1000
Et la barre 1000 n'existe pas.

Je sais ce que dit la nouvelle documentation. Si vous le faites à leur manière, vous devez vérifier que prev_calculated est différent de zéro et ajuster rates_total - prev_calculated à la baisse de un. Cela revient à décrémenter la confusion indicateur_compté.
int OnCalculate(const int rates_total,
                const int prev_calculated, ...){
   #define LOOKBACK 1 // iMA(... iBar+1)
   int indicator_counted = prev_calculated;
   if(indicator_counted < LOOKBACK) indicator_counted = LOOKBACK;
   for(iBar = rates_total - 1 - indicator_counted; i>=0 i--){
      Buffer[iBar] = ...;
   }
   return(rates_total - 1); // Recalculate bar zero next tick.
}
Voir Afficher la progression de l'indicateur - MQL4 forum
 

Il n'y a aucun intérêt à faire return( rates_total - 1 ) la valeur de prev_calculated est la même que si c'était return(rates_total) indépendamment de ce que vous lui avez demandé de retourner.

 
SDC: Il n'y a aucun intérêt à faire return( rates_total - 1 ) la valeur de prev_calculated est la même que si c'était return(rates_total) indépendamment de ce que vous lui avez demandé de retourner.
Avez-vous signalé le problème au service d'assistance ?
Raison: