MQL5语言帮助文件人话版(二十三)语句和表达式(中)

| 发表于 7 小时前 | 显示全部楼层 |复制链接
最后由 麻爪 于 2026-9-29 14:38 编辑

第二十三章 语句和表达式(中)


七、布尔运算
布尔运算也叫“逻辑运算”,作用是对多个布尔值(真 / 假)进行逻辑组合,最终得到一个布尔结果。

上一节的关系运算,目的是产出布尔值,比较两个数,得到真 / 假,而布尔运算,目的是组合布尔值,把多个真 / 假条件拼起来,得到最终判断。二者配合,就能写出 EA 里各种复杂的开仓、平仓、风控条件。

MQL5 标准布尔运算符共 3 个,按优先级从高到低依次是:逻辑非 `!` > 逻辑与 `&&` > 逻辑或 `||`。

其中逻辑非 `!`是一元运算符,也就是对一个布尔值取反,真变假,假变真。!真 = 假 ,!假 = 真 。常用于判断 “不满足某个条件”,比如 `!OrderSelect(...)` 判断订单选中失败。

逻辑与 `&&`和 逻辑或 `||`是二元运算符,也就是同时判断两个条件。

区别在于逻辑与 `&&`要求两个条件同时成立,最终结果才为真;只要有一个不成立,结果就是假,即双真为真,只要有一个是假,就为假。它常用于判断两种条件都满足,才执行的场景。

逻辑或 `||`要求两个条件只要有一个成立,结果就为真;只有两个条件都不成立的时候,结果方为假。它常用于判断两种条件满足其一就执行,都不满足才放弃的场景。

布尔逻辑运算中的短路求值操作,在计算连续的布尔逻辑表达式时,只要仅凭已经计算完的前半部分,就能 100% 确定整个表达式的最终结果,程序就会立刻终止后续的计算,不再执行剩下的表达式部分。比如在逻辑与 `&&`运算中,遇到一个假,在逻辑或 `||`运算中,遇到一个真,就可以直接判断最终结果了,后面的运算就可以停止,这是一种效率优化机制。

八、逐位运算
我们之前聊二进制数字的时候,提到过一嘴说可以用一串二进制数字的0和1的组合,表示一组含有多个开关状态的功能,叫“位掩码”,还有16进制数字表示颜色,也是一种“位掩码“。我们要用这种”位掩码“实现各种开关组合,或者变换颜色之类的,实际上就是通过操作这些数字每一位上的具体数字来实现的,这就是”逐位运算“,通常叫做”位运算”。

位运算的操作对象不是数值的大小,而是直接对整数在内存中的“二进制每一位”执行逻辑操作或移位操作。

MQL5 仅支持整数类型(`int`/`uint`/`long`/`char` 等),不能用于浮点数、字符串等类型。

位运算就是对每一位独立进行运算,位与位之间互不干扰。这是一个坑点,新手需要着重理解。在位运算中,我们只是把某一位上的0变成1,或者1变成0,再或者把数字左右移动,这里并不当这个二进制数字是一个整体的数字,不存在逢2进1这样的进位计算。

位运算总共有六种:

(1)左移运算符 `<<`
二进制整体向左移动 x 位,左侧移出高位的部分直接丢弃,右侧腾出来的低位,统一补0。

比如:
        6 << 1 (6 的二进制 00000110)
        原数:00000110 (十进制 6)
        左移1位: 0000110? 左边丢1位,右边空1位
        低位补0: 00001100 (十进制 12)
再比如:
        6 << 2(6 的二进制 00000110)
        原数:00000110 (十进制 6)
        左移2位: 000110? ? 左边丢2位,右边空2位
        低位补0: 00011000 (十进制24)
把二进制整体向左 移动n位,相当于把它对应的整数乘了 2 的 n 次方。6向左移动1位,等于6×2^1=12,向左移动2位,等于6×2^2=24。

在复合赋值的时候,y <<= x 等价于 y = y << x。

(2) 右移运算符 `>>`
把一串二进制数字右移动,会出现一个特殊情况,为此我们先要引入“补码”的概念。

在通用计算机编程语言的语法规则中,默认所有的有符号数都是以“补码”形式存储和运算的。补码到底是怎么折腾出来的,我研究了半小时愣没看明白。但只要记住一个特点就好,在计算机编程中,特定长度(比如八位数字)二进制最左侧一位上的数字,是用来表示整数的正负号的,也就是所谓的有码无码的,叫做符号位。1代表负数,0代表正数。于是,就有了以下规则:

二进制整体向右移动 x 位,右侧移出低位的部分直接丢弃,右侧腾出来的低位,无符号整数(也就是正整数)直接补0,有符号整数(也就是负整数)直接补1。

比如正数右移动:
        6 >> 1 → 00000110 右移1位 → 00000011 → 十进制 3
-6的补码是11111010,则:
        -6>>1 → 11111010右移1位 → 11111101 → 十进制-3
把二进制整体向右移动n位,相当于把它对应的整数除了 2 的 n 次方。6向右移动1位,等于6÷2^1=3,-6向右移动1位,等于-6÷2^1=-3,这一点与正负号无关。

在复合赋值的时候,y >>= x 等价于 y = y >> x。

(3)按位 与 `&`
对两个数的二进制对应位,逐位执行逻辑运算。运算规则类似布尔运算的逻辑与 `&&` ,对应位都是1结果为1,有一个是0,结果就是0。也就是“双真为真,只要有一个是假,就为假。”

比如:00000110 (6) & 00000101 (5) = 00000100 (4) 。

复合赋值时`y &= x` 等价于 `y = y & x`。

(4)按位 或 ‘| ’

对两个数的二进制对应位,逐位执行逻辑运算。运算规则类似布尔运算的逻辑或 `||`,对应位有一个是1结果即1,均为0时,结果就是0。也就是“一真即真,双假为假。”

比如:00000110 (6) | 00000101 (5) = 00000111 (7) 。

复合赋值时`y | = x` 等价于 `y = y | x`。

(5)按位 异或 ^
对两个数的二进制对应位,逐位执行逻辑运算。布尔运算没有“异或”规则,“异或”要求对应位的两个数值不一样,结果才是1,相同则为0.

比如:00000110 (6) ^ 00000101 (5) = 00000011 (3)

复合赋值时 `y ^= x` 等价于 `y = y ^ x`

(6)按位 取反~
按位取反 `~`是一元运算符,对一个数的所有位(包括符号位)0 变 1,1 变 0,类似布尔运算的逻辑非 `!` 。

比如:~6 → ~00000110 → 11111001 → 十进制 -7(补码规则)

按位取反 `~`没有对应的复合赋值运算符。


最近访问 头像模式
举报

评论 使用道具

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

麻爪

麻爪 D

如果你想让一个人下地狱,介绍他做交易。
如果你想让一个人在地狱里永不超生,介绍他做EA交易。

Fast跟单EA