从新手到专家:MQL5交易的必备之旅·进阶篇
📘

从新手到专家:MQL5交易的必备之旅·进阶篇

第 2/3 篇

「用预制模板拆开 MQL5 程序骨架」

MetaEditor 内置的脚本、EA 和指标模板,给新项目一个能直接编译跑起来的起点,也把 MQL5 程序的标准结构摊在你面前。打开任一模板,你能看到 OnInit、OnTick、OnDeinit 这些关键组件如何排布,比看文档更快建立空间感。 建议先拿模板建一个空 EA,不改逻辑只改注释和打印语句,观察 MT5 终端怎么加载、卸载。外汇与贵金属杠杆高、滑点随机,实验请在策略测试器用历史数据跑,别直接上真实账户。 杜威早在上世纪初就提过“在实践中学习”,放到这儿很贴切:你改一行 input 参数、动一个事件处理函数,编译器立刻给你反馈,这种主动试错比背语法更能固化理解。

◍ 用对话式AI拆解MQL5编程卡点

做价格行为策略时,最耗时的往往不是画形态,而是把思路落成MT5能跑的MQL5代码。ChatGPT这类对话式模型由OpenAI(2015年成立)开发,目前免费层可用,本质是在海量文本与代码语料上训练出来的模式匹配器,能直接读你的伪代码、报错信息给出可改的片段。 它训练数据覆盖多种编程语言与官方文档,通过解析语法树和大量示例学会“什么写法更稳”。对交易者来说,这意味着你可以把“在H1图识别吞没形态并只在伦敦时段开仓”这类口语需求丢给它,拿回带注释的初版EA框架,再自己回测调参。 外汇与贵金属杠杆高、滑点跳空频发,AI给的代码只是起点,必须经过历史回测与实盘模拟验证,任何信号都只是概率倾向,不存在必中的逻辑。

用 ChatGPT 拆 MetaEditor 模板再写首个脚本

把 AI 接进 MQL5 开发,最务实的切入口不是让它直接生成 EA,而是先帮你读懂 MetaEditor 自带的模板结构。很多交易者卡在第一步,是因为模板里的类继承和 OnTick 框架看不懂,而 ChatGPT 可以把每一段用英文注释的原生模板逐句翻成中文逻辑。 具体流程建议拆成两段:第一段,把 MetaEditor 的模板文件贴给 ChatGPT,让它解释事件函数和执行顺序;第二段,在 AI 辅助下从零写一个命名为“我的第一个MQL5程序”的脚本,只做打印基础报价这种最小验证。这样你跑通一次,比看十篇概览文都扎实。 外汇与贵金属市场高杠杆、高波动,用 AI 辅助生成的代码仅作学习验证,实盘前务必在 MT5 策略测试器做历史回测,异常概率不低。

「用对话模型拆开指标模板骨架」

