保持敬畏之心
交易是一场持久战

MQL4(37):利用技术指标创建交易信号

技术指标

绝大多数交易系统都会利用各种技术指标来辅助判断市场状况和产生交易信号,MetaTrader 平台内置了超过 20 种常见的技术指标,例如:

  • 移动平均线 (MA)
  • 平滑异同移动平均线 (MACD)
  • 相对强弱指数 (RSI)
  • 随机震荡指标

MQL4为这些平台内置指标都提供了相应的内置函数来进行调用和获取指标值(例如 iMA(), iMACD(), iRSI(), iStochastic() 等)。此外,您也可以在 EA 中调用和使用自定义指标 (即用户自己编写或从他处获得的 .ex4/.ex5 指标文件)。

趋势类指标

让我们详细了解一下本书中一直在使用的指标:移动平均线 (MA)。移动平均线是一种经典的趋势类指标,它能够帮助我们判断在设定的指标周期内,价格的总体运行方向是上涨还是下跌。在图表上,移动平均线通常表现为一条平滑的曲线,代表了过去特定数量(例如 x 根)K 线的平均价格。

iMA() 函数详解

在 MQL 中,我们可以通过内置函数 iMA() 来获取移动平均线的值。其完整语法如下:

double iMA(
   string symbol,      // 品种名称
   int    timeframe,   // 时间周期
   int    ma_period,   // MA 周期 (例如 10, 20)
   int    ma_shift,    // MA 线的【视觉】水平位移 (0表示不位移)
   int    ma_method,   // MA 计算方法 (例如 MODE_SMA, MODE_EMA)
   int    applied_price, // 应用的价格类型 (例如 PRICE_CLOSE, PRICE_OPEN)
   int    shift        // 要获取【哪根K线】的MA值 (0为当前K线, 1为前一根)
);

参数说明:

  • symbol: string 类型,指定要在哪个交易品种的图表上计算移动平均线。例如 "EURUSD"。若为 NULLSymbol(),则表示当前 EA 运行的图表品种。

  • timeframe: int 类型,指定计算 MA 所依据的图表时间周期。例如 PERIOD_H1 (1小时周期), PERIOD_D1 (日线周期)。若为 0,则表示当前 EA 运行的图表周期。

  • ma_period: int 类型,移动平均线的计算周期(或称回顾期、窗口大小)。这是计算平均价格时所包含的 K 线数量。例如,ma_period 设为 10,表示计算的是过去 10 根 K 线的平均价格。

  • ma_shift: int 类型,移动平均线的【视觉上的】水平位移(或称指标线位移、画线偏移)。这个参数控制 MA 线在图表上相对于其计算的 K 线向前(正值)或向后(负值)平移多少根K线进行显示。请注意,这与下面最后一个shift 参数(数据获取位移)的含义完全不同。 ma_shift 主要用于视觉调整,不改变 MA 值的计算本身对应哪根 K 线。

  • ma_method: int 类型,移动平均线的计算方法。MQL 提供了多种计算方式,常用的有:

    • MODE_SMA (0): 简单移动平均线 (Simple Moving Average)
    • MODE_EMA (1): 指数移动平均线 (Exponential Moving Average)
    • MODE_SMMA (2): 平滑移动平均线 (Smoothed Moving Average)
    • MODE_LWMA (3): 线性加权移动平均线 (Linear Weighted Moving Average)
  • applied_price: int 类型,指定计算移动平均线时所应用的价格类型。即,是对每根 K 线的哪个价格点进行平均。常用的应用价格常量包括:

    • PRICE_CLOSE (0): 收盘价
    • PRICE_OPEN (1): 开盘价
    • PRICE_HIGH (2): 最高价
    • PRICE_LOW (3): 最低价
    • PRICE_MEDIAN (4): (最高价 + 最低价) / 2 (中间价)
    • PRICE_TYPICAL (5): (最高价 + 最低价 + 收盘价) / 3 (典型价格)
    • PRICE_WEIGHTED (6): (最高价 + 最低价 + 收盘价 + 收盘价) / 4 (加权收盘价)
  • shift: int 类型,指定要获取哪一根 K 线上计算出的移动平均线的值。这是一个数据获取的向后位移索引。

    • 0: 表示获取当前 K 线(正在形成的 K 线)上的 MA 值。这个值会随着当前 K 线价格的变动而实时变化。
    • 1: 表示获取前一根已完成的 K 线上的 MA 值。
    • 3: 表示获取从当前算起倒数第 3 根(即 3 根 K 线前)的 MA 值。
    • 这个 shift 参数是 MQL4 中几乎所有技术指标函数的最后一个参数,用于指定您想获取的是历史上哪一根 K 线的指标计算结果。

