Le changement de TF est un problème

 
En fait le problème est que l'indicateur qui trace la ligne quand il change le TF où l'historique n'est pas encore chargé, puis il calcule les données, puis les barres sont ajoutées au graphique, et il calcule les données à nouveau, respectivement les précédentes sont aussi laissées de côté + sauts.
 
Vasyl Nosal:
Le problème est que l'indicateur , qui trace la ligne lorsqu'il change le TF, sur lequel l'historique n'est pas encore chargé, calcule les données, puis les barres sont ajoutées au graphique, et il calcule à nouveau les données, respectivement, les précédentes sont également laissées de côté.

Il y a donc une erreur dans la logique de l'indicateur. Lors du chargement de l'historique, l'option idéale de l'indicateur : calculer son état au moment de la dernière barre, qui n'a pas changé dans l'historique et recalculer les données sur la partie actualisée de l'historique.

En réalité, cette option n'est pas toujours possible, car pour retourner l'environnement de l'indicateur sur une certaine barre, il faudrait effectuer le calcul depuis le début de l'historique. Par conséquent, dans les algorithmes complexes de l'indicateur, un recalcul complet de l'historique est effectué lors du chargement d'une seule barre (à ne pas confondre avec l'ouverture d'une nouvelle barre).

 
Vasyl Nosal:
En fait le problème est que l'indicateur qui trace la ligne au changement de TF, sur lequel l'historique n'est pas encore chargé, calcule les données, puis les barres sont ajoutées au graphique, et il calcule à nouveau les données, respectivement, les précédentes sont également laissées de côté + saut.

Dans l'indicateur, la vérification doit être faite dans OnCalculate() :

if(prev_calculated==0)  // значит история изменилась или это первый проход
 
Karputov Vladimir:

L'indicateur dans OnCalculate() doit vérifier :

Merci.

J'étais juste confus par le fait que les alertes m'indiquaient que l'histoire était chargée par morceaux.

Oui. C'est ça.

 
Ihor Herasko:

Il y a donc une erreur dans la logique de l'indicateur. Lors du chargement de l'historique, l'option idéale de l'indicateur : calculer son état au moment de la dernière barre, qui n'a pas changé dans l'historique et recalculer les données sur la partie actualisée de l'historique.

En réalité, cette option n'est pas toujours possible, car pour retourner l'environnement de l'indicateur sur une certaine barre, il faudrait effectuer le calcul depuis le début de l'historique. Par conséquent, avec tout algorithme sophistiqué de l'indicateur, un recalcul complet de l'historique est effectué lors du chargement d'une seule barre (ne pas confondre avec l'ouverture d'une nouvelle barre).

Donc la seule solution viable est seulement ?

for(int i=rates_total-prev_calculated;i>=0;i--)

 
Vasyl Nosal:

Donc la seule solution qui fonctionne est...

for(int i=rates_total-prev_calculated;i>=0;i--)

Et si j'ai besoin de recalculer non seulement la barre courante mais aussi la barre 4, par exemple ?

for(int i=rates_total-prev_calculated+4;i>=0;i--) 

{ 

if(i>Bars) i=Bars; 
 

Oui, ça marche.

Lorsque les barres sont chargées par morceaux, elles sont recalculées par morceaux.

Le bon morceau est seulement le dernier à être chargé plus à gauche haha.

 
Vasyl Nosal:

Oui, ça marche.

Lorsque les barres sont chargées par morceaux, elles sont recalculées par morceaux.

Le bon morceau est seulement le dernier à être chargé plus à gauche haha.

Il est temps d'apprendre à écrire des indicateurs.
 
Victor Nikolaev:
Il est temps d'apprendre à rédiger des indicateurs.

Apprends-moi.

Et je dis que les développeurs devraient faire des ajustements dans les premiers calculs de l'indicateur.

 
Victor Nikolaev:
Il est temps d'apprendre à écrire des indicateurs

Tu veux un truc ? Devinez ce qu'Alert a rendu ?

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(prev_calculated!=0) Alert(prev_calculated," M:",Period());
return(rates_total);
  }

 
Vasyl Nosal:

Tu veux un truc ? Devinez ce qu'Alert a rendu ?

Je n'utilise pas les alertes dans les indicateurs. Prévoir un nouveau calcul complet en cas de téléchargement de l'historique. Il est facile à contrôler.

Raison: