適応型ボリンジャーバンドトレンドフォロー戦略


作成日: 2023-11-16 16:35:01 最終変更日: 2023-11-16 16:35:01
コピー: 1 クリック数: 605
1
フォロー
1617
フォロワー

適応型ボリンジャーバンドトレンドフォロー戦略

概要

この戦略は,ブリン通路指標をベースに,自己適応の移動平均線と組み合わせて,トレンドの正確な判断と追跡を可能にします.パラメータを動的に調整することで,戦略が異なる品種と市場環境に適応できるようにし,強い安定性と適応性を持っています.

戦略原則

この戦略は以下の部分から構成されています.

  1. 適応移動平均の計算。ここでは,線形回帰指数を使用して,一定の周期内の線形回帰曲線を移動平均として計算する。

  2. ブリン通路の上下軌を計算する。ここでは自適應ATR指標の計算通路帯を用いて,ユーザが指定するパラメータ ratio2と組み合わせて,ブリン通路の上下軌を計算する。

  3. 買入販売のタイミングを判断する. ブリン・チャネルを突破したかどうかによってトレンドの方向と買入販売のタイミングを判断する. 価格が下から上へと下を突破した時は買入信号とみなし,価格が上から下へと下を突破した時は売り信号とみなす.

  4. ストップを設定する. リスクを制御するために固定ポイントのストップを採用し,固定ポイントの後にストップを追跡する方法でストップを設定し,利益を保証しながらトレンドの最大化を目指す.

  5. テスト開始と終了の時間を設定し,戦略のテストを最適化します.

戦略的優位性

  1. 適応パラメータ設計. ブリン通路の通路帯と移動平均線は,戦略が市場の変化に適応できるように,自己適応的な計算を採用している.

  2. 突破判断が明確である. ブリン通路上下軌道突破を使用してトレンド転換点を判断し,バイオシグナルがより明確である.

  3. ストップ・ストップの設定は合理的な. 固定ストップ・コントロールのリスクを採用し,ストップ・ストップの方法を追跡し,トレンドの利潤を最大化する.

  4. 裏付けの有効性 裏付けの有効性 裏付けの有効性 裏付けの有効性 裏付けの有効性 裏付けの有効性

  5. わかりやすい実装 戦略の構想は明確で分かりやすい.コードも簡潔で,理解しやすい.

戦略リスク

  1. ブリン通路はパラメータ最適化が必要である.ブリン通路の通路帯と回帰周期は,異なる品種と市場環境に応じて最適化が必要である.最適化が不適切である場合,複数のミスシグナルまたは頻繁なFalse Triggersが発生する.

  2. 追及時間は十分ではないかもしれない.この追及は,戦略の安定性を全面的に検証するために,より長い歴史を覆うために,最近の追及範囲のみを設定している.

  3. 過剰フィットするリスクがある.現在の反測パラメータは,最近の特定の状況にのみ最適化されている可能性があり,歴史に過剰フィットするリスクがある.

  4. 止損点数は評価する必要がある.現在の止損点数は小さいため,過敏になり,小振動で止損割傷される可能性がある.適切な止損点数は評価する必要がある.

  5. 量化検証指標の欠如.現在の取引信号はグラフィックブレイクのみで判断され,信号の有効性を検証する量化指標は導入されていません.

戦略最適化の方向性

  1. より多くの自己適応指標を導入する.自己適応平均線,自己適応チャネル指標の組み合わせをテストし,より頑丈なトレンド追跡戦略を構築することができる.

  2. 最適化パラメータ設定。 ブリン通路と均等線パラメータの最適な組み合わせを,遺伝的アルゴリズムなどのより体系的な方法によって見つけることができる。

  3. 回測時間範囲を拡大する. 回測時間範囲を拡大し,パラメータの最適化による安定性を検証する. スライドポイント,手数料などの取引コストをよりリアルに回測する.

  4. 量化フィルタリングルールを導入する.取引量突破,MACD柱のギャップなどの量化指標ルールを設定し,誤ったブリン通路突破信号を避ける.

  5. 最適化ストップメカニズム 異なる固定ストップポイント設定と異なるストップ追跡方法を評価し,最適のストップモードを見つける

  6. 实体検証. 实体で最適化後の戦略を実行し,収益の撤回を記録し,戦略の安定した信頼性をさらに改善する.

要約する

