Стратегия бычьего прорыва, основанная на полосах Боллинджера и VWAP


Дата создания: 2024-02-06 14:36:26 Последнее изменение: 2024-02-06 14:36:26
Копировать: 1 Количество просмотров: 885
1
Подписаться
1617
Подписчики

Стратегия бычьего прорыва, основанная на полосах Боллинджера и VWAP

Обзор

Эта стратегия использует индикатор пояса буринга, чтобы отслеживать VWAP, и принимает многоголовую стратегию, когда VWAP взлетает на среднюю полосу пояса буринга, чтобы определить, что это многоголовый прорыв; а когда VWAP падает на нижнюю полосу пояса буринга, чтобы определить, что это подтверждение пустого, и выходит из поля. В то же время, стратегия также вводит основную опорную точку Pivot Point в качестве вспомогательного критерия для входного сигнала, чтобы отфильтровать некоторые ложные прорывы.

Стратегический принцип

  1. Расчет VWAP.
  2. Расчет VWAP в бриндовых полосах, включающих верхний, средний и нижний рельсы.
  3. Определить, будет ли VWAP пробиваться вверх по средней орбите Бринской полосы, а если да, то с использованием многоголовой стратегии.
  4. Стоп-лост установлен на уровне 5%.
  5. Если VWAP вниз прорвется вниз по Бринской полосе, то считается, что безвоздушная сторона подтверждена, и позиция выходит из игры; также выходит из игры, если сбой был вызван.

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

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

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

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

Направление оптимизации

  1. Вместе с другими показателями, такими как MACD, KDJ и т. д., можно дополнительно фильтровать входящие и исходящие сигналы.
  2. Оптимальное сочетание параметров можно найти, оптимизировав длину и стандартное отклонение ленты Брин.
  3. Можно внедрить алгоритмы машинного обучения для динамической оптимизации параметров буринской полосы.
  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 )