From e27f6be394349e8acc82964a55810d72fd444e4a Mon Sep 17 00:00:00 2001 From: Crypto Chassis Date: Sat, 14 Jan 2023 21:56:57 -0800 Subject: [PATCH 01/10] improvement: add method purgeHttpConnectionPool --- include/ccapi_cpp/ccapi_session.h | 7 +++++++ include/ccapi_cpp/service/ccapi_service.h | 1 + 2 files changed, 8 insertions(+) diff --git a/include/ccapi_cpp/ccapi_session.h b/include/ccapi_cpp/ccapi_session.h index a0959c45..750288f1 100644 --- a/include/ccapi_cpp/ccapi_session.h +++ b/include/ccapi_cpp/ccapi_session.h @@ -921,6 +921,13 @@ class Session { } }); } + void purgeHttpConnectionPool() { + for (const auto& x : this->serviceByServiceNameExchangeMap) { + for (const auto& y : x.second) { + y.second->purgeHttpConnectionPool(); + } + } + } #endif #ifndef CCAPI_EXPOSE_INTERNAL diff --git a/include/ccapi_cpp/service/ccapi_service.h b/include/ccapi_cpp/service/ccapi_service.h index ef7b909c..8c7606c2 100644 --- a/include/ccapi_cpp/service/ccapi_service.h +++ b/include/ccapi_cpp/service/ccapi_service.h @@ -529,6 +529,7 @@ class Service : public std::enable_shared_from_this { beast::bind_front_handler(&Service::onRead_2, shared_from_this(), httpConnectionPtr, request, reqPtr, retry, bufferPtr, resPtr, eventQueuePtr)); CCAPI_LOGGER_TRACE("after async_read"); } + void purgeHttpConnectionPool() { this->httpConnectionPool.purge(); } void setHttpConnectionPoolPurgeTimer() { this->httpConnectionPoolPurgeTimer = this->serviceContextPtr->tlsClientPtr->set_timer(5000, [that = shared_from_this()](ErrorCode const& ec) { auto now = UtilTime::now(); From 2b57e65433975181d5f0a3089ea743f28a7e06e4 Mon Sep 17 00:00:00 2001 From: Crypto Chassis Date: Sat, 14 Jan 2023 22:10:56 -0800 Subject: [PATCH 02/10] ci: fix build failure --- include/ccapi_cpp/service/ccapi_service.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/include/ccapi_cpp/service/ccapi_service.h b/include/ccapi_cpp/service/ccapi_service.h index 8c7606c2..df41033f 100644 --- a/include/ccapi_cpp/service/ccapi_service.h +++ b/include/ccapi_cpp/service/ccapi_service.h @@ -126,7 +126,7 @@ class Service : public std::enable_shared_from_this { this->httpConnectionPoolPurgeTimer->cancel(); } } - // void setEventHandler(const std::function& eventHandler) { this->eventHandler = eventHandler; } + void purgeHttpConnectionPool() { this->httpConnectionPool.purge(); } void stop() { for (const auto& x : this->sendRequestDelayTimerByCorrelationIdMap) { x.second->cancel(); @@ -529,7 +529,6 @@ class Service : public std::enable_shared_from_this { beast::bind_front_handler(&Service::onRead_2, shared_from_this(), httpConnectionPtr, request, reqPtr, retry, bufferPtr, resPtr, eventQueuePtr)); CCAPI_LOGGER_TRACE("after async_read"); } - void purgeHttpConnectionPool() { this->httpConnectionPool.purge(); } void setHttpConnectionPoolPurgeTimer() { this->httpConnectionPoolPurgeTimer = this->serviceContextPtr->tlsClientPtr->set_timer(5000, [that = shared_from_this()](ErrorCode const& ec) { auto now = UtilTime::now(); From b7c3d7b309eb259ae415de426188a6cdabff3bed Mon Sep 17 00:00:00 2001 From: Crypto Chassis Date: Mon, 16 Jan 2023 01:47:47 -0800 Subject: [PATCH 03/10] improvement: add optional parameters to purgeHttpConnectionPool --- include/ccapi_cpp/ccapi_session.h | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/include/ccapi_cpp/ccapi_session.h b/include/ccapi_cpp/ccapi_session.h index 750288f1..b96a579c 100644 --- a/include/ccapi_cpp/ccapi_session.h +++ b/include/ccapi_cpp/ccapi_session.h @@ -921,10 +921,14 @@ class Session { } }); } - void purgeHttpConnectionPool() { + void purgeHttpConnectionPool(const std::string& serviceName = "", const std::string& exchangeName = "") { for (const auto& x : this->serviceByServiceNameExchangeMap) { - for (const auto& y : x.second) { - y.second->purgeHttpConnectionPool(); + if (serviceName.empty() || serviceName == x.first) { + for (const auto& y : x.second) { + if (exchangeName.empty() || exchangeName == y.first) { + y.second->purgeHttpConnectionPool(); + } + } } } } From 0495644ef7e7c8c68820cb86c5cdbf13aa76b934 Mon Sep 17 00:00:00 2001 From: cryptochassis <57077778+cryptochassis@users.noreply.github.com> Date: Tue, 17 Jan 2023 15:24:30 -0800 Subject: [PATCH 04/10] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a3a6c752..98b98ec1 100644 --- a/README.md +++ b/README.md @@ -55,8 +55,8 @@ * Code closely follows Bloomberg's API: https://www.bloomberg.com/professional/support/api-library/. * It is ultra fast thanks to very careful optimizations: move semantics, regex optimization, locality of reference, lock contention minimization, etc. * Supported exchanges: - * Market data: coinbase, gemini, kraken, kraken-futures, bitstamp, bitfinex, bitmex, binance-us, binance, binance-usds-futures, binance-coin-futures, huobi, huobi-usdt-swap, huobi-coin-swap, okx, erisx, kucoin, kucoin-futures, deribit, gateio, gateio-perpetual-futures, cryptocom, bybit, bybit-derivatives, ascendex, bitget, bitget-futures, bitmart, mexc, mexc-futures, whitebit. - * Execution Management: coinbase, gemini, kraken, kraken-futures, bitstamp, bitfinex, bitmex, binance-us, binance, binance-usds-futures, binance-coin-futures, huobi, huobi-usdt-swap, huobi-coin-swap, okx, erisx, kucoin, kucoin-futures, deribit, gateio, gateio-perpetual-futures, cryptocom, bybit, bybit-derivatives, ascendex, bitget, bitget-futures, bitmart, mexc. + * Market data: coinbase, gemini, kraken, kraken-futures, bitstamp, bitfinex, bitmex, binance-us, binance, binance-usds-futures, binance-coin-futures, huobi, huobi-usdt-swap, huobi-coin-swap, okx, erisx (Cboe Digital), kucoin, kucoin-futures, deribit, gateio, gateio-perpetual-futures, cryptocom, bybit, bybit-derivatives, ascendex, bitget, bitget-futures, bitmart, mexc, mexc-futures, whitebit. + * Execution Management: coinbase, gemini, kraken, kraken-futures, bitstamp, bitfinex, bitmex, binance-us, binance, binance-usds-futures, binance-coin-futures, huobi, huobi-usdt-swap, huobi-coin-swap, okx, erisx (Cboe Digital), kucoin, kucoin-futures, deribit, gateio, gateio-perpetual-futures, cryptocom, bybit, bybit-derivatives, ascendex, bitget, bitget-futures, bitmart, mexc. * FIX: coinbase, gemini. * A spot market making application is provided as an end-to-end solution for liquidity providers. * A single order execution application is provided as an end-to-end solution for executing large orders. From 30b772a92224fb113a2ce1ec6b85e4b9e1337cbc Mon Sep 17 00:00:00 2001 From: Crypto Chassis Date: Tue, 17 Jan 2023 23:05:43 -0800 Subject: [PATCH 05/10] chore: some improvement in okx integration --- .../ccapi_execution_management_service_okx.h | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/include/ccapi_cpp/service/ccapi_execution_management_service_okx.h b/include/ccapi_cpp/service/ccapi_execution_management_service_okx.h index bace342a..e4e83e87 100644 --- a/include/ccapi_cpp/service/ccapi_execution_management_service_okx.h +++ b/include/ccapi_cpp/service/ccapi_execution_management_service_okx.h @@ -371,18 +371,16 @@ class ExecutionManagementServiceOkx : public ExecutionManagementService { rj::Value args(rj::kArrayType); const auto& fieldSet = subscription.getFieldSet(); const auto& instrumentSet = subscription.getInstrumentSet(); - for (const auto& field : fieldSet) { - std::string channel; - if (fieldSet.find(CCAPI_EM_ORDER_UPDATE) != fieldSet.end() || fieldSet.find(CCAPI_EM_PRIVATE_TRADE) != fieldSet.end()) { - channel = "orders"; - } - for (const auto& instrument : instrumentSet) { - rj::Value arg(rj::kObjectType); - arg.AddMember("channel", rj::Value(channel.c_str(), allocator).Move(), allocator); - arg.AddMember("instId", rj::Value(instrument.c_str(), allocator).Move(), allocator); - arg.AddMember("instType", rj::Value("ANY").Move(), allocator); - args.PushBack(arg, allocator); - } + std::string channel; + if (fieldSet.find(CCAPI_EM_ORDER_UPDATE) != fieldSet.end() || fieldSet.find(CCAPI_EM_PRIVATE_TRADE) != fieldSet.end()) { + channel = "orders"; + } + for (const auto& instrument : instrumentSet) { + rj::Value arg(rj::kObjectType); + arg.AddMember("channel", rj::Value(channel.c_str(), allocator).Move(), allocator); + arg.AddMember("instId", rj::Value(instrument.c_str(), allocator).Move(), allocator); + arg.AddMember("instType", rj::Value("ANY").Move(), allocator); + args.PushBack(arg, allocator); } document.AddMember("args", args, allocator); rj::StringBuffer stringBufferSubscribe; @@ -491,6 +489,7 @@ class ExecutionManagementServiceOkx : public ExecutionManagementService { {CCAPI_EM_ORDER_LIMIT_PRICE, std::make_pair("px", JsonDataType::STRING)}, {CCAPI_EM_ORDER_QUANTITY, std::make_pair("sz", JsonDataType::STRING)}, {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY, std::make_pair("accFillSz", JsonDataType::STRING)}, + {CCAPI_EM_ORDER_AVERAGE_FILLED_PRICE, std::make_pair("avgPx", JsonDataType::STRING)}, {CCAPI_EM_ORDER_STATUS, std::make_pair("state", JsonDataType::STRING)}, }; Element info; From 21641fac85b0a7c34c7842dd513aaf1d9473c5a4 Mon Sep 17 00:00:00 2001 From: Crypto Chassis Date: Tue, 24 Jan 2023 13:49:38 -0800 Subject: [PATCH 06/10] test binance futures post only --- .../CMakeLists.txt | 3 +- .../main.cpp | 57 ++++++++++++------- 2 files changed, 37 insertions(+), 23 deletions(-) diff --git a/example/src/execution_management_simple_request/CMakeLists.txt b/example/src/execution_management_simple_request/CMakeLists.txt index 09e06363..caf5a9af 100644 --- a/example/src/execution_management_simple_request/CMakeLists.txt +++ b/example/src/execution_management_simple_request/CMakeLists.txt @@ -1,5 +1,6 @@ set(NAME execution_management_simple_request) project(${NAME}) add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT) -add_compile_definitions(CCAPI_ENABLE_EXCHANGE_BINANCE) +add_compile_definitions(CCAPI_ENABLE_EXCHANGE_BINANCE_USDS_FUTURES) +add_compile_definitions(CCAPI_ENABLE_LOG_TRACE) add_executable(${NAME} main.cpp) diff --git a/example/src/execution_management_simple_request/main.cpp b/example/src/execution_management_simple_request/main.cpp index 3e66bacc..fc7ec685 100644 --- a/example/src/execution_management_simple_request/main.cpp +++ b/example/src/execution_management_simple_request/main.cpp @@ -1,6 +1,18 @@ #include "ccapi_cpp/ccapi_session.h" namespace ccapi { -Logger* Logger::logger = nullptr; // This line is needed. + class MyLogger final : public Logger { + public: + void logMessage(const std::string& severity, const std::string& threadId, const std::string& timeISO, const std::string& fileName, + const std::string& lineNumber, const std::string& message) override { + std::lock_guard lock(m); + std::cout << threadId << ": [" << timeISO << "] {" << fileName << ":" << lineNumber << "} " << severity << std::string(8, ' ') << message << std::endl; + } + + private: + std::mutex m; + }; + MyLogger myLogger; + Logger* Logger::logger = &myLogger; class MyEventHandler : public EventHandler { public: bool processEvent(const Event& event, Session* session) override { @@ -17,21 +29,21 @@ using ::ccapi::SessionOptions; using ::ccapi::toString; using ::ccapi::UtilSystem; int main(int argc, char** argv) { - if (UtilSystem::getEnvAsString("BINANCE_API_KEY").empty()) { - std::cerr << "Please set environment variable BINANCE_API_KEY" << std::endl; - return EXIT_FAILURE; - } - if (UtilSystem::getEnvAsString("BINANCE_API_SECRET").empty()) { - std::cerr << "Please set environment variable BINANCE_API_SECRET" << std::endl; - return EXIT_FAILURE; - } - std::vector modeList = { - "create_order", "cancel_order", "get_order", "get_open_orders", "cancel_open_orders", "get_account_balances", - }; - if (argc < 2 || std::find(modeList.begin(), modeList.end(), argv[1]) == modeList.end()) { - std::cerr << "Please provide the first command line argument from this list: " + toString(modeList) << std::endl; - return EXIT_FAILURE; - } + // if (UtilSystem::getEnvAsString("BINANCE_API_KEY").empty()) { + // std::cerr << "Please set environment variable BINANCE_API_KEY" << std::endl; + // return EXIT_FAILURE; + // } + // if (UtilSystem::getEnvAsString("BINANCE_API_SECRET").empty()) { + // std::cerr << "Please set environment variable BINANCE_API_SECRET" << std::endl; + // return EXIT_FAILURE; + // } + // std::vector modeList = { + // "create_order", "cancel_order", "get_order", "get_open_orders", "cancel_open_orders", "get_account_balances", + // }; + // if (argc < 2 || std::find(modeList.begin(), modeList.end(), argv[1]) == modeList.end()) { + // std::cerr << "Please provide the first command line argument from this list: " + toString(modeList) << std::endl; + // return EXIT_FAILURE; + // } std::string mode(argv[1]); SessionOptions sessionOptions; SessionConfigs sessionConfigs; @@ -45,11 +57,12 @@ int main(int argc, char** argv) { session.stop(); return EXIT_FAILURE; } - Request request(Request::Operation::CREATE_ORDER, "binance", argv[2]); + Request request(Request::Operation::CREATE_ORDER, "binance-usds-futures", argv[2]); request.appendParam({ {"SIDE", strcmp(argv[3], "buy") == 0 ? "BUY" : "SELL"}, {"QUANTITY", argv[4]}, {"LIMIT_PRICE", argv[5]}, + {"timeInForce", "GTX"}, }); session.sendRequest(request); } else if (mode == "cancel_order") { @@ -60,7 +73,7 @@ int main(int argc, char** argv) { session.stop(); return EXIT_FAILURE; } - Request request(Request::Operation::CANCEL_ORDER, "binance", argv[2]); + Request request(Request::Operation::CANCEL_ORDER, "binance-usds-futures", argv[2]); request.appendParam({ {"ORDER_ID", argv[3]}, }); @@ -73,7 +86,7 @@ int main(int argc, char** argv) { session.stop(); return EXIT_FAILURE; } - Request request(Request::Operation::GET_ORDER, "binance", argv[2]); + Request request(Request::Operation::GET_ORDER, "binance-usds-futures", argv[2]); request.appendParam({ {"ORDER_ID", argv[3]}, }); @@ -86,7 +99,7 @@ int main(int argc, char** argv) { session.stop(); return EXIT_FAILURE; } - Request request(Request::Operation::GET_OPEN_ORDERS, "binance", argv[2]); + Request request(Request::Operation::GET_OPEN_ORDERS, "binance-usds-futures", argv[2]); session.sendRequest(request); } else if (mode == "cancel_open_orders") { if (argc != 3) { @@ -96,10 +109,10 @@ int main(int argc, char** argv) { session.stop(); return EXIT_FAILURE; } - Request request(Request::Operation::CANCEL_OPEN_ORDERS, "binance", argv[2]); + Request request(Request::Operation::CANCEL_OPEN_ORDERS, "binance-usds-futures", argv[2]); session.sendRequest(request); } else if (mode == "get_account_balances") { - Request request(Request::Operation::GET_ACCOUNT_BALANCES, "binance"); + Request request(Request::Operation::GET_ACCOUNT_BALANCES, "binance-usds-futures"); session.sendRequest(request); } std::this_thread::sleep_for(std::chrono::seconds(10)); From 52b2630835e03b1c866be76f099bec2badb0ddfe Mon Sep 17 00:00:00 2001 From: Crypto Chassis Date: Tue, 24 Jan 2023 21:11:46 -0800 Subject: [PATCH 07/10] test execution_management_simple_subscription --- .../CMakeLists.txt | 3 +- .../main.cpp | 48 ++++++++++++------- 2 files changed, 32 insertions(+), 19 deletions(-) diff --git a/example/src/execution_management_simple_subscription/CMakeLists.txt b/example/src/execution_management_simple_subscription/CMakeLists.txt index 5dc96b28..514cc989 100644 --- a/example/src/execution_management_simple_subscription/CMakeLists.txt +++ b/example/src/execution_management_simple_subscription/CMakeLists.txt @@ -1,5 +1,6 @@ set(NAME execution_management_simple_subscription) project(${NAME}) add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT) -add_compile_definitions(CCAPI_ENABLE_EXCHANGE_COINBASE) +add_compile_definitions(CCAPI_ENABLE_EXCHANGE_BINANCE_USDS_FUTURES) +add_compile_definitions(CCAPI_ENABLE_LOG_TRACE) add_executable(${NAME} main.cpp) diff --git a/example/src/execution_management_simple_subscription/main.cpp b/example/src/execution_management_simple_subscription/main.cpp index a0a6b88a..a0181d31 100644 --- a/example/src/execution_management_simple_subscription/main.cpp +++ b/example/src/execution_management_simple_subscription/main.cpp @@ -1,19 +1,31 @@ #include "ccapi_cpp/ccapi_session.h" namespace ccapi { -Logger* Logger::logger = nullptr; // This line is needed. -class MyEventHandler : public EventHandler { + class MyLogger final : public Logger { + public: + void logMessage(const std::string& severity, const std::string& threadId, const std::string& timeISO, const std::string& fileName, + const std::string& lineNumber, const std::string& message) override { + std::lock_guard lock(m); + std::cout << threadId << ": [" << timeISO << "] {" << fileName << ":" << lineNumber << "} " << severity << std::string(8, ' ') << message << std::endl; + } + + private: + std::mutex m; + }; + MyLogger myLogger; + Logger* Logger::logger = &myLogger;class MyEventHandler : public EventHandler { public: bool processEvent(const Event& event, Session* session) override { if (event.getType() == Event::Type::SUBSCRIPTION_STATUS) { std::cout << "Received an event of type SUBSCRIPTION_STATUS:\n" + event.toStringPretty(2, 2) << std::endl; auto message = event.getMessageList().at(0); if (message.getType() == Message::Type::SUBSCRIPTION_STARTED) { - Request request(Request::Operation::CREATE_ORDER, "coinbase", "BTC-USD"); + Request request(Request::Operation::CREATE_ORDER, "binance-usds-futures", "BTCUSDT"); request.appendParam({ {"SIDE", "BUY"}, - {"LIMIT_PRICE", "20000"}, + {"LIMIT_PRICE", "23000"}, {"QUANTITY", "0.001"}, - {"CLIENT_ORDER_ID", "6d4eb0fb-2229-469f-873e-557dd78ac11e"}, + {"timeInForce", "GTX"}, + // {"CLIENT_ORDER_ID", "6d4eb0fb-2229-469f-873e-557dd78ac11e"}, }); session->sendRequest(request); } @@ -32,23 +44,23 @@ using ::ccapi::SessionOptions; using ::ccapi::Subscription; using ::ccapi::UtilSystem; int main(int argc, char** argv) { - if (UtilSystem::getEnvAsString("COINBASE_API_KEY").empty()) { - std::cerr << "Please set environment variable COINBASE_API_KEY" << std::endl; - return EXIT_FAILURE; - } - if (UtilSystem::getEnvAsString("COINBASE_API_SECRET").empty()) { - std::cerr << "Please set environment variable COINBASE_API_SECRET" << std::endl; - return EXIT_FAILURE; - } - if (UtilSystem::getEnvAsString("COINBASE_API_PASSPHRASE").empty()) { - std::cerr << "Please set environment variable COINBASE_API_PASSPHRASE" << std::endl; - return EXIT_FAILURE; - } + // if (UtilSystem::getEnvAsString("COINBASE_API_KEY").empty()) { + // std::cerr << "Please set environment variable COINBASE_API_KEY" << std::endl; + // return EXIT_FAILURE; + // } + // if (UtilSystem::getEnvAsString("COINBASE_API_SECRET").empty()) { + // std::cerr << "Please set environment variable COINBASE_API_SECRET" << std::endl; + // return EXIT_FAILURE; + // } + // if (UtilSystem::getEnvAsString("COINBASE_API_PASSPHRASE").empty()) { + // std::cerr << "Please set environment variable COINBASE_API_PASSPHRASE" << std::endl; + // return EXIT_FAILURE; + // } SessionOptions sessionOptions; SessionConfigs sessionConfigs; MyEventHandler eventHandler; Session session(sessionOptions, sessionConfigs, &eventHandler); - Subscription subscription("coinbase", "BTC-USD", "ORDER_UPDATE"); + Subscription subscription("binance-usds-futures", "BTCUSDT", "ORDER_UPDATE,PRIVATE_TRADE"); session.subscribe(subscription); std::this_thread::sleep_for(std::chrono::seconds(10)); session.stop(); From 030fe304c8457d09c417877f027737cd5777b7ce Mon Sep 17 00:00:00 2001 From: Crypto Chassis Date: Mon, 30 Jan 2023 14:26:16 -0800 Subject: [PATCH 08/10] feat: override exchange url at runtime --- example/CMakeLists.txt | 1 + .../main.cpp | 24 +++++------ .../main.cpp | 30 +++++++------- .../CMakeLists.txt | 5 +++ .../override_exchange_url_at_runtime/main.cpp | 41 +++++++++++++++++++ include/ccapi_cpp/ccapi_macro.h | 3 ++ include/ccapi_cpp/ccapi_session_configs.h | 3 ++ include/ccapi_cpp/service/ccapi_service.h | 2 + 8 files changed, 81 insertions(+), 28 deletions(-) create mode 100644 example/src/override_exchange_url_at_runtime/CMakeLists.txt create mode 100644 example/src/override_exchange_url_at_runtime/main.cpp diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index 1b3e9680..37bddf3e 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -41,3 +41,4 @@ add_subdirectory(src/utility_set_timer) add_subdirectory(src/custom_service_class) add_subdirectory(src/cross_exchange_arbitrage) add_subdirectory(src/market_making) +add_subdirectory(src/override_exchange_url_at_runtime) diff --git a/example/src/execution_management_simple_request/main.cpp b/example/src/execution_management_simple_request/main.cpp index fc7ec685..2cef5800 100644 --- a/example/src/execution_management_simple_request/main.cpp +++ b/example/src/execution_management_simple_request/main.cpp @@ -1,18 +1,18 @@ #include "ccapi_cpp/ccapi_session.h" namespace ccapi { - class MyLogger final : public Logger { - public: - void logMessage(const std::string& severity, const std::string& threadId, const std::string& timeISO, const std::string& fileName, - const std::string& lineNumber, const std::string& message) override { - std::lock_guard lock(m); - std::cout << threadId << ": [" << timeISO << "] {" << fileName << ":" << lineNumber << "} " << severity << std::string(8, ' ') << message << std::endl; - } +class MyLogger final : public Logger { + public: + void logMessage(const std::string& severity, const std::string& threadId, const std::string& timeISO, const std::string& fileName, + const std::string& lineNumber, const std::string& message) override { + std::lock_guard lock(m); + std::cout << threadId << ": [" << timeISO << "] {" << fileName << ":" << lineNumber << "} " << severity << std::string(8, ' ') << message << std::endl; + } - private: - std::mutex m; - }; - MyLogger myLogger; - Logger* Logger::logger = &myLogger; + private: + std::mutex m; +}; +MyLogger myLogger; +Logger* Logger::logger = &myLogger; class MyEventHandler : public EventHandler { public: bool processEvent(const Event& event, Session* session) override { diff --git a/example/src/execution_management_simple_subscription/main.cpp b/example/src/execution_management_simple_subscription/main.cpp index a0181d31..72b53a66 100644 --- a/example/src/execution_management_simple_subscription/main.cpp +++ b/example/src/execution_management_simple_subscription/main.cpp @@ -1,18 +1,19 @@ #include "ccapi_cpp/ccapi_session.h" namespace ccapi { - class MyLogger final : public Logger { - public: - void logMessage(const std::string& severity, const std::string& threadId, const std::string& timeISO, const std::string& fileName, - const std::string& lineNumber, const std::string& message) override { - std::lock_guard lock(m); - std::cout << threadId << ": [" << timeISO << "] {" << fileName << ":" << lineNumber << "} " << severity << std::string(8, ' ') << message << std::endl; - } +class MyLogger final : public Logger { + public: + void logMessage(const std::string& severity, const std::string& threadId, const std::string& timeISO, const std::string& fileName, + const std::string& lineNumber, const std::string& message) override { + std::lock_guard lock(m); + std::cout << threadId << ": [" << timeISO << "] {" << fileName << ":" << lineNumber << "} " << severity << std::string(8, ' ') << message << std::endl; + } - private: - std::mutex m; - }; - MyLogger myLogger; - Logger* Logger::logger = &myLogger;class MyEventHandler : public EventHandler { + private: + std::mutex m; +}; +MyLogger myLogger; +Logger* Logger::logger = &myLogger; +class MyEventHandler : public EventHandler { public: bool processEvent(const Event& event, Session* session) override { if (event.getType() == Event::Type::SUBSCRIPTION_STATUS) { @@ -21,10 +22,7 @@ namespace ccapi { if (message.getType() == Message::Type::SUBSCRIPTION_STARTED) { Request request(Request::Operation::CREATE_ORDER, "binance-usds-futures", "BTCUSDT"); request.appendParam({ - {"SIDE", "BUY"}, - {"LIMIT_PRICE", "23000"}, - {"QUANTITY", "0.001"}, - {"timeInForce", "GTX"}, + {"SIDE", "BUY"}, {"LIMIT_PRICE", "23000"}, {"QUANTITY", "0.001"}, {"timeInForce", "GTX"}, // {"CLIENT_ORDER_ID", "6d4eb0fb-2229-469f-873e-557dd78ac11e"}, }); session->sendRequest(request); diff --git a/example/src/override_exchange_url_at_runtime/CMakeLists.txt b/example/src/override_exchange_url_at_runtime/CMakeLists.txt new file mode 100644 index 00000000..4375762e --- /dev/null +++ b/example/src/override_exchange_url_at_runtime/CMakeLists.txt @@ -0,0 +1,5 @@ +set(NAME override_exchange_url_at_runtime) +project(${NAME}) +add_compile_definitions(CCAPI_ENABLE_SERVICE_MARKET_DATA) +add_compile_definitions(CCAPI_ENABLE_EXCHANGE_OKX) +add_executable(${NAME} main.cpp) diff --git a/example/src/override_exchange_url_at_runtime/main.cpp b/example/src/override_exchange_url_at_runtime/main.cpp new file mode 100644 index 00000000..5b82654c --- /dev/null +++ b/example/src/override_exchange_url_at_runtime/main.cpp @@ -0,0 +1,41 @@ +#include "ccapi_cpp/ccapi_session.h" +namespace ccapi { +Logger* Logger::logger = nullptr; // This line is needed. +class MyEventHandler : public EventHandler { + public: + bool processEvent(const Event& event, Session* session) override { + if (event.getType() == Event::Type::SESSION_STATUS) { + for (const auto& message : event.getMessageList()) { + if (message.getType() == Message::Type::SESSION_CONNECTION_UP) { + for (const auto& element : message.getElementList()) { + const std::map& elementNameValueMap = element.getNameValueMap(); + std::cout << "Connected to " + toString(elementNameValueMap.at("CONNECTION_URL")) << std::endl; + } + } + } + } + return true; + } +}; +} /* namespace ccapi */ +using ::ccapi::MyEventHandler; +using ::ccapi::Session; +using ::ccapi::SessionConfigs; +using ::ccapi::SessionOptions; +using ::ccapi::Subscription; +using ::ccapi::toString; +int main(int argc, char** argv) { + SessionOptions sessionOptions; + SessionConfigs sessionConfigs; + std::map urlWebsocketBase = sessionConfigs.getUrlWebsocketBase(); + urlWebsocketBase["okx"] = "wss://wsaws.okx.com:8443"; + sessionConfigs.setUrlWebsocketBase(urlWebsocketBase); + MyEventHandler eventHandler; + Session session(sessionOptions, sessionConfigs, &eventHandler); + Subscription subscription("okx", "BTC-USDT", "MARKET_DEPTH"); + session.subscribe(subscription); + std::this_thread::sleep_for(std::chrono::seconds(10)); + session.stop(); + std::cout << "Bye" << std::endl; + return EXIT_SUCCESS; +} diff --git a/include/ccapi_cpp/ccapi_macro.h b/include/ccapi_cpp/ccapi_macro.h index da98956d..d993570d 100644 --- a/include/ccapi_cpp/ccapi_macro.h +++ b/include/ccapi_cpp/ccapi_macro.h @@ -339,6 +339,9 @@ #ifndef CCAPI_CONNECTION_ID #define CCAPI_CONNECTION_ID "CONNECTION_ID" #endif +#ifndef CCAPI_CONNECTION_URL +#define CCAPI_CONNECTION_URL "CONNECTION_URL" +#endif #ifndef CCAPI_REASON #define CCAPI_REASON "REASON" #endif diff --git a/include/ccapi_cpp/ccapi_session_configs.h b/include/ccapi_cpp/ccapi_session_configs.h index 169b791e..dc77aa6b 100644 --- a/include/ccapi_cpp/ccapi_session_configs.h +++ b/include/ccapi_cpp/ccapi_session_configs.h @@ -27,6 +27,9 @@ class SessionConfigs CCAPI_FINAL { const std::map& getUrlFixBase() const { return urlFixBase; } const std::map& getInitialSequenceByExchangeMap() const { return initialSequenceByExchangeMap; } const std::map& getCredential() const { return credential; } + void setUrlWebsocketBase(const std::map& urlWebsocketBase) { this->urlWebsocketBase = urlWebsocketBase; } + void setUrlRestBase(const std::map& urlRestBase) { this->urlRestBase = urlRestBase; } + void setUrlFixBase(const std::map& urlFixBase) { this->urlFixBase = urlFixBase; } void setCredential(const std::map& credential) { this->credential = credential; } #ifndef CCAPI_EXPOSE_INTERNAL diff --git a/include/ccapi_cpp/service/ccapi_service.h b/include/ccapi_cpp/service/ccapi_service.h index df41033f..a24a2c81 100644 --- a/include/ccapi_cpp/service/ccapi_service.h +++ b/include/ccapi_cpp/service/ccapi_service.h @@ -836,6 +836,7 @@ class Service : public std::enable_shared_from_this { message.setCorrelationIdList(correlationIdList); Element element; element.insert(CCAPI_CONNECTION_ID, wsConnection.id); + element.insert(CCAPI_CONNECTION_URL, wsConnection.url); message.setElementList({element}); event.setMessageList({message}); this->eventHandler(event, nullptr); @@ -925,6 +926,7 @@ class Service : public std::enable_shared_from_this { message.setType(Message::Type::SESSION_CONNECTION_DOWN); Element element; element.insert(CCAPI_CONNECTION_ID, wsConnection.id); + element.insert(CCAPI_CONNECTION_URL, wsConnection.url); element.insert(CCAPI_REASON, reason); message.setElementList({element}); std::vector correlationIdList; From c8a631575316d8619dcf8ec74322b76732bdbd19 Mon Sep 17 00:00:00 2001 From: Crypto Chassis Date: Mon, 30 Jan 2023 14:30:34 -0800 Subject: [PATCH 09/10] ci: revert modifications in examples --- .../main.cpp | 57 +++++++------------ .../main.cpp | 48 +++++++--------- 2 files changed, 41 insertions(+), 64 deletions(-) diff --git a/example/src/execution_management_simple_request/main.cpp b/example/src/execution_management_simple_request/main.cpp index 2cef5800..3e66bacc 100644 --- a/example/src/execution_management_simple_request/main.cpp +++ b/example/src/execution_management_simple_request/main.cpp @@ -1,18 +1,6 @@ #include "ccapi_cpp/ccapi_session.h" namespace ccapi { -class MyLogger final : public Logger { - public: - void logMessage(const std::string& severity, const std::string& threadId, const std::string& timeISO, const std::string& fileName, - const std::string& lineNumber, const std::string& message) override { - std::lock_guard lock(m); - std::cout << threadId << ": [" << timeISO << "] {" << fileName << ":" << lineNumber << "} " << severity << std::string(8, ' ') << message << std::endl; - } - - private: - std::mutex m; -}; -MyLogger myLogger; -Logger* Logger::logger = &myLogger; +Logger* Logger::logger = nullptr; // This line is needed. class MyEventHandler : public EventHandler { public: bool processEvent(const Event& event, Session* session) override { @@ -29,21 +17,21 @@ using ::ccapi::SessionOptions; using ::ccapi::toString; using ::ccapi::UtilSystem; int main(int argc, char** argv) { - // if (UtilSystem::getEnvAsString("BINANCE_API_KEY").empty()) { - // std::cerr << "Please set environment variable BINANCE_API_KEY" << std::endl; - // return EXIT_FAILURE; - // } - // if (UtilSystem::getEnvAsString("BINANCE_API_SECRET").empty()) { - // std::cerr << "Please set environment variable BINANCE_API_SECRET" << std::endl; - // return EXIT_FAILURE; - // } - // std::vector modeList = { - // "create_order", "cancel_order", "get_order", "get_open_orders", "cancel_open_orders", "get_account_balances", - // }; - // if (argc < 2 || std::find(modeList.begin(), modeList.end(), argv[1]) == modeList.end()) { - // std::cerr << "Please provide the first command line argument from this list: " + toString(modeList) << std::endl; - // return EXIT_FAILURE; - // } + if (UtilSystem::getEnvAsString("BINANCE_API_KEY").empty()) { + std::cerr << "Please set environment variable BINANCE_API_KEY" << std::endl; + return EXIT_FAILURE; + } + if (UtilSystem::getEnvAsString("BINANCE_API_SECRET").empty()) { + std::cerr << "Please set environment variable BINANCE_API_SECRET" << std::endl; + return EXIT_FAILURE; + } + std::vector modeList = { + "create_order", "cancel_order", "get_order", "get_open_orders", "cancel_open_orders", "get_account_balances", + }; + if (argc < 2 || std::find(modeList.begin(), modeList.end(), argv[1]) == modeList.end()) { + std::cerr << "Please provide the first command line argument from this list: " + toString(modeList) << std::endl; + return EXIT_FAILURE; + } std::string mode(argv[1]); SessionOptions sessionOptions; SessionConfigs sessionConfigs; @@ -57,12 +45,11 @@ int main(int argc, char** argv) { session.stop(); return EXIT_FAILURE; } - Request request(Request::Operation::CREATE_ORDER, "binance-usds-futures", argv[2]); + Request request(Request::Operation::CREATE_ORDER, "binance", argv[2]); request.appendParam({ {"SIDE", strcmp(argv[3], "buy") == 0 ? "BUY" : "SELL"}, {"QUANTITY", argv[4]}, {"LIMIT_PRICE", argv[5]}, - {"timeInForce", "GTX"}, }); session.sendRequest(request); } else if (mode == "cancel_order") { @@ -73,7 +60,7 @@ int main(int argc, char** argv) { session.stop(); return EXIT_FAILURE; } - Request request(Request::Operation::CANCEL_ORDER, "binance-usds-futures", argv[2]); + Request request(Request::Operation::CANCEL_ORDER, "binance", argv[2]); request.appendParam({ {"ORDER_ID", argv[3]}, }); @@ -86,7 +73,7 @@ int main(int argc, char** argv) { session.stop(); return EXIT_FAILURE; } - Request request(Request::Operation::GET_ORDER, "binance-usds-futures", argv[2]); + Request request(Request::Operation::GET_ORDER, "binance", argv[2]); request.appendParam({ {"ORDER_ID", argv[3]}, }); @@ -99,7 +86,7 @@ int main(int argc, char** argv) { session.stop(); return EXIT_FAILURE; } - Request request(Request::Operation::GET_OPEN_ORDERS, "binance-usds-futures", argv[2]); + Request request(Request::Operation::GET_OPEN_ORDERS, "binance", argv[2]); session.sendRequest(request); } else if (mode == "cancel_open_orders") { if (argc != 3) { @@ -109,10 +96,10 @@ int main(int argc, char** argv) { session.stop(); return EXIT_FAILURE; } - Request request(Request::Operation::CANCEL_OPEN_ORDERS, "binance-usds-futures", argv[2]); + Request request(Request::Operation::CANCEL_OPEN_ORDERS, "binance", argv[2]); session.sendRequest(request); } else if (mode == "get_account_balances") { - Request request(Request::Operation::GET_ACCOUNT_BALANCES, "binance-usds-futures"); + Request request(Request::Operation::GET_ACCOUNT_BALANCES, "binance"); session.sendRequest(request); } std::this_thread::sleep_for(std::chrono::seconds(10)); diff --git a/example/src/execution_management_simple_subscription/main.cpp b/example/src/execution_management_simple_subscription/main.cpp index 72b53a66..a0a6b88a 100644 --- a/example/src/execution_management_simple_subscription/main.cpp +++ b/example/src/execution_management_simple_subscription/main.cpp @@ -1,18 +1,6 @@ #include "ccapi_cpp/ccapi_session.h" namespace ccapi { -class MyLogger final : public Logger { - public: - void logMessage(const std::string& severity, const std::string& threadId, const std::string& timeISO, const std::string& fileName, - const std::string& lineNumber, const std::string& message) override { - std::lock_guard lock(m); - std::cout << threadId << ": [" << timeISO << "] {" << fileName << ":" << lineNumber << "} " << severity << std::string(8, ' ') << message << std::endl; - } - - private: - std::mutex m; -}; -MyLogger myLogger; -Logger* Logger::logger = &myLogger; +Logger* Logger::logger = nullptr; // This line is needed. class MyEventHandler : public EventHandler { public: bool processEvent(const Event& event, Session* session) override { @@ -20,10 +8,12 @@ class MyEventHandler : public EventHandler { std::cout << "Received an event of type SUBSCRIPTION_STATUS:\n" + event.toStringPretty(2, 2) << std::endl; auto message = event.getMessageList().at(0); if (message.getType() == Message::Type::SUBSCRIPTION_STARTED) { - Request request(Request::Operation::CREATE_ORDER, "binance-usds-futures", "BTCUSDT"); + Request request(Request::Operation::CREATE_ORDER, "coinbase", "BTC-USD"); request.appendParam({ - {"SIDE", "BUY"}, {"LIMIT_PRICE", "23000"}, {"QUANTITY", "0.001"}, {"timeInForce", "GTX"}, - // {"CLIENT_ORDER_ID", "6d4eb0fb-2229-469f-873e-557dd78ac11e"}, + {"SIDE", "BUY"}, + {"LIMIT_PRICE", "20000"}, + {"QUANTITY", "0.001"}, + {"CLIENT_ORDER_ID", "6d4eb0fb-2229-469f-873e-557dd78ac11e"}, }); session->sendRequest(request); } @@ -42,23 +32,23 @@ using ::ccapi::SessionOptions; using ::ccapi::Subscription; using ::ccapi::UtilSystem; int main(int argc, char** argv) { - // if (UtilSystem::getEnvAsString("COINBASE_API_KEY").empty()) { - // std::cerr << "Please set environment variable COINBASE_API_KEY" << std::endl; - // return EXIT_FAILURE; - // } - // if (UtilSystem::getEnvAsString("COINBASE_API_SECRET").empty()) { - // std::cerr << "Please set environment variable COINBASE_API_SECRET" << std::endl; - // return EXIT_FAILURE; - // } - // if (UtilSystem::getEnvAsString("COINBASE_API_PASSPHRASE").empty()) { - // std::cerr << "Please set environment variable COINBASE_API_PASSPHRASE" << std::endl; - // return EXIT_FAILURE; - // } + if (UtilSystem::getEnvAsString("COINBASE_API_KEY").empty()) { + std::cerr << "Please set environment variable COINBASE_API_KEY" << std::endl; + return EXIT_FAILURE; + } + if (UtilSystem::getEnvAsString("COINBASE_API_SECRET").empty()) { + std::cerr << "Please set environment variable COINBASE_API_SECRET" << std::endl; + return EXIT_FAILURE; + } + if (UtilSystem::getEnvAsString("COINBASE_API_PASSPHRASE").empty()) { + std::cerr << "Please set environment variable COINBASE_API_PASSPHRASE" << std::endl; + return EXIT_FAILURE; + } SessionOptions sessionOptions; SessionConfigs sessionConfigs; MyEventHandler eventHandler; Session session(sessionOptions, sessionConfigs, &eventHandler); - Subscription subscription("binance-usds-futures", "BTCUSDT", "ORDER_UPDATE,PRIVATE_TRADE"); + Subscription subscription("coinbase", "BTC-USD", "ORDER_UPDATE"); session.subscribe(subscription); std::this_thread::sleep_for(std::chrono::seconds(10)); session.stop(); From 2a1a3faf0abcfb00384561892946c3e55674c658 Mon Sep 17 00:00:00 2001 From: Crypto Chassis Date: Mon, 30 Jan 2023 14:33:57 -0800 Subject: [PATCH 10/10] ci: revert modifications in examples --- example/src/execution_management_simple_request/CMakeLists.txt | 3 +-- .../execution_management_simple_subscription/CMakeLists.txt | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/example/src/execution_management_simple_request/CMakeLists.txt b/example/src/execution_management_simple_request/CMakeLists.txt index caf5a9af..09e06363 100644 --- a/example/src/execution_management_simple_request/CMakeLists.txt +++ b/example/src/execution_management_simple_request/CMakeLists.txt @@ -1,6 +1,5 @@ set(NAME execution_management_simple_request) project(${NAME}) add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT) -add_compile_definitions(CCAPI_ENABLE_EXCHANGE_BINANCE_USDS_FUTURES) -add_compile_definitions(CCAPI_ENABLE_LOG_TRACE) +add_compile_definitions(CCAPI_ENABLE_EXCHANGE_BINANCE) add_executable(${NAME} main.cpp) diff --git a/example/src/execution_management_simple_subscription/CMakeLists.txt b/example/src/execution_management_simple_subscription/CMakeLists.txt index 514cc989..5dc96b28 100644 --- a/example/src/execution_management_simple_subscription/CMakeLists.txt +++ b/example/src/execution_management_simple_subscription/CMakeLists.txt @@ -1,6 +1,5 @@ set(NAME execution_management_simple_subscription) project(${NAME}) add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT) -add_compile_definitions(CCAPI_ENABLE_EXCHANGE_BINANCE_USDS_FUTURES) -add_compile_definitions(CCAPI_ENABLE_LOG_TRACE) +add_compile_definitions(CCAPI_ENABLE_EXCHANGE_COINBASE) add_executable(${NAME} main.cpp)