ボリンジャー・バンドをベースにしたトレンド フォローする戦略

作者: リン・ハーンチャオチャン,日付: 2024-01-18 16時37分56秒
タグ:

img

概要

この戦略は,ボリンジャーバンドを使用して価格傾向方向を決定し,ポジションに入るのに高速・スロームービング平均と組み合わせます.価格がボリンジャーミドルバンドを突破し,高速移動平均がスロームービング平均を横切ると購入信号が起動します.価格がボリンジャーミドルバンドを下回り,高速移動平均がスロームービング平均を下回ると販売信号が起動します.ストップ損失方法はATRトライリングストップ損失です.

戦略の論理

この戦略は主にボリンジャーバンド指標と移動平均からなる.

についてボリンジャー・バンド中間帯,上部帯,下部帯を含む.中部帯は,n日間の単純な移動平均線である.上部帯と下部帯は,中部帯の上下でk標準偏差である.価格が上部帯に近いとき,過剰購入状態を示す.価格が下部帯に近いとき,過剰販売状態を示す.中部帯は価格傾向の方向を表す.

について移動平均値速移動平均と遅移動平均を採用する. 速移動平均は40の期間があり,遅移動平均は120の期間があります. 速移動平均が遅移動平均を横切ると,それは購入信号です. 速移動平均が遅移動平均を下回ると,それは販売信号です.

上記の指標のルールに基づいて,この戦略の特別の取引信号は以下のとおりです.

購入信号: 閉じる価格が中間帯を突破し,速いMAが緩やかなMAを横断する

シグナルを売り: 中央帯を下回る価格の割れ目と,低調なMAを下回る迅速なMAの割れ目

損失を止めるATRのストップ・ロスは,現在の価格マイナス4倍ATRのストップ・ロスの値です.

利点分析

この戦略は,ボリンジャー帯と移動平均を組み合わせて,価格傾向の方向性を効果的に決定し,変動期間中に過剰なポジション開設を避けることができます.

ボリンジャー中間帯は価格の傾向を明確に反映することができる.価格が中間帯を突破すると,強いトレンド信号を形成する.上部および下部帯は,新しい高値を追いかけて,範囲期間中に低値を殺すことを避けるために,過剰購入および過剰販売条件を効果的に判断することができます.

急速なMAsと遅いMAsのゴールデンクロスとデッドクロスは,トレンドを決定するために一般的に使用される方法でもあります.ボリンジャーバンドと組み合わせると,エントリータイムをより正確に決定することができます.

ATRのストップ・ロスは,ストップ・ロスのポイントを市場変動に合わせて調整し,単一のポジション損失を効果的に制御します.

リスク分析

この戦略の最大のリスクは,価格が中間帯を突破した後に迅速に引き下げられ,効果的に利益を得ることができないことです.これは損失をもたらすでしょう.解決策は,指標が市場の特徴により良く適合するように,MAパラメータを適切に調整することです.

また,波動帯や移動平均値が誤った信号を発する可能性があるというリスクもあります.この時点で,取引信号をスキップし,より明確なトレンドを待つことを検討する必要があります.または適切なポジションサイズを減らす必要があります.

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

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

  1. 異なる期間の市場特性に適応するためにボリンジャー帯のパラメータを調整する

  2. 迅速かつ遅い MA パラメータを調整し,特定の取引手段により適合させる.

  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")

もっと