Esta estratégia é um sistema de negociação dinâmico baseado no Índice de Força Relativa (RSI), identificando negócios através de zonas de sobrecompra e sobrevenda. Operando dentro de janelas de tempo específicas, incorpora mecanismos de lucro parcial e stop-loss dinâmicos.
A lógica central baseia-se no indicador RSI, que engloba estes elementos-chave: 1. Utiliza o RSI de 14 períodos para calcular a dinâmica do mercado 2. Gerar sinais curtos no RSI 70 e sinais longos no RSI 30 3. Executa transacções entre as 8:00 e as 11:00 GMT+2 4. Emprega um mecanismo duplo de obtenção de lucros com metas de lucro parcial e total de 50% 5. Ajusta o stop-loss ao ponto de equilíbrio após atingir a meta de lucro parcial 6. Utiliza PIPS fixos para metas de stop-loss e lucro
A estratégia capta oportunidades de sobrecompra e sobrevenda do mercado através do indicador RSI, combinando gestão de risco rigorosa e filtragem de tempo para formar um sistema de negociação completo. Embora tenha algumas limitações, as direções de otimização sugeridas podem melhorar ainda mais a estabilidade e lucratividade da estratégia.
/*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)