分类
平台
难度
进阶
适用场景
MT5 操作EA 评估券商选择

滑点

订单请求的价格与实际成交价格之间的差额。它可能偏向任何一边,但对靠速度取胜的策略而言,这是一项回测很少建模的成本。

亦称:slippage, 价格滑移, 偏差

更新于 · 审阅于

一句话讲清

你要的是一个价格,拿到的是另一个。从订单离开终端到成交为止,市场在动——有时对你有利,更多时候不利,而且往往在你最不希望的时候动得最厉害。

为什么重要

回测按它自己决定的价格成交。真实账户按订单抵达时经纪商手上还有的价格成交。这个差额在单笔交易上很小,却随交易笔数累积,因此它决定了一套快节奏策略能否经受住真实账户的考验。

  • 它随频率放大,而不是随手数放大。十分之一个点在一笔交易上不算什么,摊到两千笔就有分量了。
  • 它恰恰在最疼的地方最严重——数据公布时、开盘时、被强制平仓时,这些都是策略最可能正在发送订单的时刻。
  • 它以回测无法捕捉的方式取决于经纪商:同一个 EA 跑同一份数据,在成交质量不同的两家经纪商会得到不同的实盘结果。
  • 它可以测量。把请求价与成交价在几百笔交易上取平均,就把一场关于成交质量的争论变成了一个数字。

在 MetaTrader 5 中

在 MT5 的什么位置

  • 新订单对话框(F9)→ 偏差——市价单上你愿意接受的最大滑点,以点为单位
  • 工具箱 → 历史 → 该笔成交的价格,对照 EA 在 Experts 日志中请求的价格
  • 日志选项卡,被拒绝的订单在这里显示为重新报价或无效价格,而不是一次成交
  • 策略测试器——它建模点差,但不建模订单延迟,这就是测试器里的成交系统性地比实盘更宽厚的原因

EA 如何使用它

  • MqlTradeRequest 的 deviation 字段设定容差:在距请求价这么多点以内成交,否则宁可拒绝也不以更差的价格成交。
  • 在 Market Execution 下,请求按市场给出的价格成交,而偏差限定了在订单被拒绝之前这个距离可以拉开到多远。
  • 成交模式在边界上起决定作用:Fill or Kill 直接拒绝部分成交,Immediate or Cancel 先拿走可得的部分并撤销其余。
  • 写得好的 EA 会把拿到的成交价与请求价作比较,并从成交价而不是请求价重新计算止损和目标。
  • 被拒绝后不重新核对信号就再次发单,正是一次被拒成交演变成多次、且价格一次比一次差的路径。

常见设置

设置项 常见取值 备注
偏差,波段策略 10–30 点 宽松。相对以百计的目标,几个点的滑点无关紧要。
偏差,剥头皮策略 1–5 点 窄到足以让糟糕的成交被拒绝而不是被接受——代价是更多的拒单。
值得接受的平均滑点 低于 0.5 个点 在你自己的账户上以 100 笔以上的实盘交易测得,而不是引自经纪商的宣传材料。
值得深究的平均滑点 高于 1.5 个点 对目标较小的策略来说,这已是每次盈利中相当可观的一块。
成交模式 以品种允许的为准 由经纪商按品种设定;发送不受支持的模式会让订单被拒绝,而不是被调整。

常见运行问题

  • 为波动大的品种把偏差设得过窄,会变成一连串被拒的订单,EA 的交易次数远少于回测所称。
  • 把偏差设得过宽,会接受远离信号价的成交,于是真正做的那笔交易并不是策略建模的那笔。
  • EA 用请求价而不是成交价计算止损,于是每一次滑点入场,真实风险都与预期风险不一致。
  • 到经纪商服务器的距离带来延迟,延迟带来滑点——这就是把 EA 放在靠近交易服务器处运行的现实理由。
  • 数据公布制造的滑点远超样本中的任何值,因此穿越这些时刻交易的策略也必须在这些时刻被测试过。

相关 MT5 函数

MqlTradeRequest.deviation
市价单可接受的最大滑点,以点为单位。
CTrade::SetDeviationInPoints(points)
同一容差,一次设定后适用于该实例发出的每一张订单。
MqlTradeResult.price
实际成交的价格——必须拿来与请求作比较的那个数。
SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE)
经纪商对该品种允许哪些成交模式;发送其他模式会被拒绝。
OrderSend(request, result)
返回同时携带 retcode 与成交价的结果结构体。

示例

同样是平均 0.4 个点的滑点,用在目标不同的两套策略上。每笔交易的成本相同;它吃掉的优势比例并不相同。

每笔交易的平均滑点
0.4 个点
剥头皮——平均盈利
6 个点
进出两端的滑点约占毛利的 13 %。
波段 EA——平均盈利
120 个点
同样的滑点约占毛利的 0.7 %。
剥头皮——每年交易笔数
2,000
每年 1,600 个点仅仅损耗在成交环节。

在这两行之间,经纪商那边什么都没变。差别在于策略的优势有多少落在成交这个窗口里。

