당사 팬 페이지에 가입하십시오
- 조회수:
- 16
- 평가:
- 게시됨:
-
이 코드를 기반으로 한 로봇이나 지표가 필요하신가요? 프리랜스로 주문하세요 프리랜스로 이동
트리플 배리어 라벨링 파이프라인은 종종 임의의 상수(0.5–1.0%)나 기존의 스프레드 가정을 min_ret 임계값으로 사용합니다. 실제 왕복 거래 비용보다 낮게 설정된 임계값은 파이프라인이 비용에 의한 잡음을 거래 가능한 신호로 오인하게 만듭니다. 이렇게 라벨링된 데이터셋은 에지를 체계적으로 과대평가하게 되며, 해당 라벨을 기반으로 훈련된 모델은 진정한 시장 구조가 아닌 라벨링 방식에서 비롯된 인공적인 현상에 과적합하게 됩니다.
TransactionCostCollector.mq5는 이 문제의 데이터 수집 단계를 해결하는 독립형 스크립트입니다. 이 스크립트는 과거 스프레드 분포를 샘플링하고, 연결된 차트 심볼에 대한 브로커의 스왑 금리 및 수수료 진단 정보를 읽은 후, 모든 데이터를 구조화된 CSV 파일로 내보냅니다. 이 CSV 파일은 동반 Python 클래스인 TransactionCostModel에 의해 처리되며, 이 클래스는 모든 비용을 분수 수익률로 변환하고 라벨링 호출을 위한 상품별 min_ret 임계값을 계산합니다.

TransactionCostCollector 출력을 보여주는 3개의 패널: 세션별 일중 비용 내역 (a), 전체 비용 분포 (b), min_ret 선정을 위한 백분위수 곡선 (c)
스크립트가 수집하는 정보
이 스크립트는 한 번의 실행으로 단일 종목에 대한 세 가지 비용 구성 요소를 수집합니다:
- 스프레드 — 요청된 바(bar) 수에 걸쳐 CopySpread() 에서 추출한 과거 분포 데이터. 평균, 표준 편차 및 백분위수(p25, p50, p75, p90, p95, p99)로 보고되며, 모두 핍(pips) 단위로 표시됩니다. 또한 세션별 영향을 파악할 수 있도록 하루 중 UTC 시간대별로 계산됩니다.
- 스왑 — SYMBOL_SWAP_LONG / SYMBOL_SWAP_SHORT에서 직접 읽어온 롱 및 숏 오버나이트 스왑 금리. 여기에는 스왑 모드(포인트, 통화, 이자)와 트리플 스왑이 부과되는 요일이 포함됩니다.
- 수수료 — 진단용입니다. MQL5는 모든 브로커에서 랏당 수수료를 직접적인 API 호출로 노출하지 않습니다. 이 스크립트는 ACCOUNT_COMMISSION_BLOCKED를 기록하고, 단일 참조 거래를 통해 랏당 요율을 도출하는 방법을 설명하는 메모를 포함합니다.
입력 매개변수
| 매개변수 | 기본값 | 설명 |
|---|---|---|
| InpBars | 50000 | 샘플링할 스프레드 이력 바의 수입니다. 값이 클수록 더 대표적인 분포를 생성하며, 세션별 변동성을 더 많이 포착합니다. H1 차트에서 50,000바는 대략 5.7년을, M15 차트에서는 대략 1.4년을 커버합니다. 터미널에 해당 종목의 이력 데이터가 제한적인 경우 이 값을 줄이십시오. |
| 입력/출력 파일 | (비어 있음) | 출력 파일 이름을 재정의합니다. 비워두면(기본값), 파일 이름은 <SYMBOL>_costs.csv로 지정됩니다. 예를 들어, EURUSD의 경우 EURUSD_costs.csv가 됩니다. 파일은 터미널 데이터 폴더의 MQL5\Files\ 에 기록됩니다(FILE_WRITE | FILE_CSV 모드). |
CSV 출력 형식
CSV는 섹션, 키, 값, 단위의 4개 열 구조를 사용합니다. 섹션은 다음과 같습니다.
- symbol_properties — 포인트 크기, 핍 계수, 틱 값, 계약 규모, 통화 식별자.
- swap — 롱/숏 금리, 스왑 모드, 트리플 스왑 적용 요일.
- commission — 진단 값 및 도출 참고 사항.
- spread_summary — 샘플링된 모든 바에 대한 평균, 표준편차 및 백분위수.
- spread_by_hour — 하루 중 각 시간대별 평균 스프레드(핍), 시간당 한 행씩 (UTC, 브로커 시간 기준).
실행 방법
- TransactionCostCollector.mq5 파일을 MQL5\Scripts\Downloads\ 폴더에 저장하고 MetaEditor에서 컴파일하십시오.
- 원하는 시간대의 대상 심볼 차트를 엽니다. 시간대는 스프레드 분포를 샘플링할 바 유형을 결정합니다. 세분성과 역사 데이터 길이의 적절한 균형을 고려할 때 H1을 권장합니다.
- 스크립트를 차트로 드래그합니다. 입력 대화 상자가 나타납니다( #property script_show_inputs로 제어됨). InpBars를 원하는 샘플 수로 설정하고 확인을 클릭합니다.
- 터미널 데이터 폴더(MetaTrader 5의파일 → 데이터 폴더 열기 ) 내 MQL5\Files\ 에서 출력 CSV 파일을 확인하십시오.
Python과의 통합
함께 제공되는 Python 클래스 TransactionCostModel은 CSV 파일을 불러와 트리플 배리어 라벨링을 위한 min_ret을 계산합니다:
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", # 보수적 slippage_pips = 0.4, commission_per_lot = 7.0, # 레퍼런스 트레이드에서 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, # 1.5배 손익분기점 ) print(f"min_ret = {min_ret:.6f}")
수수료 관련 참고 사항
모든 브로커에서 랏당 수수료율을 프로그래밍 방식으로 읽어올 수 있는 것은 아닙니다. 권장되는 절차는 다음과 같습니다: 데모 계좌에서 정확히 1.0 표준 랏 규모의 기준 거래를 개설하고, 거래가 개설된 직후 터미널에서 ACCOUNT_COMMISSION_BLOCKED 값을 확인한 다음, 거래를 청산하십시오. 차단된 값을 1.0으로 나누면 랏당 수수료율이 나옵니다. 계좌 명세서와 대조하여 확인하십시오. 이 작업은 각 브로커와의 거래 관계마다 한 번씩 수행해야 합니다.
평균이 아닌 p95를 사용하는 이유
평균 스프레드는 아시아 세션, 야간 조정 국면, 그리고 질서 있는 추세 국면과 같은 변동이 적은 시기에 주로 영향을 받습니다. 반면, 전략 진입 시점은 종종 불확실성이 가장 높은 순간(모델이 신호를 생성하는 시점)과 일치합니다. min_ret 입력값으로 95번째 백분위수 스프레드를 사용하면 평균 시장 조건이 아닌 일반적인 진입 조건에서의 비용 환경을 반영할 수 있습니다.
참고 문헌 및 관련 논문
- López de Prado, M. (2018). 《금융 머신러닝의 발전》 (Advances in Financial Machine Learning), 제3장(라벨), 44–47쪽. Wiley.
- 전체 구현 및 도출 과정: MetaTrader 5 머신러닝 블루프린트 — 14부: 거래 비용 모델, Patrick M. Njoroge 저.
- 관련 Python 클래스 TransactionCostModel 및 사용 예제는 기사 다운로드 패키지에 포함되어 있습니다.
MetaQuotes Ltd에서 영어로 번역함.
원본 코드: 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.