调试CCI时绕不开的坎

较热45.6
登录发帖
XM 推荐平台

覆盖品种全,新手友好,支持多种入金方式

CySEC(塞浦路斯) / ASIC(澳洲) / IFSC(伯利兹) · 最低入金 $5
MeadowBreeze
MeadowBreeze 楼主 4 天前 浏览 336 回复 6 阅读 1 分钟
Lv.1 新手汇友 等级 Lv.1 主题 2 帖数 13 积分 1523 汇币 1391
1楼
最近在搞一个一目均衡表的自定义指标,碰到几个挺有意思的坑,来跟大家唠唠。

早上盯盘的时候突然来了点灵感,做EA开发的朋友应该懂这种感觉。

先说第一个坑:指标挂在1小时周期上死活不刷新,查了半天才发现是OnCalculate里prev_calculated没处理好,血泪教训。
第二个坑:用iCustom跨周期取数据的时候,如果目标周期还没加载完,它直接给你返回个0,不加容错处理的话后面全乱套。
第三个坑:回测跑大数据量的时候内存直接起飞,后来发现ArraySetAsSeries得配合正确的释放姿势,不然就是给自己挖坑。

说到底,别跟行情对着干,写代码也一样,先让它跑起来再慢慢调优。

个人经验,不喜勿喷哈。

补充个小细节:OnCalculate里prev_calculated最好在每根K线收盘后再更新,不然盘中来回跳会反复重算历史数据,白白拖慢速度。
0 回复 众裁0 复制
#1
sunny5468
sunny5468 #2· 前天 09:13
2楼
大佬你这个prev_calculated收盘后再更新是手动判断新K线吗?我写EA挂1小时也老遇到不刷新的问题,盘中数据来回跳重算好几遍,是不是也跟这个有关啊求指点
赞 回复 众裁0 复制
前天 09:13 #2
yhn65663
yhn65663 #3· 前天 14:33
3楼
sunny5468 那个不刷新,八成就是 prev_calculated 没控好。我是用 iTime 比对上一根K线时间,变了才整根更新,盘中只补当前bar。iCustom 跨周期记得循环等 Bars 够数再取,不然返回0直接把你信号带偏。
赞 回复 众裁0 复制
前天 14:33 #3
听风入眠
听风入眠 #5· 昨天 10:03
5楼
一目均衡表这块我也踩过类似的。iCustom跨周期返回0,光等Bars够数还不够,还得检查目标周期句柄是否有效,Handle没准备好照样给0。建议加个重试计数,超时再报警。
另外内存起飞那个,ArraySetAsSeries只是设置索引方向,真正吃内存的是没及时ArrayFree,尤其回测里每次OnTick都新建数组的话隐患更大。
至于刷新,MeadowWanderer问的,可以用iTime(_Symbol,PERIOD_CURRENT,0)跟存的上根时间比,变了才整根重算。
赞 回复 众裁0 复制
昨天 10:03 #5
咸鱼翻身同学
咸鱼翻身同学 #6· 昨天 14:03
6楼
楼上说的iTime比对我一般放在OnTick里判新K线,但指标里更稳的是直接看rates[0].time变没变。另外跨周期那个,句柄有效也别急着取,我会先跑一次CopyBuffer看返回几个值,不够就跳过这轮。回测内存炸还有个坑,别在循环里重复建数组,我吃过这亏。
赞 回复 众裁0 复制
昨天 14:03 #6
dawn3082
dawn3082 #7· 昨天 22:42
7楼
关于新K线判断,楼上几位说的rates[0].time变没变其实最省事,但有个细节容易被忽略:目标周期还没历史数据的时候rates[0].time可能一直是0,最好加个判断rates总数够不够。
我补充两个方案吧:

  • 轻量级——在OnCalculate里缓存上一根K线时间,用静态变量存,比数组每帧读省事
  • 稳一点——用iTime(_Symbol,目标周期,0)单独比对,跨周期时更可控

前一个适合同周期,跨周期建议用后者。另外Handle这块,句柄有效跟数据就绪是两回事,最好再配合Bars检查,不然返回0照样踩坑。
回测内存炸那个,其实除了ArraySetAsSeries,循环里别反复new数组也关键,能用固定大小就别动态分配。
赞 回复 众裁0 复制
昨天 22:42 #7
THE END
本帖内容仅供学习交流,不构成任何投资建议。外汇交易存在高风险,请谨慎参与。
← 上一帖 非农夜挂单进场秒成交却立刻浮亏,新手该不该设止损 下一帖 → 挂单成交价与图表标记差了两个点,是流动性问题还是报价源不同步