- 显示:
- 31
- 已发布:
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
三重屏障标注流程通常采用一个任意常数(0.5%–1.0%)或传统的点差假设作为min_ret 阈值。若将阈值设定在实际往返交易成本之下,会导致该流程将成本驱动的噪声误判为可交易信号。 由此生成的标注数据集会系统性地高估边际效应,而基于这些标签训练的任何模型都会过度拟合于标注方案产生的伪影,而非真实的市场结构。
TransactionCostCollector.mq5 是一个独立脚本,可解决该问题中的数据采集环节。它对历史点差分布进行采样,读取经纪商针对所选图表符号提供的掉期利率和佣金诊断数据,并将所有内容导出到结构化的 CSV 文件中。 该 CSV 文件由配套的 Python 类TransactionCostModel 读取,该类将所有成本转换为分数化收益率,并计算出适用于您标注调用的、针对特定交易品种的min_ret 阈值。

TransactionCostCollector 输出结果的三面板示意图:按交易时段划分的盘中成本明细(a)、完整成本分布(b)以及用于 min_ret 筛选的百分位曲线(c)
脚本收集的内容
该脚本在单次运行中为单个符号收集三项成本组成部分:
- 点差— 来自CopySpread() 的历史分布数据,覆盖指定数量的K线。以均值、标准差及百分位数(p25、p50、p75、p90、p95、p99)形式呈现,单位均为点。同时按 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 采用四列结构:部分、键、值、单位。各部分包括:
- symbol_properties— 点值、点差系数、报价单位、合约规模、货币标识符。
- swap— 多头/空头利率、掉期模式、三倍掉期工作日。
- commission— 诊断值及推导说明。
- spread_summary— 所有采样K线中的均值、标准差和百分位数。
- spread_by_hour— 每日各小时的平均点差(点),每小时一行(UTC,经纪商时间)。
运行方法
- 将TransactionCostCollector.mq5 放置在MQL5\Scripts\Downloads\ 文件夹中,并在 MetaEditor 中编译。
- 打开目标交易品种的任意时间周期图表。时间周期决定了点差分布的采样K线类型——建议使用H1,这是在粒度与历史数据长度之间的一种合理折中。
- 将脚本拖放到图表上。此时将弹出输入对话框(由#property script_show_inputs 控制)。将InpBars 设置为所需的采样数量,然后点击“确定”。
- 从终端数据文件夹中的MQL5\Files\ 目录中获取生成的 CSV 文件(在 MetaTrader 5 中选择“文件”→“打开数据文件夹”)。
与 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而非均值
均点差主要受市场平静时期的影响:亚洲时段、隔夜盘整以及有序趋势行情。 然而,策略的入场时机往往恰好出现在不确定性最高的时刻(即模型生成信号之时)。将第95百分位点差作为min_ret的 输入,能够反映典型入场条件下的成本环境,而非平均市场条件下的情况。
参考文献与配套文章
- López de Prado, M. (2018).《金融机器学习进展》,第 3 章(标签),第 44–47 页。Wiley 出版社。
- 完整实现与推导:MetaTrader 5 机器学习蓝图——第 14 部分:交易成本模型,作者:Patrick M. Njoroge。
- 配套的 Python 类TransactionCostModel 及其使用示例包含在文章下载包中。
由MetaQuotes Ltd译自英文
原代码: https://www.mql5.com/en/code/73173
Institutional Harmonic Volumetric Gravity Center
一种基于加权调和平均数学原理的定量成交量密度引擎,用于消除算术异常值,并定位真正的机构流动性重心。
Close Profit Positions
平仓获利头寸