基于 MQL5 源代码创建文档(基础篇)
📘

基于 MQL5 源代码创建文档(基础篇)

第 1/3 篇

◍ 从 MQL5 源码直接生成技术文档

在 MT5 生态里,一套成熟做法是直接解析 MQL5 源代码来产出接口文档,而不是靠人工维护注释。2017 年 8 月 17 日社区曾发布过相关实践帖,累计获得 3682 次查看、4 条讨论,说明自动化文档需求一直存在。 这种思路的核心价值在于:当 EA 或指标频繁迭代时,函数签名和参数说明能随代码同步更新,避免文档与实盘逻辑脱节。外汇与贵金属品种波动剧烈、杠杆风险高,用脚本化文档降低人为遗漏,对复盘和交接都更稳。 你可以在 MT5 安装目录的 MQL5 文件夹里挑一个自带指标源码,尝试用正则提取 inputdouble/int 声明,先跑通最小文档原型再扩展。

「边写代码边留文档能省后期功夫」

有经验的 MT5 开发者迟早要面对一件事:给自己的 EA、指标和函数库写说明。客户对接、跨人协作、乃至半年后回看自己写的片段,没有结构化的注释就会变成瞎子摸象。 很多人觉得写手册是额外负担,但实际节奏应该是:在 MQL5 源文件里顺手加注释和标签,文档成本就摊进开发时间里了。根据长期维护多库的经验,前期每花 1 小时规范注释,后期查代码和交付说明可能省下 5 小时以上重复理解成本。 本篇不重复早已过时的旧方法,直接基于 Doxygen 与 Doxywizard.exe 走一遍从源码注释到成册的过程,重点放在当前仍有效的标签约定和工程配置上。

让 Doxygen 认得 .mq 文件

想把分散在多个 MQL 文件里的代码和注释直接抽成 chm / html 参考文档,Doxygen 是最省事的方案。但旧教程里那套配置已经失效:照着做不会报错也不会警告,最终却一个文件都不生成。 先跑 doxywizard.exe,在向导里填好项目名、输入和输出目录,并且把模式固定成“优化为 C++ 输出”。这一步不填对,后面全白搭。 关键坑在扩展名映射。Doxygen 默认不解析 .mq4 / .mq5,得在“智能程序 → 输入”里把对应文件加进列表,再到文件映射里声明 .mq* 等同于 .c。配完这两条,它才会真正去扫代码、出文档。外汇与贵金属 EA 开发涉及高风险,自动化文档仅用于代码管理,不预示任何交易结果。

◍ 多语言文档的编码坑

用 Doxygen 生成文档时,若只写英文基本不会出问题;一旦源文件混用俄语、中文等,界面常冒出不可读乱码。根因在默认输出走 UTF-8,而部分源码实际是别的编码,两者错位就废了。 实测无论你在 DOXYFILE_ENCODING 填什么,UTF-8 都会被无条件追加,想靠这个字段改全局编码基本无效。更靠谱的做法是在源侧统一:比如俄语 Windows 环境源码多是 CP1251,就显式把源编码设成 CP1251,并保证所有源文件同一种编码。 如果目标格式是 CHM,还得单独指定 HtmlHelp 索引文件(.hhk)的编码,否则目录树照样乱码。外汇/贵金属相关的多语指标文档若涉及俄文论坛搬运,建议先转码再进 Doxygen,能省掉一半排错时间。

「自定义页眉与注脚的生成路径」

在 MT5 智能程序选卡的 HTML 区块里,HTML_HEADER、HTML_FOOTER、HTML_STYLESHEET 三个字段分别接管每页页眉、每页注脚和显示样式。前提是先打开 GENERATE_HTML 切换器,否则不会吐出任何 html 文件。 想拿到可直接改的模板,不必从头写规则。在命令行跑 doxygen -w html new_header.html new_footer.html new_stylesheet.css,会同时生成头、脚和样式表三个文件,doxygen 1.8.13 的默认 footer 里就带了一堆 $navpath$generatedby 这类占位符,文档里列了它们的用途。 footer 即便写成无抬头无样式的纯文本也能用,但遵守规则更稳。下面这段是从生成的 new_footer.html 摘出的部分,能看到 treeview 开和关两种分支,以及 doxygen 广告图固定的安放位置。 实操上,改完 header 和 css 再回选卡启用对应字段,生成文档的外观就完全由你控。外汇与贵金属 EA 文档化时这类定制能省掉不少对外说明成本,但自动化生成仅是辅助,策略逻辑风险仍高,需自行回测验证。

