Rejoignez notre page de fans
TransactionCostCollector — Script d'analyse des coûts des courtiers - script pour MetaTrader 5
- Vues:
- 103
- Note:
- Publié:
-
Besoin d'un robot ou d'un indicateur basé sur ce code ? Commandez-le sur Freelance Aller sur Freelance
Les pipelines d’étiquetage à triple barrière utilisent souvent une constante arbitraire (0,5–1,0 %) ou une hypothèse de spread héritée du passé comme seuil min_ret. Un seuil fixé en dessous du coût réel de transaction aller-retour conduit le pipeline à étiqueter du bruit lié aux coûts comme un signal négociable. L’ensemble de données étiqueté surestime alors systématiquement l’« edge », et tout modèle entraîné sur ces étiquettes présente un surajustement à un artefact du schéma d’étiquetage plutôt qu’à la véritable structure du marché.
TransactionCostCollector.mq5 est un script autonome qui résout l’étape de collecte de données liée à ce problème. Il échantillonne la distribution historique des spreads, lit les taux de swap et les diagnostics de commission du courtier pour le symbole du graphique associé, puis exporte l’ensemble des données vers un fichier CSV structuré. Le fichier CSV est exploité par la classe Python associée TransactionCostModel, qui convertit tous les coûts en rendements fractionnaires et calcule le seuil min_ret spécifique à l’instrument pour votre appel d’étiquetage.

