商品期货量化交易-TradingviewPine语言基础课程(二十四):量化实战:BB-RSI-ADX指标

Author: ianzeng123, Created: 2023-04-13 13:29:47, Updated:

大家好,欢迎大家来到Pine语言商品期货量化最后一节课程,本课程的内容为量化实战之组合指标策略的讲解。如果说一个指标代表衡量趋势的一个维度,使用多个指标则意味着从多个维度,立体捕捉市场的发展趋势。组合指标策略的核心思想是将不同类型、不同特性的指标进行有效的组合,从而达到更准确的市场预测和交易决策。常见的组合指标策略包括趋势型、震荡型和能量型等,具体选用哪种类型要根据市场情况灵活调整。同时,在实际应用中还需要考虑各指标间的权重,以及如何对参数进行优化和调整,从而让策略始终保持优异的表现。

策略介绍

BB-RSI-ADX是一种技术指标组合,用于确定股票或其他交易资产的入场点。BB代表布林带指标(Bollinger Bands),RSI代表相对强弱指标(Relative Strength Index),ADX代表平均趋向指标(Average Directional Index)。这三个指标结合在一起可以提供更全面的市场分析。

img

策略原理

基于Bollinger Bands、RSI和ADX指标的交易策略定义了三个指标的参数和输入条件,根据这些条件确定是否进入多头或者空头。具体来说,该策略使用Bollinger Bands指标来确定价格波动的上下限,使用RSI指标来确定价格是否处于超买或超卖状态,使用ADX指标来确定趋势强度。 具体而言,当BB指标和RSI指标同时发出买入信号,并且ADX指标显示市场正处于强劲的趋势中时,这被认为是一个较好的入场点。通过综合三个指标,我们构建出了一个从多方条件约束开平仓信号的震荡策略,然而不可忽视的是,策略的参数越多,不免会陷入过拟合的风险。并且对于不同类别的品种,参数则需要重新调试,因此这就是使用这类综合指标策略需要注意的地方。

计算方法

  1. 根据布林带公式,计算布林带上限,布林带下限和布林带宽度的百分比B;
  2. 计算RSI值;
  3. 计算ADX值;
  4. 当最低价小于BBI下限,bbr大于进多阈值,rsi处于多头范围,adx大于参数阈值,进行多头开仓;
  5. 当最高价大于BBI上限,bbr小于进空阈值,rsi处于空头范围,adx大于参数阈值,进行空头开仓;

策略源码

//@version=5
indicator(shorttitle="BB-RSI-ADX", title="BB-RSI-ADX Entry Points", overlay=true, timeframe="", timeframe_gaps=true)

// Bollinger Bands Setup
//定义布林带周期的输入变量,并设置最小值、显示标题和所属分组。
bbLength = input.int(9, minval=1, title="BB 周期", group="BB Settings")
//定义数据源的输入变量,并设置显示标题和所属分组。这里使用收盘价作为数据源。
src = input(close, title="数据源", group="BB Settings")
//定义标准差的倍数,并设置最小值、最大值、显示标题和所属分组。
stDev = input.float(2.0, minval=1, maxval=3, title="标准差", group="BB Settings")
//计算布林带的中轨,使用简单移动平均线。
basis = ta.sma(src, bbLength)
//计算布林带的标准差的倍数,使用收盘价作为标准差输入变量,乘以倍数。
dev = stDev * ta.stdev(src, bbLength)
//计算布林带的另一个标准差,使用收盘价和标准差输入变量。这里对标准差倍数进行了一些调整,以使其不小于1。
devMinOne = (stDev > 1 ? stDev - 1 : 1) * ta.stdev(src, bbLength)
//计算上限,中轨加上标准差的倍数
upper = basis + dev
//计算下限,中轨减去标准差的倍数
lower = basis - dev
//计算次上限,中轨加上标准差乘以减一的倍数
upperMinOne = basis + devMinOne
//计算次下限,中轨减去标准差乘以减一的倍数
lowerMinOne = basis - devMinOne

