ボリンジャーバンドブレイクアウトトレンドフォロー戦略


作成日: 2023-09-22 14:31:17 最終変更日: 2023-09-22 14:31:17
コピー: 1 クリック数: 681
1
フォロー
1621
フォロワー

概要

この戦略は,ブリン帯の指標に基づくトレンド追跡戦略である.これは,ブリン帯の下落の突破を使用して,トレンドの方向を判断し,対応する方向のポジションを開きます.価格が下がり始めると,ダイナミックな間隔の追跡ストップを使用して,ポジションを退出し,利益を上げます.

戦略原則

この戦略は,ブリン帯の指標を用いてトレンドの方向を判断する.ブリン帯は,価格の標準差を計算して上下トレンドを構成する.価格が上下トレンドを突破すると,トレンドが上昇し始めると考えられる.価格が下下トレンドを突破すると,トレンドが下下トレンドを開始すると考えられる.

取引の論理は以下の通りです.

  1. ブリン帯の中軌,上軌,下軌を計算する.

  2. 価格が上線を突破すると,多項を開く.価格が下線を突破すると,空項を開く.

  3. ストップを追跡してリスクをコントロールし,価格が下がり始めるとストップを出す.

  4. ブルイン帯の軌道を突破し,再びトレンドに入ります.

ブリン帯を使ってトレンドの方向を判断し,ダイナミック・トラッキング・ストップ・ローズと連携することで,リスクを効果的に制御することができる.

優位分析

この戦略の利点は以下の通りです.

  1. ブルイン・バンド指数でトレンドを判断し,簡単で効果的です.

  2. トレンドキャプチャとリスク管理を兼ね備えた突破エントリーとダイナミック・トレーリングストップロスの組み合わせ.

  3. コード構造は明確で簡潔で,理解し,修正しやすい.

  4. パラメータが少ないので,最適化が容易です.

  5. 異なる品種に適応し,柔軟性がある.

  6. 検索結果も良好で,収益の余地も十分です.

リスク分析

この戦略の主なリスクは

  1. ブリン帯は,統計的特性にのみ基づき,曲線適合にリスクがある。

  2. 拡大と真のトレンドの区別がつかないことにより,誤った判断が起こりうる.

  3. ストップポイントは過密で,価格の通常の変動によって損なわれる可能性があります.

  4. 取引コストの影響は考慮されていません.

  5. 検知時間は限られていて,過適合の可能性もある.

解決策は

  1. パラメータを最適化するか,他の指標の検証信号を導入する.

  2. 振動と通路の認識を向上させる

  3. ATRなどの指標に基づいてストップポイントを動的に調整する.

  4. 追加手数料,スライドポイントの計算

  5. テストの時間帯を拡大し,多市場検証を行う.

最適化の方向

この戦略は以下の点で最適化できます.

  1. 異なる指標の組み合わせをテストする.

  2. 傾向の変動を認識する能力の向上

  3. 機械学習方法の動的最適化パラメータを導入する.

  4. 分析により,ストップ・ローズ戦略を最適化します.

  5. 取引コストの影響を評価し追加する.

  6. パラメータ空間を最適化して,最適のパラメータを探します.

  7. ポジションのリスクをコントロールするためのマネーマネジメントの強化

要約する

この戦略はブリン帯の指標によってトレンドの方向を判断し,ストップロスを追跡してリスクを制御する.全体的な取引ロジックはシンプルで明確である.この戦略は良好なトレンドキャプチャ効果を持っていますが,より多くの技術指標,最適化パラメータ,コスト計算などの導入によって改善され,戦略をより安定して信頼できます.全体的に,この戦略は,ブリン帯に基づく簡単な実用的なトレンド追跡取引理念を提供します.

ストラテジーソースコード
/*backtest
start: 2022-09-15 00:00:00
end: 2023-09-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Bollinger Band Breakout", shorttitle = "BB Strategy",initial_capital=1000, default_qty_type = strategy.percent_of_equity, default_qty_value = 10, commission_type = strategy.commission.percent, commission_value = 0.3, max_bars_back = 1000, overlay=true)

// Inputs //

sma = input(20,  minval=1)
mult   = input(1.2, minval=0.001, maxval=50)
src = input(close)

// alert msg  //

message_long_entry  = input("long entry")
message_short_entry = input("short entry")

// Calculations //

basis = sma(close, sma)
dev   = mult * stdev(close, sma)

upper = basis + dev
lower = basis - dev

// Backtest //
fromyear = input(2019, defval = 2019, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(1, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

leverage = input(1, "Leverage")

term = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))

// PLOT //

plot(basis, color = color.gray,  linewidth = 2)
lu = plot(upper, color = color.green, linewidth = 2)
ll = plot(lower, color = color.red,   linewidth = 2)

fill(lu, ll, color = color.gray)

// Signals //

long  = crossover(close, upper)
short = crossunder(close, lower)

// Strategy entry //
strategy.initial_capital = 50000
if (long and term)
    strategy.entry("long",  strategy.long, qty=strategy.initial_capital/close*leverage, when = long and barstate.isconfirmed, alert_message = message_long_entry)
    
if (short and term)
    strategy.entry("short",  strategy.short, qty=strategy.initial_capital/close*leverage, when = short and barstate.isconfirmed, alert_message = message_short_entry)

// strategy exit //

strategy.exit("long tsl", "long", loss = close*0.075 / syminfo.mintick, trail_points = close*0.05 / syminfo.mintick, trail_offset = close*0.005 / syminfo.mintick)
strategy.exit("short tsl", "short", loss = close*0.075 / syminfo.mintick, trail_points = close*0.05 / syminfo.mintick, trail_offset = close*0.005 / syminfo.mintick)