本策略运用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