🎯
指标句柄进阶:IndicatorCreate 与 iCustom
两种拿指标句柄的方式与 CopyBuffer 取数正确姿势
#MQL5#指标句柄#IndicatorCreate#iCustom#CopyBuffer
MQL5 不再像 MT4 那样直接取某根 K 的指标值,而是先拿指标句柄(一个整数),再用 CopyBuffer 按区间复制数据。句柄由 IndicatorCreate 或技术指标函数返回,失败返回 -1。
一、句柄是什么
句柄是搭配特定指标使用的唯一标识符,存为 int。拿到句柄后,用 CopyBuffer 按给定间隔取指标值,而不是逐根传柱索引。
二、两种拿句柄的方式
- IndicatorCreate(Symbol, 周期, 指标类型, 参数个数, MqlParam[]):面向对象项目最方便;
- iMA/iMACD/iCCI 等内置函数,或 iCustom 调用任意自定义指标。
三、用 MqlParam 给指标传参
调 IndicatorCreate 前填 MqlParam 数组,每个元素用 type 字段指明 integer_value / double_value / string_value;MA 用 TYPE_INT,SAR 用 TYPE_DOUBLE。数组大小用 ArrayResize 设成参数个数。
✦ 句柄只建一次
指标句柄只要在 OnInit 里创建一次,别在 OnTick 里反复建——每 tick 重建既浪费又可能因计算未完成而取不到数据。
四、iCustom 调用自定义指标
- 参数:品种(NULL=当前)、周期(0=当前)、指标名(须在 MQL5/Indicators 下编译)、其余为输入参数;
- 自定义指标最多 512 个缓冲区;
- 失败返回 INVALID_HANDLE。
五、用 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 分别对应,填错会取到别的线。