ConstantValue::ConstantValue(double value, size_t len, size_t discard) :IndicatorImp("CVAL", 1) { m_discard = discard > len ? len : discard; setParam<double>("value", value); if (len == 0) return; _readyBuffer(len, m_result_num); for (size_t i = m_discard; i < len; ++i) { _set(value, i); } }
void ConstantValue::_calculate(const Indicator& data) { double value = getParam<double>("value"); int discard = getParam<int>("discard"); size_t total = 0; if (isLeaf()) { //叶子节点 KData k = getContext(); if (k.getStock().isNull()) { _readyBuffer(1, 1); if (discard < 1) { m_discard = 0; _set(value, 0, 0); } else { m_discard = 1; } return; } total = k.size(); if (0 == total) { return; } _readyBuffer(total, 1); } else { //非叶子节点 total = data.size(); discard = data.discard() > discard ? data.discard() : discard; } m_discard = discard > total ? total : discard; for (size_t i = m_discard; i < total; ++i) { _set(value, i, 0); } }
void SaftyLoss::_calculate(const Indicator& data) { size_t total = data.size(); if (total == 0) { return; } _readyBuffer(total, 1); int n1 = getParam<int>("n1"); int n2 = getParam<int>("n2"); double p = getParam<double>("p"); m_discard = data.discard() + n1 + n2 - 2; if (m_discard >= total) { m_discard = total; return; } price_t sum = 0.0; size_t num = 0; price_t result = 0.0; size_t start = discard(); for (size_t i = start; i < total; ++i) { result = 0.0; for (size_t j = i + 1 - n2; j <= i; ++j) { sum = 0.0; num = 0; for (size_t k = j + 2 -n1; k <=j; ++k) { price_t pre = data[k-1]; price_t cur = data[k]; if (pre > cur) { sum += pre - cur; ++num; } } price_t temp = data[j]; if (num != 0) { temp = temp - (p * sum / num); } if (temp > result) { result = temp; } } _set(result, i); } }
void IPriceList::_calculate(const Indicator& data) { //如果在叶子节点,直接取自身的data参数 if (isLeaf()) { PriceList x = getParam<PriceList>("data"); int discard = getParam<int>("discard"); size_t total = x.size(); _readyBuffer(total, 1); //更新抛弃数量 m_discard = discard > total ? total : discard; for (size_t i = m_discard; i < total; ++i) { _set(x[i], i); } return; } //不在叶子节点上,则忽略本身的data参数,认为其输入实际为函数入参中的data int result_index = getParam<int>("result_index"); if (result_index < 0 || result_index >= data.getResultNumber()) { HKU_ERROR("result_index out of range! [IPriceList::IPriceList]"); return; } size_t total = data.size(); _readyBuffer(total, 1); for (size_t i = data.discard(); i < total; ++i) { _set(data.get(i, result_index), i); } //更新抛弃数量 m_discard = data.discard(); }
void Macd::_calculate(const Indicator& data) { size_t total = data.size(); if (total == 0) { return; } _readyBuffer(total, 3); int n1 = getParam<int>("n1"); int n2 = getParam<int>("n2"); int n3 = getParam<int>("n3"); m_discard = data.discard(); if (total <= m_discard) { m_discard = total; return; } price_t m1 = 2.0 / (n1 + 1); price_t m2 = 2.0 / (n2 + 1); price_t m3 = 2.0 / (n3 + 1); price_t ema1 = data[0]; price_t ema2 = data[0]; price_t diff = 0.0; price_t dea = 0.0; price_t bar = 0.0; _set(bar, 0, 0); _set(diff, 0, 1); _set(dea, 0, 2); for (size_t i = 1; i < total; ++i) { ema1 = (data[i] - ema1) * m1 + ema1; ema2 = (data[i] - ema2) * m2 + ema2; diff = ema1 - ema2; dea = diff * m3 + dea - dea * m3; bar = diff - dea; _set(bar, i, 0); _set(diff, i, 1); _set(dea, i, 2); } }