Strategi dagangan kuantitatif berdasarkan Bollinger Bands dan MACD


Tarikh penciptaan: 2023-12-20 15:55:18 Akhirnya diubah suai: 2023-12-20 15:55:18
Salin: 0 Bilangan klik: 943
1
fokus pada
1621
Pengikut

Strategi dagangan kuantitatif berdasarkan Bollinger Bands dan MACD

Gambaran keseluruhan

Strategi ini menggabungkan Bollinger Bands dan MACD, menggunakan Bollinger Bands untuk menentukan peluang pasaran oversold dan MACD untuk menentukan trend reversal, untuk mencapai strategi perdagangan kuantitatif yang rendah dan tinggi. Nama strategi ditetapkan sebagai Bollinger Bands MACD Reversal Strategy.

Prinsip Strategi

Strategi ini pertama kali mengira 20 hari Brin band, termasuk rel tengah, rel atas dan rel bawah. Apabila harga menyentuh rel bawah, menganggap pasaran berada dalam keadaan oversold. Pada masa ini digabungkan dengan penunjuk MACD untuk menentukan sama ada trend berbalik, jika perbezaan nilai MACD melangkaui garis isyarat ke atas, maka ia dianggap sebagai akhir penurunan pusingan ini, yang sesuai adalah isyarat beli.

Khususnya, Brin menghasilkan isyarat beli apabila sentuhan bawah landasan dan MACD yang berbeza-beza diarahkan ke garisan isyarat pecah pada masa yang sama; ia menghasilkan isyarat berhenti apabila kenaikan harga penutupan melebihi titik henti.

Analisis kelebihan strategi

Strategi ini mengintegrasikan Brinband untuk menilai kawasan oversold dan MACD untuk menilai isyarat pembalikan trend, untuk mencapai harga beli yang lebih rendah. Pada masa yang sama, strategi ini menambah kaedah berhenti, yang dapat mengunci keuntungan dan mengelakkan kerugian.

Secara khusus, ia mempunyai kelebihan:

  1. Gabungan antara Blink Ultra dan MACD untuk mencapai titik pembelian yang lebih baik
  2. Menggunakan penunjuk MACD untuk menentukan titik pembalikan trend, mengurangkan kebarangkalian pecah palsu
  3. Menggunakan Stop Loss Stop Stop untuk mengawal risiko

Analisis risiko strategi

Strategi ini juga mempunyai beberapa risiko, yang tertumpu kepada beberapa aspek berikut:

  1. Kemungkinan Brin Belt dirobohkan, mungkin menyebabkan keputusan kawasan jual-beli tidak berkesan
  2. Penembusan MACD juga boleh menjadi penembusan palsu, untuk menentukan kebarangkalian kesilapan
  3. Penetapan kedudukan hentian yang tidak munasabah, mungkin terlalu longgar atau ketat, menyebabkan perlindungan yang tidak mencukupi atau hentian yang terlalu tajam

Langkah-langkah berikut boleh diambil untuk mengelakkan risiko tersebut:

  1. Gabungan dengan penunjuk lain yang mengesahkan keberkesanan isyarat penembusan Brin
  2. Meningkatkan penapis seperti penunjuk tenaga untuk mengelakkan penembusan palsu MACD
  3. Mengoptimumkan dan menguji pelbagai penyelesaian parameter

Arah pengoptimuman strategi

Terdapat ruang untuk pengoptimuman yang lebih lanjut dalam strategi ini, termasuk:

  1. Mengoptimumkan parameter Brin Belt untuk mencari penyelesaian yang lebih baik untuk menilai kawasan supermarket
  2. Meningkatkan penapis seperti penunjuk tenaga kuantitatif untuk meningkatkan kebolehgunaan penilaian MACD
  3. Uji cara stop loss untuk ATR dan sebagainya untuk mencari parameter yang lebih baik
  4. Menambah modul penilaian trend untuk mengelakkan dagangan berlawanan arah
  5. Model penilaian yang dilatih dengan kaedah pembelajaran mesin untuk meningkatkan keberkesanan keseluruhan strategi

ringkaskan

Strategi ini mengintegrasikan penghakiman Brin Belt Overbought Zone dan MACD Trend Reversal Indicator untuk mencapai pilihan tempat pembelian yang lebih baik. Pada masa yang sama, ia menyediakan kawalan risiko dengan cara menghentikan kerugian. Ini adalah strategi jual beli rendah yang bernilai dipelajari dan dioptimumkan.

Kod sumber strategi
/*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