视频:简单自动交易 如何利用 MQL5 创建简单的智能交易系统·综合运用
◍ while 循环里藏着死机陷阱
在 MQL5 里用 while 等某个条件触发,看起来直观:设个整数 DelayCounter 从 1 开始,OnTick 里判断它是否还低于 500000,低于就打印并自增。 但坑在位置。若把 DelayCounter = DelayCounter + 1 写在 while 循环体外,编译不会报错,策略测试器一跑却直接冻住——首根报价进来表达式为真,循环体内永远等不到自增,条件恒真,变成无限循环,整个测试进程卡死,连按 F1 调帮助都无响应。 实测对照:把自增移进循环体,或干脆换成 if 语句(每次报价只判一次),重新编译后可视化测试里计数器正常爬到 500000 才退出等待。外汇与贵金属 EA 跑实时报价,这种死循环会拖挂终端,属高风险写法。 结论很直接:用 while 必须保证循环内有终止条件的变更;多数等待场景用 if 更稳,不至于把 MT5 测试器锁死。
「用 for 循环在 MT5 里跑通计数逻辑」
在 MetaEditor 里按 F4 打开后,新建一个智能交易系统模板,命名为 SimpleForLoop,把 OnTick 上方的样板代码和注释清掉,只留一个 int 型 counter 变量做计数起点。 循环体写在 OnTick 内部:第一个表达式给 counter 赋初值 1,第二个表达式检查 counter < endvalue(这里 endvalue 设为 10000),第三个表达式用 counter++ 每次加 1。只要条件成立,花括号内 Print("the counter So far, so good") 就会执行。 编译无报错后回 MetaTrader,按 CTRL+R 开策略测试器,选 SimpleForLoop.ex5 并打开可视化跑一遍。日志里能看到 counter 从 1 一直走到 9999——因为判断条件是“小于 10000”,所以停在了 9999。 倒计数只要把初值换成 10000、endvalue 换成 1,第三个表达式改 counter--,条件改成 counter > endvalue,结尾会停在 2;若改成 >= 重新编译,最后一值就是 1。把步长换成 10(counter -= 10)也能跑,日志里数字每次跳 10。外汇与贵金属测试涉及实盘模拟,EA 逻辑错误可能引发滑点外的异常下单,属高风险验证。
用 static 变量和自定义函数做报价翻倍计数
在 MT5 里按 F4 进 MetaEditor,新建一个智能交易系统模板并命名为 SimpleFunction,把 OnTick 上方的样板代码和注释清掉,只留核心逻辑。先在 OnTick 里声明一个 static 类型的整型变量 counter——static 让这个局部变量只存活于函数内部,但每次调用都保留上一次的值,不会归零。 我们把 counter 传给一个还没写的函数 DoubleTheValue,再用 Comment 把结果打印到图表左上角。自定义函数要先声明返回类型,这里返回 int;形参名可以叫 CounterValue,和实际传入的 counter 不要求同名。 函数体里先把 CounterValue 乘 2 存进 DoubleValue,再用 return DoubleValue; 把结果送回调用处。少了 return 编译器会直接报错。编译通过后,CTRL+R 开策略测试器,选 SimpleFunction.ex5 并勾“可视化”跑测试,每来一个 tick,counter 就翻一倍——价格每变一次,自定义函数就被调一次。 这套逻辑能扩到更复杂的地方,比如遍历所有持仓算某个货币对浮动盈利再 return 回主函数。外汇和贵金属行情跳动频繁,static 计数在真仓上跑前务必先在策略测试器验证重算逻辑,杠杆品种回测不代表实盘概率。
class="type">int DoubleTheValue(class="type">int CounterValue) { class="type">int DoubleValue = CounterValue * class="num">2; class="kw">return DoubleValue; }
◍ 画得少,看得清
把 MQL5 想得太重,往往才是入门最大的拦路虎。这一路走下来,一个能跑的自动交易骨架其实就那几块:下单、平仓、加个条件判断,剩下的都是往上面叠零件。 作者本人偏好简单系统,在自家公司做教程时也反复强调:先把基础回路跑通,再谈高级模块。对读者来说,现在就该开 MT5 新建一个 EA,把最朴素的均线穿越逻辑敲进去,验证它到底适不适合自己。 外汇和贵金属杠杆高、滑点跳空频繁,简单策略活着的概率未必低,但永远别预设它稳。写完代码跑一次回测,比看十篇畅想文都实在。