// VWAP.h
#pragma once
#include <onepiece/models/TickData.h>
#include <queue>
class VWAP
{
public:
VWAP() = delete;
VWAP(unsigned int windows);
~VWAP();
void UpdateTick(TickSPtr tickSPtr);
double Value();
bool Check();
private:
unsigned int m_windows;
double m_sumLastPriceValue;
double m_sumSizeValue;
queue<TickSPtr> m_ticks;
bool m_isOk;
};
// VWAP.cc
#include <onepiece/signals/VWAP.h>
VWAP::VWAP(unsigned int windows): m_windows(windows), m_sumLastPriceValue(0), m_sumSizeValue(0), m_isOk(false) {
}
VWAP::~VWAP() {
while (!this->m_ticks.empty()) {
this->m_ticks.pop();
}
}
void VWAP::UpdateTick(TickSPtr tickSPtr) {
if (this->m_ticks.size() < this->m_windows) {
this->m_ticks.push(tickSPtr);
this->m_sumLastPriceValue += (tickSPtr->LastPrice() * tickSPtr->Volume());
this->m_sumSizeValue += tickSPtr->Volume();
this->m_isOk = false;
return;
}
this->m_ticks.push(tickSPtr);
this->m_sumLastPriceValue += (tickSPtr->LastPrice() * tickSPtr->Volume());
this->m_sumSizeValue += tickSPtr->Volume();
TickSPtr firstTickSPtr = this->m_ticks.front();
this->m_sumLastPriceValue -= (firstTickSPtr->LastPrice() * firstTickSPtr->Volume());
this->m_sumSizeValue -= firstTickSPtr->Volume();
this->m_ticks.pop();
this->m_isOk = true;
}
double VWAP::Value() {
return (0 == this->m_sumSizeValue) ? 0 : (this->m_sumLastPriceValue / this->m_sumSizeValue);
}
bool VWAP::Check() {
return this->m_isOk;
}