Illustration en trois panneaux du résultat de TransactionCostCollector : ventilation des coûts intrajournaliers par session (a), distribution complète des coûts (b) et courbe de centiles pour la sélection min_ret (c)
Ce que le script collecte
Le script collecte trois composantes de coût pour un symbole donné en une seule exécution :
- Spread — distribution historique issue de CopySpread() sur le nombre de barres demandé. Présentée sous forme de moyenne, d’écart-type et de centiles (p25, p50, p75, p90, p95, p99), le tout en pips. Également calculée par heure UTC de la journée afin de mettre en évidence les effets de session.
- Swap — taux de swap au jour le jour (long et court) lus directement à partir de SYMBOL_SWAP_LONG / SYMBOL_SWAP_SHORT, y compris le mode de swap (points, devise, intérêt) et le jour de la semaine où un triple swap est facturé.
- Commission — à titre informatif uniquement. MQL5 ne fournit pas la commission par lot sous forme d’appel API direct pour tous les courtiers. Le script enregistre la valeur de ` ACCOUNT_COMMISSION_BLOCKED ` ainsi qu’une note expliquant comment déduire le taux par lot à partir d’une seule transaction de référence.
Paramètres d’entrée
| Paramètre | Valeur par défaut | Description |
|---|---|---|
| InpBars | 50 000 | Nombre de barres de l'historique des spreads à échantillonner. Une valeur plus élevée produit une distribution plus représentative et permet de mieux refléter les variations au cours d'une session. 50 000 barres sur H1 couvrent environ 5,7 ans ; sur M15, elles couvrent environ 1,4 an. Réduisez cette valeur si le terminal dispose d'un historique limité pour le symbole. |
| InpOutputFile | (vide) | Permet de redéfinir le nom du fichier de sortie. Si ce champ est laissé vide (valeur par défaut), le fichier est nommé <SYMBOLE>_costs.csv — par exemple, EURUSD_costs.csv pour l'EURUSD. Le fichier est enregistré dans le dossier MQL5\Files\ du dossier de données du terminal (modeFILE_WRITE | FILE_CSV ). |
Format de sortie CSV
Le fichier CSV utilise une structure à quatre colonnes : section, clé, valeur, unité. Les sections sont les suivantes :
- symbol_properties — taille du point, facteur de pip, valeur du tick, taille du contrat, identifiants de devises.
- swap — taux long/court, mode de swap, jour de la semaine avec triple swap.
- commission — valeur de diagnostic et note de dérivation.
- spread_summary — moyenne, écart-type et centiles sur l’ensemble des barres échantillonnées.
- spread_by_hour — spread moyen (pips) pour chaque heure de la journée, une ligne par heure (UTC, heure du courtier).
Mode d’emploi
- Placez TransactionCostCollector.mq5 dans votre dossier MQL5\Scripts\Downloads\ et compilez-le dans MetaEditor.
- Ouvrez un graphique du symbole cible sur n'importe quelle période. La période détermine le type de barre à partir duquel la distribution du spread est échantillonnée — la période H1 est recommandée car elle offre un bon compromis entre granularité et longueur de l'historique.
- Faites glisser le script sur le graphique. La boîte de dialogue d’entrée s’affiche (contrôlée par la propriété #property script_show_inputs). Définissez InpBars sur le nombre d’échantillons souhaité, puis cliquez sur OK.
- Récupérez le fichier CSV de sortie dans le dossier MQL5\Files\ du dossier de données du terminal (Fichier → Ouvrir le dossier de données dans MetaTrader 5).
Intégration avec Python
La classe Python associée, TransactionCostModel, charge le fichier CSV et calcule min_ret pour l’étiquetage à triple barrière :
from afml.transaction_costs import load_cost_model import pandas as pd model = load_cost_model( csv_path = "EURUSD_costs.csv", spread_percentile = "p95_pips", # conservateur slippage_pips = 0.4, commission_per_lot = 7.0, # issu d'une transaction de référence lot_size = 0.01, ) close = pd.read_parquet("EURUSD_H1.parquet")["close"] min_ret = model.min_ret_for_symbol( price_series = close, holding_days = 1.0, cost_multiplier = 1.5, # Seuil de rentabilité multiplié par 1,5 ) print(f"min_ret = {min_ret:.6f}")
Remarques sur les commissions
Le taux de commission par lot ne peut pas être lu par programmation chez tous les courtiers. La procédure recommandée est la suivante : ouvrez une transaction de référence d’exactement 1,0 lot standard sur un compte démo, lisez la valeur ACCOUNT_COMMISSION_BLOCKED dans le terminal immédiatement après l’ouverture de la transaction, puis fermez la transaction. La valeur bloquée divisée par 1,0 donne le taux par lot. Vérifiez ce résultat par rapport au relevé de compte. Cette opération doit être effectuée une fois par relation avec le courtier.
Pourquoi le p95 et non la moyenne
Le spread moyen est dominé par les périodes calmes : la séance asiatique, la consolidation nocturne et les conditions de tendance ordonnées. Les entrées de stratégie, en revanche, coïncident souvent avec les moments d’incertitude maximale (c’est-à-dire lorsque les modèles génèrent des signaux). L’utilisation du spread du 95e centile comme valeur d’entrée pour `min_ret` tient compte de l’environnement de coûts dans des conditions d’entrée typiques plutôt que dans des conditions de marché moyennes.
Références et article complémentaire
- López de Prado, M. (2018). Advances in Financial Machine Learning, chapitre 3 (Labels), p. 44–47. Wiley.
- Implémentation complète et dérivation : MetaTrader 5 Machine Learning Blueprint — Partie 14 : Modèle de coûts de transaction par Patrick M. Njoroge.
- La classe Python associée TransactionCostModel et des exemples d’utilisation sont inclus dans le pack de téléchargement de l’article.
Traduit de l’anglais par MetaQuotes Ltd.
Code original : https://www.mql5.com/en/code/73173
FVG Imbalance Marker Helper
A small educational MetaTrader 5 indicator that marks simple three-candle bullish and bearish Fair Value Gaps on the chart.
Confirmed Swing Points Helper
A small educational MetaTrader 5 indicator that marks confirmed swing highs and lows and labels market structure as HH, HL, LH and LL.
Drawdown DNA Analyzer
A native MQL5 script that analyzes the structure of an account's drawdowns, not just the single "maximum drawdown" figure. It reads a daily equity curve (Date,DailyPnL CSV), rebuilds the underwater curve, and splits it into individual drawdown episodes with their depth, duration and recovery time. It then reports the Ulcer Index, Pain Index, Recovery Factor and time spent underwater, and combines them into a single resilience score (A+ to F) with recommendations, printed in the Experts tab. No external libraries; if no file is found it generates a sample curve so it runs out of the box.
Profit Concentration Analyzer
A native MQL5 script that measures how concentrated a strategy's profit is — whether the edge is broad or rests on a few lucky trades. It reads a per-trade CSV (Date,Profit) and reports the share of net profit from the largest trades, the Gini coefficient of the winners, a concentration profile, a survival test that removes the best few trades and recomputes net profit and profit factor, and the largest single day versus a configurable consistency limit, combined into a concentration-and-consistency score (A+ to F) with recommendations. If no file is found it generates a sample set, so it runs out of the box. No external libraries, no Python, no AI. The helper ExportTrades.mq5 writes the file from your trade history.