#include "IntradayStochastic.h" void IntradayStochastic::onWakeup(int msgId) { makeCurrent(); notifyListeners(); } void IntradayStochastic::makeCurrent() { if (!_candleData) return; CurrentCandles::LastTransition lastTransition; CurrentCandles::CandleArray const &candles = _candleData->getHistory(_lastEpoch, lastTransition); switch (lastTransition) { case CurrentCandles::ltNone: return; case CurrentCandles::ltReset: _formula.reset(); break; case CurrentCandles::ltNewCandle: break; case CurrentCandles::ltUpdateCurrentCandle: { const int count = _formula.getDayCount(); if (count) { CurrentCandles::SingleCandle const &newLastCandle = candles[candles.size() - 1]; // We know that the last candle changed. But maybe it's a change // that we don't care about. Every print in a normal stock will // cause the last candle to change. But if only the volume // changes, not the price, we don't care. We will assume that // the high and low don't change unless the close changes. if (newLastCandle.close != _lastPrice) _formula.limitDayCount(count - 1); } } } while (_formula.getDayCount() < (int)candles.size()) { CurrentCandles::SingleCandle const &candle = candles[_formula.getDayCount()]; _formula.addDay(candle.high, candle.low, candle.close); } if (candles.size() == 0) _lastPrice = 0; else _lastPrice = candles[candles.size() - 1].close; _formula.getValues(_valid, _pK, _pD); } IntradayStochastic::IntradayStochastic(DataNodeArgument const &args) : _candleData(NULL), _valid(false), _pK(0.0), _pD(0.0), _lastEpoch(0), _lastPrice(0.0) { DataNodeArgumentVector const &argList = args.getListValue(); assert(argList.size() == 5); // symbol, minutesPerBar, bars, rangeCount, pKSmaCount, pDSmaCount std::string const &symbol = argList[0].getStringValue(); const int minutesPerBar = argList[1].getIntValue(); const int rangeCount = argList[2].getIntValue(); const int pKSmaCount = argList[3].getIntValue(); const int pDSmaCount = argList[4].getIntValue(); _formula.setParams(rangeCount, pKSmaCount, pDSmaCount); if (_formula.inputsAreValid()) { addAutoLink(CurrentCandles::find(this, 0, _candleData, symbol, minutesPerBar)); makeCurrent(); } } void IntradayStochastic::get(bool &valid, double &pK, double &pD) { makeCurrent(); valid = _valid; pK = _pK; pD = _pD; } DataNodeLink *IntradayStochastic::findFull(DataNodeListener *listener, int msgId, IntradayStochastic *&node, std::string const &symbol, int minutesPerBar, int rangeCount, int pKSmaCount, int pDSmaCount) { return findHelper(listener, msgId, node, argList(symbol, minutesPerBar, rangeCount, pKSmaCount, pDSmaCount)); }