多时间框架RSI与随机指标策略

Author: ChaoZhang, Date: 2024-02-21 15:56:37
Tags:

多时间框架RSI与随机指标策略

概述

多时间框架RSI与随机指标策略是一个利用RSI和随机指标的组合指标在多时间框架判断市场超买超卖的策略。该策略同时结合4个时间框架的RSI和随机指标,利用其平均值来判断整体市场走势和超买超卖情况,以发挥各个时间框架指标的优势。

策略原理

1. RSI指标

RSI指标是一种强大的超买超卖指标,它基于一定时间内股票的涨跌幅度来计算。RSI值在0到100之间波动,一般来说,RSI大于70表示超买,小于30表示超卖。

本策略使用长度为14的RSI指标,并获取1个月、1日、4小时和1小时4个时间框架的RSI值。

2. 随机指标%K

随机指标%K是显示市场是超买还是超卖区间的指标,值在0到100之间波动。一般来说,随机指标大于80表示超买,小于20表示超卖。

本策略中,随机指标%K的长度为14,平滑为3,同样获取上述4个时间框架的值。

3. 平均值组合

策略的关键在于计算上述两个指标在4个时间框架的平均值,以发挥各个时间框架的优势,判断整体市场走势。具体计算公式如下:

RSI平均值 = (RSI月线 + RSI日线 + RSI4小时 + RSI1小时) / 4

随机指标平均值 = (随机指标月线 + 随机指标日线 + 随机指标4小时 + 随机指标1小时) / 4

4. 交易信号

当RSI平均值小于30并且随机指标平均值小于20时,做多;当RSI平均值大于70并且随机指标平均值大于80时,做空。

做多后,在随机指标平均值大于70并且RSI平均值大于50时平仓;做空后,在随机指标平均值小于30并且RSI平均值小于50时平仓。

优势分析

该策略最大的优势在于同时结合两个指标和多个时间框架,这可以大大提高交易信号的可靠性,并最大程度避免假信号。具体优势如下:

  1. RSI指标和随机指标互为验证。仅仅依靠单一指标容易产生假信号,而本策略通过组合两个指标,能够提高信号的准确性。

  2. 多时间框架分析能够提高判断的准确性。例如,月线和日线显示超买,但4小时和1小时并未完全超买,这说明趋势可能继续。如果所有时间框架一致,则信号更加可靠。

  3. 更清楚判断结构性转折点。在多个时间框架上同步看到关键Support/Resistance的突破,可以判断目前趋势发生转折。

  4. 自动计算指标平均值简化操作。不需要手工计算,代码自动完成数据提取、指标计算和求平均,降低工作量。

风险分析

该策略的主要风险在于像所有技术分析策略一样,无法完全避免被套和产生假信号的概率。主要风险有:

  1. 趋势短期反转导致被套。例如多头持仓期间,价格短线向下突破支撑位后再次反弹回升。这时根据策略的平仓逻辑需要立即止损,但有可能造成短期损失。

  2. 关键支撑/阻力位失守导致追踪止损失败。如果关键的支撑或阻力位发生失守,那么原有的止损价格可能会被直接突破,从而造成更大的亏损。

  3. 时间框架设置不当导致判定错误。如果时间框架设置得过长或过短都可能导致指标判读产生偏差。

  4. 指标发散导致 Dunkirk 效应。即更高时间框架的指标显示超买而更低时间框架的指标显示超卖,平均指标无法反映真实情况。

对应风险的解决方法包括:优化止损策略,追踪动态支撑/阻力位,调整时间框架参数和添加筛选机制等。

优化方向

考虑到上述存在的风险,该策略还可从以下几个方向进行优化:

  1. 优化止损机制,实现追踪止损和分批止损。这可以在保证盈利的同时控制单笔亏损风险。

  2. 增加季度线等更高时间框架。这可以利用更大级别趋势过滤误导信号。指标出现分歧时,优先考虑更高时间框架。

  3. 增加成交量的多空验证。结合成交量变化判断底背离和顶背离,避免受到僵尸走势的误导。

  4. 优化入场时机。可以在重要的历史支撑/阻力附近等待突破入场,或者等待最佳回调买入点。

  5. 增加自适应止损。可以根据最近期的波动率和ATR来计算和调整动态止损位。

总结

多时间框架RSI与随机指标策略通过组合使用RSI指标和随机指标在多个时间框架上判断市场的超买超卖区间,是一种清晰可靠的交易策略。它最大的优势就是指标和时间框架的组合互相验证,能极大程度避免被套和假信号的风险。当然该策略也存在类似技术分析策略普遍存在的风险,需要从优化止损、时间框架选择等方面不断改进和优化,使之成为一种稳定盈利的算法交易策略。


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

