이 전략은 상대적 강도 지수 (RSI) 를 기반으로 한 동적 거래 시스템으로, 과잉 구매 및 과잉 판매 구역을 통해 거래를 식별합니다. 특정 시간 창 내에서 작동하여 부분 수익 및 동적 스톱-러스 메커니즘을 통합합니다. 시스템은 거래 결과를 최적화하기 위해 유연한 위치 관리 방법을 사용하여 거래 신호를 결정하기 위해 70 및 30 수준에서 RSI 돌파구를 모니터링합니다.
핵심 논리는 RSI 지표에 기반을 두고 있으며 다음의 핵심 요소를 포함합니다. 1. 시장 동력을 계산하기 위해 14 기간 RSI를 사용합니다. 2. RSI 70 돌파구에서 짧은 신호와 RSI 30에서 긴 신호를 생성 3. 거래는 GMT+2 8:00~11:00 사이에 실행합니다. 4. 50%의 부분적 이익과 50%의 전체적인 이익의 목표와 함께 이중 영업 메커니즘을 사용 5. 부분 이윤 목표에 도달 한 후 스톱 로스를 브레이크 이븐으로 조정합니다. 6. 중지 손실 및 수익 목표에 고정된 PIPS를 사용
이 전략은 엄격한 위험 관리와 시간 필터링을 결합하여 완전한 거래 시스템을 형성하여 RSI 지표를 통해 시장 과반 구매 및 과반 판매 기회를 포착합니다. 일부 제한이 있지만 제안된 최적화 방향은 전략 안정성과 수익성을 더욱 향상시킬 수 있습니다. 모듈형 디자인은 개인화 개선을위한 기본 전략으로 적합하여 조정 및 최적화를 용이하게합니다.
/*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)