Cette stratégie est un système de trading dynamique basé sur l'indice de force relative (RSI), qui identifie les transactions à travers les zones de surachat et de survente.
La logique de base repose sur l'indicateur RSI, qui comprend les éléments clés suivants: 1. Utilise le RSI de 14 périodes pour calculer la dynamique du marché 2. Génère des signaux courts à RSI 70 percée et des signaux longs à RSI 30 3. Exécute les transactions entre 8 h et 11 h GMT+2 4. Utilise un double mécanisme de prise de bénéfices avec des objectifs de profit partiel et total de 50% 5. Ajuste le stop-loss à l'équilibre après atteinte de l'objectif de profit partiel 6. Utilise des PIPS fixes pour les objectifs de stop-loss et de profit
La stratégie capture les opportunités de surachat et de survente du marché grâce à l'indicateur RSI, combinant une gestion stricte des risques et un filtrage du temps pour former un système de trading complet. Bien qu'elle présente certaines limitations, les directions d'optimisation suggérées peuvent encore améliorer la stabilité et la rentabilité de la stratégie.
/*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)