Strategi perdagangan berdasarkan Bollinger Bands dan MACD

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

img

Gambaran umum

Strategi ini menggabungkan Bollinger Bands dan indikator MACD untuk mengidentifikasi peluang oversold dan pembalikan tren untuk perdagangan kuantitatif.

Logika Strategi

Strategi ini pertama-tama menghitung Bollinger Band 20 hari, termasuk band tengah, band atas dan band bawah. Ketika harga menyentuh band bawah, itu menganggap pasar oversold. Pada titik ini, menggabungkan dengan indikator MACD untuk menilai apakah tren sedang terbalik. Jika histogram MACD melintasi di atas garis sinyal secara positif, itu menentukan akhir putaran penurunan ini, yang sesuai dengan sinyal beli.

Secara khusus, menyentuh Bollinger lower band dan garis sinyal penyeberangan histogram MACD secara positif memicu sinyal beli secara bersamaan.

Analisis Keuntungan

Strategi ini mengintegrasikan Bollinger Bands untuk menilai zona oversold dan MACD untuk menentukan sinyal pembalikan tren, mewujudkan harga masuk yang relatif lebih rendah.

Khususnya, keuntungannya adalah:

  1. Menggabungkan Bollinger Bands zona oversold dan indikator MACD untuk mencapai titik masuk yang lebih baik
  2. Menggunakan indikator MACD untuk menentukan titik pembalikan tren, mengurangi kemungkinan pecah palsu
  3. Mengadopsi metode stop loss/take profit untuk mengontrol risiko secara efektif

Analisis Risiko

Masih ada beberapa risiko terutama dalam aspek berikut:

  1. Probabilitas Bollinger Bands breakout ada yang dapat menyebabkan kegagalan dalam penilaian zona oversold
  2. Crossover histogram MACD juga bisa salah satu dengan kemungkinan kesalahan penilaian
  3. Pengaturan posisi stop loss mungkin tidak tepat, terlalu longgar atau ketat, menyebabkan pertahanan yang tidak memadai atau stop loss prematur

Untuk melindungi diri dari risiko di atas, kita dapat mengambil langkah-langkah berikut:

  1. Kombinasi dengan indikator lain untuk memverifikasi validitas sinyal breakout Bollinger Bands
  2. Tambahkan indikator momentum dll sebagai filter untuk menghindari persilangan MACD palsu
  3. Mengoptimalkan dan menguji parameter stop loss yang berbeda

Arahan Optimasi

Masih ada ruang untuk optimasi lebih lanjut, terutama termasuk:

  1. Mengoptimalkan parameter Bollinger Bands untuk menemukan skema penilaian oversold yang lebih baik
  2. Tambahkan filter indikator momentum untuk meningkatkan validitas penilaian MACD
  3. Uji metode stop loss seperti ATR untuk menemukan parameter yang lebih baik
  4. Tambahkan modul penilaian tren untuk menghindari perdagangan kontra-tren
  5. Menggabungkan metode pembelajaran mesin untuk melatih model penilaian dan meningkatkan kinerja strategi secara keseluruhan

Kesimpulan

Strategi ini mengintegrasikan penilaian zona oversold Bollinger Bands dan indikator pembalikan tren MACD untuk mencapai titik masuk yang relatif lebih baik. Ini juga menetapkan metode stop loss / take profit untuk mengendalikan risiko. Ini adalah strategi jual tinggi beli rendah yang bermanfaat untuk referensi dan dioptimalkan. Dikombinasikan dengan lebih banyak filter indikator dan metode pembelajaran mesin, masih ada ruang untuk meningkatkan kinerjanya.


/*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 banyak