MQL5语言帮助文件人话版(十六)数据类型之数据类型转换

| 发表于 1 小时前 | 显示全部楼层 |复制链接
最后由 麻爪 于 2026-9-9 13:00 编辑

第十六章 数据类型转换

一、MQL5 数据类型转换
所谓类型转换就是把一份数据,按照另一种数据类型的规则重新解读 / 重新生成一份数据。

MQL5 分为两大类:
(1)隐式转换:自动转换,代码不写任何符号,编译器悄悄帮你转
(2)显式转换:强制转换,手动写转换函数或者强制运算符
转换不一定安全,会出现精度丢失、数值截断、时间错乱,隐式转换经常偷偷制造 bug。

比如整数 int转化为浮点数 double,安全,无精度损失;浮点数double 转化为整数int,危险!小数直接截断丢掉,不是四舍五入。

整数家族内部:char, uchar, short, ushort, int, uint,long, ulong,小范围往大范围隐式转换安全;大范围往小范围,数值超出就截断溢出。
ScreenShot_2026-09-01_162452_435.png
按手册中的数字转化示意图,实心箭头表示可以安全转化,没有任何信息损失。虚线箭头表示可以转化,但会造成精度缺失。在关于浮点数精度概念讲过这个话题,请参考。

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("颜色字符串解析错误");
}





最近访问 头像模式
举报

评论 使用道具

发新帖
EA交易
您需要登录后才可以评论 登录 | 立即注册

麻爪

麻爪 D

如果你想让一个人下地狱,介绍他做交易。
如果你想让一个人在地狱里永不超生,介绍他做EA交易。

Fast跟单EA