Chiến lược giao dịch Bitcoin dựa trên RVI và EMA

Tác giả:ChaoZhang, Ngày: 2024-02-22 13:50:17
Tags:

img

Tổng quan

Chiến lược này dựa trên chỉ số RVI (Relative Vigor Index) và EMA (Exponential Moving Average). Nó đi dài khi RVI đưa ra tín hiệu nhập cảnh và EMA nhanh nằm trên EMA chậm, và đi ngắn khi RVI đưa ra tín hiệu nhập cảnh và EMA chậm nằm trên EMA nhanh, thực hiện một chiến lược giao dịch định lượng dựa trên xu hướng và điều kiện mua quá mức bán quá mức.

Nguyên tắc chiến lược

  1. Sử dụng RVI để đánh giá các điều kiện mua quá mức và bán quá mức. Khi đường chỉ số RVI vượt qua trên đường tín hiệu của nó, đó là một tín hiệu mua quá mức để đi dài. Khi đường RVI vượt qua dưới đường tín hiệu của nó, đó là một tín hiệu bán quá mức để đi ngắn.

  2. Sử dụng EMA kép để xác định hướng xu hướng. Khi EMA nhanh nằm trên EMA chậm, đó là xu hướng tăng. Khi EMA chậm nằm trên EMA nhanh, đó là xu hướng giảm.

  3. Chỉ đi dài khi RVI đưa ra tín hiệu vào và EMA cho thấy xu hướng tăng. Chỉ đi ngắn khi RVI đưa ra tín hiệu vào và EMA cho thấy xu hướng giảm.

  4. Stop loss sau khi đi dài được đặt dưới mức thấp gần đây với khoảng cách atratrSL, và lấy lợi nhuận được đặt trên mức cao gần đây với khoảng cách của atratrTP. Stop loss sau khi đi ngắn được đặt trên mức cao gần đây với khoảng cách atratrSL, và lấy lợi nhuận được đặt dưới mức thấp gần đây với khoảng cáchatrTP.

Phân tích lợi thế

  1. Kết hợp các chỉ số xu hướng và mua quá nhiều tránh được sự phá vỡ sai.

  2. Động thái dừng lỗ và lấy lợi nhuận giúp bắt được những động thái lớn.

  3. Cân bằng chất lượng xu hướng và mức mua/bán quá mức, cải thiện độ chính xác tín hiệu.

  4. Kiểm tra kỹ lưỡng, tối ưu hóa các thông số, hiệu suất giao dịch thực sự tốt.

Phân tích rủi ro

  1. Sự thay đổi xu hướng thường xuyên được đánh giá bởi EMA trong các thị trường dao động có thể dẫn đến giao dịch quá mức.

  2. Các thông số RVI và thời gian EMA cần tối ưu hóa cho các công cụ giao dịch khác nhau, nếu không hiệu suất có thể bị ảnh hưởng.

  3. Các hệ số dừng lỗ và lấy lợi nhuận nên được thiết lập hợp lý dựa trên sự biến động của thị trường, nếu không rủi ro không thể được kiểm soát hiệu quả.

Hướng dẫn tối ưu hóa

  1. Nhiều chỉ số đánh giá chất lượng xu hướng có thể được thêm vào, như dao động, Bollinger Bands vv, để đưa ra quyết định giao dịch chính xác hơn.

  2. Khoảng cách dừng lỗ / lấy lợi nhuận có thể được điều chỉnh năng động dựa trên các biện pháp biến động như ATR, cho phép dừng rộng hơn trong các giai đoạn biến động cao.

  3. Sự kết hợp các tham số có thể được thử nghiệm và tối ưu hóa riêng biệt cho các công cụ khác nhau để cải thiện độ bền chiến lược.

Kết luận

