Un Expert Advisor MQL5 est un programme événementiel de MetaTrader 5. Il peut calculer des règles et envoyer des demandes de trade sous les permissions requises. Événement reçu, permission activée et opération exécutée ne sont pas la même chose. Attacher un EA ne constitue pas une preuve de résultat financier.

Ce qu’un EA peut faire et ce que son fichier ne révèle pas

MetaEditor compile MQ5 en EX5. Un exécutable peut être distribué sans source ; apprendre MQL5 ne révèle pas l’algorithme d’un EX5 opaque. Indicateur peut calculer et notifier avec d’autres événements et restrictions de trading ; dire « il ne fait que dessiner » serait trop étroit. MT4 a ses EA et son langage distincts ; d’autres systèmes emploient d’autres interfaces.

Trois valeurs copiées, mauvais choix de barre

Modèle source : CopyBuffer réussit start_pos=1,count=3 dans un tableau ordinaire sans AS_SERIES. Mémoire physique : shift 3=103 à index 0, shift 2=101 à index 1, shift 1=102 à index 2. La dernière close est 102, pas 103 ; shift 0 courante n’a pas été demandé. Test strict> 102,5 passe pour 103 mais pas 102.

Index zéro du tableau n’est pas forcément dernière barre close

Index zéro du tableau n’est pas forcément dernière barre closeCopyBuffer réussi depuis shift 1 pour trois éléments, tableau ordinaire sans AS_SERIES. Mémoire physique : index 0 shift 3 valeur 103 ; index 1 shift 2 valeur 101 ; index 2 shift 1 valeur 102. Dernière close 102, seuil strict 102,5 non dépassé, contrairement à l’ancienne 103.Copie complète ne signifie pas bon indexstart_pos=1, count=3, tableau sans AS_SERIESIndex 0 / shift 3Index 1 / shift 2Index 2 / shift 1103101102Dernière close : 102 ; shift 0 non demandé.103> 102,5 mais 102≤102,5 : sélection différente.
Valeurs fictives, trois copiées sans erreur ni résultat partiel. Ordre physique décrit pour ce tableau précis ; ne généralisez pas index 2 à toutes configurations.

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

Déclarez offset, buffer, quantité renvoyée et indexation du tableau. Une copie complète ne corrige pas une lecture de la mauvaise barre. CopyBuffer place le plus ancien élément au début de mémoire physique ; direction logique d’indexation reste à vérifier. Index 2 n’est pas une règle universelle pour autres configurations.

Volume confirmé et ordre des événementsDeux achats D1=0,04 etD 2=0,06 lot, suppression d’ordre distincte.EXEMPLE DE CALCULD1+D 20,10 lotORDER_DELETEStatut d’ordreRéponse incertaineRapprocher avant retry
Volume confirmé et ordre des événements. Deux achats D1=0,04 etD 2=0,06 lot, suppression d’ordre distincte.

La somme deal 0,10 ne doit pas être effacée par changement de statut.

D1+D 2
0,10 lot – 0,04+0,06.
ORDER_DELETE
Statut d’ordre – Ne signifie pas expositionzéro.
Réponse incertaine
Rapprocher avant retry – Deux 0,10 remplis feraient 0,20.

Initialisation, ticks et désinitialisation

OnInit prépare les ressources et signale l’échec si requis ; une réinitialisation peut le rappeler. OnTick traite NewTick du symbole du graphique attaché ; événement déjà en file ou en traitement empêche ajout d’un nouveau NewTick. Ce n’est pas un historique garanti de chaque tick. Timer, BookEvent, ChartEvent et autres événements peuvent être utilisés sans imposer OnTick à tout EA.

Désactiver AutoTrading interdit nouvelles demandes EA, mais ne stoppe pas ses calculs ni interrompt le handler courant. OnDeinit gère arrêt et motif avec ressources et état à préserver. OnTimer et OnTradeTransaction peuvent être essentiels. En multi-symboles, tick du graphique attaché ne prouve pas fraîcheur des autres séries.

CTrade facilite l’envoi, pas la certitude d’exécution

OrderSend true indique des vérifications et prise en charge, pas forcément fill. Examinez retcode et rapprochez ordres, deals et positions. OrderCheck est précontrôle, sans garantir l’état ultérieur. CTrade.Buy, Sell et PositionClose demandent également ResultRetcode et ResultDeal selon l’opération.

Modèle source : demande d’achat 0,10 lot, réponse locale incertaine. Recommencer sans rapprochement peut produire 0,20 si les deux remplissent. Absence de confirmation locale ne prouve pas absence d’action serveur. Modèle de notifications : D 1 achat 0,04,D 2 achat 0,06,puis ORDER_DELETE. Compteur erroné remis à zéro par suppression finit 0 ; ordre ORDER_DELETE,D1,D 2 finit 0,10. Somme de deals confirmés 0,10 dans les deux séquences.

