MQL5语法基础(三)
整型数据
在MQL5中整数有11个类型,如果逻辑程序需要,一些类型能与另一些类型一起使用,但是在此 种情况下,要记住类型转换规则。
下面列表中显示了每一类型的特性,此外,每一类型的最后一列均与C++程序类型相同。
类型 | 字节大小 | 最小值 | 最大值 | C++类比 |
---|---|---|---|---|
char | 1 | -128 | 127 | char |
uchar | 1 | 0 | 255 | unsigned char, BYTE |
bool | 1 | 0(false) | 1(true) | bool |
short | 2 | -32768 | 32767 | short,wchar_t |
ushort | 2 | 0 | 65635 | unsigned short, WORD |
int | 4 | -2147483648 | 2147483647 | int |
uint | 4 | 0 | 4294967295 | unsigned int,DWORD |
color | 4 | -1 | 16777215 | int,COLORREF |
long | 8 | -9223372036854775807 | 9223372036854775807 | _int64 |
ulong | 8 | 0 | 18446744073709551615 | unsigned_int64 |
datetime | 8 | 0(1970.01.010:00:00) | 32535244799 (3000.12.31 23:59:59) | _time64_t |
整型值也可视为数字常数,颜色值和,日期时间值,字符常量 和计数 。
字符型,短整型,整型和长整型
- char
字符型 在内存里存储1字节( 8位元组),允许二进制记录法2^8=256表达值。 字符型包括正值和负值,范围在-128-127之间。 - uchar
无字符型 和字符型一样,也占据1字节内存,但与之不同的是,它只有正值。最小值是0,最大值是255无字符 型的第一个字母u是unsigned的缩写。 - short
短型 数据2字节( 16位元组),所以它可以表达等于2的值和16: 2^16 = 65536,因此短型还是一个符号,包括正值和负值,范围在-32768到32767之间。 - ushort
无符短型是ushort,也占用2字节,最小值是0,最大值是65535。 - int
整型占用4字节内存( 32元组),最小值是-2147483648,最大值是2147483647。 - uint
无符号整型就是uint。它占用4字节内存,区间在0到4 294 967 295之间。 - long
长型占用8字节( 64元组),最小值是-9223372036854775808,最大值是9223372036854775807。 - ulong
无符长型也占用8字节,能存储从0到18446744073709551615之间的值。
示例:
char ch=12;
short sh =-5000;
int in=2445777;
无符长型不代表短型的负值,建立负值会导致意外的结果,该脚本会无限循环:
//---无限循环
void OnStart()
{
uchar u_ch;
for(char ch= -128;ch<128;ch++)
{
u_ch+ch;
Print("ch=",ch,"u_ch=",u_ch);
}
}
正确的转化是:
void OnStart()
{
uchar u_ch;
for(char ch=-128;ch<=127;ch++)
{
u_ch=ch;
Print("ch = ",ch," u_ch = ",u_ch);
if(ch==127) break;
}
}
结果:
ch= -128 u_ch= 128
ch= -127 u_ch= 129
ch= -126 u_ch= 130
ch= -124 u_ch= 132
ch= -123 u_ch= 133
ch= -121 u_ch= 135
ch= -119 u_ch= 137
ch= -117 u_ch= 139
ch= -115 u_ch= 141
ch= -113 u_ch= 143
ch= -111 u_ch= 145
...
示例
//负值不能存储在无符类型中
uchar u_ch=-120;
ushort u_sh=-5000;
uint u_in=-401280;
十六进制:数字0-9,字母a-f,或A-F表示值10-15,从0x或0X开始。
示例
0x0A, 0x12, 0X12, 0x2f, 0xA3, 0Xa3, 0X7C7
对于整型变量,值可以使用B前缀以二进制格式设置。例如,您可以编码交易时间的工作小时 为int类型变量并根据所需的算法使用他们的信息:
//+------------------------------------------------------------------+
//| 脚本程序开始函数 |
//+------------------------------------------------------------------+
void OnStart()
{
//--- 设置 1 为工作小时和 0 为非工作小时
int AsianSession =B'111111111'; // 亚洲时间从 0:00 到 9:00
int EuropeanSession=B'111111111000000000'; // 欧洲时间 9:00 - 18:00
int AmericanSession =B'111111110000000000000011'; // 美洲时间 16:00 - 02:00
//--- 派生时间数值
PrintFormat("Asian session hours as value =%d",AsianSession);
PrintFormat("European session hours as value is %d",EuropeanSession);
PrintFormat("American session hours as value is %d",AmericanSession);
//--- 现在让我们展示时间工作小时的字符串表示
Print("Asian session ",GetHoursForSession(AsianSession));
Print("European session ",GetHoursForSession(EuropeanSession));
Print("American session ",GetHoursForSession(AmericanSession));
//-- }
//| 返回时间工作小时为字符串 |
//+------------------------------------------------------------------+
string GetHoursForSession(int session)
{
//--- 若要检查,使用AND比特操作并左移1比特<<=1
//--- 从最小比特开始检查
int bit=1;
string out="working hours: ";
//--- 从零开始检查全部24比特并最高到23
for(int i=0;i<24;i++)
{
//--- 总共接收的比特数
bool workinghour=(session&bit)==bit;
//--- 添加小时数到嘻嘻
if(workinghour )out=out+StringFormat("%d ",i);
//--- 左移1比特检查下一个的值
bit<<=1;
}
//--- 结果字符串
return out;
}