Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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;
}
Example #4
0
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;
}
Example #5
0
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;
}
Example #6
0
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;
}
Example #8
0
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;
}
Example #9
0
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"));
}
Example #10
0
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;
}
Example #11
0
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;
}