複数の移動平均ボリンジャーバンド戦略


作成日: 2024-02-06 15:08:26 最終変更日: 2024-02-06 15:08:26
コピー: 3 クリック数: 352
1
フォロー
1141
フォロワー

複数の移動平均ボリンジャーバンド戦略

概要

この戦略は,異なる種類の移動平均を入力してブリン帯を構築し,より多くの取引機会を掘り起こします. 12種類の移動平均の種類を提供し,最適なパラメータを得るために柔軟に組み合わせることができます.

戦略原則

この戦略の核心は,SMA,EMA,WMA,DEMA,TMA,VAR,WWMA,ZLEMA,TSF,HULL,TILLなど12種類のユーザ入力された移動平均型を利用して,ブリン帯の指標と組み合わせて取引信号を形成することである.ブリン帯の中軌道は,選択された移動平均を採用し,上下軌道は,中軌道は正負の1つの標準差である.価格が上軌道を突破すると,空にする.価格が下軌道を突破すると,多にする.これにより,異なる移動平均型の組み合わせによって,パラメータを最適化して,より安定で正確な取引信号を得る.

コードには以下の部分があります.

  1. SMA,EMA,WMAなど,12種類の移動平均型の計算関数定義
  2. getMA関数は,mav入力パラメータに基づいて対応する移動平均を返します.
  3. ブリン帯の中軌道線,上軌道線,下軌道線を計算する. 中軌道線はgetMA関数で得られた移動平均である.
  4. ブリン・バンドを描く
  5. 成長信号と空信号. 価格が上軌を突破すると空頭,下軌を突破すると多頭.

優位分析

この戦略の最大の利点は,複数の移動平均型の提供である.移動平均は,異なる市場環境で,異なる速さで反応し,複数の移動平均のタイプを採用することで,戦略の適応性を大幅に高めることができる.さらに,この戦略は,移動平均の長さのパラメータを最適化して,最適な組み合わせを探し,より正確な取引を得ることができる.

リスク分析

この戦略の主なリスクは,移動平均自体がシグナルを混乱させ,偽の突破を繰り返し発生する可能性にある.また,ブリン帯の指標は,急激な価格変動に対して比較的敏感であり,中軌道線は価格を効果的に追跡することができない.これは,より安定性の高い移動平均のタイプを採用し,パラメータを適切に調整する必要がある.

最適化の方向

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

  1. 異なる移動平均の組み合わせをテストし,最適なパラメータを探し,信号の安定性を向上させる.
  2. 単一の誤信号による損失の制御を保証する Stop Loss 戦略を追加する.
  3. MACD,KDなどなど,頻繁に取引を避けるために,他の指標のフィルター信号と組み合わせる.
  4. 資金管理の最適化とポジション調整

要約する

この戦略は,全体的に非常に革新的であり,ブリン帯の指標により豊かな分割アプリケーションを提供します. ポートフォリオの移動平均を調整することで,より正確で安定した信号を得ることができます. また,ブリン帯の戦略の最適化のための新しい考えを提供します. 参数調整と最適化により,この戦略は,非常に実用的な取引ツールになることができます.

ストラテジーソースコード
/*backtest
start: 2023-01-30 00:00:00
end: 2023-10-13 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Bollinger Bands Strategy (MA type)", overlay=true)
src = input(close, title="Source")
length = input(20,step=10, minval=1)
mult = input(1,type=input.float, minval=0.001, maxval=50, title="StdDev")

length1=input(26, "Long Moving Average Length", minval=1)
length2=input(9, "Trigger Length", minval=1)
T3a1 = input(0.7, "TILLSON T3 Volume Factor", step=0.1)
////////////
mav = input(title="Moving Average Type", defval="VAR", options=["SMA", "EMA", "WMA", "DEMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF", "HULL", "TILL"])
Var_Func(src,length)=>
    valpha=2/(length+1)
    vud1=src>src[1] ? src-src[1] : 0
    vdd1=src<src[1] ? src[1]-src : 0
    vUD=sum(vud1,9)
    vDD=sum(vdd1,9)
    vCMO=nz((vUD-vDD)/(vUD+vDD))
    VAR=0.0
    VAR:=nz(valpha*abs(vCMO)*src)+(1-valpha*abs(vCMO))*nz(VAR[1])
VAR=Var_Func(src,length)
DEMA = ( 2 * ema(src,length)) - (ema(ema(src,length),length) )
Wwma_Func(src,length)=>
    wwalpha = 1/ length
    WWMA = 0.0
    WWMA := wwalpha*src + (1-wwalpha)*nz(WWMA[1])
WWMA=Wwma_Func(src,length)
Zlema_Func(src,length)=>
    zxLag = length/2==round(length/2) ? length/2 : (length - 1) / 2
    zxEMAData = (src + (src - src[zxLag]))
    ZLEMA = ema(zxEMAData, length)
ZLEMA=Zlema_Func(src,length)
Tsf_Func(src,length)=>
    lrc = linreg(src, length, 0)
    lrc1 = linreg(src,length,1)
    lrs = (lrc-lrc1)
    TSF = linreg(src, length, 0)+lrs
TSF=Tsf_Func(src,length)
HMA = wma(2 * wma(src, length / 2) - wma(src, length), round(sqrt(length)))
T3e1=ema(src, length)
T3e2=ema(T3e1,length)
T3e3=ema(T3e2,length)
T3e4=ema(T3e3,length)
T3e5=ema(T3e4,length)
T3e6=ema(T3e5,length)
T3c1=-T3a1*T3a1*T3a1
T3c2=3*T3a1*T3a1+3*T3a1*T3a1*T3a1
T3c3=-6*T3a1*T3a1-3*T3a1-3*T3a1*T3a1*T3a1
T3c4=1+3*T3a1+T3a1*T3a1*T3a1+3*T3a1*T3a1
T3=T3c1*T3e6+T3c2*T3e5+T3c3*T3e4+T3c4*T3e3


getMA(src, length) =>
    ma = 0.0
    if mav == "SMA"
        ma := sma(src, length)
        ma

    if mav == "EMA"
        ma := ema(src, length)
        ma

    if mav == "WMA"
        ma := wma(src, length)
        ma

    if mav == "DEMA"
        ma := DEMA
        ma

    if mav == "TMA"
        ma := sma(sma(src, ceil(length / 2)), floor(length / 2) + 1)
        ma

    if mav == "VAR"
        ma := VAR
        ma

    if mav == "WWMA"
        ma := WWMA
        ma

    if mav == "ZLEMA"
        ma := ZLEMA
        ma

    if mav == "TSF"
        ma := TSF
        ma

    if mav == "HULL"
        ma := HMA
        ma

    if mav == "TILL"
        ma := T3
        ma
    ma
    
//////////
basis = getMA(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev
offset = input(0, "Offset",minval = -500, maxval = 500)
plot(basis, "Basis",color=#FF6D00, offset = offset)
p1 = plot(upper, "Upper", color=#2962FF, offset = offset)
p2 = plot(lower, "Lower", color=#2962FF, offset = offset)
fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))
/////////
buyEntry = crossover(src, lower)
sellEntry = crossunder(src, upper)
if (crossover(src, lower))
	strategy.entry("BBandLE", strategy.long, stop=lower, oca_name="BollingerBands",  comment="BBandLE")
else
	strategy.cancel(id="BBandLE")
if (crossunder(src, upper))
	strategy.entry("BBandSE", strategy.short, stop=upper, oca_name="BollingerBands",  comment="BBandSE")
else
	strategy.cancel(id="BBandSE")
//plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr)