Repaint Inspector
- Utilitaires
-
Quoc Dat Quach
Software engineer with 8 years in fintech and mobile, writing MQL4/MQL5 since 2017. I build Expert Advisors, indicators, trade and risk-management panels and utilities for MT4/MT5, and I trade forex and gold on MT5 myself. - Version: 1.0
Repaint Inspector mesure si un indicateur se redessine, au lieu de croire cette affirmation sur parole. Vous l'attachez à un graphique, vous indiquez n'importe quel indicateur personnalisé et sa liste de paramètres, et il relit les buffers de cet indicateur sur des barres déjà clôturées, en comptant chaque valeur qui bouge, chaque valeur qui apparaît et chaque valeur qui disparaît, ainsi que la profondeur dans l'historique à laquelle cela se produit encore.
C'est un outil de mesure. Sur un graphique, il n'envoie jamais d'ordre. Dans le Testeur de Stratégie, il ouvre et ferme une position au volume minimum au démarrage, car le test automatique du MQL5 Market vérifie qu'un Expert Advisor effectue une opération de trading ; ce trade est annoncé dans le journal, ne fait pas partie de la mesure, et un paramètre d'entrée permet de le désactiver. Il n'utilise aucune DLL ni aucun accès réseau, et n'écrit rien sur le disque à part ses deux fichiers CSV dans MQL5\Files.
Raison d'être : l'absence de redessin est une affirmation courante dans la description d'un indicateur, et difficile à vérifier. Le test habituel consiste à regarder le graphique, à retenir à peu près où se trouvaient les flèches, à recharger et à regarder de nouveau. Ce test passe à côté des deux cas qui coûtent de l'argent. Le premier est une valeur, sur une barre clôturée depuis un certain temps, qui change pendant que le graphique reste ouvert : la flèche se déplace de quelques pixels, ou elle est supprimée pendant que votre attention se porte sur le bord droit. Le second est un indicateur qui se comporte correctement tant qu'il reste chargé et qui publie un historique différent après avoir été rechargé, ce qui est exactement ce que produisent chez un utilisateur un changement d'unité de temps, un redémarrage du terminal ou un nouveau graphique. Les deux sont mesurables.
Définition de la mesure, c'est-à-dire la partie qui détermine si le résultat a un sens :
- Une barre est identifiée par son heure d'ouverture, jamais par son décalage (shift), de sorte que les nouvelles barres, le défilement et les remplissages de l'historique ne peuvent pas être pris pour un changement.
- Seules les barres clôturées sont comparées, décalage 1 et au-delà. La barre encore en formation change par définition et n'indique rien sur le redessin.
- La première valeur vue pour une barre clôturée devient la référence. Chaque lecture ultérieure est comparée à la lecture précédente, ce qui compte un événement, et, chaque fois qu'un événement est ainsi compté, à la première lecture, ce qui mesure la dérive.
- Trois types d'événements sont comptés séparément, car ils ne sont pas aussi graves les uns que les autres. Changed : une valeur est passée à une valeur différente. Appeared : un emplacement vide a reçu une valeur, donc un signal s'est matérialisé sur une barre déjà clôturée. Vanished : une valeur publiée a été effacée, c'est le type grave, car le signal sur lequel un trader a agi ne figure plus dans l'historique que voit le lecteur suivant.
- Le chiffre principal est MaxShift, le plus grand décalage auquel un événement, quel qu'il soit, a été observé. Un indicateur qui ne redessine que la dernière barre clôturée est d'une tout autre nature qu'un indicateur qui réécrit quinze barres.
- Chaque événement est écrit dans un fichier CSV avec l'heure de détection, l'heure de la barre, le décalage au moment de la détection, le buffer, le type d'événement, l'ancienne et la nouvelle valeur, le delta, la dérive par rapport à la première lecture et un marqueur « après rechargement », afin que le rapport puisse être recompté au lieu d'être cru sur parole. Un second fichier contient une ligne par buffer avec tous les compteurs, actualisé toutes les 15 secondes tant que l'exécution se poursuit.
- L'indicateur testé est créé avec IndicatorCreate à partir d'une liste de paramètres analysée, de sorte que n'importe quel indicateur personnalisé peut être inspecté sans rien modifier ni recompiler. La liste analysée est affichée dans le journal au démarrage, ce qui rend une liste de paramètres erronée visible au lieu de silencieuse.
- Le handle peut être libéré puis recréé toutes les N minutes, en conservant délibérément l'historique enregistré, afin de détecter l'indicateur qui reste tranquille tant qu'il est chargé et publie un passé différent après un rechargement. Le terminal ne recalcule lors d'un rechargement que si aucun autre programme ne détient le même indicateur avec les mêmes paramètres ; retirez donc cet indicateur de vos graphiques pendant ce test.
- Une vérification est écartée et comptée comme ignorée, et non comme une preuve, chaque fois que le handle n'existe pas encore, que l'indicateur n'est pas encore calculé, qu'il y a moins de barres clôturées que la profondeur surveillée (lors de la première vérification exploitable, la profondeur elle-même est ramenée à l'historique disponible, et le journal l'indique), qu'un buffer ne peut pas être copié, ou que la série se décale entre la lecture des heures et la lecture des valeurs.
Mesures effectuées avec des indicateurs fournis avec le terminal, afin que chacun puisse les reproduire. Quatre copies sur quatre graphiques d'un même terminal, XAUUSD M1, 1 heure 26 minutes, 300 barres clôturées surveillées, une vérification par seconde :
- Examples\ZigZag (12,5,3) : 1 315 713 comparaisons par buffer, 0 valeur modifiée, 0 apparue, 17 disparues sur le buffer tracé avec MaxShift 15, ainsi que 3 et 10 disparues sur les deux buffers de calcul. Rien n'a bougé, car un extrême du ZigZag est le plus haut ou le plus bas de sa barre et ne peut pas dériver ; il est supprimé puis republié ailleurs.
- Examples\Custom Moving Average (13,0,2) : 1 305 513 comparaisons, pas un seul événement.
- Examples\Fractals : 25 événements sur 1 303 713 comparaisons, tous de type Appeared, aucun Changed, aucun Vanished, tous au décalage 3. Ce n'est pas du redessin mais une confirmation tardive, puisqu'une fractale a besoin de deux barres supplémentaires avant de pouvoir être tracée. La ligne de verdict affiche tout de même REPAINTS, car l'outil rapporte ce qu'il a vu et vous laisse juger : des événements qui sont tous Appeared à un seul décalage fixe signifient un indicateur utilisable avec un retard connu, des événements Vanished à des décalages dispersés, non.
- La quatrième copie a fait tourner le même ZigZag avec 0.0 compté comme une valeur ordinaire au lieu d'une absence de valeur : 1 308 513 comparaisons, 32 événements, tous Changed, le même MaxShift de 15, et un plus grand delta absolu de 4184,088, soit le prix de l'or, car chaque suppression est désormais un pic remplacé par 0.0. Le même redessin, sous un autre nom.
Ces trois exécutions ZigZag, moyenne mobile et Fractals ont effectué 4 387, 4 353 et 4 347 vérifications. Le même outil dans le Testeur de Stratégie comprime une journée en quelques secondes : le même ZigZag sur une journée de trading de XAUUSD M1, en modélisation OHLC 1 minute, a donné 5 512 vérifications, 1 651 923 comparaisons, 342 valeurs disparues et 3 apparues sur des barres qui étaient clôturées à ce moment-là, 343 barres distinctes touchées, et un MaxShift de 28.
Vérification indépendante des compteurs. Une réimplémentation indépendante en Python de Examples\ZigZag a été exécutée sur les bougies brutes récupérées depuis le terminal, puis comparée aux fichiers d'événements. Exécution en direct : pour chacune des 17 barres où le buffer tracé a perdu une valeur, cette valeur est absente du rejeu, et pour les 17, la dernière lecture de l'outil est égale à la valeur rejouée. Exécution dans le testeur : 343 barres avec événements, dont 341 barres ayant perdu une valeur ; les deux mêmes contrôles, aucune divergence. Les nombres de comparaisons concordent également : 87 nouvelles barres M1 se sont ouvertes pendant l'exécution en direct, et (vérifications moins 1) fois 300 moins 87 reproduit exactement chaque nombre de comparaisons rapporté.
Paramètres d'entrée : le chemin iCustom de l'indicateur à inspecter et ses paramètres sous forme de liste séparée par des virgules, le nombre de buffers à surveiller (1 à 32), le symbole et l'unité de temps si vous voulez inspecter d'autres valeurs que celles du graphique, le nombre de barres clôturées surveillées (300 par défaut), le nombre minimum de secondes entre deux vérifications (1 par défaut, temps modélisé dans le testeur), une tolérance absolue en dessous de laquelle un changement est ignoré, une option qui traite 0.0 comme une absence de valeur pour les buffers de type flèche et ZigZag (activée par défaut), l'intervalle de recréation du handle, un arrêt optionnel après N minutes, l'option CSV, le nom de fichier et la limite de lignes, les réglages du panneau (afficher ou masquer, coin, décalages, taille de police et cinq couleurs), et l'option du trade témoin dans le Testeur de Stratégie décrit plus haut. Chaque paramètre d'entrée est documenté par son propre commentaire dans le terminal. Le chemin est vide par défaut, volontairement : si rien n'est renseigné, l'outil l'indique dans le journal et sur le panneau et ne mesure rien, plutôt que de pointer vers un indicateur qui n'est peut-être pas présent sur votre terminal.
Limites, énoncées clairement. L'outil ne peut pas prouver l'absence de redessin ; il peut seulement ne pas en trouver sur la période mesurée, c'est pourquoi le nombre de comparaisons figure à côté de chaque verdict. Il échantillonne à l'intervalle de vérification, de sorte qu'une valeur qui apparaît et disparaît à l'intérieur d'un même intervalle peut être manquée : c'est arrivé une fois au cours de l'heure et demie ci-dessus, où les deux copies de ZigZag, lancées à 14 secondes d'écart, divergent sur une barre (03:32, sur deux buffers) dont la valeur a existé pendant moins d'un intervalle de vérification, si bien qu'une copie l'a échantillonnée et l'autre non. Il mesure ce qu'un indicateur publie via ses buffers, donc un indicateur qui dessine des objets graphiques au lieu de remplir des buffers lui est invisible. Dans le Testeur de Stratégie, l'indicateur testé doit être présent et compilé avant le début de l'exécution : le testeur traite un échec d'IndicatorCreate comme une erreur critique et décharge l'expert, ce qu'aucune gestion d'erreur à l'intérieur de l'outil ne peut changer. Sur un graphique en direct, le même chemin erroné n'est pas fatal, l'outil reste attaché et réessaie toutes les 30 secondes, de sorte que le paramètre d'entrée peut être corrigé sans retirer l'outil.
Le trade témoin dans le Testeur de Stratégie utilise le volume minimum du symbole, est envoyé sans stop loss ni take profit, et la marge est vérifiée par rapport à la marge libre avant l'envoi, de sorte qu'un petit dépôt de test produit une ligne de journal au lieu d'un ordre rejeté. Il porte son propre magic number, il est refermé à un tick ultérieur, et aucun compteur, verdict ou ligne CSV de la mesure n'est affecté par lui. Mesuré avec un dépôt de 1000 USD dans le testeur : un trade, deux transactions, 0,06 USD de coût, et avec Examples\ZigZag testé sur la même plage, chaque compteur de redessin correspondait à la version qui ne contient aucun code de trading, jusqu'aux 3 404 353 comparaisons, aux 10 valeurs disparues et au MaxShift de 17.
Limites pratiques. Le nombre de barres multiplié par le nombre de buffers ne peut pas dépasser 200 000 emplacements, ce qui est une protection de la mémoire ; au-delà, la profondeur est réduite et une ligne est écrite dans le journal. C'est un Expert Advisor, il occupe donc l'unique emplacement d'expert du graphique : une copie par graphique, pas sur un graphique où tourne votre propre expert, mais plusieurs graphiques peuvent faire tourner des copies en même temps. Ne demandez que des buffers que l'indicateur possède réellement, car un buffer inexistant fait échouer chaque vérification, et après cinq lignes de journal ces échecs sont seulement comptés comme ignorés. Un fichier CSV portant un nom de votre choix est écrasé à chaque démarrage ; le nom automatique contient la minute de démarrage. Dans le Testeur de Stratégie, les fichiers sont écrits dans le dossier MQL5\Files propre à l'agent de test, et non dans celui du terminal, et un redessin observé dans le testeur et un redessin observé en direct ne sont pas automatiquement la même chose - quand la réponse compte, lancez-le en direct. Enfin, l'outil ne dit rien sur l'intérêt de trader un indicateur : un indicateur qui ne se redessine pas peut tout de même être inutile, et certains indicateurs qui se redessinent sont utilisés délibérément et correctement.
