Indikator strategi kuantitatif divergensi harga RSI pemantauan dinamis dan sistem pengoptimalan adaptif

RSI TP SL
Tanggal Pembuatan: 2025-01-10 16:20:25 Akhirnya memodifikasi: 2025-01-10 16:20:25
menyalin: 5 Jumlah klik: 421
1
fokus pada
1617
Pengikut

Indikator strategi kuantitatif divergensi harga RSI pemantauan dinamis dan sistem pengoptimalan adaptif

Ringkasan

Strategi ini adalah sistem perdagangan cerdas berdasarkan RSI dan divergensi harga. Sistem ini menangkap sinyal pembalikan pasar dengan memantau secara dinamis hubungan divergensi antara indikator RSI dan tren harga. Strategi ini mengintegrasikan fraktal sebagai konfirmasi tambahan dan dilengkapi dengan mekanisme stop-profit dan stop-loss adaptif untuk mencapai eksekusi transaksi yang sepenuhnya otomatis. Sistem ini mendukung aplikasi multi-variasi dan multi-siklus serta memiliki fleksibilitas dan kepraktisan yang kuat.

Prinsip Strategi

Logika inti dari strategi ini didasarkan pada elemen-elemen kunci berikut:

  1. Identifikasi divergensi RSI: Identifikasi potensi divergensi dengan membandingkan titik tertinggi dan terendah indikator RSI dan pergerakan harga. Ketika harga mencapai titik tertinggi baru tetapi RSI tidak mencapai titik tertinggi baru, sinyal jual divergensi atas terbentuk; ketika harga mencapai titik terendah baru tetapi RSI tidak mencapai titik terendah baru, sinyal beli divergensi bawah terbentuk.
  2. Konfirmasi fraktal: Gunakan fraktal untuk menganalisis struktur harga, konfirmasikan validitas divergensi dengan mendeteksi titik tertinggi dan terendah lokal, dan tingkatkan keandalan sinyal.
  3. Adaptasi parameter: Sistem memperkenalkan parameter sensitivitas untuk menyesuaikan interval penilaian fraktal secara dinamis guna mencapai adaptasi terhadap lingkungan pasar yang berbeda.
  4. Pengendalian Risiko: Mengintegrasikan mekanisme Stop Loss dan Take Profit berbasis persentase untuk memastikan bahwa risiko setiap transaksi dapat dikendalikan.

Keunggulan Strategis

  1. Keandalan sinyal yang tinggi: Mekanisme konfirmasi ganda dari divergensi RSI dan teori fraktal sangat meningkatkan akurasi sinyal perdagangan.
  2. Kemampuan beradaptasi yang kuat: Strategi dapat secara fleksibel menyesuaikan parameter sesuai dengan kondisi pasar yang berbeda dan memiliki kemampuan beradaptasi lingkungan yang baik.
  3. Manajemen risiko yang sempurna: Mengintegrasikan mekanisme stop-profit dan stop-loss yang dinamis untuk mengendalikan paparan risiko setiap transaksi secara efektif.
  4. Otomatisasi tingkat tinggi: Seluruh proses dari pengenalan sinyal hingga eksekusi transaksi diotomatisasi, mengurangi dampak emosional dari campur tangan manusia.
  5. Skalabilitas yang baik: Kerangka strategi mendukung aplikasi multi-variasi dan multi-siklus, memfasilitasi investasi portofolio.

Risiko Strategis

  1. Ketergantungan pada lingkungan pasar: Di pasar dengan tren yang jelas, keandalan sinyal divergensi dapat menurun, dan perlu menambahkan mekanisme penyaringan tren.
  2. Sensitivitas parameter: Parameter utama strategi, seperti ambang batas RSI dan interval penilaian fraktal, perlu di-debug dengan saksama. Pengaturan parameter yang tidak tepat dapat memengaruhi kinerja strategi.
  3. Jeda sinyal: Karena perlu menunggu pola divergensi terbentuk sepenuhnya sebelum sinyal dapat dikonfirmasi, mungkin ada jeda waktu masuk tertentu.
  4. Gangguan kebisingan pasar: Dalam pasar yang fluktuatif, sinyal divergensi palsu dapat dihasilkan, dan kondisi penyaringan tambahan perlu ditambahkan.

Arah optimasi strategi

  1. Meningkatkan penyaringan tren: Perkenalkan indikator penilaian tren untuk menyaring sinyal pembalikan di pasar tren yang kuat dan tingkatkan kemampuan beradaptasi strategi di lingkungan pasar yang berbeda.
  2. Optimalkan adaptasi parameter: Kembangkan mekanisme penyesuaian parameter dinamis berdasarkan volatilitas pasar untuk meningkatkan respons strategi terhadap perubahan pasar.
  3. Meningkatkan pengendalian risiko: memperkenalkan mekanisme stop-loss dinamis untuk secara otomatis menyesuaikan posisi stop-loss sesuai dengan fluktuasi pasar dan mengoptimalkan efek pengelolaan dana.
  4. Konfirmasi sinyal yang ditingkatkan: Gabungkan indikator mikrostruktur pasar seperti volume perdagangan dan volatilitas untuk membangun sistem konfirmasi sinyal yang lebih lengkap.

Meringkaskan

Strategi ini membangun sistem perdagangan yang kuat melalui kombinasi inovatif divergensi RSI dan teori fraktal. Keunggulan strategi ini terletak pada keandalan sinyal yang tinggi, kemampuan beradaptasi yang kuat, dan mekanisme pengendalian risiko yang lengkap. Melalui pengoptimalan dan perbaikan berkelanjutan, strategi ini diharapkan dapat mempertahankan kinerja yang stabil di berbagai lingkungan pasar. Disarankan agar saat menerapkan secara real-time, parameter harus diuji sepenuhnya dan dioptimalkan berdasarkan karakteristik pasar, dan langkah-langkah pengendalian risiko harus diterapkan secara ketat.

Kode Sumber Strategi
/*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!")