指标句柄进阶: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 设成参数个数。
四、iCustom 调用自定义指标
- 参数:品种(NULL=当前)、周期(0=当前)、指标名(须在 MQL5/Indicators 下编译)、其余为输入参数;
- 自定义指标最多 512 个缓冲区;
- 失败返回 INVALID_HANDLE。
五、用 CopyBuffer 取数据
设 ArraySetAsSeries(数组, true) 让索引 0 = 最新柱;CopyBuffer(句柄, 缓冲区号, 起始柱, 柱数, 数组);失败返回 -1,用 GetLastError 打印排查。
六、iCustom 与 IndicatorCreate 的区别
iCustom 适合「调用现成指标文件」,你只给文件名加参数就拿句柄,简单直接,但拿不到指标内部中间缓冲。IndicatorCreate 则能在代码里动态创建指标实例、指定缓冲数量与类型,灵活度更高,适合自己拼装复杂指标。
选型:读别人的指标用 iCustom;要运行时按条件生成不同配置的指标,用 IndicatorCreate。两者拿到的都是 handle,后续一律用 CopyBuffer 取数,思路一致。
七、CopyBuffer 实战与返回校验
句柄不是数据,CopyBuffer(handle, buf_idx, start, count, array) 才是取数。它的返回值是「实际拷到的元素个数」,必须和期望的 count 比较,少于说明数据未就绪,此时用数组值会拿到脏数。
double buf[]; int h = iCustom(_Symbol, PERIOD_M15, "MyIndi", 14); int n = CopyBuffer(h, 0, 0, 3, buf); if(n < 3) return; // 数据未就绪,跳过本 tick double v = buf[0];
八、句柄失效与重连
句柄可能因品种下架、图表周期关闭、指标文件被删而失效,此后 CopyBuffer 持续返回 0。稳健做法是在连续失败时重建句柄,或至少在日志报警,而不是静默用空数据交易。
一个易忽略点:切换品种或周期后旧句柄作废,必须在新环境重新 iCustom / IndicatorCreate。把句柄获取收进「按需 lazily 获取 + 失败重试」的小函数,能省掉大量重复判断。