ボリンジャー帯とMACDに基づく取引戦略

作者: リン・ハーンチャオチャン開催日:2023年12月20日 15:55:18
タグ:

img

概要

この戦略は,ボリンジャーバンドとMACD指標を組み合わせて,量的な取引のための過剰販売機会とトレンド逆転を特定します. 戦略名は"ボリンジャーMACD逆転戦略"です.

戦略の論理

この戦略は,まず中帯,上帯,下帯を含む20日間のボリンジャー帯を計算する.価格が下帯に触ると,市場が過売れていると考えられる.この時点で,トレンドが逆転しているかどうかを判断するためにMACD指標と組み合わせる.MACDヒストグラムがシグナルラインを正面に越えた場合,それは購入シグナルに対応するこの下降ラウンドの終わりを決定する.

特に,ボリンジャー下帯とMACDヒストグラムの交差信号線を触ると,同時に買い信号が有効に起動します. 閉じる価格がストップ・ロスのレベルを上回ると,利益の信号が起動します.

利点分析

この戦略は,過剰販売ゾーンとMACDを判断するためにボリンジャー帯と統合し,傾向逆転信号を決定し,比較的低いエントリー価格を実現する.また,利益をロックし損失を避けるために利益を取ることにも含まれます.

利点は特に以下の通りです.

  1. より良いエントリーポイントを達成するために,ボリンジャー・バンド超売りゾーンとMACD指標を組み合わせる
  2. トレンド逆転点を決定するためにMACD指標を使用し,誤ったブレイクの可能性を減らす
  3. リスクを効果的にコントロールするためにストップ・ロスト/収益採取方法を採用する

リスク分析

リスクは依然としてあるが 主に次の側面にある:

  1. ボリンジャー・バンドの突破の可能性があり,過剰販売ゾーン判断に失敗する可能性があります.
  2. MACDヒストグラムのクロスオーバーも誤りであり,判断誤差の確率がある可能性があります.
  3. ストップ損失ポジションの設定が不適切で,緩すぎたり,厳しくなり,防御が不十分またはストップ損失が早すぎる可能性があります.

上記のリスクに対して,以下のような対策を講じます.

  1. 他の指標と組み合わせて,ボリンジャー・バンドのブレイクアウト信号の有効性を検証する
  2. MACD の誤ったクロスオーバーを避けるためにフィルターとしてモメント インディケーター等を追加します
  3. ストップ・ロスのパラメータを最適化しテストする

オプティマイゼーションの方向性

さらに最適化できる余地があります.主に以下を挙げます.

  1. オーバーセールした判断のスキームを見つけるためにボリンガーバンドのパラメータを最適化
  2. MACD判断の有効性を改善するために動力指標フィルターを追加する
  3. より良いパラメータを見つけるためにATRのような停止損失方法をテスト
  4. 逆トレンド取引を避けるためにトレンド判断モジュールを追加する
  5. 判断モデルを訓練し,戦略の全体的なパフォーマンスを改善するために機械学習方法を組み合わせる

結論

この戦略は,比較的優れたエントリーポイントを達成するために,ボリンジャーバンドの過売りゾーン判断とMACDトレンド逆転指標を統合している.また,リスクを制御するためにストップ・ロスト/テイク・プロフィート方法を設定している.これは参照および最適化するための価値のある低買い高売り戦略である.より多くの指標フィルターと機械学習方法と組み合わせると,パフォーマンスをさらに改善する余地がある.


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

もっと