VWAP Deviation Bands

stable
By Strooth in Hybrid Published November 2021 👁 1,650 views 💬 0 comments

Description

Triggers signal long/signal short on cross of the bands lines
HaasScript
DefineCommand("VWAP_DEVBANDS", "VWAP Stdev Bands")
local interval = DefineParameter(NumberType, 'Interval', 'The time series interval', false, CurrentInterval(), 'InputInterval/CurrentInterval')
local vwapint = DefineParameter(NumberType, 'VWAPInterval', 'The time series interval for vwap reset', false, 1440, 'InputInterval/CurrentInterval')
local market = DefineParameter(DynamicType, 'Market', 'The market to calculate on', false, PriceMarket(), 'Input/PriceMarket()')
local plot = DefineParameter(BooleanType, 'Plot', 'Enable plotting the chart', false, true, 'true/false')
local chartindex = 0 
local fullcdl = true
local hlc = false
local close = ClosePrices(interval, fullcdl, market, hlc)

local devUp1 = Input("Stdev above (1)", 1.28)
local devDn1 = Input("Stdev below (1)", 1.28)

local devUp2 = Input("Stdev above (2)", 2.01)
local devDn2 = Input("Stdev below (2)", 2.01)

local devUp3 = Input("Stdev above (3)", 2.51)
local devDn3 = Input("Stdev below (3)", 2.51)

local devUp4 = Input("Stdev above (4)", 3.09)
local devDn4 = Input("Stdev below (4)", 3.09)

local devUp5 = Input("Stdev above (5)", 4.01)
local devDn5 = Input("Stdev below (5)", 4.01)

local hl2 = HLPrices(interval, fullcdl, market, hlc)
local volume = GetVolume(interval, fullcdl, market, hlc)

local trigger = Load('trigger', true)
local newSession = trigger == OptimizedForInterval(vwapint, function()
  local trigger = Load('trigger', true)
  Save('trigger', not trigger)
  return trigger
end)

local vwapsum = Load('vwapsum', hl2*volume)
local volumesum = Load('volumesum', volume)
local v2sum = Load('v2sum', volume*hl2*hl2)

vwapsum = newSession and hl2*volume or vwapsum+hl2*volume
volumesum = newSession and volume or volumesum+volume
v2sum = newSession and volume*hl2*hl2 or v2sum+volume*hl2*hl2

local vwap = vwapsum/volumesum
local dev = Sqrt(Max(v2sum/volumesum - vwap*vwap, 0))


local U1Line= vwap + devUp1 * dev
local D1Line= vwap - devDn1 * dev
local U2Line= vwap + devUp2 * dev
local D2Line= vwap - devDn2 * dev
local U3Line= vwap + devUp3 * dev
local D3Line= vwap - devDn3 * dev
local U4Line= vwap + devUp4 * dev
local D4Line= vwap - devDn4 * dev
local U5Line= vwap + devUp5 * dev
local D5Line= vwap - devDn5 * dev

if plot == true then 
    local A=Plot(chartindex, "VWAP", vwap, {c=White})
    local U1=Plot(chartindex, "VWAP Upper", U1Line, {c=Gray})
    local D1=Plot(chartindex, "VWAP Lower", D1Line, {c=Gray})
    local U2=Plot(chartindex, "VWAP Upper (2)", U2Line, {c=Red})
    local D2=Plot(chartindex, "VWAP Lower (2)", D2Line, {c=Green})
    local U3=Plot(chartindex, "VWAP Upper (3)", U3Line, {c=Red})
    local D3=Plot(chartindex, "VWAP Lower (3)", D3Line, {c=Green})
    local U4=Plot(chartindex, "VWAP Upper (4)", U4Line, {c=Red})
    local D4=Plot(chartindex, "VWAP Lower (4)", D4Line, {c=Green})
    local U5=Plot(chartindex, "VWAP Upper (5)", U5Line, {c=Red})
    local D5=Plot(chartindex, "VWAP Lower (5)", D5Line, {c=Green})

    PlotCircle(A, White(50))
    PlotCircle(U1, Gray(50))
    PlotCircle(D1, Gray(50))
    PlotBands(U1, U2, Maroon(10))
    PlotBands(D1, D2, DarkGreen(10))
    PlotBands(U2, U3, Maroon(10))
    PlotBands(D2, D3, DarkGreen(10))
    PlotBands(U3, U4, Maroon(10))
    PlotBands(D3, D4, DarkGreen(10))
    PlotBands(U4, U5, Maroon(10))
    PlotBands(D4, D5, DarkGreen(10))
    PlotBands(A, U1, Gray(10))
    PlotBands(A, D1, Gray(10))
end 
Save('vwapsum', vwapsum)
Save('volumesum', volumesum)
Save('v2sum', v2sum)

local signal = SignalNone

local cp = CurrentPrice()

if ArrayContains({UseSignalIf(GetCrossOverUnderSignal(cp.bid, U5Line), SignalShort),
UseSignalIf(GetCrossOverUnderSignal(cp.bid, U4Line), SignalShort),
UseSignalIf(GetCrossOverUnderSignal(cp.bid, U3Line), SignalShort),
UseSignalIf(GetCrossOverUnderSignal(cp.bid, U2Line), SignalShort),
UseSignalIf(GetCrossOverUnderSignal(cp.bid, U1Line), SignalShort)}, SignalShort) then 
signal = SignalShort 
end
if ArrayContains({UseSignalIf(GetCrossOverUnderSignal(cp.ask, D1Line), SignalLong),
UseSignalIf(GetCrossOverUnderSignal(cp.ask, D2Line), SignalLong),
UseSignalIf(GetCrossOverUnderSignal(cp.ask, D3Line), SignalLong),
UseSignalIf(GetCrossOverUnderSignal(cp.ask, D4Line), SignalLong),
UseSignalIf(GetCrossOverUnderSignal(cp.ask, D5Line), SignalLong)}, SignalLong) then
signal = SignalLong
end

DefineOutput(DynamicType, signal, 'The signal')

0 Comments

Sign in to leave a comment.

No comments yet. Be the first!