ボリンジャーバンドに基づくトレンドフォロー戦略


作成日: 2024-01-18 16:37:56 最終変更日: 2024-01-18 16:37:56
コピー: 0 クリック数: 613
1
フォロー
1617
フォロワー

ボリンジャーバンドに基づくトレンドフォロー戦略

概要

この戦略は,ブリン帯の指標を使用して価格の傾向の方向を判断し,急速な移動平均と組み合わせて入場する.価格がブリン帯の中央軌道を破り,急速な移動平均の上を通過すると,遅い移動平均を多信号としてする.価格がブリン帯中央軌道を破り,急速な移動平均の下を通過すると,遅い移動平均を空空としてする.停止信号はATRの停止損失である.

戦略原則

この戦略は主にブリン帯指数と移動平均指数で構成されている.

ブリン帯指数中軌,上軌,下軌で構成されている。中軌はn日間の簡易移動平均である。上軌と下軌は,それぞれ中軌上下k倍標準差である。上軌に近づくと超買いを表し,下軌に近づくと超売りを表している。中軌は価格傾向の方向を表している。

移動平均の指標急速移動平均と遅い移動平均を使用する. 急速移動平均のパラメータは40で,遅い移動平均のパラメータは120である. 急速移動平均の上を通過すると,遅い移動平均は金叉として多信号する. 急速移動平均の下を通過すると,遅い移動平均は死叉として空信号する.

上記の指数ルールに従って,この戦略の具体的な取引シグナルは以下の通りです.

信号を多発する: 閉盤価格がブリン帯の中間軌道に突破し,速動平均線上での緩やかな移動平均線を横切る

空気信号: 閉盤はブリン帯の中央軌道から下落し,速動平均線の下を通過した.

損失を抑える方法ATRのストップポイントは,現在の価格からATRの4倍を引いたものです.

優位分析

この戦略はブリン帯指数と移動平均指数と組み合わせて,価格の方向性を効果的に判断し,波動的な状況で頻繁にポジションを開くのを防ぐことができます.

ブリン帯中軌は価格の傾向を明確に反映し,価格が中軌を突破すると強いトレンド信号が形成されます.上下軌は,超買い超売状況を効果的に判断し,震動の状況で高殺低を追求するのを避けることができます.

ゆっくりと移動する平均の金叉死叉は,傾向を判断する一般的な方法でもある. ブリン帯の指標と組み合わせて,入場時間をより正確に判断することができる.

ATRのストップ・ロスは,ストップ・ロスが市場の波動に自律的に調整され,単一損失を効果的に制御する.

リスク分析

この戦略の最大のリスクは,価格が中軌道突破した直後に引き下がり,効率的に利益を得られないことにある.この場合,損失が生じることがある.解決策は,移動平均のパラメータを適切に調整して,指標のパラメータを市場特性により適合させることである.

もう一つのリスクは,ブリン帯指数と移動平均指数が揺れ動いている状況で誤った信号を発するということです.この場合は,取引信号をスキップして,より明確なトレンド状況を待つことを検討してください.または,適切なポジションサイズを縮小してください.

最適化の方向

この戦略は以下の点で最適化できます.

  1. ブリン帯指標のパラメータを,異なる周期の市場特性に適応させる

  2. 特定の取引品種に適した指数となるように,スローモーション移動平均のパラメータを調整する

  3. 戦略の安定性を高めるために,他の補助指標を組み合わせる

  4. ポジション管理の最適化,トレンド状況でポジションの拡大,震動状況でポジションの縮小

  5. リスクの低減を試す方法

要約する

この戦略は,全体的に見ると,より典型的なトレンド追跡戦略である.これは,ブリン帯指数と移動平均指数を組み合わせて,価格の傾向と取引機会を判断する.戦略信号生成は,より明快で,自動定量取引に適している.しかし,より広範な市場環境に適合するためにパラメータとルールの最適化が必要になる一定のリスクもある.全体的に,この戦略の枠組みは,実行可能であり,大きな改善の余地がある.

ストラテジーソースコード
/*backtest
start: 2024-01-10 00:00:00
end: 2024-01-17 00:00:00
period: 1m
basePeriod: 1m
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/
// © Robrecht99

//@version=5
strategy("Trend Following with Bollinger Bands", overlay=true, margin_long=100, margin_short=100, pyramiding=4)

// Bollinger Bands //

length = input.int(20, minval=1, group="Bollinger Bands Inputs")
src = input(close, title="Source", group="Bollinger Bands Inputs")
mult = input.float(2.0, minval=0.001, maxval=50, title="StdDev")
basis = ta.sma(src, length)
dev = mult * ta.stdev(src, length)
upper = basis + dev
lower = basis - dev
offset = input.int(0, "Offset", minval = -500, maxval = 500, group="Bollinger Bands Inputs")
plot(basis, "Basis", color=color.orange, offset = offset)
p1 = plot(upper, "Upper", color=color.orange, offset = offset)
p2 = plot(lower, "Lower", color=color.orange, offset = offset)
fill(p1, p2, title = "Background", color=color.rgb(255, 0, 255, 95))

// Moving Averages //

len1 = input.int(40, minval=1, title="Length Fast MA", group="Moving Average Inputs")
len2 = input.int(120, minval=1, title="Length Slow MA", group="Moving Average Inputs")
src1 = input(close, title="Source Fast MA")
src2 = input(close, title="Source Slow MA")
maColorFast = input.color(color.new(color.red, 0), title = "Color Fast MA", group = "Moving Average Inputs", inline = "maFast")
maColorSlow = input.color(color.new(color.purple, 0), title = "Color Slow MA", group = "Moving Average Inputs", inline = "maSlow")
fast = ta.ema(src1, len1) 
slow = ta.ema(src2, len2)
plot(fast, color=maColorFast, title="Fast EMA")
plot(slow, color=maColorSlow, title="Slow EMA")

// ATR Inputs //
strategy.initial_capital = 50000

lengthATR = input.int(title="ATR Period", defval=14, minval=1, group="ATR Input")
risk = input(title="Risk Per Trade", defval=0.01, group="ATR Input")
multiplier = input(title="ATR Multiplier", defval=2, group="ATR Inputs")
atr = ta.atr(length)
amount = (risk * strategy.initial_capital / (2 * atr))

// Buy and Sell Conditions //

entrycondition1 = ta.crossover(fast, slow)
entrycondition2 = fast > slow
sellcondition1 = ta.crossunder(fast, slow)
sellcondition2 = slow > fast

// Buy and Sell Signals //

if (close > basis and entrycondition2)
    strategy.entry("long", strategy.long, qty=amount)
    stoploss = close - atr * 4
    strategy.exit("exit sl", stop=stoploss, trail_offset=stoploss)
if (sellcondition1 and sellcondition2)
    strategy.close(id="long")

if (close < basis and sellcondition2)
    strategy.entry("short", strategy.short, qty=amount)
    stoploss = close + atr * 4
    strategy.exit("exit sl", stop=stoploss, trail_offset=stoploss)
if (entrycondition1 and entrycondition2)
    strategy.close(id="short")