Стратегия многократных скользящих средних полос Боллинджера

Автор:Чао Чжан, Дата: 2024-02-06 15:08:26
Тэги:

img

Обзор

Эта стратегия создает полосы Боллинджера с различными типами скользящих средних в качестве ввода для обнаружения большего количества торговых возможностей.

Логика стратегии

В основе этой стратегии лежит использование типов скользящих средних, выбранных по вводу пользователя, включая SMA, EMA, WMA, DEMA, TMA, VAR, WWMA, ZLEMA, TSF, HULL, TILL и т. Д., В общей сложности 12, в сочетании с полосами Боллинджера для формирования торговых сигналов. Средняя полоса полос Боллинджера принимает выбранную скользящую среднюю, в то время как верхняя и нижняя полосы являются одним положительным / отрицательным стандартным отклонением от средней полосы.

Основными составляющими кодекса являются:

  1. Функции расчета для 12 типов скользящих средних, включая SMA, EMA, WMA и т.д.
  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)

Больше