首页 / 交易学院 / 小布知识库 / MQL5字符串处理全攻略
MQL5字符串处理全攻略
🔤

MQL5字符串处理全攻略

从基础声明到API调用的实用教学

MQL5开发 难度 · 入门 2026-05-24 7 分钟阅读
#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) { /* 操作 */ }
⚠ 常见坑
未初始化字符串参与连接或比较会得到NULL相关异常,弹窗报警false。养成声明即赋空串习惯。

连接与组合字符串

最常见操作是连接,用'+'号完成。可将两串连给新变量,或附加到主串: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);
✦ 文件写入差异
FileWrite()在CSV模式用指定分隔符替逗号;TXT模式'+'与','结果同。处理添加时注意模式避免错乱。

数值与字符串相互转换

生成消息常需嵌入数值。整数用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
⚠ 逗号小数点
用户输入实数常用逗号,须StringReplace(str,",",".")再转双精度,否则小数部分被截掉。

格式化输出与多语言消息

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相同。这些函数解决绝大多数文本解析任务。

✦ CSV解析
用StringSplit(Str,';',array)分割参数串,配合Trim和逗号替换可安全转double数组,见ParamsToArray函数。

编码原理与数组转换

计算机视字符串为数字序列,MQL5用Unicode(0-65535),ASCII前127兼容。StringToShortArray()转Unicode数组,StringToCharArray()转ASCII依赖系统区域,超127代码可能失真。数组末位含0标注结束。

short sha[]; StringToShortArray("MetaTrader 5",sha);

逆转换ShortArrayToString()/CharArrayToString()。CharToString()用于Wingdings字体图形对象显示符号。StringGetCharacter()/SetCharacter()操作单字符代码。

⚠ 加密注意
数组末0字符若被算法转为0会导致字符串截断,特殊任务需技巧处理,本文不展开。

调用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系列。掌握这些应对多数开发场景。

常见问题

未初始化字符串值为NULL,空字符串为"",两者不等。用StringLen()或条件str!=""&&str!=NULL判断,建议声明时赋空串避免错误。
用StringSplit(Str,';',tmp)分割,循环Trim每个元素,StringReplace逗号将点,再StringToDouble填充数组。可直接复用文章ParamsToArray函数。
用%.2f设两位小数的实数,%%输出百分号,例如StringFormat("Percents = %.2f%%",5.5)得到'Percents = 5.50%'。
MessageBoxA要求ASCII编码的uchar数组参数,应先用StringToCharArray转uchar[]再传入;若传string或ushort会乱码。Unicode用MessageBoxW。
用TerminalInfoString(TERMINAL_LANGUAGE)获取语言,在GetFormatString里返回对应StringFormat模板,如俄语返'%i плюс %i равно %i',英语返默认。