Files
QTradeProgram/Sqbase/OrderBookParser.h

109 lines
2.6 KiB
C
Raw Normal View History

2025-08-15 15:56:40 +08:00
#pragma once
#include <google/protobuf/arena.h>
#include <QVector>
#include <QDebug>
#include <algorithm>
#include "tool.h"
#include "BZStruct.h"
class OrderBookParser {
public:
OrderBookParser() {
}
bool parse(const char* data, int size, OrderBookData& output) {
// <20><><EFBFBD><EFBFBD>Response<73><65>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
google::protobuf::Arena arena;
auto* response = new Qot_UpdateOrderBook::Response;
if (!response->ParseFromArray(data, size)) {
return false;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ״̬ (0<><30>ʾ<EFBFBD>ɹ<EFBFBD>)
if (response->rettype() != 0) {
arena.Reset();
return false;
}
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
if (!response->has_s2c()) {
arena.Reset();
return true;
}
const auto& s2c = response->s2c();
output.clear();
output.name = QString(s2c.name().c_str());
output.code = QString(s2c.security().code().c_str());
output.askTime = QString(s2c.svrrecvtimeask().c_str());
output.bidTime = QString(s2c.svrrecvtimebid().c_str());
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><CCB6><EFBFBD><EFBFBD><EFBFBD> (bids)
if (s2c.orderbookbidlist_size() > 0) {
parseOrderBookList(s2c.orderbookbidlist(), output.bids);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><CCB6><EFBFBD><EFBFBD><EFBFBD> (asks)
if (s2c.orderbookasklist_size() > 0) {
parseOrderBookList(s2c.orderbookasklist(), output.asks);
}
arena.Reset(); // <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>ع<EFBFBD><D8B9>´<EFBFBD>ʹ<EFBFBD><CAB9>
return true;
}
private:
void parseOrderBookList(
const google::protobuf::RepeatedPtrField<Qot_Common::OrderBook>& pbList,
QVector<OrderBookEntry>& output)
{
output.clear();
const int itemCount = pbList.size();
if (itemCount == 0) return;
// Ԥ<><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
output.reserve(itemCount);
// <20><>һ<EFBFBD><EFBFBD><E9A3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD><EFBFBD>
int maxDetails = 0;
for (int i = 0; i < itemCount; ++i) {
maxDetails = std::max(maxDetails, pbList.Get(i).detaillist_size());
}
// <20>ڶ<EFBFBD><DAB6><EFBFBD><E9A3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>ʹ<EFBFBD>þֲ<C3BE><D6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < itemCount; ++i) {
const auto& pb_item = pbList.Get(i);
const int detailCount = pb_item.detaillist_size();
// Ϊ<><CEAA>ǰ<EFBFBD><C7B0>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
QVector<OrderDetail> detailsBuffer;
detailsBuffer.reserve(detailCount); // <20><>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD>
// <20><>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ
try {
for (int j = 0; j < detailCount; ++j) {
const auto& pb_detail = pb_item.detaillist(j);
OrderDetail detail;
detail.orderId = pb_detail.orderid();
detail.volume = pb_detail.volume();
detailsBuffer.append(detail);
}
}
catch (const std::exception& e) {
detailsBuffer.clear(); // <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
}
// <20><><EFBFBD><EFBFBD> OrderBookEntry<72><79>ֱ<EFBFBD><D6B1><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
OrderBookEntry item;
item.price = pb_item.price();
item.volume = pb_item.volume();
item.orderCount = pb_item.oredercount();
item.details = detailCount > 0 ? std::move(detailsBuffer) : QVector<OrderDetail>{};
output.append(item);
}
}
};