视频:简单自动交易 如何利用 MQL5 创建简单的智能交易系统·进阶篇
(2/3)· 模板跑通后卡在数据类型和 if 判断?这篇把计算与分支讲透
MT5 里几种基础数据类型怎么落地看
在 MT5 写 EA 或脚本时,先想清楚变量要装什么,再选类型。文本用 string,但字符串变量不能参与任何数值计算,只能做显示或拼接。 要取账户余额这类带小数的值,用 double 浮点类型配合 AccountInfoDouble 函数。编译后丢进策略测试器,默认看到的是 100,000.0;一旦余额出现小数位,double 才会把小数点后的数字带出来。 时间和日期别用字符串硬凑,TimeLocal 返回的是 datetime 类型,测试输出是一种专用格式,后续判断时间必须用这个类型。整数类信息如账号,用 AccountInfoInteger(ACCOUNT_LOGIN) 取,类型是 integer。 只需要真/假判断时用 bool,测试输出会是 "The value is: true."。这几类是最常用的;按 F1 在 MetaEditor 里能查到 MQL5 全部类型参考,也包括结构体等复杂类型。 外汇和贵金属市场高杠杆、滑点无常,代码跑出来的数值只是当前环境快照,不构成任何方向暗示。自己写个几行的小测试 EA 把类型打印到图表,比看文档来得直接。
「EA 里的整数与浮点坑」
在 MT5 写自动交易,绕不开基础运算。很多人把 5/3 算成 1.6667,EA 却回给他 1,问题就出在变量类型上。 新建一个 EA 模板,命名为 SimpleCalculations,在 OnTick 上方定义两个 int 变量 a=5、b=3,用 Comment 把 a+b 打到图表左上角。编译后进策略测试器开可视化,输出是 8;换成 a-b 得 2;a*b 得 15。 但 a/b 用 int 算出来是 1,因为整数除法直接截断小数。改成 double 类型重新编译,结果才变成 1.6667——外汇和贵金属杠杆高、点位小,这类截断在仓位计算里会直接放大风险。 运算优先级也常坑人:a+a*b 先乘后加,得出 20;套上括号 (a+a)*b 强制先加,结果就是 30。写复杂仓位或利润公式前,先用几行代码在策略测试器里验证逻辑,比上线后爆错便宜得多。
class="type">int a = class="num">5; class="type">int b = class="num">3; Comment(a + b);
◍ 用 if 语句在 MT5 里验证真假条件
写一个自动检查条件的脚本,第一步是在 MetaEditor 里从「文件/新建/智能交易系统(模板)」起手,生成 SimpleIfCondition.ex5 后,把 OnTick 上方多余内容清掉,只留逻辑本体。
定义两个整数:a=5、b=3。先用 if(a>5) 输出“a is greater than 5”,否则走 else 打印“Conditions not true”。按 F7 编译后回 MT5,CTRL+R 开策略测试器跑可视化,屏幕直接给的是“Conditions not true”——因为 a 实际等于 5,并不大于 5。
再补一句 if(a==5),重编译重跑,输出变成“a equals 5”;同理加 if(b==3),单跑只看到“b equals 3”。把两个 if 并列,分别查 a 和 b,测试结果就是“a = 5 and b = 3”。
坑在后面:若写 c=a+b 且 if 后跟多行,不包花括号 {} 会报两处编译错。补上 {} 重编,上次测试画面显示“c = 8”。外汇与贵金属 EA 逻辑里这类条件分支极易因括号遗漏静默失效,实盘前务必在策略测试器走一遍可视化。
用 switch-case 给 EA 换执行路径
在 MQL5 里,switch-case 是给智能交易系统做分支控制的直接手段。建一个 Expert Advisor 模板,把 OnTick 上方多余内容清掉,先声明整数变量 choice 并赋值为 5,再在 OnTick 内部声明字符串变量 entry 但不初始化——entry 的内容完全由 choice 走哪条 case 决定。 case 后面只能跟常量表达式,比如直接写数字 5、4、3,或者写 1+1 这种编译期可算出的式子;把变量塞进 case 会直接报错。每个 case 末尾的 break 决定要不要跳出整个 switch 结构,漏写就会穿透到下一个 case。 实测:choice=5 输出“the customer wants RSII”;改成 3 重新编译,输出变成“the customer wants MACD”;填 11 不在任一 case 里,触发 default 输出“the customer doesn't know”。再把前两个 case 的 break 删掉、choice 设回 5,一次跑完会连续吐出 RSI、Bollinger Bands、MACD 三条提示——说明缺失 break 时执行流不会停。 外汇与贵金属交易自动化高风险,这段代码仅演示语法逻辑,实盘前务必在策略测试器可视化跑通并自验边界值。
class="type">int choice = class="num">5; class="type">void OnTick() { class="type">class="kw">string entry; class="kw">switch(choice) { case class="num">5: entry += "the customer wants RSII"; class="kw">break; case class="num">4: entry = "the customer wants Bollinger Bands"; class="kw">break; case class="num">3: entry = "customer wants MACD"; class="kw">break; class="kw">default: entry = "the customer doesn&class="macro">#x27;t know"; class="kw">break; } Comment(entry); }