最后由 麻爪 于 2026-9-9 13:00 编辑
第十六章 数据类型转换
一、MQL5 数据类型转换
所谓类型转换就是把一份数据,按照另一种数据类型的规则重新解读 / 重新生成一份数据。
MQL5 分为两大类: (1)隐式转换:自动转换,代码不写任何符号,编译器悄悄帮你转
(2)显式转换:强制转换,手动写转换函数或者强制运算符 转换不一定安全,会出现精度丢失、数值截断、时间错乱,隐式转换经常偷偷制造 bug。
比如整数 int转化为浮点数 double,安全,无精度损失;浮点数double 转化为整数int,危险!小数直接截断丢掉,不是四舍五入。
整数家族内部:char, uchar, short, ushort, int, uint,long, ulong,小范围往大范围隐式转换安全;大范围往小范围,数值超出就截断溢出。 按手册中的数字转化示意图,实心箭头表示可以安全转化,没有任何信息损失。虚线箭头表示可以转化,但会造成精度缺失。在关于浮点数精度概念讲过这个话题,请参考。
bool 布尔型隐式转化规则:任何数字赋值给 bool:0 → false,一切非 0 数字 → true;反过来 bool 赋值给数字:false转0;true转1。
二、不允许隐式转换的场景
这些情况不能自动转数据类型,必须手动处理: (1)字符串 string 不能和数字、datetime 自动互相转换
(2)datetime 时间类型,不能直接隐式当成 int/double;虽然底层是时间戳整数,但不会自动随便转换。
(3)color 颜色不能自动转数字、字符串。
(4)枚举 enum 不会自动随便转 int;虽然底层是整数,但 MQL5 比 C++ 严格,枚举赋值给 int 可以隐式;int 赋值给枚举变量不能隐式,必须强制转换。
(5)struct、class、vector、matrix,不会隐式互相转换,也不会隐式转为基础类型。 三、什么时候需要进行隐式转换
(1)赋值:变量 = 另一个值
(2)函数调用:实参传给形参
(3)运算:a + b,两边类型不一样,发生自动提升。但如果是两个整数相除,结果仍然 int,小数直接截断!比如5/2,输出结果是2,而不是2.5。
(4)数据类型提升规则如下图:
四、显式强制转换
MQL5语言实现数据类型的显示强制转换,有两种形式:
(一)C‑风格强制转换括号语法
基本格式就是:(目标类型)变量,例如: double val=5.99; //定义一个双精度浮点变量val,并赋值5.99
int iv=(int)val; //定义一个新的整形变量iv,用val给它赋值,但用(int)先把val转换为整型
int iv=val; //这样写也不会报错,但系统会警告数据丢失。这就是隐式转换
int iv=5.99; //这样写同样不会报错,系统也会警告数据丢失。这本质上也是就是隐式转换
通过转换,最终变量iv的值是5,小数部分0.99会被直接舍弃。如果希望在舍弃小数的时候,四舍五入,需要用系统函数Round()。
int iv = (int)Round(val); //这样的输出结果是6
(二)MQL5 专用转换函数
字符串、时间、颜色,这三类不支持隐式转换,不能用 (类型) 括号强转,必须使用专用转换函数。
数字转字符串:DoubleToString、IntegerToString 例如: void OnStart()
{
double price = 1.23456;
int bar_num = 120;
// double转字符串,第二个参数:保留小数位数
string s_price = DoubleToString(price,4);
Print(s_price); //输出 "1.2346"
// int转字符串
string s_bar = IntegerToString(bar_num);
Print(s_bar); //输出 "120
" }
字符串转数字:StringToDouble、StringToInteger 例如: string s1 = "98.76";
string s2 = "1000";
string s_err = "abc123"; //这种无法转换为数字
double d_val = StringToDouble(s1);
int i_val = StringToInteger(s2);
double d_bad = StringToDouble(s_err); //转换失败返回0.0,无法区分是本来就是0还是解析出错
Print(d_bad); //输出0.0
时间与文本互转:TimeToString、StringToTime datetime底层是时间戳整数,但禁止直接用 (int) 互相强转,优先专用函数。
例如: // datetime → 时间文本 TimeToString ()
void OnStart()
{
//获取当前服务器时间
datetime now = TimeCurrent(); //转为完整时间字符串 "2026.09.02 14:30:00"
string time_str = TimeToString(now);
Print(time_str);
}
//时间文本 → datetime 时间戳 StringToTime ()
string t_text = "2026.09.02 08:00:00";
datetime my_time = StringToTime(t_text);//解析失败返回 0,0代表1970‑01‑01
if(my_time == 0)
{
Print("时间文本解析失败");
}
//
格式必须匹配 `yyyy.mm.dd hh:mm:ss`,即年月日时分秒的格式,格式写错解析得到 0。
颜色与文本互转:ColorToString、StringToColor //color → 字符串 ColorToString ()
color red = clrRed;
string col_str = ColorToString(red);
Print(col_str); //输出 "255,0,0"
//字符串 → color StringToColor ()
string c_text = "0,255,0"; //绿色
RGBcolor my_green = StringToColor(c_text);
//解析失败返回
clrNONEif(my_green == clrNONE)
{
Print("颜色字符串解析错误");
}
|