
该策略主要基于相对强弱指数(RSI)指标判断过买过卖情况,以200日简单移动平均线(200 Day Simple Moving Average, SMA)作为主要的价格趋势滤波器,在确定趋势方向的基础上,利用RSI指标寻找较佳的入场和出场时机,实现盈利。相比单一使用RSI指标,该策略增加了趋势判断,可以更加准确地把握市场走势,在牛市中追涨杀跌,在熊市中反其道而行之,从而获取更高的策略收益。
该策略主要由RSI指标和200日SMA滤波器两部分组成。
RSI指标部分主要判断价格是否进入超买超卖区域。其计算公式为:
RSI = 100 - 100 / (1 + RSI上涨天数的平均涨幅 / RSI下跌天数的平均跌幅)
根据经验参数,当RSI < 30时为超卖,>70时为超买。
200日SMA滤波器主要判断大盘趋势方向。当价格高于200日SMA时为牛市,否则为熊市。
根据以上两者综合判断,策略有如下入场和出场逻辑:
多头入场:RSI < 45 且 收盘价 > 200日SMA
多头出场:RSI > 75 且 收盘价 > 200日SMA
空头入场:RSI > 65 且 收盘价 < 200日SMA
空头出场:RSI < 25 且 收盘价 < 200日SMA
这样,就利用RSI指标的精确判断在大趋势中寻找较优入场和出场点,进而获取较高策略收益。
该策略最大的优势在于利用RSI指标和200日SMA滤波器的配合,使得策略更加稳定和精确:
此外,该策略还具有如下优势:
该策略也存在一些风险:
为控制这些风险,可采取如下措施:
该策略可从以下几个方面进行优化:
该策略整体运行效果良好,具有判断准确、操作简单、适用范围广等优点。加入止损和仓位管理后,可谨慎实盘运行。后续可从参数优化、止损优化、仓位管理等方面进行策略增强,使策略效果更加出色。
/*backtest
start: 2023-12-04 00:00:00
end: 2023-12-11 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This work is licensed under a Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) https://creativecommons.org/licenses/by-nc-sa/4.0/
// © LuxAlgo
//@version=5
strategy('Relative Strength Index Extremes with 200-Day Moving Average Filte', overlay=true, pyramiding=1, initial_capital=10000, default_qty_type=strategy.cash, default_qty_value=36000, calc_on_order_fills=false, slippage=0, commission_type=strategy.commission.percent, commission_value=0.01)
// Rsi
rsi_lenght = input.int(14, title='RSI lenght', minval=0)
rsi_up = ta.rma(math.max(ta.change(close), 0), rsi_lenght)
rsi_down = ta.rma(-math.min(ta.change(close), 0), rsi_lenght)
rsi_value = rsi_down == 0 ? 100 : rsi_up == 0 ? 0 : 100 - 100 / (1 + rsi_up / rsi_down)
//Sma
Length1 = input.int(200, title=' SMA Lenght', minval=1)
SMA1 = ta.sma(close, Length1)
//Strategy Logic
Long = rsi_value < 45 and close > SMA1
Long_exit = rsi_value > 75 and close > SMA1
Short = rsi_value > 65 and close < SMA1
Short_exit = rsi_value < 25 and close < SMA1
if Long
strategy.entry('Long', strategy.long)
if Short
strategy.entry('Short', strategy.short)
strategy.close_all(Long_exit or Short_exit)
pera(pcnt) =>
strategy.position_size != 0 ? math.round(pcnt / 100 * strategy.position_avg_price / syminfo.mintick) : float(na)
stoploss = input.float(title=' stop loss', defval=5, minval=0.5)
los = pera(stoploss)
strategy.exit('SL', loss=los)
//by wielkieef