🧰
MQL5 指标调用入门:句柄、缓冲区与安全编程
EA 怎么读取一个指标的值?从 iMA 句柄、CopyBuffer 到时间序列索引,新手最容易踩的坑一次讲清。
MQL5指标句柄CopyBuffer缓冲区时间序列OnInit
核心概念:指标句柄(Handle)
在 MQL5 里,EA 不直接调用指标函数,而是先用 iMA/iMACD/iRSI 等创建指标句柄(一个整数 ID),再从这个句柄把数值复制出来。句柄在 OnInit 创建一次,全局复用。
✦
句柄创建是绑定参数的动作(品种、周期、参数),不是取数。取数要靠 CopyBuffer。
用 CopyBuffer 取值
CopyBuffer(handle, buffer_index, start_pos, count, array) 把指标第 buffer_index 个缓冲区的数值复制到数组。注意:CopyBuffer 返回的是复制到几个元素,要据此判断数组有效长度。
- buffer_index:指标可能有多个输出(如 MACD 有主线、信号线、直方图)
- start_pos:从最新一根往前数的位置(0 等于当前)
- 多缓冲区指标(如 Alligator 有 3 条线、MACD 有 3 条)要分别 CopyBuffer
时间序列索引:最新在 0
MQL5 的价格或指标数组默认最新数据在索引 0(与 MQL4 相反)。若你用普通数组接数据且想按时间顺序访问,需要 ArraySetAsSeries(array, true) 翻转索引方向。
✦
忘记 ArraySetAsSeries 是新手最常见的指标值错位 bug——你会把昨天的均线当成今天的。
标准 EA 骨架:OnInit / OnTick
经典结构:OnInit 里创建所有句柄并做错误检查;OnTick 里 CopyBuffer 取最新值、判断信号、交易。OnInit 失败应返回 INIT_FAILED 阻止 EA 启动。
- 30 多个标准指标(iMA/iRSI/iMACD/iBands/iATR/iStochastic 等)用法一致
- 自定义指标也可用同样方式通过 iCustom 获取句柄
安全编程:永远检查返回值
句柄可能为 INVALID_HANDLE,CopyBuffer 可能返回 0。任何调用后都应判错,避免用空数据交易。
✦
养成习惯:if(handle==INVALID_HANDLE){ Print(句柄创建失败); return; }——少一行,EA 可能用垃圾数据默默下单。
常见问题
MQL5 把指标计算与取数分离。句柄等于绑定参数并启动指标计算;CopyBuffer 等于把结果拷出来。这样多个 EA 可共享同一指标计算,更高效。
看你接数据的数组怎么用。若按索引 0 等于最新去读(如 rates[0] 是最新收盘价),不用;若想要索引 0 等于最旧的时间顺序,就要设 true。
句柄创建有开销,且参数固定。放到 OnInit 只建一次,OnTick 反复复用,避免每 tick 重建拖慢且可能失败。
不一定——可能只是当前没有足够数据。但返回负数一定是错误,必须判错后跳过本次交易。