int OHLC::settings (PluginData *pd) { Entity *command = new Entity; BarType bt; CurveOHLCType ct; CurveLineType clt; MAType mat; command->set(QString("plugin"), new QVariant(QString("OHLC"))); command->set(QString("type"), new QVariant(QString("indicator"))); command->set(QString("style"), new QVariant(ct.indexToString(CurveOHLCType::_OHLC))); command->set(QString("upColor"), new QVariant(QString("green"))); command->set(QString("downColor"), new QVariant(QString("red"))); command->set(QString("neutralColor"), new QVariant(QString("blue"))); command->set(QString("label"), new QVariant(QString("OHLC"))); // ma 1 command->set(QString("ma1Input"), new QVariant(bt.indexToString(BarType::_CLOSE))); command->set(QString("ma1Type"), new QVariant(mat.indexToString(MAType::_EMA))); command->set(QString("ma1Style"), new QVariant(clt.indexToString(CurveLineType::_SOLID))); command->set(QString("ma1Width"), new QVariant(1)); command->set(QString("ma1Color"), new QVariant(QString("yellow"))); command->set(QString("ma1Period"), new QVariant(20)); command->set(QString("ma1Label"), new QVariant(QString("MA1"))); // ma 2 command->set(QString("ma2Input"), new QVariant(bt.indexToString(BarType::_CLOSE))); command->set(QString("ma2Type"), new QVariant(mat.indexToString(MAType::_EMA))); command->set(QString("ma2Style"), new QVariant(clt.indexToString(CurveLineType::_SOLID))); command->set(QString("ma2Width"), new QVariant(1)); command->set(QString("ma2Color"), new QVariant(QString("red"))); command->set(QString("ma2Period"), new QVariant(50)); command->set(QString("ma2Label"), new QVariant(QString("MA2"))); // ma 3 command->set(QString("ma3Input"), new QVariant(bt.indexToString(BarType::_CLOSE))); command->set(QString("ma3Type"), new QVariant(mat.indexToString(MAType::_EMA))); command->set(QString("ma3Style"), new QVariant(clt.indexToString(CurveLineType::_SOLID))); command->set(QString("ma3Width"), new QVariant(1)); command->set(QString("ma3Color"), new QVariant(QString("blue"))); command->set(QString("ma3Period"), new QVariant(200)); command->set(QString("ma3Label"), new QVariant(QString("MA3"))); pd->settings = command; return 1; }
Curve * Volume::getMA (Entity *settings) { QVariant *type = settings->get(QString("maType")); if (! type) return 0; QVariant *period = settings->get(QString("maPeriod")); if (! period) return 0; QVariant *var = settings->get(QString("maColor")); if (! var) return 0; QColor color(var->toString()); QVariant *label = settings->get(QString("maLabel")); if (! label) return 0; QVariant *style = settings->get(QString("maStyle")); if (! style) return 0; QVariant *width = settings->get(QString("maWidth")); if (! width) return 0; BarType bt; if (! getMA(bt.indexToString(BarType::_VOLUME), label->toString(), type->toInt(), period->toInt())) return 0; Curve *curve = new Curve(QString("CurveLine")); curve->setLabel(label->toString()); CurveLineType clt; curve->setStyle(clt.stringToIndex(style->toString())); curve->setPen(width->toInt()); curve->setColor(color); curve->fill(label->toString(), QString(), QString(), QString(), color); return curve; }
Curve * OHLC::getOHLC (QString tstyle, QString key, QString tuc, QString tdc, QString tnc) { if (! g_symbol) return 0; Curve *ohlc = new Curve(QString("CurveOHLC")); ohlc->setLabel(key); CurveOHLCType ohlcType; ohlc->setStyle(ohlcType.stringToIndex(tstyle)); QColor uc(tuc); QColor dc(tdc); QColor nc(tnc); BarType bt; ohlc->fill(bt.indexToString(BarType::_OPEN), bt.indexToString(BarType::_HIGH), bt.indexToString(BarType::_LOW), bt.indexToString(BarType::_CLOSE), nc); QList<int> keys = g_symbol->keys(); for (int pos = 1; pos < keys.size(); pos++) { Bar *pbar = ohlc->bar(keys.at(pos - 1)); Bar *bar = ohlc->bar(keys.at(pos)); if (bar->close() > pbar->close()) bar->setColor(uc); else { if (bar->close() < pbar->close()) bar->setColor(dc); } } return ohlc; }
int RSI::settings (PluginData *pd) { BarType bt; CurveLineType clt; MAType mat; Entity *command = new Entity; command->set(QString("plugin"), new QVariant(QString("RSI"))); command->set(QString("type"), new QVariant(QString("indicator"))); command->set(QString("input"), new QVariant(bt.indexToString(BarType::_CLOSE))); command->set(QString("color"), new QVariant(QString("red"))); command->set(QString("period"), new QVariant(14)); command->set(QString("label"), new QVariant(QString("RSI"))); command->set(QString("width"), new QVariant(1)); command->set(QString("style"), new QVariant(clt.indexToString(CurveLineType::_SOLID))); command->set(QString("rsiShow"), new QVariant(TRUE)); command->set(QString("maType"), new QVariant(mat.indexToString(MAType::_EMA))); command->set(QString("maStyle"), new QVariant(clt.indexToString(CurveLineType::_SOLID))); command->set(QString("maWidth"), new QVariant(1)); command->set(QString("maColor"), new QVariant(QString("yellow"))); command->set(QString("maPeriod"), new QVariant(10)); command->set(QString("maLabel"), new QVariant(QString("MA"))); command->set(QString("maShow"), new QVariant(TRUE)); command->set(QString("buyMarkerColor"), new QVariant(QString("green"))); command->set(QString("buyMarkerPrice"), new QVariant(30.0)); command->set(QString("buyMarkerShow"), new QVariant(TRUE)); command->set(QString("sellMarkerColor"), new QVariant(QString("red"))); command->set(QString("sellMarkerPrice"), new QVariant(70.0)); command->set(QString("sellMarkerShow"), new QVariant(TRUE)); pd->settings = command; return 1; }
int Database::getBars (Bars *bd) { if (! bd) return 0; int length = bd->barLength(); if (length == -1) { qDebug() << "Database::getBars: invalid length"; return 0; } if (! getSymbol(bd)) return 0; if (! init()) return 0; // get last date in db QDateTime endDate = getMaxDate(bd); if (! endDate.isValid()) return 0; DateRange dr; //Don't bother to load less the all values into memory //All computers are bound to be able handle this in year 2012 //If ever porting to a mobile device, change at that point //bd->plotRange() QDateTime startDate = dr.interval(endDate, DateRange::_ALL); if (! startDate.isValid()) { qDebug() << "Database::getBars: invalid range"; return 0; } QSqlQuery q(_db); QString s = "SELECT date,open,high,low,close,volume"; s.append(" FROM " + bd->table()); s.append(" WHERE date >=" + startDate.toString("yyyyMMddHHmmss")); s.append(" AND date <=" + endDate.toString("yyyyMMddHHmmss")); s.append(" ORDER BY date ASC"); q.exec(s); if (q.lastError().isValid()) { qDebug() << "Database::getBars:" + q.lastError().text(); qDebug() << s; return 0; } BarType bt; BarLength bl; QDateTime isDate, ieDate; CBar *bar = 0; while (q.next()) { QDateTime lastDate = QDateTime::fromString(q.value(0).toString(), "yyyyMMddHHmmss"); // is date greater than current bar range? if (lastDate >= ieDate || ! bar) { // save old bar if (bar) bd->setBar(bd->bars(), bar); // create new bar bl.interval(lastDate, bd->barLength(), isDate, ieDate); bar = new CBar; bar->setDate(lastDate); bar->set(bt.indexToString(BarType::_OPEN), q.value(1).toDouble()); bar->set(bt.indexToString(BarType::_HIGH), q.value(2).toDouble()); bar->set(bt.indexToString(BarType::_LOW), q.value(3).toDouble()); bar->set(bt.indexToString(BarType::_CLOSE), q.value(4).toDouble()); bar->set(bt.indexToString(BarType::_VOLUME), q.value(5).toDouble()); } else { double v = q.value(2).toDouble(); double v2; bar->get(bt.indexToString(BarType::_HIGH), v2); if (v > v2) bar->set(bt.indexToString(BarType::_HIGH), v); v = q.value(3).toDouble(); bar->get(bt.indexToString(BarType::_LOW), v2); if (v < v2) bar->set(bt.indexToString(BarType::_LOW), v); bar->set(bt.indexToString(BarType::_CLOSE), q.value(4).toDouble()); v = q.value(5).toDouble(); bar->get(bt.indexToString(BarType::_VOLUME), v2); v += v2; bar->set(bt.indexToString(BarType::_VOLUME), v); } } // save any left over bar if (bar) bd->setBar(bd->bars(), bar); return 1; }
int Database::setBars (Bars *symbol) { if (! symbol) return 0; if (! getSymbol(symbol)) { if (! newSymbol(symbol)) return 0; } else { // check if we need to save the name if (! symbol->name().isEmpty()) setName(symbol); } if (! init()) return 0; _db.transaction(); QSqlQuery q(_db); QList<int> keys = symbol->keys(); BarType bt; int loop = 0; for (; loop < keys.size(); loop++) { CBar *bar = symbol->bar(keys.at(loop)); QDateTime dt = bar->date(); QString date = dt.toString("yyyyMMddHHmmss"); // first check if record exists so we know to do an update or insert QString s = "SELECT date FROM " + symbol->table() + " WHERE date =" + date; q.exec(s); if (q.lastError().isValid()) { qDebug() << "Database::setBars:" << q.lastError().text(); qDebug() << s; continue; } if (q.next()) // record exists, use update { s = "UPDATE " + symbol->table() + " SET "; QStringList tl; double v = 0; if (bar->get(bt.indexToString(BarType::_OPEN), v)) tl << "open=" + QString::number(v); v = 0; if (bar->get(bt.indexToString(BarType::_HIGH), v)) tl << "high=" + QString::number(v); v = 0; if (bar->get(bt.indexToString(BarType::_LOW), v)) tl << "low=" + QString::number(v); v = 0; if (bar->get(bt.indexToString(BarType::_CLOSE), v)) tl << "close=" + QString::number(v); v = 0; if (bar->get(bt.indexToString(BarType::_VOLUME), v)) tl << "volume=" + QString::number(v); s.append(tl.join(",")); s.append(" WHERE date=" + date); } else // new record, use insert { QStringList tl; s = "INSERT INTO " + symbol->table() + " (date,open,high,low,close,volume) VALUES("; tl << date; double v = 0; bar->get(bt.indexToString(BarType::_OPEN), v); tl << QString::number(v); v = 0; bar->get(bt.indexToString(BarType::_HIGH), v); tl << QString::number(v); v = 0; bar->get(bt.indexToString(BarType::_LOW), v); tl << QString::number(v); v = 0; bar->get(bt.indexToString(BarType::_CLOSE), v); tl << QString::number(v); v = 0; bar->get(bt.indexToString(BarType::_VOLUME), v); tl << QString::number(v); s.append(tl.join(",")); s.append(")"); } q.exec(s); if (q.lastError().isValid()) { qDebug() << "Database::setBars:" << q.lastError().text(); qDebug() << s; continue; } } _db.commit(); return 1; }
void NetfondsHistoryDownload::parseHistory(QByteArray &ba, QString &symbol, QString &name) { //quote_date,paper,exch,open,high,low,close,volume,value //20121101,OMXS30,Stockholm,1050.03,1064.08,1047.28,1062.51,0,0 QString ts(ba); QStringList ll = ts.split('\n'); Bars sym; sym.setExchange(QString("NETFONDS")); sym.setTicker(symbol); sym.setName(name); sym.setSymbolType(QString("Stock")); BarType bt; int line = 0; int loop = 1; // skip past first line for (; loop < ll.size()-2; loop++) { line++; ts = ll[loop].remove('"'); ts = ts.trimmed(); if (! ts.length()){ QStringList mess; mess << symbol << tr("Error!!"); emit signalMessage(mess.join(" ")); return; } QStringList l = ts.split(","); if (l.size() != 9) { QStringList mess; mess << symbol << ":" << tr("invalid # of fields, record skipped"); emit signalMessage(mess.join(" ")); return; } CBar *bar = new CBar; QDateTime dt = QDateTime::fromString(l.at(0).trimmed(), "yyyyMMdd"); if (! dt.isValid()) { delete bar; QStringList mess; mess << symbol << ":" << tr("invalid date") << l.at(0); emit signalMessage(mess.join(" ")); return; } else bar->setDate(dt); // verify open int pos = 3; bool ok; double t = l.at(pos).trimmed().toDouble(&ok); if (! ok) { delete bar; QStringList mess; mess << tr("Error, invalid open") << l.at(pos); emit signalMessage(mess.join(" ")); return; } else bar->set(bt.indexToString(BarType::_OPEN), t); // verify high pos = 4; t = l.at(pos).trimmed().toDouble(&ok); if (! ok) { delete bar; QStringList mess; mess << tr("Error, invalid high") << l.at(pos); emit signalMessage(mess.join(" ")); return; } else bar->set(bt.indexToString(BarType::_HIGH), t); // verify low pos = 5; t = l.at(pos).trimmed().toDouble(&ok); if (! ok) { delete bar; QStringList mess; mess << tr("Error, invalid low") << l.at(pos); emit signalMessage(mess.join(" ")); return; } else bar->set(bt.indexToString(BarType::_LOW), t); // verify close pos = 6; t = l.at(pos).trimmed().toDouble(&ok); if (! ok) { delete bar; QStringList mess; mess << tr("Error, invalid close") << l.at(pos); emit signalMessage(mess.join(" ")); return; } else bar->set(bt.indexToString(BarType::_CLOSE), t); // verify volume pos = 7; t = l.at(pos).trimmed().toDouble(&ok); if (! ok) { delete bar; QStringList mess; mess << tr("Error, invalid volume") << l.at(pos); emit signalMessage(mess.join(" ")); return; } else bar->set(bt.indexToString(BarType::_VOLUME), t); sym.setBar(sym.bars(), bar); } IDBPlugin *plug = dynamic_cast<IDBPlugin*>(((PluginFactory*)PluginFactory::getPluginFactory())->loadPlugin(QString("Database"))); if (! plug) { QStringList mess; mess << tr("Error, Database plugin missing"); emit signalMessage(mess.join(" ")); return; } if (!plug->init()) return; if (!plug->setBars(&sym)) return; }
int AROON::getAROON (int period, QString ukey, QString dkey) { if (! g_symbol) return 0; TA_RetCode rc = TA_Initialize(); if (rc != TA_SUCCESS) qDebug() << "AROON::AROON: error on TA_Initialize"; QList<int> keys = g_symbol->keys(); TA_Real high[MAX_SIZE]; TA_Real low[MAX_SIZE]; TA_Real out[MAX_SIZE]; TA_Real out2[MAX_SIZE]; TA_Integer outBeg; TA_Integer outNb; BarType bt; QString highKey = bt.indexToString(BarType::_HIGH); QString lowKey = bt.indexToString(BarType::_LOW); int dpos = 0; for (int kpos = 0; kpos < keys.size(); kpos++) { CBar *bar = g_symbol->bar(keys.at(kpos)); double h; if (! bar->get(highKey, h)) continue; double l; if (! bar->get(lowKey, l)) continue; high[dpos] = (TA_Real) h; low[dpos] = (TA_Real) l; dpos++; } rc = TA_AROON(0, dpos - 1, &high[0], &low[0], period, &outBeg, &outNb, &out[0], &out2[0]); if (rc != TA_SUCCESS) { qDebug() << "AROON::getAROON: TA-Lib error" << rc; return 0; } int keyLoop = keys.size() - 1; int outLoop = outNb - 1; while (keyLoop > -1 && outLoop > -1) { CBar *bar = g_symbol->bar(keys.at(keyLoop)); bar->set(dkey, out[outLoop]); bar->set(ukey, out2[outLoop]); keyLoop--; outLoop--; } return 1; }
void MACDDialog::setGUI (Entity *settings) { _settings = settings; // MACD page QWidget *w = new QWidget; QFormLayout *form = new QFormLayout; w->setLayout(form); // input QVariant *set = _settings->get(QString("input")); BarType bt; _input = new QComboBox; _input->addItems(bt.list()); _input->setCurrentIndex(_input->findText(set->toString(), Qt::MatchExactly)); connect(_input, SIGNAL(currentIndexChanged(int)), this, SLOT(modified())); form->addRow(tr("Input"), _input); // color set = _settings->get(QString("macdColor")); _macdColor = new ColorButton(this, QColor(set->toString())); connect(_macdColor, SIGNAL(valueChanged(QColor)), this, SLOT(modified())); form->addRow(tr("Color"), _macdColor); // fast period set = _settings->get(QString("fast")); _fast = new QSpinBox; _fast->setRange(1, 999999); _fast->setValue(set->toInt()); connect(_fast, SIGNAL(valueChanged(const QString &)), this, SLOT(modified())); form->addRow(tr("Fast Period"), _fast); // slow period set = _settings->get(QString("slow")); _slow = new QSpinBox; _slow->setRange(1, 999999); _slow->setValue(set->toInt()); connect(_slow, SIGNAL(valueChanged(const QString &)), this, SLOT(modified())); form->addRow(tr("Slow Period"), _slow); // ma fast type set = _settings->get(QString("fastMA")); MAType mat; _fastMA = new QComboBox; _fastMA->addItems(mat.list()); _fastMA->setCurrentIndex(_fastMA->findText(set->toString(), Qt::MatchExactly)); connect(_fastMA, SIGNAL(currentIndexChanged(int)), this, SLOT(modified())); form->addRow(tr("Fast MA"), _fastMA); // ma slow type set = _settings->get(QString("slowMA")); _slowMA = new QComboBox; _slowMA->addItems(mat.list()); _slowMA->setCurrentIndex(_slowMA->findText(set->toString(), Qt::MatchExactly)); connect(_slowMA, SIGNAL(currentIndexChanged(int)), this, SLOT(modified())); form->addRow(tr("Slow MA"), _slowMA); // line style set = _settings->get(QString("macdStyle")); CurveLineType clt; _macdStyle = new QComboBox; _macdStyle->addItems(clt.list()); _macdStyle->setCurrentIndex(_macdStyle->findText(set->toString(), Qt::MatchExactly)); connect(_macdStyle, SIGNAL(currentIndexChanged(int)), this, SLOT(modified())); form->addRow(tr("Style"), _macdStyle); // width set = _settings->get(QString("macdWidth")); _macdWidth = new QSpinBox; _macdWidth->setRange(1, 99); _macdWidth->setValue(set->toInt()); connect(_macdWidth, SIGNAL(valueChanged(const QString &)), this, SLOT(modified())); form->addRow(tr("Width"), _macdWidth); // show set = _settings->get(QString("macdShow")); _macdShow = new QCheckBox; _macdShow->setChecked(set->toBool()); connect(_macdShow, SIGNAL(toggled(bool)), this, SLOT(modified())); form->addRow(tr("Show"), _macdShow); _tabs->addTab(w, QString("MACD")); // SIGNAL page w = new QWidget; form = new QFormLayout; w->setLayout(form); // style set = _settings->get(QString("signalStyle")); _signalStyle = new QComboBox; _signalStyle->addItems(clt.list()); _signalStyle->setCurrentIndex(_signalStyle->findText(set->toString(), Qt::MatchExactly)); connect(_signalStyle, SIGNAL(currentIndexChanged(int)), this, SLOT(modified())); form->addRow(tr("Style"), _signalStyle); // width set = _settings->get(QString("signalWidth")); _signalWidth = new QSpinBox; _signalWidth->setRange(1, 99); _signalWidth->setValue(set->toInt()); connect(_signalWidth, SIGNAL(valueChanged(const QString &)), this, SLOT(modified())); form->addRow(tr("Width"), _signalWidth); // color set = _settings->get(QString("signalColor")); _signalColor = new ColorButton(this, QColor(set->toString())); connect(_signalColor, SIGNAL(valueChanged(QColor)), this, SLOT(modified())); form->addRow(tr("Color"), _signalColor); // ma type set = _settings->get(QString("signalMA")); _signalMA = new QComboBox; _signalMA->addItems(mat.list()); _signalMA->setCurrentIndex(_fastMA->findText(set->toString(), Qt::MatchExactly)); connect(_signalMA, SIGNAL(currentIndexChanged(int)), this, SLOT(modified())); form->addRow(tr("MA"), _signalMA); // period set = _settings->get(QString("signalPeriod")); _signalPeriod = new QSpinBox; _signalPeriod->setRange(1, 999999); _signalPeriod->setValue(set->toInt()); connect(_signalPeriod, SIGNAL(valueChanged(const QString &)), this, SLOT(modified())); form->addRow(tr("Period"), _signalPeriod); // show set = _settings->get(QString("signalShow")); _signalShow = new QCheckBox; _signalShow->setChecked(set->toBool()); connect(_signalShow, SIGNAL(toggled(bool)), this, SLOT(modified())); form->addRow(tr("Show"), _signalShow); _tabs->addTab(w, tr("Signal")); // HIST page w = new QWidget; form = new QFormLayout; w->setLayout(form); // color set = _settings->get(QString("histColor")); _histColor = new ColorButton(this, QColor(set->toString())); connect(_histColor, SIGNAL(valueChanged(QColor)), this, SLOT(modified())); form->addRow(tr("Color"), _histColor); // show set = _settings->get(QString("histShow")); _histShow = new QCheckBox; _histShow->setChecked(set->toBool()); connect(_histShow, SIGNAL(toggled(bool)), this, SLOT(modified())); form->addRow(tr("Show"), _histShow); _tabs->addTab(w, tr("Histogram")); }
int Volume::run (PluginData *pd) { if (! g_symbol) return 0; QVariant *var = pd->settings->get(QString("upColor")); if (! var) return 0; QColor uc(var->toString()); var = pd->settings->get(QString("downColor")); if (! var) return 0; QColor dc(var->toString()); var = pd->settings->get(QString("neutralColor")); if (! var) return 0; QColor nc(var->toString()); QVariant *label = pd->settings->get(QString("label")); if (! label) return 0; Curve *vol = new Curve(QString("CurveHistogram")); vol->setStyle(CurveHistogramType::_BAR); vol->setLabel(label->toString()); BarType bt; QList<int> keys = g_symbol->keys(); vol->fill(bt.indexToString(BarType::_VOLUME), QString(), QString(), QString(), nc); for (int pos = 1; pos < keys.size(); pos++) { CBar *pbar = g_symbol->bar(keys.at(pos - 1)); CBar *bar = g_symbol->bar(keys.at(pos)); Bar *vbar = vol->bar(keys.at(pos)); double yc = 0; if (! pbar->get(bt.indexToString(BarType::_CLOSE), yc)) continue; double c = 0; if (! bar->get(bt.indexToString(BarType::_CLOSE), c)) continue; if (c > yc) vbar->setColor(uc); else { if (c < yc) vbar->setColor(dc); } } pd->curves << vol; Curve *ma = getMA(pd->settings); if (ma) pd->curves << ma; return 1; }
int DBStock::getBars (PluginData *pd) { if (! init()) return 0; if (! pd->bars) return 0; Bars *bd = pd->bars; // get last date in db QDateTime endDate = getMaxDate(bd); if (! endDate.isValid()) return 0; DateRange dr; QDateTime startDate = dr.interval(endDate, bd->range()); if (! startDate.isValid()) { qDebug() << "DBStock::getBars: invalid range"; return 0; } QSqlQuery q(_db); QString s = "SELECT date,open,high,low,close,volume"; s.append(" FROM " + bd->table()); s.append(" WHERE date >=" + startDate.toString("yyyyMMddHHmmss")); s.append(" AND date <=" + endDate.toString("yyyyMMddHHmmss")); s.append(" ORDER BY date ASC"); q.exec(s); if (q.lastError().isValid()) { qDebug() << "DBStock::getBars:" + q.lastError().text(); qDebug() << s; return 0; } BarType bt; BarLength bl; QDateTime isDate, ieDate; CBar *bar = 0; while (q.next()) { QDateTime lastDate = QDateTime::fromString(q.value(0).toString(), "yyyyMMddHHmmss"); // is date greater than current bar range? if (lastDate >= ieDate || ! bar) { // save old bar if (bar) bd->setBar(bd->bars(), bar); // create new bar bl.interval(lastDate, bd->length(), isDate, ieDate); bar = new CBar; bar->setDate(lastDate); bar->set(bt.indexToString(BarType::_OPEN), q.value(1).toDouble()); bar->set(bt.indexToString(BarType::_HIGH), q.value(2).toDouble()); bar->set(bt.indexToString(BarType::_LOW), q.value(3).toDouble()); bar->set(bt.indexToString(BarType::_CLOSE), q.value(4).toDouble()); bar->set(bt.indexToString(BarType::_VOLUME), q.value(5).toDouble()); } else { double v = q.value(2).toDouble(); double v2; bar->get(bt.indexToString(BarType::_HIGH), v2); if (v > v2) bar->set(bt.indexToString(BarType::_HIGH), v); v = q.value(3).toDouble(); bar->get(bt.indexToString(BarType::_LOW), v2); if (v < v2) bar->set(bt.indexToString(BarType::_LOW), v); bar->set(bt.indexToString(BarType::_CLOSE), q.value(4).toDouble()); v = q.value(5).toDouble(); bar->get(bt.indexToString(BarType::_VOLUME), v2); v += v2; bar->set(bt.indexToString(BarType::_VOLUME), v); } } // save any left over bar if (bar) bd->setBar(bd->bars(), bar); return 1; }