📘

「用自定义品种把 MT5 测策边界扩到任意资产」

「用自定义品种把 MT5 测策边界扩到任意资产」

MT5 的自定义交易品种功能,让交易者能把图表和策略测试从平台默认品种里解放出来。只要手上有分时(tick)或分钟级历史数据,就能在终端里建一个私有品种,挂上任意 EA 去回测。 这套机制的实际价值在于:你不必受经纪商符号列表限制,可以把加密货币、场外指数或自算价差序列做成品种,直接丢进 Strategy Tester。官方示例发布于 2017-09-25,至今仍是理解该机制的入口,当时文档显示该功能已支持调用市场与免费代码库中的机器人做验证。 外汇与贵金属本身杠杆高、滑点跳空频繁,自定义品种若用低质量历史拼接,回测曲线会严重失真。建品种前先核对时间戳连续性与点值设置,再跑样本外片段确认成交逻辑。

◍ 把现有品种克隆成自定义品种

在 MT5 市场报价里对某个已有品种点右键,选菜单里的“创建自定义交易品种”,就能以它为模板另立一个可改参数的副本。建好后需在弹出的规格窗里重命名,并视需要在“合约规格”中调整合约大小、报价精度、币种等字段。 所有自定义品种都归在交易品种树里的 <Custom> 独立目录,和当前连的哪家经纪商无关;价格数据也不进经纪商服务器目录,而是写到本地终端的 Custom 子目录。路径示例如下,复制走或备份都很直接。 C:\Users\[windows account]\AppData\Roaming\MetaQuotes\Terminal\[instance id]\bases\Custom 自定义品种的一个实用点是:你可以把不同经纪商的同标的各拉一份进自定义组,横向比点差和滑点。删除动作只能在它没开图表、且不在市场报价显示时进行,和传统品种一致。 报价的精确度、合约大小、交易品种币别、执行方式等都能改,这些会直接影响后续策略测试的结果,调参前建议先想清楚回测要逼近哪种真实环境。外汇与贵金属杠杆高,自定义品种若参数失真,测试盈利倾向虚高,实盘可能大幅偏离。

MQL5 / C++
C:\Users\[windows account]\AppData\Roaming\MetaQuotes\Terminal\[instance id]\bases\Custom

给自定义品种灌入历史数据的实操路径

建好自定义品种后,第一步是给它喂历史。MT5 里整个历史体系都基于分钟数据,所以导出柱数据时务必选 M1 时段,导出的 CSV 命名形如 EURUSD_M1_201701020000_201701070425.csv,把品种名、周期和时间范围精确到分钟都写进文件名。 分时历史导出的 CSV 体积会大得多,它记录每笔 tick 到毫秒级,终端靠这些 tick 合成 1 分钟 bar,更高周期全部由 M1 递推。如果你用第三方源拼历史,格式必须贴近下面示例,否则导入会报错。 导入时进 Custom\<分组> 找到你的 EURUSD_my,切到 Ticks 页选文件点“Import Ticks”;导柱也是同样操作。导入后还能手动增删改任意 bar 或 tick。 灌完历史,品种就出现在市场报价里,能直接开图,自定义指标和 marketplace 的分析工具都能挂上去跑。外汇和贵金属自定义品种波动剧烈,用历史回测只是概率参考,实盘风险极高。

MQL5 / C++
<DATE>	        <TIME>	        <OPEN>	<HIGH>	<LOW>	<CLOSE>	<TICKVOL>	<VOL>	     <SPREAD>
class="num">2017.01.class="num">02	class="num">00:class="num">03:class="num">00	class="num">1.05141	class="num">1.05141	class="num">1.05141	class="num">1.05141	class="num">6	class="num">15000000	class="num">118
class="num">2017.01.class="num">02	class="num">00:class="num">04:class="num">00	class="num">1.05141	class="num">1.05141	class="num">1.05141	class="num">1.05141	class="num">2	class="num">5000000	        class="num">112
class="num">2017.01.class="num">02	class="num">00:class="num">05:class="num">00	class="num">1.05158	class="num">1.05158	class="num">1.05148	class="num">1.05158	class="num">10	class="num">17000000	class="num">101
class="num">2017.01.class="num">02	class="num">00:class="num">06:class="num">00	class="num">1.05148	class="num">1.05158	class="num">1.05148	class="num">1.05158	class="num">7	class="num">13000000	class="num">101

<DATE>         <TIME>         <BID>  <ASK>  <LAST>  <VOLUME>
class="num">2017.07.class="num">03       class="num">00:class="num">03:class="num">47.212    class="num">1.14175 class="num">1.14210 class="num">0.00000 class="num">0
class="num">2017.07.class="num">03       class="num">00:class="num">03:class="num">47.212    class="num">1.14168 class="num">1.14206 class="num">0.00000 class="num">0
class="num">2017.07.class="num">03       class="num">00:class="num">03:class="num">47.717    class="num">1.14175 class="num">1.14206 class="num">0.00000 class="num">0
class="num">2017.07.class="num">03       class="num">00:class="num">03:class="num">54.241    class="num">1.14175 class="num">1.14205 class="num">0.00000 class="num">0
class="num">2017.07.class="num">03       class="num">00:class="num">03:class="num">57.982    class="num">1.14165 class="num">1.14201 class="num">0.00000 class="num">0
class="num">2017.07.class="num">03       class="num">00:class="num">04:class="num">07.795    class="num">1.14175 class="num">1.14201 class="num">0.00000 class="num">0
class="num">2017.07.class="num">03       class="num">00:class="num">04:class="num">55.432    class="num">1.14164 class="num">1.14200 class="num">0.00000 class="num">0
class="num">2017.07.class="num">03       class="num">00:class="num">14:class="num">33.743    class="num">1.14173 class="num">1.14203 class="num">0.00000 class="num">0
class="num">2017.07.class="num">03       class="num">00:class="num">14:class="num">33.743    class="num">1.14173 class="num">1.14201 class="num">0.00000 class="num">0
class="num">2017.07.class="num">03       class="num">00:class="num">16:class="num">44.901    class="num">1.14174 class="num">1.14195 class="num">0.00000 class="num">0

