Tài nguyên đang được tải lên... tải...

Hệ thống phát hiện chênh lệch giá RSI động và chiến lược giao dịch thích nghi

Tác giả:ChaoZhang, Ngày: 2025-01-10 16:20:25
Tags:RSITPSL

 Dynamic RSI-Price Divergence Detection and Adaptive Trading Strategy System

Tổng quan

Chiến lược này là một hệ thống giao dịch thông minh dựa trên chỉ số RSI và chênh lệch giá, nắm bắt các tín hiệu đảo ngược thị trường bằng cách theo dõi động mối quan hệ chênh lệch giữa các chỉ số RSI và xu hướng giá.

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

Logic cốt lõi của chiến lược dựa trên các yếu tố chính sau: 1. Phát hiện chênh lệch RSI: Xác định các mô hình chênh lệch tiềm năng bằng cách so sánh mức cao và thấp của các chỉ số RSI và xu hướng giá. Các tín hiệu bán chênh lệch giảm hình thành khi giá đạt mức cao mới trong khi RSI không; tín hiệu mua chênh lệch tăng hình thành khi giá đạt mức thấp mới trong khi RSI không. 2. Xác nhận Fractal: Sử dụng lý thuyết Fractals để phân tích cấu trúc giá, xác nhận tính hợp lệ của sự khác biệt bằng cách phát hiện mức cao và thấp địa phương để cải thiện độ tin cậy tín hiệu. 3. Điều chỉnh tham số: giới thiệu tham số độ nhạy để điều chỉnh năng động khoảng thời gian phán đoán fractal, đạt được sự thích nghi với các môi trường thị trường khác nhau. 4. Kiểm soát rủi ro: Tích hợp các cơ chế Stop Loss và Take Profit dựa trên tỷ lệ phần trăm để đảm bảo rủi ro có thể kiểm soát được cho mỗi giao dịch.

Ưu điểm chiến lược

  1. Độ tin cậy tín hiệu cao: Cơ chế xác nhận kép của phân kỳ RSI và lý thuyết Fractals cải thiện đáng kể độ chính xác tín hiệu giao dịch.
  2. Khả năng thích nghi mạnh mẽ: Chiến lược có thể điều chỉnh các tham số một cách linh hoạt theo các điều kiện thị trường khác nhau, cho thấy khả năng thích nghi môi trường tốt.
  3. Quản lý rủi ro toàn diện: Các cơ chế dừng lỗ và lấy lợi nhuận năng động tích hợp kiểm soát hiệu quả rủi ro cho mỗi giao dịch.
  4. Mức độ tự động hóa cao: Tự động hóa hoàn toàn từ nhận dạng tín hiệu đến thực hiện giao dịch làm giảm tác động cảm xúc từ sự can thiệp của con người.
  5. Khả năng mở rộng tốt: Khung chiến lược hỗ trợ các ứng dụng đa công cụ, nhiều khung thời gian, tạo thuận lợi cho đầu tư danh mục đầu tư.

Rủi ro chiến lược

  1. Sự phụ thuộc vào môi trường thị trường: Độ tin cậy của tín hiệu chênh lệch có thể giảm ở các thị trường xu hướng, đòi hỏi các cơ chế lọc xu hướng bổ sung.
  2. Độ nhạy của các tham số: Các tham số chính như ngưỡng RSI và khoảng thời gian phán đoán fractal cần điều chỉnh cẩn thận, cài đặt tham số không đúng có thể ảnh hưởng đến hiệu suất chiến lược.
  3. Tạm thời tín hiệu: Chờ hình thành mô hình phân kỳ hoàn chỉnh trước khi xác nhận tín hiệu có thể dẫn đến thời gian nhập chậm.
  4. Sự can thiệp tiếng ồn thị trường: Các tín hiệu phân kỳ sai có thể xảy ra trong thị trường biến động, đòi hỏi các điều kiện lọc bổ sung.

