L'indicateur se corrompt - page 6

 
Rosh:
Ok, je vais attendre

Après plus de 20 heures, l'indicateur fonctionne correctement. Je ne sais pas quoi dire.


 

Rosh, Zoom avant/arrière, défilement vers la gauche/droite. Quelle plate-forme testez-vous sur 64/32 bit ?

 
AnkaSoftware:

Rosh, Zoom avant/arrière, défilement vers la gauche/droite. Quelle plate-forme testez-vous sur 64/32 bits ?

Je peux reproduire le problème général sur 32 bits. La seule façon dont le système d'exploitation semble être pertinent est la question de savoir pourquoi votre système 64 bits semble obtenir périodiquement de nouvelles données au début ou au milieu de son historique de barres, alors que votre système 32 bits (et le système 64 bits de RaptorUK) ne le font pas. Quoi qu'il en soit, vous semblez avoir l'intention de donner votre indicateur à d'autres personnes, et les modifications de l'historique des barres sont des problèmes que vous rencontrerez certainement dans la vie réelle, ne serait-ce qu'en raison des déconnexions de courtiers subies par vos utilisateurs, qui entraînent l'insertion de barres manquantes au milieu de l'historique lors de la reconnexion.

Comme j'ai déjà essayé de l'expliquer, on peut se demander si ce "bug" se trouve dans votre code ou dans MT4. Il y a une attente sur la façon dont les indicateurs doivent se comporter dans MT4, et votre indicateur ne se comporte pas de cette façon. Par exemple, lorsque vous créez un nouvel indicateur en utilisant MetaEditor, il insère pour vous la ligne "int counted_bars=IndicatorCounted() ;". Vous supprimez cette ligne et ignorez IndicatorCounted().

Je peux reproduire le problème général en utilisant l'indicateur suivant qui dessine simplement une ligne entre les 10 derniers sommets des barres lorsqu'il démarre :

#property indicator_chart_window
#property indicator_color1 Red
#property indicator_buffers 1

double indicatorvalues[];

void init()
{
   SetIndexBuffer(0, indicatorvalues);
}

void start()
{
   static bool IsFirstCall = true;
   if (IsFirstCall) {
      IsFirstCall = false;
      for (int i = 0; i < 10; i++) {
         indicatorvalues[i] = High[i];      
      }
   }
}

Vous pouvez ensuite reproduire le même type de problème en faisant ce qui suit :

* Ouvrez un graphique pour n'importe quel symbole

* Ajouter l'indicateur au graphique

* Désactivez "Chart autoscroll" (juste pour faciliter les étapes suivantes ; pas parce que cela a un impact sur le problème).

* Allez au début du graphique, en appuyant sur Home.

* Appuyez sur Page Up pour forcer le téléchargement de données supplémentaires. (N.B. Il n'y a aucun problème à moins que des données supplémentaires soient effectivement ajoutées au graphique à ce stade).

* Allez à la fin du graphique en appuyant sur End. La ligne rouge entre les sommets ne sera pas positionnée. Elle aura été déplacée en arrière dans le temps.

(Tout ceci ne fait qu'étoffer ce que RaptorUK a déjà identifié).

 

OK, pouvez-vous confirmer que IndicatorCounted() retournera un nombre -ve, dans ce cas de barres manquantes / indicateurs corrompus ? Laissez-moi essayer de réinitialiser les tableaux d'indicateurs et de redessiner les mouvements à partir de la barre de retour.

 
AnkaSoftware:

OK, pouvez-vous confirmer que IndicatorCounted() retournera un nombre négatif, dans ce cas de barres manquantes / indicateurs corrompus ?

Non, ce qui se passe - comme je l'ai déjà dit à la page 5, et comme vous pouvez facilement le tester par vous-même - est que MT4 remet IndicatorCounted() à zéro lorsque de nouvelles barres sont ajoutées au début de l'historique en utilisant une méthode telle que celle ci-dessus. Cela entraîne un indicateur normal à redessiner toutes ses valeurs historiques, car il utilise généralement la différence entre Bars et IndicatorCounted() pour déterminer quelles barres sont "sales" et doivent être mises à jour. Si IndicatorCounted() est égal à zéro, l'indicateur recalcule donc chaque barre historique, c'est-à-dire parce que Bars - 0 = Bars.

La documentation de IndicatorCounted()(https://docs.mql4.com/customind/IndicatorCounted) fournit un exemple de cette méthode, et il existe d'autres versions, comme https://www.mql5.com/en/forum/132447, qui visent à améliorer très légèrement les performances parce que le code standard de https://docs.mql4.com/customind/IndicatorCounted recalcule inutilement une barre qui est "propre".
 

L'ajout des contrôles IndicatorCounted() et la réinitialisation des indicateurs lorsque IndicatorCounted() renvoie la valeur 0, résout le problème de décalage des indicateurs qui est causé par l'insertion de barres historiques ou supplémentaires.

Cependant, il existe un autre problème de corruption des indicateurs, qui ne semble pas être causé par l'insertion de barres d'historique. L'exemple de code ci-joint permet de reproduire le problème, vous devez l'exécuter pendant plus de 10 heures, jusqu'à au moins deux réinitialisations des indicateurs, c'est-à-dire que IndicatorCounted() renvoie la valeur 0 (après le démarrage de l'indicateur).

Dossiers :