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

作者: リン・ハーンチャオチャン,日付: 2024-02-06 15:08:26
タグ:

img

概要

この戦略は,より多くの取引機会を発見するためのインプットとして異なる種類の移動平均値でボリンジャーバンドを構築する.最適なパラメータのための柔軟な組み合わせを可能にする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. 時折の悪い信号による損失を制限するためにストップ・ロスのメカニズムを追加します.
  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)

もっと