
Bei der Strategie handelt es sich um ein dynamisches Handelssystem auf Basis des Relative Strength Index (RSI), das durch die Identifizierung überkaufter und überverkaufter Bereiche handelt. Die Strategie operiert innerhalb eines bestimmten Zeitfensters und kombiniert Risikomanagementmechanismen wie Teilgewinnmitnahmen und dynamische Stop-Loss-Strategien. Das System ermittelt Handelssignale, indem es die Ausbrüche des RSI-Indikators auf den Ebenen 70 und 30 überwacht und verwendet flexible Methoden zur Positionsverwaltung, um die Handelsergebnisse zu optimieren.
Die Kernlogik der Strategie basiert auf dem RSI-Indikator und umfasst im Wesentlichen die folgenden Schlüsselelemente:
Diese Strategie nutzt überkaufte und überverkaufte Marktgelegenheiten anhand des RSI-Indikators und bildet in Kombination mit striktem Risikomanagement und Zeitfilterung ein vollständiges Handelssystem. Obwohl es einige Einschränkungen gibt, können die Stabilität und Rentabilität der Strategie durch die vorgeschlagenen Optimierungshinweise weiter verbessert werden. Der modulare Aufbau der Strategie ermöglicht eine einfache Anpassung und Optimierung und eignet sich als Basisstrategie für individuelle Verbesserungen.
/*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)