MQL5字符串处理全攻略
从基础声明到API调用的实用教学
字符串在MQL5中的核心作用
字符串变量用于存储字符数据即文本。MQL5提供了丰富的用户友好功能,在EA和指标编写中大多用于生成信息消息:指标中可能提示交易信号,EA中则报告交易活动结果。运行时程序可检查用户输入参数,无效时显示通知,提升用户友好性。
除通知外,字符串在操作文件时不可或缺。读写文本文件利用字符串变量实现,数据量不大时比二进制法更清晰简单,便于即时控制。当参数数量不明(如平均累积手数)可用分隔符写入单独字符串,初始化时分割填数组。但优化时无法检查此类字符串参数。
减少外部参数数量对指标尤为重要,因iCustom()仅有64参数,IndicatorCreate()数组大小60。用字符串启用通知组合(如's'声音、'e'电邮)可将一个变量替代多个布尔开关,保持用户友好。
声明与初始化字符串变量
与其它类型一样,字符串变量可简单声明:string str="Any text"; 长度无限制。长字符串可分割为多个子串写在一起,编译器自动拼接。但未初始化变量值为NULL,与空字符串""不同,经常检查避免逻辑错误。
string str; string str2=""; Alert(str==str2); // false,NULL不等于空串
明智做法是始终初始化为空串,或用条件 str!="" && str!=NULL 判断。确定大小用StringLen(),返回字符数。
if(StringLen(str)!=0) { /* 操作 */ }
连接与组合字符串
最常见操作是连接,用'+'号完成。可将两串连给新变量,或附加到主串:str1+=str2; 也可向开头添加。Alert()、Print()、Comment()支持逗号分隔参数,实际是函数多参数而非真正连接,最大64参数。
string str1="Programming", str2="in MQL5", str3="for MetaTrader 5"; str1=str1+" "+str2+" "+str3; Alert(str1);
专用函数StringAdd()和StringConcatenate()更省内存快速。后者可组合最多64个参数,首参数为目标变量。
StringConcatenate(str1,str1," ",str2," ",str3);
数值与字符串相互转换
生成消息常需嵌入数值。整数用IntegerToString(),布尔转'0'/'1',颜色日期转数值表达式。实数用DoubleToString(double, precision)控制小数位。时间用TimeToString()可带格式如TIME_DATE。
double x=1.23456; string s1="x = "+DoubleToString(x,2); // 1.23
反向转换:StringToInteger()、StringToDouble()、StringToTime()、StringToColor()分别转对应类型。亦可用类型转换(string)x,但双精度可能舍入零位。
string Str="12345.678"; long Val=StringToInteger(Str); // 12345
格式化输出与多语言消息
StringFormat()用模板和%占位符格式化,如%i整数、%f实数、%s字符串、%x十六进制。可设长度%05i、小数%.2f、对齐% 03i。PrintFormat()和printf()直接输出日志。
string str=StringFormat("Percents = %.2f%%",5.5); // Percents = 5.50%
利用TERMINAL_LANGUAGE可据界面语言返回不同模板,实现EA多语言消息,提升国际化体验。
if(Language=="Russian") return("%i плюс %i равно %i");
return("%i plus %i equals %i");
字符串处理关键函数
StringTrimLeft/Right删两端空格制表符换行;自定义Trim()调两者。StringReplace()替换子串返回次数,可循环压缩连续空格。StringFind()搜首出现索引从0计,未找到返-1;自定义StringFindRev()搜末次。
string str="Programming in MQL5 for MetaTrader 5"; int Pos=StringFind(str,"5"); // 23
StringSubstr()取子串。大小写转换StringToLower/Upper。StringCompare()可忽略大小写对比,返0相同。这些函数解决绝大多数文本解析任务。
编码原理与数组转换
计算机视字符串为数字序列,MQL5用Unicode(0-65535),ASCII前127兼容。StringToShortArray()转Unicode数组,StringToCharArray()转ASCII依赖系统区域,超127代码可能失真。数组末位含0标注结束。
short sha[]; StringToShortArray("MetaTrader 5",sha);
逆转换ShortArrayToString()/CharArrayToString()。CharToString()用于Wingdings字体图形对象显示符号。StringGetCharacter()/SetCharacter()操作单字符代码。
调用Windows API函数
部分API以字符串为参。如WinExec运行记事本需uchar数组;MessageBoxW用ushort数组或直传string,MessageBoxA需uchar数组。须在终端允许DLL导入。
#import "user32.dll" int MessageBoxW(int hWnd,string szText,string szCaption,int nType); #import MessageBoxW(0,"Programming in MQL5","Message",0);
ASCII与Unicode版本函数选择取决于编码需求,错误传递类型致消息乱码。
缓冲区与实用自定义函数
StringInit()预填字符、StringFill()不改大小填充、StringBufferLen()查缓冲。预分配可加速后续添加。附带IncStrFunctions.mqh含Trim、StringFindRev、ParamsToArray、NotifyOnOff等,直接复用。
string str; StringInit(str,10,'|'); StringFill(str,'/');
NotifyOnOff()从字符串'a','s','e','p'解析通知类型与柱偏移,极大缩减输入参数。总结:关键函数StringLen/Fiind/Substr/Replace/Split;转换类Double/Integer/TimeToString;数组类Char/Short系列。掌握这些应对多数开发场景。