From 4b41c2cc5e3fb82eb1ef42314694c28884020bb0 Mon Sep 17 00:00:00 2001 From: obergaba Date: Fri, 23 Aug 2024 23:02:33 +0200 Subject: [PATCH] feat: Update Bitget market service APIs and WS from v1 to v2; add: candlestick market data operations --- include/ccapi_cpp/ccapi_macro.h | 2 +- include/ccapi_cpp/ccapi_session.h | 12 ++ include/ccapi_cpp/ccapi_session_configs.h | 2 + .../ccapi_market_data_service_bitget.h | 11 +- .../ccapi_market_data_service_bitget_base.h | 175 ++++++++++++------ ...ccapi_market_data_service_bitget_futures.h | 11 +- 6 files changed, 150 insertions(+), 63 deletions(-) diff --git a/include/ccapi_cpp/ccapi_macro.h b/include/ccapi_cpp/ccapi_macro.h index 0aa3b476..08fd184b 100644 --- a/include/ccapi_cpp/ccapi_macro.h +++ b/include/ccapi_cpp/ccapi_macro.h @@ -364,7 +364,7 @@ #define CCAPI_WEBSOCKET_BITGET_BASE_CHANNEL_BOOKS1 "books1" #define CCAPI_WEBSOCKET_BITGET_BASE_CHANNEL_BOOKS5 "books5" #define CCAPI_WEBSOCKET_BITGET_BASE_CHANNEL_BOOKS15 "books15" -#define CCAPI_WEBSOCKET_BITGET_BASE_CHANNEL_TRADES "trade" +#define CCAPI_WEBSOCKET_BITGET_BASE_CHANNEL_KLINE "candle" #define CCAPI_WEBSOCKET_BITMART_CHANNEL_TRADE "spot/trade" #define CCAPI_WEBSOCKET_BITMART_CHANNEL_PUBLIC_DEPTH5 "spot/depth5" #define CCAPI_WEBSOCKET_BITMART_CHANNEL_PUBLIC_DEPTH20 "spot/depth20" diff --git a/include/ccapi_cpp/ccapi_session.h b/include/ccapi_cpp/ccapi_session.h index 3b4bb4b9..3c9b6e11 100644 --- a/include/ccapi_cpp/ccapi_session.h +++ b/include/ccapi_cpp/ccapi_session.h @@ -636,6 +636,18 @@ class Session { return; } subscription.setInstrumentType(instrumentType); + } else if (exchange == CCAPI_EXCHANGE_NAME_BITGET_FUTURES) { + auto instrumentType = subscription.getInstrumentType(); + if (instrumentType.empty()) { + instrumentType = "USDT-FUTURES"; + } + std::vector instrumentTypeList = {"USDT-FUTURES", "COIN-FUTURES", "USDC-FUTURES"}; + if (std::find(instrumentTypeList.begin(), instrumentTypeList.end(), instrumentType) == instrumentTypeList.end()) { + this->onError(Event::Type::SUBSCRIPTION_STATUS, Message::Type::SUBSCRIPTION_FAILURE, + "unsupported exchange instrument types: " + toString(instrumentType) + ". Allowed values: " + toString(instrumentTypeList) + "."); + return; + } + subscription.setInstrumentType(instrumentType); } } std::map > subscriptionListByServiceNameMap; diff --git a/include/ccapi_cpp/ccapi_session_configs.h b/include/ccapi_cpp/ccapi_session_configs.h index 7ae04041..ca66bd3f 100644 --- a/include/ccapi_cpp/ccapi_session_configs.h +++ b/include/ccapi_cpp/ccapi_session_configs.h @@ -157,10 +157,12 @@ class SessionConfigs CCAPI_FINAL { std::map fieldWebsocketChannelMapBitget = { {CCAPI_TRADE, CCAPI_WEBSOCKET_BITGET_BASE_CHANNEL_TRADES}, {CCAPI_MARKET_DEPTH, CCAPI_WEBSOCKET_BITGET_BASE_CHANNEL_BOOKS}, + {CCAPI_CANDLESTICK, CCAPI_WEBSOCKET_BITGET_BASE_CHANNEL_KLINE}, }; std::map fieldWebsocketChannelMapBitgetFutures = { {CCAPI_TRADE, CCAPI_WEBSOCKET_BITGET_BASE_CHANNEL_TRADES}, {CCAPI_MARKET_DEPTH, CCAPI_WEBSOCKET_BITGET_BASE_CHANNEL_BOOKS}, + {CCAPI_CANDLESTICK, CCAPI_WEBSOCKET_BITGET_BASE_CHANNEL_KLINE}, }; std::map fieldWebsocketChannelMapBitmart = { {CCAPI_TRADE, CCAPI_WEBSOCKET_BITMART_CHANNEL_TRADE}, diff --git a/include/ccapi_cpp/service/ccapi_market_data_service_bitget.h b/include/ccapi_cpp/service/ccapi_market_data_service_bitget.h index 9bc0086e..6426bbe1 100644 --- a/include/ccapi_cpp/service/ccapi_market_data_service_bitget.h +++ b/include/ccapi_cpp/service/ccapi_market_data_service_bitget.h @@ -10,7 +10,7 @@ class MarketDataServiceBitget : public MarketDataServiceBitgetBase { ServiceContext* serviceContextPtr) : MarketDataServiceBitgetBase(eventHandler, sessionOptions, sessionConfigs, serviceContextPtr) { this->exchangeName = CCAPI_EXCHANGE_NAME_BITGET; - this->baseUrlWs = sessionConfigs.getUrlWebsocketBase().at(this->exchangeName) + "/spot/v1/stream"; + this->baseUrlWs = sessionConfigs.getUrlWebsocketBase().at(this->exchangeName) + "/v2/ws/public"; this->baseUrlRest = sessionConfigs.getUrlRestBase().at(this->exchangeName); this->setHostRestFromUrlRest(this->baseUrlRest); this->setHostWsFromUrlWs(this->baseUrlWs); @@ -27,9 +27,12 @@ class MarketDataServiceBitget : public MarketDataServiceBitgetBase { // CCAPI_LOGGER_FATAL(std::string("e.what() = ") + e.what()); // } // #endif - this->getRecentTradesTarget = "/api/spot/v1/market/fills"; - this->getInstrumentTarget = "/api/spot/v1/public/product"; - this->getInstrumentsTarget = "/api/spot/v1/public/products"; + this->getRecentTradesTarget = "/api/v2/spot/market/fills"; + this->getHistoricalTradesTarget = "/api/v2/spot/market/fills-history"; + this->getInstrumentTarget = "/api/v2/spot/public/symbols"; + this->getInstrumentsTarget = "/api/v2/spot/public/symbols"; + this->getRecentCandlesticksTarget = "/api/v2/spot/market/candles"; + this->getHistoricalCandlesticksTarget = "/api/v2/spot/market/candles"; } virtual ~MarketDataServiceBitget() {} }; diff --git a/include/ccapi_cpp/service/ccapi_market_data_service_bitget_base.h b/include/ccapi_cpp/service/ccapi_market_data_service_bitget_base.h index 82ceff9d..c7bcc268 100644 --- a/include/ccapi_cpp/service/ccapi_market_data_service_bitget_base.h +++ b/include/ccapi_cpp/service/ccapi_market_data_service_bitget_base.h @@ -21,23 +21,15 @@ class MarketDataServiceBitgetBase : public MarketDataService { const Subscription& subscription, const std::map optionMap) override { auto marketDepthRequested = std::stoi(optionMap.at(CCAPI_MARKET_DEPTH_MAX)); auto conflateIntervalMilliseconds = std::stoi(optionMap.at(CCAPI_CONFLATE_INTERVAL_MILLISECONDS)); + if (this->isDerivatives) + this->instrumentType = subscription.getInstrumentType(); if (field == CCAPI_MARKET_DEPTH) { - if (this->isDerivatives) { - if (conflateIntervalMilliseconds < 200) { - channelId = CCAPI_WEBSOCKET_BITGET_BASE_CHANNEL_BOOKS; - } else { - if (marketDepthRequested <= 1) { - channelId = CCAPI_WEBSOCKET_BITGET_BASE_CHANNEL_BOOKS1; - } else if (marketDepthRequested <= 5) { - channelId = CCAPI_WEBSOCKET_BITGET_BASE_CHANNEL_BOOKS5; - } else if (marketDepthRequested <= 15) { - channelId = CCAPI_WEBSOCKET_BITGET_BASE_CHANNEL_BOOKS15; - } else { - channelId = CCAPI_WEBSOCKET_BITGET_BASE_CHANNEL_BOOKS; - } - } + if (conflateIntervalMilliseconds < 200 && this->isDerivatives) { + channelId = CCAPI_WEBSOCKET_BITGET_BASE_CHANNEL_BOOKS; } else { - if (marketDepthRequested <= 5) { + if (marketDepthRequested <= 1) { + channelId = CCAPI_WEBSOCKET_BITGET_BASE_CHANNEL_BOOKS1; + } else if (marketDepthRequested <= 5) { channelId = CCAPI_WEBSOCKET_BITGET_BASE_CHANNEL_BOOKS5; } else if (marketDepthRequested <= 15) { channelId = CCAPI_WEBSOCKET_BITGET_BASE_CHANNEL_BOOKS15; @@ -45,6 +37,10 @@ class MarketDataServiceBitgetBase : public MarketDataService { channelId = CCAPI_WEBSOCKET_BITGET_BASE_CHANNEL_BOOKS; } } + } else if (field == CCAPI_CANDLESTICK) { + std::string interval = + this->convertCandlestickIntervalSecondsToInterval(std::stoi(optionMap.at(CCAPI_CANDLESTICK_INTERVAL_SECONDS)), " ", "m", "H", "D", "W"); + channelId = channelId + interval; } } #ifdef CCAPI_LEGACY_USE_WEBSOCKETPP @@ -69,7 +65,7 @@ class MarketDataServiceBitgetBase : public MarketDataService { } std::string exchangeSubscriptionId = UtilString::split(channelId, "?").at(0) + ":" + symbolId; rj::Value arg(rj::kObjectType); - std::string instType = this->isDerivatives ? "mc" : "sp"; + std::string instType = this->instrumentType; arg.AddMember("instType", rj::Value(instType.c_str(), allocator).Move(), allocator); arg.AddMember("channel", rj::Value(channelId.c_str(), allocator).Move(), allocator); arg.AddMember("instId", rj::Value(symbolId.c_str(), allocator).Move(), allocator); @@ -231,15 +227,33 @@ class MarketDataServiceBitgetBase : public MarketDataService { MarketDataMessage marketDataMessage; marketDataMessage.type = MarketDataMessage::Type::MARKET_DATA_EVENTS_TRADE; marketDataMessage.recapType = recapType; - marketDataMessage.tp = TimePoint(std::chrono::milliseconds(std::stoll(datum[0].GetString()))); + marketDataMessage.tp = TimePoint(std::chrono::milliseconds(std::stoll(datum["ts"].GetString()))); marketDataMessage.exchangeSubscriptionId = exchangeSubscriptionId; MarketDataMessage::TypeForDataPoint dataPoint; - dataPoint.insert({MarketDataMessage::DataFieldType::PRICE, UtilString::normalizeDecimalString(datum[1].GetString())}); - dataPoint.insert({MarketDataMessage::DataFieldType::SIZE, UtilString::normalizeDecimalString(datum[2].GetString())}); - dataPoint.insert({MarketDataMessage::DataFieldType::IS_BUYER_MAKER, std::string(datum[3].GetString()) == "sell" ? "1" : "0"}); + dataPoint.insert({MarketDataMessage::DataFieldType::PRICE, UtilString::normalizeDecimalString(datum["price"].GetString())}); + dataPoint.insert({MarketDataMessage::DataFieldType::SIZE, UtilString::normalizeDecimalString(datum["size"].GetString())}); + dataPoint.insert({MarketDataMessage::DataFieldType::IS_BUYER_MAKER, std::string(datum["side"].GetString()) == "Buy" ? "1" : "0"}); + dataPoint.insert({MarketDataMessage::DataFieldType::TRADE_ID, std::string(datum["tradeId"].GetString())}); marketDataMessage.data[MarketDataMessage::DataType::TRADE].emplace_back(std::move(dataPoint)); marketDataMessageList.emplace_back(std::move(marketDataMessage)); } + } else if (channelId.find(CCAPI_WEBSOCKET_BITGET_BASE_CHANNEL_KLINE) != std::string::npos) { + for (const auto& datum : document["data"].GetArray()) { + MarketDataMessage marketDataMessage; + marketDataMessage.type = MarketDataMessage::Type::MARKET_DATA_EVENTS_CANDLESTICK; + marketDataMessage.recapType = MarketDataMessage::RecapType::NONE; + marketDataMessage.tp = TimePoint(std::chrono::milliseconds(std::stoll(datum[0].GetString()))); + marketDataMessage.exchangeSubscriptionId = exchangeSubscriptionId; + MarketDataMessage::TypeForDataPoint dataPoint; + dataPoint.insert({MarketDataMessage::DataFieldType::OPEN_PRICE, datum[1].GetString()}); + dataPoint.insert({MarketDataMessage::DataFieldType::HIGH_PRICE, datum[2].GetString()}); + dataPoint.insert({MarketDataMessage::DataFieldType::LOW_PRICE, datum[3].GetString()}); + dataPoint.insert({MarketDataMessage::DataFieldType::CLOSE_PRICE, datum[4].GetString()}); + dataPoint.insert({MarketDataMessage::DataFieldType::VOLUME, datum[5].GetString()}); + dataPoint.insert({MarketDataMessage::DataFieldType::QUOTE_VOLUME, datum[6].GetString()}); + marketDataMessage.data[MarketDataMessage::DataType::CANDLESTICK].emplace_back(std::move(dataPoint)); + marketDataMessageList.emplace_back(std::move(marketDataMessage)); + } } } // } @@ -259,26 +273,54 @@ class MarketDataServiceBitgetBase : public MarketDataService { this->appendParam(queryString, param, { {CCAPI_LIMIT, "limit"}, + {CCAPI_INSTRUMENT_TYPE, "productType"}, }); this->appendSymbolId(queryString, symbolId, "symbol"); req.target(target + "?" + queryString); } break; - case Request::Operation::GET_INSTRUMENT: { + case Request::Operation::GET_HISTORICAL_TRADES: { req.method(http::verb::get); - std::string target; + auto target = this->getHistoricalTradesTarget; std::string queryString; - if (this->isDerivatives) { - target = this->getInstrumentsTarget; - const std::map param = request.getFirstParamWithDefault(); - this->appendParam(queryString, param, - { - {CCAPI_INSTRUMENT_TYPE, "productType"}, - }); - } else { - target = this->getInstrumentTarget; - const std::map param = request.getFirstParamWithDefault(); - this->appendSymbolId(queryString, symbolId, "symbol"); - } + const std::map param = request.getFirstParamWithDefault(); + this->appendParam(queryString, param, + { + {CCAPI_LIMIT, "limit"}, + {CCAPI_INSTRUMENT_TYPE, "productType"}, + {CCAPI_START_TIME_SECONDS, "startTime"}, + {CCAPI_END_TIME_SECONDS, "endTime"}, + }); + this->appendSymbolId(queryString, symbolId, "symbol"); + req.target(target + "?" + queryString); + } break; + case Request::Operation::GET_RECENT_CANDLESTICKS: + case Request::Operation::GET_HISTORICAL_CANDLESTICKS: { + req.method(http::verb::get); + auto target = this->getRecentCandlesticksTarget; + std::string minuteSuffix = this->isDerivatives ? "m" : "min"; + std::string hourSuffix = this->isDerivatives ? "H" : "h"; + std::string daySuffix = this->isDerivatives ? "D" : "day"; + std::string weekSuffix = this->isDerivatives ? "W" : "week"; + std::string queryString; + const std::map param = request.getFirstParamWithDefault(); + this->appendParam(queryString, param, + { + {CCAPI_CANDLESTICK_INTERVAL_SECONDS, "granularity"}, + {CCAPI_LIMIT, "limit"}, + {CCAPI_START_TIME_SECONDS, "startTime"}, + {CCAPI_END_TIME_SECONDS, "endTime"}, + {CCAPI_INSTRUMENT_TYPE, "productType"}, + }, + { + {CCAPI_CANDLESTICK_INTERVAL_SECONDS, [that = shared_from_base(), minuteSuffix, hourSuffix, daySuffix, weekSuffix](const std::string& input) { + return that->convertCandlestickIntervalSecondsToInterval(std::stoi(input), " ", minuteSuffix, hourSuffix, daySuffix, weekSuffix); + }}, + {CCAPI_START_TIME_SECONDS, [that = shared_from_base()]( + const std::string& input) { return that->convertParamTimeSecondsToTimeMilliseconds(input); }}, + {CCAPI_END_TIME_SECONDS, [that = shared_from_base()]( + const std::string& input) { return that->convertParamTimeSecondsToTimeMilliseconds(input); }}, + }); + this->appendSymbolId(queryString, symbolId, "symbol"); req.target(target + "?" + queryString); } break; case Request::Operation::GET_INSTRUMENTS: { @@ -286,25 +328,34 @@ class MarketDataServiceBitgetBase : public MarketDataService { auto target = this->getInstrumentsTarget; std::string queryString; const std::map param = request.getFirstParamWithDefault(); - if (this->isDerivatives) { - this->appendParam(queryString, param, - { - {CCAPI_INSTRUMENT_TYPE, "productType"}, - }); - req.target(target + "?" + queryString); - } else { - req.target(target); - } + this->appendParam(queryString, param, + { + {CCAPI_INSTRUMENT_TYPE, "productType"}, + }); + req.target(target + "?" + queryString); + } break; + case Request::Operation::GET_INSTRUMENT: { + req.method(http::verb::get); + std::string target; + std::string queryString; + target = this->getInstrumentsTarget; + const std::map param = request.getFirstParamWithDefault(); + this->appendParam(queryString, param, + { + {CCAPI_INSTRUMENT_TYPE, "productType"}, + }); + this->appendSymbolId(queryString, symbolId, "symbol"); + req.target(target + "?" + queryString); } break; default: this->convertRequestForRestCustom(req, request, now, symbolId, credential); } } void extractInstrumentInfo(Element& element, const rj::Value& x) { - if (this->isDerivatives) { element.insert(CCAPI_INSTRUMENT, x["symbol"].GetString()); element.insert(CCAPI_BASE_ASSET, x["baseCoin"].GetString()); element.insert(CCAPI_QUOTE_ASSET, x["quoteCoin"].GetString()); + if (this->isDerivatives) { int pricePlace = std::stoi(x["pricePlace"].GetString()); if (pricePlace > 0) { element.insert(CCAPI_ORDER_PRICE_INCREMENT, "0." + std::string(pricePlace - 1, '0') + x["priceEndStep"].GetString()); @@ -314,16 +365,13 @@ class MarketDataServiceBitgetBase : public MarketDataService { element.insert(CCAPI_ORDER_QUANTITY_INCREMENT, x["sizeMultiplier"].GetString()); element.insert(CCAPI_ORDER_QUANTITY_MIN, x["minTradeNum"].GetString()); } else { - element.insert(CCAPI_INSTRUMENT, x["symbolName"].GetString()); - element.insert(CCAPI_BASE_ASSET, x["baseCoin"].GetString()); - element.insert(CCAPI_QUOTE_ASSET, x["quoteCoin"].GetString()); - int priceScale = std::stoi(x["priceScale"].GetString()); + int priceScale = std::stoi(x["pricePrecision"].GetString()); if (priceScale > 0) { element.insert(CCAPI_ORDER_PRICE_INCREMENT, "0." + std::string(priceScale - 1, '0') + "1"); } else { element.insert(CCAPI_ORDER_PRICE_INCREMENT, "1"); } - int quantityScale = std::stoi(x["quantityScale"].GetString()); + int quantityScale = std::stoi(x["quantityPrecision"].GetString()); if (quantityScale > 0) { element.insert(CCAPI_ORDER_QUANTITY_INCREMENT, "0." + std::string(quantityScale - 1, '0') + "1"); } else { @@ -337,22 +385,40 @@ class MarketDataServiceBitgetBase : public MarketDataService { rj::Document document; document.Parse(textMessage.c_str()); switch (request.getOperation()) { - case Request::Operation::GET_RECENT_TRADES: { + case Request::Operation::GET_RECENT_TRADES: + case Request::Operation::GET_HISTORICAL_TRADES: { for (const auto& datum : document["data"].GetArray()) { MarketDataMessage marketDataMessage; marketDataMessage.type = MarketDataMessage::Type::MARKET_DATA_EVENTS_TRADE; - marketDataMessage.tp = TimePoint(std::chrono::milliseconds(std::stoll(datum[this->isDerivatives ? "timestamp" : "fillTime"].GetString()))); + marketDataMessage.tp = TimePoint(std::chrono::milliseconds(std::stoll(datum["ts"].GetString()))); MarketDataMessage::TypeForDataPoint dataPoint; dataPoint.insert( - {MarketDataMessage::DataFieldType::PRICE, UtilString::normalizeDecimalString(datum[this->isDerivatives ? "price" : "fillPrice"].GetString())}); + {MarketDataMessage::DataFieldType::PRICE, UtilString::normalizeDecimalString(datum["price"].GetString())}); dataPoint.insert( - {MarketDataMessage::DataFieldType::SIZE, UtilString::normalizeDecimalString(datum[this->isDerivatives ? "size" : "fillQuantity"].GetString())}); + {MarketDataMessage::DataFieldType::SIZE, UtilString::normalizeDecimalString(datum["size"].GetString())}); dataPoint.insert({MarketDataMessage::DataFieldType::TRADE_ID, datum["tradeId"].GetString()}); - dataPoint.insert({MarketDataMessage::DataFieldType::IS_BUYER_MAKER, std::string(datum["side"].GetString()) == "sell" ? "1" : "0"}); + dataPoint.insert({MarketDataMessage::DataFieldType::IS_BUYER_MAKER, std::string(datum["side"].GetString()) == "Buy" ? "1" : "0"}); marketDataMessage.data[MarketDataMessage::DataType::TRADE].emplace_back(std::move(dataPoint)); marketDataMessageList.emplace_back(std::move(marketDataMessage)); } } break; + case Request::Operation::GET_RECENT_CANDLESTICKS: + case Request::Operation::GET_HISTORICAL_CANDLESTICKS: { + for (const auto& datum : document["data"].GetArray()) { + MarketDataMessage marketDataMessage; + marketDataMessage.type = MarketDataMessage::Type::MARKET_DATA_EVENTS_CANDLESTICK; + marketDataMessage.tp = UtilTime::makeTimePointFromMilliseconds(std::stoll(datum[0].GetString())); + MarketDataMessage::TypeForDataPoint dataPoint; + dataPoint.insert({MarketDataMessage::DataFieldType::OPEN_PRICE, datum[1].GetString()}); + dataPoint.insert({MarketDataMessage::DataFieldType::HIGH_PRICE, datum[2].GetString()}); + dataPoint.insert({MarketDataMessage::DataFieldType::LOW_PRICE, datum[3].GetString()}); + dataPoint.insert({MarketDataMessage::DataFieldType::CLOSE_PRICE, datum[4].GetString()}); + dataPoint.insert({MarketDataMessage::DataFieldType::VOLUME, datum[5].GetString()}); + dataPoint.insert({MarketDataMessage::DataFieldType::QUOTE_VOLUME, datum[6].GetString()}); + marketDataMessage.data[MarketDataMessage::DataType::CANDLESTICK].emplace_back(std::move(dataPoint)); + marketDataMessageList.emplace_back(std::move(marketDataMessage)); + } + } break; case Request::Operation::GET_INSTRUMENT: { Message message; message.setTimeReceived(timeReceived); @@ -387,6 +453,7 @@ class MarketDataServiceBitgetBase : public MarketDataService { } } bool isDerivatives{}; + std::string instrumentType{"SPOT"}; }; } /* namespace ccapi */ #endif diff --git a/include/ccapi_cpp/service/ccapi_market_data_service_bitget_futures.h b/include/ccapi_cpp/service/ccapi_market_data_service_bitget_futures.h index 84634f9f..c75f2577 100644 --- a/include/ccapi_cpp/service/ccapi_market_data_service_bitget_futures.h +++ b/include/ccapi_cpp/service/ccapi_market_data_service_bitget_futures.h @@ -10,7 +10,7 @@ class MarketDataServiceBitgetFutures : public MarketDataServiceBitgetBase { ServiceContext* serviceContextPtr) : MarketDataServiceBitgetBase(eventHandler, sessionOptions, sessionConfigs, serviceContextPtr) { this->exchangeName = CCAPI_EXCHANGE_NAME_BITGET_FUTURES; - this->baseUrlWs = sessionConfigs.getUrlWebsocketBase().at(this->exchangeName) + "/mix/v1/stream"; + this->baseUrlWs = sessionConfigs.getUrlWebsocketBase().at(this->exchangeName) + "/v2/ws/public"; this->baseUrlRest = sessionConfigs.getUrlRestBase().at(this->exchangeName); this->setHostRestFromUrlRest(this->baseUrlRest); this->setHostWsFromUrlWs(this->baseUrlWs); @@ -27,9 +27,12 @@ class MarketDataServiceBitgetFutures : public MarketDataServiceBitgetBase { // CCAPI_LOGGER_FATAL(std::string("e.what() = ") + e.what()); // } // #endif - this->getRecentTradesTarget = "/api/mix/v1/market/fills"; - this->getInstrumentTarget = "/api/mix/v1/market/contracts"; - this->getInstrumentsTarget = "/api/mix/v1/market/contracts"; + this->getRecentTradesTarget = "/api/v2/mix/market/fills"; + this->getHistoricalTradesTarget = "/api/v2/mix/market/fills-history"; + this->getInstrumentTarget = "/api/v2/mix/market/contracts"; + this->getInstrumentsTarget = "/api/v2/mix/market/contracts"; + this->getRecentCandlesticksTarget = "/api/v2/mix/market/candles"; + this->getHistoricalCandlesticksTarget = "/api/v2/mix/market/candles"; this->isDerivatives = true; } virtual ~MarketDataServiceBitgetFutures() {}