计算 0.8 ÷ 6 = 13 % · 0.8 ÷ 120 = 0.7 %

结果 同一种成交质量,两个完全不同的结论

怎么使用

滑点是测出来的,不是假设出来的。下面每一条结论都来自在你自己的账户、你自己的经纪商上,把请求价与成交价逐笔对照。

区间 含义
100 笔以上平均低于 0.5 个点 成交良好。回测结果打个不大的折扣即可迁移过来。
0.5–1.5 个点 对目标以数十点计的策略可以接受;对任何更小的目标都是实打实的拖累。
平均高于 1.5 个点 放大之前先查清楚。要么策略在错误的时刻交易,要么成交质量没有竞争力。
始终偏向同一方向 有利方向的滑点也该出现。如果成交永远比请求更差,那描述的是成交质量,而不是市场的波动。
  • 每笔交易都把请求价记在成交价旁边。没有这一对数字,就没有东西可测,也没有比较经纪商的依据。
  • 拿同一时期的实盘运行和它的回测作对照——每笔平均结果之间的落差,正是滑点和点差栖身的地方。
  • 从目标大小推导偏差:目标小就设窄,好让糟糕的成交被拒绝;目标大就设宽,免得为了零点几个点错过好信号。
  • 从成交价而不是请求价重新计算止损和目标。否则一次滑点入场会悄悄改变这笔交易的风险。
  • 把数据公布时段的成交单独评估。取自平静时段的平均值,对那几秒钟里发生的成交什么也说明不了。

mt5depot 的产品页会公布每份回测是在哪家经纪商、什么账户条件下产生的,因此一个结果背后的成交假设是被写明的,而不是被默认的。

常见误区

以为滑点总是不利的

有利方向的滑点——成交价好于请求价——在真正的市价成交下、正常行情中就会发生。一份在数百笔交易里只出现不利滑点的记录,描述的是成交质量,不是市场。

把回测当成已经建模了成交

策略测试器建模点差,却不建模从决策到成交之间的延迟。因此每一份测试器结果都偏乐观,偏离幅度随交易频率增大,而且恰恰在测试中看起来最好的策略上落差最大。

把偏差设为零以避免滑点

那并不能消除滑点,它消除的是成交。EA 最终只交易自己一部分信号,而漏掉哪些信号是由市场速度而不是由策略决定的。

只看点差比较经纪商

宣传上很窄的点差若配上糟糕的成交,可能比一个更宽但成交干净的点差还贵。可比的数字是每个来回的总成本——点差加佣金再加实测滑点。

深入说明

这里的每一个商品都附带一个成交容差,而这个货架本身对它的含义并不一致。偏差决定的是哪些成交会被拒绝,而不是被接受的成交有多糟——而在这里,同一个数字指的是两种大小。

每个商品都附带的容差

在此发布的 14 个 EA 中数值
带有成交容差参数的商品14
描述该参数的参数条目40
标注为 0.3 个点的容差3
标注为 3 个点的容差11
写明它不影响回测的页面8
写明记录是在该数值下测得的页面2
带有实测滑点数字的运行0

第三行和第四行就是陷阱。Cairn 和 Thunderhead 印着一个光秃秃的 3,按点计;另外九个也印着光秃秃的 3,却按 pip 计。同一个数字,相差十倍。只有 Iridescence、Lattice Weave 和 Tidewell Slack 把单位一并印出来——这三个是你不可能读错的。

第五行和第六行用两种口吻描述同一项设置,而第七行说明该信哪一种:我们的回测没有一份是把成交与请求作对照测量的。这就使它成为一条实盘交易的指令,而不是一项回测假设——正是我们的方法论在每份记录周围划下的边界。

它咬得最狠的地方,正是它收得最紧的地方:在 0.3 个点上,偏离更远的成交会被拒绝,于是 Cairn 的 4,725 笔交易变成的是比记录所示更少,而不是更差。

常见问题

MT5 的 EA 出现多少滑点算正常?
在有竞争力的账户和寻常行情下,一百笔以上交易的平均值低于约 0.5 个点算好,0.5 到 1.5 个点对目标以数十点计的策略仍然可行。平均值持续高于 1.5 个点就值得深究,尤其是策略交易频繁时。
为什么我的实盘结果比回测差?
通常的解释是滑点和点差。策略测试器按它自己决定的价格成交,也不建模订单发出到成交之间的延迟,所以实盘成交系统性地略差一些。这个效应随交易笔数放大,因此交易频繁的策略最快偏离自己的回测。
用 VPS 能减少滑点吗?
它能减少由你的终端与经纪商服务器之间的距离和延迟造成的那一部分,这一部分对目标较小的策略最为要紧。但对由市场波动、或由下单瞬间流动性稀薄造成的那一部分,它无能为力。
EA 应该用多大的偏差?
够在值得做的信号上成交即可,不必更多。目标大的策略接受 10 到 30 点也无所谓;剥头皮策略通常只设几个点,好让糟糕的成交被拒绝而不是被接受,代价是承受更多拒单。