Strategi ini adalah sistem perdagangan trend-mengikuti yang menggabungkan beberapa indikator teknis, menggunakan sinyal silang dari MACD, RSI, RVI, EMA, dan konfirmasi volume untuk mengidentifikasi tren pasar, dengan trailing stop untuk manajemen risiko.
Strategi ini menggunakan mekanisme verifikasi sinyal berlapis-lapis dengan beberapa komponen utama: Pertama, menggunakan 20-periode dan 200-periode Exponential Moving Averages (EMA) untuk menentukan tren pasar secara keseluruhan; kedua, menggunakan crossover indikator MACD (12,26,9) untuk menangkap titik balik tren; ketiga, menggunakan Relative Strength Index (RSI) dan Relative Volatility Index (RVI) untuk mengkonfirmasi kondisi overbought/oversold; akhirnya, memvalidasi perdagangan melalui indikator volume. Kondisi beli membutuhkan kepuasan bersamaan dari: MACD golden cross, RSI di bawah 70, RVI di atas 0, harga di atas kedua EMA, dan persyaratan volume minimum. Kondisi jual adalah sebaliknya. Strategi ini juga menggabungkan mekanisme trailing untuk melindungi keuntungan melalui penyesuaian stop-loss dinamis.
Strategi ini membangun sistem perdagangan yang relatif lengkap melalui kombinasi beberapa indikator teknis. Meskipun memiliki keterbatasan tertentu, strategi ini memiliki nilai praktis yang baik melalui optimasi parameter yang wajar dan manajemen risiko.
/*backtest start: 2024-10-27 00:00:00 end: 2024-11-26 00:00:00 period: 1d basePeriod: 1d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("MACD/RSI/RVI/EMA20-200/Volume BTC Auto Trading Bot", overlay=true, margin_long=100, margin_short=100) // Parámetros de EMA ema20Length = input(20, title="EMA 20 Length") ema200Length = input(200, title="EMA 200 Length") // Parámetros de MACD macdFastLength = input(12, title="MACD Fast Length") macdSlowLength = input(26, title="MACD Slow Length") macdSignalSmoothing = input(9, title="MACD Signal Smoothing") // Parámetros de RSI y RVI rsiLength = input(14, title="RSI Length") rviLength = input(14, title="RVI Length") // Volumen mínimo para operar minVolume = input(100, title="Min Volume to Enter Trade") // Rango de precios de BTC entre 60k y 80k minPrice = 60000 maxPrice = 80000 // Rango de precios BTC inPriceRange = close >= minPrice and close <= maxPrice // Cálculo de las EMAs ema20 = ta.ema(close, ema20Length) ema200 = ta.ema(close, ema200Length) plot(ema20, color=color.green, title="EMA 20") plot(ema200, color=color.red, title="EMA 200") // Cálculo del MACD [macdLine, signalLine, _] = ta.macd(close, macdFastLength, macdSlowLength, macdSignalSmoothing) macdHist = macdLine - signalLine plot(macdLine, color=color.blue, title="MACD Line") plot(signalLine, color=color.orange, title="Signal Line") hline(0, "MACD Zero Line", color=color.gray) plot(macdHist, style=plot.style_histogram, color=(macdHist >= 0 ? color.green : color.red), title="MACD Histogram") // Cálculo del RSI rsi = ta.rsi(close, rsiLength) hline(70, "RSI Overbought", color=color.red) hline(30, "RSI Oversold", color=color.green) plot(rsi, color=color.purple, title="RSI") // Cálculo del RVI numerator = (close - open) + 2 * (close[1] - open[1]) + 2 * (close[2] - open[2]) + (close[3] - open[3]) denominator = (high - low) + 2 * (high[1] - low[1]) + 2 * (high[2] - low[2]) + (high[3] - low[3]) rvi = ta.sma(numerator / denominator, rviLength) plot(rvi, color=color.blue, title="RVI") // Volumen volumeCondition = volume > minVolume // Condiciones de compra bullishCondition = ta.crossover(macdLine, signalLine) and rsi < 70 and rvi > 0 and close > ema20 and close > ema200 and inPriceRange and volumeCondition // Condiciones de venta bearishCondition = ta.crossunder(macdLine, signalLine) and rsi > 30 and rvi < 0 and close < ema20 and close < ema200 and inPriceRange and volumeCondition // Configuración del trailing stop loss trail_stop = input(true, title="Enable Trailing Stop") trail_offset = input.float(0.5, title="Trailing Stop Offset (%)", step=0.1) // Funciones para la gestión del Trailing Stop Loss if (bullishCondition) strategy.entry("Buy", strategy.long) var float highestPrice = na highestPrice := na(highestPrice) ? high : math.max(high, highestPrice) strategy.exit("Trailing Stop", "Buy", stop=highestPrice * (1 - trail_offset / 100)) if (bearishCondition) strategy.entry("Sell", strategy.short) var float lowestPrice = na lowestPrice := na(lowestPrice) ? low : math.min(low, lowestPrice) strategy.exit("Trailing Stop", "Sell", stop=lowestPrice * (1 + trail_offset / 100)) plotshape(bullishCondition, title="Buy Signal", location=location.belowbar, color=color.new(color.green, 0), style=shape.labelup, text="BUY") plotshape(bearishCondition, title="Sell Signal", location=location.abovebar, color=color.new(color.red, 0), style=shape.labeldown, text="SELL")