利用移动平均线创建交易条件

移动平均线以及其他类似的趋势跟踪指标,通常会直接绘制在主图表上。我们可以基于这些指标线与价格本身,或者指标线之间的相互关系来构建交易条件。

  • 示例 1:指标间关系 (MA 交叉) 我们本书中一直使用的移动平均线交叉系统就是一个很好的例子。当短期 MA 线(例如快线)的价格值上穿或下穿长期 MA 线(例如慢线)的价格值时,就产生买入或卖出信号。

  • 示例 2:价格与指标线关系 (价格突破) 另一种常见的用法是当当前市场价格向上突破或向下跌破某条指标线时产生交易信号。例如,著名的布林带 (Bollinger Bands) 指标就可以根据当前价格相对于其上轨和下轨的位置来生成交易信号(例如,价格触及或突破布林带边缘可能预示着趋势的延续或反转的可能)。

震荡类指标

除了趋势类指标外,另一大类常用的技术指标是震荡类指标。与趋势指标通常叠加在主价格图表上不同,震荡指标一般绘制在图表下方的独立子窗口中。顾名思义,它们的值在某个预设的上限和下限(或围绕一个中心值)之间来回“震荡”或摆动。

  • 有些震荡指标围绕一个中性轴(通常是0值)上下波动,例如动量指标 (Momentum)。
  • 另一些则在一个固定的取值区间内波动,例如 0 到 100 之间(如随机指标 Stochastics, 相对强弱指数 RSI)。
  • 震荡指标最常用于识别市场的超买和超卖状态。
  • 尽管它们有时也能提供趋势方面的信息,但其更主要的应用场景是帮助交易者定位市场潜在的反转区域,从而产生反趋势的交易信号。

iStochastic() 函数详解

在MQL4中,我们可以通过内置函数 iStochastic() 来获取随机指标的 %K 线和 %D 线的值。其完整语法如下:

double iStochastic(
   string symbol,        // 品种名称 ( "EURUSD", NULL for current)
   int    timeframe,     // 时间周期 ( PERIOD_H1, 0 for current)
   int    Kperiod,       // %K 线的计算周期
   int    Dperiod,       // %D 线的计算周期 (通常是 %K 线的 MA 周期)
   int    slowing,       // 平滑参数 (用于 %K 线内部平滑,1 为快速随机)
   int    ma_method,     // 计算 %D 线时采用的 MA 方法 (MODE_SMA)
   int    price_field,   // 价格选择 (0: Low/High, 1: Close/Close)
   int    mode,          // 要获取的线 (MODE_MAIN for %K, MODE_SIGNAL for %D)
   int    shift          // K线柱位移 (0为当前K线, 1为前一根)
);

