首页 / 交易学院 / MQL5 指标调用入门:句柄、缓冲区与安全编程
MQL5 指标调用入门:句柄、缓冲区与安全编程
🧰

MQL5 指标调用入门:句柄、缓冲区与安全编程

EA 怎么读取一个指标的值?从 iMA 句柄、CopyBuffer 到时间序列索引,新手最容易踩的坑一次讲清。

MQL5 编程 难度 · 入门 2026-01-26 7 分钟阅读
MQL5指标句柄CopyBuffer缓冲区时间序列OnInit

核心概念:指标句柄(Handle)

在 MQL5 里,EA 不直接调用指标函数,而是先用 iMA/iMACD/iRSI 等创建指标句柄(一个整数 ID),再从这个句柄把数值复制出来。句柄在 OnInit 创建一次,全局复用。

句柄创建是绑定参数的动作(品种、周期、参数),不是取数。取数要靠 CopyBuffer。

用 CopyBuffer 取值

CopyBuffer(handle, buffer_index, start_pos, count, array) 把指标第 buffer_index 个缓冲区的数值复制到数组。注意:CopyBuffer 返回的是复制到几个元素,要据此判断数组有效长度。

时间序列索引:最新在 0

MQL5 的价格或指标数组默认最新数据在索引 0(与 MQL4 相反)。若你用普通数组接数据且想按时间顺序访问,需要 ArraySetAsSeries(array, true) 翻转索引方向。

忘记 ArraySetAsSeries 是新手最常见的指标值错位 bug——你会把昨天的均线当成今天的。

标准 EA 骨架:OnInit / OnTick

经典结构:OnInit 里创建所有句柄并做错误检查;OnTick 里 CopyBuffer 取最新值、判断信号、交易。OnInit 失败应返回 INIT_FAILED 阻止 EA 启动。

安全编程:永远检查返回值

句柄可能为 INVALID_HANDLE,CopyBuffer 可能返回 0。任何调用后都应判错,避免用空数据交易。

养成习惯:if(handle==INVALID_HANDLE){ Print(句柄创建失败); return; }——少一行,EA 可能用垃圾数据默默下单。

常见问题

MQL5 把指标计算与取数分离。句柄等于绑定参数并启动指标计算;CopyBuffer 等于把结果拷出来。这样多个 EA 可共享同一指标计算,更高效。
看你接数据的数组怎么用。若按索引 0 等于最新去读(如 rates[0] 是最新收盘价),不用;若想要索引 0 等于最旧的时间顺序,就要设 true。
句柄创建有开销,且参数固定。放到 OnInit 只建一次,OnTick 反复复用,避免每 tick 重建拖慢且可能失败。
不一定——可能只是当前没有足够数据。但返回负数一定是错误,必须判错后跳过本次交易。