「自定义品种回测的保证金锚定逻辑」

MT5 策略测试器支持在自定义交易品种上跑 EA,前提是先灌入高质量分钟或分时的历史,并在品种属性里把交易环境配齐。操作和常规经纪商品种一致,但保证金与利润的换算完全依赖你账户币种和交叉汇率的可得性。 以 AUDCAD.custom 为例,账户币种为美元、保证金类型为外汇,测试器会按名称顺序找 AUDUSD.custom 算保证金、USDCAD.custom 算利润。若这两对不存在,就退而找 AUDUSD 和 USDCAD 名下的任意变体(如 .b 后缀),用它们的汇率兜底。 非外汇类品种(CFD、期货、股票)若利润与保证金币别为 GBP、存款币别为 CHF,则优先搜 GBPCHF;缺失时再按名称匹配 GBPCHF.b 或 GBPCHF.def 这类变体。 实操上,开 MT5 前先确认账户里挂全了所有必需交叉盘。缺一对,测试器就无法估算保证金,回测直接失真,外汇与贵金属自定义品种的高杠杆风险也会被掩盖。

◍ 局域网代理跑自定义品种优化

在 MT5 策略测试器里,除了本机代理,你还能挂局域网内的代理或者远程代理来跑自定义交易品种的策略优化。这比纯本机快得多,核心收益是缩短寻找交易系统最优参数的耗时。 注意,MQL5 云网络不能用于自定义品种优化。根因是同名自定义品种在不同机器、不同用户手里的价格历史可能完全不一致。 一旦放进云网络,代理之间的回测结果会对不上,还会触发历史数据的大量重载与同步,徒增网络开销。所以自定义品种只走本地或局域网代理,是硬约束而非可选项。

用 MQL5 搭自己的交易品种

MT5 不止能读市场数据,还能用 MQL5 直接造一个自定义交易品种。借助 Custom symbols 这组函数,你可以按第三方数据源的字段把资产属性填进去,自动攒历史、拼自定义指数,再丢进策略测试器回测。 下面这张表是核心函数,覆盖从创建到删数据的全链路:CustomSymbolCreate 建品种、CustomSymbolDelete 删品种;Integer/Double/String 三类 Set 函数分别写整型、浮点、字符串属性;SetMarginRate 管保证金比率;SetSessionQuote 和 SetSessionTrade 拆开管报价段与交易段的起止日。 历史数据方面,CustomRatesDelete 按区间清 K 线,CustomRatesReplace 用 MqlRates 数组整段覆盖,CustomRatesUpdate 只补缺失并覆盖已有;tick 级对应 CustomTicksDelete 与 CustomTicksReplace。实盘前建议先开 MT5 终端的自定义品种窗口,用 CustomSymbolCreate 建个测试名,跑一遍 SetDouble 写点差,确认策略测试器能读到。 这组能力把「取市场信息」补成了闭环:此前只能读任意品种属性,现在你能给自建资产写属性并喂数据,贵金属或外汇自定义品种同样涉及高杠杆高风险,回测结果不代表实盘概率。

「画得少,看得清」

MT5 给算法交易留的后门比多数人想的多:84 个内建技术指标、接 MQL5 云网络后约 20000 个测试代理、异步交易操作压到 1 毫秒内执行,这些都是经纪商行情里直接能调用的底料。 自定义交易品种是关键落点——经纪商没上的标的,你建一个 Renko 或外部价差符号就能在策略测试器里跑历史。有用户反馈 EA 在自建 Renko 符号上无法下单,这类坑得在 Symbol 创建时把权限和报价同步核对一遍。 外汇和贵金属自带高杠杆与滑点风险,回测通过不等于实盘能复刻。开 MT5 建个自定义符号,把本文那套指标逻辑丢进测试器,比看十篇概述来得实在。

常见问题

在品种列表右键选新建自定义品种,填好名称和点值等参数,即可创建一个空白品种用于后续数据写入和测试。
打开自定义品种管理界面,用导入功能从已存在品种或 CSV 文件把 K 线数据复制过来,避免手动逐根录入。
可以,小布能读取你的自定义品种合约参数并比对回测报告中的保证金锚定值,提示可能的设置偏差。
回测保证金依赖你给品种设的合约大小与杠杆字段,未设准则按默认锚定,需手动核对与券商规则一致。
用局域网代理把优化任务分发到副机执行,主机的 MT5 仅做任务调度,可显著缩短搜索时间。