Mon scalpeur exploite deux configurations : un bloc d’ordres haussier et son pendant baissier. Le testeur de stratégie m’a donné un seul facteur de profit pour les deux. J’ai passé deux semaines à ajuster les paramètres qui s’appliquaient de la même manière à chaque configuration.
J’ai ensuite séparé les transactions par type de configuration. Sur la paire USDCAD en M1, le côté haussier avait généré 88 % des pertes. Le côté baissier était quant à lui proche de l’équilibre. Le chiffre dont j’avais besoin se trouvait dans mon propre historique de trading depuis le début. Je n’avais simplement pas les moyens de l’interpréter.
Ce cours vous apprend à l’interpréter.
Vous enregistrez vos types de configuration une seule fois au démarrage. Chacun d’entre eux se voit attribuer un identifiant. Cet identifiant est ajouté à votre base de nombres magiques, de sorte que chaque commande porte sa propre balise de configuration dès son envoi.
Par la suite, le registre répond à trois questions pour chaque configuration : combien de gains et de pertes ; quel a été le résultat net après swap et commission ; et si le taux de réussite a déjà suscité suffisamment de confiance.
C’est pour répondre à cette dernière question que j’ai développé ce programme. Trois gains sur trois transactions correspondent à un taux de réussite de 100 %. C’est également le résultat obtenu environ une fois sur douze par une pièce de monnaie qui tombe côté face 44 % du temps. La classe affiche donc une limite inférieure du score de Wilson à côté du taux brut et la compare au seuil de rentabilité exigé par votre ratio de récompense. Avec un rapport de 1:2, ce seuil est fixé à 33,3 %. Une stratégie n’est considérée comme fiable que lorsque même son taux pessimiste dépasse ce seuil. Au début, tout indique « pas encore fiable ». C’est la réponse honnête lorsque l’on ne dispose que de vingt transactions.
#include <CSetupLedger.mqh> CSetupLedger ledger; int SETUP_BULL, SETUP_BEAR; int OnInit() { ledger.Init(552001); // ta base magique SETUP_BULL = ledger.Register("Bullish OB"); // id 0 -> magic 552001 SETUP_BEAR = ledger.Register("Bearish OB"); // id 1 -> magic 552002 ledger.RebuildFromHistory(); // lire l'enregistrement du compte Print(ledger.Report(2.0)); // 2,0 = rapport risque/rendement return INIT_SUCCEEDED; }
Apposez le label de configuration sur la transaction avant que l'ordre ne soit passé.
trade.SetExpertMagicNumber((ulong)ledger.MagicFor(SETUP_BULL));Liquidez la position dès sa clôture.
double net = 0.0; if(ledger.ProcessClosedPosition(posId, setupId, net)) Print(ledger.Report(2.0));
La fonction Report() renvoie un bloc de texte. Elle fonctionne comme une fonction Print () et comme une fonction Comment (). Voici un exemple concret de mon utilisation sur la paire USDCAD en M1.
Per-setup ledger (breakeven win rate at 1:2.0 = 33.3%) --------------------------------------------------------------------- Bullish OB 235/529 raw 30.8% wilson 27.6% net -5819.94 not yet trusted Bearish OB 191/393 raw 32.7% wilson 29.0% net -811.42 not yet trusted

