基于 MQL5 源代码创建文档(基础篇)
◍ 从 MQL5 源码直接生成技术文档
在 MT5 生态里,一套成熟做法是直接解析 MQL5 源代码来产出接口文档,而不是靠人工维护注释。2017 年 8 月 17 日社区曾发布过相关实践帖,累计获得 3682 次查看、4 条讨论,说明自动化文档需求一直存在。
这种思路的核心价值在于:当 EA 或指标频繁迭代时,函数签名和参数说明能随代码同步更新,避免文档与实盘逻辑脱节。外汇与贵金属品种波动剧烈、杠杆风险高,用脚本化文档降低人为遗漏,对复盘和交接都更稳。
你可以在 MT5 安装目录的 MQL5 文件夹里挑一个自带指标源码,尝试用正则提取 input 与 double/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 文档化时这类定制能省掉不少对外说明成本,但自动化生成仅是辅助,策略逻辑风险仍高,需自行回测验证。
<span class="tag"><<span class="keyword">div</span>></span> <span class="tag"><<span class="keyword">h1</span><span class="attribute"> style=<span class="value">"text-align: center;"</span></span>></span>Footer<span class="tag"></<span class="keyword">h1</span>></span> <span class="tag"></<span class="keyword">div</span>></span> <span class="comment"><!-- HTML footer for doxygen class="num">1.8.class="num">13--></span> <span class="comment"><!-- start footer part --></span> <span class="comment"><!--BEGIN GENERATE_TREEVIEW--></span> <span class="tag"><<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>></span><span class="comment"><!-- id is needed for treeview function! --></span> <span class="tag"><<span class="keyword">ul</span>></span> $navpath <span class="tag"><<span class="keyword">li</span><span class="attribute"> class=<span class="value">"footer"</span></span>></span>$generatedby <span class="tag"><<span class="keyword">a</span><span class="attribute"> href=<span class="value">"http:class=class="str">"cmt">//www.doxygen.org/index.html"</span></span>></span> <span class="tag"><<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>/></span><span class="tag"></<span class="keyword">a</span>></span> $doxygenversion <span class="tag"></<span class="keyword">li</span>></span> <span class="tag"></<span class="keyword">ul</span>></span> <span class="tag"></<span class="keyword">div</span>></span> <span class="comment"><!--END GENERATE_TREEVIEW--></span> <span class="comment"><!--BEGIN !GENERATE_TREEVIEW--></span> <span class="tag"><<span class="keyword">hr</span><span class="attribute"> class=<span class="value">"footer"</span></span>/></span><span class="tag"><<span class="keyword">address</span><span class="attribute"> class=<span class="value">"footer"</span></span>></span><span class="tag"><<span class="keyword">small</span>></span> $generatedby &#class="num">160;<span class="tag"><<span class="keyword">a</span><span class="attribute"> href=<span class="value">"http:class=class="str">"cmt">//www.doxygen.org/index.html"</span></span>></span> <span class="tag"><<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>/></span> <span class="tag"></<span class="keyword">a</span>></span> $doxygenversion <span class="tag"></<span class="keyword">small</span>></span><span class="tag"></<span class="keyword">address</span>></span>