首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MQL5从入门到精通【第二章】变量与数据类型(三)

Continued.

# 枚举 Enumerations

枚举是特殊的整数类型,定义了一列常量,用于指代整数值。枚举类型,只有定义了才能使用,没定义了,你找不到它的值,报错!

简单举个栗子。我们相拥整数,指代一周星期几。一周七天,用不到小于0,或大于7的数。但是计1,2,3这种太抽象,难以理解,计算机明白了,写程序的还没明白呢。怎么办?可以给一列对应值,用字符串指代数字,再把字符串命名地有意义一些,不就方便记忆了。

没错,枚举就是方便记忆的,也是给写程序的人用的。计算机无所谓,编译之后,反正都是字节码。

enum DayOfWeek
{
    Sunday,
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
};

如上所述,就是如何声明一个枚举类型。enum关键字,加上一个变量名,然后大括号中间的,就是枚举的值。各个值之间使用逗号分开,严格这个写法,编译器就给你过。

我们会很好奇,这么个玩意儿有什么用?其实,枚举的值是从0开始的。也就是说 Sunday=0,Monday=1,一直到Saturday=6。中间的依次类推。可是,这些数字我们不用计啊有没有?方便的不行。

声明了枚举类型,怎么用呢?

DayOfWeek Day; // 声明一个枚举
Day = Monday; // 注意可不是字符串,是没前没后光秃秃的Monady,大小写您还得写对了!
Print(Day); // 输出 = 1

难道我只能枚举几个,只能用0,1,2......这些数字吗?这也太不自由了。如果说我想用http请求状态码 SUCCESS = 200, NOT_FOUND = 404,怎么破?

MQL5自然都设计好了。你完全可以这样用:

enum yearIntervals
{
    month = 1,
    twoMonths, // 2
    quarter, // 3
    halfYear = 6,
    year = 12,
};

上面这个例子,是MQL5参考手册给出的。上面的注释,你看到什么规律没有?

可以手动指定对应值,如果下一个没有指定对应整数值,那么就是前一个+1递增。

规律是需要牢记的。

当然,好的编程实践,或工程使用中,我们会给所有的枚举值,手动指定对一个的整数,保证一个也跑不偏!

# 结构体 Structures

结构体是一组不同类型关联变量的集合。类似于枚举,但成员可以是任意类型。MQL5内有一些预定义的结构体,我们编程中用的较多。这样我们就不用老去创建新的结构体了。但有一条,用那些预定义的机构提之前,先得记清楚,它们是怎么工作的。

下面这个结构体,用于交易配置tradeSettings:

struct tradeSettings
{
    ulong slippage;
    double price;
    double stopLoss;
    double takeProfit;
    string comment;
};

关键字struct用于声明这是一个结构体,名字叫做tradeSettings。包含有6个元素,跟定义变量是一个写法。怎么使用这个结构体呢:

tradeSettings trade;
trade.slippage = 50;
trade.stopLoss = StopLoss * _Point;

与变量声明类似,我们声明trade是一个结构体。声明之后就可以用点方法访问结构体的属性值。读写均可。

MQL5预定义的结构体,因为在交易中经常使用。比如服务返回的交易数据结构。MqlTick结构存储了最新时间,价格,和当前最后价格的交易量。结构如下:

struct MqlTick
  {
   datetime     time;          // 价格更新的最近时间
   double       bid;           // 当前卖价
   double       ask;           // 当前买价
   double       last;          // 最后交易的价格(Last)
   ulong        volume;        // 当前最后价格的交易量
   long         time_msc;      // 价格最后一次更新的时间,以毫秒计算
   uint         flags;         // 报价标识
   double       volume_real;   // 精确度更高的当前最后价格的交易量
  };

用的时候先初始化一个MqlTick结构的对象,然后就可以使用SymbolInfoTick()函数从交易服务器获取数据,并填充到该对象。

MqlTick price;
SymbolInfoTick(_Symbol,price);
Print(price.bid); // 当前卖价

其他的常用结构体,我们会在后续的章节深入学习。

# 类型转换 Typecasting

把值从一个类型转换为另一个,就是数据类型转换。当你这么做时,要分外小心,以免产生意想不到的结果!

比如数据类型的数据,从double传递给float,精度丢失。但是反过来,从float转换为double,经度倒提高了,可以保持。请牢记我们前面讲的数据类型内容。

程序内使用从大数据类型,转换到小数据类型时,编译器会警告“possible loss of data due to type conversion”。如果你确认大数据转换后,超不过小数据类型的量程,尽管忽视报警就行。

比如说,我们计算两个价格【double】的差值,需要传递给一个函数,但是函数仅接收一个整型,那么可以在double类型变量前使用(int)强制类型转换。

double diff = (high - low) / _Point;
BuyStopLoss(_Symbol, (int) diff);//强制转换diff为整型

上述的代码编译不会报错。如果不使用(int)转换符,编译器会抛出类型转换的警告。

下一篇
举报
领券