Strategi perdagangan kuantitatif Bitcoin berdasarkan tren super


Tanggal Pembuatan: 2024-02-06 12:09:09 Akhirnya memodifikasi: 2024-02-06 12:09:09
menyalin: 2 Jumlah klik: 983
1
fokus pada
1617
Pengikut

Strategi perdagangan kuantitatif Bitcoin berdasarkan tren super

Ringkasan

Strategi ini adalah strategi perdagangan kuantitatif otomatis bitcoin berdasarkan indikator supertrend. Strategi ini menggunakan indikator supertrend untuk menilai tren pasar, dikombinasikan dengan ATR Stop Loss Principle Control Risk, untuk melakukan perdagangan dua arah dalam jangka panjang. Keuntungan terbesar dari strategi ini adalah rasio risiko dan keuntungan yang baik, strategi stop loss yang dapat diandalkan, cocok untuk jangka panjang.

Prinsip Strategi

Strategi ini menggunakan indikator supertrend untuk menentukan arah tren pasar. Bila indikator supertrend berubah dari tren menurun menjadi tren naik, masuklah dengan modal lebih besar; Bila indikator supertrend berubah dari tren naik ke tren menurun, masuklah dengan modal lebih kecil.

Secara khusus, strategi ini pertama-tama menghitung panjang indikator ATR 14 siklus, untuk menentukan jarak stop loss per unit dengan mengalikannya dengan ATR stop loss multiplier (misalnya 1,5 kali lipat). Kemudian menghitung indikator supertrend, parameter indikator dengan nilai default (ATR siklus 9, supertrend koefisien 2.5).

Setelah masuk, stop loss tetap di atas atau di bawah stop loss ATR. Stop loss pertama dihitung berdasarkan rasio risiko-reward, dengan asumsi 0,75, yaitu stop loss adalah 0,75 kali lipat dari stop loss. Ketika harga mencapai stop loss pertama, tutup 50% dari posisi, dan pindahkan stop loss ke harga bukaan posisi ((Peningkatan posisi setelah keuntungan), sehingga posisi tersebut terkunci. Stop loss kedua terus dihitung berdasarkan rasio risiko-reward 0,75.

Dengan demikian, strategi ini dapat memastikan keuntungan dengan menghentikan sebagian, dengan asumsi bahwa risiko stop loss dapat dikendalikan, sesuai dengan strategi investasi kepemilikan jangka panjang.

Analisis Keunggulan

Keuntungan terbesar dari strategi ini adalah rasio risiko-pengembalian yang baik, dapat dipegang dalam jangka panjang. Keuntungan spesifiknya adalah:

  1. Menggunakan supertrend untuk menilai tren pasar, memfilter kebisingan pasar, dan menghindari kehilangan tren utama.

  2. ATR secara dinamis melacak stop loss, dan dapat diandalkan untuk mengontrol kerugian tunggal.

  3. Beberapa metode penutupan mengunci keuntungan, risiko lebih tinggi daripada keuntungan.

  4. Ketika harga mencapai stop loss 1, penyesuaian stop loss ke harga bukaan posisi, memastikan keuntungan, meningkatkan stabilitas strategi.

  5. Logika transaksi yang sangat sederhana, mudah dipahami implementasi, parameter yang dapat disesuaikan.

  6. Dapat diterapkan pada data harian atau frekuensi tinggi di bursa utama, dan memiliki fleksibilitas yang kuat.

Analisis risiko

Strategi ini juga memiliki beberapa risiko, terutama yang berkaitan dengan:

  1. Kejadian pasar yang tiba-tiba menyebabkan gap atau lompatan, tidak dapat dihentikan, menghadapi kerugian yang lebih besar. Risiko dapat dikurangi dengan menyesuaikan ATR stop loss multiplier secara wajar.

  2. Perhitungan indikator supertrend gagal, menyebabkan kesalahan sinyal perdagangan. ATR dan kombinasi parameter supertrend dapat disesuaikan sesuai untuk dioptimalkan.

  3. Sebagian dari rasio posisi kosong ditetapkan terlalu tinggi untuk mendapatkan keuntungan tren yang cukup. Sejumlah rasio posisi kosong harus disesuaikan sesuai dengan pasar yang berbeda.

  4. Frekuensi perdagangan mungkin terlalu tinggi atau terlalu rendah. Parameter supertrend harus disesuaikan untuk menemukan keseimbangan optimal.

Arah optimasi

Ada banyak ruang untuk pengoptimalan dalam strategi ini, yang berfokus pada beberapa hal berikut:

  1. Cobalah berbagai metode ATR stop loss, seperti ATR standar, stop loss momentum, dan stop loss Brinks untuk mengoptimalkan strategi stop loss.

  2. Uji indikator supertrend untuk parameter yang berbeda untuk menemukan kombinasi optimal. Optimalisasi parameter multidimensi dapat dilakukan dengan menggunakan optimalisasi langkah demi langkah atau algoritma genetik.

  3. Cobalah untuk menumpuk stop loss dengan indikator stop loss tingkat dua, seperti saluran Donchian, untuk membuat stop loss lebih andal.

  4. Uji rasio setoran parsial yang berbeda untuk menemukan keseimbangan terbaik antara keuntungan dan risiko. Rasio setoran parsial juga dapat disesuaikan secara dinamis.

  5. Menjelajahi strategi yang didasarkan pada pembelajaran mesin, seperti stop loss dinamis, dan penyesuaian posisi dinamis.

Meringkaskan

Strategi ini adalah strategi kuantitatif yang didasarkan pada supertrend untuk menilai tren, ATR untuk stop loss, dan sebagian stop loss untuk profit. Strategi ini memiliki keseimbangan risiko dan keuntungan yang baik, cocok untuk perdagangan otomatis. Strategi ini dapat secara signifikan mengoptimalkan overbid, stop loss, dan profit.

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