MQL5语言帮助文件人话版(五)数据类型之整数

| 发表于 1 小时前 | 显示全部楼层 |复制链接
第五章 整数类型

一、编程新手的感悟MQL5静态强类型语言,它编写和处理任何数据都要先声明该数据的类型,新手需要知道不是所有的语言都这样,但MQL5必须这样。MQL5与别的语言相比最大的特点就是它的高频循环性,说白了,每出现一个新的成交价,它内部的OnTick函数都会运行一次,根据市场流动性的大小,EA程序每秒钟可能要循环运转几十几百几千次,而且这个过程需要随时插入其他函数的运行结果,在其他领域的大多数程序都不会这么疯狂。
所以EA编写最根本的要求就是一定要稳定、一定要明确
先设定数据类型,再给这个量赋值,就是这个特色要求的具体表现。也是数据类型这个概念在MQL5语言编程中最广泛的应用。你让系统记住一个整数量,那么这个量的名字和类型就定死了。你想改,只能删掉它重写。绝不能再写一个同名量,把它定义为浮点型数据,会被系统拒绝,直接报错。(当然也有把数据转化成其他类型的方法和操作,但本质上是各种数据类型之间的兼容性,而不是单纯改数据类型。)这种规定就可以保证你程序中各种量的名称、类型具备唯一性。但具体数值不一定唯一,变量可以随时赋值新的数值,恒量一旦规定好了,就没的改。
如果把交易系统比喻成一台汽车,数据就是各种参数,各种变量、恒量就相当于汽车的参数名类。我们用数据类型定义变量/恒量的操作,就相当于处理不同类型的参数。比如厂家设计的汽车油箱参数,是个恒量,且是个整数。用MQL5语言来表达就是:const int capacity = 60;const代表后面的数据是恒定不变的,厂家制作好的汽车油箱容量是60L,不会跑着跑着就变大或者变小了。当然有的车是40L油箱,相当于在不同的系统中,同样的参数可能会有不同的具体数值,哪怕它是恒定量。但无论多大,通常情况下都是个整数。如果你非要一个58.75L的油箱,double类型的容量数据,不是不可以,但会显得不太正常。
但我们去加油站加油,就不能用int这种整数数据类型了,因为现实中几乎不可能完美的加满60L油。我们一般说加一百块钱的,加二百块钱的,实际得到的油可能是12.82L,27.03L。如果你写一段汽车实际加油量的代码,还用int类型规定这个参数,也不是不可以,但它会抹掉小数部分,当后面的不存在,只记录你加了12L、27L。这样处理数据,程序不会报错,但在EA运行中会带来灾难性的后果。
在交易EA中,设计合约规格、最小变动单位这类交易中的固定属性,如同油箱出厂容积,适合常量。
如果要处理点数,就最好用整数类型int,因为交易中不可能出现0.5个点这种概念。
如果要处理价格,那它绝大多数情况下都带有小数,需要用浮点数类型double。
注意,编程语言中没有人类语言中”量词“的概念,它不知道你加的油是多少升还是多少加仑,只知道那个数字。很多人编程时,忘记区分平台的标准点和迷你点,反正都是点嘛,系统一运行直接爆仓出局。
如果逻辑程序需要,一些类型能与另一些类型一起使用。有人会想到,小数不能用整数类型处理,但整数用浮点数类型处理,应该没问题吧?一般情况下确实没问题,特殊情况下也会出现灾难性后果。这涉及到数据类型转换的概念,要遵循数据转换的规则,后面再说。
二、整型数据
在MQL5中整数有8个类型。我总结了一个顺口溜:有符无符,字短整长。
v2-08a8377539b13b75b041c52e65bb407c_r.jpg
大家很容易看出来,所谓无符就是0和正整数部分,有符就是负整数、0和正整数三部分。所以8个整数类型其实是4个类型,每个类型又分了两类。
三、数据类型的溢出类错误
另外这四种类型占的内存越来越大,所能表达的数位也越来越多。在实际编程中,整数类的数据,最常用的就是int类型。有些人会认为用int去规定一些看起来很小的数,会多占内存,影响运行速率。但以现代电脑性能,这些影响可以忽略不计。千万不要自作聪明用字符型、短型来命名一些数据,会出现一些莫名其妙的现象。
比如我要设计一个连续盈利多少根K线的阈值,这其实是持仓时间的变相表达,海量盈利单子统计会发现这种规律:持仓时间太短,不足以赚取足够的盈利,持仓时间太长,又容易遇到行情反转回吐利润,这只是它的大概原理。如果你根据历史统计,发现盈利单持仓超过100根k线时,遇到回调的概率就很大了,所以你把这个阈值设计为100,当系统检测到盈利持仓超过100根K线时,就立即平仓或降低仓位。你用char来定义这个100根。
但计数器会持续数到101、110、127,直到128,啪的一下,它变成-128了,因为char最大只能记录127,遇到128时就从头开始记,这个参数就直接跳成了-128,这叫符号溢出行为。如果此时你还有加仓策略,比如盈利K线数小于10根,属于行情刚开始发展的阶段,需要加仓,风控系统接到这个-128的数据,就会给出加仓命令,那就麻烦了。
如果你的某种计数设计要求最大就计到127,坚决不允许更大的数出现,不能试图用数据类型来实现这种设定,而是用退出语句,设定计数达到127就退出计数,从0开始重新计数。
即使数据大小不冲突,如果把负数赋值给无符型,也就是只能表示0和正整数的数据类型,系统不会报错,但会瞎解释,得到一个莫名其妙的其他正整数数值。
除了计数,也就是各种数个数的情景,EA中还有许多参数会以一个很长的整数形式存在。比如订单号,通常这个订单号是个10位数字组成的,我们当然知道它的本质并不是表示个数,但在系统看来,它就是一个表达几十亿的数字。这时候int就不够用了,必须使用long来表达。当然也有纯粹计数的超级大数,比如你要获得某个品种的日成交量,这种数字是万亿级别的,还有系统时间,在最底层,它是用秒来累计计算的,这个数字也是天文数字。这些超级大数如果还用int来设计,也会出现前面说的那些莫名其妙的各种问题。
另外,在原版手册中,还有2进制和16进制计数的相关内容,但常规EA编程中基本上用不到这两种数字,我就不做赘述了。在颜色类型中,将会使用到16进制计数,我到时候再详细说明。
最近访问 头像模式
举报

评论 使用道具

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