EA成交执行的滑点记录脚本,我踩过的坑和解决方案

新帖
登录发帖
Exness 推荐平台

入金门槛低,出金到账快,支持多种账户类型

FSA(塞舌尔)/FCA(英国) / CySEC(塞浦路斯) · 最低入金 $130
hm98983
hm98983 楼主 3 小时前 浏览 8 回复 0 阅读 1 分钟
Lv.1 新手汇友 等级 Lv.1 主题 4 帖数 15 积分 315 汇币 178
1楼
我一直以为滑点这东西只能认命,直到有次复盘发现同一套EA在欧美上实盘和回测差了快30个点,我才意识到不记录根本说不清是策略问题还是执行问题 😅
先说问题。我用的MT4,EA下单后成交价和信号价到底差多少,平台不会主动告诉你。一开始我想得很简单,在下单函数后面读一下OrderOpenPrice()跟当时Ask/Bid比一比不就行了。结果坑来了:市价单发出到成交有延迟,你在代码里取的“信号价”其实是下单那一刻的价格,等回报回来价格早变了,这样算出来的滑点根本不准。更坑的是镑美这种点差会跳的品种,有时候滑点显示是负的,其实是点差瞬间扩大造成的,不是真的成交比信号价好。
后来我换了个思路,不猜,直接记。核心做法是在OnTick里维护一个“待成交队列”:EA每发一单,就把订单号、信号价、下单时间、品种、方向先塞进数组或者写到全局变量里;然后等OnTradeTransaction(MT5)或者轮询OrderSelect(MT4)确认成交后,再用实际成交价减去信号价,算出滑点并落盘。这里踩的第一个坑是MT4没有OnTradeTransaction,只能用OnTimer定时去扫,间隔别设太密,我一开始设了100毫秒,CPU直接飙起来,后来改成500毫秒才稳。
具体步骤我整理了一下,给同样在折腾的汇友参考:
  • 第一步,建一个结构体数组存待成交记录,字段至少要有ticket、signalPrice、sendTime、symbol、type,数组大小给个50够用了,别开太大。
  • 第二步,在OrderSend成功返回ticket后立刻把记录push进去,注意OrderSend返回true不代表成交,一定要拿到ticket再记。
  • 第三步,用OnTimer或OnTradeTransaction去匹配ticket,匹配上就计算slippage = (实际成交价 - 信号价) / Point,注意多空方向要乘正负号,我一开始忘了这个,多单空单混在一起算,数据全乱。
  • 第四步,把结果写进CSV,字段带上时间、品种、方向、手数、信号价、成交价、滑点、点差,方便后面用表格拉透视。
  • 第五步,定期清理数组里超时没匹配上的记录,不然跑几天内存就涨上去了。

第二个大坑是点差干扰。我发现黄金在数据行情那几分钟,滑点记录能飙到几十个点,但一看点差也同步放大了。所以脚本里最好把成交时的点差一起记下来,复盘的时候把“滑点 - 点差变化”单独拎出来看,才能分清是平台执行慢还是行情本身在跳。这个细节不注意,你会误杀一套本来没问题的EA。
第三个坑是文件写入。我一开始每笔成交都直接FileWrite,跑高频策略的时候磁盘IO拖得整个EA都卡。后来改成内存里攒够20条或者每5分钟批量写一次,才顺过来。还有记得用FILE_CSV|FILE_ANSI打开,不然中文注释或者符号容易乱码。
现在我这套脚本跑在VPS上,每天收盘拉一次CSV,欧美正常时段滑点基本在0.3到0.8个点,数据行情能到3个点,心里就有数了。你们平时会专门记滑点吗,还是成交了就完事?有没有更省事的写法,求指点 🙏
0 回复 众裁0 复制
#1
💬
暂无回复,来抢沙发吧!
THE END
本帖内容仅供学习交流,不构成任何投资建议。外汇交易存在高风险,请谨慎参与。
← 上一帖 返佣提现后再入金的循环记录,从亏损到盈利我做对了什么 下一帖 → 新手求助:平台模拟和实盘的行情同步吗