Skip to content

控制结构

在MQL5中,控制结构用于控制程序执行流程,实现条件判断和循环操作。掌握这些结构是编写复杂EA策略的关键。以下是高频使用的控制语句:

一、条件判断:if/else

通过布尔条件决定代码块是否执行,分为单条件判断、双分支判断和多分支判断。

1. 单条件判断(if

  • 语法
    cpp
    if (条件表达式)  
    {  
        // 条件为真时执行的代码块  
    }
  • 示例(判断VIP等级):
    cpp
    input int VIP_Level = 0;  // 输入变量:VIP等级(0=黑铁,10=王者)  
    
    void OnTick()  
    {  
        if (VIP_Level <= 1)  // 黑铁/青铜用户  
        {  
            Print("尊贵的黑铁用户,欢迎使用本EA!");  
        }  
    }

2. 双分支判断(if else

  • 语法
    cpp
    if (条件表达式)  
    {  
        // 条件为真时执行  
    }  
    else  
    {  
        // 条件为假时执行  
    }
  • 示例(基础权限提示):
    cpp
    if (VIP_Level <= 1)  
    {  
        Print("黑铁用户:仅开放基础策略");  
    }  
    else  
    {  
        Print("欢迎使用本EA,当前权限已解锁高级功能");  
    }

3. 多分支判断(if else if else

  • 语法
    cpp
    if (条件1) { ... }  
    else if (条件2) { ... }  
    else { ... }  // 所有条件不满足时执行
  • 示例(多重VIP等级判断):
    cpp
    if (VIP_Level <= 1)  
    {  
        Print("黑铁用户:仅支持1种策略");  
    }  
    else if (VIP_Level >= 10)  
    {  
        Print("王者用户:解锁全部10种策略");  
    }  
    else  
    {  
        Print("普通用户:支持3种基础策略");  
    }

执行逻辑

  • 按顺序判断条件,执行首个为真的代码块,后续条件不再检查。
  • 条件表达式需返回布尔值(true/false)。

二、循环结构:重复执行代码块

通过循环结构避免重复编写相似代码,分为for循环和while循环。

1. for循环(已知次数循环)

  • 语法

    cpp
    for (初始化表达式; 条件表达式; 更新表达式)  
    {  
        // 循环体  
    }
  • 三要素

    1. 初始化:定义循环变量(如int i = 0;)。
    2. 条件判断:决定是否继续循环(如i < 200;)。
    3. 更新表达式:修改循环变量(如i++;)。
  • 示例(计算200根K线开盘价平均值):

    cpp
    void CalculateAverage()  
    {  
        double sum = 0;  
        for (int i = 0; i < 200; i++)  // 循环200次(i从0到199)  
        {  
            double openPrice = iOpen(_Symbol, PERIOD_CURRENT, i);  // 获取第i根K线开盘价  
            sum += openPrice;  // 累加  
        }  
        double average = sum / 200;  
        Print("200根K线开盘价平均值:", average);  
    }

2. while循环(未知次数循环)

  • 语法
    cpp
    while (条件表达式)  
    {  
        // 循环体(条件为真时重复执行)  
        更新表达式;  // 避免死循环!  
    }
  • 示例(累加1到999):
    cpp
    void Sum1To999()  
    {  
        int i = 1, total = 0;  
        while (i <= 999)  
        {  
            total += i;  
            i++;  // 必须更新循环变量,否则死循环  
        }  
        Print("1-999累加和:", total);  // 输出499500  
    }

适用场景

  • for循环:已知循环次数(如固定根数的K线处理)。
  • while循环:未知次数,依赖条件终止(如订单成交前持续查询状态)。

三、循环控制:breakcontinue

1. break:跳出整个循环

  • 作用:强制终止当前循环,执行循环后的代码。
  • 示例(提前终止循环):
    cpp
    for (int i = 1; i <= 200; i++)  
    {  
        if (i > 10) break;  // 仅执行前10次循环  
        Print("当前循环次数:", i);  
    }

2. continue:跳过本次循环

  • 作用:跳过当前循环的剩余代码,直接进入下一次循环。
  • 示例(跳过第10次循环):
    cpp
    for (int i = 1; i <= 200; i++)  
    {  
        if (i == 10) continue;  // 不处理第10次循环  
        Print("处理循环次数:", i);  
    }

四、实战注意事项

  1. 避免死循环

    • while循环必须包含更新表达式,确保条件最终为false
    • 复杂循环中添加break作为异常退出机制(如超时处理)。
  2. 条件判断优化

    • 多条件判断时,将高频满足的条件放在前面,提升效率。
    • 避免冗余判断(如if (a > 0) else if (a <= 0)可简化为if (a > 0))。
  3. 循环性能

    • 减少循环体内的复杂计算,优先在循环外预处理数据。
    • 大次数循环(如10万次以上)考虑分块处理,避免阻塞主线程。