Handelsstrategie auf der Grundlage von Bollinger-Bändern und MACD

Schriftsteller:ChaoZhang, Datum: 20.12.2023
Tags:

img

Übersicht

Diese Strategie kombiniert Bollinger Bands und MACD-Indikator, um Überverkaufsmöglichkeiten und Trendumkehrungen für den quantitativen Handel zu identifizieren.

Strategie Logik

Die Strategie berechnet zunächst 20-tägige Bollinger-Bänder, einschließlich mittlerer Band, oberer Band und unterer Band. Wenn der Preis die untere Band berührt, betrachtet er den Markt als überverkauft. Zu diesem Zeitpunkt wird mit dem MACD-Indikator kombiniert, um zu beurteilen, ob sich der Trend umkehrt. Wenn das MACD-Histogramm über die Signallinie positiv kreuzt, bestimmt es das Ende dieser Runde des Rückgangs, die dem Kaufsignal entspricht.

Insbesondere durch Berühren des unteren Bollingerbands und des MACD-Histogramms, das die Signallinie kreuzt, wird gleichzeitig das Kaufsignal positiv ausgelöst.

Analyse der Vorteile

Die Strategie integriert Bollinger Bands, um die Überverkaufszone und den MACD zu beurteilen, um Trendumkehrsignale zu bestimmen und einen relativ niedrigeren Einstiegspreis zu realisieren.

Die Vorteile bestehen insbesondere darin:

  1. Kombination von Bollinger Bands Überverkaufszone und MACD-Indikator, um bessere Einstiegspunkte zu erreichen
  2. Verwendung des MACD-Indikators zur Ermittlung von Trendumkehrpunkten, was die Wahrscheinlichkeit eines falschen Ausbruchs verringert
  3. Einführung von Stop-Loss-/Take-Profit-Methoden zur wirksamen Risikokontrolle

Risikoanalyse

Es bestehen noch einige Risiken, hauptsächlich in den folgenden Bereichen:

  1. Es besteht die Wahrscheinlichkeit, dass Bollinger-Bänder ausbrechen, was bei der Beurteilung der Überverkaufszone zu einem Fehlschlag führen kann.
  2. Das MACD-Histogramm-Crossover könnte auch falsch sein.
  3. Die Einstellung der Stop-Loss-Position kann unsachgemäß sein, entweder zu locker oder zu streng, was zu einer unzureichenden Abwehr oder zu einem vorzeitigen Stop-Loss führt

Zur Absicherung gegen die oben genannten Risiken können wir folgende Maßnahmen ergreifen:

  1. Kombination mit anderen Indikatoren zur Überprüfung der Gültigkeit der Breakout-Signale der Bollinger Bands
  2. Hinzufügen von Impulsindikatoren usw. als Filter, um ein falsches MACD-Crossover zu vermeiden
  3. Optimieren und testen Sie verschiedene Stop-Loss-Parameter

Optimierungsrichtlinien

Es gibt noch Raum für weitere Optimierungen, insbesondere:

  1. Optimierung der Bollinger-Band-Parameter, um bessere Überverkaufssysteme zu finden
  2. Hinzufügen von Filtern für Momentumsindikatoren zur Verbesserung der Gültigkeit der MACD-Bewertung
  3. Test-Stopp-Verlustmethoden wie ATR, um bessere Parameter zu finden
  4. Hinzufügen eines Trendbeurteilungsmoduls zur Vermeidung von Gegentrendhandel
  5. Kombination von Methoden des maschinellen Lernens zur Ausbildung von Urteilsmodellen und Verbesserung der Gesamtstrategieleistung

Schlussfolgerung

Die Strategie integriert Bollinger Bands Überverkaufszone Urteil und MACD Trendumkehrindikator, um relativ bessere Einstiegspunkte zu erreichen. Es setzt auch Stop-Loss / Take-Profit-Methoden zur Kontrolle von Risiken. Dies ist eine lohnende Low Buy High Sell-Strategie zu referenzieren und zu optimieren. Kombiniert mit mehr Indikatorfiltern und maschinellen Lernmethoden, gibt es noch Raum für eine weitere Verbesserung seiner Leistung.


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

Mehr