Strategi Perdagangan ETF berasaskan ATR dan Breakout

Penulis:ChaoZhang, Tarikh: 2023-12-26 16:05:55
Tag:

img

Ringkasan

Ini adalah strategi perdagangan algoritma ETF berdasarkan Julat Benar Purata (ATR) dan harga pecah. Ia menggunakan ATR untuk mengira stop loss dan mengambil tahap keuntungan, dan membuka kedudukan panjang atau pendek apabila harga memecahkan harga tertinggi atau terendah dalam tempoh tertentu.

Logika Strategi

Strategi ini berdasarkan prinsip-prinsip berikut:

  1. Gunakan harga tertinggi dan terendah dalam tempoh tertentu (contohnya 20 lilin) untuk menentukan trend dan arah harga.

  2. Menggunakan ATR untuk mengira tahap stop loss secara dinamik. Stop loss diletakkan pada jarak nilai ATR tempoh ATR didarabkan dengan pekali (contohnya 2) dari harga masuk.

  3. Menggunakan ATR untuk menentukan tahap mengambil keuntungan. mengambil keuntungan diletakkan pada jarak nilai ATR tempoh ATR dikalikan dengan pekali (contohnya 1) dari harga kemasukan.

  4. Menggunakan pengganda treler ATR untuk jejak stop loss. Tutup kedudukan dengan stop loss apabila harga memecahkan melalui tahap stop loss treler ke arah yang tidak menguntungkan.

Strategi ini mudah dan boleh dipercayai, kerana ia mempertimbangkan kedua-dua arah trend harga untuk menangkap pergerakan harga tepat pada masanya, dan menetapkan stop loss dan mengambil keuntungan untuk mengambil keuntungan dan kawalan risiko.

Analisis Kelebihan

Kelebihan strategi ini termasuk:

  1. Logik strategi adalah mudah dan jelas, mudah difahami dan dilaksanakan.

  2. Menggunakan ATR untuk mengira tahap stop loss dan mengambil keuntungan adaptif membantu saiz kedudukan dan kawalan risiko yang fleksibel.

  3. Strategi breakout adalah baik untuk menangkap trend harga, membawa kepada pulangan yang baik.

  4. Stop loss treler boleh menutup kedudukan tepat pada masanya, mengelakkan kerugian yang berlebihan.

  5. Ia sesuai untuk produk dengan trend yang jelas, seperti ETF dan saham.

Analisis Risiko

Risiko strategi termasuk:

  1. Lebih banyak isyarat palsu dan pembukaan terbalik mungkin berlaku semasa penyatuan harga.

  2. Penyesuaian parameter yang tidak betul boleh menyebabkan trend harga hilang atau terlalu banyak perdagangan yang tidak perlu.

  3. Nilai parameter yang melampau boleh menyebabkan stop loss yang terlalu agresif atau terlalu konservatif dan mengambil keuntungan, mempengaruhi keuntungan strategi.

  4. Risiko yang mendasari ETF seperti risiko dasar dan premium juga boleh mempengaruhi prestasi strategi.

Penyelesaian yang sepadan:

  1. Mengoptimumkan parameter untuk mengurangkan perdagangan yang tidak perlu.
  2. Tambah lebih banyak faktor dan penapis untuk mengesahkan isyarat perdagangan.
  3. Sesuaikan parameter secara bersesuaian untuk pasaran yang berbeza.
  4. Membahagikan saiz pelaburan dan kedudukan kawalan satu ETF.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan lagi dari aspek berikut:

  1. Tambah penunjuk seperti purata bergerak untuk menapis isyarat palsu.

  2. Membangunkan modul pengoptimuman parameter adaptif untuk menyesuaikan parameter automatik untuk tempoh dan produk yang berbeza.

  3. Mengambil model pembelajaran mesin untuk meramalkan harga tertinggi dan terendah lilin seterusnya untuk menentukan isyarat pecah.

  4. Pertimbangkan lebihan jumlah dagangan untuk mengelakkan pecah palsu.

  5. Mengoptimumkan saiz kedudukan awal dan peratusan peruntukan yang sesuai untuk produk dan rejimen pasaran yang berbeza.

Kesimpulan

Strategi ini mempunyai logik yang jelas dan mudah. Mekanisme teras pecah dan adaptif ATR stop loss / mengambil keuntungan dapat mengawal risiko dengan berkesan dan mengunci keuntungan. Meningkatkan lagi faktor keuntungan dan keupayaan kawalan risiko melalui pengoptimuman parameter dan mengintegrasikan lebih banyak penapis dapat menjadikannya strategi kuantitatif yang menguntungkan dan dapat dioptimumkan.