////////////////////////////////////////// MTF Stochastic & RSI Strategy 🚥 ©️ bykzis /////////////////////////////////////////
//

// *** Inspired by "Binance CHOP Dashboard" from @Cazimiro and "RSI MTF Table" from @mobester16 *** and LOT OF COPY of Indicator-Jones MTF Scanner
// 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//@version=5
strategy('MTF RSI & STOCH Strategy🚥 by kzi', overlay=false,initial_capital=100, currency=currency.USD, commission_value=0.01, commission_type=strategy.commission.percent)


// Pair list
var string GRP1       = '══════════    General    ══════════'
overbought = input.int(80, 'Overbought Level', minval=1, group=GRP1)
oversold = input.int(20, 'Oversold Level', minval=1, group=GRP1)


/// Timeframes
var string GRP2       = '══════════   Timeframes   ══════════'
timeframe1 = input.timeframe(title="Timeframe 1", defval="W", group=GRP2)
timeframe2 = input.timeframe(title="Timeframe 2", defval="D", group=GRP2)
timeframe3 = input.timeframe(title="Timeframe 3", defval="240", group=GRP2)
timeframe4 = input.timeframe(title="Timeframe 4", defval="60", group=GRP2)

// RSI settings
var string GRP3       = '══════════   RSI settings   ══════════'
rsiLength = input.int(14, minval=1, title='RSI length', group=GRP3)
rsiSource = input(close, 'RSI Source', group=GRP3)
rsioverbought = input.int(70, 'RSI Overbought Level', minval=1, group=GRP3)
rsioversold = input.int(30, 'RSI Oversold Level', minval=1, group=GRP3)


/// Get RSI values of each timeframe /////////////////////////////////////////////////////
rsi = ta.rsi(rsiSource, rsiLength)
callRSI(id,timeframe) =>
    rsiValue = request.security(id, str.tostring(timeframe), rsi, gaps=barmerge.gaps_off)
    rsiValue

RSI_TF1 = callRSI(syminfo.tickerid, timeframe1)
RSI_TF2 = callRSI(syminfo.tickerid, timeframe2)
RSI_TF3 = callRSI(syminfo.tickerid, timeframe3)
RSI_TF4 = callRSI(syminfo.tickerid, timeframe4)




/////// Calculate Averages /////////////////////////////////////////////////////////////////
calcAVG(valueTF1, valueTF2, valueTF3, valueTF4) =>
    math.round((valueTF1 + valueTF2 + valueTF3 + valueTF4) / 4, 2)

AVG=calcAVG(RSI_TF1, RSI_TF2, RSI_TF3, RSI_TF4)



// Stochastic settings
var string GRP4       = '══════════   Stochastic settings   ══════════'
periodK = input.int(14, '%K length', minval=1, group=GRP4)
smoothK = input.int(3, 'Smooth K', minval=1, group=GRP4)
stochSource = input(close, 'Stochastic Source', group=GRP4)
stochoverbought = input.int(70, 'Stochastic Overbought Level', minval=1, group=GRP4)
stochoversold = input.int(30, 'Stochastic Oversold Level', minval=1, group=GRP4)


/// Get Stochastic values of each timeframe ////////////////////////////////////////////////
stoch = ta.sma(ta.stoch(stochSource, high, low, periodK), smoothK)
getStochastic(id,timeframe) =>
    stochValue = request.security(id, str.tostring(timeframe), stoch, gaps=barmerge.gaps_off)
    stochValue

Stoch_TF1 = getStochastic(syminfo.tickerid, timeframe1)
Stoch_TF2 = getStochastic(syminfo.tickerid, timeframe2)
Stoch_TF3 = getStochastic(syminfo.tickerid, timeframe3)
Stoch_TF4 = getStochastic(syminfo.tickerid, timeframe4)


AVG_STOCH=calcAVG(Stoch_TF1, Stoch_TF2, Stoch_TF3, Stoch_TF4)


plot(AVG, color = color.blue, title='RSI')
plot(AVG_STOCH, color = color.yellow,title='STOCH')
hline(rsioverbought,color=color.red)
hline(rsioversold, color=color.lime)
hline(50, color=color.white)

//============ signal Generator ==================================//

if AVG <= rsioversold and AVG_STOCH <=stochoversold 
    strategy.entry('Buy_Long', strategy.long)

    
strategy.close("Buy_Long",when=(AVG_STOCH >=70 and AVG >=50 and close >=strategy.position_avg_price),comment="Long_OK")

if AVG >=rsioverbought and AVG_STOCH >=stochoverbought
    strategy.entry('Buy_Short', strategy.short)


strategy.close("Buy_Short",when=(AVG_STOCH <=30 and AVG <=50 and close <=strategy.position_avg_price),comment="Short_OK")


///////////////////////////////////////////////////////////////////////////////////////////





更多内容