Ehlers Instantaneous Trendline Strategi

Penulis:ChaoZhang, Tanggal: 2023-12-20 16:51:05
Tag:

img

Gambaran umum

Strategi Ehlers Instantaneous Trendline diusulkan oleh John Ehlers dalam bukunya Cybernetic Analysis for Stocks and Futures.

Logika Strategi

Inti dari strategi ini adalah menghitung Instantaneous Trendline (IT).

it := (a-((a*a)/4.0))*src+0.5*a*a*src[1]-(a-0.75*a*a)*src[2]+2*(1-a )*it[1]-(1-a )*(1-a )*it[2]

di mana src adalah harga, a adalah faktor pelemahan, default menjadi 0,07. Rumus ini adalah filter urutan kedua yang dapat meluruskan harga dan menghasilkan tren.

Indikator kunci lainnya adalah garis lag, yang dihitung dengan:

lag = 2.0 * it - nz(it[2])

Garis lag tertinggal satu bar dari garis IT. Ketika harga melintasi di atas garis lag, itu menandakan terobosan ke atas, pergi panjang. Ketika harga melintasi di bawah garis lag, itu menandakan terobosan ke bawah, pergi pendek.

Selain itu, strategi menetapkan perintah stop loss untuk mengendalikan risiko.

Analisis Keuntungan

Keuntungan dari strategi ini meliputi:

  1. Jalur TI secara efektif menyaring kebisingan dan meningkatkan kualitas sinyal
  2. Filter orde 2 memberikan lebih banyak fleksibilitas tuning dan ketahanan
  3. Garis lag menghindari whipsaws yang tidak perlu dalam tren
  4. Kontrol stop loss yang terintegrasi terhadap risiko pada tingkat yang telah ditentukan sebelumnya
  5. Struktur kode yang bersih, mudah dimengerti dan dimodifikasi

Analisis Risiko

Ada juga beberapa risiko dengan strategi ini:

  1. Penyesuaian parameter yang tidak benar dari jalur IT/lag dapat menghasilkan sinyal palsu
  2. Konfigurasi stop loss yang buruk dapat mengakibatkan stop out prematur atau oversized loss
  3. Frekuensi perdagangan yang tinggi mengarah pada biaya komisi akumulasi
  4. Waktu penyimpanan yang lama meningkatkan risiko pembesaran kerugian

Risiko ini dapat dikurangi dengan:

  1. Menerapkan pembelajaran mesin untuk optimasi parameter
  2. Menetapkan tingkat stop loss adaptif
  3. Mengurangi ukuran posisi untuk mengurangi frekuensi perdagangan
  4. Menggabungkan kerugian berhenti periode kepemilikan

Arahan Optimasi

Strategi ini dapat dioptimalkan lebih lanjut dalam aspek berikut:

  1. Dampak uji dari parameter filter yang berbeda untuk menemukan optimal
  2. Cobalah menggabungkan indikator lain untuk menyaring sinyal
  3. Meningkatkan logika masuk untuk ukuran selama tahap akselerasi tren
  4. Menetapkan stop loss adaptif berdasarkan volatilitas pasar
  5. Melakukan analisis deret waktu pada sesi dan frekuensi perdagangan

Kesimpulan

Secara keseluruhan, strategi Ehlers Instantaneous Trendline menggunakan indikator teknis untuk mengidentifikasi tren real-time di saham/future dan posisi terbuka ketika tren berbalik. Ini memiliki keuntungan penyaringan kebisingan yang efektif, tuning parameter yang tinggi, logika generasi sinyal yang jelas, dan pengendalian risiko yang terintegrasi. Dengan optimalisasi lebih lanjut pada pemilihan parameter, penyaringan sinyal, ukuran posisi dan penyaringan stop loss, strategi ini dapat mencapai kinerja yang lebih baik lagi. Struktur kode yang jelas juga membuatnya mudah dipahami dan dimodifikasi.


/*backtest
start: 2022-12-13 00:00:00
end: 2023-12-19 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Ehlers Instantaneous Trendline Strategy", shorttitle = "Ehlers Instantaneous Trendline Strategy", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 1, backtest_fill_limits_assumption = 1)
src = input(hl2, title="Source")
a = input(0.07, title="Alpha", step=0.01) 
fr = input(false, title="Fill Trend Region")
it = na
if (na(it[2]) or na(it[1]))
    it := (src + 2 * src[1] + src[2]) / 4.0
else
    it := (a-((a*a)/4.0))*src+0.5*a*a*src[1]-(a-0.75*a*a)*src[2]+2*(1-a )*it[1]-(1-a )*(1-a )*it[2]
lag = 2.0 * it - nz(it[2])
rngFrac = input(0.35)
revPct = input(0.015)
stopType = input(title="Stop type", defval = "stop-order", options = ["stop-order", "market-order", "None"])

diff = input(0.5, title = "Spread")
LongPrice(p) =>
    LongPrice = diff == 0 ? p : floor(p / diff) * diff

ShortPrice(p) =>
    ShortPrice = diff == 0 ? p : ceil(p / diff) * diff

strategy.cancel_all()
reverseTrade = false
if stopType == "market-order" 
    if  strategy.position_size > 0 and close < strategy.position_avg_price * (1 - revPct) 
        strategy.order("StopLoss open short", strategy.short, 2 * strategy.position_size, limit = close - 2 * diff)
        reverseTrade := true
    if  strategy.position_size < 0 and close > strategy.position_avg_price * (1 + revPct) 
        strategy.order("StopLoss open long", strategy.long, -2 * strategy.position_size, limit = close + 2 * diff)
        reverseTrade := true
    
if lag > it and not reverseTrade
    price = LongPrice(max(close - (high - low) * rngFrac, low))
    if strategy.position_size <= 0
        strategy.order("Open long", strategy.long, strategy.equity / price - strategy.position_size, limit = price)
        if stopType == "stop-order"
            strategy.order("StopLoss open long", strategy.short, 2 * strategy.equity / price, stop = ShortPrice(price * (1 - revPct)))
    else
        if stopType == "stop-order"
            strategy.order("StopLoss open short", strategy.short, 2 * strategy.position_size, stop = ShortPrice(strategy.position_avg_price * (1 - revPct)))
if lag < it and not reverseTrade
    price = ShortPrice(min(close - (high - low) * rngFrac, high))
    if strategy.position_size >= 0
        strategy.order("Open short", strategy.short, strategy.equity / price + strategy.position_size, limit = price)
        if stopType == "stop-order"
            strategy.order("StopLoss open short", strategy.long, 2 * strategy.equity / price, stop = LongPrice(price * (1 + revPct)))
    else
        if stopType == "stop-order"
            strategy.order("StopLoss open long", strategy.long, -2 * strategy.position_size, stop = LongPrice(strategy.position_avg_price * (1 + revPct)))


itPlot=plot(it, color=red, linewidth=1, title="Trend")
lagPlot=plot(lag, color=blue, linewidth=1, title="Trigger")
fill(itPlot, lagPlot, it < lag ? green : red,  transp=70)

// === Backtesting Dates ===
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(9, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testStartHour = input(0, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(14, "Backtest Stop Day")
testStopHour = input(14, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = testPeriodSwitch == true ? testPeriod() : true
// === /END
if not isPeriod
    strategy.cancel_all()
    strategy.close_all()

Lebih banyak