Strategi Dagangan ETF Berdasarkan ATR dan Penembusan


Tarikh penciptaan: 2023-12-26 16:05:55 Akhirnya diubah suai: 2023-12-26 16:05:55
Salin: 2 Bilangan klik: 822
1
fokus pada
1623
Pengikut

Strategi Dagangan ETF Berdasarkan ATR dan Penembusan

Gambaran keseluruhan

Strategi ini adalah strategi perdagangan automatik ETF berdasarkan purata gelombang sebenar (ATR) dan harga yang pecah. Ia menggunakan ATR untuk mengira titik hentian dan berhenti, dan membuka kedudukan lebih banyak atau lebih rendah apabila harga memecahkan harga tertinggi atau terendah dalam tempoh tertentu.

Prinsip Strategi

Strategi ini berdasarkan kepada prinsip-prinsip berikut:

  1. Menggunakan harga tertinggi dan terendah untuk satu tempoh tertentu (seperti 20 K garis) untuk menentukan pergerakan dan arah harga. Apabila harga menembusi harga tertinggi kitaran, lakukan lebih banyak; apabila harga menembusi harga terendah kitaran, lakukan kosong.

  2. Menggunakan ATR secara dinamik untuk mengira stop loss. Jarak stop loss dari harga masuk adalah nilai ATR untuk satu kitaran ATR kalikan dengan faktor ((seperti 2)).

  3. Menggunakan ATR untuk mengira stop stop. Jarak stop stop dari harga masuk adalah satu ATR kitaran ATR yang dikalikan dengan faktor ((seperti 1)).

  4. Menggunakan ATRtrailer multi-faktor untuk mengesan hentian. Hentian setar apabila harga menembusi hentian trailer ke arah yang tidak baik.

Strategi ini mudah dan boleh dipercayai, mempertimbangkan arah trend harga, yang membantu menangkap trend harga tepat pada masanya; dan menetapkan stop loss dan stop loss, yang membantu menangkap peluang keuntungan dan mengawal risiko.

Analisis kelebihan

Strategi ini mempunyai kelebihan berikut:

  1. Strategi ini ringkas dan jelas, mudah difahami dan dilaksanakan.

  2. Dengan menggunakan ATR untuk mengira stop loss, anda boleh menyesuaikan saiz kedudukan secara dinamik, dan mengawal risiko dengan fleksibel.

  3. Strategi penilaian penembusan kitaran lebih mudah untuk menangkap trend harga, dan lebih baik untuk keuntungan.

  4. Trailer Stop boleh dihentikan tepat pada masanya, untuk mengelakkan risiko yang terlalu besar.

  5. Ia digunakan untuk varieti yang lebih jelas seperti ETF, saham dan sebagainya.

Analisis risiko

Strategi ini juga mempunyai risiko:

  1. Apabila harga bergoyang, lebih banyak isyarat salah dan penarikan balik boleh berlaku.

  2. Peraturan parameter kitaran yang tidak betul boleh menyebabkan kehilangan trend harga atau terlalu banyak perdagangan yang tidak menentu.

  3. Tetapan parameter faktor yang tidak betul boleh menyebabkan stop loss atau stop loss terlalu radikal atau konservatif, menjejaskan keuntungan.

  4. Risiko ETF sendiri, seperti risiko dasar, risiko premium, dan lain-lain juga memberi kesan kepada strategi.

Penyelesaian:

  1. Optimumkan parameter untuk mengurangkan kadar transaksi maya.
  2. Ia menggabungkan pelbagai faktor dan penapis untuk menentukan isyarat dagangan.
  3. Parameter penyesuaian mengikut pasaran yang berbeza.
  4. Pelaburan terdesentralisasi, mengawal kedudukan ETF tunggal.

Arah pengoptimuman

Strategi ini boleh dioptimumkan dengan cara berikut:

  1. Kaedah ini digunakan untuk menyaring isyarat palsu dengan menggunakan penunjuk seperti Moving Average.

  2. Tambah modul pengoptimuman parameter adaptasi untuk mengoptimumkan parameter secara automatik mengikut kitaran dan varieti yang berbeza.

  3. Menambah model pembelajaran mesin untuk meramalkan titik tertinggi dan terendah pada baris K seterusnya untuk menilai isyarat penembusan.

  4. Mengambil kira indikator seperti lebihan jumlah dagangan, dan mengelakkan penembusan palsu.

  5. Mengoptimumkan saiz dan perkadaran kedudukan, pelbagai jenis dan kesesuaian dengan keadaan pasaran.

ringkaskan

Strategi ini mempunyai konsep keseluruhan yang jelas dan ringkas, penembusan mekanisme teras dan ATR stop loss dinamik dapat mengawal risiko dan mengunci keuntungan dengan berkesan. Dengan mengoptimumkan parameter dan menggabungkan lebih banyak penapis indikator, anda dapat meningkatkan lagi faktor keuntungan strategi dan keupayaan kawalan risiko. Ini adalah strategi kuantitatif yang bernilai untuk dimulakan dan terus dioptimumkan.

Kod 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, "#"))