上周出金一笔小利润之后,我就把精力放回到一个老问题上:MT5的订单簿深度数据接入EA之后,挂单成交率反而从原来的七成多掉到了五成出头。说实话这个结果挺反直觉的,按理说有了DOM数据,挂单应该更精准才对。折腾了两周,复盘了三百多笔挂单记录,总算找到了几个坑,写出来给有类似想法的汇友参考。
先说我怎么接的数据。MT5本身不像某些平台直接给你完整的订单簿,我是通过 MarketBookGet 拿到五档深度,然后喂给EA做挂单偏移计算。原本逻辑很简单:卖一价上方挂sell limit,买一价下方挂buy limit,偏移固定用 1.5个点。接入深度之后我改成动态偏移,根据买卖挂单量的失衡比例来调整,结果成交率不升反降。
第一个坑是数据更新频率和报价频率不匹配。MT5的DOM数据不是逐笔推送的,我一开始在 OnTick 里读,但欧美在活跃时段tick太密,深度数据其实没变,EA却反复重算偏移,挂单被频繁撤了再挂。后来改成 OnTimer 每200毫秒采样一次,并且加了个深度指纹判断,只有前两档挂单量变化超过15%才重挂,撤单次数直接降了六成。这点很多教程不会提,但实盘里影响非常大。
第二个坑更隐蔽,是深度数据和实际成交价的滑点关系。我用的那个经纪商,ECN账户点差在0.1到0.3之间,但深度里挂的大量单子其实在更远的价位。我按深度失衡加重偏移,结果挂单价离盘口越来越远,成交概率自然就下来了。复盘时我统计了一下,偏移超过 2.8个点 的挂单,成交率只有三成。所以深度数据要看,但不能让它主导偏移,我最后给动态偏移设了个上下限,最小1.2点,最大2.2点,超出就截断。
第三个坑是净头寸和挂单的冲突。EA同时管理多空挂单时,深度数据一变化,它会把一边的单子撤掉去补另一边,结果两边都没成交。我后来改成用 对冲比率 来约束,让多空挂单的敞口差控制在一个阈值内,撤单前先判断另一侧是否已经有成交,避免空撤。
具体调整我列一下:
调整完之后我跑了一周模拟加两天实盘,挂单成交率回到六成八左右,虽然还没到最早的七成多,但至少比接入深度那阵子强多了。我的体会是,订单簿深度是个好工具,但它更适合做过滤和风控,而不是直接拿来算挂单价。你们有没有在MT5上接过DOM数据,成交率这块是怎么处理的?
补充一个小细节:后来我发现不同经纪商DOM刷新机制差别挺大,有的只在报价变动时更新,有的定时刷新,最好先用脚本记录几天时间戳再定策略。最近把读取频率降到跟报价同步,成交率慢慢回到六成多了,还在继续观察。
先说我怎么接的数据。MT5本身不像某些平台直接给你完整的订单簿,我是通过 MarketBookGet 拿到五档深度,然后喂给EA做挂单偏移计算。原本逻辑很简单:卖一价上方挂sell limit,买一价下方挂buy limit,偏移固定用 1.5个点。接入深度之后我改成动态偏移,根据买卖挂单量的失衡比例来调整,结果成交率不升反降。
第一个坑是数据更新频率和报价频率不匹配。MT5的DOM数据不是逐笔推送的,我一开始在 OnTick 里读,但欧美在活跃时段tick太密,深度数据其实没变,EA却反复重算偏移,挂单被频繁撤了再挂。后来改成 OnTimer 每200毫秒采样一次,并且加了个深度指纹判断,只有前两档挂单量变化超过15%才重挂,撤单次数直接降了六成。这点很多教程不会提,但实盘里影响非常大。
第二个坑更隐蔽,是深度数据和实际成交价的滑点关系。我用的那个经纪商,ECN账户点差在0.1到0.3之间,但深度里挂的大量单子其实在更远的价位。我按深度失衡加重偏移,结果挂单价离盘口越来越远,成交概率自然就下来了。复盘时我统计了一下,偏移超过 2.8个点 的挂单,成交率只有三成。所以深度数据要看,但不能让它主导偏移,我最后给动态偏移设了个上下限,最小1.2点,最大2.2点,超出就截断。
第三个坑是净头寸和挂单的冲突。EA同时管理多空挂单时,深度数据一变化,它会把一边的单子撤掉去补另一边,结果两边都没成交。我后来改成用 对冲比率 来约束,让多空挂单的敞口差控制在一个阈值内,撤单前先判断另一侧是否已经有成交,避免空撤。
具体调整我列一下:
- 深度采样改为200ms定时,加前两档变化阈值15%
- 动态偏移截断在1.2到2.2点之间
- 撤单前检查对侧成交状态,避免净头寸空转
- 用成交率而不是挂单量来反向评估深度权重
调整完之后我跑了一周模拟加两天实盘,挂单成交率回到六成八左右,虽然还没到最早的七成多,但至少比接入深度那阵子强多了。我的体会是,订单簿深度是个好工具,但它更适合做过滤和风控,而不是直接拿来算挂单价。你们有没有在MT5上接过DOM数据,成交率这块是怎么处理的?
补充一个小细节:后来我发现不同经纪商DOM刷新机制差别挺大,有的只在报价变动时更新,有的定时刷新,最好先用脚本记录几天时间戳再定策略。最近把读取频率降到跟报价同步,成交率慢慢回到六成多了,还在继续观察。
