函数参数

double iMA(
   string       symbol,           // 交易品种
   int          timeframe,        // 时间周期
   int          ma_period,        // 平均周期
   int          ma_shift,         // 平移
   int          ma_method,        // 平均方法
   int          applied_price,    // 应用价格
   int          shift             // 位移
);

1. symbol(交易品种)

  • 用途:指定计算移动平均线的金融产品。

  • 取值

    • NULL"":使用当前图表的产品(如当前打开的EURUSD图表)。

    • 明确指定产品名(如 "GBPUSD"):跨品种分析。

  • 示例

    iMA("EURUSD", 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0); // 计算EURUSD的移动平均

2. timeframe(时间周期)

  • 用途:选择K线的时间框架。

  • 取值
    使用预定义枚举值(如 PERIOD_M1, PERIOD_H4, PERIOD_D1)或直接输入分钟数:

    • 0:当前图表周期。

    • 1(M1)、5(M5)、60(H1)、1440(D1)等。

  • 示例

    iMA(NULL, PERIOD_H1, 20, 0, MODE_SMA, PRICE_CLOSE, 0); // 使用H1周期

3. ma_period(平均周期)

  • 用途:定义计算移动平均的周期长度。

  • 取值:正整数(≥1),常用值如20(20日均线)、50、200。

  • 注意:周期过短易受噪音干扰,过长则滞后明显。

  • 示例

    iMA(NULL, 0, 50, 0, MODE_EMA, PRICE_CLOSE, 0); // 50周期EMA

4. ma_shift(平移)

  • 用途:将移动平均线向右平移指定周期数,用于技术分析中的“前瞻”或调整信号位置。

  • 取值:非负整数(通常0或小整数)。

  • 示例

    iMA(NULL, 0, 20, 2, MODE_SMA, PRICE_CLOSE, 0); // 右移2周期,延迟信号

5. ma_method(平均方法)

  • 用途:选择移动平均的计算方法。

  • 取值:预定义枚举值:

    • MODE_SMA(简单移动平均)

    • MODE_EMA(指数移动平均)

    • MODE_SMMA(平滑移动平均)

    • MODE_LWMA(线性加权移动平均)

  • 示例

    iMA(NULL, 0, 20, 0, MODE_EMA, PRICE_CLOSE, 0); // 使用EMA

6. applied_price(应用价格)

  • 用途:指定计算移动平均的基础价格类型。

  • 取值:预定义枚举值:

    • PRICE_CLOSE(收盘价,最常用)

    • PRICE_OPEN(开盘价)

    • PRICE_HIGH(最高价)

    • PRICE_LOW(最低价)

    • PRICE_MEDIAN(中间价,(高+低)/2)

    • PRICE_TYPICAL(典型价,(高+低+收)/3)

    • PRICE_WEIGHTED(加权收盘价,(高+低+2×收)/4)

  • 示例

    iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_TYPICAL, 0); // 基于典型价计算

7. shift(位移)

  • 用途:获取历史K线的移动平均值。

  • 取值:非负整数:

    • 0:最新一根K线的值。

    • 1:前一根K线的值,依此类推。

  • 示例

    double ma_prev = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 1); // 前一根K线的MA值

完整示例:绘制20周期SMA

// 在OnCalculate函数中调用:
int start = rates_total - prev_calculated;
for(int i = start; i >= 0; i--) {
    double ma_value = iMA(
        NULL,               // 当前品种
        0,                  // 当前时间周期
        20,                 // 20周期
        0,                  // 不平移
        MODE_SMA,           // 简单移动平均
        PRICE_CLOSE,        // 基于收盘价
        i                   // 从最新K线开始倒推
    );
    Buffer[i] = ma_value;   // 存储到指标缓冲区
}

常见问题与调试

  1. 返回值无效(如02147483647

    • 检查symbol是否正确(区分大小写)。

    • 确认timeframema_period是否有效(如周期≥1)。

  2. 信号滞后

    • 减少ma_period或改用MODE_EMA提升灵敏度。

  3. 跨品种数据缺失

    • 确保目标品种已添加到“市场观察”窗口。