Hướng dẫn tối ưu hóa chiến lược

  1. Thêm lọc xu hướng: giới thiệu các chỉ số đánh giá xu hướng để lọc các tín hiệu chống xu hướng trong các thị trường xu hướng mạnh, cải thiện khả năng thích nghi chiến lược trên các môi trường thị trường khác nhau.
  2. Tối ưu hóa điều chỉnh tham số: Phát triển các cơ chế điều chỉnh tham số năng động dựa trên sự biến động của thị trường, tăng cường phản ứng chiến lược với những thay đổi của thị trường.
  3. Cải thiện kiểm soát rủi ro: giới thiệu các cơ chế dừng lỗ năng động để tự động điều chỉnh các vị trí dừng lỗ dựa trên sự biến động của thị trường, tối ưu hóa hiệu ứng quản lý tiền.
  4. Cải thiện xác nhận tín hiệu: Xây dựng một hệ thống xác nhận tín hiệu toàn diện hơn bằng cách kết hợp khối lượng, biến động và các chỉ số cấu trúc vi mô thị trường khác.

Tóm lại

Chiến lược này xây dựng một hệ thống giao dịch mạnh mẽ thông qua sự kết hợp sáng tạo của sự khác biệt RSI và lý thuyết Fractals. Ưu điểm của nó nằm ở độ tin cậy tín hiệu cao, khả năng thích nghi mạnh mẽ và cơ chế kiểm soát rủi ro toàn diện. Thông qua tối ưu hóa và cải tiến liên tục, chiến lược dự kiến sẽ duy trì hiệu suất ổn định trong các môi trường thị trường khác nhau. Khi áp dụng giao dịch trực tiếp, nên kiểm tra kỹ lưỡng và tối ưu hóa các tham số theo đặc điểm thị trường và thực hiện nghiêm ngặt các biện pháp kiểm soát rủi ro.


