#include "GetBarsFromDatabase.h" BarList GetBarsFromDatabase::getBars(std::string symbol, bool ignore_date /*= false*/, int max_days_back /*=0*/) { BarList bars; std::string sql = "SELECT UNIX_TIMESTAMP(date), open, high, low, close, volume, print_count FROM bars_d WHERE "; if (!ignore_date) { _database.tryQueryUntilSuccess("SELECT @latest_date := date FROM bars_d WHERE date <= CURDATE() order by date desc limit 1"); _database.tryQueryUntilSuccess("SELECT @latest_bar := date FROM bars_d WHERE date <= CURDATE() AND symbol = \"" + symbol + "\" order by date desc limit 1"); sql += "@latest_bar = @latest_date AND "; } if (max_days_back > 0) { sql += "date >= CURDATE() - INTERVAL " + itoa(max_days_back) + " DAY AND "; } sql += "symbol = \"" + symbol + "\" ORDER BY DATE ASC"; MysqlResultRef ref = _database.tryQueryUntilSuccess(sql); //std::cout << ref->numRows() << std::endl; while (ref->rowIsValid()) { BarData bar; bar.startTime = ref->getIntegerField(0, 0); bar.open = ref->getDoubleField(1, 0.0); bar.high = ref->getDoubleField(2, 0.0); bar.low = ref->getDoubleField(3, 0.0); bar.close = ref->getDoubleField(4, 0.0); bar.volume = ref->getIntegerField(5, 0); bar.printCount = ref-> getIntegerField(6, 0); bars.push_back(bar); ref->nextRow(); } return bars; } SplitList GetBarsFromDatabase::getSplits(std::string symbol) { SplitList splits; std::string sql = "SELECT UNIX_TIMESTAMP(date), old_shares, new_shares FROM splits WHERE symbol = \"" + symbol + "\" ORDER BY DATE ASC" ; MysqlResultRef ref = _database.tryQueryUntilSuccess(sql); //std::cout << ref->numRows() << std::endl; while (ref->rowIsValid()) { Split split; int oldShares, newShares; split.date = ref->getIntegerField(0, 0); oldShares = ref->getIntegerField(1, 0); newShares = ref-> getIntegerField(2, 0); if (oldShares > 0 && newShares > 0 && split.date > 0) { split.splitFactor = newShares / oldShares; splits.push_back(split); } ref->nextRow(); } return splits; } BarList GetBarsFromDatabase::adjustPrices(const BarList &bars, const SplitList &splits) { BarList returnBars = bars; for (unsigned int i = 0; i < splits.size(); i++) { for (unsigned int j = 0; j < returnBars.size(); j++) { if (returnBars[j].startTime < splits[i].date && splits[i].splitFactor > 0) { returnBars[j].open = returnBars[j].open / splits[i].splitFactor; returnBars[j].high = returnBars[j].high / splits[i].splitFactor; returnBars[j].low = returnBars[j].low / splits[i].splitFactor; returnBars[j].close = returnBars[j].close / splits[i].splitFactor; returnBars[j].volume = returnBars[j].volume * splits[i].splitFactor; returnBars[j].printCount = returnBars[j].printCount * splits[i].splitFactor; } } } return returnBars; }