MQL5语言帮助文件人话版(九)数据类型之颜色型

| 发表于 前天 13:31 | 显示全部楼层 |复制链接
最后由 麻爪 于 2026-9-7 16:01 编辑

第九章 颜色型

一、编程新手感悟:
bool 型数据类型,是从整数数据类型中派生出来,专门用来表示真假两种状态的数据类型。这类派生出来的专用数据类型,还有颜色型color和时间日期型datetime。


新手需要理解:所谓派生,就是它底层本质依然是整数,只是通过专用的数据类型做出语义约束:0 代表假,所有非 0 数值都代表真;颜色、时间也是同理,用一整个整数承载一套特定含义的数据。


程序能够完成加减乘除、数据比较、逻辑判断这类抽象运算。我们也很容易接受:程序本来就该做计算、做逻辑。但很多人会好奇:一行一行的代码,究竟是如何产生人类可以看见的图像、色彩、几何形状、文字符号这些视觉内容的?


逻辑运算主要由 CPU 完成;而图像的最终渲染输出依靠显卡。所有屏幕图像,都由一个个像素颜色点构成;每一个像素依靠红、绿、蓝三原色不同的亮度组合呈现不同色彩。color颜色类型底层就是一个 4 字节整数,内部打包存储蓝、绿、红三个通道的亮度数值。程序把这一组色彩数值传递出去,显卡拿到数据之后,控制屏幕像素发光,呈现对应的色彩;千千万万个颜色点组合在一起,就形成完整的画面。当然,这只是简化后的核心原理。


对比图像,我们会发现在 MQL5 环境里,声音的处理能力要弱很多。MQL5 并不能像 AI 语音合成那样,在代码内部运算生成全新的音频波形。它只能调用已经制作完成的音频文件:你设定好交易条件并被触发之后,系统就播放音频,发出 “叮咚” 的报警。


有趣的是,我们完全可以自己录制音频,起好文件名,转换成 MQL5 支持的 wav 格式。当信号触发,EA 就播放录音,比如喊出 “反转啦,赶紧回家止损啊”。但 EA 本身完全听不懂音频内容,也不理解这句话的含义,它仅仅只是执行 “播放这个文件” 这条指令而已。


二、颜色型


颜色型是用来存储颜色信息的,占用4个字节,头1个字节忽略不计,其他3个字节包括红绿蓝3个数据。


颜色数据可以用三种方法表示: 字符数据、整型数据或者是颜色名(只能是已命名的 网页-颜色 )。


1、字符数据


表达方法是用三个数字来表示三种主要颜色:红、绿、蓝的开度。 数据以 C 开头,用单引号括住。数字的值在 0 ~ 255 之间按比例选取。需要稍微注意的是,这不是画画的时候调颜色,这数字并不代表三种原色占比,而是各自的亮度,0是表示该原色彻底关闭,255代表其亮度开到最大。


比如:


color red   = C'255,0,0';   // R=255红,G=0绿,B=0蓝 →红色
color green = C'0,255,0';   // R=0,G=255,B=0 →绿色
color blue  = C'0,0,255';   // R=0,G=0,B=255 →蓝色
color black = C'0,0,0';     // R=0,G=0,B=0 →黑色
color white = C'255,255,255';// 全部最大亮度 →白色


字符数据的格式对人类是非常友好的,容易让人理解。


2.整数数据


可以使用十六进制或十进制数字。


但在此之前我们需要先了解一个MQL5语言所用的强制数据类型转换规则,其格式为:(目标类型) 原始数值。


比如:color red   =(color)255;


前面的“color”是颜色数据类型定义,意思是创建一个“red"颜色型的变量,后面带括号的(color)就是强制类型转换,把整数255,这个十进制的数字,解读规则切换成 color 类型,得到一个颜色值。


也可以写成:


color red   =(color)0x000000FF; //红色


这个也代表红色,
还有:
color green = (color)0x0000FF00;//绿色
color blue = (color)0x00FF0000;//蓝色
color white = (color)0x00FFFFFF;//白色
color black = (color)0x00000000;//黑色
color purple = (color)0x00FF00FF;//紫色,全蓝色加全红色
color yellow = (color)0x0000FFFF;//黄色,全绿色加全红色
color gray = (color)0x00808080;//灰色,蓝、绿、红各开一半


(color)后面的那一串,就是十六进制数字。


三、十六进制数字

我们需要再了解一下十六进制计数法。


”0x"是十六进制数字在程序中的固定开头格式,是数字0和小写字母x组合,不是乘号。当然这个格式并不是十六进制计数自身的要求,只是本程序的特殊格式。


