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.
Strategi ini didasarkan pada prinsip-prinsip berikut:
Gunakan harga tertinggi dan terendah dari periode tertentu (misalnya 20 lilin) untuk menentukan tren dan arah harga.
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.
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.
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.
Keuntungan dari strategi ini meliputi:
Logika strategi sederhana dan jelas, mudah dimengerti dan diterapkan.
Menggunakan ATR untuk menghitung stop loss adaptif dan mengambil tingkat keuntungan membantu ukuran posisi yang fleksibel dan pengendalian risiko.
Strategi breakout bagus untuk menangkap tren harga, yang mengarah pada pengembalian yang baik.
Stop loss trailer dapat menutup posisi tepat waktu, menghindari kerugian yang berlebihan.
Ini cocok untuk produk dengan tren yang jelas, seperti ETF dan saham.
Risiko dari strategi ini meliputi:
Lebih banyak sinyal palsu dan pembukaan terbalik dapat terjadi selama konsolidasi harga.
Penyesuaian parameter yang tidak tepat dapat menyebabkan tren harga hilang atau terlalu banyak perdagangan yang tidak perlu.
Nilai parameter yang ekstrim dapat mengakibatkan stop loss dan take profit yang terlalu agresif atau terlalu konservatif, yang mempengaruhi profitabilitas strategi.
Risiko yang mendasari ETF seperti risiko kebijakan dan premi juga dapat mempengaruhi kinerja strategi.
Solusi yang sesuai:
Strategi dapat dioptimalkan lebih lanjut dari aspek berikut:
Tambahkan indikator seperti rata-rata bergerak untuk menyaring sinyal palsu.
Mengembangkan modul optimasi parameter adaptif untuk menyesuaikan parameter otomatis untuk periode dan produk yang berbeda.
Mengadopsi model pembelajaran mesin untuk memprediksi harga tertinggi dan terendah lilin berikutnya untuk menentukan sinyal pecah.
Pertimbangkan volume perdagangan yang berlebihan untuk menghindari kebocoran palsu.
Mengoptimalkan ukuran posisi awal dan persentase alokasi secara adaptif untuk produk dan rezim pasar yang berbeda.
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, "#"))