Bollinger Bands (ボリンジャー・バンド) をベースとしたブレイクアウト戦略である.Bollinger Bandsの上下帯を活用してエントリーと出口のブレイクアウト信号を生成する.この戦略にはトレンド市場でのより高いリターンを達成するために,ストップ・ロスの追跡とピラミッドメカニズムも組み込まれている.
戦略はまずボリンジャーバンドの中帯,上帯,下帯を計算します.中帯は価格の移動平均線で,上帯と下帯は中帯+/-1標準偏差です.
価格が下帯を超えると,ロングシグナルが生成される.価格が上帯を下回ると,ショートシグナルが生成される.これは価格がボリンジャーバンド範囲を突破し,トレンド動きに入る可能性があることを示唆する.
また,戦略はボディブレイクアウトをチェックする. 閉じるがオープンよりも高く,ボディが特定の割合で中間帯に浸透すると,位置を平らにする. 閉じるがオープンよりも低く,ボディが特定の割合で中間帯に浸透すると,位置も平らにする. これは偽のブレイクアウトによる損失を回避する.
ポジションに入ると,ストップ・ロスはピラミッドをたどる.価格が有利な方向に動いていれば,ポジションサイズは利益の可能性を改善するために増加することができる.価格が逆転した場合,ストップ・ロスはリスクを制御するために使用される.
この戦略の利点は次のとおりです.
傾向の方向を決定し,ブレイクアウトを捉えるためにボリンジャー帯を使用します.この指標はシンプルで有効です.
身体と中間帯をチェックして 破裂の有効性を確認し 偽の破裂による損失を回避します
利益とリスクを制御するためにストップロスを使用します
トレンドの動きでより高いリターンを得るためにピラミッドを活用します
シンプルなパラメータが この戦略を簡単に実行できます
この戦略のリスクは以下のとおりです.
ボリンジャー・バンドのブレイクは 偽ブレイクを完全に避けることはできません 損失がいくつか起こる可能性があります
誤ったストップ・ロスの配置は,早速ストップ・アウトを引き起こすか,損失を制限できない可能性があります.
過剰なピラミッドの時間と大きさは 損失を増大させる可能性があります
トレンドが逆転するときに タイミングで停止しなければ 大幅な引き下げにつながる可能性があります
パラメータの最適化が不十分である場合,性能が低下する可能性があります.
過剰に適合するリスク 異なる市場での検証が必要です
戦略は以下の側面から改善できます.
より良い組み合わせを見つけるためにボリンジャー帯のパラメータをテストし最適化します
ストップロスの戦略をテストし,ストップロスの配置を最適化します
テストしてピラミッドの最適時間とサイズを見つけます
トレンドにピラミッド化しないように トレンドフィルターを追加します
身体の脱出論理を最適化して 偽脱出を減らす
市場状況に基づいて異なるパラメータセットを使用するために条件オーダーを追加します.
耐久性を高めるため,さまざまな製品と時間枠でより多くのバックテストを行います.
マシン学習を利用して パラメータを自動的に最適化します
概要すると,この戦略は,トレンド方向を決定し,ブレイアウトをキャッチするためにボリンジャーバンドを使用し,良い結果を達成するために追加のストップ損失,ピラミディング,その他の機能を使用します.しかし,リスクは存在し,パラメータの最適化,条件の追加などにより強度が向上します.技術分析に精通している投資家に適しており,トレンド市場で良いリターンを得ることができます.
/*backtest start: 2023-11-05 00:00:00 end: 2023-11-12 00:00:00 period: 30m basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2018 //@version=2 strategy("Noro's Bollinger Strategy v1.1", shorttitle = "Bollinger str 1.1", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 5) //Settings needlong = input(true, defval = true, title = "Long") needshort = input(true, defval = true, title = "Short") length = input(20, defval = 20, minval = 1, maxval = 1000, title = "Bollinger Length") mult = input(2.0, minval = 0.001, maxval = 50, title = "Bollinger Mult") source = input(ohlc4, defval = ohlc4, title = "Bollinger Source") showbands = input(true, defval = true, title = "Show Bollinger Bands") fromyear = input(2018, defval = 2018, 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(01, defval = 01, minval = 01, maxval = 31, title = "From day") today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day") //Bollinger Bands basis = sma(source, length) dev = mult * stdev(source, length) upper = basis + dev lower = basis - dev //Lines col = showbands ? black : na plot(upper, linewidth = 1, color = col) plot(basis, linewidth = 1, color = col) plot(lower, linewidth = 1, color = col) //Body body = abs(close - open) abody = ema(body, 30) //Signals up = close <= lower dn = close >= upper exit = (strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open) and body > abody / 2 //Trading if up strategy.entry("Long", strategy.long, needlong == false ? 0 : na, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 00, 00))) if dn strategy.entry("Short", strategy.short, needshort == false ? 0 : na, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 00, 00))) if time > timestamp(toyear, tomonth, today, 00, 00) or exit strategy.close_all()