MQL5 / C++
<span class="tag">&lt;<span class="keyword">div</span>&gt;</span>
&nbsp;&nbsp;<span class="tag">&lt;<span class="keyword">h1</span><span class="attribute"> style=<span class="value">"text-align: center;"</span></span>&gt;</span>Footer<span class="tag">&lt;/<span class="keyword">h1</span>&gt;</span>
<span class="tag">&lt;/<span class="keyword">div</span>&gt;</span>
<span class="comment">&lt;!-- HTML footer for doxygen class="num">1.8.class="num">13--&gt;</span>
<span class="comment">&lt;!-- start footer part --&gt;</span>
<span class="comment">&lt;!--BEGIN GENERATE_TREEVIEW--&gt;</span>
<span class="tag">&lt;<span class="keyword">div</span><span class="attribute"> id=<span class="value">"nav-path"</span></span><span class="attribute"> class=<span class="value">"navpath"</span></span>&gt;</span><span class="comment">&lt;!-- id is needed for treeview function! --&gt;</span>
&nbsp;&nbsp;<span class="tag">&lt;<span class="keyword">ul</span>&gt;</span>
&nbsp;&nbsp;&nbsp;&nbsp;$navpath
&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;<span class="keyword">li</span><span class="attribute"> class=<span class="value">"footer"</span></span>&gt;</span>$generatedby
&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;<span class="keyword">a</span><span class="attribute"> href=<span class="value">"http:class=class="str">"cmt">//www.doxygen.org/index.html"</span></span>&gt;</span>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;<span class="keyword">img</span><span class="attribute"> class=<span class="value">"footer"</span></span><span class="attribute"> src=<span class="value">"$relpath^doxygen.png"</span></span><span class="attribute"> alt=<span class="value">"doxygen"</span></span>/&gt;</span><span class="tag">&lt;/<span class="keyword">a</span>&gt;</span> $doxygenversion <span class="tag">&lt;/<span class="keyword">li</span>&gt;</span>
&nbsp;&nbsp;<span class="tag">&lt;/<span class="keyword">ul</span>&gt;</span>
<span class="tag">&lt;/<span class="keyword">div</span>&gt;</span>
<span class="comment">&lt;!--END GENERATE_TREEVIEW--&gt;</span>
<span class="comment">&lt;!--BEGIN !GENERATE_TREEVIEW--&gt;</span>
<span class="tag">&lt;<span class="keyword">hr</span><span class="attribute"> class=<span class="value">"footer"</span></span>/&gt;</span><span class="tag">&lt;<span class="keyword">address</span><span class="attribute"> class=<span class="value">"footer"</span></span>&gt;</span><span class="tag">&lt;<span class="keyword">small</span>&gt;</span>
$generatedby &amp;#class="num">160;<span class="tag">&lt;<span class="keyword">a</span><span class="attribute"> href=<span class="value">"http:class=class="str">"cmt">//www.doxygen.org/index.html"</span></span>&gt;</span>
<span class="tag">&lt;<span class="keyword">img</span><span class="attribute"> class=<span class="value">"footer"</span></span><span class="attribute"> src=<span class="value">"$relpath^doxygen.png"</span></span><span class="attribute"> alt=<span class="value">"doxygen"</span></span>/&gt;</span>
<span class="tag">&lt;/<span class="keyword">a</span>&gt;</span> $doxygenversion
<span class="tag">&lt;/<span class="keyword">small</span>&gt;</span><span class="tag">&lt;/<span class="keyword">address</span>&gt;</span>

常见问题

如果在函数头直接写规范注释,后期生成说明文档可省去约 70% 的手动整理时间,交付前只需补示例。
在文档工具配置里把 .mq 加入扫描后缀,并指定语言为类 C 语法,就能正常提取函数和参数。
小布可读取你的源码注释结构,自动梳理函数清单与参数表,并标出缺失文档的区块让你补。
多是源码存成系统默认编码而非 UTF-8 导致,统一转 UTF-8 并声明编码头可解决多语言乱码。
在文档模板的页眉与注脚配置段填入作者与风险揭示文本,重新生成即带固定落款。