Un EA fonctionne dans le test visuel MT5, mais pas dans une passe sans affichage. Avant de changer la stratégie, demandez si la décision dépend d'une valeur de données ou d'un objet dessiné sur le graphique. Comparez modes, versions, données et première divergence enregistrée. Le modèle de cette page ne lance pas MT5 et ne place aucun ordre.

Ce qui diffère réellement avec l'affichage

La documentation MQL5 indique que, hors mode visuel, les objets graphiques ne sont pas tracés et les requêtes portant sur les propriétés d'un objet créé renvoient des valeurs nulles au sens numérique, c'est-à-dire zéro. Cette limitation ne s'applique pas au mode visuel. Il s'agit d'un comportement documenté, pas d'une expérience effectuée sur votre EA ni d'une explication universelle des écarts.

Si le programme lit le prix d'une ligne ou l'état d'un bouton, consignez cette lecture séparément des prix ou indicateurs. Vérifiez d'abord si l'entrée attendue existe et si la fonction réussit. Un statut explicite d'indisponibilité évite d'accepter un zéro technique comme prix. Un graphique visible ne prouve pas que toutes les entrées sont prêtes.

Séparer nombre disponible et objet graphique

Simulation pédagogique sans trading : signal numérique déclaré 1,1050, seuil 1,1040, condition strictement « signal supérieur au seuil ». Le signal explicite satisfait la condition. Notre chemin objet indisponible conserve null, et ne compare rien. Ces valeurs ne sont ni cotations MT5 ni journaux d'exécution.

Une entrée absente n'est pas un prix zéro

Nombre, absence et substitution erronée

Nombre, absence et substitution erronéeSignal 1,1050 supérieur au seuil 1,1040 : vrai. Objet indisponible représenté parnull dans notre modèle : comparaison non évaluée. Variante erronée remplaçant par zéro : faux apparent. Aucun ordre.EntréeCondition > 1,1040Nombre 1,1050SatisfaiteAbsence : nullNon évaluéeSubstitution fautive : 0Faux apparentUn résultat faux et une donnée absente sont distincts.
Null est notre représentation pédagogique ; ce n'est pas le type de retour affirmé pour une fonction d'objet MT5.

Faites défiler horizontalement ou agrandissez le schéma pour lire les détails.

Vrai, faux ou non évaluéSignal fictif 1,1050,seuil 1,1040 ; null représente absence dans notre modèle.EXEMPLE DE CALCULNombre expliciteCondition satisfaiteObjet absentNon évaluéeZéro substituéFaux apparent
Vrai, faux ou non évalué. Signal fictif 1,1050,seuil 1,1040 ; null représente absence dans notre modèle.

Une donnée absente reste inconnue, même si la variante incorrecte donne faux avec zéro.

Nombre explicite
Condition satisfaite – 1,1050>1,1040.
Objet absent
Non évaluée – Null dans notre modèle.
Zéro substitué
Faux apparent – Défaut masquant l’absence.

Le chemin protégé reste inconnu ; la variante incorrecte calcule 0 > 1,1040 et donne un faux ordinaire. Sous la condition opposée « inférieur au seuil », ce zéro pourrait même satisfaire le critère. Ne réparez pas une entrée manquante avec une valeur arbitraire. Nombre et disponibilité répondent à deux questions différentes.

Séparer les données de l'objet de graphique

Cet exemple pédagogique fonctionne localement dans votre navigateur : sans connexion au compte ou à une API, transmission des saisies ou conservation persistante. Ne saisissez ni mot de passe ni données personnelles.

Cette page simule notre règle, sans tester un EA dans MT5. Utilisez des nombres positifs à point décimal, de 10⁻⁸ à 10⁸, au maximum 15 chiffres. L’objet indisponible est représenté par null dans notre modèle ; une variante erronée le remplace par zéro. Cela ne détermine pas la cause de l’échec de votre EA.

L'outil compare deux valeurs positives finies déclarées, dans l'intervalle 10⁻⁸ à 10⁸, avec au maximum quinze chiffres et point décimal à la saisie. En mode non visuel simulé, l'objet est indisponible ; dans l'autre, il transporte le signal. L'outil ne lit aucun graphique, ne crée pas de signal d'investissement et n'accède ni à un compte ni à une API. Les saisies ne sont ni transmises ni conservées de façon persistante par ce calcul local.

