Strategi Trading ETF berbasis ATR dan Breakout

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

img

Gambaran umum

Ini adalah strategi perdagangan algoritmik ETF berdasarkan Average True Range (ATR) dan price breakout. Ini menggunakan ATR untuk menghitung stop loss dan take profit level, dan membuka posisi panjang atau pendek ketika harga melanggar harga tertinggi atau terendah dari periode tertentu.

Logika Strategi

Strategi ini didasarkan pada prinsip-prinsip berikut:

  1. Gunakan harga tertinggi dan terendah dari periode tertentu (misalnya 20 lilin) untuk menentukan tren dan arah harga.

  2. Menggunakan ATR untuk secara dinamis menghitung tingkat stop loss. Stop loss ditempatkan pada jarak nilai ATR dari periode ATR dikalikan dengan koefisien (misalnya 2) dari harga masuk.

  3. Menggunakan ATR untuk menentukan tingkat mengambil keuntungan. mengambil keuntungan ditempatkan pada jarak nilai ATR dari periode ATR dikalikan dengan koefisien (misalnya 1) dari harga masuk.

  4. Menggunakan ATR trailer multiplier untuk jejak stop loss. Tutup posisi dengan stop loss ketika harga memecahkan melalui trailer stop loss level ke arah arah yang tidak menguntungkan.

Strategi ini sederhana dan dapat diandalkan, karena mempertimbangkan kedua arah tren harga untuk menangkap pergerakan harga tepat waktu, dan menetapkan stop loss dan mengambil keuntungan untuk mengambil keuntungan dan pengendalian risiko.

Analisis Keuntungan

Keuntungan dari strategi ini meliputi:

  1. Logika strategi sederhana dan jelas, mudah dimengerti dan diterapkan.

  2. Menggunakan ATR untuk menghitung stop loss adaptif dan mengambil tingkat keuntungan membantu ukuran posisi yang fleksibel dan pengendalian risiko.

  3. Strategi breakout bagus untuk menangkap tren harga, yang mengarah pada pengembalian yang baik.

  4. Stop loss trailer dapat menutup posisi tepat waktu, menghindari kerugian yang berlebihan.

  5. Ini cocok untuk produk dengan tren yang jelas, seperti ETF dan saham.

Analisis Risiko

Risiko dari strategi ini meliputi:

  1. Lebih banyak sinyal palsu dan pembukaan terbalik dapat terjadi selama konsolidasi harga.

  2. Penyesuaian parameter yang tidak tepat dapat menyebabkan tren harga hilang atau terlalu banyak perdagangan yang tidak perlu.

  3. Nilai parameter yang ekstrim dapat mengakibatkan stop loss dan take profit yang terlalu agresif atau terlalu konservatif, yang mempengaruhi profitabilitas strategi.

  4. Risiko yang mendasari ETF seperti risiko kebijakan dan premi juga dapat mempengaruhi kinerja strategi.

Solusi yang sesuai:

  1. Mengoptimalkan parameter untuk mengurangi perdagangan yang tidak perlu.
  2. Tambahkan lebih banyak faktor dan filter untuk mengkonfirmasi sinyal perdagangan.
  3. Sesuaikan parameter sesuai dengan pasar yang berbeda.
  4. Mendiversifikasi investasi dan ukuran posisi kontrol dari satu ETF.

Arahan Optimasi

Strategi dapat dioptimalkan lebih lanjut dari aspek berikut:

  1. Tambahkan indikator seperti rata-rata bergerak untuk menyaring sinyal palsu.

  2. Mengembangkan modul optimasi parameter adaptif untuk menyesuaikan parameter otomatis untuk periode dan produk yang berbeda.

  3. Mengadopsi model pembelajaran mesin untuk memprediksi harga tertinggi dan terendah lilin berikutnya untuk menentukan sinyal pecah.

  4. Pertimbangkan volume perdagangan yang berlebihan untuk menghindari kebocoran palsu.

  5. Mengoptimalkan ukuran posisi awal dan persentase alokasi secara adaptif untuk produk dan rezim pasar yang berbeda.

Kesimpulan

Strategi ini memiliki logika yang jelas dan sederhana. Mekanisme inti dari breakout dan adaptif ATR stop loss / take profit dapat secara efektif mengendalikan risiko dan mengunci keuntungan. Lebih lanjut meningkatkan faktor keuntungan dan kemampuan kontrol risiko melalui optimasi parameter dan mengintegrasikan lebih banyak filter dapat membuatnya menjadi strategi kuantitatif yang menguntungkan dan dapat dioptimalkan.


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