#include "../../shared/SimpleLogFile.h" #include "AverageHistoricalVolume.h" AverageHistoricalData::AverageHistoricalData(DataNodeArgument const &args) : _symbol(args.getStringValue()), _values(new Integer[AHV_POST_MARKET+1]), _valid(false) { addAutoLink(FileOwnerDataNode::find(this, 0, _volumeData, "V_OvernightData.csv")); updateValues(); } AverageHistoricalData::~AverageHistoricalData() { delete[] _values; } void AverageHistoricalData::onWakeup(int msgId) { updateValues(); notifyListeners(); } void AverageHistoricalData::updateValues() { // This caching was originaly part of the RelativeVolume data node. But // I moved it here, so other consumers can also take advantage of the cache. // This can't be any less effecient than deferring the work. We know that // at least one consumer would have requested all of these values to fill // it's own cache. _valid = _volumeData->containsRow(_symbol); if (_valid) { for (int i = 1; i < AHV_POST_MARKET; i++) _values[i] = strtollDefault(_volumeData->get(ntoa(i), _symbol), 0); _values[AHV_PRE_MARKET] = strtollDefault(_volumeData->get("Pre", _symbol), 0); _values[AHV_POST_MARKET] = strtollDefault(_volumeData->get("Post", _symbol), 0); } else { for (int i = AHV_PRE_MARKET; i <= AHV_POST_MARKET; i++) _values[i] = 0; TclList msg; msg< AHV_POST_MARKET)) return 0; return _values[period]; } DataNodeLink *AverageHistoricalData::find(DataNodeListener *listener, int msgId, AverageHistoricalData *&node, std::string const &symbol) { return findHelper(listener, msgId, node, symbol); } int AverageHistoricalData::higherTimeFrame(time_t dateTime) { const time_t time = secondOfTheDay(dateTime); if (time < MARKET_HOURS_OPEN) return AHV_PRE_MARKET; return std::min(AHV_POST_MARKET, (int)((time - MARKET_HOURS_OPEN) / AHV_PERIOD + 1)); } time_t AverageHistoricalData::timeFrameEnd(int period) { if (period == AHV_POST_MARKET) return 24 * MARKET_HOURS_HOUR; return MARKET_HOURS_OPEN + period * AHV_PERIOD; }