/*backtest
start: 2023-12-18 00:00:00
end: 2023-12-21 03:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © FX_minds

//@version=4
strategy("ETF tradedr", overlay=true, pyramiding=100, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

//------------------------------ get user input
lookback                   = input(title="HH LL lookback", type=input.integer, defval=20)
ATR_periode                = input(title="ATR period", type=input.integer, defval=14)
ATR_SL_multiplier          = input(title="ATR SL multiplier", type=input.float, defval=2)
ATR_TP_multiplier          = input(title="ATR TP multiplier", type=input.float, defval=1)
trailing_SL_ATR_multiplier = input(title="ATR trailing SL multiplier", type=input.float, defval=3.5)
lookback_trailing_SL       = input(title="trailing SL lookback", type=input.integer, defval=4)
max_sequel_trades          = input(title="max sequel trades", type=input.float, defval=1)
trade_long                 = input(title= "trade long ?", type=input.bool, defval=true)
trade_short                = input(title= "trade short ?", type=input.bool, defval=false)

//------------------------------ determine entry conditions
long_condition   = barstate.isconfirmed and crossover(high, highest(high, lookback)[1])
short_condition  = barstate.isconfirmed and crossunder(low, lowest(low, lookback)[1])


//------------------------------ count open long trades
count_open_longs = 0
count_open_longs := nz(count_open_longs[1])

if (long_condition) 
    count_open_longs := count_open_longs +1
    //label.new(bar_index, low, tostring(count_open_longs, "#"), xloc.bar_index, yloc.belowbar, color.green, label.style_none, color.green, size.large)

if (short_condition)
    count_open_longs := 0


//------------------------------ count open short trades
count_open_shorts = 0
count_open_shorts := nz(count_open_shorts[1])

if (short_condition)
    count_open_shorts := count_open_shorts +1
    //label.new(bar_index, low, tostring(count_open_shorts, "#"), xloc.bar_index, yloc.belowbar, color.red, label.style_none, color.red, size.large)

if (long_condition)
    count_open_shorts := 0


//------------------------------ calculate entryprice
entryprice_long = long_condition ? close : na
entryprice_short = short_condition ? close : na


//------------------------------ calculate SL & TP
SL_distance = atr(ATR_periode) * ATR_SL_multiplier
TP_distance  = atr(ATR_periode) * ATR_TP_multiplier
trailing_SL_distance = atr(ATR_periode) * trailing_SL_ATR_multiplier

SL_long = entryprice_long - SL_distance
SL_short = entryprice_short + SL_distance

trailing_SL_short = lowest(close, lookback_trailing_SL) + trailing_SL_distance
trailing_SL_long  = highest(close, lookback_trailing_SL) - trailing_SL_distance

trailing_SL_short_signal = crossover(high, trailing_SL_short[1])
trailing_SL_long_signal = crossunder(low, trailing_SL_long[1])


//------------------------------ plot entry price & SL  
plot(entryprice_long, style=plot.style_linebr, color=color.white)
plot(SL_long, style=plot.style_linebr, color=color.red)
plot(SL_short, style=plot.style_linebr, color=color.green)
plot(trailing_SL_short, style=plot.style_linebr, color=color.red)
plot(trailing_SL_long, style=plot.style_linebr, color=color.green)


//------------------------------ submit entry orders
if (long_condition) and (count_open_longs <= max_sequel_trades) and (trade_long == true)
    strategy.entry("Long" + tostring(count_open_longs, "#"), strategy.long)
    strategy.exit("SL Long"+ tostring(count_open_longs, "#"), 
     from_entry="Long" + tostring(count_open_longs, "#"), stop=SL_long)

if (short_condition) and (count_open_shorts <= max_sequel_trades) and (trade_short == true)
    strategy.entry("Short" + tostring(count_open_shorts, "#"), strategy.short)
    strategy.exit("SL Short" + tostring(count_open_shorts, "#"), 
     from_entry="Short" + tostring(count_open_shorts, "#"), stop=SL_short)
    

//------------------------------ submit exit conditions
if (trailing_SL_long_signal)
    strategy.close("Long" + tostring(count_open_longs, "#"))
    strategy.close("Long" + tostring(count_open_longs-1, "#"))
    strategy.close("Long" + tostring(count_open_longs-2, "#"))
    strategy.close("Long" + tostring(count_open_longs-4, "#"))
    strategy.close("Long" + tostring(count_open_longs-5, "#"))
    strategy.close("Long" + tostring(count_open_longs-6, "#"))
    strategy.close("Long" + tostring(count_open_longs-7, "#"))
    strategy.close("Long" + tostring(count_open_longs-8, "#"))
    strategy.close("Long" + tostring(count_open_longs-9, "#"))
    
if (trailing_SL_short_signal)
    strategy.close("Short" + tostring(count_open_shorts, "#"))
    strategy.close("Short" + tostring(count_open_shorts-1, "#"))
    strategy.close("Short" + tostring(count_open_shorts-2, "#"))
    strategy.close("Short" + tostring(count_open_shorts-3, "#"))
    strategy.close("Short" + tostring(count_open_shorts-4, "#"))
    strategy.close("Short" + tostring(count_open_shorts-5, "#"))
    strategy.close("Short" + tostring(count_open_shorts-6, "#"))
    strategy.close("Short" + tostring(count_open_shorts-7, "#"))
    strategy.close("Short" + tostring(count_open_shorts-8, "#"))
    strategy.close("Short" + tostring(count_open_shorts-9, "#"))



Lebih lanjut