다중 이동평균 볼링거 밴드 전략

저자:차오장, 날짜: 2024-02-06 15:08:26
태그:

img

전반적인 설명

이 전략은 더 많은 거래 기회를 발견하기 위해 다양한 유형의 이동 평균을 입력으로 볼링거 밴드를 구성합니다. 최적 매개 변수를위한 유연한 조합을 허용하여 선택할 수있는 12 가지 유형의 이동 평균을 제공합니다.

전략 논리

이 전략의 핵심은 사용자 입력에 의해 선택 된 이동 평균 유형을 사용하여, SMA, EMA, WMA, DEMA, TMA, VAR, WWMA, ZLEMA, TSF, HULL, TILL 등 총 12개, 볼링거 밴드와 결합하여 거래 신호를 형성하는 데 있습니다. 볼링거 밴드의 중간 밴드는 선택 된 이동 평균을 채택하고, 상부 및 하부 밴드는 중부 밴드에서 긍정적 / 부정적 표준 편차입니다. 가격이 상부 밴드를 깨면 짧고 가격이 하부 밴드를 깨면 길습니다. 다른 유형의 이동 평균을 결합함으로써 매개 변수를 최적화하여 더 안정적이고 정확한 거래 신호를 얻을 수 있습니다.

코드의 주요 구성 요소는 다음과 같습니다.

  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)

더 많은