多时间框架RSI与随机指标策略是一个利用RSI和随机指标的组合指标在多时间框架判断市场超买超卖的策略。该策略同时结合4个时间框架的RSI和随机指标,利用其平均值来判断整体市场走势和超买超卖情况,以发挥各个时间框架指标的优势。
RSI指标是一种强大的超买超卖指标,它基于一定时间内股票的涨跌幅度来计算。RSI值在0到100之间波动,一般来说,RSI大于70表示超买,小于30表示超卖。
本策略使用长度为14的RSI指标,并获取1个月、1日、4小时和1小时4个时间框架的RSI值。
随机指标%K是显示市场是超买还是超卖区间的指标,值在0到100之间波动。一般来说,随机指标大于80表示超买,小于20表示超卖。
本策略中,随机指标%K的长度为14,平滑为3,同样获取上述4个时间框架的值。
策略的关键在于计算上述两个指标在4个时间框架的平均值,以发挥各个时间框架的优势,判断整体市场走势。具体计算公式如下:
RSI平均值 = (RSI月线 + RSI日线 + RSI4小时 + RSI1小时) / 4
随机指标平均值 = (随机指标月线 + 随机指标日线 + 随机指标4小时 + 随机指标1小时) / 4
当RSI平均值小于30并且随机指标平均值小于20时,做多;当RSI平均值大于70并且随机指标平均值大于80时,做空。
做多后,在随机指标平均值大于70并且RSI平均值大于50时平仓;做空后,在随机指标平均值小于30并且RSI平均值小于50时平仓。
该策略最大的优势在于同时结合两个指标和多个时间框架,这可以大大提高交易信号的可靠性,并最大程度避免假信号。具体优势如下:
RSI指标和随机指标互为验证。仅仅依靠单一指标容易产生假信号,而本策略通过组合两个指标,能够提高信号的准确性。
多时间框架分析能够提高判断的准确性。例如,月线和日线显示超买,但4小时和1小时并未完全超买,这说明趋势可能继续。如果所有时间框架一致,则信号更加可靠。
更清楚判断结构性转折点。在多个时间框架上同步看到关键Support/Resistance的突破,可以判断目前趋势发生转折。
自动计算指标平均值简化操作。不需要手工计算,代码自动完成数据提取、指标计算和求平均,降低工作量。
该策略的主要风险在于像所有技术分析策略一样,无法完全避免被套和产生假信号的概率。主要风险有:
趋势短期反转导致被套。例如多头持仓期间,价格短线向下突破支撑位后再次反弹回升。这时根据策略的平仓逻辑需要立即止损,但有可能造成短期损失。
关键支撑/阻力位失守导致追踪止损失败。如果关键的支撑或阻力位发生失守,那么原有的止损价格可能会被直接突破,从而造成更大的亏损。
时间框架设置不当导致判定错误。如果时间框架设置得过长或过短都可能导致指标判读产生偏差。
指标发散导致 Dunkirk 效应。即更高时间框架的指标显示超买而更低时间框架的指标显示超卖,平均指标无法反映真实情况。
对应风险的解决方法包括:优化止损策略,追踪动态支撑/阻力位,调整时间框架参数和添加筛选机制等。
考虑到上述存在的风险,该策略还可从以下几个方向进行优化:
优化止损机制,实现追踪止损和分批止损。这可以在保证盈利的同时控制单笔亏损风险。
增加季度线等更高时间框架。这可以利用更大级别趋势过滤误导信号。指标出现分歧时,优先考虑更高时间框架。
增加成交量的多空验证。结合成交量变化判断底背离和顶背离,避免受到僵尸走势的误导。
优化入场时机。可以在重要的历史支撑/阻力附近等待突破入场,或者等待最佳回调买入点。
增加自适应止损。可以根据最近期的波动率和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") ///////////////////////////////////////////////////////////////////////////////////////////