视频:简单自动交易  如何利用 MQL5 创建简单的智能交易系统·进阶篇
🤖

视频:简单自动交易 如何利用 MQL5 创建简单的智能交易系统·进阶篇

(2/3)· 模板跑通后卡在数据类型和 if 判断?这篇把计算与分支讲透

进阶 第 2/3 篇
不少人把向导生成的 EA 拖上图表,看到 Hello 就以为会写机器人了。真到要算手数、判条件时,面对 int、double 和 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。写复杂仓位或利润公式前,先用几行代码在策略测试器里验证逻辑,比上线后爆错便宜得多。

MQL5 / C++
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 时执行流不会停。 外汇与贵金属交易自动化高风险,这段代码仅演示语法逻辑,实盘前务必在策略测试器可视化跑通并自验边界值。

MQL5 / C++
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);
}
交给小布盯盘看品种状态
这些诊断小布盯盘的 AIGC 已内置,打开对应品种页即可看到实时波动与异常提示,你写 EA 时也能对照真实盘口验证条件触发是否合理。

常见问题

int 存整数,double 存带小数浮点;涉及价格、点值、手数计算必须用 double,否则四舍五入会让开仓量偏差。
每次报价都跑一遍,计算量过大会拖慢响应;倾向把不变的量放到 OnInit,OnTick 只留必要判断。
目前小布内置的是盘口诊断与预警,不直接产出代码;但你可用它观察真实波动规律,再手写更贴合行情的判定阈值。
状态枚举少且互斥时 switch 可读性更好;条件带区间或组合判断时 if 更灵活,编译器优化后性能差异通常不大。
可能没拖到图表、或被其他 EA 的 Comment 覆盖;确认文件已编译且无报错,同图只留一个写 Comment 的程序。