设为首页 收藏本站 切换语言 切换语言

1. 用 OnCalculate 做增量更新,替换全量 start() 问题:当前 start() 每个 Tick 都要跑两段 for(i=bars–1 …) 的全量循环(TMA ...

| 发表于 2025-5-16 08:54:15 | 显示全部楼层 |复制链接
1. 用 OnCalculate 做增量更新,替换全量 start()
问题:当前 start() 每个 Tick 都要跑两段 for(i=bars–1 …) 的全量循环(TMA、EMA、MarkBS 内的多层循环),即使你把 bars 砍到 500,也仍是 O(500²) 的重复计算。

建议:改用 MQL4 新版指标模板的 OnCalculate(),并利用 prev_calculated 只对 “新增” 或 “修改” 的那根/几根 Bar 做计算:

mql4
复制
编辑
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[], const double &high[],
                const double &low[],  const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
    int start = prev_calculated > 0 ? prev_calculated - 1 : HalfLength;
    // 只针对 start..rates_total-1 的点做中轨/趋势线/EMA 计算
    for(int i = start; i < rates_total; i++)
    {
        // …三角加权、中轨、上下轨、趋势线、EMA9/45 计算
    }
    ChartRedraw();  
    return rates_total;
}
这样,每次 Tick 最多只计算几根 K 线,大幅降低 CPU 占用。

这个OnCalculate参数很不错呀,只是没有尝试过。
image.png
举报

评论 使用道具

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

 简体中文国旗 简体中文
 繁體中文国旗 繁體中文
 English国旗 English(英语)
 日本語国旗 日本語(日语)
 Deutsch国旗 Deutsch(德语)
 Русский язык国旗 Русский язык(俄语)
 بالعربية国旗 بالعربية(阿拉伯语)
 Türkçe国旗 Türkçe(土耳其语)
 Português国旗 Português(葡萄牙语)
 ภาษาไทย国旗 ภาษาไทย(泰国语)
 한어国旗 한어(朝鲜语/韩语)
 Français国旗 Français(法语)
翻译