自定义指标(第一部份):在MQL5中逐步开发简单自定义指标的入门指南(基础篇)
◍ 从零写个 MT5 自定义指标
在 MT5 里做自定义指标,第一步不是画什么神奇曲线,而是先搞懂指标文件的结构。MQL5 把指标当成一种特殊的可执行程序,编译后放在 MQL5/Indicators 目录下,终端启动时会自动加载。 新建一个指标最省事的办法是用 MetaEditor 的向导:选『自定义指标』,勾掉『允许手动绘制』,剩下交给模板。但模板生成的 OnInit 里那堆 IndicatorSetString 和 PlotIndexSetInteger 才是你真正要改的地方。 一个冷启动数据:这篇入门指南原文在 2024 年 11 月 8 日发布,到统计时已有 3861 次查看。说明即便在 AI 辅助编程时代,手搓 MQL5 指标的人并不少。外汇与贵金属杠杆高,拿自己写的指标直接上实盘前,务必先在策略测试器跑历史数据验证信号逻辑。
为什么要把市场读成图
交易效率的根基,是把行情数据变成肉眼能处理的视觉结构。早期手绘蜡烛到现在的多指标叠加,本质都是用图形线索替代纯数字堆砌,否则面对每秒跳动的外汇报价,人脑根本来不及做决策。 MQL5 指标的价值在于把数学计算直接焊在价格图上。它用算法统计波动率、动量或成交量分布,把「市场正在发生什么」压缩成一条可观察的线或色块,贵金属和外汇的高波动环境下这点尤其关键。 本系列后续会拆开讲怎么在 MT5 里从零写自定义指标,不局限于自带模板。目标只有一个:让你按自己的进出场逻辑造出专属可视化工具,而不是被现成指标牵着走。
「指标到底在图表上干了什么」
指标本质是套在数学公式上的历史价格处理器:把已发生的报价喂进算法,吐出可视化信号。它只做分析,不下单、不改仓、不平仓——MT5 里任何指标都没有交易权限,这点和外挂 EA 必须分清。 渲染形态很杂:折线、直方图、箭头、甚至直接叠在 K 线上。它们的共同作用是把趋势、反转点、超买超卖区从裸图里拎出来。比如你加载一条 20 周期均线,图表上那条线每来一根新柱就重算一次,实时跟价。 按功能切,常见就四类——趋势跟踪、动量、波动率、成交量。打开 MT5 导航器挨个点开看,每类底下官方自带指标少说十几个,足够你先摸清脾气再谈组合。外汇和贵金属杠杆高,信号只是概率参考,别当指令用。
◍ MT5里指标分哪两类,能改什么不能改什么
MQL5体系下指标只有两种:平台预载的技术指标,以及用户自己写的自定义指标。前者像iMA、iRSI、iMACD都固化在MT5内部,源码不开放,你没法直接改算法,只能靠预定义函数去调用。 想动内置指标的脑子,唯一正路是用MQL5技术指标函数去包装和扩展。比如iMA算指定序列的简单移动平均,iRSI看近期涨跌幅度判超买超卖,iMACD靠两条均线的聚散找趋势反转点——这些函数文档里有一份完整列表,开MT5按F1搜『MQL5技术指标函数』就能调出来。 自定义指标才是真正能落手的地方。计算逻辑随便你定,可视化也能深度改:线型、箭头、彩色K线、颜色对象都能挂。样例代码别忽视,装在 MQL5\Indicators\Examples 和 MQL5\Indicators\Free Indicators 两个目录里,直接读源码比看文档上手快。 外汇和贵金属波动大、杠杆高风险高,自定义指标只是辅助判势,任何信号都只是概率倾向,别当成进场圣旨。先改一个Free Indicators里的RSI样例,把超买线从70调到80,挂黄金15分钟图看看信号密度变化,比空谈灵活性强弱实在。
拆开一个MQ5指标文件的骨架
在 MT5 里写自定义指标,第一步不是写算法,而是搞清楚 .mq5 文件由哪几块拼成。所有指标源码都落在终端安装目录的 MQL5\Indicators 下;从 MT5 菜单 File → 打开数据文件夹(Ctrl+Shift+D),或 MetaEditor 左侧 Navigator(Ctrl+D 唤出)都能进到这个目录。 用 MQL5 向导建文件时,选「自定义指标」→ 填 Indicators\Article\LinearMovingAverageHistogram → 事件处理勾 OnCalculate(...,prices) → 绘图属性勾「在单独窗口中显示」。生成后会在 Indicators 下多出 Article 子文件夹,里面就是空壳 LinearMovingAverageHistogram.mq5,只含 OnInit 和 OnCalculate 两个标准函数。 头部区域由三部分组成:注释块(不影响运行)、#property 指令、全局变量。indicator_separate_window 决定指标画在独立窗口;编译空壳会报「没有为指标定义指标绘图」,因为缺了缓冲区与绘图声明。 三个必填 property 是 indicator_separate_window / indicator_buffers / indicator_plots。我们的直方图指标要 2 个缓冲区(直方图 + 价格线)和 2 个绘图。缓冲区用动态数组声明,再在 OnInit 里靠 SetIndexBuffer 交给平台管内存,变成其他指标可引用的时序数组。 OnCalculate 的简版收四个参:rates_total 是 price[] 总长度;prev_calculated 存上次计算量,避免每跳重算全历史;begin 设为 _maPeriod,柱数不够就暂停;price 是加载时选的 OHLC 等数据源。写好 GetInit() 与 GetLWMA() 后编译零警告,加载图表即可见独立窗口直方图。外汇与贵金属杠杆高,验证前先用模拟盘跑通逻辑。 下面这段是向导生成文件的头部注释原样,注意它只是版权标识、不参与计算:
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| LinearMovingAverageHistogram.mq5 | class=class="str">"cmt">//| Copyright class="num">2024, Wanateki Solutions Ltd. | class=class="str">"cmt">//| https://www.wanateki.com |
「指标骨架先跑通再填计算逻辑」
上面这段 MT5 自定义指标代码,目前是两个空壳函数,但已经具备独立编译运行的最小结构。OnInit 返回 INIT_SUCCEEDED 表示初始化通过,OnCalculate 直接 return(rates_total) 让每次刷新都重算全部柱体,在副图窗口里能挂上名占位。 #property indicator_separate_window 决定它不走主图叠加,而是单独开一个子窗口;rates_total 是当前品种已加载的 K 线总数,prev_calculated 记录上轮算到第几根,begin 是有效数据起始偏移,price[] 则是传入的待处理价格序列。 先把这套骨架在 MT5 里建个 .mq5 文件粘进去编译,能看见副图空窗口就说明通道通了。之后往 OnCalculate 里填线性移动平均的差值计算,才有承载的地方。外汇与贵金属杠杆高,指标仅是概率参考,实盘须自行风控。
class="macro">#class="kw">property copyright "Copyright class="num">2024, Wanateki Solutions Ltd." class="macro">#class="kw">property link "https:class=class="str">"cmt">//www.wanateki.com" class="macro">#class="kw">property version "class="num">1.00" class="macro">#class="kw">property indicator_separate_window class="type">int OnInit() { class="kw">return(INIT_SUCCEEDED); } class="type">int OnCalculate(const class="type">int rates_total, const class="type">int prev_calculated, const class="type">int begin, const class="type">class="kw">double &price[]) { class="kw">return(rates_total); }