项目可协助创建可盈利的交易机器人! 或至少,看似可以(基础篇)
📘

项目可协助创建可盈利的交易机器人! 或至少,看似可以(基础篇)

第 1/2 篇

从单文件到项目:MQL5 程序员的开发分水岭

写 EA 最开始往往只是一个 .mq5 文件,随着指标计算、订单管理、风控模块越加越多,文件会膨胀到难以维护。MQL5 圈子里不少人用 MQH 包含文件拆逻辑,但 MetaTrader 5 自带的“项目(Project)”其实是更省心的起点。

  • 年 6 月官方文档就提到,从一个项目里开发交易应用比单纯堆包含文件更合理,理由不止一条:编译依赖更清晰、跨文件调试不用来回切标签、资源(如图标和 DLL)能随项目打包。

外汇和贵金属杠杆高、滑点随机,任何自动化方案都只是降低人工负担,不承诺收益。开 MT5 点 File → New → Expert Advisor (template) 时,勾选“Create as project”,就能直接体会文件结构差异。

◍ MQPROJ 把复杂 EA 拆成可协作的零件

MQPROJ 是带 .mqproj 扩展名的独立文件,里面存的是程序设置、编译参数,以及这个项目牵扯到的所有文件路径与类别信息。MT5 导航器里专门有个「项目」选项卡,把包含文件、资源、头文件按类排好,点开就能在文件间跳。 它不只是把一堆文件丢进同一个目录。一个复杂的指标或 EA,能被拆成结构平衡的几块:带输入参数的 .set 用于回测和优化,OpenCL 内核源码、图片音频资源、其他数据都各归其位。 项目里各部分引用关系一目了然,导航不迷路。更实际的是,多人能借内置的 MQL5 存储在同一项目上协作——你改头文件、他调资源,版本不打架。打开 MT5 新建一个空项目,拖几份 .mqh 进去,就能体会这种结构比单文件好维护在哪。

「用向导起一个 MT5 普通程序工程」

在 MT5 里点“新建项目”,跟着向导走完:填程序名、挂输入参数、勾选要用的事件处理函数。向导结束会生成一个 MQPROJ 文件,它就是管工程属性的入口,关了也能从“属性”右键菜单重新打开。 打开 MQPROJ 能看到版本、说明、图标和几个影响性能的选项。“最大程度优化”打开后 EX5 跑得最快,关掉编译快但运行明显慢;“检查浮点除法器”开着会拦 double/float 除以零,关掉更快但你要对代码零除风险有绝对把握。 测试器优化缓存默认开,跑过的优化结果进缓存,重算直接复用;不需要就用 tester_no_cache 关掉。想看工程内部长啥样,用“打开”以文本方式读 MQPROJ 即可。 下面这段是向导生成的工程描述样例,能直接照结构改:platform 锁定 mt5,program_type 为 expert,optimize 和 fpzerocheck 都是 1 表示两项优化全开,tester_no_cache 为 0 表示缓存启用。files 数组里主 mq5 的 compile 为 true,引用的 Trade.mqh 设 false 不重复编译。

MQL5 / C++
{
  "platform"    :"mt5",
  "program_type":"expert",
  "copyright"   :"Copyright class="num">2019, MetaQuotes Software Corp.",
  "link"        :"[MQL5官方文档]
  "version"     :"class="num">1.00",
  "description" :"The mean reversion strategy: the price breaks the channel border outwards and reverts back towards the average. The channel is represented by Bollinger Bands. The Expert Advisor enters the market using limit orders, which can only be opened in the trend direction.",
  "icon"        :"Mean Reversion.ico",
  "optimize"    :"class="num">1",
  "fpzerocheck" :"class="num">1",
  "tester_no_cache":"class="num">0",
  "tester_everytick_calculate":"class="num">0",
  "files":
  [
    {
      "path":".\\Mean Reversion.mq5",
      "compile":"true",
      "relative_to_project":"true"
    },
    {
      "path":"MQL5\\Include\\Trade\\Trade.mqh",
      "compile":"false",
      "relative_to_project":"false"
    },
    ....
  ]
}

