首页 / 交易学院 / 指标句柄进阶:IndicatorCreate 与 iCustom
指标句柄进阶:IndicatorCreate 与 iCustom
🎯

指标句柄进阶:IndicatorCreate 与 iCustom

两种拿指标句柄的方式与 CopyBuffer 取数正确姿势

MQL5 编程 难度 · 入门 2026-07-15 11 分钟阅读
#MQL5#指标句柄#IndicatorCreate#iCustom#CopyBuffer

MQL5 不再像 MT4 那样直接取某根 K 的指标值,而是先拿指标句柄(一个整数),再用 CopyBuffer 按区间复制数据。句柄由 IndicatorCreate 或技术指标函数返回,失败返回 -1。

一、句柄是什么

句柄是搭配特定指标使用的唯一标识符,存为 int。拿到句柄后,用 CopyBuffer 按给定间隔取指标值,而不是逐根传柱索引。

二、两种拿句柄的方式

三、用 MqlParam 给指标传参

调 IndicatorCreate 前填 MqlParam 数组,每个元素用 type 字段指明 integer_value / double_value / string_value;MA 用 TYPE_INT,SAR 用 TYPE_DOUBLE。数组大小用 ArrayResize 设成参数个数。

✦ 句柄只建一次
指标句柄只要在 OnInit 里创建一次,别在 OnTick 里反复建——每 tick 重建既浪费又可能因计算未完成而取不到数据。

四、iCustom 调用自定义指标

五、用 CopyBuffer 取数据

设 ArraySetAsSeries(数组, true) 让索引 0 = 最新柱;CopyBuffer(句柄, 缓冲区号, 起始柱, 柱数, 数组);失败返回 -1,用 GetLastError 打印排查。

⚠ 务必检查返回值
忽略 CopyBuffer 返回值,会让 EA 在取不到数据时用陈旧/空数组做决策,这类 bug 很难肉眼发现。

常见问题

用类库、做大型项目用 IndicatorCreate 更整齐;快速写 EA 测想法用 iCustom 更省事。两者拿到的句柄用法完全一致。
指标会收到错误的参数类型,句柄可能创建失败(返回 -1)或算出错误数值;整数参数用 TYPE_INT,小数用 TYPE_DOUBLE。
让缓冲数组和 K 线时间序列一致:索引 0 是最新柱,写策略判断上穿/下穿时不用倒着数。
说明指标创建失败,先用 Print(GetLastError()) 看原因(参数错、品种不存在、指标未编译等),再在 OnInit 里早返回。
单缓冲指标填 0;多缓冲(如 MACD 有主线/信号线/柱)按文档顺序 0/1/2 分别对应,填错会取到别的线。