
Chiến lược này là một hệ thống giao dịch theo dõi xu hướng kết hợp nhiều chỉ số kỹ thuật, xác định xu hướng thị trường thông qua các tín hiệu chéo của các chỉ số như MACD, RSI, RVI, EMA và xác nhận khối lượng giao dịch và sử dụng theo dõi dừng để quản lý rủi ro. Chiến lược hoạt động trong một phạm vi giá cụ thể để tăng độ chính xác và độ tin cậy của giao dịch bằng cách đánh giá tổng hợp nhiều tín hiệu.
Chiến lược này sử dụng cơ chế xác minh tín hiệu nhiều cấp, bao gồm một số thành phần quan trọng như sau: đầu tiên, sử dụng đường trung bình di chuyển chỉ số ((EMA) 20 chu kỳ và 200 chu kỳ để xác định xu hướng thị trường tổng thể; thứ hai, sử dụng đường chéo của MACD ((12,26,9) để nắm bắt điểm biến của xu hướng; thứ ba, sử dụng đường chỉ số tương đối mạnh ((RSI) và đường chỉ số tương đối dao động ((RVI) để xác nhận tình trạng quá mua quá bán của thị trường; cuối cùng, xác nhận giao dịch bằng chỉ số giao dịch.
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 việc sử dụng kết hợp nhiều chỉ số kỹ thuật. Mặc dù có một số hạn chế, chiến lược có giá trị thực tế tốt thông qua tối ưu hóa tham số và quản lý rủi ro hợp lý. Trong tương lai, có thể nâng cao tính ổn định và lợi nhuận của chiến lược bằng cách giới thiệu nhiều cơ chế tự điều chỉnh và phương tiện kiểm soát rủi ro hơn.
/*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")