
A estratégia é um sistema de negociação dinâmico baseado no Índice de Força Relativa (RSI) que negocia identificando áreas de sobrecompra e sobrevenda. A estratégia opera dentro de uma janela de tempo específica e combina mecanismos de gerenciamento de risco, como realização parcial de lucro e stop loss dinâmico. O sistema determina sinais de negociação monitorando os rompimentos do indicador RSI nos níveis 70 e 30 e usa métodos flexíveis de gerenciamento de posição para otimizar os resultados de negociação.
A lógica central da estratégia é baseada no indicador RSI e inclui principalmente os seguintes elementos-chave:
Essa estratégia captura oportunidades de sobrecompra e sobrevenda do mercado por meio do indicador RSI e combina gerenciamento de risco rigoroso e filtragem de tempo para formar um sistema de negociação completo. Embora existam algumas limitações, a estabilidade e a lucratividade da estratégia podem ser melhoradas ainda mais por meio das direções de otimização sugeridas. O design modular da estratégia facilita o ajuste e a otimização, sendo adequada como estratégia básica para melhoria personalizada.
/*backtest
start: 2024-12-17 00:00:00
end: 2025-01-16 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/
//@version=5
strategy(title="RSI Overbought and Oversold Levels - Mikel Vaquero", shorttitle="RSI Levels", overlay=true)
// Configuración del RSI
rsiLengthInput = input.int(14, minval=1, title="RSI Length")
rsiSourceInput = input.source(close, title="RSI Source")
rsiLevelOverbought = input(70, title="Overbought Level")
rsiLevelOversold = input(30, title="Oversold Level")
rsiLevelMiddle = input(50, title="Middle Level") // Nueva entrada para el nivel 50
// Configuración del stop loss y take profit en pips
stopLossPips = input.int(15, title="Stop Loss (pips)")
takeProfitPips = input.int(100, title="Take Profit (pips)")
partialProfitPips = input.int(50, title="Partial Profit (pips)")
// Configuración del horario de operación
startHour = input.int(8, title="Start Hour (GMT+2)", minval=0, maxval=23)
startMinute = input.int(0, title="Start Minute (GMT+2)", minval=0, maxval=59)
endHour = input.int(11, title="End Hour (GMT+2)", minval=0, maxval=23)
endMinute = input.int(0, title="End Minute (GMT+2)", minval=0, maxval=59)
// Calcular el RSI
up = ta.rma(math.max(ta.change(rsiSourceInput), 0), rsiLengthInput)
down = ta.rma(-math.min(ta.change(rsiSourceInput), 0), rsiLengthInput)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
// Condiciones de sobrecompra y sobreventa
overboughtCondition = ta.crossover(rsi, rsiLevelOverbought)
oversoldCondition = ta.crossunder(rsi, rsiLevelOversold)
// Plotear el RSI y los niveles
plot(rsi, "RSI", color=color.rgb(236, 222, 13))
hline(rsiLevelOverbought, "Overbought", color=color.rgb(6, 245, 6))
hline(rsiLevelOversold, "Oversold", color=color.rgb(243, 32, 4))
hline(rsiLevelMiddle, "Middle", color=color.blue) // Nueva línea para el nivel 50
// Plotear formas para las condiciones
plotshape(series=overboughtCondition, title="Overbought", location=location.top, color=color.rgb(26, 241, 6), style=shape.labeldown, text="B")
plotshape(series=oversoldCondition, title="Oversold", location=location.bottom, color=#fa0d05, style=shape.labelup, text="S")
// Condiciones de alerta
alertcondition(overboughtCondition, title='RSI Overbought', message='RSI has crossed above the overbought level')
alertcondition(oversoldCondition, title='RSI Oversold', message='RSI has crossed below the oversold level')
// Convertir los valores de pips a la escala de precios del gráfico
pipValue = syminfo.mintick * 10
stopLoss = stopLossPips * pipValue
takeProfit = takeProfitPips * pipValue
partialProfit = partialProfitPips * pipValue
// Configurar las horas de operación (horario español)
timeInRange = (hour(time, "GMT+2") > startHour or (hour(time, "GMT+2") == startHour and minute(time, "GMT+2") >= startMinute)) and (hour(time, "GMT+2") < endHour or (hour(time, "GMT+2") == endHour and minute(time, "GMT+2") < endMinute))
// Variables de estado para rastrear la señal actual
var bool longPositionTaken = false
var bool shortPositionTaken = false
// Estrategia de entrada y salida
if timeInRange
if overboughtCondition and not longPositionTaken
strategy.entry("Long", strategy.long)
strategy.exit("Partial Take Profit", from_entry="Long", qty_percent=50, limit=close + partialProfit)
strategy.exit("Stop Loss", from_entry="Long", stop=close - stopLoss)
strategy.exit("Full Take Profit", from_entry="Long", limit=close + takeProfit)
longPositionTaken := true
shortPositionTaken := false
if oversoldCondition and not shortPositionTaken
strategy.entry("Short", strategy.short)
strategy.exit("Partial Take Profit", from_entry="Short", qty_percent=50, limit=close - partialProfit)
strategy.exit("Stop Loss", from_entry="Short", stop=close + stopLoss)
strategy.exit("Full Take Profit", from_entry="Short", limit=close - takeProfit)
shortPositionTaken := true
longPositionTaken := false
// Ajustar el stop loss a breakeven después de tomar la ganancia parcial
if strategy.position_size > 0 and close >= strategy.position_avg_price + partialProfit
strategy.exit("Move Stop to Breakeven", stop=strategy.position_avg_price, qty_percent=50)
if strategy.position_size < 0 and close <= strategy.position_avg_price - partialProfit
strategy.exit("Move Stop to Breakeven", stop=strategy.position_avg_price, qty_percent=50)