Le statut d’ordre n’est pas l’exposition de position. Un ledger réel doit aussi gérer ventes, retournements, corrections et comptabilité du compte ; arrivée des notifications n’a pas de priorité garantie. Ajout de procédure : après reconnexion, comparez identifiants de deals, volume cumulé et état actuel avant de réémettre. Cette règle d’idempotence ne se prouve pas par un booléen de retour.

Tester sans réutiliser silencieusement les mêmes choix

Le StrategyTester utilise modes de ticks générés ou réels collectés par le courtier selon données. Gardez provenance, dates, contrats, coûts et mode ; les ticks réels ne sont pas un flux MetaQuotes universel. Optimiser et évaluer sur même histoire peut surestimer l’évidence, sans garantir une courbe lisse ou un futur échec.

Réservez une période inutilisée et conservez tous les essais. Retard simulé du testeur n’est pas mesure de toutes futures exécutions réelles. Backtester une stratégie : prix, coûts et fuites de données explique séparation développement/évaluation.

Répétabilité et surveillance sont des objectifs de conception

Deux cents trades mensuels, décisions rapides et travail nocturne peuvent être besoins, pas preuves d’avantage. Définissez entrées, événements, règles d’abstention et supervision. Les annonces inhabituelles demandent tests sans invalider toute automatisation par principe. Une courbe de marketplace ou un sondage de forum non identifié ne mesure pas performance future.

Construire ou acheter demande les mêmes contrôles critiques

Un petit projet vérifie règles précises ; ni trois à six mois ni programmation maison ne garantissent supériorité. Source permet revue mais pas résultat. AutoTrading local ne clôture pas les positions. Un stop ordinaire accepté par serveur peut rester actif terminal fermé, une sortie calculée uniquement par EA requiert programme et connexion.

L’hébergement MetaQuotes est un environnement migré séparé, trading automatisé permis ; bouton local ne l’arrête pas. VPS Windows est un autre service. Préparez redémarrage, données absentes, pas de volume invalide, réponse incertaine et modifications manuelles. En netting, stratégies sur même symbole partagent sa position nette ; MagicNumber ne crée ni capital ni marge séparés.

Handle créé : les valeurs sont-elles prêtes ?

BarsCalculated renvoie quantité calculée ou−1 en erreur ; vérifiez barre requise puis nombre réellement copié. Une lecture manquée n’est pas RSI zéro : zéro valide et absence de donnée sont états distincts. Contrôlez buffer et offset plutôt que remplacer un défaut par une observation extrême.

Tous les contrôles doivent réussir

Quatre contrôles avant une valeur exploitable

Quatre contrôles avant une valeur exploitableHandle valide, données calculées pour la barre requise, nombre de valeurs copié attendu, valeur valide non vide. Un handle seul ou EMPTY_VALUE ne suffit pas ; quarante-cinq valide est seulement une valeur fictive à évaluer.Disponible n’est pas égal à zéro1. Handle valide ?2. Barre requise calculée ?3. Nombre copié conforme ?4. Valeur non vide et valide ?Non → enregistrer l’absence.Oui partout → évaluer la règle.EMPTY_VALUE par défaut=DBL_MAX : un test fini seul ne suffit pas.
Étapes de contrôle du modèle, aucune connexion ni transaction. Le marqueur vide dépend aussi du contrat d’un indicateur personnalisé.

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

Quatre cas source demandent une valeur : Ahandle invalide, pas de lecture ; Bhandle présent mais 0 copié, attendre ; Cune valeur copiée égale EMPTY_VALUE, pas de signal utilisable ; Dune valeur valide 45, évaluation possible.45 est fictif, pas signal d’investissement. EMPTY_VALUE vaut par défaut DBL_MAX, nombre fini ; finitude seule ne suffit pas. Un indicateur personnalisé peut spécifier un autre marqueur vide.

Exercice : une valeur est copiée mais vide. N’évaluez pas le seuil ; enregistrez l’absence et réessayez à l’événement approprié après contrôle du contrat. Ne rejetez pas automatiquement tout zéro valide. EA et API : backtester les versions disponibles hors ligne traite disponibilité externe et EA limité au test visuel : séparer signal et objet graphique les dépendances graphiques.

Une première revue contrôlée

  1. Sur démo adaptée, chargez un exemple fourni, tel Moving Averageou MACD Sample, sur EUR/USDH 1 et lisez rapport, drawdown et PF ; aucun compte réel nécessaire.
  2. Lisez OnInit, OnTick et CTrade dans la documentation pour repérer événements et réponses.
  3. Écrivez données, entrée, sortie, taille et conditions d’abstention avec toute décision encore discrétionnaire.
  4. Testez acceptation des données, séquence d’événements, reprise et réponses incertaines. Durée dépend du périmètre, pas d’un mois garanti.

Robot MQL5 ou Python : tester les frontières et la reprise compare ensuite dépendances et validations des deux environnements sans désigner un langage toujours meilleur.