通过辅助指标减少内存消耗·综合运用
◍ 用类封装直接读云图与通道缓冲
这段逻辑把 Ichimoku 和自建通道指标都包成了对象,避开了 CopyBuffer 那套旧写法。直接取 ExtTenkanBuffer[0] 和 ExtKijunBuffer[0],就拿到当前 K 线与基准线的实时值,比每次调系统函数拷缓冲省一步。 通道这边同理,o_Channel[itf].ExtMiddBuffer[0] 是中轨价,Price 与之比较决定加减 Signal。注意 Init(22) 给通道定了 22 根 K 线的计算周期,换周期得改这个数。 Tenkan 上穿 Kijun 给多头加一分,下穿减一分;价格站上中轨再加一分,跌破减一分。多指标共振时 Signal 绝对值会拉大,外汇和贵金属波动剧烈,这种打分只反映概率倾向,实盘前务必在 MT5 用历史数据跑一遍验证。
o_Channel [itf].Create(Symbol(), TF[itf]); o_Channel [itf].Init(class="num">22); } class=class="str">"cmt">//=== The Ichimoku indicator o_Ichimoku[itf].Calculate(Time); class=class="str">"cmt">//CopyBuffer(h_Ichimoku[itf], class="num">0, Time, class="num">1, bufTenkan); class=class="str">"cmt">//class="type">class="kw">double Tenkan = bufTenkan[class="num">0]; class="type">class="kw">double Tenkan = o_Ichimoku[itf].ExtTenkanBuffer[class="num">0]; class=class="str">"cmt">//CopyBuffer(h_Ichimoku[itf], class="num">1, Time, class="num">1, bufKijun ); class=class="str">"cmt">//class="type">class="kw">double Kijun = bufKijun [class="num">0]; class="type">class="kw">double Kijun = o_Ichimoku[itf].ExtKijunBuffer [class="num">0]; if (Tenkan > Kijun) Signal++; if (Tenkan < Kijun) Signal--; class=class="str">"cmt">//=== The Channel indicator o_Channel[itf].Calculate(Time); class=class="str">"cmt">//CopyBuffer(h_Channel [itf], class="num">2, Time, class="num">1, bufMid); class=class="str">"cmt">//class="type">class="kw">double Mid = bufMid[class="num">0]; class="type">class="kw">double Mid = o_Channel[itf].ExtMiddBuffer[class="num">0]; if (Price > Mid) Signal++; if (Price < Mid) Signal--;
用任务管理器实测指标内存账
前面几节把辅助指标的缓存数量砍了三档,到底省了多少内存不能靠猜。直接开 MT5 接 MetaQuotes-Demo,用 Windows 任务管理器进程页读 RAM 和虚拟内存两列,相加即为客户端实际占用。 测量要逼近指标本身的消耗下限:先拉满一个品种的历史(跑一次测试就能触发自动下载),摆好图表和指标后重启客户端清掉杂项,等 CPU 归零说明计算结束,再点右上角最小化——这时候非计算内存会被释放,任务管理器里 RAM 会比虚拟内存明显小一截。 为了可比,我用了演示账户全部 22 个 M1 图表取平均,图表最大柱数保持默认 100000,系统为 32 位 Windows XP。空客户端自身占 38 Mb,空图表每张 12 Mb,这两个基数要从后续里扣掉才算纯指标账。 实测四个变体:Trender 原版 41 缓存占 46 Mb,减到 31 的 Need 版 42 Mb,21 缓存的 Aggregate 版 37 Mb,只留 1 缓存但靠 Copy 函数取数的 Include 版反而 38 Mb。缓存砍掉 40 根只剩零头,内存却没同比例掉——因为 EURUSD 的 M1 约 400 万柱,H1 仅约 7 万柱,缓存分散在五周期里大头本就不均。 更隐蔽的是价格序列本身也要吃内存:Trender 跨 5 个周期,哪怕缓存清零这五条序列也还在。Include 法把 CopyHigh/CopyLow/CopyClose 每根柱主动拉全周期数据,序列高速缓存的额外开销直接把它打回 38 Mb,并不比 Aggregate 的 37 Mb 省。外汇贵金属高杠杆环境下跑多周期指标,内存占用异常会拖慢终端,建议自己按这套最小化流程复测一遍。
「内存账本怎么换算成可用品种数」
前面三招削减指标内存、再加客户端层面的缓存调优,最终落点其实很实在:省下来的每一兆字节,都可能直接换成 MT5 里能同时挂着的货币对数量。 已保存的缓存条数与兆字节占用,完全取决于你跑的是哪类指标——有的指标结构冗余,能砍掉一大截;有的本身就很紧凑,基本无从下手。这块没有统一比例,只能逐个在「导航器—指标」里看资源监视器实测。 同时在线品种变多,组合持仓的分散度就上去了, portfolio 层面的断点风险倾向降低。外汇与贵金属本身高杠杆、高波动,这种资源腾挪不承诺收益,只是把技术约束松一档。 打开 MT5 的「视图—导航—指标」,对照任务管理器里的内存曲线,先挑两个最占资源的指标做减法,比任何推算都来得直接。
◍ 画得少,看得清
把 Trender 系列指标塞进 MT5 时,记住一点:除 Trender-Include 外,其余版本都只在 MQL5\Indicators\TestSlaveIndicators 里找辅助文件。没按这个路径放,图表上大概率空白。 附件里 8 个 mq5 文件总占用约 37.82 KB,最重的是 trender-include.mq5(9.54 KB)。想在多货币对上跑又怕内存爆,先去「工具-选项」里限一下最大条形图,32 位终端实测到 2GB 总内存(RAM+虚拟)就会崩。 最后这段控制可见柱数的代码,就是少画多看的落地办法——只算最近 100 根,缓冲区立刻瘦身。外汇和贵金属波动剧烈、杠杆高风险大,参数请自行回测再上实盘。
class="type">int maxbars =class="num">100;class=class="str">"cmt">// 最后一小节 limit = rates_total-rates_total+maxbars;
class="type">int maxbars =class="num">100;class=class="str">"cmt">// 最后一小节 limit = rates_total-rates_total+maxbars;