Bollinger Bands を使った多時間フレーム取引戦略

作者: リン・ハーンチャオチャン, 日時: 2023-09-20 15:47:46
タグ:

概要

この戦略は,適応性ボリンジャーバンドを使用して,2種類のトレーリングストップ戦略を設計し,タイムフレームにわたって体系的にバックテストします.これはトレンドフォロー戦略に属します.

戦略の論理

  1. 調整可能なチャネル幅の適応ボリンジャー帯の上部および下部帯を計算する.

  2. バンドのブレイクでポジションを開き,バンド内の価格が逆転するとストップアウトする.

  3. 価格が帯に達するとポジションを開き,価格が帯内に戻ると停止する.

  4. 長い/短い側を決定するのにCCI指標を使用する.

  5. 両方の戦略の実行可能性を確認するために,複数の時間枠でバックテストします.

利点

  1. ボリンジャー・バンドは 価格動向を直感的に把握できます

  2. この2つの戦略は 安定性に関する異なる市場条件に適しています

  3. CCIは,長/短方向を決定するのに役立ちます.

  4. 複数のタイムフレームをバックテストすることで 結果はより説得力があります

  5. シンプルで明快な戦略ルール

リスク

  1. ボリンジャー帯は,特定の状況で失敗する可能性があります.

  2. 両方の戦略において 早期または遅延した停止のリスク

  3. CCIは誤った信号を生成する可能性があります.

  4. バックテストの偏見を慎重に扱います

  5. オーバーフィットするリスクがあります

強化

  1. 最適な組み合わせを見つけるために テストパラメータ

  2. 他の指標でフィルターを追加することを評価します.

  3. リスクを減らすために 停止を最適化します

  4. チャンネル幅の適応方法の研究

  5. もっと多くのシンボルとタイムフレームで確認してください

  6. マシン学習を使って パーマータを動的に最適化します

結論

この戦略は,ボリンジャーバンドに基づいて2つのトレーリングストップ戦略を設計し,複数のタイムフレームでそれらをバックテストする.パラメータ最適化,ストップ改善などを通じて精製することで,成熟したトレンドフォローシステムへの強度を高めることができます.


/*backtest
start: 2022-09-13 00:00:00
end: 2023-09-19 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title = "Underworld Hunter", overlay=true)

len = input(75, minval=1, title="Length")
src = input(close, title="Source")
basis = 0.0
basis := na(basis[1]) ? sma(src, len) : ema(ema(ema(src,len),len),len)

mult = input(1.9, minval=0.001, maxval=50, title="Deviation")
dev = mult * stdev(src, len)
upper = basis + dev
lower = basis - dev

//CCI calculation and inputs

lengthcci = input(20, minval=1, title="Period for CCI")
ma = sma(close, lengthcci)
ccivalue = (src - ma) / (0.015 * dev(src, lengthcci))

//CCI plotting

cciover0 = ccivalue >= 100 and ccivalue <= 120
cciover1 = ccivalue > 120 and ccivalue <= 140
cciover2 = ccivalue > 140 and ccivalue <= 160
cciover3 = ccivalue > 160 and ccivalue <= 180
cciover4 = ccivalue > 180

cciunder0 = ccivalue <= -100 and ccivalue >= -120
cciunder1 = ccivalue <= -120 and ccivalue > -140
cciunder2 = ccivalue <= -140 and ccivalue > -160
cciunder3 = ccivalue <= -160 and ccivalue > -180
cciunder4 = ccivalue <= -180

plotshape(cciover0, title="CCIO0", location=location.abovebar, color=#c6ff1a, transp=0, style=shape.circle, size=size.tiny)
plotshape(cciunder0, title="CCIU0", location=location.belowbar, color=#c6ff1a, transp=0, style=shape.circle, size=size.tiny)
plotshape(cciover1, title="CCIO1", location=location.abovebar, color=#ffff00, transp=0,style=shape.circle, size=size.tiny)
plotshape(cciunder1, title="CCIU1", location=location.belowbar, color=#ffff00, transp=0, style=shape.circle, size=size.tiny)
plotshape(cciover2, title="CCIO2", location=location.abovebar, color=#ff9900, transp=0, style=shape.circle, size=size.tiny)
plotshape(cciunder2, title="CCIU2", location=location.belowbar, color=#ff9900, transp=0, style=shape.circle, size=size.tiny)
plotshape(cciover3, title="CCIO3", location=location.abovebar, color=#ff0000, transp=0, style=shape.circle, size=size.tiny)
plotshape(cciunder3, title="CCIU3", location=location.belowbar, color=#ff0000, transp=0, style=shape.circle, size=size.tiny)
plotshape(cciover4, title="CCIO4", location=location.abovebar, color=#cc00cc, transp=0,style=shape.circle, size=size.tiny)
plotshape(cciunder4, title="CCIU4", location=location.belowbar, color=#cc00cc, transp=0,style=shape.circle, size=size.tiny)

//plotting

plot(upper, title="Upper shadow", color=color.black, transp = 30, linewidth = 4)
plot(upper, title="Upper line", color=#FF2E00, transp = 0, linewidth = 2)
plot(lower, title="Lower shadow", color=color.black, transp = 30, linewidth = 4)
plot(lower, title="Lower line", color=#FF2E00, transp = 0, linewidth = 2)
plot(basis, title="Basic line", color=color.red, transp = 50, linewidth = 2)

mean = input(title="Test Reverse to the Mean instead", type=input.bool, defval=false)
test = input(title="Enable testing", type=input.bool, defval=true)

ordersize=floor(50000/close)

if(close>upper and strategy.opentrades==0 and not mean and test)
    strategy.entry("Hunt Up", strategy.long, ordersize)
if (close<upper and close[1]<upper and close[2]<upper)
    strategy.close("Hunt Up", qty_percent = 100, comment = "Hunt End")

if(close<lower and strategy.opentrades==0 and not mean and test)
    strategy.entry("Hunt Down", strategy.short, ordersize)
if (close>lower and close[1]>lower and close[2]>lower)
    strategy.close("Hunt Down", qty_percent = 100, comment = "Hunt End")

//bounce of bands

if(close>upper and strategy.opentrades==0 and mean and test)
    strategy.entry("Sneak Down", strategy.short, ordersize)
if (close<upper and close[1]<upper and close[2]<upper and close>high[1])
    strategy.close("Sneak Down", qty_percent = 100, comment = "SneakEnd")

if(close<lower and strategy.opentrades==0 and mean and test)
    strategy.entry("Sneak Up", strategy.long, ordersize)
if (close>lower and close[1]>lower and close[2]>lower and close<low[1])
    strategy.close("Sneak Up", qty_percent = 100, comment = "Sneak End")




もっと