Ehlers Instantaneous Trendline Strategi

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

img

Ringkasan

Strategi Ehlers Instantaneous Trendline dicadangkan oleh John Ehlers dalam bukunya Analisis Cybernetic untuk Saham dan Berjangka. Ia menggunakan penunjuk teknikal untuk mengenal pasti trend masa nyata saham / berjangka dan kedudukan terbuka apabila trend berbalik.

Logika Strategi

Inti strategi ini adalah mengira 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 pelunturan, lalai kepada 0.07. Formula ini adalah penapis urutan kedua yang boleh melunturkan harga dan menjana trend.

Satu lagi penunjuk utama adalah garis lag, yang dikira oleh:

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

Apabila harga melintasi di atas garis lag, ia menandakan penembusan menaik, pergi panjang.

Di samping itu, strategi menetapkan perintah stop loss untuk mengawal risiko.

Analisis Kelebihan

Kelebihan strategi ini termasuk:

  1. Talian IT menapis bunyi bising dengan berkesan dan meningkatkan kualiti isyarat
  2. Penapis orde 2 memberikan lebih banyak fleksibiliti penyetel dan ketahanan
  3. Garis lag mengelakkan whipsaws yang tidak perlu dalam trend
  4. Pengendalian stop loss yang terintegrasi terhadap risiko pada tahap yang telah ditentukan
  5. Struktur kod yang bersih, mudah difahami dan diubah suai

Analisis Risiko

Terdapat juga beberapa risiko dengan strategi ini:

  1. Penyesuaian parameter yang tidak betul pada talian IT/lag boleh menghasilkan isyarat palsu
  2. Konfigurasi stop loss yang tidak betul boleh menyebabkan stop out awal atau kerugian yang terlalu besar
  3. Frekuensi dagangan yang tinggi membawa kepada bayaran komisen terkumpul
  4. Masa tahan lama meningkatkan risiko pembesaran kehilangan

Risiko ini boleh dikurangkan dengan:

  1. Menggunakan pembelajaran mesin untuk pengoptimuman parameter
  2. Menetapkan paras stop loss adaptif
  3. Mengurangkan saiz kedudukan untuk kekerapan perdagangan yang lebih rendah
  4. Mengandung kerugian berhenti tempoh pegangan

Arahan pengoptimuman

Strategi ini boleh dioptimumkan lagi dalam aspek berikut:

  1. Kesan ujian parameter penapis yang berbeza untuk mencari optimum
  2. Cuba menggabungkan penunjuk lain untuk menapis isyarat
  3. Meningkatkan logik kemasukan untuk ukuran semasa peringkat percepatan trend
  4. Menetapkan stop loss adaptif berdasarkan turun naik pasaran
  5. Melakukan analisis siri masa pada sesi dagangan dan kekerapan

Kesimpulan

Secara keseluruhan, strategi Ehlers Instantaneous Trendline menggunakan penunjuk teknikal untuk mengenal pasti trend masa nyata dalam saham / niaga hadapan dan kedudukan terbuka apabila trend berbalik. Ia mempunyai kelebihan penapisan bunyi yang berkesan, penyesuaian parameter yang tinggi, logik penjanaan isyarat yang jelas, dan kawalan risiko yang diperbadankan. Dengan pengoptimuman lebih lanjut pada pemilihan parameter, penapisan isyarat, ukuran kedudukan dan penyesuaian stop loss, strategi ini dapat mencapai prestasi yang lebih baik. Struktur kod yang jelas juga memudahkan untuk difahami dan diubah suai.


/*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 lanjut