Contre-exemple EUR distinct : budget de perte de prix 20 EUR et estimation disponible de 18 EUR. Une règle « estimation inférieure au budget » est satisfaite. Si l'estimation manque, remplacer par zéro ferait encore dire oui, en cachant précisément l'information nécessaire. Zéro n'est acceptable que s'il s'agit réellement d'une estimation validée de zéro ; notre modèle ne calcule pas une taille ni les frais d'un ordre.

Enregistrer le mode sans négocier

MQL_TESTER, MQL_VISUAL_MODE et MQL_OPTIMIZATION décrivent l'environnement du programme ; TERMINAL_BUILD identifie le build. Enregistrez les lectures réelles plutôt que déduire le mode de l'apparence d'une fenêtre. Ces drapeaux seuls ne prouvent pas l'égalité des données ou paramètres.

Le petit EA autonome ci-dessous écrit la configuration dans OnInit et possède un OnTick vide. Il n'envoie ni ne modifie d'ordre et ne gère aucune position. Sauvegardez-le séparément comme fichier MQ5 et compilez votre propre exemplaire dans MetaEditor pour conserver les journaux réels. Les étiquettes techniques des champs restent inchangées pour rapprocher les sorties.

#property strict
int OnInit()
{
   PrintFormat("tester=%d visual=%d optimization=%d build=%d symbol=%s period=%d",
      (int)MQLInfoInteger(MQL_TESTER),
      (int)MQLInfoInteger(MQL_VISUAL_MODE),
      (int)MQLInfoInteger(MQL_OPTIMIZATION),
      (int)TerminalInfoInteger(TERMINAL_BUILD),
      _Symbol, (int)_Period);
   return INIT_SUCCEEDED;
}
void OnTick() {}

N'ajoutez pas un second OnInit dans un EA existant et ne remplacez pas son initialisation par cet exemple. Instrumenter un programme suppose de préserver son déroulement. La documentation décrit aussi une exception pour OnInit à la restriction de PrintFormat pendant l'optimisation ; absence de message à une autre étape ne prouve pas que cette étape n'a jamais été exécutée.

Trouver la première différence plutôt que le profit final

Préparez le registre des deux passes : modes, versions terminal et code, paramètres, symbole, période, modèle de ticks, début demandé et effectif, version des données, coûts et état initial. Gardez paramètres et identifiants de fichiers. Si les déclarations diffèrent, n'attribuez pas tout à l'affichage ; Même backtest, résultat différent : comparer les preuves facilite ce rapprochement.

Cherchez le premier stade où disponibilité ou valeur diverge : lecture réussie, timestamp, indicateur prêt, signal, condition ou décision. « Profit 120 au lieu de 80 » ne nomme pas ce stade. Préservez journaux et petit tableau de comparaison, avec identifiant d'observation, entrée demandée, heure ou rang et acceptation. Ne reconstituez pas des nombres jamais enregistrés. Une trace exhaustive sans identifiant stable peut masquer le premier écart plutôt que l'expliquer.

Reconcevoir la dépendance du signal

Le module de calcul devrait produire valeur explicite et statut de disponibilité ; la couche graphique affiche ce résultat. Désactiver le dessin ne change alors pas volontairement la source du signal. Testez données disponibles, absentes et valeur exactement égale au seuil. Avec comparaison stricte et deux valeurs égales, le résultat numérique est faux, tandis qu'une entrée absente reste non évaluée.

Éliminer cette dépendance ne garantit pas des tests entiers identiques : versions, données, coûts et autres dépendances restent à contrôler. Sans code source, adressez au développeur le registre des passes et la première divergence réellement documentée. N'utilisez pas une série d'ordres en réel comme substitut au diagnostic. Backtesting MT4 et MT5 : données, indices et horloges traite la préparation générale.

Trois contrôles à effectuer ensuite

  1. Préservez une paire de passes et marquez les champs non confirmés ; même nom d'EA ne prouve pas environnement identique.
  2. Comparez 1,1050 et 1,1040, puis deux valeurs égales ; vérifiez que l'objet indisponible reste null dans notre modèle.
  3. Dans une configuration séparée sans trading, relevez le premier stade divergent et son identifiant ; aucune instruction d'ordre n'est nécessaire.

Un Expert Advisor (EA), robot MetaTrader peut réussir ce contrôle sans être rentable. Un Backtest : test historique d’une règle honnête distingue ce que le programme documente, ce que notre modèle stipule et ce qui reste inconnu.