前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MQL5从入门到精通【第二章】变量与数据类型(三)

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

作者头像
程序员小助手
发布2020-04-08 11:18:31
9270
发布2020-04-08 11:18:31
举报
文章被收录于专栏:程序员小助手

Continued.

# 枚举 Enumerations

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

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

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

代码语言:javascript
复制
enum DayOfWeek
{
    Sunday,
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
};

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

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

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

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

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

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

代码语言:javascript
复制
enum yearIntervals
{
    month = 1,
    twoMonths, // 2
    quarter, // 3
    halfYear = 6,
    year = 12,
};

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

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

规律是需要牢记的。

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

# 结构体 Structures

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

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

代码语言:javascript
复制
struct tradeSettings
{
    ulong slippage;
    double price;
    double stopLoss;
    double takeProfit;
    string comment;
};

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

代码语言:javascript
复制
tradeSettings trade;
trade.slippage = 50;
trade.stopLoss = StopLoss * _Point;

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

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

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

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

代码语言:javascript
复制
MqlTick price;
SymbolInfoTick(_Symbol,price);
Print(price.bid); // 当前卖价

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

# 类型转换 Typecasting

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

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

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

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

代码语言:javascript
复制
double diff = (high - low) / _Point;
BuyStopLoss(_Symbol, (int) diff);//强制转换diff为整型

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员小助手 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • # 枚举 Enumerations
  • # 结构体 Structures
  • # 类型转换 Typecasting
相关产品与服务
大数据
全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档