Esempio n. 1
0
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);
    }
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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());
    }
}
Esempio n. 5
0
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);
}
Esempio n. 6
0
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);
        }
    }
}
Esempio n. 7
0
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);
}