Strategi Dagangan Berdasarkan Bollinger Bands dan MACD

Penulis:ChaoZhang, Tarikh: 2023-12-20 15:55:18
Tag:

img

Ringkasan

Strategi ini menggabungkan Bollinger Bands dan penunjuk MACD untuk mengenal pasti peluang oversold dan pembalikan trend untuk perdagangan kuantitatif.

Logika Strategi

Strategi ini mula-mula mengira Bollinger Bands 20 hari, termasuk band tengah, band atas dan band bawah. Apabila harga menyentuh band bawah, ia menganggap pasaran terlalu laris. Pada ketika ini, menggabungkan dengan penunjuk MACD untuk menilai sama ada trend sedang berbalik. Jika histogram MACD melintasi di atas garis isyarat secara positif, ia menentukan akhir pusingan penurunan ini, yang sepadan dengan isyarat beli.

Secara khusus, menyentuh jalur isyarat melintasi histogram Bollinger dan MACD secara positif mencetuskan isyarat beli secara serentak.

Analisis Kelebihan

Strategi ini mengintegrasikan Bollinger Bands untuk menilai zon oversold dan MACD untuk menentukan isyarat pembalikan trend, merealisasikan harga masuk yang agak rendah.

Khususnya, kelebihan adalah:

  1. Menggabungkan zon oversold Bollinger Bands dan penunjuk MACD untuk mencapai titik kemasukan yang lebih baik
  2. Menggunakan penunjuk MACD untuk menentukan titik pembalikan trend, mengurangkan kebarangkalian pecah palsu
  3. Menggunakan kaedah stop loss/take profit untuk mengawal risiko secara berkesan

Analisis Risiko

Masih ada beberapa risiko terutamanya dalam aspek berikut:

  1. Kemungkinan pecah Bollinger Bands wujud, yang boleh menyebabkan kegagalan dalam penilaian zon oversold
  2. Pembebasan histogram MACD juga boleh menjadi salah satu dengan kebarangkalian ralat pertimbangan
  3. Tetapan kedudukan stop loss mungkin tidak betul, terlalu longgar atau ketat, menyebabkan pertahanan yang tidak mencukupi atau stop loss yang lebih awal

Untuk lindungi diri daripada risiko di atas, kita boleh mengambil langkah-langkah berikut:

  1. Gabungkan dengan penunjuk lain untuk mengesahkan kesahihan isyarat pecah Bollinger Bands
  2. Tambah penunjuk momentum dan lain-lain sebagai penapis untuk mengelakkan persilangan palsu MACD
  3. Mengoptimumkan dan menguji parameter stop loss yang berbeza

Arahan pengoptimuman

Masih ada ruang untuk pengoptimuman lanjut, terutamanya termasuk:

  1. Mengoptimumkan parameter Bollinger Bands untuk mencari skim penilaian oversold yang lebih baik
  2. Tambah penapis penunjuk momentum untuk meningkatkan kesahihan penilaian MACD
  3. Uji kaedah hentian kehilangan seperti ATR untuk mencari parameter yang lebih baik
  4. Tambah modul penilaian trend untuk mengelakkan perdagangan kontra trend
  5. Menggabungkan kaedah pembelajaran mesin untuk melatih model penilaian dan meningkatkan prestasi keseluruhan strategi

Kesimpulan

Strategi ini mengintegrasikan penghakiman zon oversold Bollinger Bands dan penunjuk pembalikan trend MACD untuk mencapai titik masuk yang agak lebih baik. Ia juga menetapkan kaedah stop loss / mengambil keuntungan untuk mengawal risiko. Ini adalah strategi jual tinggi yang bernilai rendah untuk rujukan dan pengoptimuman. Digabungkan dengan lebih banyak penapis penunjuk dan kaedah pembelajaran mesin, masih ada ruang untuk meningkatkan prestasi.


