Ini adalah strategi perdagangan kuantitatif otomatis untuk Bitcoin berdasarkan indikator SuperTrend. Ini menggunakan indikator SuperTrend untuk menentukan tren pasar dan menggabungkan prinsip stop loss ATR untuk mengendalikan risiko, memungkinkan perdagangan panjang dan pendek. Keuntungan terbesar dari strategi ini adalah rasio risiko-pahala yang baik dan strategi stop loss yang andal, cocok untuk kepemilikan jangka menengah hingga panjang. Strategi ini dapat diterapkan pada bursa utama seperti Coinbase Pro menggunakan kerangka waktu 4 jam.
Strategi ini menggunakan indikator SuperTrend untuk menentukan arah tren pasar. Ini pergi panjang ketika indikator SuperTrend berubah dari tren menurun ke tren naik, dan pergi pendek ketika indikator SuperTrend berubah dari tren naik ke tren turun.
Secara khusus, strategi ini terlebih dahulu menghitung periode ATR sebagai 14 bar, dan menentukan jarak stop loss untuk setiap perdagangan dengan mengalikannya dengan pengganda stop loss ATR (seperti 1.5x).
Setelah memasuki perdagangan, stop loss ditetapkan di atas atau di bawah stop loss ATR. Tingkat keuntungan pertama dihitung berdasarkan rasio risiko-pahala, secara default menjadi 0,75, yang berarti jarak mengambil keuntungan adalah 0,75x dari jarak stop loss. Ketika harga mencapai tingkat keuntungan pertama, 50% posisi akan ditutup, dan stop loss dipindahkan ke harga masuk (break even) untuk mengunci keuntungan. Tingkat keuntungan kedua terus menggunakan rasio risiko-pahala 0,75. Jika harga mencapai stop loss, posisi yang tersisa akan ditutup dengan stop loss.
Dengan demikian, strategi ini memastikan risiko stop loss yang dapat dikendalikan sambil mengunci keuntungan melalui keuntungan parsial, cocok untuk strategi investasi jangka menengah hingga panjang.
Keuntungan terbesar dari strategi ini adalah rasio risiko-manfaat yang baik, memungkinkan kepemilikan jangka menengah hingga panjang.
Menggunakan SuperTrend untuk menentukan tren pasar, menyaring kebisingan pasar dan menangkap tren utama.
Pelacakan ATR dinamis dari stop loss, mengontrol kerugian perdagangan tunggal secara andal.
Bagian mengambil keuntungan mengunci keuntungan, menghasilkan rasio risiko-manfaat yang tinggi.
Memindahkan stop loss ke harga masuk setelah mencapai TP1 mengunci keuntungan dan meningkatkan stabilitas strategi.
Logika yang sangat sederhana, mudah dimengerti dan diimplementasikan, dengan ruang pengaturan parameter yang besar.
Berlaku pada bursa arus utama yang menggunakan data intraday atau frekuensi tinggi, fleksibilitas tinggi.
Strategi ini juga membawa beberapa risiko, terutama di bidang berikut:
Risiko Gap gagal untuk memicu stop loss, menghadapi kerugian besar.
SuperTrend gagal untuk menentukan tren yang benar, mengakibatkan sinyal perdagangan yang salah.
Mengambil rasio keuntungan terlalu tinggi, tidak bisa naik tren. harus menyesuaikan berdasarkan pasar yang berbeda.
Frekuensi perdagangan mungkin terlalu tinggi atau terlalu rendah. Harus menemukan keseimbangan optimal dengan menyesuaikan parameter SuperTrend.
Masih banyak ruang untuk mengoptimalkan strategi ini, terutama di bidang berikut:
Uji metode stop loss ATR yang berbeda seperti ATR tetap, momentum stop, Bollinger stop loss dll.
Mengoptimalkan parameter SuperTrend menggunakan algoritma berjalan maju atau genetik untuk parameter terbaik.
Menambahkan lapisan kedua stop loss seperti Donchian Channels untuk membuat stop lebih dapat diandalkan.
Uji rasio profit take yang berbeda untuk profit take optimal versus risk balancing.
Jelajahi teknik pembelajaran mesin untuk stop loss dinamis, penyesuaian posisi dll.
Ini adalah strategi kuantitatif yang didasarkan pada SuperTrend untuk tren, stop dinamis ATR dan mengambil keuntungan parsial. Ini memiliki rasio risiko-pahala yang seimbang, cocok untuk perdagangan algo. Ada banyak ruang untuk mengoptimalkan parameter, stop loss, profit taking dll.
/*backtest start: 2024-01-06 00:00:00 end: 2024-02-05 00:00:00 period: 1h basePeriod: 15m 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/ // Developed by © StrategiesForEveryone //@version=5 strategy("SuperTrend Strategy for BTCUSD 4H", overlay=true, process_orders_on_close = true, initial_capital = 100, default_qty_type = strategy.cash, precision = 2, slippage = 50, commission_value = 0.03, backtest_fill_limits_assumption = 50) // ------ Date filter (obtained from ZenAndTheArtOfTrading) --------- initial_date = input(title="Initial date", defval=timestamp("10 Feb 2014 13:30 +0000"), group="Time filter", tooltip="Enter the start date and time of the strategy") final_date = input(title="Final date", defval=timestamp("01 Jan 2030 19:30 +0000"), group="Time filter", tooltip="Enter the end date and time of the strategy") dateFilter(int st, int et) => time >= st and time <= et colorDate = input.bool(defval=false, title="Date background", tooltip = "Add color to the period of time of the strategy tester") bgcolor(colorDate and dateFilter(initial_date, final_date) ? color.new(color.blue, transp=90) : na) // ------------ Super Trend ---------- atrPeriod = input(9, "ATR Length SuperTrend") factor = input.float(2.5, "Factor SuperTrend", step = 0.05) [supertrend, direction] = ta.supertrend(factor, atrPeriod) show_supertrend = input.bool(defval = false, title="Show supertrend ?", group = "Appearance") bodyMiddle = plot(show_supertrend ? ((open + close) / 2) : na, display=display.none) upTrend = plot(show_supertrend and direction < 0 ? supertrend : na, "Up Trend", color = color.green, style=plot.style_linebr) downTrend = plot(show_supertrend and direction > 0 ? supertrend : na, "Down Trend", color = color.red, style=plot.style_linebr) fill(bodyMiddle, upTrend, color.new(color.green, 90), fillgaps=false) fill(bodyMiddle, downTrend, color.new(color.red, 90), fillgaps=false) // ---------- Atr stop loss (obtained from garethyeo) source_atr = input(close, title='Source', group = "Atr stop loss", inline = "A") length_atr = input.int(14, minval=1, title='Period', group = "Atr stop loss" , inline = "A") multiplier = input.float(1.5, minval=0.1, step=0.1, title='Atr multiplier', group = "Atr stop loss", inline = "A", tooltip = "Defines the stop loss distance based on the Atr stop loss indicator") shortStopLoss = source_atr + ta.atr(length_atr) * multiplier longStopLoss = source_atr - ta.atr(length_atr) * multiplier show_atr_stoploss = input.bool(defval=false, title="Show Atr stop loss ?", group = "Appearance") plot(show_atr_stoploss ? longStopLoss : na, color=color.white, style = plot.style_circles) plot(show_atr_stoploss ? shortStopLoss : na, color=color.white, style = plot.style_circles) // ------------- Money management -------------- strategy_contracts = strategy.equity / close distance_sl_atr_long = -1 * (longStopLoss - close) / close distance_sl_atr_short = (shortStopLoss - close) / close risk = input.float(2.5, '% Account risk per trade', step=1, group = "Risk management for trades", tooltip = "Percentage of total account to risk per trade") long_amount = strategy_contracts * (risk / 100) / distance_sl_atr_long short_amount = strategy_contracts * (risk / 100) / distance_sl_atr_short // ---------- Risk management --------------- risk_reward_breakeven_long= input.float(title="Risk/reward for breakeven long", defval=0.75, step=0.05, group = "Risk management for trades") risk_reward_take_profit_long= input.float(title="Risk/reward for take profit long", defval=0.75, step=0.05, group = "Risk management for trades") risk_reward_breakeven_short= input.float(title="Risk/reward for break even short", defval=0.75, step=0.05, group = "Risk management for trades") risk_reward_take_profit_short= input.float(title="Risk/reward for take profit short", defval=0.75, step=0.05, group = "Risk management for trades") tp_percent=input.float(title="% of trade for first take profit", defval=50, step=5, group = "Risk management for trades", tooltip = "Closing percentage of the current position when the first take profit is reached.") // ------------ Trade conditions --------------- bought = strategy.position_size > 0 sold = strategy.position_size < 0 long_supertrend=ta.crossover(close, supertrend) short_supertrend=ta.crossunder(close, supertrend) var float sl_long = na var float sl_short = na var float be_long = na var float be_short = na var float tp_long = na var float tp_short = na if not bought sl_long:=na if not sold sl_short:=na // ---------- Strategy ----------- // Long position if not bought and long_supertrend sl_long:=longStopLoss long_stoploss_distance = close - longStopLoss be_long := close + long_stoploss_distance * risk_reward_breakeven_long tp_long:=close+(long_stoploss_distance*risk_reward_take_profit_long) strategy.entry('L', strategy.long, long_amount, alert_message = "Long") strategy.exit("Tp", "L", stop=sl_long, limit=tp_long, qty_percent=tp_percent) strategy.exit('Exit', 'L', stop=sl_long) if high > be_long sl_long := strategy.position_avg_price strategy.exit("Tp", "L", stop=sl_long, limit=tp_long, qty_percent=tp_percent) strategy.exit('Exit', 'L', stop=sl_long) if bought and short_supertrend strategy.close("L", comment="CL") // Short position if not sold and short_supertrend sl_short:=shortStopLoss short_stoploss_distance=shortStopLoss - close be_short:=((short_stoploss_distance*risk_reward_breakeven_short)-close)*-1 tp_short:=((short_stoploss_distance*risk_reward_take_profit_short)-close)*-1 strategy.entry("S", strategy.short, short_amount, alert_message = "Short") strategy.exit("Tp", "S", stop=sl_short, limit=tp_short, qty_percent=tp_percent) strategy.exit("Exit", "S", stop=sl_short) if low < be_short sl_short:=strategy.position_avg_price strategy.exit("Tp", "S", stop=sl_short, limit=tp_short, qty_percent=tp_percent) strategy.exit("Exit", "S", stop=sl_short) if sold and long_supertrend strategy.close("S", comment="CS") // ---------- Draw position on chart ------------- if high>tp_long tp_long:=na if low<tp_short tp_short:=na if high>be_long be_long:=na if low<be_short be_short:=na show_position_on_chart = input.bool(defval=true, title="Draw position on chart ?", group = "Appearance", tooltip = "Activate to graphically display profit, stop loss and break even") position_price = plot(show_position_on_chart? strategy.position_avg_price : na, style=plot.style_linebr, color = color.new(#ffffff, 10), linewidth = 1) sl_long_price = plot(show_position_on_chart and bought ? sl_long : na, style = plot.style_linebr, color = color.new(color.red, 10), linewidth = 1) sl_short_price = plot(show_position_on_chart and sold ? sl_short : na, style = plot.style_linebr, color = color.new(color.red, 10), linewidth = 1) tp_long_price = plot(strategy.position_size>0 and show_position_on_chart? tp_long : na, style = plot.style_linebr, color = color.new(#11eb47, 10), linewidth = 1) tp_short_price = plot(strategy.position_size<0 and show_position_on_chart? tp_short : na, style = plot.style_linebr, color = color.new(#11eb47, 10), linewidth = 1) breakeven_long = plot(strategy.position_size>0 and high<be_long and show_position_on_chart ? be_long : na , style = plot.style_linebr, color = color.new(#00ff40, 60), linewidth = 1) breakeven_short = plot(strategy.position_size<0 and low>be_short and show_position_on_chart ? be_short : na , style = plot.style_linebr, color = color.new(#00ff40, 60), linewidth = 1) position_profit_long = plot(bought and show_position_on_chart and strategy.openprofit>0 ? close : na, style = plot.style_linebr, color = color.new(#4cd350, 10), linewidth = 1) position_profit_short = plot(sold and show_position_on_chart and strategy.openprofit>0 ? close : na, style = plot.style_linebr, color = color.new(#4cd350, 10), linewidth = 1) fill(plot1 = position_price, plot2 = position_profit_long, color = color.new(color.green,90)) fill(plot1 = position_price, plot2 = position_profit_short, color = color.new(color.green,90)) fill(plot1 = position_price, plot2 = sl_long_price, color = color.new(color.red,90)) fill(plot1 = position_price, plot2 = sl_short_price, color = color.new(color.red,90)) fill(plot1 = position_price, plot2 = tp_long_price, color = color.new(color.green,90)) fill(plot1 = position_price, plot2 = tp_short_price, color = color.new(color.green,90))