Chiến lược này là một hệ thống giao dịch theo xu hướng kết hợp nhiều chỉ số kỹ thuật, sử dụng các tín hiệu chéo từ MACD, RSI, RVI, EMA và xác nhận khối lượng để xác định xu hướng thị trường, với việc dừng lại để quản lý rủi ro. Chiến lược hoạt động trong phạm vi giá cụ thể và sử dụng nhiều sự kết hợp tín hiệu để cải thiện độ chính xác và độ tin cậy giao dịch.
Chiến lược sử dụng một cơ chế xác minh tín hiệu đa lớp với một số thành phần chính: Thứ nhất, nó sử dụng Trung bình Di chuyển Triệu suất (EMA) 20 giai đoạn và 200 giai đoạn để xác định xu hướng thị trường tổng thể; thứ hai, nó sử dụng dấu hiệu MACD (12,26,9) để nắm bắt các điểm chuyển hướng xu hướng; thứ ba, nó sử dụng Chỉ số Sức mạnh Tương đối (RSI) và Chỉ số biến động tương đối (RVI) để xác nhận các điều kiện mua quá mức / bán quá mức; cuối cùng, nó xác nhận các giao dịch thông qua các chỉ số khối lượng. Điều kiện mua đòi hỏi sự hài lòng đồng thời của: đường chéo vàng MACD, RSI dưới 70, RVI trên 0, giá trên cả EMA và yêu cầu khối lượng tối thiểu. Điều kiện bán là ngược lại. Chiến lược cũng kết hợp một cơ chế kéo theo để bảo vệ lợi nhuận thông qua điều chỉnh dừng lỗ năng động.
Chiến lược này xây dựng một hệ thống giao dịch tương đối hoàn chỉnh thông qua sự kết hợp của nhiều chỉ số kỹ thuật. Mặc dù có một số hạn chế nhất định, chiến lược có giá trị thực tế tốt thông qua tối ưu hóa tham số hợp lý và quản lý rủi ro.
/*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")