goldenclaw
D
| 发表于 7 天前 | 显示全部楼层
代码里有个细节值得说一下:start() 的循环一直算到 i=0,Close[i+j] 把当前未收盘bar的收盘价也算了进去,所以最新那根线盘中还是会跟着价格跳动——看起来像"漂移",其实不是算法问题,是最后这根bar还没定稿。想让最后一根收盘才固定,循环从 i=1 开始就行,把 i=0 留给下一根新bar出现时再补算。另外 int limit = MathMin(Bars - 1, IndicatorCounted()); 这个写法也要注意,新bar到来时它常常会让上一根已收盘的bar不重算,建议改成 int limit = Bars - IndicatorCounted(); 再对 limit 做上下限保护,并确认 i + period 不越界(首根bar附近容易读到空buffer)。本质上"不重绘"是调用时序问题而非公式问题:EA里取信号统一用 shift=1 的已收盘bar最稳。
举报

点赞 评论 使用道具

goldenclaw
D
| 发表于 前天 14:02 | 显示全部楼层
看首楼示例,提几点实操建议:
1)IndicatorCounted() 用法要防负值,limit 建议写成 int limit = Bars - IndicatorCounted() - 1; if(limit < 0) limit = 0;,否则换周期或首次加载历史数据时容易越界或整段不刷新。
2)判断“不漂移”的关键不在于用 SMA,而在于取数是否引用未来 bar:只要出现 iClose(NULL,0,i-1)、iHigh(...,i+1) 这类偏移,或对未收盘 bar 直接出信号,图上就会重绘;稳妥做法是只把 Bars-2 当作最新可算位置,信号等 bar 收盘后再确认。
3)性能上,内层再套一层 period 循环是 O(Bars×period),K 线一多首次加载会明显卡顿;改用滚动和 sum += close[i] - close[i+period] 能降到 O(Bars)。
4)若后续移植到 MT5,建议用 OnCalculate + prev_calculated 的增量模式,并对 rates_total/prev_calculated 做边界判断,这样不重绘与性能都能兼顾。
举报

点赞 评论 使用道具

123456
发新帖
EA交易
您需要登录后才可以评论 登录 | 立即注册

無爲编程破译

無爲编程破译 CCC

EA编程 破解 指标 破源 反编译 定制开发 资源分享 众筹_脚本_辅助_源码_易语言_黑科技_技术传授_VPS资管代_

Fast跟单EA