Le même rapport transmis à Comment () s'affiche dans le coin du graphique pendant l'exécution de l'EA. La case sur la barre correspond à l’étiquette d’entrée. Elle indique les performances de cette configuration avant que la transaction ne soit effectuée. Ici, le panneau affiche 4 gains et 6 pertes. Taux brut : 40 %. Limite inférieure de Wilson : 16,8 %. Ainsi, sur dix transactions, le verdict reste « pas encore fiable », ce qui est justement l’objet de cette colonne.
Les chiffres correspondent au nombre de gains par rapport aux pertes. On compte donc 764 transactions sur la configuration haussière et 584 sur la configuration baissière. Les deux résultats nets s’ajoutent à la perte nette du testeur, au centime près. Effectuez ce rapprochement sur vos propres résultats avant de vous fier à n’importe quel relevé, y compris celui-ci. Si le total des transactions par configuration ne correspond pas au nombre de transactions du testeur, cela signifie que les positions ont été mal comptabilisées et que tout pourcentage supérieur à cette ligne n’a aucune valeur.
Les versions manuscrites de ce calcul comportent généralement des erreurs à ce sujet. J'en ai moi-même commis deux avant la création de ce cours.
Les transactions ne sont pas des opérations. L'historique MT5 est une liste de transactions. Une position clôturée en trois étapes génère trois transactions « OUT ». En parcourant les transactions, on compte chaque transaction rentable comme une victoire, et une seule opération gagnante devient ainsi trois victoires. Le registre effectue l'agrégation par DEAL_POSITION_ID , de sorte qu' une clôture partielle ne compte qu'une seule fois.
DEAL_PROFIT ne correspond pas au résultat. Le swap et la commission figurent dans leurs propres champs. Sur un EA de swing, cette différence est purement cosmétique. Sur un scalper, elle détermine si la transaction a généré un profit ou non. Une transaction qui a généré un gain de 3 USD sur la variation de cours et pour laquelle 4 USD de commission ont été payés est une perte. Le registre additionne le bénéfice, le swap et la commission.
POSITION_TICKET n’est pas POSITION_IDENTIFIER . La fonction HistorySelectByPosition () requiert l’identifiant. La plupart du temps, ces deux éléments ont la même valeur sur un compte de compensation ; le bug reste donc invisible jusqu’à ce qu’un compte de couverture ou une clôture partielle les sépare. La sélection renvoie alors un résultat vide et ne fournit aucune information.
L'ordre d'enregistrement est un format de données. L'identifiant de configuration n'existe nulle part ailleurs que dans les numéros magiques des transactions déjà clôturées. Insérez une nouvelle configuration au milieu de la liste le mois prochain, et toutes les transactions historiques de la configuration qui détenait auparavant cet identifiant deviendront silencieusement des transactions de la nouvelle. Aucune erreur n'est signalée. Les chiffres sont simplement erronés à partir de ce moment-là.
Les nouvelles configurations doivent être placées à la fin de la liste. Si vous retirez une configuration, laissez son appel à `Register () ` à sa place afin que l’identifiant reste attribué. Un bref commentaire au-dessus du bloc d’enregistrement expliquant cela est tout à fait utile.
Il ne conserve qu’un seul enregistrement par position. Un EA qui ajoute une deuxième entrée à la même position nette attribuera l’intégralité de celle-ci à la première configuration. Si le vôtre agit ainsi, il doit plutôt utiliser un modèle par transaction.
Le nombre maximal de configurations est de seize. Augmentez la valeur de SETUP_LEDGER_MAX si vous avez besoin de plus. Seize configurations sur un même compte correspondent également à seize petits échantillons, ce que la colonne « Wilson » vous indiquera.
Un résultat net exactement égal à zéro est considéré comme une perte. Les transactions sans gain ni perte sont rares et les traiter comme des gains est l’erreur la plus flatteuse.
La fonction ProcessClosedPosition() remplace la sélection globale de l'historique, car elle appelle la fonction HistorySelectByPosition (). Ne l'appelez pas au milieu de votre propre boucle d'historique sans effectuer une nouvelle sélection par la suite.
De plus, cette fonction évalue vos sorties plutôt que votre idée. Une configuration qui identifie correctement la direction mais place mal son stop est considérée comme une mauvaise configuration. Pour décider quoi négocier demain, c’est sans doute la bonne réponse. Cela ne revient pas à juger si l’idée était valable.
MetaTrader 5. Aucune dépendance en dehors de la bibliothèque standard. Placez le fichier dans MQL5/Include/ et incluez-le. Écrit et testé sur la version 6190.
Une dernière chose. Un registre créé à partir d'un seul backtest « in sample » évalue ce backtest. Il ne valide pas une stratégie. Les tests « out of sample » sur une période que vous n'avez jamais optimisée constituent une tâche distincte, et cette classe ne les remplace pas.
— Ali Rajput
Traduit de l’anglais par MetaQuotes Ltd.
Code original : https://www.mql5.com/en/code/77531
Session Candle Counter: candles numbered from the cash open, DST aware
Les numéros correspondent à chaque « bougie » de la journée de négociation en cours, à compter de l'ouverture au comptant à Francfort, Londres, New York ou Tokyo. Le repère est converti de l'heure locale de la bourse à l'heure du serveur du courtier, avec prise en compte automatique de l'heure d'été ; ainsi, la première « bougie » après l'ouverture porte toujours le numéro un, aussi bien en été qu'en hiver.
Spread Monitor
Spread Monitor is an MQL5 Expert Advisor that draws a colour-coded panel on the chart. The panel shows the current spread of the attached symbol in points, along with the average, minimum, and maximum over a rolling history. It also counts how many stored samples exceeded a warning level, and turns the status row red when the current spread is above that level. The utility does not place orders. Inputs control the warning level, the history size, the refresh interval, and the panel position. Panel objects are removed when the EA is detached.
Line Master – Fast and Slow Trend Lines with Trend Change Signals
Line Master is a trend-following indicator for MetaTrader 5 that displays fast and slow dynamic price lines to help traders identify market direction and potential trend changes. Blue represents a bullish trend, while red represents a bearish trend. Visual markers highlight changes in the indicator's trend state. The indicator includes adjustable Fast Length and Slow Length parameters, allowing traders to customize its sensitivity. It can be used on forex, gold (XAUUSD), indices, and other MT5-supported markets. For better results, combine its signals with price action, support and resistance levels, and proper risk management. Signals are not guaranteed and should be confirmed before entering a trade.
PropGuard Lite - daily and max loss guard for prop firm accounts
Risk tool for prop firm accounts: closes all positions and blocks new trades when the daily loss or max loss limit is reached. Never opens trades on a live chart.