Strategi Perdagangan Kuantitatif SuperTrend untuk Bitcoin

Penulis:ChaoZhang, Tarikh: 2024-02-06 12:09:09
Tag:

img

Ringkasan

Ini adalah strategi perdagangan kuantitatif automatik untuk Bitcoin berdasarkan penunjuk SuperTrend. Ia menggunakan penunjuk SuperTrend untuk menentukan trend pasaran dan menggabungkan prinsip stop loss ATR untuk mengawal risiko, membolehkan perdagangan panjang dan pendek. Kelebihan terbesar strategi ini adalah nisbah risiko-balasan yang baik dan strategi stop loss yang boleh dipercayai, sesuai untuk memegang jangka pertengahan hingga panjang. Strategi ini boleh digunakan pada bursa arus perdana seperti Coinbase Pro menggunakan jangka masa 4 jam.

Prinsip Strategi

Strategi ini menggunakan penunjuk SuperTrend untuk menentukan arah trend pasaran. Ia pergi lama apabila penunjuk SuperTrend berubah dari trend menurun ke trend menaik, dan pergi pendek apabila penunjuk SuperTrend berubah dari trend menaik ke trend menurun.

Secara khusus, strategi ini mula-mula mengira tempoh ATR sebagai 14 bar, dan menentukan jarak stop loss untuk setiap perdagangan dengan mengalikannya dengan pengganda stop loss ATR (seperti 1.5x).

Selepas memasuki perdagangan, stop loss ditetapkan di atas atau di bawah stop loss ATR. Tahap keuntungan mengambil pertama dikira berdasarkan nisbah risiko-balasan, lalai kepada 0.75, yang bermaksud jarak mengambil keuntungan adalah 0.75x jarak kerugian berhenti. Apabila harga mencapai tahap keuntungan mengambil pertama, 50% kedudukan akan ditutup, dan kerugian berhenti dipindahkan ke harga masuk (break even) untuk mengunci keuntungan. Tahap keuntungan mengambil kedua terus menggunakan nisbah risiko-balasan 0.75. Jika harga mencapai kerugian berhenti, kedudukan yang tersisa akan ditutup dengan kerugian berhenti.

Dengan demikian, strategi ini memastikan risiko stop loss yang boleh dikawal sambil mengunci keuntungan melalui keuntungan mengambil separa, sesuai untuk strategi pelaburan jangka menengah hingga panjang.

Analisis Kelebihan

Kelebihan terbesar strategi ini adalah nisbah risiko-balasan yang baik, yang membolehkan pegangan jangka menengah hingga panjang.

  1. Menggunakan SuperTrend untuk menentukan trend pasaran, menapis bunyi pasaran dan menangkap trend utama.

  2. Pengesanan ATR dinamik kehilangan berhenti, kawalan yang boleh dipercayai kehilangan perdagangan tunggal.

  3. Mengambil keuntungan separa mengunci keuntungan, menghasilkan nisbah risiko-balasan yang tinggi.

  4. Memindahkan stop loss ke harga masuk selepas mencapai TP1 mengunci keuntungan dan meningkatkan kestabilan strategi.

  5. Logik yang sangat mudah, mudah difahami dan dilaksanakan, dengan ruang penyesuaian parameter yang besar.

  6. Berlaku pada bursa arus perdana menggunakan data intraday atau frekuensi tinggi, fleksibiliti yang tinggi.

Analisis Risiko

Strategi ini juga membawa beberapa risiko, terutamanya dalam bidang berikut:

  1. Risiko jurang gagal untuk mencetuskan stop loss, menghadapi kerugian besar.

  2. SuperTrend gagal menentukan trend yang betul, mengakibatkan isyarat perdagangan yang salah.

  3. Mengambil nisbah keuntungan terlalu tinggi, tidak dapat menunggang trend.

  4. Frekuensi perdagangan mungkin terlalu tinggi atau terlalu rendah.

Arahan pengoptimuman

Masih ada ruang yang besar untuk mengoptimumkan strategi ini, terutamanya dalam bidang berikut:

  1. Uji kaedah berhenti rugi ATR yang berbeza seperti ATR tetap, berhenti momentum, Bollinger stop loss dll.

  2. Mengoptimumkan parameter SuperTrend menggunakan algoritma berjalan ke hadapan atau genetik untuk parameter terbaik.

  3. Menambah lapisan kedua stop loss seperti saluran Donchian untuk membuat stop lebih boleh dipercayai.

  4. Uji nisbah keuntungan yang berbeza untuk mengambil keuntungan yang optimum berbanding penyeimbangan risiko.

  5. meneroka teknik pembelajaran mesin untuk kehilangan berhenti dinamik, penyesuaian kedudukan dan lain-lain

Kesimpulan

Ini adalah strategi kuantitatif berdasarkan SuperTrend untuk trend, berhenti dinamik ATR dan mengambil keuntungan separa. Ia mempunyai nisbah risiko-balasan yang seimbang, sesuai untuk perdagangan algo. Terdapat ruang yang cukup untuk mengoptimumkan parameter, berhenti kerugian, mengambil keuntungan 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))


Lebih lanjut