Стратегия прорыва Bollinger Band на основе VWAP

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

img

Обзор

Эта стратегия использует полосы Боллинджера для отслеживания VWAP. Она принимает длинную позицию, когда VWAP прорывается выше средней полосы, и закрывает позицию, когда VWAP прорывается ниже нижней полосы.

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

  1. Вычислите VWAP.
  2. Укажите, как вычислить Bollinger Bands VWAP, включая верхнюю, среднюю и нижнюю полосы.
  3. Принимать длинную позицию, когда VWAP проходит через средний диапазон, а цена находится выше Pivot Point.
  4. Установите стоп-лосс на 5%.
  5. Если VWAP проходит ниже нижней полосы, закрыть длинную позицию.

Анализ преимуществ

  1. VWAP обладает мощной способностью отслеживать тренд.
  2. Добавление Pivot Point фильтрует ложные прорывы, избегая ненужных потерь.
  3. Частичный выход блокирует некоторые прибыли и контролирует риск.
  4. Проверки показывают хорошие результаты на бычьем рынке с хорошей стабильностью.

Анализ рисков

  1. Склонность к потерям от ложных прорывов на рынке с ограниченным диапазоном.
  2. Пивовые точки не могут полностью избежать ложных сигналов.
  3. Увеличение частоты торговли приводит к более высоким затратам на транзакции.
  4. Не работает хорошо на медвежьем рынке.

Руководство по оптимизации

  1. Добавьте такие индикаторы, как MACD, KDJ, чтобы фильтровать сигналы.
  2. Оптимизируйте параметры BB через обратные тесты.
  3. Используйте машинное обучение для динамической оптимизации параметров BB.
  4. Проверьте разные уровни стоп-лосса, чтобы найти оптимальный.
  5. Добавить адаптивную прибыль на основе волатильности рынка.

Заключение

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


/*backtest
start: 2024-01-06 00:00:00
end: 2024-02-05 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © ediks123

//@version=4
strategy("BBofVWAP with entry at Pivot Point", overlay=false, pyramiding=1,   default_qty_type=strategy.percent_of_equity,  default_qty_value=20, initial_capital=10000, currency=currency.USD)  //default_qty_value=10, default_qty_type=strategy.fixed,

// Function outputs 1 when it's the first bar of the D/W/M/Y
is_newbar(res) =>
    ch = 0
    if(res == 'Y')
        t  = year(time('D'))
        ch := change(t) != 0 ? 1 : 0
    else
        t = time(res)
        ch := change(t) != 0 ? 1 : 0
    ch


//variables BEGIN
//smaLength=input(200,title="Slow MA Length")

bbLength=input(50,title="BB Length")  
//bbsrc = input(close, title="BB Source")
mult = input(2.0, minval=0.001, maxval=50, title="StdDev")
offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500)

pp_period = input(title = "Pivot Period", type=input.string, defval="Week", options = ['Day', 'Week'])

pp_res = pp_period == 'Day' ? 'D' : pp_period == 'Week' ? 'W' : pp_period == 'Month' ? 'M' : 'Y' 

riskCapital = input(title="Risk % of capital", defval=10, minval=1)
stopLoss=input(5,title="Stop Loss",minval=1)



//sma200=sma(close,smaLength)
//plot(sma200, title="SMA 200", color=color.orange)

myVwap=vwap(hlc3)

//bollinger calculation
basis = sma(myVwap, bbLength)
dev = mult * stdev(myVwap, bbLength)
upperBand = basis + dev
lowerBand = basis - dev

//plot bb
plot(basis, "Basis", color=color.teal, style=plot.style_circles , offset = offset)
p1 = plot(upperBand, "Upper", color=color.teal, offset = offset)
p2 = plot(lowerBand, "Lower", color=color.teal, offset = offset)
fill(p1, p2, title = "Background", color=color.teal, transp=95)

plot(myVwap, title="VWAP", color=color.purple)


//pivot points 


// Calc High
high_cur = 0.0
high_cur := is_newbar(pp_res) ? high : max(high_cur[1], high)

phigh = 0.0
phigh := is_newbar(pp_res) ? high_cur[1] : phigh[1]

// Calc Low
low_cur = 0.0
low_cur := is_newbar(pp_res) ? low : min(low_cur[1], low)

plow = 0.0
plow := is_newbar(pp_res) ? low_cur[1] : plow[1]

// Calc Close
pclose = 0.0
pclose := is_newbar(pp_res) ? close[1] : pclose[1]


vPP = (phigh + plow + pclose) / 3

//pivot points


//Entry--
//Echeck how many units can be purchased based on risk manage ment and stop loss
qty1 = (strategy.equity  * riskCapital / 100 ) /  (close*stopLoss/100)  

//check if cash is sufficient  to buy qty1  , if capital not available use the available capital only
qty1:= (qty1 * close >= strategy.equity ) ? (strategy.equity / close) : qty1


strategy.entry(id="BB_VWAP_PP",long=true, qty=qty1, when=   crossover(myVwap,basis)  and close>=vPP  )

bgcolor(strategy.position_size>=1?color.blue:na, transp=75)
barcolor(strategy.position_size>=1?color.green:na)

stopLossVal=  strategy.position_size>=1 ?  close * (1 - (stopLoss*0.01) ) : 0.00

//partial exit
//strategy.close(id="BBofVwap", qty=strategy.position_size/3, when=crossunder(myVwap,upperBand) and strategy.position_size>=1 )  //and close>strategy.position_avg_price)



//exit on lowerband or stoploss 
strategy.close(id="BB_VWAP_PP", comment="P" , qty=strategy.position_size/3, when= crossunder(myVwap,upperBand) and strategy.position_size>=1 and close>strategy.position_avg_price)  //
strategy.close(id="BB_VWAP_PP", comment="Exit All", when=crossunder(myVwap,lowerBand) and strategy.position_size>=1 )
//strategy.close(id="BBofVwapWithFibPivot", comment="Exit All", when=crossunder(close,vPP) and strategy.position_size>=1 )

strategy.close(id="BB_VWAP_PP", comment="Stop Loss Exit", when=crossunder(close,stopLossVal) and strategy.position_size>=1 )

Больше