在 MetaTrader 5 中的连续期货合约(基础篇)
◍ MT5里连续期货合约的底层逻辑
MT5 terminal 原生支持连续期货合约(Continuous Futures),但它不是交易所直接推送的真实合约,而是由平台按规则把不同月份合约拼接成一条无到期跳空的价线。对做贵金属或外汇差价合约的交易者来说,这条线适合看长周期趋势,但下单仍要落到具体交割月。 连续合约的拼接通常基于「活跃合约切换」:当远月成交量超过近月,或临近近月交割日,平台把价线无缝接驳到新主力。Vladimir Karputov 在 2014-06-25 发布的该主题帖累计被查看 2374 次、跟帖 9 条,说明老交易员早就在琢磨这套映射。 高风险提醒:外汇与贵金属杠杆高,连续合约仅作分析参考,实盘开仓须核对具体合约的展期成本与滑点。
MT5 里图表不是你想建就能建
MT5 的图表由经纪商统一创建,交易者自己没法新开一个自定义品种图表。想要做跨期连续合约,得依赖经纪商把不同到期月的期货接到同一个品种名下,接不接、怎么接全是经纪商说了算。 好在历史数据留了一条活路:已到期且停止交易的期货合约,其历史行情会一直留在客户端本地。我们可以利用这些已存在的历史数据,在客户端里手动把相邻合约拼接起来,拼出一条能用的连续序列。 这条路径对外汇和贵金属交易者同样有参考价值,但拼接过程依赖人工维护,且经纪商数据质量参差,实操有较高数据断裂风险。
「示例数据的标的与代码标注法」
文中所有行情数据、图形与终端截图,均取自真实的乌克兰股指期货品种,不是模拟合成序列,读者在 MT5 中选对品种就能复现画面。 为区分原版与改动部分,新增或替换的代码段会以底色高亮呈现,方便你一眼定位到底动了哪几行。下面这段就是被标记过的示例片段,仅作格式演示,不含实际逻辑。 [CODE] <span style="background-color:rgb(216, 232, 194);"><span class="comment">//+------------------------------------------------------------------+</span>
| <span class="comment">// | This is an example | </span> |
|---|---|---|
| <span class="comment">// | of the edited code | </span> |
<span class="comment">//+------------------------------------------------------------------+</span></span> [/CODE] 你打开自己 EA 源码时,也可以用同样的高亮习惯标出调试区,后续比对版本差异会省掉大量肉眼找行的时间。
<span style="background-class="type">color:rgb(class="num">216, class="num">232, class="num">194);"><span class="comment">class=class="str">"cmt">//+------------------------------------------------------------------+</span> <span class="comment">class=class="str">"cmt">//| This is an example |</span> <span class="comment">class=class="str">"cmt">//| of the edited code |</span> <span class="comment">class=class="str">"cmt">//+------------------------------------------------------------------+</span></span>
◍ 邻近合约的日期覆盖现象
做贵金属或外汇期货连续复盘时,先要认清一个事实:邻近合约的交易日历是重叠的,不是旧合约摘牌新合约才上市。 以莫斯科交易所铀期货为例,UX-3.14 合约在 2013.09.16 就已开始交易,而此时 UX-12.13 合约仍在场内正常交易。也就是说,同一标的存在两个活跃月份并行,中间大约有两个月的重叠窗口。 这种覆盖对 MT5 多合约回测很关键:若直接用单一主力合约拼接,会漏掉重叠期的价差与流动性切换。开 MT5 的合约规格面板,把邻近两个到期月的交易起始日拉出来对照,就能验证你数据里有没有这段并行期。
连续合约拼接的两种接法
把不同月份期货拼成一条连续K线,MT5里常见两种接法。简单追加是在当前品种循环到期、新品种已上市后直接把新数据接在后面,历史价能对上,但相同日期处会留下价格间隙,图表不够顺滑。 偏移追加则是当前合约还剩5–10根日线没走完时,就提前用下一合约的柱线顶替这5–10根,这段被叫过渡周期。代价是这几根显示的价格和当前品种对不上,但整张图比简单追加平滑得多。 在「市场报价」窗口里,期货默认是降序排的,接之前先确认自己抓的是哪个月份的序列,别把顺序搞反。外汇和贵金属连续化处理同样有跳空与错位风险,实操前建议在MT5用历史中心导两段不同合约验证间隙位置。
「把 SYNT 指标落到本地目录」
MT5 客户端的数据根目录下,指标默认都堆在 MQL5\Indicators 里。想不被官方库淹没、也方便以后用 MQL5 存储做启动同步,先在 Indicators 下建 MyIndicators,再往里建 Synthetics,最终路径就是 客户端数据文件夹\MQL5\Indicators\MyIndicators\Synthetics。 进 Synthetics 新建文件,类型选「自定义指标」。向导里给指标起名 SYNT,并加两个输入项:其一是「接续期货数量」,决定拼接几个品种,最小值只能是 2;其二是「胶合型」,决定拼接方式,缺省为「简单追加」。 胶合型此时只有「简单追加」和「偏移追加」两种,向导里不能现加选项,所以先留默认。等写 SYNT 代码时再切到可扩展的 Later 方案,下拉菜单就能自己填。事件处理器那步勾上 OnTimer(),因为指标主逻辑放在定时器里,能脱离 OnCalculate 去抓已平仓和活跃持仓。 绘图属性勾「指标在分离窗口」,点完成就能拿到 SYNT 的空模板。外汇与贵金属波动剧烈、杠杆风险高,拼接多品种前先在策略测试器用最小 2 品种跑一遍,确认分离窗口刷新节奏不卡顿再上实盘。