ボリンジャー・バンドのブレイクアウト戦略

作者: リン・ハーンチャオチャン,日付: 2023-09-19 16:06:56
タグ:

概要

この戦略は,ボリンジャーバンド指標に基づいています.価格は下帯を超えるとロングになり,価格は上帯に触るとポジションを閉じる.この戦略は,ボリンジャーバンドの収束原理を使用して,低値で購入し,高値で販売するための異常な価格ブレイクを追跡します.

戦略原則

  1. 中央帯のSMAは,最近の閉場価格の単純な移動平均値として計算する.

  2. 標準偏差 StdDev を計算し,価格変動範囲を反映する.

  3. 中央帯 SMA に標準偏差の上位偏差を加えると上部帯が得られます

  4. 中央帯 SMAから標準偏差の下位オフセットを引いて下帯を得ます

  5. 閉店価格が下から上へと下帯を超えると ショートします

  6. 価格が上位帯に触るとポジションを閉じる. 価格は異常とみなされる.

利点分析

この戦略の最大の利点は,ボリンジャーバンドの統計特性を活用して,異常な市場変動を効果的に追跡し,トレンドを把握することです.通常の移動平均戦略と比較して,ボリンジャーバンド戦略にはより多くの利点があります:

  1. ボリンジャー・バンド 上下帯は 市場の変動に自動的に適応できます

  2. 突破信号は侵入に より信頼性がある

  3. 利益を得るために意味への逆転は合理的です

  4. 異なる市場に調整するための 巨大なパラメータ調整スペースです

  5. 中期から長期間の傾向を把握し,短期でも使用できます

リスク分析

この戦略の潜在的リスクは主に以下のとおりです.

  1. 波リンジャー帯の不良パフォーマンス 範囲限定市場では 誤ったエントリを避ける

  2. ブレイクシグナルは 偽ブレイクシグナルで 慎重な判断が必要です

  3. 実際の価格動向に最適化できます. 価格動向は,価格動向に適しています.

  4. パラメータの設定が正しくない場合,過剰な取引や過度に保守的になる可能性があります.

  5. バックテスト期間は 曲線のフィッティングを避けるのに十分な長さでなければならない.

対応するリスク管理措置:

  1. シグナルをフィルターに取引量指標を追加する.

  2. 異なる市場からのパラメータとテストデータを最適化します.

  3. ストップ・ロスト・レベルを足し 利益のレベルを足し

  4. 信号の差を評価し,高値を追いかけて低値を売るのを避ける.

オプティマイゼーションの方向性

戦略は以下の側面で最適化できます.

  1. ボリンジャー帯のパラメータを組み合わせて 最適値を見つけます

  2. 突破信号をフィルターするためにMA,MACDなどを追加します.

  3. 機械学習アルゴリズムを適用して ボリンジャーパラメータを最適化します

  4. 突破の強さを評価し 位置のサイズを調整する

  5. バックテストは安定性を測るため長期間です

  6. リスク管理のためにストップ・ロスのメカニズムを追加します

概要

概要すると,ボリンジャーバンド戦略は,全体的に信頼性の高いトレンドフォロー戦略です. 不正な価格変動を効果的に捉えることができます. しかし,実際の価格からの偏差も注意し,パラメータを常に最適化する必要があります. ライブ取引に使用される場合,厳格なリスク管理は,取引毎の損失を制御するために必須です.


/*backtest
start: 2023-09-11 00:00:00
end: 2023-09-12 04:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

strategy(title="BB training No Repainting (OTS Mode)", overlay=true)


// Strategy Rules:
// 1. Enter trade when price crosses above the lower band
// 2. Exit trade when price touches the upper band
// 

// Chart Properties
testStartYear = input(2010, "Backtest Start Year")
testStartMonth = input(01, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)

testStopYear = input(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(30, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=input.bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and time >= testPeriodStart and time <= testPeriodStop ? #6c6f6c : na
bgcolor(testPeriodBackgroundColor, transp=97)

// User provided values
smaLength = input(title="SMA Length", type=input.integer, defval=20) // Middle band period length (moving average)
stdLength = input(title="StdDev Length", type=input.integer, defval=20) // Range to apply bands to
ubOffset = input(title="Upper Band Offset", type=input.float, defval=2.0, step=0.5) // Number of standard deviations above MA
lbOffset = input(title="Lower Band Offset", type=input.float, defval=2.0, step=0.5) // Number of standard deviation below MA

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false

smaValue = sma(close, smaLength) // Middle band
stdDev = stdev(close, stdLength)
upperBand = smaValue + stdDev * ubOffset // Top band
lowerBand = smaValue - stdDev * lbOffset // Bottom band

// Plot bands to chart
plot(series=smaValue, title="SMA", color=color.green)
plot(series=upperBand, title="UB", color=color.blue, linewidth=2)
plot(series=lowerBand, title="LB", color=color.blue, linewidth=2)

longCondition = (crossover(close, lowerBand))
closeLongCondition = (close >= upperBand)

if (longCondition and testPeriod())
    strategy.entry(id="CALL", long=true)

strategy.close(id="CALL", when=closeLongCondition)


もっと