ブロードバンドの波動ロック戦略は,ブリンズ帯指標に基づいて市場波動が減少しているかどうかを判断する長線突破戦略である.市場が波動整理段階に入るとブリンズ帯の下線が収束し,この時点で我々は場に入る機会を判断する.我々は同時に平均的な真の波動範囲指標と組み合わせて価格波動の減少を確認する.
この戦略は主にブリンズ帯の指標が価格が低波動の波動期に入るか否かを判断することを頼る.ブリンズ帯の中央線は,閉じる価格の移動平均線であり,上下線はそれぞれ中央線上下各方向に2つの標準差を偏っている.価格の波動性が低下すると,上下線間隔は顕著に縮小する.ブリンズ帯の収束が起こるかどうかを予備的に判断するときに,現在のATR値はブリンズ帯の下部の標準差よりも小さいかどうかを検知する.これは価格が波動整理状態に入ったばかりであることを示す.
波動性の低下をさらに確認するために,ATR値の移動平均線が低下傾向にあるかどうかを検知した.平均ATR値の低下は,波動性が減少していることを横から証明した.上記の2つの条件が同時に満たされたとき,ブリンズ帯が明らかに収束していることを判断した.これは購入する最適なタイミングである.
購入後,ATRの2倍の停止距離で移動停止停止戦略を有効にします.
この戦略の最大の利点は,市場が低波動の波動整理期に入っていることを正確に判断し,最適な買い時を決定することである.他の長線戦略と比較して,ブロードバンド波動ロック戦略の利益率は高い.
第二に,この戦略は,移動的なストップ損失を積極的にリスク制御するために使用します. これは,市場が不利である場合でも損失を最大限に抑えることができます. これは多くの長距離戦略に欠けているものです.
戦略の主なリスクは,ブリンズ帯指標が価格波動の変化を100%正確に判断できないことである.ブリンズ帯の誤判波動が低下すると,購入のタイミングが不利になる可能性がある.このとき,移動ストップ損失が重要な役割を果たし,できるだけ早くストップ損失を退出することができます.
また,戦略内のさまざまなパラメータの設定も結果に影響を与える. 戦略をより堅牢にするために,パラメータを大量に再テストして最適化する必要がある.
ブリンズ帯の収束の同時には,他の指標を追加して傾向指標の転換の兆候を確認することも考えられる.例えば,ブリンズ帯の収束の同時には,MACD差が正から負に転移した,またはRSIが超買区から下回りしたなどを要求する.これは買い時の正確性をさらに向上させる.
別の方向は,ブリン帯周期,ATR周期,移動停止損耗倍数などの設定などの異なるパラメータの結果への影響をテストすることである.我々は,ステップアップ最適化を使用して最適なパラメータ組み合わせを見つける必要がある.
ブロードバンド・ショルストロック戦略は,ブリンズ帯指標を活用し,価格変動が低下するタイミングを判断し,移動停止損失を効果的に制御するリスクを適用する.これは比較的安定した長線突破戦略である.我々は,戦略の安定性を高めるために,パラメータをさらに最適化し,他の指標を組み合わせることがまだ必要である.
/*backtest start: 2023-02-15 00:00:00 end: 2024-02-21 00:00:00 period: 1d basePeriod: 1h 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] Bollinger Bands Consolidation Strategy",overlay=true,pyramiding=1) // Timeframe { backtest_timeframe_start = input(defval = timestamp("01 Apr 2016 13:30 +0000"), title = "Backtest Start Time", type = input.time) USE_ENDTIME = input(false,title="Define backtest end-time (If false, will test up to most recent candle)") backtest_timeframe_end = input(defval = timestamp("19 Apr 2021 19:30 +0000"), title = "Backtest End Time (if checked above)", type = input.time) within_timeframe = true // } // Indicator: BOLL bands { BOLL_length = 20//input(20,title="Periods to lookback for BOLL and ATR calc. (default 20)") BOLL_src = close BOLL_center = sma(BOLL_src, BOLL_length) BOLL_sDEV_x2 = 2 * stdev(BOLL_src, BOLL_length) BOLL_upper = BOLL_center + BOLL_sDEV_x2 BOLL_lower = BOLL_center - BOLL_sDEV_x2 plot(BOLL_center, "Basis", color=#872323, offset = 0) BOLL_p1 = plot(BOLL_upper, "Upper", color=color.navy, offset = 0, transp=50) BOLL_p2 = plot(BOLL_lower, "Lower", color=color.navy, offset = 0, transp=50) fill(BOLL_p1, BOLL_p2, title = "Background", color=#198787, transp=85) // } // ATR and volatility Indicator { ATR_x2 = atr(BOLL_length) * 2 // multiplier aligns with BOLL avg_volat = sma(ATR_x2, BOLL_length) //} // Trailing stop loss { var entry_price = float(0) var trailing_SL_buffer = float(0) var stop_loss_price = float(0) trail_profit_line_color = color.green UPDATE_ATR_TSL = false if strategy.position_size == 0 or not within_timeframe // make TSL line less visible trail_profit_line_color := color.black stop_loss_price := close - trailing_SL_buffer else if strategy.position_size > 0 if UPDATE_ATR_TSL and ATR_x2 < trailing_SL_buffer trailing_SL_buffer := ATR_x2 stop_loss_price := max(stop_loss_price, close[1] - trailing_SL_buffer) plot(stop_loss_price,color=trail_profit_line_color) // } IGNORE_BOLL_SHAPE = false//input(false,title="Ignore BOLL (vs ATR) during entry (experimental)") IGNORE_VOLATILITY = false///input(false,title="Ignore average ATR during entry (experimental)") // Main: if within_timeframe // ENTRY: if (ATR_x2 > BOLL_sDEV_x2 or IGNORE_BOLL_SHAPE) and (avg_volat < avg_volat[1] or IGNORE_VOLATILITY) if strategy.position_size == 0 entry_price := close trailing_SL_buffer := ATR_x2 stop_loss_price := close - ATR_x2 strategy.entry("Long",strategy.long, comment="enter") if strategy.position_size > 0 strategy.entry("Long",strategy.long, comment="+") // EXIT: if strategy.position_size > 0 if low <= stop_loss_price if close > entry_price strategy.close("Long", comment="take profit") else if low <= entry_price strategy.close("Long", comment="stop loss") if strategy.position_size == 0 entry_price := 0