/*backtest
start: 2023-11-19 00:00:00
end: 2023-12-19 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/
// © DojiEmoji

//@version=4
strategy("[KL] BOLL + MACD Strategy v2 (published)",overlay=true)

// BOLL bands {
BOLL_length = 20
BOLL_src = close
BOLL_mult = 2.0
BOLL_basis = sma(BOLL_src, BOLL_length)
BOLL_dev = BOLL_mult * stdev(BOLL_src, BOLL_length)
BOLL_upper = BOLL_basis + BOLL_dev
BOLL_lower = BOLL_basis - BOLL_dev
BOLL_offset = 0
plot(BOLL_basis, "Basis", color=#872323, offset = BOLL_offset)
BOLL_p1 = plot(BOLL_upper, "Upper", color=color.navy, offset = BOLL_offset, transp=50)
BOLL_p2 = plot(BOLL_lower, "Lower", color=color.navy, offset = BOLL_offset, transp=50)
fill(BOLL_p1, BOLL_p2, title = "Background", color=#198787, transp=85)
// }
// MACD signals {
MACD_fastLen = 12
MACD_slowLen = 26
MACD_Len = 9
MACD = ema(close, MACD_fastLen) - ema(close, MACD_slowLen)
aMACD = ema(MACD, MACD_Len)
MACD_delta = MACD - aMACD
// }
backtest_timeframe_start = input(defval = timestamp("01 Nov 2010 13:30 +0000"), title = "Backtest Start Time", type = input.time)
//backtest_timeframe_end = input(defval = timestamp("05 Mar 2021 19:30 +0000"), title = "Backtest End Time", type = input.time)
TARGET_PROFIT_MODE = input(false,title="Exit when Risk:Reward met")
REWARD_RATIO = input(3,title="Risk:[Reward] (i.e. 3) for exit")
// Trailing stop loss {
var entry_price = float(0)
ATR_multi_len = 26
ATR_multi = input(2, "ATR multiplier for stop loss")
ATR_buffer = atr(ATR_multi_len) * ATR_multi
risk_reward_buffer = (atr(ATR_multi_len) * ATR_multi) * REWARD_RATIO
take_profit_long = low > entry_price + risk_reward_buffer
take_profit_short = low < entry_price - risk_reward_buffer
var bar_count = 0 //number of bars since entry 
var trailing_SL_buffer = float(0)
var stop_loss_price = float(0)
stop_loss_price := max(stop_loss_price, close - trailing_SL_buffer)
// plot TSL line
trail_profit_line_color = color.green
if strategy.position_size == 0
    trail_profit_line_color := color.blue
    stop_loss_price := low
plot(stop_loss_price,color=trail_profit_line_color)
// } 

var touched_lower_bb = false

if true// and time <= backtest_timeframe_end
    if low <= BOLL_lower
        touched_lower_bb := true
    else if strategy.position_size > 0
        touched_lower_bb := false//reset state
    expected_rebound = MACD > MACD[1] and abs(MACD - aMACD) < abs(MACD[1] - aMACD[1])
    buy_condition = touched_lower_bb and MACD > aMACD or expected_rebound

    //ENTRY:
    if strategy.position_size == 0 and buy_condition
        entry_price := close
        trailing_SL_buffer := ATR_buffer
        stop_loss_price := close - ATR_buffer
        strategy.entry("Long",strategy.long, comment="buy")
        bar_count := 0
    else if strategy.position_size > 0
        bar_count := bar_count + 1

    //EXIT: 
    // Case (A) hits trailing stop
    if strategy.position_size > 0 and close <= stop_loss_price
        if close > entry_price
            strategy.close("Long", comment="take profit [trailing]")
            stop_loss_price := 0
        else if close <= entry_price and bar_count
            strategy.close("Long", comment="stop loss")
            stop_loss_price := 0
        bar_count := 0
    // Case (B) take targeted profit relative to risk 
    if strategy.position_size > 0 and TARGET_PROFIT_MODE
        if take_profit_long
            strategy.close("Long", comment="take profits [risk:reward]")
            stop_loss_price := 0
        bar_count := 0

Lebih lanjut