@@ -50,6 +50,36 @@ class MarketDataServiceKraken : public MarketDataService {
5050 }
5151 }
5252
53+ static void processForChecksum (std::string& str) {
54+ str.erase (std::remove (str.begin (), str.end (), ' .' ), str.end ());
55+ UtilString::ltrimInPlace (str, " 0" );
56+ }
57+
58+ std::vector<std::string> extractTop (auto beginIt, auto endIt) {
59+ std::vector<std::string> result;
60+ int count = 0 ;
61+ for (auto it = beginIt; it != endIt && count < 10 ; ++it, ++count) {
62+ std::string price = toString (it->first );
63+ processForChecksum (price);
64+ result.push_back (std::move (price));
65+
66+ std::string volume = it->second ;
67+ processForChecksum (volume);
68+ result.push_back (std::move (volume));
69+ }
70+ return result;
71+ };
72+
73+ std::string calculateOrderBookChecksum (const std::map<Decimal, std::string>& snapshotBid, const std::map<Decimal, std::string>& snapshotAsk) override {
74+ auto csAskData = extractTop (snapshotAsk.begin (), snapshotAsk.end ());
75+ auto csBidData = extractTop (snapshotBid.rbegin (), snapshotBid.rend ());
76+
77+ std::string csStr = UtilString::join (csAskData, " " ) + UtilString::join (csBidData, " " );
78+ uint_fast32_t csCalc = UtilAlgorithm::crc (csStr.begin (), csStr.end ());
79+ CCAPI_LOGGER_DEBUG (" csStr: " + csStr + " , csCalc: " + intToHex (csCalc));
80+ return intToHex (csCalc);
81+ }
82+
5383 std::vector<std::string> createSendStringList (std::shared_ptr<WsConnection> wsConnectionPtr) override {
5484 std::vector<std::string> sendStringList;
5585 for (const auto & subscriptionListByChannelIdSymbolId : this ->subscriptionListByConnectionIdChannelIdSymbolIdMap .at (wsConnectionPtr->id )) {
@@ -186,19 +216,26 @@ class MarketDataServiceKraken : public MarketDataService {
186216 marketDataMessage.exchangeSubscriptionId = exchangeSubscriptionId;
187217 marketDataMessage.tp = latestTp;
188218 marketDataMessage.recapType = MarketDataMessage::RecapType::NONE;
219+ if (this ->sessionOptions .enableCheckOrderBookChecksum ) {
220+ if (anonymous2.HasMember (" c" )) {
221+ CCAPI_LOGGER_DEBUG (" Checksum for " + symbolId + " : " + anonymous2[" c" ].GetString ());
222+ this ->orderBookChecksumByConnectionIdSymbolIdMap [wsConnectionPtr->id ][symbolId] =
223+ intToHex (static_cast <uint_fast32_t >(static_cast <uint32_t >(std::stoul (anonymous2[" c" ].GetString ()))));
224+ }
225+ }
189226 if (anonymous2.HasMember (" b" )) {
190227 for (const auto & x : anonymous2[" b" ].GetArray ()) {
191228 MarketDataMessage::TypeForDataPoint dataPoint;
192- dataPoint.emplace (MarketDataMessage::DataFieldType::PRICE, UtilString::normalizeDecimalStringView ( x[0 ].GetString () ));
193- dataPoint.emplace (MarketDataMessage::DataFieldType::SIZE, UtilString::normalizeDecimalStringView ( x[1 ].GetString () ));
229+ dataPoint.emplace (MarketDataMessage::DataFieldType::PRICE, x[0 ].GetString ());
230+ dataPoint.emplace (MarketDataMessage::DataFieldType::SIZE, x[1 ].GetString ());
194231 marketDataMessage.data [MarketDataMessage::DataType::BID].emplace_back (std::move (dataPoint));
195232 }
196233 }
197234 if (anonymous2.HasMember (" a" )) {
198235 for (const auto & x : anonymous2[" a" ].GetArray ()) {
199236 MarketDataMessage::TypeForDataPoint dataPoint;
200- dataPoint.emplace (MarketDataMessage::DataFieldType::PRICE, UtilString::normalizeDecimalStringView ( x[0 ].GetString () ));
201- dataPoint.emplace (MarketDataMessage::DataFieldType::SIZE, UtilString::normalizeDecimalStringView ( x[1 ].GetString () ));
237+ dataPoint.emplace (MarketDataMessage::DataFieldType::PRICE, x[0 ].GetString ());
238+ dataPoint.emplace (MarketDataMessage::DataFieldType::SIZE, x[1 ].GetString ());
202239 marketDataMessage.data [MarketDataMessage::DataType::ASK].emplace_back (std::move (dataPoint));
203240 }
204241 }
@@ -211,14 +248,14 @@ class MarketDataServiceKraken : public MarketDataService {
211248 marketDataMessage.tp = timeReceived;
212249 for (const auto & x : anonymous[" bs" ].GetArray ()) {
213250 MarketDataMessage::TypeForDataPoint dataPoint;
214- dataPoint.emplace (MarketDataMessage::DataFieldType::PRICE, UtilString::normalizeDecimalStringView ( x[0 ].GetString () ));
215- dataPoint.emplace (MarketDataMessage::DataFieldType::SIZE, UtilString::normalizeDecimalStringView ( x[1 ].GetString () ));
251+ dataPoint.emplace (MarketDataMessage::DataFieldType::PRICE, x[0 ].GetString ());
252+ dataPoint.emplace (MarketDataMessage::DataFieldType::SIZE, x[1 ].GetString ());
216253 marketDataMessage.data [MarketDataMessage::DataType::BID].emplace_back (std::move (dataPoint));
217254 }
218255 for (const auto & x : anonymous[" as" ].GetArray ()) {
219256 MarketDataMessage::TypeForDataPoint dataPoint;
220- dataPoint.emplace (MarketDataMessage::DataFieldType::PRICE, UtilString::normalizeDecimalStringView ( x[0 ].GetString () ));
221- dataPoint.emplace (MarketDataMessage::DataFieldType::SIZE, UtilString::normalizeDecimalStringView ( x[1 ].GetString () ));
257+ dataPoint.emplace (MarketDataMessage::DataFieldType::PRICE, x[0 ].GetString ());
258+ dataPoint.emplace (MarketDataMessage::DataFieldType::SIZE, x[1 ].GetString ());
222259 marketDataMessage.data [MarketDataMessage::DataType::ASK].emplace_back (std::move (dataPoint));
223260 }
224261 marketDataMessageList.emplace_back (std::move (marketDataMessage));
@@ -235,8 +272,8 @@ class MarketDataServiceKraken : public MarketDataService {
235272 tp += std::chrono::nanoseconds (timePair.second );
236273 marketDataMessage.tp = tp;
237274 MarketDataMessage::TypeForDataPoint dataPoint;
238- dataPoint.emplace (MarketDataMessage::DataFieldType::PRICE, UtilString::normalizeDecimalStringView ( x[0 ].GetString () ));
239- dataPoint.emplace (MarketDataMessage::DataFieldType::SIZE, UtilString::normalizeDecimalStringView ( x[1 ].GetString () ));
275+ dataPoint.emplace (MarketDataMessage::DataFieldType::PRICE, x[0 ].GetString ());
276+ dataPoint.emplace (MarketDataMessage::DataFieldType::SIZE, x[1 ].GetString ());
240277 dataPoint.emplace (MarketDataMessage::DataFieldType::IS_BUYER_MAKER, std::string_view (x[3 ].GetString ()) == " s" ? " 1" : " 0" );
241278 marketDataMessage.data [MarketDataMessage::DataType::TRADE].emplace_back (std::move (dataPoint));
242279 marketDataMessageList.emplace_back (std::move (marketDataMessage));
@@ -372,8 +409,8 @@ class MarketDataServiceKraken : public MarketDataService {
372409 tp += std::chrono::nanoseconds (timePair.second );
373410 marketDataMessage.tp = tp;
374411 MarketDataMessage::TypeForDataPoint dataPoint;
375- dataPoint.emplace (MarketDataMessage::DataFieldType::PRICE, UtilString::normalizeDecimalStringView ( x[0 ].GetString () ));
376- dataPoint.emplace (MarketDataMessage::DataFieldType::SIZE, UtilString::normalizeDecimalStringView ( x[1 ].GetString () ));
412+ dataPoint.emplace (MarketDataMessage::DataFieldType::PRICE, x[0 ].GetString ());
413+ dataPoint.emplace (MarketDataMessage::DataFieldType::SIZE, x[1 ].GetString ());
377414 dataPoint.emplace (MarketDataMessage::DataFieldType::IS_BUYER_MAKER, std::string_view (x[3 ].GetString ()) == " s" ? " 1" : " 0" );
378415 marketDataMessage.data [MarketDataMessage::DataType::TRADE].emplace_back (std::move (dataPoint));
379416 marketDataMessageList.emplace_back (std::move (marketDataMessage));
0 commit comments