Strategi Perdagangan ETF Berdasarkan ATR dan Breakout


Tanggal Pembuatan: 2023-12-26 16:05:55 Akhirnya memodifikasi: 2023-12-26 16:05:55
menyalin: 2 Jumlah klik: 822
1
fokus pada
1623
Pengikut

Strategi Perdagangan ETF Berdasarkan ATR dan Breakout

Ringkasan

Strategi ini adalah strategi perdagangan otomatis ETF yang didasarkan pada rata-rata real bandwidth (ATR) dan harga terobosan. Strategi ini menggunakan ATR untuk menghitung stop loss dan stop loss, dan melakukan over atau short position ketika harga melewati harga tertinggi atau terendah dalam periode tertentu.

Prinsip Strategi

Strategi ini didasarkan pada prinsip-prinsip berikut:

  1. Menggunakan harga tertinggi dan terendah untuk periode tertentu (seperti 20 garis K) untuk menentukan pergerakan dan arah harga. Ketika harga menembus harga tertinggi siklus, lakukan lebih banyak; Ketika harga menembus harga terendah siklus, lakukan lebih banyak.

  2. Menggunakan ATR untuk secara dinamis menghitung stop loss. Stop loss jarak dari harga masuk ATR nilai satu siklus ATR kali faktor ((seperti 2)

  3. Gunakan ATR untuk menghitung stop loss. Stop loss adalah nilai ATR dari harga masuk untuk satu siklus ATR dikalikan dengan faktor ((seperti 1)).

  4. Menggunakan ATRtrailer multi-faktor untuk melacak stop loss. Ketika harga ke arah yang tidak menguntungkan menembus stop loss trailer, stop loss posisi kosong.

Strategi ini sederhana dan dapat diandalkan, baik mempertimbangkan arah tren harga yang menguntungkan untuk menangkap tren harga pada waktu yang tepat; juga mengatur stop loss dan stop position yang menguntungkan untuk menangkap peluang keuntungan dan mengendalikan risiko.

Analisis Keunggulan

Strategi ini memiliki keuntungan sebagai berikut:

  1. Strategi ini sederhana, jelas, dan mudah dipahami dan diterapkan.

  2. Dengan menggunakan ATR untuk menghitung stop loss, Anda dapat secara dinamis menyesuaikan ukuran posisi, dan secara fleksibel mengontrol risiko.

  3. Strategi penarikan siklus lebih mudah untuk menangkap tren harga, dan lebih baik untuk keuntungan.

  4. Trailer stop dapat dihentikan pada waktu yang tepat untuk menghindari risiko yang terlalu besar.

  5. Ini berlaku untuk varietas yang lebih jelas tren, seperti ETF, saham, dll.

Analisis risiko

Strategi ini juga memiliki risiko sebagai berikut:

  1. Pada saat harga bergejolak, mungkin akan ada lebih banyak sinyal yang salah dan terbalik.

  2. Periode parameter yang tidak tepat dapat menyebabkan kehilangan tren harga atau terlalu banyak transaksi.

  3. Pengaturan parameter koefisien yang tidak tepat dapat menyebabkan stop loss atau stop loss yang terlalu radikal atau konservatif, yang mempengaruhi keuntungan.

  4. Risiko yang dimiliki oleh ETF sendiri, seperti risiko kebijakan, risiko premi, dan lain-lain, juga mempengaruhi strategi.

Solusi yang sesuai:

  1. Optimalkan parameter untuk mengurangi tingkat transaksi virtual.
  2. Kombinasi beberapa faktor dan filter untuk menentukan sinyal perdagangan.
  3. Parameter disesuaikan dengan pasar yang berbeda.
  4. Investasi terdesentralisasi, mengendalikan posisi ETF tunggal.

Arah optimasi

Strategi ini dapat dioptimalkan lebih lanjut dalam beberapa hal:

  1. Indikator seperti Moving Average dan lain-lain digunakan untuk memfilter sinyal palsu.

  2. Tambahkan modul optimasi parameter adaptasi, optimasi otomatis parameter sesuai dengan siklus dan varietas yang berbeda.

  3. Menambahkan model pembelajaran mesin untuk memprediksi titik tertinggi dan terendah pada garis K berikutnya untuk menilai sinyal penembusan.

  4. Pertimbangan indikator seperti volume transaksi yang berlebihan, pencegahan penembusan palsu.

  5. Optimalkan ukuran dan proporsi posisi, varietas yang berbeda dan adaptasi terhadap lingkungan pasar.

Meringkaskan

Strategi ini memiliki konsepsi yang jelas dan sederhana, dengan mekanisme inti yang terobosan dan ATR stop loss yang dinamis dapat secara efektif mengontrol risiko dan mengunci keuntungan. Dengan mengoptimalkan parameter dan menggabungkan lebih banyak indikator penyaringan, strategi dapat ditingkatkan lebih lanjut. Faktor keuntungan dan kemampuan pengendalian risiko adalah strategi kuantitatif yang layak untuk memulai dan terus dioptimalkan.

Kode Sumber Strategi
/*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, "#"))