从基础到中级:数组和字符串(一)·进阶篇
「用 Print 把变量类型差异看个明白」
在 MT5 脚本里直接拼字符串打印,是验证变量类型转换最省事的办法。下面这段 OnStart 把整型、双精度、颜色三类基础变量塞进同一个字符串再输出,能直观看到 MQL5 的类型处理函数怎么干活。 代码里 i_value 取 65538,d_value 取 0.25,cor 取 clrRed。这三个值本身不重要,关键是 ColorToString、IntegerToString、DoubleToString 各自把不同类型的量转成可读文本,再用 + 和换行符 \n 拼成 sz0。 跑完脚本,终端 Experts 标签会打出三行:Color: Red、Integer: 65538、Double: 0.25。如果你把 i_value 改成别的整数,或者 d_value 改成 0.1,输出会立刻跟着变——这就是现场验证类型边界的最快路径,外汇和贵金属行情里这类基础类型拼错常导致 EA 静默失效,属于高风险调试盲区。 开 MT5 新建脚本粘进去编译运行,比看任何文档都来得直接。
class="type">void OnStart(class="type">void) { class="type">int i_value = class="num">65538; class="type">class="kw">double d_value = class="num">0.25; class="type">color cor = clrRed; class="type">class="kw">string sz0; sz0 = "Color: " + ColorToString(cor) + "\nInteger: " + IntegerToString(i_value) + "\nDouble: " + DoubleToString(d_value); Print(sz0); }
十六进制颜色格式化里的字节顺序坑
在 MT5 里做字符串格式化,StringFormat 比 PrintFormat 更灵活:前者返回字符串,可写文件或塞进图形对象,参数结构完全一致。用 StringFormat("Color: 0x%06X...", cor, ...) 能把颜色按十六进制打印,例如 clrRed 会显示成 0x0000FF 这类 6 位字段。 但这里的细节很致命:MQL5 内部颜色是 BGR 存储,不是 RGB。所以 0x0000FF 看着像蓝,实际在代码里是红——字节顺序反了。直接读十六进制值很容易误判,需要翻转字节才能匹配直觉上的 RGB。 下面这段代码演示了问题本质:i_value 用 0xF 跑出来正常,但颜色值因为 BGR 顺序,显示和预期相反。 想让输出直观,可写个小函数把字节重排。代码 07 第 19 行定义了此类函数,返回重排后的十六进制串,执行后第一行仍是内部 BGR 值,最后一行才是以 RGB 读取的期望值。外汇与贵金属自动化脚本涉及此类底层格式时,误读颜色可能影响面板逻辑,属高风险细节点。 验证方式很简单:开 MT5 把下面代码丢进脚本,对比 Print 出来的两行颜色串,确认 BGR 颠倒现象。
class=class="str">"cmt">//+------------------------------------------------------------------+ class="macro">#class="kw">property copyright "Daniel Jose" class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">void OnStart(class="type">void) { class="type">int i_value = 0xF; class="type">class="kw">double d_value = class="num">0.25; class="type">color cor = clrRed; class="type">class="kw">string sz0; sz0 = StringFormat("Color :\t0x%06X\t=>\t%s\n" +
◍ 把颜色变量拆成十六进制 RGB
在 MT5 脚本里,color 类型本质是个 32 位整数,但默认打印出来并不直观。上面这段把 clrRoyalBlue、一个整型常量 0xDA09F 和 double 0.25 拼进同一串日志,用 StringFormat 的 %06X 和 %s 分别输出十六进制与 ColorToString 得到的颜色名。 想直接拿到 RGB 分量,可以自己写个 ColorToStrHex:用位与和右移把蓝、绿、红三层剥出来。代码里 (arg & 0xFF) 取蓝,((arg >> 8) & 0xFF) 取绿,(arg >> 16) & 0xFF 取红,最后拼成 0xBBGGRR 形式——注意 MQL5 的颜色字节序是蓝绿红反着排的。 跑一遍 OnStart,终端会先打出 Color: 0xDA09F => RoyalBlue 这类三行文本,再补一句十六进制 RGB。验证时把 cor 换成 clrRed,应输出 0x0000FF,这和肉眼看到的红在字节序上容易让人愣一下。外汇与贵金属行情受杠杆影响大,这类底层格式练习虽不涉及下单,但写错颜色解析可能让你在面板里把止损线看成开仓线,实盘前务必在策略测试器里核对。
class=class="str">"cmt">//+------------------------------------------------------------------+ class="macro">#class="kw">property copyright "Daniel Jose" class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">void OnStart(class="type">void) { class="type">int i_value = 0xDA09F; class="type">class="kw">double d_value = class="num">0.25; class="type">color cor = clrRoyalBlue; class="type">class="kw">string sz0; sz0 = StringFormat("Color :\t0x%06X\t=>\t%s\n" + "Integer:\t0x%06X\t=>\t%d\n" + "Double :\t%.2f", cor, ColorToString(cor), i_value, i_value, d_value); Print(sz0); PrintFormat("Color value in hexadecimal(RGB format): %s", ColorToStrHex(cor)); } class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">class="kw">string ColorToStrHex(class="kw">const class="type">color arg) { class="kw">return StringFormat("0x%02X%02X%02X", (arg & 0xFF), ((arg >> class="num">8) & 0xFF), (arg >> class="num">16) & 0xFF); } class=class="str">"cmt">//+------------------------------------------------------------------+
「画得少,看得清」
这一节把前面三块内容收了一下:用户沟通类的 MQL5 程序看着轻,真要写稳得反复练接口和消息结构,光看不敲很容易卡在细节上。 附件里的 Anexo.zip 只有 2.66 KB,塞的是本文示例的骨架代码,建议直接拖进 MT5 的 MetaEditor 跑一遍,比只读文字来得实在。 下一篇会往格式化和内存处理走,那是后面几个主题的地基;现在先把这版能编译、能收发消息的最小闭环弄熟,后面接高级内容才不虚。