JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 2
  • Score
    100M100P100Q40787F
  • License MIT

Quickly calculate moving volume-weighted average prices [aka VWAP or MVWAP] from a stream of OHLCV candles. Uses prefix sums and static 'rolling' arrays for efficiency.

Package Exports

  • vwap-fast
  • vwap-fast/index.js

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (vwap-fast) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

vwap-fast

Quickly calculate moving volume-weighted average prices [aka VWAP or MVWAP] from a stream of OHLCV candles. Uses prefix sums in static "rolling" arrays for efficiency.

I haven't tested this much so use at your own risk.

Installation

npm i vwap-fast

Usage

//example candle -- can use {o h l c v} or {open high low close volume} 
// var candle = {
//     o: 1,
//     h: 1,
//     l: 1,
//     c: 1,
//     v: 1000
// };

var Vwap = require('vwap-fast');
var maximumPeriods = 20000; //default 20000
var vwap = new Vwap(maximumPeriods); //note - 'new' keyword is optional, works either way

//first we generate 1,000,000 candles
for(var i=0;i<1000000;i++){
    var candle = vwap.generateFakeCandle(); //generate random candle around price $150 {o h l c v}
    //submitCandle(candle, useTypicalPrice=true, doAutoShift=true) 
    // -- typical price is (l+h+c)/3 -- otherwise use closing price
    // -- doAutoShift resets the zero-th prefix sum to zero every 
    // time the array "rolls over" to increase numeric stability 
    // [for very large runs where the prefix sums may overflow or lose precision]
    vwap.submitCandle(candle);
}

//or submit bulk with vwap.submitCandles(candles)

//get mvwap for 1000 periods
var vwap1k = vwap.getVwap(1000) //getVwap(nPeriods >= 1)

//see also getVwapNPeriodsAgo(nPeriodsInVwap, nPeriodsAgo) 
//see also lastPriceIsBelowVwaps(listOfPeriods) ==> true if most recent price below all vwap periods in input 
//see also submitAndTestCandles = function(_candles, listOfPeriods, useTypicalPrice=true, doAutoShift=true){
// _this.submitCandles(_candles, useTypicalPrice, doAutoShift);
// return lastPriceIsBelowVwaps(listOfPeriods);
// }

console.log(vwap1k);
//150.01489792240628

//more fields:
//vwap.totalCandles //total number of candles ever submitted to this vwap [including any that have been purged etc]
//vwap.prefixSums_PriceTimesVolume //rolling array of prefix sums for price x volume
//vwap.prefixSums_Volume //rolling array of prefix sums for volume
//vwap.currentArrayIndex //current index for "rolling" arrays. loops from 0...maximumPeriods

//apply to candles arr as indicator
//vwap.applyVwapsToCandles(candles, [arrOfPeriods])
//candle each get new fields like
//     vwap20: 15261.205067920584,
//     vwap60: 15261.205067920584,
//     vwap180: 15261.205067920584,
//     vwap240: 15261.205067920584,
//     belowAllVwaps: false,
//     aboveAllVwaps: true

stonks