Bollinger Bands (ボリンジャー・バンド) 指標に基づくトレンドフォロー戦略である.トレンド方向を決定し,対応するポジションを開くためにボリンジャー・バンド上部および下部帯のブレイクアウトを使用する.価格が下がり始めると,ポジションを終了し利益を得るために動的スペース付きのストップロスを使用する.
戦略はトレンド方向を決定するためにボリンジャーバンドを使用する.ボリンジャーバンドは,上部と下部バンドを形成するために価格の標準偏差を計算することによって構築される.価格が上部バンドを突破すると,上昇傾向の開始を示します.価格が下部バンドを突破すると,ダウントレンドの開始を示します.
具体的な取引論理は:
ボリンジャー・バンドの中部,上部,下部帯を計算する.
価格が上位帯を突破したら,ロング,下位帯を突破したらショート.
リスクをコントロールし,価格が下がり始めると退場します.
価格が再び帯を突破すると 再びトレンドに入ります
傾向を決定するためにボリンジャー帯を使用し,ダイナミック・トレリング・ストップ・ロストと組み合わせることで,リスクを効果的に制御できます.
この戦略の利点は以下の通りです.
シンプルで効果的です 簡単に効果的です
ブレイクエントリーとダイナミック・トライリング・ストップ・ロスの組み合わせは,トレンドキャッチとリスクコントロールを均衡させる.
シンプルで簡潔なコード構造で 分かりやすく修正できます
数少ないパラメータで 最適化が簡単です
異なる製品に適用可能で柔軟です
良いバックテストの結果,大きな利益の可能性.
主なリスクは以下のとおりです.
ボリンジャー・バンドは 統計にのみ依存し 曲線適合のリスクです
範囲の拡大と実際の傾向を区別するのが難しいので 判断に誤りがあるかもしれません
ストップロストポイントが狭すぎると 普通の振動で停止する危険があります
取引コストは考慮されません
バックテスト期間が限られていて オーバーフィットする危険性があります
解決策は次のとおりです
パラメータを最適化するか,信号検証のための他の指標を追加します.
振動とチャネルの識別を改善する
停止損失を動的に調整する.
割引額と 滑り込みコストを足す
バックテスト期間を拡大し 多市場検証
戦略を最適化するには
異なる指標の組み合わせ効果をテストする
傾向の振動の識別を改善する.
ダイナミックパラメータ最適化のための機械学習を導入します
バックテスト結果に基づいてストップ損失戦略を最適化します
取引コストの評価と追加
最適な設定のためのパラメータ空間最適化
ポジションリスクの管理にマネーマネジメントを追加する
この戦略はボリンジャーバンドでトレンド方向を決定し,ストップロスの追跡でリスクを制御する.全体的な論理はシンプルで明確である.それは良いトレンドキャッチ能力を持っているが,より強力な技術指標を導入し,パラメータを最適化し,コストを追加し,改善することができる.全体的に,この戦略はシンプルで実践的なボリンジャーバンドベースのトレンドフォローアプローチを提供します.
/*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)