后面有八个数位,是因为颜色型数据固定占四个字节,一个字节对应十六进制数字的两个数位。


十六进制数字同样表示的是三原色各自的亮度,而每个原色占两个数位,所以用十六进制数字表示颜色时,0x后面紧跟的两个数位上永远都是0。


后面六位,每两位上面的数代表了一个三原色的开度,只不过顺序与字符数据方法正好反过来,先蓝、后绿、再红。


我们看到上面的例子里有许多F,这是十六进制的字码。


普通数字0~9,共10个,这是十进制的字码。它表达十五的时候,直接写成15就好了,但十六进制里15也是一个字码,因为还没进位呢,我们需要为十六进制另行创造10~15这六个字码。简单点,用A代表10,B代表11······F就代表15了。那16呢?请记住,十进制的字码中没有10,十六进制字码中也没有16,二进制字码中同样没有2。当十六进制数到16时,就把个位清零,把十六位(如果十进制个位前面是十位,那么十六进制个位前面就是十六位,在前面就是二百五十六位,4096位······为了防止啰嗦,一般都是说右边数第几位)上加1,等到十六位上面也加到16的时候,再清零,在二百五十六位上加1。这套逻辑与十进制是一样的。


所以我们数0到9的时候,十六进制的表达跟十进制没什么区别:
0x00000001,就是十进制的1
0x00000002,就是十进制的2
0x00000003,就是十进制的3
······
0x00000009,就是十进制的9
数到10就有点区别了:
0x0000000A,就是十进制的10
0x0000000B,就是十进制的11
0x0000000C,就是十进制的12
······
0x0000000F,就是十进制的15
再继续数下去就要进位了:
0x00000010,就是十进制的16
0x00000011,就是十进制的17
······
0x00000019,就是十进制的25
0x0000001A,就是十进制的26
······
0x0000001F,就是十进制的31


理解没有?它右边第二位上的一个1就相当于十进制里面的一个16,如果是2就是2个16,如果是F,就是15个16,然后加上右边第一位的数值,就等于十进制的数值了。


所以:0x000000FF,就是十进制的255相当于15个16加16个1,就等于255。


需要特殊强调的是,在这里,我们是用十六进制来表示颜色,而不是用来数数。虽然写出来的数字是一个完全合乎语法的十六进制数字,系统也会把它当解析成数字。但我们千万不要真按十六进制去理解右边数第三位是二百五十六位,上面一个1代表一个256,第四位是4096位,上面一个1代表一个4096。算这些具体数值没有意义。


我们现在是在派生引用,把这六个数位分成三组,每组都是从0数到255,正好对应三原色各自的亮度。就相当于在布尔运算中,系统明明算出来的就是个整数0或者非0的其他整数,我们人类当它是假或者真。


还有种操作,利用二进制数字只有0和1的组合这个特点,我们可以设计一个七位的二进制数字,1111100,1代表开市,0代表不开市,把这串代码和周一到周日七天的时间对应起来,可以告诉系统哪天开市,哪天不开始。做这个操作的时候,我们根本不关心“1111100”到底代表的是十进制数字几,我们只用它各个位上的数字当开关符号罢了。与用十六进制数字表示颜色有异曲同工之妙。


这种操作叫做位掩码(bit‑mask,位标志)


而整数数据用十进制形式的颜色表达方式,可以理解为十六进制写法的副产品。它就是把十六进制那一大串转化成其所代表的十进制数字。这种方法是系统用的,因为对系统来说,输入者就是想用这个数字来代表某个变量,它不管你什么进制,输出十进制对它来说更方便。人类手写几乎不用这办法,(color)255,你知道是红色,(color)185697呢?这是我瞎编的,鬼知道它是什么颜色。


我们写代码手动指定颜色,优先用C'R,G,B',其次用十六进制0x00BBGGRR;尽量避免手写十进制大数写颜色。


四、特殊颜色名:网页-颜色表。


就是预定义颜色常量,全部以 clr 开头,对应网页标准网页颜色表。例:clrRed、clrGreen、clrBlue、clrYellow、clrPurple、clrSkyBlue。


这套颜色名称来源于网页 HTML 的标准颜色表,MQL5 直接照搬了这一套名字。


这套方法其实是最符合人类思维方式的,红色就是红色,绿色就是绿色,而不用去考虑一堆数字,真正做到了见名知意。


但它能提供的颜色数量是有限的,且一堆英文单词,让人难以记住。写错一个字母,或者大小写,系统都会不知所谓。


其实并不如C'255,0,0'这样简洁明了,不易出错。
最近访问 头像模式
举报

评论 使用道具

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