強化されたボリンジャー帯逆転戦略

作者: リン・ハーンチャオチャン, 日時: 2023-09-21 11:45:37
タグ:

概要

この戦略は,価格逆転点を特定するために強化されたボリンジャーバンド指標を使用し,価格が下帯に近づくとロングになり,緑色のキャンドルが現れるとポジションを閉じて,下帯の平均逆転を捕捉することを目指します.

戦略の論理

  1. 標準BBパラメータのベース,dev,上BB,下BBを計算する.

  2. SMAと偏差帯 upex2と dnex2を SMAから一定の割合で計算する.

  3. 上BBと下BBの平均をUPEX2とDnex2で取るとUPEX3とDnex3が得られます

  4. Upex3の大きい部分とBB上部を新しいUpex上部,Dnex3の小さい部分とBB下部を新しいDnex下部とする.

  5. 価格が dnexを下回るときはロング,緑色のキャンドルが表示されたときは閉じる (閉じる>開く).

利点分析

  1. 強化BBは,以前の逆転信号に対する元のBBの感度を向上させる.

  2. カンデスタイルのパターンで鞭をフィルターします.

  3. バックテストによると,2008年から2018年にかけて,安定した収益性,円滑な曲線,最大DD < 20%を示している.

  4. 設定可能なレバレッジ リスク管理のための取引時間

リスク分析

  1. BBパラメータの調節が不十分である場合,過剰な取引や機会を逃す可能性があります.

  2. 傾向の逆転から利益を得られない

  3. キャンドルフィルタが遅れて 間に合わないかもしれない

  4. 10年後のバックテストデータでは 安定性を検証するには不十分です

  5. 大きなギャップや開口ジャンプに適応できない

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

  1. BB設定を最適化するためにパラメータの組み合わせをテストする.

  2. 収益性を高めるため 他の信号フィルターを追加します

  3. 価格が上限を超えるとショート取引を検討します.

  4. ストップロスを設定して,単一の取引損失を制限します.

  5. 市場の変化に合わせて 自動チューニングを開発する

  6. ギャップとジャンプのエントリールールを最適化

  7. バックテスト期間をテストパラメータに拡張する

概要

この戦略は,強化されたBBで逆転点を特定し,迅速な利益を得るためにキャンドルフィルターで低いバンドに近い長さを設定します.バックテストパフォーマンスは良好です.しかし,長時間のみ,限られたサンプル,パラームチューニングが必要です.市場が変化するときに引き下げに直面する可能性があります.次のステップは,勝利率を高めるための信号を確認し,ショートトレード,強度のために長いバックテスト,適応性と安定性を向上します.


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

//Noro
//2018

//@version=2
strategy(title = "Noro's Advanced Bollinger Bands Strategy v1.0", shorttitle = "ABB str 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 5)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(false, defval = false, title = "Short")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
p = input(20, "bars")
d = input(25, "percent")
showlines = input(true, defval = true, title = "Show Lines?")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

mult = input(2.0, minval=0.001, maxval=50)
basis = sma(close, p)
dev = mult * stdev(close, p)
source = close
upperBB = basis + dev
lowerBB = basis - dev
b1 = plot(basis, color=gray, linewidth=1)
p1 = plot(upperBB, color=aqua,  linewidth=1)
p2 = plot(lowerBB, color=aqua, linewidth=1)

//SMAs
sma = sma(close, p)
upex2 = sma * ((100 + d) / 100)
dnex2 = sma * ((100 - d) / 100)

upex3 = (upex2 + upperBB) / 2
dnex3 = (dnex2 + lowerBB) / 2

upex = max(upperBB, upex3)
dnex = min(lowerBB, dnex3)
//exit = (high > sma and low < sma)
exit = close > open


//Lines
col = showlines ? blue : na
plot(upex, linewidth = 3, color = col, transp = 0)
plot(sma, linewidth = 3, color = col, transp = 0)
plot(dnex, linewidth = 3, color = col, transp = 0)

//Trading
lot = strategy.position_size != strategy.position_size[1] ? strategy.equity / close * capital / 100 : lot[1]

if (not na(close[p]))
    strategy.entry("Long", strategy.long, needlong == false ? 0 : lot, limit = dnex)
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, limit = upex)

if exit
    strategy.close_all()

もっと