
広帯振動ロック戦略は,ブリン帯の指標に基づいて市場の波動性が減少したかどうかを判断する長線突破戦略である.市場が振動整理段階に入ると,ブリン帯の下線が収束し,この時点で我々はチャンスとして場に入ることを判断する.我々は同時に平均実際の波動範囲の指標を組み合わせて,価格の波動性の減少を確認する.
この策略は,ブリン帯の指標によって,価格が低波動の振動期に入っているかどうかを判断する.ブリン帯の中央軌道線は,閉店価格の移動平均であり,上下軌道は,中軌道上下各偏移の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