/*backtest
start: 2025-01-02 00:00:00
end: 2025-01-09 00:00:00
period: 5m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/

//FRACTALS
//@version=5

//last : 30m 70 68 22 25 0 0 4.7 11.5

//init
capital=1000
percent=100
fees=0//in percent for each entry and exit

//Inputs
start = input(timestamp("1 Feb 2002"), "Start Time", group = "Date")
end = input(timestamp("1 Feb 2052"), "End Time", group = "Date")

//Strategy
strategy("Divergence Finder (RSI/Price) Strategy with Options", overlay = true, initial_capital=capital, default_qty_value=percent, default_qty_type=strategy.percent_of_equity, commission_type=strategy.commission.percent, calc_on_order_fills=false,process_orders_on_close=true , commission_value=fees, currency=currency.EUR, calc_on_every_tick=true, use_bar_magnifier=false)
//indicator("Divergence Finder (RSI/Price) with Options", overlay=true, max_boxes_count=200, max_bars_back=500,max_labels_count=500)


srcUp=input.source(close, "Source for Price Buy Div", group="sources")
srcDn=input.source(close, "Source for Price Sell Div", group="sources")
srcRsi=input.source(close, "Source for RSI Div", group="sources")


HighRSILimit=input.int(70, "Min RSI for Sell divergence (p1:pre last)", group="signals", inline="1", step=1)
HighRSILimit2=input.int(68, "Min RSI for Sell divergence (p2):last", group="signals", inline="1", step=1)
LowRSILimit=input.int(22, "Min RSI for Buy divergence (p1:pre last)", group="signals", inline="2", step=1)
LowRSILimit2=input.int(25, "Min RSI for Buy divergence (p2:last)", group="signals", inline="2", step=1)


minMarginP=input.float(0, "Min margin between price for displaying divergence (%)", group="signals", step=0.01)
minMarginR=input.float(0, "Min margin between RSI for displaying divergence (%)", group="signals", step=1)

nb=input.int(2, "Sensivity: Determine how many candle will be used to determine last top or bot (too high cause lag, too low cause repaint)", group="Sensivity", inline="3", step=1)


stopPer= input.float(4.7, title='Stop %', group = "Per", inline="3", step=0.01)
tpPer = input.float(11.5, title='TP %', group = "Per", inline="4", step=0.01)

//nb=2
leftBars = nb
rightBars=nb


labels=input.bool(true, "Display Divergence labels", group="Display")
draw=input.bool(true, "Display tops/bottoms")



dnFractal = (close[nb-2] < close[nb]) and (close[nb-1] < close[nb]) and (close[nb+1] < close[nb]) and (close[nb+2] < close[nb])
upFractal = (close[nb-2] > close[nb]) and (close[nb-1] > close[nb]) and (close[nb+1] > close[nb]) and (close[nb+2] > close[nb])
ph=dnFractal
pl=upFractal

plot(dnFractal and draw ? close[nb] : na, style=plot.style_line,offset=-2, color=color.lime, title="tops")
plot(upFractal and draw ? close[nb] : na,  style=plot.style_line, offset=-2, color=color.red, title="botts")

plotchar(dnFractal ? high[nb] : na, char='⮝',location=location.absolute,offset=-2, color=color.rgb(236, 255, 63), title="Down Fractal")
plotchar(upFractal ? low[nb] : na, char='⮟', location=location.absolute, offset=-2, color=color.rgb(67, 227, 255), title="Up Fractal")


float myRSI=ta.rsi(srcRsi, 14)

bool divUp=false
bool divDn=false

//compare lasts bots
p2=ta.valuewhen( ph,srcDn[nb], 0 ) //last price
p1=ta.valuewhen( ph,srcDn[nb], 1 ) //pre last price

r2=ta.valuewhen( ph,myRSI[nb], 0 )  //last rsi
r1=ta.valuewhen( ph,myRSI[nb], 1 )  //pre last rsi


if ph
    if p1 < p2// - (p2 * minMarginP)/100
        if r1 > HighRSILimit and r2 > HighRSILimit2
            if r1 > r2 + (r2 * minMarginR)/100
                divDn:=true

plot(divDn ? close:na, style=plot.style_cross, linewidth=3, color= color.red, offset=-rightBars, title="Sell Div")
if labels and divDn and strategy.position_size >= 0
    label.new(bar_index-nb,high, "Sell Divergence "+str.tostring(p1)+"   "+str.tostring(math.round(r1, 2))+"  "+str.tostring(p2)+"   "+str.tostring(math.round(r2, 2)),xloc=xloc.bar_index,yloc=yloc.abovebar, color = color.red, style = label.style_label_down)
else if divDn and strategy.position_size >= 0
    label.new(bar_index-nb,high, "Sell Divergence",xloc=xloc.bar_index,yloc=yloc.abovebar, color = color.red, style = label.style_label_down)



p2:=ta.valuewhen( pl,srcUp[nb], 0 )
p1:=ta.valuewhen( pl,srcUp[nb], 1 )

r2:=ta.valuewhen( pl,myRSI[nb], 0 )
r1:=ta.valuewhen( pl,myRSI[nb], 1 )


if pl
    if p1 > p2 + (p2 * minMarginP)/100
        if r1 < LowRSILimit and r2 < LowRSILimit2
            if r1 < r2 - (r2 * minMarginR)/100
                divUp:=true
               
plot(divUp ? close:na, style=plot.style_cross, linewidth=3, color= color.green, offset=-rightBars, title="Buy Div")
if labels and divUp and strategy.position_size <= 0
    label.new(bar_index-nb,high, "Buy Divergence "+str.tostring(p1)+"   "+str.tostring(math.round(r1, 2))+"  "+str.tostring(p2)+"   "+str.tostring(math.round(r2, 2)),xloc=xloc.bar_index,yloc=yloc.belowbar, color = color.green, style = label.style_label_up)
else if divUp and strategy.position_size <= 0
    label.new(bar_index-nb,high, "Buy Divergence",xloc=xloc.bar_index,yloc=yloc.belowbar, color = color.green, style = label.style_label_up)


//strat LONG
longEntry = divUp//  and strategy.position_size == 0
longExit = divDn//  and strategy.position_size == 0

//strat SHORT
shortEntry = divDn
shortExit = divUp

LongActive=input(true, title='Activate Long', group = "Directions", inline="2")
ShortActive=input(true, title='Activate Short', group = "Directions", inline="2")
//StopActive=input(false, title='Activate Stop', group = "Directions", inline="2")


//tpActive =  input(false, title='Activate Take Profit', group = "TP", inline="4")
//RR=input(0.5, title='Risk Reward Multiplier', group = "TP")
//QuantityTP = input(100.0, title='Trade Ammount %', group = "TP")


//calc stop
//longStop = strategy.position_avg_price * (1 - stopPer)
//shortStop = strategy.position_avg_price * (1 + stopPer)

longStop = strategy.position_avg_price - (strategy.position_avg_price * stopPer/100)
shortStop = strategy.position_avg_price + (strategy.position_avg_price * stopPer/100)

longTP = strategy.position_avg_price + (strategy.position_avg_price * tpPer/100)
shortTP = strategy.position_avg_price - (strategy.position_avg_price * tpPer/100)

//Calc TP
//longTP = ((strategy.position_avg_price-longStop)*RR+strategy.position_avg_price)
//shortTP = (strategy.position_avg_price-((shortStop-strategy.position_avg_price)*RR))


//display stops
plot(strategy.position_size > 0 ? longStop : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Fixed SL")
plot(strategy.position_size < 0 ? shortStop : na, style=plot.style_linebr, color=color.purple, linewidth=1, title="Short Fixed SL")


//display TP
plot(strategy.position_size > 0 ? longTP : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Long Fixed TP")
plot(strategy.position_size < 0 ? shortTP : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Short Fixed TP")

//do
if true
    //check money available
    if strategy.equity > 0
        //if tpActive //Need to put TP before Other exit
        strategy.exit("Close Long", from_entry="Long", limit=longTP,stop=longStop, comment="Close Long with : "+ str.tostring(math.round(strategy.equity)) +" $ ", qty_percent=100)
        strategy.exit("Close Short", from_entry="Short", limit=shortTP,stop=shortStop, comment="Close Short with : "+ str.tostring(math.round(strategy.equity)) +" $ ", qty_percent=100)
        //Set Stops
        //if StopActive
        //    strategy.exit("Stop Long", from_entry="Long", stop=longStop, comment="Stop Long with : "+ str.tostring(math.round(strategy.equity)) +" $ ")
        //    strategy.exit("Stop Short", from_entry="Short", stop=shortStop, comment="Stop Short with : "+ str.tostring(math.round(strategy.equity)) +" $ ")
        if longEntry
            if ShortActive
                strategy.close("Short",comment="Close Short with : "+ str.tostring(math.round(strategy.equity)) +" $ ")
                alert("Close Short")
            if LongActive
                strategy.entry("Long", strategy.long, comment="Open Long with : "+ str.tostring(math.round(strategy.equity)) +" $ ")
                alert("Open Long")
        if longExit
            if LongActive
                strategy.close("Long",comment="Close Long with : "+ str.tostring(math.round(strategy.equity)) +" $ ")
                alert("Close Long")
            if ShortActive
                strategy.entry("Short", strategy.short, comment="Open Short with : "+ str.tostring(math.round(strategy.equity)) +" $ ")
                alert("Open Short")


//alertcondition(longEntry and LongActive, title="Buy Divergence Open", message="Buy Divergence Long Opened!")
//alertcondition(longExit and ShortActive, title="Sell Divergence Open", message="Buy Divergence Short Opened!")

//alertcondition(longExit and LongActive, title="Buy Divergence Closed", message="Buy Divergence Long Closed!")
//alertcondition(longEntry and ShortActive, title="Sell Divergence Closed", message="Buy Divergence Short Closed!")


Có liên quan

Thêm nữa