ボリンジャー波戦略 (Bollinger Wave Strategy) は,ボリンジャーバンドと移動平均を組み合わせた定量的な取引戦略である.市場動向と過買い/過売り地域を決定するために,ボリンジャーバンドの標準偏差と移動平均のクロスオーバーを計算することによって取引信号を生成する.
この戦略は,まず,指定された期間における指数関数移動平均 (EMA) をベースラインとして計算する.上帯 (EMA + n × 標準偏差) と下帯 (EMA - n × 標準偏差) は,この EMA に基づいて計算される.上帯の上部のブレイクは過買い信号を示し,下帯下部のブレイクは過売り信号を示します.
価格が上位および下位帯の間の場合,それは株式の通常の価格変動範囲です. さらに,戦略は,RSIなどの他の指標を組み合わせて,取引信号をフィルターし,不必要な損失を最小限に抑えるために取引頻度を削減します.
取引シグナルの規則は以下のとおりです
上記の取引信号が表示されたとき,固定量またはアカウントパーセントのポジションを取ります.価格がバンドに戻り,または反対の信号が表示されたとき,ポジションを終了します.
この戦略は,トレンド決定と過買い/過売り判断を組み合わせて,範囲限定市場での不正な取引を避ける.単一指標戦略と比較して,不必要なポジション開設を削減し,リスクを効果的に制御することができます.
波リンジャー帯は,単純な移動平均戦略と比較して,現在の市場変動とリスクレベルをよりよく反映している.帯幅が小さいとき,取引信号はより信頼性がある.帯幅が大きいとき,取引頻度は自動的に減少する.このような適応調整は,異なる市場状況に基づいて戦略リスクを制御することができます.
さらに,RSIおよび他の指標からの二重確認は,いくつかの誤った信号をフィルタリングし,トレンドターニングポイントの周りに不正な取引を避けるのに役立ちます.これは戦略の勝利率も向上します.
この戦略の主なリスクは,
パラメータ最適化リスク.移動平均値または標準偏差パラメータが不適切に設定されている場合,より多くの騒々しい取引を生成したり,取引機会を逃す可能性があります.これらのパラメータは繰り返しのテストと最適化が必要です.
誤ったブレイクシグナルリスク.価格が短期間帯の上または下を突破してすぐに逆転すると,誤った信号を生む可能性があります.それらの盲目取引は損失を増加させます.移動平均期間の増加またはストップ損失を設定することによって制御することができます.
取引頻度の高いリスク.帯が狭いギャップを持つ場合,取引数と支払った佣金を増やし,その結果最終的な収益性に影響を与える可能性があります.移動平均期間を適度に増加することによってこれを軽減することができます.
戦略をさらに最適化できる余地があります.
ストップ・ロスのメカニズムを追加します.トライリング・ストップ・ロスの使用またはタイム・ストップ・ロスの使用は,時間をかけて損失を認識し,単一の取引損失額を制御するのに役立ちます.
ポジションのサイズのルールを追加します.例えば,勝利する取引にピラミッドを並べ,敗者を減らす.これは戦略の収益を向上させることができます.
シグナルフィルタリングのための他の指標と組み合わせる.KDJやMACDのような指標は補助的な判断ツールとして役立つ.これは戦略の収益性をさらに向上させるのに役立ちます.
パラメータ設定を最適化します.遺伝子アルゴリズムのようなより体系的な方法を使用して,異なるパラメータ組み合わせをテストし,より良い設定を見つけることができます.
ボリンガー波戦略は,移動平均値のトレンド決定とオーバーバイト/オーバーセール判断を統合する. 異なる市場状況に適応するためにバンド幅の変化に基づいて取引頻度を調整する. 一方,RSIやその他の指標によるシグナルフィルタリングにより不正な取引が回避される. 戦略は,市場のトレンドを追跡し,リスクを制御することを考慮する. 継続的な最適化により,安定した収益性の高い定量的な取引戦略になることができます.
/*backtest start: 2023-01-08 00:00:00 end: 2024-01-14 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 //@FiboBuLL strategy(shorttitle='FB Wave', title='FiboBuLL Wave', overlay=true, pyramiding=1, currency=currency.NONE, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=100) src = input(close, title='Source') length = input.int(55, minval=1, title='EMA length') // 20 for classis Bollinger Bands SMA line (basis) mult = input.float(1., minval=0.236, maxval=2, title='Standard Deviation') //2 for Classic Bollinger Bands //Maxval = 2 as higher the deviation, higher the risk basis = ta.sma(src, length) dev = mult * ta.stdev(src, length) Show = input.string('Both', options=['Longs Only', 'Shorts Only', 'Both'], title='Trade Type') CC = input(true, 'Color Bars') upper = basis + dev lower = basis - dev //Conditions for Long and Short - Extra filter condition can be used such as RSI or CCI etc. short = src < lower // and rsi(close,14)<40 long = src > upper // and rsi(close,14)>60 L1 = ta.barssince(long) S1 = ta.barssince(short) longSignal = L1 < S1 and not (L1 < S1)[1] shortSignal = S1 < L1 and not (S1 < L1)[1] //Plots and Fills ////Long/Short shapes with text // plotshape(S1<L1 and not (S1<L1)[1]?close:na, text = "sᴇʟʟ", textcolor=#ff0100, color=#ff0100, style=shape.triangledown, size=size.small, location=location.abovebar, transp=0, title = "SELL", editable = true) // plotshape(L1<S1 and not (L1<S1)[1]?close:na, text = "ʙᴜʏ", textcolor = #008000, color=#008000, style=shape.triangleup, size=size.small, location=location.belowbar, transp=0, title = "BUY", editable = true) // plotshape(shortSignal?close:na, color=#ff0100, style=shape.triangledown, size=size.small, location=location.abovebar, transp=0, title = "Short Signal", editable = true) // plotshape(longSignal?close:na, color=#008000, style=shape.triangleup, size=size.small, location=location.belowbar, transp=0, title = "Long Signal", editable = true) p1 = plot(upper, color=color.new(#ff0000, 75), display=display.all, title='Upper Band') p2 = plot(lower, color=color.new(#008000, 75), display=display.all, title='Lower Band') p = plot(basis, color=L1 < S1 ? #008000 : S1 < L1 ? #ff0000 : na, linewidth=2, editable=false, title='Basis') fill(p, p1, color=color.new(color.teal, 85), title='Top Fill') //fill for basis-upper fill(p, p2, color=color.rgb(217, 161, 161), title='Bottom Fill', transp=85) //fill for basis-lower //Barcolor bcol = src > upper ? color.new(#8ceb07, 0) : src < lower ? color.new(#ff0000, 0) : src > basis ? color.green : src < basis ? color.red : na barcolor(CC ? bcol : na, editable=false, title='Color Bars') // //Alerts ---- // Use 'Once per bar close' // alertcondition(condition=longSignal, title="Long - BB Filter", message='BB Filter Long @ {{close}}') // Use 'Once per bar close' // alertcondition(condition=shortSignal, title="Short - BB Filter", message='BB Filter Short @ {{close}}') // Use 'Once per bar close' Notestart1 = input(true, '╔═══ Time Range to BackTest ═══╗') // === INPUT BACKTEST RANGE === FromMonth = input.int(defval=1, title='From Month', minval=1, maxval=12) FromDay = input.int(defval=1, title='From Day', minval=1, maxval=31) FromYear = input.int(defval=2018, title='From Year', minval=2015) ToMonth = input.int(defval=1, title='To Month', minval=1, maxval=12) ToDay = input.int(defval=1, title='To Day', minval=1, maxval=31) ToYear = input.int(defval=9999, title='To Year', minval=2010) // === FUNCTION EXAMPLE === start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window window() => time >= start and time <= finish ? true : false if window() and (Show == 'Longs Only' or Show == 'Both') strategy.entry('AL', direction=strategy.long, when=longSignal) strategy.close('LongAL', when=shortSignal, comment='AL KAPA') if window() and (Show == 'Shorts Only' or Show == 'Both') strategy.entry('SAT', direction=strategy.short, when=shortSignal) strategy.close('SAT', when=longSignal, comment='SAT KAPA')