Стратегия количественной торговли на основе полос Боллинджера и VWAP

Автор:Чао Чжан, Дата: 2024-01-04 15:59:46
Тэги:

img

Обзор

Эта стратегия объединяет индикаторы Bollinger Bands (BB) и Volume Weighted Average Price (VWAP) для принятия решений о входе и выходе.

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

Стратегия основывается главным образом на следующих правилах въезда и выезда:

  1. Быстрая линия EMA выше медленной линии EMA как предпосылка для оценки тренда

  2. Купить при закрытии цены выше VWAP, указывающего на рост цены

  3. Введите длинный, если цена закрытия упала ниже нижней полосы BB за последние 10 бар, указывающих на аномалию цены

  4. Продавать, когда цена закрытия превышает верхнюю полосу BB, указывающую на изменение цены

В частности, он сначала оценивает, если 50-дневная EMA выше 200-дневной EMA, чтобы определить общую тенденцию. Затем в сочетании с VWAP, чтобы судить, если цена находится в краткосрочном восходящем тренде. Наконец, используя полосы Боллинджера, чтобы обнаружить краткосрочное падение аномалии как возможность входа.

Правило выхода простое, выход, когда цена превышает верхнюю полосу BB, указывающую на изменение цены.

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

Стратегия сочетает в себе несколько индикаторов для повышения достоверности сигналов входа. Использование EMA для оценки общего тренда позволяет избежать торговли против тренда. VWAP фиксирует краткосрочный подъемный импульс. BB обнаруживает краткосрочные аномалии как сроки входа.

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

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

Для смягчения рисков можно корректировать параметры EMA и BB. Проверить различные индикаторы для обнаружения тренда. Использовать VWAP в более короткие сроки. Оптимизировать параметр BB для лучшей пропускной способности.

Возможности для расширения

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

Заключение

Стратегия сочетает в себе BB и VWAP для обнаружения краткосрочных аномалий цен в качестве времени входа. Использование EMA для определения общего тренда избегает торговли против тренда. Она может быстро обнаружить краткосрочный импульс. Подходит для внутридневной и краткосрочной торговли. Дальнейшее повышение стабильности и прибыльности путем оптимизации параметров и включения большей логики.


/*backtest
start: 2023-12-04 00:00:00
end: 2024-01-03 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/
// © mohanee

//@version=4
strategy(title="VWAP and BB strategy [EEMANI]", overlay=true,pyramiding=2, default_qty_value=3, default_qty_type=strategy.fixed,    initial_capital=10000, currency=currency.USD)
//This strategy combines VWAP and BB indicators
//BUY RULE
//1. EMA50 > EMA 200
//2. if current close > vwap session  value 
//3. check if  price dipped BB lower band for any of last 10 candles
//EXIT RULE
//1. price closes above BB upper band   
//STOP LOSS EXIT
//1. As configured --- default is set to 5%

is_price_dipped_bb(pds,source1) =>
    t_bbDipped=false
    for i=1 to pds
        t_bbDipped:=  (t_bbDipped   or  close[i]<source1) ? true : false
        if t_bbDipped==true
            break
        else
            continue
            
    t_bbDipped
    
// variables  BEGIN
shortEMA = input(50, title="fast EMA", minval=1)
longEMA = input(200, title="slow EMA", minval=1)

//BB

smaLength = input(20, title="BB SMA Length", minval=1)
bbsrc = input(close, title="BB Source")



//addOnDivergence = input(true,title="Add to existing on Divergence")
//exitOption = input(title="exit on RSI or BB", type=input.string, options=["RSI", "BB"],      defval="BB")

//bbSource = input(title="BB  source", type=input.string, options=["close", "vwap"],      defval="close")
     
//vwap_res = input(title="VWAP Resolution", type=input.resolution, defval="session")
stopLoss = input(title="Stop Loss%", defval=5, minval=1)

//variables  END




longEMAval= ema(close, longEMA)
shortEMAval= ema(close, shortEMA)


vwapVal=vwap(close)



// Drawings

//plot emas
plot(longEMAval, color = color.orange, linewidth = 1, transp=0)
plot(shortEMAval, color = color.green, linewidth = 1, transp=0)


//bollinger calculation 
mult = input(2.0, minval=0.001, maxval=50, title="StdDev")
basis = sma(bbsrc, smaLength)
dev = mult * stdev(bbsrc, smaLength)
upperBand = basis + dev
lowerBand = basis - dev
offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500)
//bollinger calculation 

//plot bb
//plot(basis, "Basis", color=#872323, 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=#198787, transp=95)


plot(vwapVal, color = color.purple, linewidth = 1, transp=0)


// Colour background

barcolor(shortEMAval>longEMAval and close<=lowerBand ? color.yellow: na)
  

//longCondition=  shortEMAval > longEMAval and  close>open and  close>vwapVal
longCondition= shortEMAval >= longEMAval  and  close>=vwapVal and close>open  //      close>vwapVal   and   



//Entry
strategy.entry(id="VWAP_BB LE", comment="VB LE" , long=true,  when= longCondition and  is_price_dipped_bb(10,lowerBand) )  //and strategy.position_size<1 

//add to the existing position
//strategy.entry(id="VWAP_RSI LE", comment="VR LE Add" , long=true,  when= addOnDivergence==true and strategy.position_size>=1 and close<strategy.position_avg_price   and (close<lowerBand or  low<lowerBand) and rsiVal>rsi_buy_line)

barcolor(strategy.position_size>=1  ? color.blue: na)



strategy.close(id="VWAP_BB LE", comment="TP Exit VB LE",   when=crossover(close,upperBand) )

//stoploss
stopLossVal =   strategy.position_avg_price * (1-(stopLoss*0.01) )
strategy.close(id="VB LE", comment="SL Exit",   when= close < stopLossVal)



Больше