首页 / 交易学院 / 小布知识库 / 基于已有指标编写新指标(iCustom/派生)
基于已有指标编写新指标(iCustom/派生)
🧬

基于已有指标编写新指标(iCustom/派生)

改造开源指标或用 iCustom 引用它,派生出新指标

MQL5 编程 难度 · 进阶 2026-07-15 10 分钟阅读
#MQL5#指标#iCustom#派生#缓冲区

本文讲如何基于已有指标(内置或自定义)写新指标:①改开源自定义指标加一条信号线;②用 iCustom / IndicatorCreate 引用已有指标,算差值做新标绘。

一、两种站在别人肩膀上的写法

路线一改源码、路线二引用成品,两条路都讲,按你手上有什么选。

二、改造现有指标加信号线

三、用 MovingAverages 库算信号线

系统库提供 SMA/EMA/LWMA/SMMA 函数;用 switch(sm) 选类型,ExponentialMAOnBuffer 等把主线平滑成信号线。

✦ 原料与成品分开
中间计算缓冲用 INDICATOR_CALCULATIONS,不会画出来但能被主计算引用——把原料和成品缓冲分开是写好复杂指标的关键。

四、用 iCustom 引用别的指标

Handle = iCustom(_Symbol, PERIOD_CURRENT, "TSIs", r, s, sp, sm);OnCalculate 里 CopyBuffer 复制源指标缓冲,再循环算差值/着色。

五、彩色直方图与计算范围

⚠ begin 与错误重算
begin 参数别早于源数据起始(文中 begin2 = begin + r + s - 1);CopyBuffer 返回 -1 时设静态 error 下次全量重算,否则会画出断层。

六、用 iMA / iADX 取缓冲再组合

派生指标的常见做法:先用 iMA、iADX、iRSI 等拿到底层指标的句柄与缓冲,在自己的 OnCalculate 里读出来做运算(差值、比值、背离),再把结果写进自己的缓冲画线。这样你站在现成指标肩上,只写「组合逻辑」。

注意缓冲索引对齐:不同指标的周期、偏移可能不同,组合前要先统一到同一根 K 线、同一索引,否则会出现「用昨天的快线比今天的慢线」这类错位 bug。 一个稳妥写法是所有输入指标都用同一周期,跨周期组合时显式用 iTime 对齐时间轴,而不是靠索引巧合,这样回测与实盘行为才一致。

七、派生指标的缓冲设计

派生指标通常要两条线:一条主计算线(DRAW_LINE)、一条信号线或箭头(DRAW_ARROW)。在 OnInit 里声明多缓冲,OnCalculate 里分别写值;信号箭头用不同缓冲加箭头缓冲属性。

✦ 缓冲要对齐
组合多个指标时,先确认它们都从同一根 K 线、同一索引取值。错位一根,信号就整体慢一拍,回测看着好、实盘必亏。

八、实例:把 RSI 背离做成派生指标

RSI 背离(价格新高但 RSI 不新高)是经典反转信号。派生指标可同时读价格缓冲与 RSI 缓冲,检测「N 根内价格更高但 RSI 更低」,在对应 K 线打箭头。逻辑清晰、可复用,也方便 EA 用 iCustom 直接调用。

做这类指标时把「背离判定窗口 N」「阈值」做成 input 参数,别人和你自己都能调,不必改代码。参数化是派生指标能否被复用的关键。

九、小结

✦ 小结
派生指标 = 站在现成指标肩上只写组合逻辑:iMA/iADX 取缓冲、对齐索引后运算、多缓冲画主线与信号箭头。把窗口与阈值参数化,RSI 背离这类信号就能复用、也能被 EA 直接调用。

常见问题

要画出来的缓冲用 DATA;只当中间变量的用 CALCULATIONS,既省显存也避免图上多出无关线。
几乎一样,都返回句柄再用 CopyBuffer 取数;差别只是指标 Create 用 MqlParam 数组传参,iCustom 直接列参数。
让指标只在新增的柱上算,历史部分不重算,既快又不会在左端画出计算空洞。
准备一个颜色索引缓冲,循环里按大于/小于/等于前一根赋 0/1/继承,渲染器据此选色。
先另存副本再改;确认原指标的缓冲区含义与索引;新增缓冲后重新索引,否则新旧缓冲会错位。