void ContractForm::onGotContract(QString key, const BfContractData& bfItem) { QVariantMap vItem; vItem.insert("symbol", bfItem.symbol().c_str()); vItem.insert("exchange", bfItem.exchange().c_str()); vItem.insert("name", bfItem.name().c_str()); vItem.insert("productClass", ProtoUtils::formatProduct(bfItem.productclass())); vItem.insert("volumeMultiple", bfItem.volumemultiple()); vItem.insert("priceTick", bfItem.pricetick()); vItem.insert("maxLimit", bfItem.maxlimit()); vItem.insert("minLimit", bfItem.minlimit()); vItem.insert("maxMarket", bfItem.maxmarket()); vItem.insert("minMarket", bfItem.minmartet()); vItem.insert("key", key); //根据id找到对应的行,然后用列的text来在map里面取值设置到item里面= int row = ui->tableWidget->rowCount(); ui->tableWidget->insertRow(row); for (int i = 0; i < table_col_.count(); i++) { QVariant raw_val = vItem.value(table_col_.at(i)); QString str_val = raw_val.toString(); if (raw_val.type() == QMetaType::Double || raw_val.type() == QMetaType::Float) { str_val = QString().sprintf("%6.3f", raw_val.toDouble()); } QTableWidgetItem* item = new QTableWidgetItem(str_val); ui->tableWidget->setItem(row, i, item); } }
void DbService::dbInit() { leveldb::WriteOptions options; leveldb::WriteBatch batch; // key: contract+ // key: contract= BfContractData bfNullContract; std::string key = "contract+"; std::string val = bfNullContract.SerializeAsString(); batch.Put(key, val); key = "contract="; val = bfNullContract.SerializeAsString(); batch.Put(key, val); db_->Write(options, &batch); }
void ContractForm::refresh() { leveldb::DB* db = g_sm->dbService()->getDb(); leveldb::ReadOptions options; options.fill_cache = false; leveldb::Iterator* it = db->NewIterator(options); if (!it) { qFatal("NewIterator == nullptr"); } //第一个是contract+ //最后一个是contract= QString key; key = QStringLiteral("contract+"); ui->tableWidget->clearContents(); ui->tableWidget->setRowCount(0); it->Seek(leveldb::Slice(key.toStdString())); if (it->Valid()) { it->Next(); } for (; it->Valid(); it->Next()) { //遇到了前后两个结束item const char* buf = it->value().data(); int len = it->value().size(); BfContractData bfContract; //std::string stdKey = it->key().ToString(); //std::string stdVal = it->value().ToString(); //if(!bfContract.ParseFromString(stdVal)){ if (!bfContract.ParseFromArray(buf, len)) { qFatal("ParseFromArray fail"); break; } if (bfContract.symbol().length() == 0) { break; } onGotContract(QString::fromStdString(it->key().ToString()), bfContract); } delete it; }
void TickForm::on_tableWidget_cellClicked(int row, int column) { (void)column; QString symbol = ui->tableWidget->item(row, table_col_.indexOf("symbol"))->text(); QString exchange = ui->tableWidget->item(row, table_col_.indexOf("exchange"))->text(); auto item = ui->tableWidget->item(row, table_col_.indexOf("lastPrice")); double lastPrice = item ? item->text().toDouble() : 0.0; item = ui->tableWidget->item(row, table_col_.indexOf("upperLimit")); double upperLimit = item ? item->text().toDouble() : 0.0; item = ui->tableWidget->item(row, table_col_.indexOf("lowerLimit")); double lowerLimit = item ? item->text().toDouble() : 0.0; ui->lineEditSymbol->setText(symbol); ui->lineEditExchange->setText(exchange); //设置price ui->doubleSpinBoxPrice->setValue(lastPrice); ui->doubleSpinBoxPrice->setMaximum(upperLimit); ui->doubleSpinBoxPrice->setMinimum(lowerLimit); void* contract = g_sm->ctpMgr()->getContract(symbol); if (contract) { BfContractData bfContract; CtpUtils::translateContract(contract, &bfContract); ui->doubleSpinBoxPrice->setSingleStep(bfContract.pricetick()); // 设置volume ui->spinBoxVolume->setValue(bfContract.minlimit()); ui->spinBoxVolume->setMaximum(bfContract.maxlimit()); ui->spinBoxVolume->setMinimum(bfContract.minlimit()); ui->spinBoxVolume->setSingleStep(bfContract.minlimit()); } }
void DbService::onGotContracts(QStringList ids, QStringList idsAll) { g_sm->checkCurrentOn(ServiceMgr::DB); leveldb::WriteOptions options; leveldb::WriteBatch batch; //按排序后合约来= QStringList sorted_ids = idsAll; sorted_ids.sort(); for (int i = 0; i < sorted_ids.length(); i++) { QString id = sorted_ids.at(i); void* contract = g_sm->ctpMgr()->getContract(id); BfContractData bfItem; CtpUtils::translateContract(contract, &bfItem); // key: contract.exchange.symbol std::string key = QString().sprintf("contract.%s.%s", bfItem.exchange().c_str(), bfItem.symbol().c_str()).toStdString(); std::string val = bfItem.SerializeAsString(); batch.Put(key, val); } db_->Write(options, &batch); }
void DbService::getContract(const BfGetContractReq* request, ::grpc::ServerWriter<BfContractData>* writer) { g_sm->checkCurrentOn(ServiceMgr::EXTERNAL); if (request->symbol().length() == 0 || request->exchange().length() == 0) { BfDebug("invalid parm,ignore"); return; } if (request->symbol() == "*" && request->exchange() == "*") { leveldb::DB* db = db_; leveldb::ReadOptions options; options.fill_cache = false; leveldb::Iterator* it = db->NewIterator(options); if (!it) { qFatal("NewIterator == nullptr"); } //第一个是contract+ //最后一个是contract= QString key = QStringLiteral("contract+"); it->Seek(leveldb::Slice(key.toStdString())); if (it->Valid()) { it->Next(); } for (; it->Valid(); it->Next()) { //遇到了前后两个结束item const char* buf = it->value().data(); int len = it->value().size(); BfContractData bfContract; //std::string stdKey = it->key().ToString(); //std::string stdVal = it->value().ToString(); //if(!bfContract.ParseFromString(stdVal)){ if (!bfContract.ParseFromArray(buf, len)) { qFatal("ParseFromArray fail"); break; } if (bfContract.symbol().length() == 0) { break; } writer->Write(bfContract); } delete it; } else { leveldb::ReadOptions options; std::string val; // key: contract-symbol-exchange std::string key = QString().sprintf("contract-%s-%s", request->symbol().c_str(), request->exchange().c_str()).toStdString(); leveldb::Status status = db_->Get(options, key, &val); if (status.ok()) { BfContractData bfItem; if (!bfItem.ParseFromString(val)) { qFatal("ParseFromString error"); return; } if (bfItem.symbol().length() == 0) { return; } writer->Write(bfItem); } } }
void DbService::insertContract(const BfContractData& bfItem) { BfDebug(__FUNCTION__); g_sm->checkCurrentOn(ServiceMgr::DB); if (bfItem.symbol().length() == 0 || bfItem.exchange().length() == 0 || bfItem.name().length() == 0) { BfDebug("invalid contract,ignore"); return; } leveldb::WriteOptions options; leveldb::WriteBatch batch; std::string key, val; if (1) { // key: contract-symbol-exchange key = QString().sprintf("contract-%s-%s", bfItem.symbol().c_str(), bfItem.exchange().c_str()).toStdString(); bool ok = bfItem.SerializeToString(&val); if (!ok) { qFatal("SerializeToString fail"); } batch.Put(key, val); // key: tick-symbol-exchange+ // key: tick-symbol-exchange= BfTickData bfNullTick; key = QString().sprintf("tick-%s-%s+", bfItem.symbol().c_str(), bfItem.exchange().c_str()).toStdString(); val = bfNullTick.SerializeAsString(); batch.Put(key, val); key = QString().sprintf("tick-%s-%s=", bfItem.symbol().c_str(), bfItem.exchange().c_str()).toStdString(); val = bfNullTick.SerializeAsString(); batch.Put(key, val); // key: bar-symbol-exchange-period+ // key: bar-symbol-exchange-period= BfBarData bfNullBar; for (int i = BfBarPeriod_MIN; i <= BfBarPeriod_MAX; i++) { key = QString().sprintf("bar-%s-%s-%s+", bfItem.symbol().c_str(), bfItem.exchange().c_str(), qPrintable(ProtoUtils::formatPeriod((BfBarPeriod)i))).toStdString(); val = bfNullBar.SerializeAsString(); batch.Put(key, val); key = QString().sprintf("bar-%s-%s-%s=", bfItem.symbol().c_str(), bfItem.exchange().c_str(), qPrintable(ProtoUtils::formatPeriod((BfBarPeriod)i))).toStdString(); val = bfNullBar.SerializeAsString(); batch.Put(key, val); } } db_->Write(options, &batch); }