//画出中轨,上限和下限,并使用颜色填充上限和下限
plot(basis, "Basis", color=#FF6D00)
p1 = plot(upper, "BB  Upper", color=#2962FF)
p2 = plot(lower, "BB Lower", color=#2962FF)
fill(p1, p2, title = "BB Background", color=color.rgb(33, 150, 243, 95))

// 利用次上限和次下限,计算布林带宽度的百分比B。
bbr = (src - lowerMinOne)/(upperMinOne - lowerMinOne)

// RSI
//RSI周期数参数
rsiLengthInput = input.int(14, minval=1, title="RSI 周期", group="RSI Settings")
//RSI数据源参数
rsiSourceInput = input.source(close, "数据源", group="RSI Settings")
//计算RSI的上升部分,使用RSI数据源的变化值(差分)和RSI周期输入变量,并使用RMA(指数加权移动平均线)进行平滑。
rsiUp = ta.rma(math.max(ta.change(rsiSourceInput), 0), rsiLengthInput)
//计算RSI的下降部分,使用RSI数据源的变化值和RSI周期输入变量,并使用RMA进行平滑。
rsiDown = ta.rma(-math.min(ta.change(rsiSourceInput), 0), rsiLengthInput)
//计算rsi的值,两个三元表达式
//如果rsiDown == 0,rsi=100
//在rsiDown不等于0的情况下,如果rsiUp == 0,rsi=0
//如果rsidown和rsiup都不等于0,则rsi=100 - (100 / (1 + rsiUp / rsiDown))
rsi = rsiDown == 0 ? 100 : rsiUp == 0 ? 0 : 100 - (100 / (1 + rsiUp / rsiDown))

// ADX
//ADX平滑周期
adxlen = input(14, title="ADX 平滑周期", group="ADX Settings")
//ADX DI 周期
dilen = input(14, title="ADX DI 周期", group="ADX Settings")
//dirmov自定义函数
[_, _, adxStr] = ta.dmi(dilen, adxlen)

// Entry condition inputs
//开多仓的参数阈值
c_enter_long_bbr = input(0, title="最小值 BB %B", group="Enter LONG Conditions", tooltip="The Minimum required BB %B required to enter a LONG position. RECOMMENDED: 0")
c_enter_long_rsi_min = input(30, title="最小 RSI", group="Enter LONG Conditions", tooltip="The Minimum RSI value to enter a LONG position. RECOMMENDED: 30", inline="rsi_long")
c_enter_long_rsi_max = input(50, title="最大 RSI", group="Enter LONG Conditions", tooltip="The Maximum RSI value to enter a LONG position. RECOMMENDED: 50", inline="rsi_long")

//开空仓的参数阈值
c_enter_short_bbr = input(1, title="最大值 BB %B", group="Enter SHORT Conditions", tooltip="The Highest required BB %B required to enter a SHORT position. RECOMMENDED: 1")
c_enter_short_rsi_min = input(50, title="最小 RSI", group="Enter SHORT Conditions", tooltip="The Minimum RSI value to enter a SHORT position. RECOMMENDED: 50", inline="rsi_short")
c_enter_short_rsi_max = input(70, title="最大 RSI", group="Enter SHORT Conditions", tooltip="The Maximum RSI value to enter a SHORT position. RECOMMENDED: 70", inline="rsi_short")

//衡量趋势的强度
c_adx_min_str = input(25, title="ADX 最小力度", group="ADX Settings")

// Enter Long Conditions
enter_long = (low < lower) and (bbr > c_enter_long_bbr) and (rsi > c_enter_long_rsi_min) and (rsi < c_enter_long_rsi_max) and (adxStr > c_adx_min_str)  ? 1 : 0
// Enter Short Conditions
enter_short = (high > upper) and (bbr < c_enter_short_bbr) and (rsi > c_enter_short_rsi_min) and (rsi < c_enter_short_rsi_max) and (adxStr > c_adx_min_str)  ? -1 : 0


if enter_long
    strategy.entry("Enter Long", strategy.long)
else if enter_short
    strategy.entry("Enter Short", strategy.short)

策略评价

  • 优点: 多重指标确认:该策略综合了多个指标,可以减少单一指标造成的误判,提高交易准确性; 应用范围广:适用于不同市场和不同品种的交易; 策略灵活调整:可根据实际市场情况进行参数调整。

  • 缺点: 参数需要多次调整; 过拟合风险。

Pine语言的量化课程到目前为止就全部结束了,很感谢大家这段时间的陪伴。我们后续会推出更多的有关金融量化的课程,也很感谢大家对于发明者平台的关注,我们有缘再见!


更多内容