Esta estrategia se basa en el indicador RSI (Índice de Fuerza Relativa) para determinar las condiciones de sobrecompra y sobreventa. Toma posiciones de tendencia contraria cuando el RSI alcanza niveles de sobrecompra o sobreventa para comprar bajo y vender alto. La estrategia es simple y efectiva, beneficiándose de escenarios de sobrecompra y sobreventa a corto plazo en el mercado.
La estrategia utiliza el indicador RSI únicamente como señal de entrada. Se hace largo cuando el RSI cruza por debajo del punto bajo (default 20), y se hace corto cuando el RSI cruza por encima del punto alto (default 80). Se negocia una cantidad fija cada vez (default $100) y tiene como objetivo obtener un beneficio del 1% independientemente de las condiciones del mercado. Si la pérdida alcanza el 3%, se detiene. Para controlar la frecuencia del comercio, la estrategia deja de operar durante 24 barras después de una operación perdedora.
La lógica central es:
Como podemos ver, la estrategia es muy simple y mecánica. Apenas hay espacio para la optimización de parámetros. Simplemente explota las propiedades matemáticas del RSI para tomar posiciones contra tendencia alrededor de regiones sobrecompradas / sobrevendidas.
La mayor ventaja de esta estrategia es la simplicidad y la eficiencia.
También implementa relaciones stop loss / take profit para bloquear las ganancias y controlar los riesgos, así como la suspensión de operaciones para reducir la frecuencia.
Los principales riesgos de esta estrategia provienen de:
Incapaz de obtener ganancias en un mercado con tendencias fuertes.
La pérdida de parada demasiado amplia puede conducir a una pérdida excesiva.
La alta frecuencia de las operaciones puede conducir a un exceso de operaciones después de las ganancias.
Concentración de riesgos de tamaño fijo de $100.
Sobre la base del análisis, la estrategia puede mejorarse de las siguientes maneras:
Añadir un filtro de tendencia como MA para pausar la negociación cuando la tendencia no está clara.
Optimice las relaciones stop loss/take profit, reduzca la stop loss al 1-2% y utilice el take profit dinámico.
Limitar la frecuencia de operaciones, por ejemplo, hasta 2 operaciones por período.
El tamaño de las operaciones se basa en el porcentaje de capital en lugar de los 100 dólares fijos.
Optimice los parámetros del RSI como el período, los niveles de sobrecompra/venta.
Añadir dimensionamiento de la posición para no aumentar el tamaño cuando aumenta el capital.
Con estas optimizaciones, se pueden reducir los riesgos y mejorar significativamente la estabilidad.
En resumen, esta es una estrategia simple y directa que utiliza el RSI para negociar condiciones de sobrecompra / sobreventa para la reversión media a corto plazo. Los pros son la simplicidad, la eficiencia, no se necesita predicción, lógica clara, fácil de probar. Los contras son la incapacidad de obtener ganancias en tendencias fuertes y pérdidas potenciales.
/*backtest start: 2023-11-02 00:00:00 end: 2023-11-09 00:00:00 period: 3m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("rsi超买超卖_回测用", overlay=false, initial_capital=50000, currency=currency.USD, default_qty_type=strategy.cash) open_pos = input.int(50000, title = "每次开单资金(usdt)") rsi_period = input.int(14, title = "rsi周期") rsi_line = input.float(20.0, title='RSI触发线', step=0.05) stop_rsi_top_line = input.float(70, title = "顶部rsi止损线") stop_rsi_bottom_line = input.float(30, title = "底部rsi止损线") stop_loss_perc = input.float(0.03, title = "止损线") stop_profit = input.float(0.01, title = "止盈") loss_stop_trade_k = input.int(24, title = "亏损后x根K线不做交易") rsiParam = ta.rsi(close, rsi_period) var int failedTimes = 0 var bool stopTrade = false // plot(rsiParam) if stopTrade failedTimes += 1 if failedTimes == loss_stop_trade_k failedTimes := 0 stopTrade := false // 获取当前持仓方向 checkCurrentPosition() => strategy.position_size > 0 ? 1 : strategy.position_size < 0 ? -1 : 0 curPosition = checkCurrentPosition() // 当前持仓成本价 position_avg_price = strategy.position_avg_price // 当前持单, 触达反向的rsi线,清仓 if curPosition > 0 and rsiParam >= stop_rsi_top_line strategy.close_all(comment = "closebuy") if curPosition < 0 and rsiParam <= stop_rsi_bottom_line strategy.close_all(comment = "closesell") // 止盈止损清仓 if curPosition > 0 // if (position_avg_price - close) / close >= stop_loss_perc // // 止损 // strategy.close_all(comment = "closebuy") // stopTrade := true if (close - position_avg_price) / position_avg_price >= stop_profit // 止盈 strategy.close_all(comment = "closebuy") if curPosition < 0 // if (close - position_avg_price) / position_avg_price >= stop_loss_perc // // 止损 // strategy.close_all(comment = "closesell") // stopTrade := true if (position_avg_price - close) / close >= stop_profit // 止盈 strategy.close_all(comment = "closesell") a = strategy.closedtrades.exit_bar_index(strategy.closedtrades - 1) if bar_index == a and strategy.closedtrades.profit(strategy.closedtrades - 1) < 0 stopTrade := true var float openPrice = 0.0 if rsiParam <= rsi_line and stopTrade == false strategy.entry("long", strategy.long, open_pos / close, comment = "long") if curPosition == 0 openPrice := close strategy.exit("long_stop", "long", limit = openPrice * (1+stop_profit), stop=openPrice * (1-stop_loss_perc), comment = "closebuy") if rsiParam >= 100 - rsi_line and stopTrade == false strategy.entry("short", strategy.short, open_pos / close, comment = "short") if curPosition == 0 openPrice := close strategy.exit("short_stop", "short", limit = openPrice * (1-stop_profit), stop=openPrice * (1+stop_loss_perc), comment = "closesell") plot(failedTimes)