最后由 麻爪 于 2026-10-13 12:53 编辑
九、while 当型循环语句
(一)while 当型循环语句,属于流程控制语句范畴。核心逻辑是先判断循环条件,条件成立才执行循环体,循环往复直到条件不成立就终止。它适合循环次数不固定、仅通过终止条件控制的场景,是 MQL5 中遍历数据、条件查找的核心工具之一。
(二)其基础语法格式为:
while(循环条件表达式){ 循环体语句;}
(三)代码执行顺序
1. 首次判断:计算括号内的条件表达式,自动转换为布尔值;2. 条件为真:完整执行循环体内的所有代码; 3. 再次判断:循环体执行完毕,自动跳回条件判断处,重新计算条件; 4. 条件为假:直接跳出整个 while 循环,执行循环后续的代码。
(四)条件表达式规则和 `if` 语句的条件要求完全一致:
1.不强制必须是 `bool` 类型,但会被强制当作布尔值处理,所以任何能隐式转换为布尔值的表达式都合法; 2.整数规则:`0` 为假,非 0 为真;浮点数同理; 3.支持关系表达式、逻辑表达式、函数调用、变量等任意合法表达式。
(五)循环体格式:
1.如果循环体只有1条代码(即一句由分号;结束的代码),可以不用花括号{}包起来,但为了避免错误,强烈建议即使只有1条代码,也写上花括号; 2.如果循环体里有多条代码(即多句由分号;结束的代码),必须用花括号{}包起来。
(六) 必须有可到达的出口:循环体内必须存在能改变循环条件的操作(如循环变量更新、`break` 语句、状态变更等),否则条件永远为真会形成**死循环**,直接导致 EA / 指标卡死、交易终端无响应,属于 MQL5 开发的严重 bug。
(七)循环变量的作用域:while 的循环变量通常在循环外部定义,因此循环结束后变量依然可用—— 这是它和 for 循环的显著区别,非常适合 “查找目标位置并保留索引” 的场景。
(八)在 while 循环体内,可通过两个语句精细控制执行流程: - break:立即终止并跳出整个 while 循环,直接执行循环后续代码,常用于 “找到目标后提前结束遍历”。
2. continue:跳过本次循环剩余的代码,直接跳回条件判断处,开始下一轮循环,常用于 “跳过不符合条件的项”。
(九)原手册中的`IsStopped()` 是 MQL5 内置的系统函数,作用是检测交易终端是否向当前程序(EA / 指标 / 脚本)发出了「停止运行」的指令。它是给程序开了一个「用户停止信号」的检测入口,让长时间运行的代码可以主动响应停止操作,而不是完全无视用户的终止意愿。如果要循环几万、几十万次甚至更多的迭代(比如遍历全品种全部历史 K 线、批量计算指标、大数据回测、批量统计),循环可能持续几秒、几分钟甚至更久,这时候用户想停止循环,或者系统卡死了,用户还以为循环在继续。加了`IsStopped()`之后,系统每次循环之前,都会检查用户是否执行了“终止操作”,比如溢出了EA,关闭了自动交易,等等。
十、for计数型循环语句
(一)`for` 计数型循环语句,属于流程控制语句范畴。它最大的特点是将循环变量初始化、循环条件判断、循环变量增量三部分集中写在头部,结构规整清晰,专门适合循环次数明确、按索引遍历场景(比如遍历 K 线、数组、指标缓冲区),是 EA 策略开发中使用频率最高的循环结构。
(二)其标准语法格式为: for(初始化表达式; 条件表达式; 增量表达式){ 循环体语句;}
三个表达式用分号分隔,位置固定不能调换;分号是语法必须的,即使省略表达式也不能省略分号。因为初始化表达式可以写在for循环前面,条件表达式可以默认为真,增量表达式可以写在for循环的主体内部,这三者都可以单独省略,甚至也可以三个表达式都不写,相当于无条件、无限制循环。但分号属于for循环的固定格式要求,少些一个,系统就会报错。
(三)语句执行顺序 1. 执行初始化(仅 1 次):循环开始前,只执行一次初始化表达式,通常用于声明并赋值循环变量; 2. 判断循环条件:计算条件表达式,结果为真则进入循环体,为假则直接跳出循环; 3. 执行循环体:完整执行大括号内的所有代码; 4. 执行增量表达式:循环体执行完后,自动执行增量表达式,更新循环变量,需要注意,它虽然写在主循环体之前,但却是在循环体之后才执行; 5. 回到条件判断:增量执行完毕,跳回第 2 步,重新判断条件,进入下一轮循环。
(四)初始化表达式: 1.可以声明循环变量(MQL5 支持 C++ 风格的局部声明),比如 `int i = 0`,这个变量的作用域仅限循环内部,循环外无法访问;可以类比函数函数定义时,也可以直接用变量声名来定义函数的参数;这种情况下,该变量仅在for循环或者函数内部有效,也就是所谓的“局部声明”;2.可以同时声明多个同类型变量,用逗号分隔:`int i = 0, sum = 0`;因为循环条件可能不止用一个变量来表达,也可能会有多个循环条件来做布尔运算,故for循环也允许多个”参数“;同时也可以省略不写,使用外部已经定义好的变量。
(五)条件表达式: 和 `if`、`while` 规则完全一致:只要能隐式转换为布尔值即可,支持关系、逻辑、函数调用等任意表达式;条件表达式可以省略:默认条件恒为真,变成无限循环。
(六)增量表达式: 1. 不局限于 `i++`(每次循环加1),可以是任意更新操作,比如 `i += 2`(每次循环加2)、`i--`(每次循环减1)、`i *= 2` (每次循环乘2)等; 2.可以用逗号分隔多个增量操作; 3. 也可以省略不写,在循环体内手动更新变量
(七)循环体格式: 和 while、if 语句规则完全一致:如果循环体只有1条代码(即一句由分号;结束的代码),可以不用花括号{}包起来,但为了避免错误,强烈建议即使只有1条代码,也写上花括号;
(八)循环控制:break 与 continue和 while 循环完全一致,`break` 和 `continue` 都可以在 for 循环中使用,执行效果略有差异: 1.break:立即跳出整个 for 循环,不再执行增量和后续判断,直接执行循环后续代码。 2.continue:跳过本次循环剩余代码,**直接跳去执行增量表达式**,然后再进行下一轮条件判断。 3.和 while 的细微区别:while 中 continue 是直接跳回条件判断;for 中 continue 会先执行增量,再判断条件。
(九)关于循环变量i:用i做for循环的变量参数是一种默认写法,你也可以改成别的变量。
十一、do-while直到型循环语句
(一)do-while直到型循环语句,属于流程控制语句范畴。它的核心逻辑是先执行一次循环体,再判断循环条件:条件成立则继续循环,条件不成立则立即退出。 它最鲜明的特性是:循环体至少会执行一次,这是它与 while 循环最本质的区别,非常适合需要先执行一次操作、再判断是否重试的场景。
(二)其标准语法格式为: do{ 循环体语句;} while(循环条件表达式);
末尾 `while(条件)` 后面必须加分号 `;`,这是 do-while 语句的结束标记,是语法强制要求,省略会直接编译报错。 其他语法规则与for、while循环基本一致。
(三)语句执行顺序 1. 直接执行循环体:不做任何判断,先完整执行一次大括号内的循环体代码; 2.判断循环条件:循环体执行完毕后,计算 `while` 括号内的条件表达式; 3. 条件为真:跳回循环体开头,再次执行循环体; 4. 条件为假:结束整个 do-while 循环,执行后续代码。先执行,后判断:哪怕第一次判断条件就不成立,循环体也已经执行过一次了。
(四) 循环选型总结 1. 次数明确、按索引遍历数组 / K 线 → 用 `for` 2. 循环次数不固定、可能一次都不执行的查找 / 遍历 → 用 `while` 3. 需要至少执行一次的重试、校验、初始化场景 → 用 `do-while` |