Chiến lược này kết hợp các điểm mạnh của chỉ số RVI và EMA, đánh giá mức mua quá mức / bán quá mức trong khi tôn trọng hướng xu hướng chính, tránh giao dịch xung đột. Cơ chế dừng lỗ / lấy lợi nhuận năng động giúp nắm bắt các động thái theo hướng xu hướng chính. Thông qua tối ưu hóa tham số và kiểm soát rủi ro nghiêm ngặt, chiến lược này có thể đạt được lợi nhuận tương đối ổn định. Vẫn còn chỗ cho các điều chỉnh và tối ưu hóa hơn nữa trong các ứng dụng giao dịch thực tế. Các nhà giao dịch có thể thực hiện các sửa đổi tùy chỉnh dựa trên sở thích rủi ro và đặc điểm của công cụ của riêng họ.


/*backtest
start: 2024-01-22 00:00:00
end: 2024-02-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//this strategy works well on h4 (btc or eth)


//@version=5
strategy(title="Relative Vigor Index", shorttitle="RVGI",overlay=true)
//indicator(title="Relative Vigor Index", shorttitle="RVGI", format=format.price, precision=4, timeframe="", timeframe_gaps=true)
len = input.int(4, title="Length rvi", minval=1)
rvi = math.sum(ta.swma(close-open), len)/math.sum(ta.swma(high-low),len)
sig = ta.swma(rvi)
offset = input.int(0, "Offset rvi", minval = -500, maxval = 500)


atrlength = input.int(19,title="Atr Length",minval=1)
ema1 =  input.int(95,title="Long EMA rapida",minval=1,step=10)
ema2 =  input.int(200,title="Long EMA lenta",minval=1,step=10)

atrSL = input.float(2.0,title="Atr SL", step=0.1)
atrTP = input.float(1.0,title="Atr TP", step=0.1)

atr = ta.atr(atrlength)
esalcista = low > ta.ema(close,ema1) and ta.ema(close,ema1) > ta.ema(close,ema2)
bajista = high < ta.ema(close,ema1) and ta.ema(close,ema1) < ta.ema(close,ema2)


//plot(high + atr)
//plot(low - atr)

//strategy.entry("compra",strategy.long, when=ta.crossover(rvi,sig))
//strategy.close("compra",when=ta.crossunder(rvi,sig))

//plot(rvi, color=#008000, title="RVGI", offset = offset)
//plot(sig, color=#FF0000, title="Signal", offset = offset)
//plotshape(true,style=shape.xcross)

var TP = 0.0
var SL = 0.0

comprado = strategy.position_size>0
vendido = strategy.position_size<0

crucepositivo = ta.crossover(rvi,sig)
crucenegativo = ta.crossunder(rvi,sig)

if comprado
    // ver SL
    if low < SL
        strategy.close("BUY",comment="SL")
        
        
if comprado    
    //ver tp
    if high > TP
        strategy.close("BUY",comment="TP")
        
       
    
    
    
if not comprado and not vendido
    if crucepositivo and esalcista
        strategy.entry("BUY",strategy.long)
        SL := low - (atr * atrSL)
        TP := high + (atr * atrTP)
        alert("BUY",alert.freq_once_per_bar)



//---------------

if vendido
    // ver SL
    if high > SL
        strategy.close("SELL",comment="SL")
        
        
if vendido    
    //ver tp
    if low < TP
        strategy.close("SELL",comment="TP")
        
       

if not vendido and not comprado
    if crucenegativo and bajista
        strategy.entry("SELL",strategy.short)
        SL := high + (atr * atrSL)
        TP := low - (atr * atrTP)
        alert("SELL",alert.freq_once_per_bar)







//----------------

//plotshape(comprado,style=shape.xcross)
plot( comprado ? SL : na, color=color.red,style=plot.style_circles)
plot( comprado ? TP : na, color=color.blue,style=plot.style_circles)

plot( ta.ema(close,ema1),color=color.orange)
plot( ta.ema(close,ema2),color=color.yellow)


plot( vendido ? SL : na, color=color.red,style=plot.style_circles)
plot( vendido ? TP : na, color=color.blue,style=plot.style_circles)


Thêm nữa