之前用ECN账户挂黄金 scalp EA的时候碰到过一件怪事,日志里全是 requote 和 invalid price,但手动下单一点问题没有,折腾到半夜才发现是 成交模式 和 偏差值 没配对。后来陆续又踩了几个坑,索性把常见的拒单原因整理一下,顺便对比几种处理方案。
先说最常见的一类:价格相关拒单。EA 发出的是固定价格,但服务器那边价格已经跑了,尤其黄金这种点差和波动都大的品种,requote 和 invalid price 基本是家常便饭。这里有两种处理思路,各有优劣:
我现在的做法是两者结合:slippage 给到 8,重试最多 3 次,间隔 200ms,并且用 MagicNumber 去重,避免重复进场。
第二类是保证金和手数问题。日志里出现 not enough money 或者 invalid volume,多半是手数没对齐。有些平台最小手数 0.01,但步长是 0.01 还是 0.1 差别很大,尤其是跑多货币对的 EA,计算出来的手数经常带一长串小数。处理方案同样分两种:一种是在下单前用 MarketInfo(MODE_MINLOT / MODE_LOTSTEP) 动态归一化手数,稳妥但代码稍长;另一种是干脆在参数里写死手数,省事但换账户或换品种就废了。我个人偏向动态归一化,毕竟换平台不用重编译。
第三类容易被忽略的是 交易时段和品种后缀。有次挂镑美,EA 一直拒单,查了半天发现经纪商那边品种名是 GBPUSD.m,而我的 EA 里写的是 GBPUSD,符号对不上直接返回 invalid symbol。还有一次是周五临近收盘,平台限制了部分品种的交易,EA 还在傻傻发单。这类问题的排查顺序建议是:
说句实在的,错误码对照表 建议打印出来贴屏幕边上,比瞎猜快得多。
最后提一句 VPS 环境的影响。延迟高的时候,EA 报的价格到服务器已经过期,拒单率明显上升。我对比过同一套 EA 在本地和 VPS 上的表现,延迟从 60ms 降到 5ms 之后,requote 少了一大半。所以如果拒单频繁,先别急着改代码,ping 一下服务器 看看网络质量,有时候问题根本不在 EA 本身。
你们平时遇到最多的拒单错误码是哪个?有没有碰到过重试逻辑反而导致重复开仓的情况,一起聊聊排查思路。
先说最常见的一类:价格相关拒单。EA 发出的是固定价格,但服务器那边价格已经跑了,尤其黄金这种点差和波动都大的品种,requote 和 invalid price 基本是家常便饭。这里有两种处理思路,各有优劣:
- 方案A:把 OrderSend 的 slippage 参数调大,比如从 3 调到 10 甚至 20。优点是实现简单,改个数字就行;缺点是实际成交价可能偏离预期,对剥头皮策略不友好,滑点吃掉利润。
- 方案B:改用 市价单 + 循环重试,每次失败后重新获取最新 Ask/Bid 再发单。优点是成交概率高;缺点是要写重试逻辑,重试次数和间隔没设好容易反复撞墙,甚至重复开仓。
我现在的做法是两者结合:slippage 给到 8,重试最多 3 次,间隔 200ms,并且用 MagicNumber 去重,避免重复进场。
第二类是保证金和手数问题。日志里出现 not enough money 或者 invalid volume,多半是手数没对齐。有些平台最小手数 0.01,但步长是 0.01 还是 0.1 差别很大,尤其是跑多货币对的 EA,计算出来的手数经常带一长串小数。处理方案同样分两种:一种是在下单前用 MarketInfo(MODE_MINLOT / MODE_LOTSTEP) 动态归一化手数,稳妥但代码稍长;另一种是干脆在参数里写死手数,省事但换账户或换品种就废了。我个人偏向动态归一化,毕竟换平台不用重编译。
第三类容易被忽略的是 交易时段和品种后缀。有次挂镑美,EA 一直拒单,查了半天发现经纪商那边品种名是 GBPUSD.m,而我的 EA 里写的是 GBPUSD,符号对不上直接返回 invalid symbol。还有一次是周五临近收盘,平台限制了部分品种的交易,EA 还在傻傻发单。这类问题的排查顺序建议是:
- 先看日志里具体返回的错误码,4106、4107、4108、4109 这些含义完全不同
- 再确认品种名称后缀,用 Market Watch 里的实际名字
- 最后检查账户是不是处于只读或者只平仓模式
说句实在的,错误码对照表 建议打印出来贴屏幕边上,比瞎猜快得多。
最后提一句 VPS 环境的影响。延迟高的时候,EA 报的价格到服务器已经过期,拒单率明显上升。我对比过同一套 EA 在本地和 VPS 上的表现,延迟从 60ms 降到 5ms 之后,requote 少了一大半。所以如果拒单频繁,先别急着改代码,ping 一下服务器 看看网络质量,有时候问题根本不在 EA 本身。
你们平时遇到最多的拒单错误码是哪个?有没有碰到过重试逻辑反而导致重复开仓的情况,一起聊聊排查思路。
