Strategi perdagangan kuantitatif berdasarkan Ichimoku Kinko Hyo dan Average Directional Index


Tanggal Pembuatan: 2024-01-23 11:14:54 Akhirnya memodifikasi: 2024-01-23 11:14:54
menyalin: 0 Jumlah klik: 820
1
fokus pada
1617
Pengikut

Strategi perdagangan kuantitatif berdasarkan Ichimoku Kinko Hyo dan Average Directional Index

Ringkasan

Strategi ini digunakan untuk mengidentifikasi tren harga saham dan titik-titik resistensi pendukung yang penting dengan menggunakan indikator teknis yang menggabungkan tabel keseimbangan dan indeks arah rata-rata ((ADX) untuk mengirim sinyal beli dan jual. Strategi ini bertujuan untuk menangkap fluktuasi harga yang lebih besar dalam situasi yang sedang tren.

Prinsip Strategi

Tabel keseimbangan pertama terdiri dari tiga garis bergerak rata-rata garis konversi sebelumnya, garis acuan dan garis keterlambatan. Ketika harga naik melewati garis konversi sebelumnya dan garis acuan, sinyal beli dikirim; Ketika harga turun melewati kedua garis ini, sinyal jual dikirim. Selain itu, tabel keseimbangan pertama juga mengidentifikasi area resistensi dukungan penting melalui grafik awan.

ADX digunakan untuk menentukan kekuatan tren harga. Ketika + DI dan - DI jelas terpisah, menunjukkan tren; Ketika + DI dan - DI dekat, menunjukkan pergerakan konsolidasi. Strategi ini hanya mengirimkan sinyal perdagangan ketika ADX lebih besar dari 20, untuk menghindari menangkap terobosan palsu pada periode konsolidasi.

Pengertian tren dari tabel keseimbangan pertama dan penyaringan ADX terhadap kekuatan tren dapat secara efektif mengidentifikasi segmen pasar tren dengan fluktuasi harga yang lebih besar.

Keunggulan Strategis

  • Menggunakan kombinasi dari dua indikator untuk membuat sinyal perdagangan lebih dapat diandalkan
  • Penggunaan ADX menghindari kesalahan transaksi dalam menyusun situasi
  • Hasil yang lebih baik, risiko yang lebih tinggi

Analisis risiko

  • Strategi ini lebih cocok untuk saham yang sedang tren, dan mungkin tidak banyak sinyal untuk saham yang bertolak belakang
  • Pada awalnya, neraca itu sendiri memiliki masalah dengan keterlambatan respons, yang mungkin kehilangan kesempatan untuk berbalik dengan cepat.
  • Pertimbangan ADX untuk menyusun laporan tidak sempurna, dan masih ada kemungkinan kesalahan penilaian

Arah optimasi

  • Kombinasi parameter yang berbeda dapat diuji, seperti penyesuaian siklus garis konversi, garis acuan
  • Optimasi lebih lanjut dapat dilakukan dengan menggabungkan indikator lain seperti MACD, KD, dan lain-lain
  • Peraturan atau kondisi penyaringan ADX yang berbeda dapat dipelajari

Meringkaskan

Strategi ini memungkinkan untuk menangkap tren dengan efektif melalui kombinasi yang efektif dari tabel keseimbangan dan ADX. Strategi ini dapat memperoleh umpan balik yang lebih baik dan kinerja real-time berdasarkan pengoptimalan parameter dan aturan lebih lanjut. Strategi ini cocok untuk investor strategi yang berdagang saham tren.

Kode Sumber Strategi
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-10 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Ichimoku + ADX", shorttitle="Ichimoku & ADX Backtest", overlay=true)

//------------------------------
//------------------------------
// ICHIMOKU
//------------------------------
//------------------------------

conversionPeriods = input(9, minval=1, title="Conversion Line Periods"),
basePeriods = input(26, minval=1, title="Base Line Periods")
laggingSpan2Periods = input(52, minval=1, title="Lagging Span 2 Periods"),
displacement = input(26, minval=1, title="Displacement")

donchian(len) => avg(lowest(len), highest(len))

Tenkan = donchian(conversionPeriods)
Kijun = donchian(basePeriods)
SSA = avg(Tenkan, Kijun)
SSB = donchian(laggingSpan2Periods)

SSAdisp = SSA[displacement]
SSBdisp = SSB[displacement]

// Plot Ichimoku
// --------------------

plot(Tenkan, color=color.red, title="Tenkan")
plot(Kijun, color=color.blue, title="Kijun")
plot(close, offset = -displacement + 1, color=#459915, title="Chikou")


p1 = plot(SSA, offset = displacement - 1, color=color.green,
 title="Senkou A")
p2 = plot(SSB, offset = displacement - 1, color=color.red, 
 title="Senkou B")
fill(p1, p2, color = SSA > SSB ? color.green : color.red)

//------------------------------
//------------------------------
// ADX
//------------------------------
//------------------------------

adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Length")
keyLevel = input(23, title="key level for ADX")
dirmov(len) =>
	up = change(high)
	down = -change(low)
	truerange = rma(tr, len)
	plus = fixnan(100 * rma(up > down and up > 0 ? up : 0, len) / truerange)
	minus = fixnan(100 * rma(down > up and down > 0 ? down : 0, len) / truerange)
	[plus, minus]

adx(dilen, adxlen) => 
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
	[adx, plus, minus]

[sig, up, down] = adx(dilen, adxlen)

// Plot ADX
// --------------------

//plot(sig, color=color.black, title="ADX")
//plot(up, color=color.green, title="+DI",linewidth=2, style=plot.style_columns, transp=40)
//plot(down, color=color.red, title="-DI",linewidth=2, style=plot.style_columns, transp=40)
//plot(keyLevel, color=color.white, title="Key Level")



//------------------------------
//------------------------------
// STRATEGY
//------------------------------
//------------------------------

// Buy & Sell Signals
// --------------------

// ADX
ABuy1 = up > keyLevel and up - down >5 and sig > down and sig < keyLevel * 2
ASell1 = down > keyLevel and down - up >5 and sig > up and sig < keyLevel * 2


// ICHIMOKU

Bull = close >= max(SSAdisp, SSBdisp)
Bear = close <= min(SSAdisp, SSBdisp)

//  1. Bull
Buy1 = (close >= max(SSAdisp, SSBdisp)) ? 1 : 0
Buy2 = (Tenkan - Kijun >= 0.001) ? 1 : 0
Buy3 = SSA > SSB ? 1 : 0
Buy4 = sig > 20 ? 1 : 0
Buy4a = close - close[displacement] >=0.001 ? 1:0
Buy5 = Buy1 and Buy2 and Buy3 and Buy4 and Buy4a and not(Buy1[1] and Buy2[1] and Buy3[1])

//  1. Bear
Sell1 = (close <= min(SSAdisp, SSBdisp)) ? 1 : 0
Sell2 = (Kijun - Tenkan >= 0.001) ? 1 : 0
Sell3 = SSA < SSB ? 1 : 0
Sell4 = sig > 20 ? 1 : 0
Sell4a = close <= close[displacement]
Sell5 = Sell1 and Sell2 and Sell3 and Sell4 and Sell4a and not(Sell1[1] and Sell2[1] and Sell3[1])


// CONSOLIDATED

buysignal = Buy5
buyexitsignal = crossunder(close,Kijun)

sellsignal = Sell5 
sellexitsignal = crossover(close,Kijun)    

longCondition = buysignal
shortCondition = sellsignal
    
// Plot Indicators
// --------------------

// ----- Buy & Sell

//plotshape(longCondition, title = "Buy Signal", text ="BUY", textcolor =#FFFFFF , style=shape.labelup, size = size.tiny, location=location.belowbar, color = #1B8112, transp = 0)
//plotshape(shortCondition, title = "Short Signal", text ="SHORT", textcolor =#FFFFFF , style=shape.labeldown, size = size.tiny, location=location.abovebar, color = #000000, transp = 0)

// ----- Ichimoku Signals

//plotshape(Sell2, title = "Sell Signal", text ="Kumo Twist", textcolor =#FFFFFF , style=shape.labelup, size = size.tiny, location=location.top, color = color.black, transp = 0)
//plotshape(Sell3, title = "Sell Signal", text ="TK/KJ", textcolor =#FFFFFF , style=shape.labelup, size = size.tiny, location=location.bottom, color = color.black, transp = 0)

//plotshape(Buy4, title = "Buy Signal", text ="Kumo Twist", textcolor =#FFFFFF , style=shape.diamond, size = size.tiny, location=location.belowbar, color = color.blue, transp = 0)
//plotshape(Buy3, title = "Buy Signal", text ="TK/KJ", textcolor =#FFFFFF , style=shape.circle, size = size.tiny, location=location.abovebar, color = color.green, transp = 0)
//plotshape(Buy4, title = "Buy Signal", text ="TK/KJ", textcolor =#FFFFFF , style=shape.circle, size = size.tiny, location=location.belowbar, color = color.red, transp = 0)



//plotshape(buyexitsignal, title = "Buy Exit", style=shape.triangledown, size = size.tiny, location=location.abovebar, color = color.green, transp = 0)
//plotshape(sellexitsignal, title = "Buy Exit", style=shape.triangleup, size = size.tiny, location=location.belowbar, color = color.black, transp = 0)

//------------------------------
//------------------------------
// EXECUTION
//------------------------------
//------------------------------


// Test Range
// --------------------

// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 2, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2015, title = "From Year", minval = 2017)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)

// === FUNCTION EXAMPLE ===
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true // create function "within window of time"

// Orders
// --------------------


if longCondition
    strategy.entry("Buy", strategy.long, when=window())
    
if buyexitsignal 
    strategy.close("Buy")
    
if shortCondition
    strategy.entry("Sell", strategy.short, when=window())

if sellexitsignal
    strategy.close("Sell")