DRAKON可视化编程语言 - 面向MQL开发人员和客户的通信工具·进阶篇
📘

DRAKON可视化编程语言 - 面向MQL开发人员和客户的通信工具·进阶篇

第 2/3 篇

「DRAKON 图的基元与走向规则」

DRAKON 图靠图标加沟通线搭建,沟通线分水平与垂直两种,但实际操作只能沿垂直方向走。只有在做选支或注释、传参这类辅助动作时才用水平连接,纯线性算法整条都挂在一根垂直“串”上。 最简单的例子是求两数之和:从用户取数再用 Print 输出,图里就是自上而下几个基元,不需要任何箭头。对应到 MQL5,若包成函数收参数,代码长这样: double Summ(double a, double b) { // item 6 return (a+b); } 逐行看:函数头定义双精度入参 a、b;注释标的是图里第 6 项;直接返回两者相加。可见图到代码是一一落点的。 一旦遇条件分支,比如靠均线交叉进场,就用问题图标,它固定底部和右侧两个出口,算法永远从上到下、从左到右展开,仍不画箭头。选项超过两个时改用选择构造,最右栏留空对应 MQL 的 default;分支从左到右排,越右代表情况越“糟”,最左是所谓的幸福之路。 循环用 DO-WHILE 或先判后做两种画法,这时箭头变成必需要素,否则读图会乱。硬规则是:循环只能有一个入口,出口可以多个,不能从别处随意拉箭头插进循环体中段。外汇与贵金属行情跳变频繁,用这类图梳理逻辑时须留意实盘高风险。

MQL5 / C++
class="type">class="kw">double Summ(class="type">class="kw">double a, class="type">class="kw">double b) {
    class=class="str">"cmt">// item class="num">6
    class="kw">return (a+b);
}

◍ 用轮廓图把EA流程压进一屏

DRAKON 是可视化语言,图表能不能一眼读完,取决于是否尽量把整张图塞进单屏或单表。做不到时,就得靠轮廓图(Silhouette)把复杂功能拆成执行阶段,但视觉上仍当成一个整体来看。 标准 EA 的分时处理常用轮廓图表达:每个分支顶部写人类语言的传统名称,下面标转移地址——即该分支跑完命令流重定向到哪。多数情况过渡到相邻分支;往右走只写分支名,往左或回本分支开头,则用首尾的黑三角标记。 图里若出现循环轮廓,必须带把流程带去别的分支的退出条件,否则可能变成死循环。我自己在图里尽量不画这种环,实测解决的需求里有 95.4% 根本用不上它们。 本质上轮廓就是状态图:编辑器把每个分支当成流程某一时刻的状态,整体解释成无休止循环,内部用 switch-case 挑状态。所以入口出口都要标签——程序知道在哪切,人也看得出哪段正活跃。只能从分支开头进,最后一个分支靠 end 图标退。

画DRAKON图时线怎么走才不糊

DRAKON图里有个基本铁律:除非有连接符,否则线条绝不允许相交。路径的合并或转向只能靠标记节点完成,出现交叉时往往是你在求解过程中被动选了那条岔路,清晰度直接掉档。 图7里用来加仓的分支(左起第三个)画得不够准,平行线能少就少,这也是为了降噪。Fabula目前没法正确绘这种分支,不算bug,但属于解释层的不严谨,人工校一遍更稳。 “向下或向右”的移动规则,在图表最底那行是例外——它把整张轮廓图串起来,永远把流程带回选新状态的起点,所以你沿它是从右往左逆着箭头走。 小图且偏纵向时,可以把多张图拼在一页:图间距拉够、或用颜色/边界区分,组合图清晰度可能反而提升;要打印纸面就尽量紧凑排。但绝大多数情况,尤其含大轮廓图或准备打黑白纸,单独放每张图更好。DRAKON优先的是看得清,不是塞得满,可视化省下的脑力才能直接拿去写有效逻辑。

「把 DRAKON 图直接吐成 MT5 指标文件」

用 DRAKON 编辑器画完逻辑图后,最省事的做法是让编辑器把图生成为 Java 结构文件,再手动改成 MQL5。因为 Java 文件骨架和 MQL5 程序结构足够接近,生成的文本只需极小修改就能编译,不必专门写一套 MQL 解析器。 文件描述里有两个关键锚点:===class=== 后面加一句 class Main { 即可,编辑器会在生成时自动补上对应的右花括号;===header=== 之后粘贴的内容会原样进最终文件,全局变量、#include、枚举都放这里。===header=== 之前的文字全部被忽略,可随便写笔记。 如果是写简单指标(非 EA、非类封装),生成后要把 class Main { 和结尾的右花括号删掉,否则 MT5 编译器会报作用域错误。原文演示的 NR4 指标就是这么处理的:当某根蜡烛实体小于前 N 根(输入参数 NRPeriod,默认 4)时标记,这类窄幅蜡烛出现后价格出现剧烈波动的概率倾向升高,外汇与贵金属市场波动大、杠杆高,信号仅作参考。 生成流程:File → File properties 顶行选 Java,画好 OnInit / OnCalculate 各自图表(每个函数必须独立图,DE 强制要求),点 DRAKON → Generate code。下方面板报错就修线,无错则得到 *.java,扔进 indicators 目录改扩展名为 *.mq5,删类描述,编译运行。下面这段是删除多余元素前的生成头部,注意 #property indicator_buffers 2NRPeriod=4 是硬参数,可直接抄。

MQL5 / C++
===header===
===<span class="keyword">class</span>===
<span class="keyword">class</span> Main {
===header===
<span class="comment">class=class="str">"cmt">//+------------------------------------------------------------------+</span>
<span class="comment">class=class="str">"cmt">//|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NR4.mq5 |</span>
<span class="comment">class=class="str">"cmt">//|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Oleg Fedorov(aka certain) |</span>
<span class="comment">class=class="str">"cmt">//|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailto:coder.fedorov@gmail.com |</span>
<span class="comment">class=class="str">"cmt">//+------------------------------------------------------------------+</span>
<span class="preprocessor">class="macro">#class="kw">property </span><span class="macro">copyright</span> <span class="class="type">class="kw">string">"Oleg Fedorov(aka certain)"</span>
<span class="preprocessor">class="macro">#class="kw">property </span><span class="macro">link</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="class="type">class="kw">string">"mailto:coder.fedorov@gmail.com"</span>
<span class="preprocessor">class="macro">#class="kw">property </span><span class="macro">version</span>&nbsp;&nbsp; <span class="class="type">class="kw">string">"class="num">1.00"</span>
<span class="preprocessor">class="macro">#class="kw">property </span><span class="macro">indicator_chart_window</span>
<span class="preprocessor">class="macro">#class="kw">property </span><span class="macro">indicator_buffers</span> <span class="number">class="num">2</span>
<span class="preprocessor">class="macro">#class="kw">property </span><span class="macro">indicator_plots</span>&nbsp;&nbsp; <span class="number">class="num">2</span>
<span class="comment">class=class="str">"cmt">//--- plot NRBars</span>
<span class="preprocessor">class="macro">#class="kw">property </span><span class="macro">indicator_label1</span>&nbsp;&nbsp;<span class="class="type">class="kw">string">"NRBarsUp"</span>
<span class="preprocessor">class="macro">#class="kw">property </span><span class="macro">indicator_type1</span>&nbsp;&nbsp; <span class="macro">DRAW_ARROW</span>
<span class="preprocessor">class="macro">#class="kw">property </span><span class="macro">indicator_color1</span>&nbsp;&nbsp;<span class="macro">clrRed</span>
<span class="preprocessor">class="macro">#class="kw">property </span><span class="macro">indicator_style1</span>&nbsp;&nbsp;<span class="macro">STYLE_SOLID</span>
<span class="preprocessor">class="macro">#class="kw">property </span><span class="macro">indicator_width1</span>&nbsp;&nbsp;<span class="number">class="num">0</span>
<span class="comment">class=class="str">"cmt">//--- plot NRBars</span>
<span class="preprocessor">class="macro">#class="kw">property </span><span class="macro">indicator_label2</span>&nbsp;&nbsp;<span class="class="type">class="kw">string">"NRBarsDn"</span>
<span class="preprocessor">class="macro">#class="kw">property </span><span class="macro">indicator_type2</span>&nbsp;&nbsp; <span class="macro">DRAW_ARROW</span>
<span class="preprocessor">class="macro">#class="kw">property </span><span class="macro">indicator_color2</span>&nbsp;&nbsp;<span class="macro">clrRed</span>
<span class="preprocessor">class="macro">#class="kw">property </span><span class="macro">indicator_style2</span>&nbsp;&nbsp;<span class="macro">STYLE_SOLID</span>
<span class="preprocessor">class="macro">#class="kw">property </span><span class="macro">indicator_width2</span>&nbsp;&nbsp;<span class="number">class="num">0</span>
<span class="comment">class=class="str">"cmt">//--- class="kw">input variables</span>
<span class="keyword">class="kw">input</span> <span class="keyword">class="type">int</span> NRPeriod=<span class="number">class="num">4</span>;
<span class="comment">class=class="str">"cmt">//--- indicator buffers</span>
<span class="keyword">class="type">class="kw">double</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NRBarsBufferUp[];
<span class="keyword">class="type">class="kw">double</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NRBarsBufferDn[];
===<span class="keyword">class</span>===
<span class="keyword">class</span> Main {
<span class="comment">class=class="str">"cmt">// Autogenerated with DRAKON Editor class="num">1.31</span>
<span class="comment">class=class="str">"cmt">//+------------------------------------------------------------------+</span>

常见问题

遵循向右下单一方向走线、避免回穿,分叉用六边形、汇合用椭圆,能把走向压顺不糊。
用 DRAKON 轮廓图只留主干分支与关键判断,删掉实现细节,就能一屏讲清流程。
小布可读取你画的 DRAKON 图结构,自动吐出对应指标文件,省去手敲代码。
六边形是提问判断、椭圆是起点终点或汇合,给客户附一页基元说明即可对齐。
多半是走向违反了单一方向或汇合缺失,按走向规则重排分叉线就能消歧义。