本策略运用RSI指标的超买超卖原理,结合多周期RSI进行判断,实现跨周期操作。策略根据RSI的周期设置判断超买超卖信号,并利用RSI的移动平均线进行滤波,避免错误信号。当RSI上穿其移动平均线时产生买入信号,下穿时产生卖出信号,形成典型的均线交叉操作方式。
该策略主要通过RSI指标的超买超卖判断产生交易信号。RSI指标代表相对强弱指数,它的计算公式是:RSI = 100 - (100 / (1 + RS)),其中RS等于一段时期内平均收盘涨数与平均收盘跌数的比值。RSI指数范围在0至100之间,一般认为低于30为超卖,高于70为超买。
本策略设置了一个高参数sobrecompra和一个低参数sobreventa,当RSI高于sobrecompra时判定为超买,当RSI低于sobreventa时判定为超卖。策略中sobrecompra默认值为70,sobreventa默认值为30。
为了产生买入和卖出信号,策略利用RSI指标的移动平均线进行过滤。当RSI指标上穿其移动平均线时产生买入信号Es_compra,下穿其移动平均线时产生卖出信号Es_venta。移动平均线参数periodos_media默认为14周期。
在产生买入和卖出信号后,策略开仓进行多头或空头交易。此外,策略还设置了止损和止盈,“%”,以防止亏损扩大和锁定利润。
使用RSI指标判断超买超卖状况,避免追高杀跌。
应用RSI指标的移动平均线进行滤波,避免假信号。
结合RSI指标的多周期设置,实现更稳定的交易信号。
设置止损止盈机制,有效控制风险。
策略逻辑简单清晰,容易理解和修改。
可自定义参数,适用于不同品种和周期。
RSI指标存在滞后性,可能错过价格反转的最佳时机。
移动平均线造成交易信号滞后,无法及时捕捉趋势反转。
固定的超买超卖参数设置不够灵活,不同周期和品种需要调整。
止损止盈设定不当可能带来亏损或漏掉利润。
多头空头仓位只有1手,无法充分利用资金进行差价交易。
结合其他指标如MACD、KD等判断交易信号。
应用自适应移动平均线追踪趋势。
设置动态超买超卖参数,根据市场波动程度调整。
优化止损止盈算法,如跟踪止损等。
增加仓位管理机制,根据资金规模动态调整仓位。
添加趋势过滤,避免震荡市场的频繁交易。
进行回测优化参数,选择最优参数组合。
本策略以RSI指标的超买超卖为基础,运用移动平均线进行滤波产生交易信号,实现典型的跨周期交易方式。策略具有清晰的逻辑结构和参数设置,可以通过调整参数适用于不同品种和周期,是一种可靠、有效的跨周期交易策略。但RSI指标和移动平均线等工具也存在一定局限性,需要进一步优化,使策略参数更具自适应性,过滤效果更好,最大程度减少风险和提高收益。
/*backtest
start: 2023-09-01 00:00:00
end: 2023-09-30 23:59:59
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © samuelkanneman
//@version=4
strategy("RSI KANNEMAN")
//////Entrada///////
i_startTime = input(title="Start Date Filter", defval=timestamp("01 Nov 2020 13:30 +0000"), type=input.time, tooltip="Date & time to begin trading from")
i_endTime = input(title="End Date Filter", defval=timestamp("1 Nov 2022 19:30 +0000"), type=input.time, tooltip="Date & time to stop trading")
sobrecompra= input(70, title="Sobre Compra", type=input.integer ,minval=50, maxval=100 )
sobreventa= input(30, title="Sobre Venta", type=input.integer ,minval=0, maxval=50 )
l1=hline(sobrecompra)
l2=hline(sobreventa, color=color.purple)
periodos= input(14, title="Periodos", type=input.integer ,minval=1, maxval=50 )
periodos_media= input(14, title="Logintud media movil", type=input.integer ,minval=1, maxval=200 )
var SL =0.0
var TP=0.0
StopLoss = input(2.0, title="SL %", step=0.2)
TakeProfit = input(5.0, title="TP %", step=0.2)
//////Proceso///////
mi_rsi=rsi(close,periodos)
mm_rsi=sma(mi_rsi,periodos_media)
Es_compra= crossover(mm_rsi,sobreventa)
Es_venta= crossunder(mm_rsi,sobrecompra)
comprado= strategy.position_size > 0
vendido = strategy.position_size < 0
//time to test
dateFilter = true
//timePeriod = time >= timestamp(syminfo.timezone, 2020, 11, 1, 0, 0)
// long
if (not comprado and Es_compra and dateFilter )
// realizar long
cantidad = strategy.equity/hlc3
strategy.entry ("compra", strategy.long , cantidad)
SL := close*(1-(StopLoss/100))
TP := close*(1+(TakeProfit/100))
if close >= TP
strategy.close ("compra" , comment="Salto TP")
if (comprado and Es_venta )
strategy.close ("compra" , comment="Sobre Venta")
if close <= SL
strategy.close ("compra" , comment="Salto SL")
// short
if (not vendido and Es_venta and dateFilter )
// realizar short
cantidad = strategy.equity/hlc3
strategy.entry ("venta", strategy.short , cantidad)
SL := close*(1+(StopLoss/100))
TP := close*(1-(TakeProfit/100))
if close <= TP
strategy.close ("venta" , comment="Salto TP")
if (vendido and Es_compra )
strategy.close ("venta" , comment="Sobre Compra")
if close >= SL
strategy.close ("venta" , comment="Salto SL")
///////Salida//////
fill(l1,l2)
plot(mi_rsi)
plot(mm_rsi, color=color.yellow)
bgcolor(Es_compra ? color.blue : na , transp=0)
bgcolor(Es_venta ? color.red : na , transp=0)
// 1d 70 22 5 4 3 15 6 meses
//1h 70 20 6 4 5 7 1 mese
//15m 70 20 5 4 4 7 1 semana