用限价单接趋势中的通道边界

价格触布林带边界就反向吃回调,这是均值回归思路的一种落地:假定价格倾向回到中轨附近。但只做限价单,且必须顺着趋势方向挂——上升里在下轨埋 buy limit,下降里在上轨埋 sell limit。 趋势方向用两条 EMA 的相对位置判定最省事:快线在慢线上方算多头,反之为空头。系统里快线周期 12、慢线 26,属经典 MACD 系参数。 横盘会制造大量假信号。用通道宽度相对 ATR 来过滤:宽度小于 k*ATR 视为震荡不下单,大于才准予挂单。k 是要在优化里找的系数,原文示例给的 InpATRCoeff 默认 1.0、ATR 周期 14。 整套信号逻辑共暴露 8 个可调输入:BB 周期 20、偏离 2.0、快慢 EMA、ATR 周期与系数、固定手数 0.1、以及两个时间帧(BB 与 MA 可分开设,比如 M15 算带、M30 判势)。MagicNumber 设 245600 仅让 EA 认自己的单,不参与优化。 外汇与贵金属杠杆高、滑点跳空频繁,限价单不成交或被动止损都属正常概率,实盘前务必在 MT5 策略测试器用历史数据跑一遍参数敏感性。

MQL5 / C++
class=class="str">"cmt">//--- 通道参数
input class="type">int         InpBBPeriod   =class="num">20;            class=class="str">"cmt">// 布林线指标周期
input class="type">class="kw">double      InpBBDeviation=class="num">2.0;           class=class="str">"cmt">// 布林带与均线的偏离
class=class="str">"cmt">//-- 计算趋势的 EMA 周期 
input class="type">int         InpFastEMA    =class="num">12;            class=class="str">"cmt">// 快速 EMA 周期
input class="type">int         InpSlowEMA    =class="num">26;            class=class="str">"cmt">// 慢速 EMA 周期
class=class="str">"cmt">//-- ATR 参数
input class="type">int         InpATRPeriod  =class="num">14;            class=class="str">"cmt">// ATR 周期
input class="type">class="kw">double      InpATRCoeff   =class="num">1.0;           class=class="str">"cmt">// ATR 横盘判定系数
class=class="str">"cmt">//--- 资本管理
input class="type">class="kw">double      InpLot        =class="num">0.1;           class=class="str">"cmt">// 交易量手数
class=class="str">"cmt">//--- 时间帧参数
input ENUM_TIMEFRAMES InpBBTF   =PERIOD_M15;    class=class="str">"cmt">// 计算布林带值的时间帧
input ENUM_TIMEFRAMES InpMATF   =PERIOD_M15;    class=class="str">"cmt">// 趋势判定的时间帧
class=class="str">"cmt">//--- 智能交易系统进行交易业务的标识码
input class="type">long        InpMagicNumber=class="num">245600;        class=class="str">"cmt">// 魔幻数字

常见问题

单文件耦合度高,改一处容易牵动全局;拆成项目里的多个零件文件,各自负责信号、订单、风控,排查和协作都更省力。
先定好程序类型、品种周期与输入参数骨架,再补信号和订单模块;空工程跑通后再逐步加逻辑,避免一上来就卡编译。
小布可基于你给的通道参数直接生成工程骨架与限价单代码片段,并标出回测时需重点看的成交与滑点节点,省去手写样板。
边界若贴太紧易被噪音扫掉,太宽则错过回归;用最近N根K线的标准差定带宽,并在动量转弱时再挂单,成交质量更稳。
一人管信号与通道计算,一人管订单与限价逻辑,一人管风控与参数;用项目文件隔离后,三人并行改各自模块不冲突。