在 MT5 桌面按 F4 直开 MetaEditor,点 文件 → 新建,把文件命名成自己的习惯名(示例里叫 MyFirstIndicator)后,编辑器会吐出一段空壳指标模板。初学者面对这一屏符号容易懵,其实可以把它整段复制进 chat.openai.com,发一句「逐部分解这段 MQL5 代码:」加粘贴,模型会把结构拆开讲。 模板里 #property 那几行是指标元数据:copyright 标持有者年份,link 给参考站,version 写版本号,indicator_chart_window 决定画在主图而非副窗。OnInit 函数在加载时跑一次,现在主体被 //--- 空着,只 return(INIT_SUCCEEDED) 表示初始化过了。 OnCalculate 才是每 tick 触发的计算入口,入参 rates_total 是图表总柱数、prev_calculated 是上轮已算柱数,time[]/open[]/high[]/low[]/close[] 等数组分别载每根 K 的时间与 OHLC 及成交量点差。示例里它也没写逻辑,直接 return(rates_total) 把已处理柱数传回去供下次增量计算。外汇与贵金属杠杆高,跑通模板前先在小周期回测验证,实盘风险自担。 让小布替你跑这套 把下面代码贴进 MetaEditor 新建指标,再丢给任意对话模型做逐行解说,比硬读文档快得多;改 OnCalculate 里的 close[] 引用,就能从骨架迈向真实信号。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//|                                                 MyFirstIndicator.mq5 |
class=class="str">"cmt">//|                    Copyright class="num">2024, MetaQuotes Ltd. |
class=class="str">"cmt">//|                             [MQL5官方文档] |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="macro">#class="kw">property copyright "Copyright class="num">2024, MetaQuotes Ltd."
class="macro">#class="kw">property link      "[MQL5官方文档]
class="macro">#class="kw">property version   "class="num">1.00"
class="macro">#class="kw">property indicator_chart_window
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Custom indicator initialization function                          |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">int OnInit()
  {
class=class="str">"cmt">//--- indicator buffers mapping

class=class="str">"cmt">//---
   class="kw">return(INIT_SUCCEEDED);
  }
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Custom indicator iteration function                              |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">int OnCalculate(class="kw">const class="type">int rates_total,
                class="kw">const class="type">int prev_calculated,
                class="kw">const class="type">class="kw">datetime &time[],
                class="kw">const class="type">class="kw">double &open[],
                class="kw">const class="type">class="kw">double &high[],
                class="kw">const class="type">class="kw">double &low[],
                class="kw">const class="type">class="kw">double &close[],
                class="kw">const class="type">long &tick_volume[],
                class="kw">const class="type">long &volume[],
                class="kw">const class="type">int &spread[])
  {
class=class="str">"cmt">//---

class=class="str">"cmt">//--- class="kw">return value of prev_calculated for next call
   class="kw">return(rates_total);

◍ 空壳指标的骨架长什么样

新建一个 MT5 自定义指标,系统给的默认代码就是个能编译但通过不画任何东西的空壳。它只声明了版权、版本和在主图窗口显示,没有绑定任何指标缓冲区。 OnInit 里只 return(INIT_SUCCEEDED),缓冲区映射被注释掉了;OnCalculate 直接 return(rates_total),既没处理 prev_calculated 增量逻辑,也没往任何 buffer 写值。 把下面这段代码原样贴进 MetaEditor 存成 MyFirstIndicator.mq5 并编译,MT5 导航器里拖到 EURUSD 图表上,能看到指标加载成功但图表毫无变化——这验证了最小可运行结构,后续加逻辑就从补齐 buffer 开始。外汇与贵金属波动剧烈,实盘加载自编指标前务必先在策略测试器跑历史数据。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//|                                 MyFirstIndicator.mq5 |
class=class="str">"cmt">//|                Copyright class="num">2024, MetaQuotes Ltd. |
class=class="str">"cmt">//|                     [MQL5官方文档] |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="macro">#class="kw">property copyright "Copyright class="num">2024, MetaQuotes Ltd."
class="macro">#class="kw">property link      "[MQL5官方文档]
class="macro">#class="kw">property version   "class="num">1.00"
class="macro">#class="kw">property indicator_chart_window
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Custom indicator initialization function                         |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">int OnInit()
  {
class=class="str">"cmt">//--- indicator buffers mapping

class=class="str">"cmt">//---
   class="kw">return(INIT_SUCCEEDED);
  }
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Custom indicator iteration function                             |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">int OnCalculate(class="kw">const class="type">int rates_total,
                class="kw">const class="type">int prev_calculated,
                class="kw">const class="type">class="kw">datetime &time[],
                class="kw">const class="type">class="kw">double &open[],
                class="kw">const class="type">class="kw">double &high[],
                class="kw">const class="type">class="kw">double &low[],
                class="kw">const class="type">class="kw">double &close[],
                class="kw">const class="type">long &tick_volume[],
                class="kw">const class="type">long &volume[],
                class="kw">const class="type">int &spread[])
  {
class=class="str">"cmt">//---

class=class="str">"cmt">//--- class="kw">return value of prev_calculated for next call
   class="kw">return(rates_total);
  }
class=class="str">"cmt">//+------------------------------------------------------------------+

常见问题

先用平台自带的空指标模板新建文件,对照模板里的 OnInit、OnCalculate 等函数块逐个看注释,就能理清整体结构。
把 MetaEditor 的模板贴给对话模型,让它逐行解释变量声明和事件函数作用,再照着改参数就能跑通首个脚本。
小布可对接你的代码疑问,用对话方式拆开模板函数和报错原因,省去翻文档的时间。
空壳指标通常保留 OnInit 做初始化、OnCalculate 做报价计算,缺一个都会导致编译失败或不出图。
容易漏写头文件引用和缓冲区绑定,建议拆完模板先原样编译一次空壳,再往里填逻辑。