🧬
基于已有指标编写新指标(iCustom/派生)
改造开源指标或用 iCustom 引用它,派生出新指标
#MQL5#指标#iCustom#派生#缓冲区
本文讲如何基于已有指标(内置或自定义)写新指标:①改开源自定义指标加一条信号线;②用 iCustom / IndicatorCreate 引用已有指标,算差值做新标绘。
一、两种站在别人肩膀上的写法
路线一改源码、路线二引用成品,两条路都讲,按你手上有什么选。
二、改造现有指标加信号线
- 改 indicator_buffers / plots 各 +1;
- 声明新缓冲区数组;
- SetIndexBuffer 关联,第三参区分 INDICATOR_DATA(显示)与 INDICATOR_CALCULATIONS(中间);
- PlotIndexSetInteger 切掉开头空白。
三、用 MovingAverages 库算信号线
系统库提供 SMA/EMA/LWMA/SMMA 函数;用 switch(sm) 选类型,ExponentialMAOnBuffer 等把主线平滑成信号线。
✦ 原料与成品分开
中间计算缓冲用 INDICATOR_CALCULATIONS,不会画出来但能被主计算引用——把原料和成品缓冲分开是写好复杂指标的关键。
四、用 iCustom 引用别的指标
Handle = iCustom(_Symbol, PERIOD_CURRENT, "TSIs", r, s, sp, sm);OnCalculate 里 CopyBuffer 复制源指标缓冲,再循环算差值/着色。
五、彩色直方图与计算范围
- DRAW_COLOR_HISTOGRAM 用值+颜色索引双缓冲,相等继承前色、大于设绿、小于设红;
- 用 prev_calculated 控制计算起点,避免每 tick 重算全部。
⚠ begin 与错误重算
begin 参数别早于源数据起始(文中 begin2 = begin + r + s - 1);CopyBuffer 返回 -1 时设静态 error 下次全量重算,否则会画出断层。
常见问题
要画出来的缓冲用 DATA;只当中间变量的用 CALCULATIONS,既省显存也避免图上多出无关线。
几乎一样,都返回句柄再用 CopyBuffer 取数;差别只是指标 Create 用 MqlParam 数组传参,iCustom 直接列参数。
让指标只在新增的柱上算,历史部分不重算,既快又不会在左端画出计算空洞。
准备一个颜色索引缓冲,循环里按大于/小于/等于前一根赋 0/1/继承,渲染器据此选色。
先另存副本再改;确认原指标的缓冲区含义与索引;新增缓冲后重新索引,否则新旧缓冲会错位。