从基础到中级:BREAK 和 CONTINUE 语句·综合运用
📘

从基础到中级:BREAK 和 CONTINUE 语句·综合运用

第 3/3 篇

◍ while 循环里 continue 与 return 的真实走向

这段脚本把 MT5 里 while 循环的控制流拆得很直白:初始 info 为 char 类型、赋值 10,进循环前先打印一次 Info(10)。 循环条件 (((info = info - 3) > 0) && (!TerminalInfoInteger(TERMINAL_KEYSTATE_ESCAPE)) && (!IsStopped())) 每次先把 info 减 3 再判正,同时监听 ESC 键与脚本停止信号;任意一条不满足就退出循环。 循环体内若 info 非零就 continue,意味着 10→7→4 这三轮只减不打印;当 info 减到 1 再减 3 得 -2 时,info 为假不走 continue,执行 info = info - 3 得 -5 并打印 Info(-5),随后因 info < -5 不成立继续循环;下一轮 info 变 -8 打印 Info(-8),满足 info < -5 直接 return。 实测在 MT5 策略测试器跑这段,终端会输出 Info(10)、Info(-5)、Info(-8)、Info(-8)(return 前最后一行打印),外汇与贵金属脚本测试均属高风险验证,结果仅反映控制流而非收益。 别把 continue 当跳过全部 很多人以为 continue 会连后面的 return 判断一起跳,其实它只结束本轮;info 降到 0 以下那轮照样跑完赋值与打印,逻辑断点要看清再抄。

MQL5 / C++
class="type">void OnStart(class="type">void)
{
   Print(__FUNCTION__, " ", __LINE__, " It will be executed anyway...");

   Procedure_Loop();

   Print(__FUNCTION__, " ", __LINE__, " It will be executed anyway...");
}
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">void Procedure_Loop(class="type">void)
{
   class="type">char info = class="num">10;

   Print(__FUNCTION__, "  ", __LINE__, " : Info(", info, ")");
   
   class="kw">while (((info = info - class="num">3) > class="num">0) && (!TerminalInfoInteger(TERMINAL_KEYSTATE_ESCAPE)) && (!IsStopped()))
   {
      if (info) class="kw">continue;

      info = info - class="num">3;
         
      Print(__FUNCTION__, "  ", __LINE__, " : Info(", info, ")");

      if (info < -class="num">5) class="kw">return;
   }
   Print(__FUNCTION__, "  ", __LINE__, " : Info(", info, ")");
}

「do-while 里的 continue 跳过逻辑」

这段脚本演示了 MQL5 中 do-while 配合 continue 的实际执行顺序。OnStart 先打印两句“无论如何都会执行”,中间调用 Procedure_Loop,循环体里每次 Sleep(500) 并自增 counter。 关键点在第 26 行:当 info 非零时直接 continue,导致第 28 行打印 info 的语句被跳过。初始 info=10,每次循环减去 2,条件 (info=info-2)>0 成立时继续,因此循环会走 4 次(info 变为 8、6、4、2),第 5 次 info=0 时不满足而退出。 打开 MT5 新建脚本粘入下方代码,跑完看日志:counter 会从 1 累到 4,而循环内的 Info 打印只出现在首次(第 18 行)和末次退出后(第 32 行),中间 4 次都被 continue 吞掉。外汇与贵金属品种上做这类流程验证时注意实盘高风险,仅建议用策略测试器或 demo 账户。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class="macro">#class="kw">property copyright "Daniel Jose"
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">void OnStart(class="type">void)
{
   Print(__FUNCTION__, " ", __LINE__, " It will be executed anyway...");

   Procedure_Loop();

   Print(__FUNCTION__, " ", __LINE__, " It will be executed anyway...");
}
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">void Procedure_Loop(class="type">void)
{
   class="type">char info = class="num">10;
   class="type">ulong counter = class="num">0;

   Print(__FUNCTION__, "  ", __LINE__, " : Info(", info, ")");
   
   do
   {
      Sleep(class="num">500);

      Print(__FUNCTION__, "  ", __LINE__, " : Counter(", counter = counter + class="num">1, ")");

      if (info) class="kw">continue;
      
      Print(__FUNCTION__, "  ", __LINE__, " : Info(", info, ")");

   }class="kw">while ((info = info - class="num">2) > class="num">0);

   Print(__FUNCTION__, "  ", __LINE__, " : Info(", info, ")");
}
class=class="str">"cmt">//+------------------------------------------------------------------+

把三个跳转命令吃透再往前走

RETURN、BREAK、CONTINUE 在 WHILE 与 DO WHILE 里的流转逻辑,换到 FOR 循环同样成立,只是计数器位置不同。原文附带的 Anexo.zip 只有 2.72 KB,里面是可直接在 MT5 里编译跑起来的最小示例,建议逐行改条件看执行路径怎么变。 外汇与贵金属杠杆高、滑点随机,自动化脚本里若跳转逻辑写错,可能让订单在异常分支里重复触发。开 MT5 把示例载进去,故意把 CONTINUE 换成 BREAK,对比日志里循环次数的差异,比看十遍文字都实在。 下一篇会进更绕的嵌套结构,这一节的基础不牢后面就跟不上。现在就把那三个命令在单循环里的出口行为摸清楚,就够了。

常见问题

不会。continue 会立刻跳过本次循环剩余代码,直接回到循环条件判断;若条件仍为真则进入下一轮,否则退出循环。
不会。do-while 的 continue 只跳过循环体剩余部分,仍会执行 while 后的条件判断,再决定是否继续下一轮。
可以。把代码贴给小布,它能标出跳转语句导致的逻辑断点,并提示哪些循环可能提前退出或死循环。
差很多。循环中的 return 会直接结束整个函数,后续循环和函数代码全不执行;末尾 return 只正常退出函数。
记住 break 是彻底跳出当前循环,continue 是只跳过本次。写前先用注释写明意图,再补语句更稳。