MQL5语言帮助文件人话版(二十七)第三章(2) 语法执行单元
最后由 麻爪 于 2026-10-10 15:19 编辑五、return; 跳转语句可以把return这个看成一个跳转操作符,后面加上分号,就是能够独立执行跳转动作的跳转语句。其核心作用是立即终止当前函数的执行,把控制权交还给调用方;可以附带一个返回值传递给调用者。
对于无返回值的函数,直接写return; 即可,有返回值的函数,要写return 返回值; 。
无返回值的函数,前面一般带一个void标志,有返回值的函数,前面一般带一个数据类型标志,return后面的返回值类型必须和函数声明的返回值类型一致。
特别指出,return;在MQL5语言中,只会出现在函数的主体也就是花括号{}中,其他地方看不到return;跳转语句。
另外,在函数中我们往往会设置一些先决条件,如果符合或者不符合这些条件,就直接退出当前函数,就用if (具体条件)加return; ,让函数在此直接结束。if (具体条件)加return;这种句子就叫“卫兵语句(Guard Clause)”。
六、if else 条件分支控制语句
这是写EA的高频应用,所以我多啰嗦几句。
(一)基本语法规则如下:if(条件表达式)
{
//条件成立时执行的代码
}
else
{
//条件不成立时执行的代码
}
(二)串行多分支结构的语法规则如下:if(条件1)
{
条件1成立执行
}
else if(条件2)
{
条件2成立执行
}
else if(条件3)
{
条件3成立执行
}
// ... 可以继续加任意多个 else if
else
{
所有条件都不成立时执行(可选)
}这种情况下,else if 数量无限制,想加多少个条件都可以。但是需要注意,else if 中的else不能省写,因为省掉之后,就相当于连续写了两个if ,系统会判断这是两个独立的if else 条件分支控制语句。而最后的else 最多 1 个,只能放在整个分支链的最后,作为 “所有条件都不满足” 的默认分支;也可以省略不写。
(三)嵌套条件分支语句
简单来说,就是在if分支的大括号内部,再写if else。if(外层条件)
{
if(内层条件)
{
外层+内层都成立
}
else
{
外层成立、内层不成立
}
}
else
{
外层条件不成立
}
(四)特殊说明:if和else是一对儿,系统只会把离最近的同级别的if和else凑在一起,当成一个整体来处理,跟是否换行、如何缩进没关系。如果省写一个else,系统会把前面的if当成独立语句。所谓独立语句,就是独立判断,连续的if语句互不影响,可以同时成立并执行。为了防止出错,如果有多级嵌套,一定要把同级别的if和else用花括号括起来。
(五)定 义:所谓条件分支控制,就是根据条件的真假,选择执行不同的代码分支,是策略逻辑判断的核心语法。
(六)其他说明:
1.只有一种可执行条件的情况:我们可以只写一个if(){}else(){}语句,也可以省略else,就是只执行一个条件,其他任何与该条件不符合的情况都被忽略;
2.只有一种特殊条件,其他都是同样处理的情况:我们可以写一个if(){}else(){}语句,表示只有一种条件下需要特殊处理,除了这种情况都是else,这时候else部分就不能省略了;
3.有少量几个特殊条件,其他都是同样处理的情况:我们可以写多个if(){}、else if(){},最后带一个else(){}的语句,表示只在这几种条件下特殊处理,除了这多个条件之外的情况都是else。
4.反向成立的情况:如果某条件成立,就执行某动作,这是正常的人类思维。但EA中还会遇到很多反着来的情况,只有一个或几个条件下不执行,其他任何条件下都执行,这时候就把你想要执行的代码放在else的主体花括号里,if和else if的花括号可以直接空着,或者写一句打印信息,也可以写上节说过的“空语句”(但空语句这玩意十分建议永远不用它,这是一个反人性的设计,很容易出错误)。
5.需要点明的是,if()的小括号里面的表达式,它的返回值是一个布尔值,而if语句默认当这个布尔值为真时就执行后面的代码,为假时就不执行。比如你写一个if(price = ma20),想表达当价格等于二十均线时就开单,但系统会得到一个浮点数,就是当前的二十均线的价格数据,在数据类型转换中我们讲过,所有正数在布尔运算中都当真来对待,那你这个开单条件相当于无条件开单了。所以我们得写if(price == ma20),==是比较运算符,意思是判断后面的是否等于前面的,它的运算结果才为“是或否”这样的布尔值。
6.总之,if else条件分支控制语句的精髓就是你把想执行的操作,和它的条件一一对应起来,至于是在if里面,还是在else里面都无所谓。还需要特别注意的一点是,在条件分支控制语句中,不管你写了多少个条件,只要系统走到某一个符合条件那里,就执行该分支代码块,执行完毕后,直接跳出整个if else结构,其他的条件都作废了。
七、?: 条件运算符/三目运算符?:是 MQL5 中唯一的三目运算符,属于真正的运算符范畴,本质是「表达式级别的二选一逻辑」。它实际上是二选一的if-else语句的简写形式,但语法层级不同:if-else是语句,没有返回值;?:是运算符,构成表达式,有明确返回值,可以直接嵌套在其他表达式里,是写简洁条件赋值的核心工具。
基础格式为:条件表达式 ? 表达式 A: 表达式B
?:是两个符号,连接起三个表达式。第一个表达式是条件判断表达式,它只能返回真或假的布尔值;第二个表达式是条件为真时的备选赋值表达式,它的返回值就可以是任何类型的数据;第三个表达式是条件为假时的备选赋值表达式,它的返回值也可以是任何类型的数据。
条件/三目运算符的功能翻译成人话就是:假设条件成立取 A、不成立取 B。
因为条件/三目运算符连接的三个元素都是表达式,而条件/三目运算符连接起来的整体,也是一个表达式,所以条件/三目运算符也存在嵌套结构:
外部条件表达式 ? (内部条件表达式 ? 表达式 a: 表达式b): 表达式B
表达式B也可以是另一个条件/三目运算符连接起来的表达式,甚至表达式A和表达式B都可以是三目运算表达式;第一个表达式,也即是条件表达式也可以是三目运算表达式,但要求该三目运算表达式的返回值必须是布尔值。
当三目运算表达式存在嵌套时,起结合律是右结合,即先算右边的三目运算,再算左边的。为了防止理解错误,可以把子表达式用小括号括起来。
八、switch 多分支选择语句(一)定义:switch 多分支选择语句,属于流程控制语句范畴。它的核心作用是根据一个控制表达式的离散取值,精准跳转到对应的代码分支执行,适合处理枚举、整数、状态码这类固定离散值的多分支判断,相比多层 `else if` 结构更清晰、执行效率更高。
(二)基础语法格式switch(控制表达式)
{
case 常量值1:
分支1执行语句;
break;
case 常量值2:
分支2执行语句;
break;
// 可以有任意多个 case
default
所有case都不匹配时执行的默认语句;
break;
}
(三)基本说明:switch这个单词的意思是开关、转换,case意思是在什么什么情况下,break意思是跳出或中断,与函数中的return功能差不多,default意思是默认,它在功能上与if-else语句属于同类功能,也是在不同条件下选择不同的处理过程。但if-else语句做条件判断的本质是根据小括号里返回的布尔值,是或不是,而switch多分支选择语句做判断是根据如果是条件1就怎样,如果是条件2就怎样,条件3就怎样,其他情况就怎样。所以当一个条件判断只有两个结果,是或者不是,那就用if-else语句,如果一个条件判断会出现好多结果,那就用switch多分支选择语句。当然switch多分支选择语句也可以做二选一的布尔判断,但那属于“杀鸡用牛刀”,浪费了。
(四)执行顺序:
(1)先计算 switch 括号内控制表达式的值;这里需要理解一下,条件判断语句都不是循环语句,系统每次运行时只运行它一次,也只选它其中一个条件执行,但因为EA本身就是循环程序,每次有新报价都会重新运行一次,所以输入参数也是在时刻变化的,所以条件判断语句中的条件,都有出现的机会。
(2)从上到下匹配 case 后的常量值,找到匹配项后,跳转到该 case 标签处开始执行;
(3)一直执行代码,直到遇到 break 语句,或者整个 switch 大括号结束;我们可以看到在示例中,每个case的执行语句(指在该条件下起具体作用的代码)后面都跟着个break; (这里是分号不是冒号),就是用来告诉系统,当前条件的执行语句到此为止,执行到这里就结束整个switch语句。如果漏写了这个break; ,系统会继续运行下去,把下一个case的执行语句也执行了,这叫“case 穿透“,这并不是编程错误,当多个case都执行同一个功能的时候,也会刻意用case 穿透的形式来写代码。但如果相邻case是相互独立没有关系的,那就是灾难了。
(4)如果所有 case 都不匹配,就跳转到 default 分支执行;没有 default 则直接跳出 switch,什么都不做。
(五)核心语法规则
(1)控制表达式的类型限制:switch 只能基于离散、可整数值比较的类型进行判断,也就是它后面小括号里表达式的返回值必须是整数型数据,或者枚举数据、布尔数据,不能是浮点数、字符串、数组或结构体。而if后面的小括号里表达式的返回值必须是布尔值。二者可以联系并区分起来记忆。
(2)case 标签后面必须跟编译器常量,也就是本switch运行期间不能变的数字,且多个case 标签的常量值不能重复。需要注意的是,case 后面跟冒号 :,不能写成分号,这是分支入口的语法标记,不是语句结束。另外需要特别注意的是,我们平时理解的,当什么什么情况下,不一定是常量条件,比如case price > 1.10,想表达当价格超过1.10时怎样怎样,这就属于范围判断,不是常量条件,这样写系统就报错。
(3)default 分支与if语句中的else一样,也可以省略,但不要求必须写在最后,写在最前面或者中间都可以,同样它的执行语句后面也要有break;。
页:
[1]