[pshaiCmd] Volume Weighted Average Price (VWAP)

0 84 Views No Comments 3 weeks ago
  • Volume Weighted Average Price (VWAP) custom command.

    This command stores the cumulative information as it goes and limits the amount of data returned to 250 ticks.
    The first call for the command runs a warmup so you do not have to wait for a higher data count!

    NOTE: If you need to store more or less than 250 ticks of results, change the value assigned for [dataLimit] variable.

    UPDATE: Added [resetInterval] parameter. Set this to 1440 minutes and you will get daily resets. The reset is timed to exact minutes/hours/days etc.

    • This topic was modified 3 weeks, 1 day ago by pshai. Reason: Added [resetInterval] parameter
    HaasScript Code
    DefineCommand('VWAP', 'Volume Weighted Average Price')
    
    local interval = DefineParameter(NumberType, 'interval', 'Interval for the price data. Set this to zero to use [Main Interval] setting.', false, 0, 'InputInterval, Number')
    local resetInterval = DefineParameter(NumberType, 'resetInterval', 'Interval in minutes for resetting the cumulative values. If this value is zero, reset function is ignored.', false, 0, 'InputInterval, Input, Number')
    
    DefineIntervalOptimization(interval)
    
    local roundTime = function(time, span)
        return time - (time % (span * 60))
    end
    
    local checkReset = function(isInit, ttime)
        local time = roundTime(not ttime and Time() or ttime, resetInterval)
        
        if isInit then
            Save('rt', time)
        elseif time > Load('rt', time) then
            Save('rt', time)
            return true
        end
        return false
    end
    
    local dataLimit = 250
    local hlc = HLCPrices(interval)
    local v = GetVolume(interval)
    
    local cumTyp = Load('ct', 0)
    local cumVol = Load('cv', 0)
    local result = Load('r', {})
    
    if Load('init') == nil then
        LogWarning('Running a warmup for VWAP...')
        
        local len = #hlc
        local time_step = CurrentInterval() * 60
        local time = Time() - (len * time_step)
        local res = 0
    
        checkReset(true) -- initialize
        
        for i=len, 1, -1 do
            local p = ArrayGet(hlc, i)
            local vol = ArrayGet(v, i)
            
            if checkReset(false, time) then
                cumTyp = 0
                cumVol = 0
            else
                cumTyp = cumTyp + p * vol
                cumVol = cumVol + vol
            end
    
            if cumVol > 0 then
                res = ArrayUnshift(result, cumTyp / cumVol)
            else
                res = ArrayUnshift(result, p)
            end
    
            result = res
            time = time + time_step
        end
    
        
        Save('init', false)
    else
        local p = ArrayGet(hlc, 1)
        local vol = ArrayGet(v, 1)
    
        if checkReset() then
            cumTyp = 0
            cumVol = 0
        end
        
        cumTyp = cumTyp + p * vol
        cumVol = cumVol + vol
    
        if cumVol > 0 then
            result = ArrayUnshift(result, cumTyp / cumVol)
        else
            result = ArrayUnshift(result, p)
        end
    end
    
    if #result > dataLimit then
        result = Grab(result, 0, dataLimit)
    end
    
    
    Save('ct', cumTyp)
    Save('cv', cumVol)
    Save('r', result)
    
    DefineOutput(ListNumberType, result, 'Array containing VWAP values.', 'Plot')
Login or Register to Comment

Unlock your crypto trading potential

Create a free account and enjoy everything we have to offer.

Join for Free