Strategi Ehlers Instantaneous Trendline diusulkan oleh John Ehlers dalam bukunya
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.
Keuntungan dari strategi ini meliputi:
Ada juga beberapa risiko dengan strategi ini:
Risiko ini dapat dikurangi dengan:
Strategi ini dapat dioptimalkan lebih lanjut dalam aspek berikut:
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()