この戦略の全体的な考え方は明確で,ブルリン通路を使用してトレンドの方向を判定し,突破信号を捕捉し,移動均線で整体トレンドの方向を決定する.一定の最適化によって,より安定した信頼できるトレンド追跡戦略になることができる.しかしながら,回測時間範囲の代表性,量化フィルタリング規則の導入,および停止レベルの把握に注意する必要があります.これらの問題をうまく処理できれば,この戦略は実戦で安定した,可視な利益を得ることができます.

ストラテジーソースコード
/*backtest
start: 2023-10-16 00:00:00
end: 2023-11-09 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Linear Regression (Backtest / Trailing Stop)",overlay=true)
close_price = close[0]

len = input(40)
linear_reg = linreg(close_price, len, 0)

calculationToPlotAverageMeanLine=linear_reg
useUpperDeviation = input(true, "Upper Deviation", bool)
useLowerDeviation = input(true, "Lower Deviation", bool)
ratio2=input(defval=2,title=" Ratio 2")
avg=atr(len)
r2=avg*ratio2
top=linear_reg+r2
bott=linear_reg-r2

calculationToPlotUpperLine=top
calculationToPlotLowerLine=bott

plotUpperDeviationLine = plot(not useUpperDeviation ? na : calculationToPlotUpperLine, color=color(blue,0))
plotAverageMeanLine = plot(calculationToPlotAverageMeanLine, color=color(olive,0))
plotLowererDeviationLine = plot(not useLowerDeviation ? na : calculationToPlotLowerLine, color=color(red,0))
fill(plotUpperDeviationLine, plotAverageMeanLine, color=color(blue,85))
fill(plotLowererDeviationLine, plotAverageMeanLine, color=color(red,85))


//
length = input(title="linear Length",  defval=40, minval=1)
multiplier = input(title="linear Deviation", type=float, defval=2, minval=1)
overbought = input(title="Overbought",  defval=1, minval=1)
oversold = input(title="Oversold",  defval=0, minval=1)
custom_timeframe = input(title="Use another Timeframe?", type=bool, defval=false)
highTimeFrame = input(title="Select The Timeframe",  defval="60")
res1 = custom_timeframe ? highTimeFrame : timeframe.period

fixedSL = input(title="SL Activation", defval=70)
trailSL = input(title="SL Trigger", defval=10)
fixedTP = input(title="TP Activation", defval=50)
trailTP = input(title="TP Trigger", defval=10)

// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2015)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2015)

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 // create function "within window of time"

smabasis = linreg(close_price, length, 0)
stdev = stdev(close, length)
cierre = request.security(syminfo.tickerid, res1, close, false)
alta = request.security(syminfo.tickerid, res1, high, false)
baja = request.security(syminfo.tickerid, res1, low, false)
basis1 = request.security(syminfo.tickerid, res1, smabasis, false)
stdevb = request.security(syminfo.tickerid, res1, stdev, false)
dev = multiplier * stdevb // stdev(cierre, length)
upper = basis1 + dev
lower = basis1 - dev

bbr = (cierre - lower)/(upper - lower)

// plot(bbr)

// // MARCA LAS RESISTENCIAS
pintarojo = 0.0
pintarojo := nz(pintarojo[1])
pintarojo := bbr[1] > overbought and bbr < overbought ? alta[1] :  nz(pintarojo[1])
p = plot(pintarojo, color = red, style=circles, linewidth=2)

// // MARCA LOS SOPORTES
pintaverde = 0.0
pintaverde := nz(pintaverde[1])
pintaverde := bbr[1] < oversold and bbr > oversold ? baja[1] :  nz(pintaverde[1])
g = plot(pintaverde, color = black, style=circles, linewidth=2)
zz= crossover(pintaverde,pintaverde[1]) or crossunder(pintaverde,pintaverde[1])
kp= crossover(pintarojo,pintarojo[1]) or crossunder(pintarojo,pintarojo[1]) 
plotshape(zz,  title="buy", style=shape.triangleup,location=location.belowbar, color=green, transp=0, size=size.small)
plotshape(kp, title="sell", style=shape.triangledown,location=location.abovebar, color=red, transp=0, size=size.small)


strategy.entry("BUY", strategy.long, qty=10, oca_name="BUY",  when=zz and window())
strategy.exit("B.Exit", "BUY", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP)

strategy.entry("SELL", strategy.short, qty=10, oca_name="SELL",  when=kp and window())
strategy.exit("S.Exit", "SELL", qty_percent = 100, loss=fixedSL, trail_offset=trailSL, trail_points=fixedTP)