参数说明:

  • symbol, timeframe: 与 iMA() 中的含义相同,用于指定数据源。
  • 特定指标参数:
    • Kperiod: int 类型,计算 %K 线所回顾的 K 线数量。
    • Dperiod: int 类型,计算 %D 线(作为 %K 线的移动平均)时所用的周期。
    • slowing: int 类型,平滑参数。该值用于对 %K 线进行内部平滑处理。值越大,随机指标线条越平滑(慢速随机指标);值较小(例如常用的 1)则线条更灵敏(快速随机指标)。
    • ma_method: int 类型,计算 %D 线时所采用的移动平均方法(与 iMA() 函数中的 ma_method 参数含义和可选值相同,如 MODE_SMA, MODE_EMA 等)。
    • price_field: int 类型,决定 %K 线计算时所使用的价格数据来源:
      • 0 (或预定义常量 STO_LOWHIGH): 基于近期K线的最高价(High)和最低价(Low)范围进行计算。
      • 1 (或预定义常量 STO_CLOSECLOSE): 基于近期K线的收盘价(Close)范围进行计算。
    • mode: int 类型,指定您想获取的是随机指标的哪条线的值。这里务必注意:
      • 使用 0 (或者更推荐使用预定义常量 MODE_MAIN) 来获取主线 (%K 线) 的值。
      • 使用 1 (或者更推荐使用预定义常量 MODE_SIGNAL) 来获取信号线 (%D 线) 的值。
  • shift: int 类型,与 iMA() 中的 shift 含义相同,指定获取的是哪一根 K 线(相对于当前 K 线向后位移多少根)上的指标值。

关于 mode 参数的进一步说明:

很多技术指标(如随机指标、MACD、ADX 等)在图表上会同时显示多条不同的数据线。当您调用这类指标的 MQL 函数时,通常需要通过 mode 参数来明确指明您具体想获取的是哪一条线的数据。

对于随机指标,由于它有 %K 线和 %D 线两条主要数据线,您需要分别调用两次 iStochastic() 函数,通过改变 mode 参数来获取这两条线各自的值:

// 假设 KPeriod_val, DPeriod_val, Slowing_val, MAMethod_val, PriceField_val 是已定义的参数变量
double K_Line_Value = iStochastic(NULL, 0, KPeriod_val, DPeriod_val, Slowing_val,
                                  MAMethod_val, PriceField_val, MODE_MAIN, 0); // 获取当前K线的 %K 值

double D_Line_Value = iStochastic(NULL, 0, KPeriod_val, DPeriod_val, Slowing_val,
                                  MAMethod_val, PriceField_val, MODE_SIGNAL, 0); // 获取当前K线的 %D 值
  • 重点: 获取 %K 线时,mode 参数使用 MODE_MAIN (其整数值为 0);获取 %D 线时,使用 MODE_SIGNAL (其整数值为 1)。MQL4官方参考文档中的“标准常量 – 指标线 (Standard Constants – Indicator Lines)”部分列出了各种多线指标的 mode 参数对应的有效常量和整数值。

利用随机指标构建交易条件:

  1. 基于超买超卖水平:

    • 例如,当 %K 线从下方上穿 30(超卖线)时,可能被视为一个潜在的买入信号。
    • 当 %K 线从上方下穿 70(超买线)时,可能被视为一个潜在的卖出信号。
    • if(KLine < 70) —— 这个条件本身表示“如果 K 线值小于 70 (即随机指标不在超买区)”,常用于过滤掉处于超买状态时的买入信号,或者作为趋势延续的确认条件之一。
  2. 基于双线交叉:

    • 例如,当 %K 线上穿 %D 线(金叉)时,可视为买入信号。
    • 当 %K 线下穿 %D 线(死叉)时,可视为卖出信号。
    • if(KLine > DLine) —— 表示“如果 %K 线的值大于 %D 线的值”,这是一个典型的金叉看涨条件。

所有 MQL4内置技术指标函数的详细用法和参数说明,可以在 MQL4官方参考文档的“技术指标”部分找到。如果您想更深入地了解特定指标的计算原理、市场含义或具体交易应用策略,可以访问 MQL4官方网站的技术分析专区。

赞(0)
未经允许不得转载:图道交易 » MQL4(37):利用技术指标创建交易信号
分享到