diff --git a/README.md b/README.md index 2d13d836..d5042577 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Some breaking changes introduced -* We made a change on how to "Send request by Websocket API". +* Rename "PRICE_TIMES_QUANTITY_MIN" to "QUOTE_QUANTITY_MIN". Rename "CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY" to "CUMULATIVE_FILLED_QUOTE_QUANTITY". @@ -63,8 +63,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: ascendex, binance, binanceds-futures, binance-coin-futures, binance, bitfinex, bitget, bitget-futures, bitmart, bitmex, bitstamp, bybit, okx, cryptocom, deribit, erisx (Cboe Digital), gateio, gateio-perpetual-futures, gemini, huobi, huobi-usdt-swap, huobi-coin-swap, kraken, kraken-futures, kucoin, kucoin-futures, mexc, mexc-futures, okx, whitebit. - * Execution Management: ascendex, binance, binanceds-futures, binance-coin-futures, binance, bitfinex, bitget, bitget-futures, bitmart, bitmex, bitstamp, bybit, okx, cryptocom, deribit, erisx (Cboe Digital), gateio, gateio-perpetual-futures, gemini, huobi, huobi-usdt-swap, huobi-coin-swap, kraken, kraken-futures, kucoin, kucoin-futures, mexc, okx. + * Market Data: ascendex, binance, binance-usds-futures, binance-coin-futures, bitfinex, bitget, bitget-futures, bitmart, bitmex, bitstamp, bybit, coinbase, cryptocom, deribit, erisx (Cboe Digital), gateio, gateio-perpetual-futures, gemini, huobi, huobi-usdt-swap, huobi-coin-swap, kraken, kraken-futures, kucoin, kucoin-futures, mexc, mexc-futures, okx, whitebit. + * Execution Management: ascendex, binance, binance-usds-futures, binance-coin-futures, bitfinex, bitget, bitget-futures, bitmart, bitmex, bitstamp, bybit, coinbase, cryptocom, deribit, erisx (Cboe Digital), gateio, gateio-perpetual-futures, gemini, huobi, huobi-usdt-swap, huobi-coin-swap, kraken, kraken-futures, kucoin, kucoin-futures, mexc, okx. * FIX: coinbase, gemini. * Join us on Discord https://discord.gg/b5EKcp9s8T and Medium https://cryptochassis.medium.com. @@ -746,7 +746,7 @@ std::vector eventList = eventQueue.purge(); #### Provide API credentials for an exchange There are 3 ways to provide API credentials (listed with increasing priority). -* Set the relevent environment variables. Some exchanges might need additional credentials other than API keys and secrets: e.g. `OKX_API_PASSPHRASE`, `KUCOIN_API_PASSPHRASE`. See section "exchange API credentials" in [`include/ccapi_cpp/ccapi_macro.h`](include/ccapi_cpp/ccapi_macro.h). +* Set the relevent environment variables. Some exchanges might need additional credentials other than API keys and secrets: e.g. `OKX_API_PASSPHRASE`, `KUCOIN_API_PASSPHRASE`, `BINANCE_USDS_FUTURES_WEBSOCKET_ORDER_ENTRY_API_KEY`, `BINANCE_USDS_FUTURES_WEBSOCKET_ORDER_ENTRY_API_PRIVATE_KEY_PATH`, `BINANCE_COIN_FUTURES_WEBSOCKET_ORDER_ENTRY_API_KEY`, `BINANCE_COIN_FUTURES_WEBSOCKET_ORDER_ENTRY_API_PRIVATE_KEY_PATH`, `BINANCE_WEBSOCKET_ORDER_ENTRY_API_KEY`, `BINANCE_WEBSOCKET_ORDER_ENTRY_API_PRIVATE_KEY_PATH`. See section "exchange API credentials" in [`include/ccapi_cpp/ccapi_macro.h`](include/ccapi_cpp/ccapi_macro.h). * Provide credentials to `SessionConfigs`. ``` sessionConfigs.setCredential({ @@ -796,7 +796,7 @@ request.appendParam({ }); session.sendRequestByWebsocket(websocketOrderEntrySubscriptionCorrelationId, request); ``` -For bybit: +For bybit, binance, binance-usds-futures, binance-coin-futures: ``` std::string websocketOrderEntrySubscriptionCorrelationId("any"); Subscription subscription_1("bybit", "", "ORDER_UPDATE"); diff --git a/include/ccapi_cpp/ccapi_macro.h b/include/ccapi_cpp/ccapi_macro.h index fc408fd9..eb3a321d 100644 --- a/include/ccapi_cpp/ccapi_macro.h +++ b/include/ccapi_cpp/ccapi_macro.h @@ -3,274 +3,366 @@ #ifndef CCAPI_PRINT_DOUBLE_PRECISION_DEFAULT #define CCAPI_PRINT_DOUBLE_PRECISION_DEFAULT 10 #endif + #ifndef CCAPI_DOUBLE_ERROR_DEFAULT #define CCAPI_DOUBLE_ERROR_DEFAULT 1e-10 #endif + #ifndef CCAPI_GENERIC_PUBLIC_SUBSCRIPTION #define CCAPI_GENERIC_PUBLIC_SUBSCRIPTION "GENERIC_PUBLIC_SUBSCRIPTION" #endif + #ifndef CCAPI_MARKET_DEPTH #define CCAPI_MARKET_DEPTH "MARKET_DEPTH" #endif + #ifndef CCAPI_TRADE #define CCAPI_TRADE "TRADE" #endif + #ifndef CCAPI_AGG_TRADE #define CCAPI_AGG_TRADE "AGG_TRADE" #endif + #ifndef CCAPI_CANDLESTICK #define CCAPI_CANDLESTICK "CANDLESTICK" #endif + #ifndef CCAPI_MARKET_DEPTH_MAX #define CCAPI_MARKET_DEPTH_MAX CCAPI_MARKET_DEPTH "_MAX" #endif + #define CCAPI_MARKET_DEPTH_SUBSCRIBED_TO_EXCHANGE CCAPI_MARKET_DEPTH "_SUBSCRIBED_TO_EXCHANGE" #define CCAPI_MARKET_DEPTH_MAX_DEFAULT "1" #ifndef CCAPI_CONFLATE_INTERVAL_MILLISECONDS #define CCAPI_CONFLATE_INTERVAL_MILLISECONDS "CONFLATE_INTERVAL_MILLISECONDS" #endif + #define CCAPI_CONFLATE_INTERVAL_MILLISECONDS_DEFAULT "0" #ifndef CCAPI_CONFLATE_GRACE_PERIOD_MILLISECONDS #define CCAPI_CONFLATE_GRACE_PERIOD_MILLISECONDS "CONFLATE_GRACE_PERIOD_MILLISECONDS" #endif + #define CCAPI_CONFLATE_GRACE_PERIOD_MILLISECONDS_DEFAULT "-1" #ifndef CCAPI_MARKET_DEPTH_RETURN_UPDATE #define CCAPI_MARKET_DEPTH_RETURN_UPDATE "MARKET_DEPTH_RETURN_UPDATE" #endif + #define CCAPI_MARKET_DEPTH_RETURN_UPDATE_DEFAULT "0" #define CCAPI_MARKET_DEPTH_RETURN_UPDATE_ENABLE "1" #ifndef CCAPI_FETCH_MARKET_DEPTH_INITIAL_SNAPSHOT_DELAY_MILLISECONDS #define CCAPI_FETCH_MARKET_DEPTH_INITIAL_SNAPSHOT_DELAY_MILLISECONDS "FETCH_MARKET_DEPTH_INITIAL_SNAPSHOT_DELAY_MILLISECONDS" #endif + #define CCAPI_FETCH_MARKET_DEPTH_INITIAL_SNAPSHOT_DELAY_MILLISECONDS_DEFAULT "0" #ifndef CCAPI_CANDLESTICK_INTERVAL_SECONDS #define CCAPI_CANDLESTICK_INTERVAL_SECONDS CCAPI_CANDLESTICK "_INTERVAL_SECONDS" #endif + #ifndef CCAPI_CANDLESTICK_INTERVAL_SECONDS_DEFAULT #define CCAPI_CANDLESTICK_INTERVAL_SECONDS_DEFAULT "60" #endif + #ifndef CCAPI_EXCHANGE_NAME_COINBASE #define CCAPI_EXCHANGE_NAME_COINBASE "coinbase" #endif + #ifndef CCAPI_EXCHANGE_NAME_GEMINI #define CCAPI_EXCHANGE_NAME_GEMINI "gemini" #endif + #ifndef CCAPI_EXCHANGE_NAME_KRAKEN #define CCAPI_EXCHANGE_NAME_KRAKEN "kraken" #endif + #ifndef CCAPI_EXCHANGE_NAME_KRAKEN_FUTURES #define CCAPI_EXCHANGE_NAME_KRAKEN_FUTURES "kraken-futures" #endif + #ifndef CCAPI_EXCHANGE_NAME_BITSTAMP #define CCAPI_EXCHANGE_NAME_BITSTAMP "bitstamp" #endif + #ifndef CCAPI_EXCHANGE_NAME_BITFINEX #define CCAPI_EXCHANGE_NAME_BITFINEX "bitfinex" #endif + #ifndef CCAPI_EXCHANGE_NAME_BITMEX #define CCAPI_EXCHANGE_NAME_BITMEX "bitmex" #endif + #ifndef CCAPI_EXCHANGE_NAME_BINANCE_US #define CCAPI_EXCHANGE_NAME_BINANCE_US "binance-us" #endif + #ifndef CCAPI_EXCHANGE_NAME_BINANCE #define CCAPI_EXCHANGE_NAME_BINANCE "binance" #endif + // #ifndef CCAPI_EXCHANGE_NAME_BINANCE_MARGIN // #define CCAPI_EXCHANGE_NAME_BINANCE_MARGIN "binance-margin" // #endif + #ifndef CCAPI_EXCHANGE_NAME_BINANCE_USDS_FUTURES #define CCAPI_EXCHANGE_NAME_BINANCE_USDS_FUTURES "binance-usds-futures" #endif + #ifndef CCAPI_EXCHANGE_NAME_BINANCE_COIN_FUTURES #define CCAPI_EXCHANGE_NAME_BINANCE_COIN_FUTURES "binance-coin-futures" #endif + #ifndef CCAPI_EXCHANGE_NAME_HUOBI #define CCAPI_EXCHANGE_NAME_HUOBI "huobi" #endif + #ifndef CCAPI_EXCHANGE_NAME_HUOBI_USDT_SWAP #define CCAPI_EXCHANGE_NAME_HUOBI_USDT_SWAP "huobi-usdt-swap" #endif + #ifndef CCAPI_EXCHANGE_NAME_HUOBI_COIN_SWAP #define CCAPI_EXCHANGE_NAME_HUOBI_COIN_SWAP "huobi-coin-swap" #endif + #ifndef CCAPI_EXCHANGE_NAME_OKX #define CCAPI_EXCHANGE_NAME_OKX "okx" #endif + #ifndef CCAPI_EXCHANGE_NAME_ERISX #define CCAPI_EXCHANGE_NAME_ERISX "erisx" #endif + #ifndef CCAPI_EXCHANGE_NAME_KUCOIN #define CCAPI_EXCHANGE_NAME_KUCOIN "kucoin" #endif + #ifndef CCAPI_EXCHANGE_NAME_KUCOIN_FUTURES #define CCAPI_EXCHANGE_NAME_KUCOIN_FUTURES "kucoin-futures" #endif + #ifndef CCAPI_EXCHANGE_NAME_FTX #define CCAPI_EXCHANGE_NAME_FTX "ftx" #endif + #ifndef CCAPI_EXCHANGE_NAME_FTX_US #define CCAPI_EXCHANGE_NAME_FTX_US "ftx-us" #endif + #ifndef CCAPI_EXCHANGE_NAME_DERIBIT #define CCAPI_EXCHANGE_NAME_DERIBIT "deribit" #endif + #ifndef CCAPI_EXCHANGE_NAME_GATEIO #define CCAPI_EXCHANGE_NAME_GATEIO "gateio" #endif + #ifndef CCAPI_EXCHANGE_NAME_GATEIO_PERPETUAL_FUTURES #define CCAPI_EXCHANGE_NAME_GATEIO_PERPETUAL_FUTURES "gateio-perpetual-futures" #endif + #ifndef CCAPI_EXCHANGE_NAME_CRYPTOCOM #define CCAPI_EXCHANGE_NAME_CRYPTOCOM "cryptocom" #endif + #ifndef CCAPI_EXCHANGE_NAME_BYBIT #define CCAPI_EXCHANGE_NAME_BYBIT "bybit" #endif + #ifndef CCAPI_EXCHANGE_NAME_ASCENDEX #define CCAPI_EXCHANGE_NAME_ASCENDEX "ascendex" #endif + #ifndef CCAPI_EXCHANGE_NAME_BITGET #define CCAPI_EXCHANGE_NAME_BITGET "bitget" #endif + #ifndef CCAPI_EXCHANGE_NAME_BITGET_FUTURES #define CCAPI_EXCHANGE_NAME_BITGET_FUTURES "bitget-futures" #endif + #ifndef CCAPI_EXCHANGE_NAME_BITMART #define CCAPI_EXCHANGE_NAME_BITMART "bitmart" #endif + #ifndef CCAPI_EXCHANGE_NAME_MEXC #define CCAPI_EXCHANGE_NAME_MEXC "mexc" #endif + #ifndef CCAPI_EXCHANGE_NAME_MEXC_FUTURES #define CCAPI_EXCHANGE_NAME_MEXC_FUTURES "mexc-futures" #endif + #ifndef CCAPI_EXCHANGE_NAME_WHITEBIT #define CCAPI_EXCHANGE_NAME_WHITEBIT "whitebit" #endif + #ifndef CCAPI_LAST_PRICE #define CCAPI_LAST_PRICE "LAST_PRICE" #endif + #ifndef CCAPI_LAST_SIZE #define CCAPI_LAST_SIZE "LAST_SIZE" #endif + #ifndef CCAPI_TRADE_ID #define CCAPI_TRADE_ID "TRADE_ID" #endif + #ifndef CCAPI_AGG_TRADE_ID #define CCAPI_AGG_TRADE_ID "AGG_TRADE_ID" #endif + #ifndef CCAPI_IS_BUYER_MAKER #define CCAPI_IS_BUYER_MAKER "IS_BUYER_MAKER" #endif + #ifndef CCAPI_SEQUENCE_NUMBER #define CCAPI_SEQUENCE_NUMBER "SEQUENCE_NUMBER" #endif + #ifndef CCAPI_IS_MAKER #define CCAPI_IS_MAKER "IS_MAKER" #endif + #ifndef CCAPI_BEST_BID_N_PRICE #define CCAPI_BEST_BID_N_PRICE "BID_PRICE" #endif + #ifndef CCAPI_BEST_BID_N_PRICE_EMPTY #define CCAPI_BEST_BID_N_PRICE_EMPTY "" #endif + #ifndef CCAPI_BEST_BID_N_SIZE #define CCAPI_BEST_BID_N_SIZE "BID_SIZE" #endif + #ifndef CCAPI_BEST_BID_N_SIZE_EMPTY #define CCAPI_BEST_BID_N_SIZE_EMPTY "" #endif + #ifndef CCAPI_BEST_ASK_N_PRICE #define CCAPI_BEST_ASK_N_PRICE "ASK_PRICE" #endif + #ifndef CCAPI_BEST_ASK_N_PRICE_EMPTY #define CCAPI_BEST_ASK_N_PRICE_EMPTY "" #endif + #ifndef CCAPI_BEST_ASK_N_SIZE #define CCAPI_BEST_ASK_N_SIZE "ASK_SIZE" #endif + #ifndef CCAPI_BEST_ASK_N_SIZE_EMPTY #define CCAPI_BEST_ASK_N_SIZE_EMPTY "" #endif + #ifndef CCAPI_CANDLESTICK_EMPTY #define CCAPI_CANDLESTICK_EMPTY "" #endif + #ifndef CCAPI_OPEN_PRICE #define CCAPI_OPEN_PRICE "OPEN_PRICE" #endif + #ifndef CCAPI_HIGH_PRICE #define CCAPI_HIGH_PRICE "HIGH_PRICE" #endif + #ifndef CCAPI_LOW_PRICE #define CCAPI_LOW_PRICE "LOW_PRICE" #endif + #ifndef CCAPI_CLOSE_PRICE #define CCAPI_CLOSE_PRICE "CLOSE_PRICE" #endif + #ifndef CCAPI_VOLUME #define CCAPI_VOLUME "VOLUME" #endif + #ifndef CCAPI_QUOTE_VOLUME #define CCAPI_QUOTE_VOLUME "QUOTE_VOLUME" #endif + #ifndef CCAPI_LIMIT #define CCAPI_LIMIT "LIMIT" #endif + #ifndef CCAPI_START_TRADE_ID #define CCAPI_START_TRADE_ID "START_TRADE_ID" #endif + #ifndef CCAPI_END_TRADE_ID #define CCAPI_END_TRADE_ID "END_TRADE_ID" #endif + #ifndef CCAPI_START_AGG_TRADE_ID #define CCAPI_START_AGG_TRADE_ID "START_AGG_TRADE_ID" #endif + #ifndef CCAPI_START_TIME_SECONDS #define CCAPI_START_TIME_SECONDS "START_TIME_SECONDS" #endif + #ifndef CCAPI_END_TIME_SECONDS #define CCAPI_END_TIME_SECONDS "END_TIME_SECONDS" #endif + #ifndef CCAPI_LAST_UPDATED_TIME_SECONDS #define CCAPI_LAST_UPDATED_TIME_SECONDS "LAST_UPDATED_TIME_SECONDS" #endif + #ifndef CCAPI_BASE_ASSET #define CCAPI_BASE_ASSET "BASE_ASSET" #endif + #ifndef CCAPI_QUOTE_ASSET #define CCAPI_QUOTE_ASSET "QUOTE_ASSET" #endif + #ifndef CCAPI_MARGIN_ASSET #define CCAPI_MARGIN_ASSET "MARGIN_ASSET" #endif + #ifndef CCAPI_SETTLE_ASSET #define CCAPI_SETTLE_ASSET "SETTLE_ASSET" #endif + #ifndef CCAPI_ORDER_PRICE_INCREMENT #define CCAPI_ORDER_PRICE_INCREMENT "PRICE_INCREMENT" #endif + #ifndef CCAPI_ORDER_QUANTITY_INCREMENT #define CCAPI_ORDER_QUANTITY_INCREMENT "QUANTITY_INCREMENT" #endif + #ifndef CCAPI_ORDER_QUANTITY_MIN #define CCAPI_ORDER_QUANTITY_MIN "QUANTITY_MIN" #endif + #ifndef CCAPI_ORDER_QUANTITY_MAX #define CCAPI_ORDER_QUANTITY_MAX "QUANTITY_MAX" #endif -#ifndef CCAPI_ORDER_PRICE_TIMES_QUANTITY_MIN -#define CCAPI_ORDER_PRICE_TIMES_QUANTITY_MIN "PRICE_TIMES_QUANTITY_MIN" + +#ifndef CCAPI_ORDER_QUOTE_QUANTITY_MIN +#define CCAPI_ORDER_QUOTE_QUANTITY_MIN "QUOTE_QUANTITY_MIN" #endif + +#ifndef CCAPI_ORDER_QUOTE_QUANTITY_MAX +#define CCAPI_ORDER_QUOTE_QUANTITY_MAX "QUOTE_QUANTITY_MAX" +#endif + #ifndef CCAPI_INSTRUMENT_STATUS #define CCAPI_INSTRUMENT_STATUS "INSTRUMENT_STATUS" #endif + #ifndef CCAPI_CONTRACT_SIZE #define CCAPI_CONTRACT_SIZE "CONTRACT_SIZE" #endif + #ifndef CCAPI_CONTRACT_MULTIPLIER #define CCAPI_CONTRACT_MULTIPLIER "CONTRACT_MULTIPLIER" #endif + #define CCAPI_WEBSOCKET_COINBASE_CHANNEL_MATCH "matches" #define CCAPI_WEBSOCKET_COINBASE_CHANNEL_LEVEL2 "level2" #define CCAPI_WEBSOCKET_GEMINI_PARAMETER_TRADES "trades" @@ -369,244 +461,324 @@ #ifndef CCAPI_CHANNEL_ID #define CCAPI_CHANNEL_ID "channelId" #endif + #ifndef CCAPI_SYMBOL_ID #define CCAPI_SYMBOL_ID "symbolId" #endif + #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 + #ifndef CCAPI_MARKET_DATA #define CCAPI_MARKET_DATA "market_data" #endif + #ifndef CCAPI_EXECUTION_MANAGEMENT #define CCAPI_EXECUTION_MANAGEMENT "execution_management" #endif + #ifndef CCAPI_FIX #define CCAPI_FIX "FIX" #endif + #ifndef CCAPI_FIX_MARKET_DATA #define CCAPI_FIX_MARKET_DATA "FIX_MARKET_DATA" #endif + #ifndef CCAPI_FIX_EXECUTION_MANAGEMENT #define CCAPI_FIX_EXECUTION_MANAGEMENT "FIX_EXECUTION_MANAGEMENT" #endif + #ifndef CCAPI_UNKNOWN #define CCAPI_UNKNOWN "unknown" #endif + #ifndef CCAPI_EM_ORDER_UPDATE #define CCAPI_EM_ORDER_UPDATE "ORDER_UPDATE" #endif + #ifndef CCAPI_EM_PRIVATE_TRADE #define CCAPI_EM_PRIVATE_TRADE "PRIVATE_TRADE" #endif + #ifndef CCAPI_EM_PRIVATE_TRADE_LITE #define CCAPI_EM_PRIVATE_TRADE_LITE "PRIVATE_TRADE_LITE" #endif + #ifndef CCAPI_EM_BALANCE_UPDATE #define CCAPI_EM_BALANCE_UPDATE "BALANCE_UPDATE" #endif + #ifndef CCAPI_EM_POSITION_UPDATE #define CCAPI_EM_POSITION_UPDATE "POSITION_UPDATE" #endif + #ifndef CCAPI_EM_WEBSOCKET_ORDER_ENTRY #define CCAPI_EM_WEBSOCKET_ORDER_ENTRY "WEBSOCKET_ORDER_ENTRY" #endif + #ifndef CCAPI_EM_ORDER_SIDE #define CCAPI_EM_ORDER_SIDE "SIDE" #endif + #ifndef CCAPI_EM_ORDER_SIDE_BUY #define CCAPI_EM_ORDER_SIDE_BUY "BUY" #endif + #ifndef CCAPI_EM_ORDER_SIDE_SELL #define CCAPI_EM_ORDER_SIDE_SELL "SELL" #endif + #ifndef CCAPI_EM_ORDER_TYPE #define CCAPI_EM_ORDER_TYPE "TYPE" #endif + #ifndef CCAPI_EM_ORDER_QUANTITY #define CCAPI_EM_ORDER_QUANTITY "QUANTITY" #endif + #ifndef CCAPI_EM_ORDER_LIMIT_PRICE #define CCAPI_EM_ORDER_LIMIT_PRICE "LIMIT_PRICE" #endif + #ifndef CCAPI_EM_ORDER_LAST_EXECUTED_PRICE #define CCAPI_EM_ORDER_LAST_EXECUTED_PRICE "LAST_EXECUTED_PRICE" #endif + #ifndef CCAPI_EM_ORDER_LAST_EXECUTED_SIZE #define CCAPI_EM_ORDER_LAST_EXECUTED_SIZE "LAST_EXECUTED_SIZE" #endif + #ifndef CCAPI_EM_ORDER_FEE_QUANTITY #define CCAPI_EM_ORDER_FEE_QUANTITY "FEE_QUANTITY" #endif + #ifndef CCAPI_EM_ORDER_CUMULATIVE_FEE_QUANTITY #define CCAPI_EM_ORDER_CUMULATIVE_FEE_QUANTITY "CUMULATIVE_FEE_QUANTITY" #endif + #ifndef CCAPI_EM_ORDER_FEE_ASSET #define CCAPI_EM_ORDER_FEE_ASSET "FEE_ASSET" #endif + #ifndef CCAPI_EM_ACCOUNT_ID #define CCAPI_EM_ACCOUNT_ID "ACCOUNT_ID" #endif + #ifndef CCAPI_EM_ACCOUNT_TYPE #define CCAPI_EM_ACCOUNT_TYPE "ACCOUNT_TYPE" #endif + #ifndef CCAPI_EM_MARGIN_TYPE_CROSS_MARGIN #define CCAPI_EM_MARGIN_TYPE_CROSS_MARGIN "CROSS_MARGIN" #endif + #ifndef CCAPI_EM_MARGIN_TYPE_ISOLATED_MARGIN #define CCAPI_EM_MARGIN_TYPE_ISOLATED_MARGIN "ISOLATED_MARGIN" #endif + #ifndef CCAPI_EM_ASSET #define CCAPI_EM_ASSET "ASSET" #endif + #ifndef CCAPI_EM_QUANTITY_TOTAL #define CCAPI_EM_QUANTITY_TOTAL "QUANTITY_TOTAL" #endif + #ifndef CCAPI_EM_QUANTITY_AVAILABLE_FOR_TRADING #define CCAPI_EM_QUANTITY_AVAILABLE_FOR_TRADING "QUANTITY_AVAILABLE_FOR_TRADING" #endif + #ifndef CCAPI_EM_QUANTITY_LIABILITY #define CCAPI_EM_QUANTITY_LIABILITY "QUANTITY_LIABILITY" #endif + #ifndef CCAPI_EM_BASE_ASSET_QUANTITY_TOTAL #define CCAPI_EM_BASE_ASSET_QUANTITY_TOTAL "BASE_ASSET_QUANTITY_TOTAL" #endif + #ifndef CCAPI_EM_BASE_ASSET_QUANTITY_AVAILABLE_FOR_TRADING #define CCAPI_EM_BASE_ASSET_QUANTITY_AVAILABLE_FOR_TRADING "BASE_ASSET_QUANTITY_AVAILABLE_FOR_TRADING" #endif + #ifndef CCAPI_EM_QUOTE_ASSET_QUANTITY_TOTAL #define CCAPI_EM_QUOTE_ASSET_QUANTITY_TOTAL "QUOTE_ASSET_QUANTITY_TOTAL" #endif + #ifndef CCAPI_EM_QUOTE_ASSET_QUANTITY_AVAILABLE_FOR_TRADING #define CCAPI_EM_QUOTE_ASSET_QUANTITY_AVAILABLE_FOR_TRADING "QUOTE_ASSET_QUANTITY_AVAILABLE_FOR_TRADING" #endif + #ifndef CCAPI_EM_INSTRUMENT #define CCAPI_EM_INSTRUMENT "INSTRUMENT" #endif + #ifndef CCAPI_EM_SYMBOL #define CCAPI_EM_SYMBOL "SYMBOL" #endif + #ifndef CCAPI_UNDERLYING_SYMBOL #define CCAPI_UNDERLYING_SYMBOL "UNDERLYING_SYMBOL" #endif + #ifndef CCAPI_ALT_NAME #define CCAPI_ALT_NAME "ALTNAME" #endif + #ifndef CCAPI_WS_NAME #define CCAPI_WS_NAME "WSNAME" #endif + #ifndef CCAPI_EM_POSITION_SIDE #define CCAPI_EM_POSITION_SIDE "POSITION_SIDE" #endif + #ifndef CCAPI_EM_POSITION_QUANTITY #define CCAPI_EM_POSITION_QUANTITY "QUANTITY" #endif + #ifndef CCAPI_EM_POSITION_ASSET #define CCAPI_EM_POSITION_ASSET "POSITION_ASSET" #endif + #ifndef CCAPI_EM_POSITION_MARGIN_TYPE #define CCAPI_EM_POSITION_MARGIN_TYPE "MARGIN_TYPE" #endif + #ifndef CCAPI_EM_POSITION_COST #define CCAPI_EM_POSITION_COST "COST" #endif + #ifndef CCAPI_EM_POSITION_ENTRY_PRICE #define CCAPI_EM_POSITION_ENTRY_PRICE "ENTRY_PRICE" #endif + #ifndef CCAPI_EM_PARTY_ID #define CCAPI_EM_PARTY_ID "PARTY_ID" #endif + #ifndef CCAPI_EM_ORDER_ID #define CCAPI_EM_ORDER_ID "ORDER_ID" #endif + #ifndef CCAPI_EM_CLIENT_ORDER_ID #define CCAPI_EM_CLIENT_ORDER_ID "CLIENT_ORDER_ID" #endif + #ifndef CCAPI_EM_ORIGINAL_CLIENT_ORDER_ID #define CCAPI_EM_ORIGINAL_CLIENT_ORDER_ID "ORIGINAL_CLIENT_ORDER_ID" #endif + #ifndef CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY #define CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY "CUMULATIVE_FILLED_QUANTITY" #endif + #ifndef CCAPI_EM_ORDER_REMAINING_QUANTITY #define CCAPI_EM_ORDER_REMAINING_QUANTITY "REMAINING_QUANTITY" #endif -#ifndef CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY -#define CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY "CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY" + +#ifndef CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY +#define CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY "CUMULATIVE_FILLED_QUOTE_QUANTITY" #endif + #ifndef CCAPI_EM_ORDER_AVERAGE_FILLED_PRICE #define CCAPI_EM_ORDER_AVERAGE_FILLED_PRICE "AVERAGE_FILLED_PRICE" #endif + #ifndef CCAPI_EM_ORDER_INSTRUMENT #define CCAPI_EM_ORDER_INSTRUMENT "INSTRUMENT" #endif + #ifndef CCAPI_INSTRUMENT_TYPE #define CCAPI_INSTRUMENT_TYPE "INSTRUMENT_TYPE" #endif + #ifndef CCAPI_INSTRUMENT #define CCAPI_INSTRUMENT "INSTRUMENT" #endif + #ifndef CCAPI_MARGIN_MODE #define CCAPI_MARGIN_MODE "MARGIN_MODE" #endif + #ifndef CCAPI_EM_ORDER_STATUS #define CCAPI_EM_ORDER_STATUS "STATUS" #endif + #ifndef CCAPI_EM_ORDER_LEVERAGE #define CCAPI_EM_ORDER_LEVERAGE "LEVERAGE" #endif + #ifndef CCAPI_EM_POSITION_LEVERAGE #define CCAPI_EM_POSITION_LEVERAGE "LEVERAGE" #endif + #ifndef CCAPI_EM_UNREALIZED_PNL #define CCAPI_EM_UNREALIZED_PNL "UNREALIZED_PNL" #endif + #ifndef CCAPI_HTTP_STATUS_CODE #define CCAPI_HTTP_STATUS_CODE "HTTP_STATUS_CODE" #endif + #ifndef CCAPI_HTTP_PROTOCOL #define CCAPI_HTTP_PROTOCOL "HTTP_PROTOCOL" #endif + #ifndef CCAPI_HTTP_HOST #define CCAPI_HTTP_HOST "HTTP_HOST" #endif + #ifndef CCAPI_HTTP_PORT #define CCAPI_HTTP_PORT "HTTP_PORT" #endif + #ifndef CCAPI_HTTP_PATH #define CCAPI_HTTP_PATH "HTTP_PATH" #endif + #ifndef CCAPI_HTTP_METHOD #define CCAPI_HTTP_METHOD "HTTP_METHOD" #endif + #ifndef CCAPI_HTTP_HEADERS #define CCAPI_HTTP_HEADERS "HTTP_HEADERS" #endif + #ifndef CCAPI_HTTP_BODY #define CCAPI_HTTP_BODY "HTTP_BODY" #endif + #ifndef CCAPI_HTTP_QUERY_STRING #define CCAPI_HTTP_QUERY_STRING "HTTP_QUERY_STRING" #endif + #ifndef CCAPI_WEBSOCKET_MESSAGE_PAYLOAD #define CCAPI_WEBSOCKET_MESSAGE_PAYLOAD "WEBSOCKET_MESSAGE_PAYLOAD" #endif + #ifndef CCAPI_ERROR_MESSAGE #define CCAPI_ERROR_MESSAGE "ERROR_MESSAGE" #endif + #ifndef CCAPI_INFO_MESSAGE #define CCAPI_INFO_MESSAGE "INFO_MESSAGE" #endif + #define CCAPI_UNSUPPORTED_VALUE "UNSUPPORTED VALUE" #ifndef CCAPI_CORRELATION_ID_GENERATED_LENGTH #define CCAPI_CORRELATION_ID_GENERATED_LENGTH 8 #endif + #ifndef CCAPI_CREDENTIAL_DISPLAY_LENGTH #define CCAPI_CREDENTIAL_DISPLAY_LENGTH 4 #endif @@ -615,567 +787,824 @@ #ifndef CCAPI_COINBASE_URL_REST_BASE #define CCAPI_COINBASE_URL_REST_BASE "https://api.exchange.coinbase.com" #endif + #ifndef CCAPI_GEMINI_URL_REST_BASE #define CCAPI_GEMINI_URL_REST_BASE "https://api.gemini.com" #endif + #ifndef CCAPI_KRAKEN_URL_REST_BASE #define CCAPI_KRAKEN_URL_REST_BASE "https://api.kraken.com" #endif + #ifndef CCAPI_KRAKEN_FUTURES_URL_REST_BASE #define CCAPI_KRAKEN_FUTURES_URL_REST_BASE "https://futures.kraken.com" #endif + #ifndef CCAPI_BITSTAMP_URL_REST_BASE #define CCAPI_BITSTAMP_URL_REST_BASE "https://www.bitstamp.net" #endif + #ifndef CCAPI_BITFINEX_PUBLIC_URL_REST_BASE #define CCAPI_BITFINEX_PUBLIC_URL_REST_BASE "https://api-pub.bitfinex.com" #endif + #ifndef CCAPI_BITFINEX_PRIVATE_URL_REST_BASE #define CCAPI_BITFINEX_PRIVATE_URL_REST_BASE "https://api.bitfinex.com" #endif + #ifndef CCAPI_BITFINEX_GET_INSTRUMENTS_PATH #define CCAPI_BITFINEX_GET_INSTRUMENTS_PATH "/v2/conf/pub:info:pair" // use conf/pub:info:pair:futures for futures #endif + #ifndef CCAPI_BITMEX_URL_REST_BASE #define CCAPI_BITMEX_URL_REST_BASE "https://www.bitmex.com" #endif + #ifndef CCAPI_BINANCE_US_URL_REST_BASE #define CCAPI_BINANCE_US_URL_REST_BASE "https://api.binance.us" #endif + #ifndef CCAPI_BINANCE_US_CREATE_ORDER_PATH #define CCAPI_BINANCE_US_CREATE_ORDER_PATH "/api/v3/order" #endif + #ifndef CCAPI_BINANCE_US_LISTEN_KEY_PATH #define CCAPI_BINANCE_US_LISTEN_KEY_PATH "/api/v3/userDataStream" #endif + #ifndef CCAPI_BINANCE_URL_REST_BASE #define CCAPI_BINANCE_URL_REST_BASE "https://api.binance.com" #endif + #ifndef CCAPI_BINANCE_CREATE_ORDER_PATH #define CCAPI_BINANCE_CREATE_ORDER_PATH "/api/v3/order" #endif + #ifndef CCAPI_BINANCE_LISTEN_KEY_PATH #define CCAPI_BINANCE_LISTEN_KEY_PATH "/api/v3/userDataStream" #endif + #ifndef CCAPI_BINANCE_LISTEN_KEY_CROSS_MARGIN_PATH #define CCAPI_BINANCE_LISTEN_KEY_CROSS_MARGIN_PATH "/sapi/v1/userDataStream" #endif + #ifndef CCAPI_BINANCE_LISTEN_KEY_ISOLATED_MARGIN_PATH #define CCAPI_BINANCE_LISTEN_KEY_ISOLATED_MARGIN_PATH "/sapi/v1/userDataStream/isolated" #endif + #ifndef CCAPI_BINANCE_USDS_FUTURES_URL_REST_BASE #define CCAPI_BINANCE_USDS_FUTURES_URL_REST_BASE "https://fapi.binance.com" #endif + #ifndef CCAPI_BINANCE_USDS_FUTURES_CREATE_ORDER_PATH #define CCAPI_BINANCE_USDS_FUTURES_CREATE_ORDER_PATH "/fapi/v1/order" #endif + #ifndef CCAPI_BINANCE_USDS_FUTURES_LISTEN_KEY_PATH #define CCAPI_BINANCE_USDS_FUTURES_LISTEN_KEY_PATH "/fapi/v1/listenKey" #endif + #ifndef CCAPI_BINANCE_COIN_FUTURES_URL_REST_BASE #define CCAPI_BINANCE_COIN_FUTURES_URL_REST_BASE "https://dapi.binance.com" #endif + #ifndef CCAPI_BINANCE_COIN_FUTURES_CREATE_ORDER_PATH #define CCAPI_BINANCE_COIN_FUTURES_CREATE_ORDER_PATH "/dapi/v1/order" #endif + #ifndef CCAPI_BINANCE_COIN_FUTURES_LISTEN_KEY_PATH #define CCAPI_BINANCE_COIN_FUTURES_LISTEN_KEY_PATH "/dapi/v1/listenKey" #endif + #ifndef CCAPI_HUOBI_URL_REST_BASE #define CCAPI_HUOBI_URL_REST_BASE "https://api.huobi.pro" #endif + #ifndef CCAPI_HUOBI_USDT_SWAP_URL_REST_BASE #define CCAPI_HUOBI_USDT_SWAP_URL_REST_BASE "https://api.hbdm.com" #endif + #ifndef CCAPI_HUOBI_COIN_SWAP_URL_REST_BASE #define CCAPI_HUOBI_COIN_SWAP_URL_REST_BASE "https://api.hbdm.com" #endif + #ifndef CCAPI_HUOBI_USDT_SWAP_CREATE_ORDER_PATH #define CCAPI_HUOBI_USDT_SWAP_CREATE_ORDER_PATH "/linear-swap-api/v1/swap_cross_order" #endif + #ifndef CCAPI_HUOBI_COIN_SWAP_CREATE_ORDER_PATH #define CCAPI_HUOBI_COIN_SWAP_CREATE_ORDER_PATH "/swap-api/v1/swap_order" #endif + #ifndef CCAPI_HUOBI_USDT_SWAP_CANCEL_ORDER_PATH #define CCAPI_HUOBI_USDT_SWAP_CANCEL_ORDER_PATH "/linear-swap-api/v1/swap_cross_cancel" #endif + #ifndef CCAPI_HUOBI_COIN_SWAP_CANCEL_ORDER_PATH #define CCAPI_HUOBI_COIN_SWAP_CANCEL_ORDER_PATH "/swap-api/v1/swap_cancel" #endif + #ifndef CCAPI_HUOBI_USDT_SWAP_GET_ORDER_PATH #define CCAPI_HUOBI_USDT_SWAP_GET_ORDER_PATH "/linear-swap-api/v1/swap_cross_order_info" #endif + #ifndef CCAPI_HUOBI_COIN_SWAP_GET_ORDER_PATH #define CCAPI_HUOBI_COIN_SWAP_GET_ORDER_PATH "/swap-api/v1/swap_order_info" #endif + #ifndef CCAPI_HUOBI_USDT_SWAP_GET_OPEN_ORDERS_PATH #define CCAPI_HUOBI_USDT_SWAP_GET_OPEN_ORDERS_PATH "/linear-swap-api/v1/swap_cross_openorders" #endif + #ifndef CCAPI_HUOBI_COIN_SWAP_GET_OPEN_ORDERS_PATH #define CCAPI_HUOBI_COIN_SWAP_GET_OPEN_ORDERS_PATH "/swap-api/v1/swap_openorders" #endif + #ifndef CCAPI_HUOBI_USDT_SWAP_CANCEL_ALL_ORDERS_PATH #define CCAPI_HUOBI_USDT_SWAP_CANCEL_ALL_ORDERS_PATH "/linear-swap-api/v1/swap_cross_cancelall" #endif + #ifndef CCAPI_HUOBI_COIN_SWAP_CANCEL_ALL_ORDERS_PATH #define CCAPI_HUOBI_COIN_SWAP_CANCEL_ALL_ORDERS_PATH "/swap-api/v1/swap_cancelall" #endif + #ifndef CCAPI_HUOBI_USDT_SWAP_GET_ACCOUNT_BALANCES_PATH #define CCAPI_HUOBI_USDT_SWAP_GET_ACCOUNT_BALANCES_PATH "/linear-swap-api/v1/swap_cross_account_info" #endif + #ifndef CCAPI_HUOBI_COIN_SWAP_GET_ACCOUNT_BALANCES_PATH #define CCAPI_HUOBI_COIN_SWAP_GET_ACCOUNT_BALANCES_PATH "/swap-api/v1/swap_account_info" #endif + #ifndef CCAPI_HUOBI_USDT_SWAP_GET_ACCOUNT_POSITIONS_PATH #define CCAPI_HUOBI_USDT_SWAP_GET_ACCOUNT_POSITIONS_PATH "/linear-swap-api/v1/swap_cross_position_info" #endif + #ifndef CCAPI_HUOBI_COIN_SWAP_GET_ACCOUNT_POSITIONS_PATH #define CCAPI_HUOBI_COIN_SWAP_GET_ACCOUNT_POSITIONS_PATH "/swap-api/v1/swap_position_info" #endif + #ifndef CCAPI_HUOBI_USDT_SWAP_GET_RECENT_TRADES_PATH #define CCAPI_HUOBI_USDT_SWAP_GET_RECENT_TRADES_PATH "/linear-swap-ex/market/history/trade" #endif + #ifndef CCAPI_HUOBI_COIN_SWAP_GET_RECENT_TRADES_PATH #define CCAPI_HUOBI_COIN_SWAP_GET_RECENT_TRADES_PATH "/swap-ex/market/history/trade" #endif + #ifndef CCAPI_OKX_URL_REST_BASE #define CCAPI_OKX_URL_REST_BASE "https://www.okx.com" #endif + #ifndef CCAPI_ERISX_URL_REST_BASE #define CCAPI_ERISX_URL_REST_BASE "https://trade-api.erisx.com" #endif + #ifndef CCAPI_KUCOIN_URL_REST_BASE #define CCAPI_KUCOIN_URL_REST_BASE "https://api.kucoin.com" #endif + #ifndef CCAPI_KUCOIN_FUTURES_URL_REST_BASE #define CCAPI_KUCOIN_FUTURES_URL_REST_BASE "https://api-futures.kucoin.com" #endif + #ifndef CCAPI_FTX_URL_REST_BASE #define CCAPI_FTX_URL_REST_BASE "https://ftx.com" #endif + #ifndef CCAPI_FTX_US_URL_REST_BASE #define CCAPI_FTX_US_URL_REST_BASE "https://ftx.us" #endif + #ifndef CCAPI_DERIBIT_URL_REST_BASE #define CCAPI_DERIBIT_URL_REST_BASE "https://www.deribit.com" #endif + #ifndef CCAPI_GATEIO_URL_REST_BASE #define CCAPI_GATEIO_URL_REST_BASE "https://api.gateio.ws" #endif + #ifndef CCAPI_GATEIO_PERPETUAL_FUTURES_URL_REST_BASE #define CCAPI_GATEIO_PERPETUAL_FUTURES_URL_REST_BASE "https://fx-api.gateio.ws" #endif + #ifndef CCAPI_CRYPTOCOM_URL_REST_BASE #define CCAPI_CRYPTOCOM_URL_REST_BASE "https://api.crypto.com" #endif + #ifndef CCAPI_BYBIT_URL_REST_BASE #define CCAPI_BYBIT_URL_REST_BASE "https://api.bybit.com" #endif + #ifndef CCAPI_ASCENDEX_URL_REST_BASE #define CCAPI_ASCENDEX_URL_REST_BASE "https://ascendex.com" #endif + #ifndef CCAPI_BITGET_URL_REST_BASE #define CCAPI_BITGET_URL_REST_BASE "https://api.bitget.com" #endif + #ifndef CCAPI_BITGET_FUTURES_URL_REST_BASE #define CCAPI_BITGET_FUTURES_URL_REST_BASE "https://api.bitget.com" #endif + #ifndef CCAPI_BITMART_URL_REST_BASE #define CCAPI_BITMART_URL_REST_BASE "https://api-cloud.bitmart.com" #endif + #ifndef CCAPI_MEXC_URL_REST_BASE #define CCAPI_MEXC_URL_REST_BASE "https://api.mexc.com" #endif + #ifndef CCAPI_MEXC_CREATE_ORDER_PATH #define CCAPI_MEXC_CREATE_ORDER_PATH "/api/v3/order" #endif + #ifndef CCAPI_MEXC_LISTEN_KEY_PATH #define CCAPI_MEXC_LISTEN_KEY_PATH "/api/v3/userDataStream" #endif + #ifndef CCAPI_MEXC_FUTURES_URL_REST_BASE #define CCAPI_MEXC_FUTURES_URL_REST_BASE "https://contract.mexc.com" #endif + #ifndef CCAPI_WHITEBIT_URL_REST_BASE #define CCAPI_WHITEBIT_URL_REST_BASE "https://whitebit.com" #endif + // end: exchange REST urls // start: exchange WS urls #ifndef CCAPI_COINBASE_URL_WS_BASE #define CCAPI_COINBASE_URL_WS_BASE "wss://ws-feed.exchange.coinbase.com" #endif + #ifndef CCAPI_GEMINI_URL_WS_BASE #define CCAPI_GEMINI_URL_WS_BASE "wss://api.gemini.com" #endif + #ifndef CCAPI_KRAKEN_URL_WS_BASE #define CCAPI_KRAKEN_URL_WS_BASE "wss://ws.kraken.com" #endif + #ifndef CCAPI_KRAKEN_URL_WS_BASE_PRIVATE #define CCAPI_KRAKEN_URL_WS_BASE_PRIVATE "wss://ws-auth.kraken.com" #endif + #ifndef CCAPI_KRAKEN_FUTURES_URL_WS_BASE #define CCAPI_KRAKEN_FUTURES_URL_WS_BASE "wss://futures.kraken.com" #endif + #ifndef CCAPI_BITSTAMP_URL_WS_BASE #define CCAPI_BITSTAMP_URL_WS_BASE "wss://ws.bitstamp.net" #endif + #ifndef CCAPI_BITFINEX_PUBLIC_URL_WS_BASE #define CCAPI_BITFINEX_PUBLIC_URL_WS_BASE "wss://api-pub.bitfinex.com" #endif + #ifndef CCAPI_BITFINEX_PRIVATE_URL_WS_BASE #define CCAPI_BITFINEX_PRIVATE_URL_WS_BASE "wss://api.bitfinex.com" #endif + #ifndef CCAPI_BITMEX_URL_WS_BASE #define CCAPI_BITMEX_URL_WS_BASE "wss://www.bitmex.com" #endif + #ifndef CCAPI_BINANCE_US_URL_WS_BASE #define CCAPI_BINANCE_US_URL_WS_BASE "wss://stream.binance.us:9443" #endif + #ifndef CCAPI_BINANCE_URL_WS_BASE #define CCAPI_BINANCE_URL_WS_BASE "wss://stream.binance.com:9443" #endif + #ifndef CCAPI_BINANCE_USDS_FUTURES_URL_WS_BASE #define CCAPI_BINANCE_USDS_FUTURES_URL_WS_BASE "wss://fstream.binance.com" #endif + +#ifndef CCAPI_BINANCE_USDS_FUTURES_HOST_WS_ORDER_ENTRY +#define CCAPI_BINANCE_USDS_FUTURES_HOST_WS_ORDER_ENTRY "ws-fapi.binance.com" +#endif + +#ifndef CCAPI_BINANCE_USDS_FUTURES_URL_WS_ORDER_ENTRY_BASE +#define CCAPI_BINANCE_USDS_FUTURES_URL_WS_ORDER_ENTRY_BASE "wss://" CCAPI_BINANCE_USDS_FUTURES_HOST_WS_ORDER_ENTRY +#endif + +#ifndef CCAPI_BINANCE_USDS_FUTURES_WS_ORDER_ENTRY_PATH +#define CCAPI_BINANCE_USDS_FUTURES_WS_ORDER_ENTRY_PATH "/ws-fapi/v1" +#endif + #ifndef CCAPI_BINANCE_COIN_FUTURES_URL_WS_BASE #define CCAPI_BINANCE_COIN_FUTURES_URL_WS_BASE "wss://dstream.binance.com" #endif + +#ifndef CCAPI_BINANCE_COIN_FUTURES_HOST_WS_ORDER_ENTRY +#define CCAPI_BINANCE_COIN_FUTURES_HOST_WS_ORDER_ENTRY "ws-dapi.binance.com" +#endif + +#ifndef CCAPI_BINANCE_COIN_FUTURES_URL_WS_ORDER_ENTRY_BASE +#define CCAPI_BINANCE_COIN_FUTURES_URL_WS_ORDER_ENTRY_BASE "wss://" CCAPI_BINANCE_COIN_FUTURES_HOST_WS_ORDER_ENTRY +#endif + +#ifndef CCAPI_BINANCE_COIN_FUTURES_WS_ORDER_ENTRY_PATH +#define CCAPI_BINANCE_COIN_FUTURES_WS_ORDER_ENTRY_PATH "/ws-dapi/v1" +#endif + +#ifndef CCAPI_BINANCE_HOST_WS_ORDER_ENTRY +#define CCAPI_BINANCE_HOST_WS_ORDER_ENTRY "ws-api.binance.com" +#endif + +#ifndef CCAPI_BINANCE_URL_WS_ORDER_ENTRY_BASE +#define CCAPI_BINANCE_URL_WS_ORDER_ENTRY_BASE "wss://" CCAPI_BINANCE_HOST_WS_ORDER_ENTRY +#endif + +#ifndef CCAPI_BINANCE_WS_ORDER_ENTRY_PATH +#define CCAPI_BINANCE_WS_ORDER_ENTRY_PATH "/ws-api/v3" +#endif + #ifndef CCAPI_HUOBI_URL_WS_BASE #define CCAPI_HUOBI_URL_WS_BASE "wss://api.huobi.pro" #endif + #ifndef CCAPI_HUOBI_USDT_SWAP_URL_WS_BASE #define CCAPI_HUOBI_USDT_SWAP_URL_WS_BASE "wss://api.hbdm.com" #endif + #ifndef CCAPI_HUOBI_USDT_SWAP_SUBSCRIBE_ORDER_DATA_TOPIC #define CCAPI_HUOBI_USDT_SWAP_SUBSCRIBE_ORDER_DATA_TOPIC "orders_cross" #endif + #ifndef CCAPI_HUOBI_USDT_SWAP_SUBSCRIBE_MATCH_ORDER_DATA_TOPIC #define CCAPI_HUOBI_USDT_SWAP_SUBSCRIBE_MATCH_ORDER_DATA_TOPIC "matchOrders_cross" #endif + #ifndef CCAPI_HUOBI_COIN_SWAP_URL_WS_BASE #define CCAPI_HUOBI_COIN_SWAP_URL_WS_BASE "wss://api.hbdm.com" #endif + #ifndef CCAPI_HUOBI_COIN_SWAP_SUBSCRIBE_ORDER_DATA_TOPIC #define CCAPI_HUOBI_COIN_SWAP_SUBSCRIBE_ORDER_DATA_TOPIC "orders" #endif + #ifndef CCAPI_HUOBI_COIN_SWAP_SUBSCRIBE_MATCH_ORDER_DATA_TOPIC #define CCAPI_HUOBI_COIN_SWAP_SUBSCRIBE_MATCH_ORDER_DATA_TOPIC "matchOrders" #endif + #ifndef CCAPI_OKX_URL_WS_BASE #define CCAPI_OKX_URL_WS_BASE "wss://ws.okx.com:8443" #endif + #ifndef CCAPI_OKX_PUBLIC_WS_PATH #define CCAPI_OKX_PUBLIC_WS_PATH "/ws/v5/public" #endif + #ifndef CCAPI_OKX_PRIVATE_WS_PATH #define CCAPI_OKX_PRIVATE_WS_PATH "/ws/v5/private" #endif + #ifndef CCAPI_OKX_BUSINESS_WS_PATH #define CCAPI_OKX_BUSINESS_WS_PATH "/ws/v5/business" #endif + #ifndef CCAPI_ERISX_URL_WS_BASE #define CCAPI_ERISX_URL_WS_BASE "wss://publicmd-api.erisx.com" #endif + #ifndef CCAPI_FTX_URL_WS_BASE #define CCAPI_FTX_URL_WS_BASE "wss://ftx.com" #endif + #ifndef CCAPI_FTX_US_URL_WS_BASE #define CCAPI_FTX_US_URL_WS_BASE "wss://ftx.us" #endif + #ifndef CCAPI_DERIBIT_URL_WS_BASE #define CCAPI_DERIBIT_URL_WS_BASE "wss://www.deribit.com" #endif + #ifndef CCAPI_GATEIO_URL_WS_BASE #define CCAPI_GATEIO_URL_WS_BASE "wss://api.gateio.ws" #endif + #ifndef CCAPI_GATEIO_PERPETUAL_FUTURES_URL_WS_BASE #define CCAPI_GATEIO_PERPETUAL_FUTURES_URL_WS_BASE "wss://fx-ws.gateio.ws" #endif + #ifndef CCAPI_CRYPTOCOM_URL_WS_BASE #define CCAPI_CRYPTOCOM_URL_WS_BASE "wss://stream.crypto.com" #endif + #ifndef CCAPI_BYBIT_URL_WS_BASE #define CCAPI_BYBIT_URL_WS_BASE "wss://stream.bybit.com" #endif + #ifndef CCAPI_BYBIT_URL_WS_ORDER_ENTRY_BASE #define CCAPI_BYBIT_URL_WS_ORDER_ENTRY_BASE "wss://stream.bybit.com" #endif + #ifndef CCAPI_BYBIT_WS_ORDER_ENTRY_PATH #define CCAPI_BYBIT_WS_ORDER_ENTRY_PATH "/v5/trade" #endif + #ifndef CCAPI_ASCENDEX_URL_WS_BASE #define CCAPI_ASCENDEX_URL_WS_BASE "wss://ascendex.com" #endif + #ifndef CCAPI_BITGET_URL_WS_BASE #define CCAPI_BITGET_URL_WS_BASE "wss://ws.bitget.com" #endif + #ifndef CCAPI_BITGET_FUTURES_URL_WS_BASE #define CCAPI_BITGET_FUTURES_URL_WS_BASE "wss://ws.bitget.com" #endif + #ifndef CCAPI_BITMART_URL_WS_BASE #define CCAPI_BITMART_URL_WS_BASE "wss://ws-manager-compress.bitmart.com" #endif + #ifndef CCAPI_MEXC_URL_WS_BASE #define CCAPI_MEXC_URL_WS_BASE "wss://wbs.mexc.com" #endif + #ifndef CCAPI_MEXC_FUTURES_URL_WS_BASE #define CCAPI_MEXC_FUTURES_URL_WS_BASE "wss://contract.mexc.com" #endif + #ifndef CCAPI_WHITEBIT_URL_WS_BASE #define CCAPI_WHITEBIT_URL_WS_BASE "wss://api.whitebit.com" #endif + // end: exchange WS urls // start: exchange FIX urls #ifndef CCAPI_COINBASE_URL_FIX_BASE #define CCAPI_COINBASE_URL_FIX_BASE "tcp+ssl://fix.exchange.coinbase.com:4198" #endif + #ifndef CCAPI_GEMINI_URL_FIX_HOST #define CCAPI_GEMINI_URL_FIX_HOST "" #endif + #ifndef CCAPI_GEMINI_URL_FIX_PORT #define CCAPI_GEMINI_URL_FIX_PORT "" #endif + #ifndef CCAPI_FTX_URL_FIX_BASE #define CCAPI_FTX_URL_FIX_BASE "tcp+ssl://fix.ftx.com:4363" #endif + #ifndef CCAPI_FTX_US_URL_FIX_BASE #define CCAPI_FTX_US_URL_FIX_BASE "tcp+ssl://fix.ftx.us:4363" #endif + #ifndef CCAPI_DERIBIT_URL_FIX_BASE #define CCAPI_DERIBIT_URL_FIX_BASE "www.deribit.com:9883" #endif + // end: exchange FIX urls // start: exchange API credentials #ifndef CCAPI_COINBASE_API_KEY #define CCAPI_COINBASE_API_KEY "COINBASE_API_KEY" #endif + #ifndef CCAPI_COINBASE_API_SECRET #define CCAPI_COINBASE_API_SECRET "COINBASE_API_SECRET" #endif + #ifndef CCAPI_COINBASE_API_PASSPHRASE #define CCAPI_COINBASE_API_PASSPHRASE "COINBASE_API_PASSPHRASE" #endif + #ifndef CCAPI_GEMINI_API_KEY #define CCAPI_GEMINI_API_KEY "GEMINI_API_KEY" #endif + #ifndef CCAPI_GEMINI_API_SECRET #define CCAPI_GEMINI_API_SECRET "GEMINI_API_SECRET" #endif + #ifndef CCAPI_GEMINI_API_SENDER_COMP_ID #define CCAPI_GEMINI_API_SENDER_COMP_ID "" #endif + #ifndef CCAPI_GEMINI_API_TARGET_COMP_ID #define CCAPI_GEMINI_API_TARGET_COMP_ID "" #endif + #ifndef CCAPI_KRAKEN_API_KEY #define CCAPI_KRAKEN_API_KEY "KRAKEN_API_KEY" #endif + #ifndef CCAPI_KRAKEN_API_SECRET #define CCAPI_KRAKEN_API_SECRET "KRAKEN_API_SECRET" #endif + #ifndef CCAPI_KRAKEN_FUTURES_API_KEY #define CCAPI_KRAKEN_FUTURES_API_KEY "KRAKEN_FUTURES_API_KEY" #endif + #ifndef CCAPI_KRAKEN_FUTURES_API_SECRET #define CCAPI_KRAKEN_FUTURES_API_SECRET "KRAKEN_FUTURES_API_SECRET" #endif + #ifndef CCAPI_BITSTAMP_API_KEY #define CCAPI_BITSTAMP_API_KEY "BITSTAMP_API_KEY" #endif + #ifndef CCAPI_BITSTAMP_API_SECRET #define CCAPI_BITSTAMP_API_SECRET "BITSTAMP_API_SECRET" #endif + #ifndef CCAPI_BITFINEX_API_KEY #define CCAPI_BITFINEX_API_KEY "BITFINEX_API_KEY" #endif + #ifndef CCAPI_BITFINEX_API_SECRET #define CCAPI_BITFINEX_API_SECRET "BITFINEX_API_SECRET" #endif + #ifndef CCAPI_BITMEX_API_KEY #define CCAPI_BITMEX_API_KEY "BITMEX_API_KEY" #endif + #ifndef CCAPI_BITMEX_API_SECRET #define CCAPI_BITMEX_API_SECRET "BITMEX_API_SECRET" #endif + #ifndef CCAPI_BINANCE_US_API_KEY #define CCAPI_BINANCE_US_API_KEY "BINANCE_US_API_KEY" #endif + #ifndef CCAPI_BINANCE_US_API_SECRET #define CCAPI_BINANCE_US_API_SECRET "BINANCE_US_API_SECRET" #endif + #ifndef CCAPI_BINANCE_API_KEY #define CCAPI_BINANCE_API_KEY "BINANCE_API_KEY" #endif + #ifndef CCAPI_BINANCE_API_SECRET #define CCAPI_BINANCE_API_SECRET "BINANCE_API_SECRET" #endif + +#ifndef CCAPI_BINANCE_WEBSOCKET_ORDER_ENTRY_API_KEY +#define CCAPI_BINANCE_WEBSOCKET_ORDER_ENTRY_API_KEY "BINANCE_WEBSOCKET_ORDER_ENTRY_API_KEY" +#endif + +#ifndef CCAPI_BINANCE_WEBSOCKET_ORDER_ENTRY_API_PRIVATE_KEY_PATH +#define CCAPI_BINANCE_WEBSOCKET_ORDER_ENTRY_API_PRIVATE_KEY_PATH "BINANCE_WEBSOCKET_ORDER_ENTRY_API_PRIVATE_KEY_PATH" +#endif + +#ifndef CCAPI_BINANCE_WEBSOCKET_ORDER_ENTRY_API_PRIVATE_KEY_PASSWORD +#define CCAPI_BINANCE_WEBSOCKET_ORDER_ENTRY_API_PRIVATE_KEY_PASSWORD "BINANCE_WEBSOCKET_ORDER_ENTRY_API_PRIVATE_KEY_PASSWORD" +#endif + #ifndef CCAPI_BINANCE_USDS_FUTURES_API_KEY #define CCAPI_BINANCE_USDS_FUTURES_API_KEY "BINANCE_USDS_FUTURES_API_KEY" #endif + #ifndef CCAPI_BINANCE_USDS_FUTURES_API_SECRET #define CCAPI_BINANCE_USDS_FUTURES_API_SECRET "BINANCE_USDS_FUTURES_API_SECRET" #endif + +#ifndef CCAPI_BINANCE_USDS_FUTURES_WEBSOCKET_ORDER_ENTRY_API_KEY +#define CCAPI_BINANCE_USDS_FUTURES_WEBSOCKET_ORDER_ENTRY_API_KEY "BINANCE_USDS_FUTURES_WEBSOCKET_ORDER_ENTRY_API_KEY" +#endif + +#ifndef CCAPI_BINANCE_USDS_FUTURES_WEBSOCKET_ORDER_ENTRY_API_PRIVATE_KEY_PATH +#define CCAPI_BINANCE_USDS_FUTURES_WEBSOCKET_ORDER_ENTRY_API_PRIVATE_KEY_PATH "BINANCE_USDS_FUTURES_WEBSOCKET_ORDER_ENTRY_API_PRIVATE_KEY_PATH" +#endif + +#ifndef CCAPI_BINANCE_USDS_FUTURES_WEBSOCKET_ORDER_ENTRY_API_PRIVATE_KEY_PASSWORD +#define CCAPI_BINANCE_USDS_FUTURES_WEBSOCKET_ORDER_ENTRY_API_PRIVATE_KEY_PASSWORD "BINANCE_USDS_FUTURES_WEBSOCKET_ORDER_ENTRY_API_PRIVATE_KEY_PASSWORD" +#endif + #ifndef CCAPI_BINANCE_COIN_FUTURES_API_KEY #define CCAPI_BINANCE_COIN_FUTURES_API_KEY "BINANCE_COIN_FUTURES_API_KEY" #endif + #ifndef CCAPI_BINANCE_COIN_FUTURES_API_SECRET #define CCAPI_BINANCE_COIN_FUTURES_API_SECRET "BINANCE_COIN_FUTURES_API_SECRET" #endif + +#ifndef CCAPI_BINANCE_COIN_FUTURES_WEBSOCKET_ORDER_ENTRY_API_KEY +#define CCAPI_BINANCE_COIN_FUTURES_WEBSOCKET_ORDER_ENTRY_API_KEY "BINANCE_COIN_FUTURES_WEBSOCKET_ORDER_ENTRY_API_KEY" +#endif + +#ifndef CCAPI_BINANCE_COIN_FUTURES_WEBSOCKET_ORDER_ENTRY_API_PRIVATE_KEY_PATH +#define CCAPI_BINANCE_COIN_FUTURES_WEBSOCKET_ORDER_ENTRY_API_PRIVATE_KEY_PATH "BINANCE_COIN_FUTURES_WEBSOCKET_ORDER_ENTRY_API_PRIVATE_KEY_PATH" +#endif + +#ifndef CCAPI_BINANCE_COIN_FUTURES_WEBSOCKET_ORDER_ENTRY_API_PRIVATE_KEY_PASSWORD +#define CCAPI_BINANCE_COIN_FUTURES_WEBSOCKET_ORDER_ENTRY_API_PRIVATE_KEY_PASSWORD "BINANCE_COIN_FUTURES_WEBSOCKET_ORDER_ENTRY_API_PRIVATE_KEY_PASSWORD" +#endif + #ifndef CCAPI_HUOBI_API_KEY #define CCAPI_HUOBI_API_KEY "HUOBI_API_KEY" #endif + #ifndef CCAPI_HUOBI_API_SECRET #define CCAPI_HUOBI_API_SECRET "HUOBI_API_SECRET" #endif + #ifndef CCAPI_HUOBI_USDT_SWAP_API_KEY #define CCAPI_HUOBI_USDT_SWAP_API_KEY "HUOBI_USDT_SWAP_API_KEY" #endif + #ifndef CCAPI_HUOBI_USDT_SWAP_API_SECRET #define CCAPI_HUOBI_USDT_SWAP_API_SECRET "HUOBI_USDT_SWAP_API_SECRET" #endif + #ifndef CCAPI_HUOBI_COIN_SWAP_API_KEY #define CCAPI_HUOBI_COIN_SWAP_API_KEY "HUOBI_COIN_SWAP_API_KEY" #endif + #ifndef CCAPI_HUOBI_COIN_SWAP_API_SECRET #define CCAPI_HUOBI_COIN_SWAP_API_SECRET "HUOBI_COIN_SWAP_API_SECRET" #endif + #ifndef CCAPI_OKX_API_KEY #define CCAPI_OKX_API_KEY "OKX_API_KEY" #endif + #ifndef CCAPI_OKX_API_SECRET #define CCAPI_OKX_API_SECRET "OKX_API_SECRET" #endif + #ifndef CCAPI_OKX_API_PASSPHRASE #define CCAPI_OKX_API_PASSPHRASE "OKX_API_PASSPHRASE" #endif + #ifndef CCAPI_OKX_API_X_SIMULATED_TRADING #define CCAPI_OKX_API_X_SIMULATED_TRADING "OKX_API_X_SIMULATED_TRADING" #endif + #ifndef CCAPI_ERISX_API_KEY #define CCAPI_ERISX_API_KEY "ERISX_API_KEY" #endif + #ifndef CCAPI_ERISX_API_SECRET #define CCAPI_ERISX_API_SECRET "ERISX_API_SECRET" #endif + #ifndef CCAPI_KUCOIN_API_KEY #define CCAPI_KUCOIN_API_KEY "KUCOIN_API_KEY" #endif + #ifndef CCAPI_KUCOIN_API_SECRET #define CCAPI_KUCOIN_API_SECRET "KUCOIN_API_SECRET" #endif + #ifndef CCAPI_KUCOIN_API_PASSPHRASE #define CCAPI_KUCOIN_API_PASSPHRASE "KUCOIN_API_PASSPHRASE" #endif + #ifndef CCAPI_KUCOIN_API_KEY_VERSION #define CCAPI_KUCOIN_API_KEY_VERSION "KUCOIN_API_KEY_VERSION" #endif + #ifndef CCAPI_KUCOIN_FUTURES_API_KEY #define CCAPI_KUCOIN_FUTURES_API_KEY "KUCOIN_FUTURES_API_KEY" #endif + #ifndef CCAPI_KUCOIN_FUTURES_API_SECRET #define CCAPI_KUCOIN_FUTURES_API_SECRET "KUCOIN_FUTURES_API_SECRET" #endif + #ifndef CCAPI_KUCOIN_FUTURES_API_PASSPHRASE #define CCAPI_KUCOIN_FUTURES_API_PASSPHRASE "KUCOIN_FUTURES_API_PASSPHRASE" #endif + #ifndef CCAPI_FTX_API_KEY #define CCAPI_FTX_API_KEY "FTX_API_KEY" #endif + #ifndef CCAPI_FTX_API_SECRET #define CCAPI_FTX_API_SECRET "FTX_API_SECRET" #endif + #ifndef CCAPI_FTX_API_SUBACCOUNT #define CCAPI_FTX_API_SUBACCOUNT "FTX_API_SUBACCOUNT" #endif + #ifndef CCAPI_FTX_US_API_KEY #define CCAPI_FTX_US_API_KEY "FTX_US_API_KEY" #endif + #ifndef CCAPI_FTX_US_API_SECRET #define CCAPI_FTX_US_API_SECRET "FTX_US_API_SECRET" #endif + #ifndef CCAPI_FTX_US_API_SUBACCOUNT #define CCAPI_FTX_US_API_SUBACCOUNT "FTX_US_API_SUBACCOUNT" #endif + #ifndef CCAPI_DERIBIT_CLIENT_ID #define CCAPI_DERIBIT_CLIENT_ID "DERIBIT_CLIENT_ID" #endif + #ifndef CCAPI_DERIBIT_CLIENT_SECRET #define CCAPI_DERIBIT_CLIENT_SECRET "DERIBIT_CLIENT_SECRET" #endif + #ifndef CCAPI_GATEIO_API_KEY #define CCAPI_GATEIO_API_KEY "GATEIO_API_KEY" #endif + #ifndef CCAPI_GATEIO_API_SECRET #define CCAPI_GATEIO_API_SECRET "GATEIO_API_SECRET" #endif + #ifndef CCAPI_GATEIO_PERPETUAL_FUTURES_API_KEY #define CCAPI_GATEIO_PERPETUAL_FUTURES_API_KEY "GATEIO_PERPETUAL_FUTURES_API_KEY" #endif + #ifndef CCAPI_GATEIO_PERPETUAL_FUTURES_API_SECRET #define CCAPI_GATEIO_PERPETUAL_FUTURES_API_SECRET "GATEIO_PERPETUAL_FUTURES_API_SECRET" #endif + #ifndef CCAPI_CRYPTOCOM_API_KEY #define CCAPI_CRYPTOCOM_API_KEY "CRYPTOCOM_API_KEY" #endif + #ifndef CCAPI_CRYPTOCOM_API_SECRET #define CCAPI_CRYPTOCOM_API_SECRET "CRYPTOCOM_API_SECRET" #endif + #ifndef CCAPI_BYBIT_API_KEY #define CCAPI_BYBIT_API_KEY "BYBIT_API_KEY" #endif + #ifndef CCAPI_BYBIT_API_SECRET #define CCAPI_BYBIT_API_SECRET "BYBIT_API_SECRET" #endif + #ifndef CCAPI_ASCENDEX_API_KEY #define CCAPI_ASCENDEX_API_KEY "ASCENDEX_API_KEY" #endif + #ifndef CCAPI_ASCENDEX_API_SECRET #define CCAPI_ASCENDEX_API_SECRET "ASCENDEX_API_SECRET" #endif + #ifndef CCAPI_ASCENDEX_API_ACCOUNT_GROUP #define CCAPI_ASCENDEX_API_ACCOUNT_GROUP "ASCENDEX_API_ACCOUNT_GROUP" #endif + #ifndef CCAPI_BITGET_API_KEY #define CCAPI_BITGET_API_KEY "BITGET_API_KEY" #endif + #ifndef CCAPI_BITGET_API_SECRET #define CCAPI_BITGET_API_SECRET "BITGET_API_SECRET" #endif + #ifndef CCAPI_BITGET_API_PASSPHRASE #define CCAPI_BITGET_API_PASSPHRASE "BITGET_API_PASSPHRASE" #endif + #ifndef CCAPI_BITGET_FUTURES_API_KEY #define CCAPI_BITGET_FUTURES_API_KEY "BITGET_FUTURES_API_KEY" #endif + #ifndef CCAPI_BITGET_FUTURES_API_SECRET #define CCAPI_BITGET_FUTURES_API_SECRET "BITGET_FUTURES_API_SECRET" #endif + #ifndef CCAPI_BITGET_FUTURES_API_PASSPHRASE #define CCAPI_BITGET_FUTURES_API_PASSPHRASE "BITGET_FUTURES_API_PASSPHRASE" #endif + #ifndef CCAPI_BITMART_API_KEY #define CCAPI_BITMART_API_KEY "BITMART_API_KEY" #endif + #ifndef CCAPI_BITMART_API_SECRET #define CCAPI_BITMART_API_SECRET "BITMART_API_SECRET" #endif + #ifndef CCAPI_BITMART_API_MEMO #define CCAPI_BITMART_API_MEMO "BITMART_API_MEMO" #endif + #ifndef CCAPI_MEXC_API_KEY #define CCAPI_MEXC_API_KEY "MEXC_API_KEY" #endif + #ifndef CCAPI_MEXC_API_SECRET #define CCAPI_MEXC_API_SECRET "MEXC_API_SECRET" #endif + #ifndef CCAPI_MEXC_FUTURES_API_KEY #define CCAPI_MEXC_FUTURES_API_KEY "MEXC_FUTURES_API_KEY" #endif + #ifndef CCAPI_MEXC_FUTURES_API_SECRET #define CCAPI_MEXC_FUTURES_API_SECRET "MEXC_FUTURES_API_SECRET" #endif + // end: exchange API credentials #define CCAPI_HTTP_PORT_DEFAULT "80" @@ -1183,28 +1612,36 @@ #ifndef CCAPI_BITMEX_API_RECEIVE_WINDOW_SECONDS #define CCAPI_BITMEX_API_RECEIVE_WINDOW_SECONDS 5 #endif + #ifndef CCAPI_BITFINEX_STREAM_TRADE_RAW_MESSAGE_TYPE #define CCAPI_BITFINEX_STREAM_TRADE_RAW_MESSAGE_TYPE "tu" #endif + #define CCAPI_AUTHORIZATION "AUTHORIZATION" #ifndef CCAPI_HFFIX_READ_MESSAGE_CHUNK_SIZE #define CCAPI_HFFIX_READ_MESSAGE_CHUNK_SIZE 4096 #endif + #ifndef CCAPI_FIX_PROTOCOL_VERSION_COINBASE #define CCAPI_FIX_PROTOCOL_VERSION_COINBASE "FIX.4.2" #endif + #ifndef CCAPI_FIX_PROTOCOL_VERSION_GEMINI #define CCAPI_FIX_PROTOCOL_VERSION_GEMINI "FIX.4.4" #endif + #ifndef CCAPI_FIX_PROTOCOL_VERSION_FTX #define CCAPI_FIX_PROTOCOL_VERSION_FTX "FIX.4.2" #endif + #ifndef CCAPI_FIX_PROTOCOL_VERSION_FTX_US #define CCAPI_FIX_PROTOCOL_VERSION_FTX_US "FIX.4.2" #endif + #ifndef CCAPI_FIX_PROTOCOL_VERSION_DERIBIT #define CCAPI_FIX_PROTOCOL_VERSION_DERIBIT "FIX.4.4" #endif + #ifndef CCAPI_BYBIT_BASE_API_RECEIVE_WINDOW_MILLISECONDS #define CCAPI_BYBIT_BASE_API_RECEIVE_WINDOW_MILLISECONDS 5000 #endif @@ -1212,31 +1649,46 @@ #ifndef CCAPI_OKX_API_BROKER_CODE #define CCAPI_OKX_API_BROKER_CODE "9cbc6a17a1fcBCDE" #endif + #ifndef CCAPI_KUCOIN_API_PARTNER_PLATFORM_ID #define CCAPI_KUCOIN_API_PARTNER_PLATFORM_ID "CCAPI" #endif + #ifndef CCAPI_KUCOIN_API_PARTNER_PRIVATE_KEY #define CCAPI_KUCOIN_API_PARTNER_PRIVATE_KEY "acd80910-9304-4625-93c0-dabe644d2ae3" #endif + #ifndef CCAPI_BITGET_API_CHANNEL_API_CODE #define CCAPI_BITGET_API_CHANNEL_API_CODE "95mpa" #endif + #ifndef CCAPI_GATEIO_API_CHANNEL_ID #define CCAPI_GATEIO_API_CHANNEL_ID "cryptochassis2" #endif + #ifndef CCAPI_MEXC_API_SOURCE #define CCAPI_MEXC_API_SOURCE "CHAS" #endif + #ifndef CCAPI_BYBIT_API_BROKER_ID #define CCAPI_BYBIT_API_BROKER_ID "Vs000261" #endif + #ifndef CCAPI_BINANCE_API_LINK_ID #define CCAPI_BINANCE_API_LINK_ID "XHKUG2CH" #endif + #ifndef CCAPI_BINANCE_USDS_FUTURES_API_LINK_ID #define CCAPI_BINANCE_USDS_FUTURES_API_LINK_ID "QzcVS63u" #endif + #ifndef CCAPI_BITMART_BROKER_ID #define CCAPI_BITMART_BROKER_ID "cryptochassis01" #endif -#endif // INCLUDE_CCAPI_CPP_CCAPI_MACRO_H_ + +#ifndef CCAPI_CRYPTOCOM_BROKER_CODE +#define CCAPI_CRYPTOCOM_BROKER_CODE "CHAS" +#endif + +#endif +// INCLUDE_CCAPI_CPP_CCAPI_MACRO_H_ diff --git a/include/ccapi_cpp/ccapi_session_configs.h b/include/ccapi_cpp/ccapi_session_configs.h index a8bb0baf..4aefcf42 100644 --- a/include/ccapi_cpp/ccapi_session_configs.h +++ b/include/ccapi_cpp/ccapi_session_configs.h @@ -93,6 +93,7 @@ class SessionConfigs { {CCAPI_CANDLESTICK, CCAPI_WEBSOCKET_BINANCE_BASE_CHANNEL_KLINE}, }; std::map fieldWebsocketChannelMapBinanceUsdsFutures = { + {CCAPI_TRADE, CCAPI_WEBSOCKET_BINANCE_BASE_CHANNEL_TRADE}, {CCAPI_AGG_TRADE, CCAPI_WEBSOCKET_BINANCE_BASE_CHANNEL_AGG_TRADE}, {CCAPI_MARKET_DEPTH, CCAPI_WEBSOCKET_BINANCE_BASE_CHANNEL_PARTIAL_BOOK_DEPTH}, {CCAPI_CANDLESTICK, CCAPI_WEBSOCKET_BINANCE_BASE_CHANNEL_KLINE}, @@ -368,6 +369,9 @@ class SessionConfigs { this->urlWebsocketOrderEntryBase = { {CCAPI_EXCHANGE_NAME_OKX, CCAPI_OKX_URL_WS_BASE}, {CCAPI_EXCHANGE_NAME_BYBIT, CCAPI_BYBIT_URL_WS_ORDER_ENTRY_BASE}, + {CCAPI_EXCHANGE_NAME_BINANCE_USDS_FUTURES, CCAPI_BINANCE_USDS_FUTURES_URL_WS_ORDER_ENTRY_BASE}, + {CCAPI_EXCHANGE_NAME_BINANCE_COIN_FUTURES, CCAPI_BINANCE_COIN_FUTURES_URL_WS_ORDER_ENTRY_BASE}, + {CCAPI_EXCHANGE_NAME_BINANCE, CCAPI_BINANCE_URL_WS_ORDER_ENTRY_BASE}, }; this->initialSequenceByExchangeMap = {{CCAPI_EXCHANGE_NAME_GEMINI, 0}, {CCAPI_EXCHANGE_NAME_BITFINEX, 1}}; } diff --git a/include/ccapi_cpp/ccapi_util_private.h b/include/ccapi_cpp/ccapi_util_private.h index db612f59..c349c800 100644 --- a/include/ccapi_cpp/ccapi_util_private.h +++ b/include/ccapi_cpp/ccapi_util_private.h @@ -9,7 +9,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -28,6 +30,7 @@ #include "ccapi_cpp/ccapi_macro.h" #include "ccapi_cpp/ccapi_util.h" #include "openssl/evp.h" +#include "openssl/pem.h" namespace ccapi { /** @@ -35,6 +38,10 @@ namespace ccapi { */ class UtilString { public: + static bool startsWith(const std::string& str, const std::string& prefix) { + return str.size() >= prefix.size() && std::memcmp(str.data(), prefix.data(), prefix.size()) == 0; + } + static std::string roundInputBySignificantFigure(double input, int numSignificantFigure, int roundDirection) { const auto& splitted = UtilString::split(UtilString::printDoubleScientific(input), 'e'); double a = std::stod(splitted.at(0)) * std::pow(10, numSignificantFigure - 1); @@ -698,6 +705,100 @@ class UtilAlgorithm { template static uint_fast32_t crc(InputIterator first, InputIterator last); + + static EVP_PKEY* loadPrivateKey(const std::string& keyPem, const std::string& password = "") { + BIO* bio = BIO_new_mem_buf(keyPem.data(), static_cast(keyPem.size())); + if (!bio) return nullptr; + + const EVP_PKEY_ASN1_METHOD* meth = EVP_PKEY_asn1_find_str(nullptr, "ED25519", -1); + if (!meth) { + throw std::runtime_error("ED25519 is NOT supported in this OpenSSL build."); + } + + EVP_PKEY* pkey = nullptr; + if (password.empty()) { + pkey = PEM_read_bio_PrivateKey(bio, nullptr, nullptr, nullptr); + } else { + pkey = PEM_read_bio_PrivateKey(bio, nullptr, nullptr, const_cast(password.c_str())); + } + + BIO_free(bio); + return pkey; + } + + static std::string readFile(const std::string& path) { + std::ifstream file(path, std::ios::binary); + if (!file.is_open()) { + throw std::runtime_error("Failed to open file: " + path); + } + + std::ostringstream oss; + oss << file.rdbuf(); + return oss.str(); + } + + static std::string base64Encode(const std::vector& input) { + BIO *bio, *b64; + BUF_MEM* bufferPtr; + b64 = BIO_new(BIO_f_base64()); + bio = BIO_new(BIO_s_mem()); + b64 = BIO_push(b64, bio); + BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); + BIO_write(b64, input.data(), static_cast(input.size())); + BIO_flush(b64); + BIO_get_mem_ptr(b64, &bufferPtr); + std::string result(bufferPtr->data, bufferPtr->length); + BIO_free_all(b64); + return result; + } + + static std::string signPayload(EVP_PKEY* pkey, const std::string& payload) { + EVP_MD_CTX* ctx = EVP_MD_CTX_new(); + if (!ctx) throw std::runtime_error("Failed to create EVP_MD_CTX"); + + const int key_type = EVP_PKEY_base_id(pkey); + const bool is_ed25519 = key_type == EVP_PKEY_ED25519; + + if (EVP_DigestSignInit(ctx, nullptr, is_ed25519 ? nullptr : EVP_sha256(), nullptr, pkey) != 1) throw std::runtime_error("EVP_DigestSignInit failed"); + + size_t sigLen = 0; + + if (is_ed25519) { + // One-shot sign for Ed25519 + if (EVP_DigestSign(ctx, nullptr, &sigLen, reinterpret_cast(payload.data()), payload.size()) != 1) + throw std::runtime_error("EVP_DigestSign (get length) failed"); + + std::vector signature(sigLen); + if (EVP_DigestSign(ctx, signature.data(), &sigLen, reinterpret_cast(payload.data()), payload.size()) != 1) + throw std::runtime_error("EVP_DigestSign failed"); + signature.resize(sigLen); + EVP_MD_CTX_free(ctx); + return base64Encode(signature); + } else { + // Traditional sign (e.g., RSA) + if (EVP_DigestSignUpdate(ctx, payload.data(), payload.size()) != 1) throw std::runtime_error("EVP_DigestSignUpdate failed"); + + if (EVP_DigestSignFinal(ctx, nullptr, &sigLen) != 1) throw std::runtime_error("EVP_DigestSignFinal (get length) failed"); + + std::vector signature(sigLen); + if (EVP_DigestSignFinal(ctx, signature.data(), &sigLen) != 1) throw std::runtime_error("EVP_DigestSignFinal failed"); + + signature.resize(sigLen); + EVP_MD_CTX_free(ctx); + return base64Encode(signature); + } + } + + static const EVP_MD* getDigest(const ShaVersion version) { + switch (version) { + case ShaVersion::SHA256: + return EVP_sha256(); + case ShaVersion::SHA512: + return EVP_sha512(); + default: + throw std::invalid_argument("Unsupported SHA version"); + } + } }; template @@ -1232,5 +1333,6 @@ V mapGetWithDefault(const C& m, const K& key, const V defaultValu } return it->second; } + } /* namespace ccapi */ #endif // INCLUDE_CCAPI_CPP_CCAPI_UTIL_PRIVATE_H_ diff --git a/include/ccapi_cpp/service/ccapi_execution_management_service_ascendex.h b/include/ccapi_cpp/service/ccapi_execution_management_service_ascendex.h index 17e3f990..343c7b9e 100644 --- a/include/ccapi_cpp/service/ccapi_execution_management_service_ascendex.h +++ b/include/ccapi_cpp/service/ccapi_execution_management_service_ascendex.h @@ -342,7 +342,7 @@ class ExecutionManagementServiceAscendex : public ExecutionManagementService { auto it1Str = std::string(it1->value.GetString()); auto it2Str = std::string(it2->value.GetString()); if (!it1Str.empty() && !it2Str.empty()) { - element.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, + element.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, Decimal(UtilString::printDoubleScientific(std::stod(it1Str) * std::stod(it2Str))).toString()); } } @@ -470,7 +470,7 @@ class ExecutionManagementServiceAscendex : public ExecutionManagementService { this->extractOrderInfo(info, data, extractionFieldNameMap); auto it = data.FindMember("ap"); if (it != data.MemberEnd() && !it->value.IsNull()) { - info.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, + info.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, Decimal(UtilString::printDoubleScientific(std::stod(it->value.GetString()) * std::stod(data["cfq"].GetString()))).toString()); } info.insert(CCAPI_EM_BASE_ASSET_QUANTITY_AVAILABLE_FOR_TRADING, data["bab"].GetString()); diff --git a/include/ccapi_cpp/service/ccapi_execution_management_service_binance.h b/include/ccapi_cpp/service/ccapi_execution_management_service_binance.h index 0196889f..4f252a99 100644 --- a/include/ccapi_cpp/service/ccapi_execution_management_service_binance.h +++ b/include/ccapi_cpp/service/ccapi_execution_management_service_binance.h @@ -15,12 +15,19 @@ class ExecutionManagementServiceBinance : public ExecutionManagementServiceBinan : ExecutionManagementServiceBinanceBase(eventHandler, sessionOptions, sessionConfigs, serviceContextPtr) { this->exchangeName = CCAPI_EXCHANGE_NAME_BINANCE; this->baseUrlWs = sessionConfigs.getUrlWebsocketBase().at(this->exchangeName) + "/ws"; + this->baseUrlWsOrderEntry = sessionConfigs.getUrlWebsocketOrderEntryBase().at(this->exchangeName) + CCAPI_BINANCE_WS_ORDER_ENTRY_PATH; this->baseUrlRest = sessionConfigs.getUrlRestBase().at(this->exchangeName); this->setHostRestFromUrlRest(this->baseUrlRest); this->setHostWsFromUrlWs(this->baseUrlWs); + this->setHostWsFromUrlWsOrderEntry(this->baseUrlWsOrderEntry); this->apiKeyName = CCAPI_BINANCE_API_KEY; this->apiSecretName = CCAPI_BINANCE_API_SECRET; - this->setupCredential({this->apiKeyName, this->apiSecretName}); + this->websocketOrderEntryApiKeyName = CCAPI_BINANCE_WEBSOCKET_ORDER_ENTRY_API_KEY; + this->websocketOrderEntryApiPrivateKeyPathName = CCAPI_BINANCE_WEBSOCKET_ORDER_ENTRY_API_PRIVATE_KEY_PATH; + this->websocketOrderEntryApiPrivateKeyPasswordName = CCAPI_BINANCE_WEBSOCKET_ORDER_ENTRY_API_PRIVATE_KEY_PASSWORD; + this->setupCredential({this->apiKeyName, this->apiSecretName, this->websocketOrderEntryApiKeyName, this->websocketOrderEntryApiPrivateKeyPathName, + this->websocketOrderEntryApiPrivateKeyPasswordName}); + this->websocketOrderEntryHost = CCAPI_BINANCE_HOST_WS_ORDER_ENTRY; this->createOrderTarget = CCAPI_BINANCE_CREATE_ORDER_PATH; this->cancelOrderTarget = "/api/v3/order"; this->getOrderTarget = "/api/v3/order"; diff --git a/include/ccapi_cpp/service/ccapi_execution_management_service_binance_base.h b/include/ccapi_cpp/service/ccapi_execution_management_service_binance_base.h index 2c5cbdff..2106d283 100644 --- a/include/ccapi_cpp/service/ccapi_execution_management_service_binance_base.h +++ b/include/ccapi_cpp/service/ccapi_execution_management_service_binance_base.h @@ -22,71 +22,77 @@ class ExecutionManagementServiceBinanceBase : public ExecutionManagementService #endif void prepareConnect(std::shared_ptr wsConnectionPtr) override { - auto hostPort = this->extractHostFromUrl(this->baseUrlRest); - std::string host = hostPort.first; - std::string port = hostPort.second; - http::request req; - req.set(http::field::host, host); - req.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING); - req.method(http::verb::post); - std::string target = this->listenKeyTarget; - const auto& marginType = wsConnectionPtr->subscriptionList.at(0).getMarginType(); - if (marginType == CCAPI_EM_MARGIN_TYPE_CROSS_MARGIN) { - target = this->listenKeyCrossMarginTarget; - } else if (marginType == CCAPI_EM_MARGIN_TYPE_ISOLATED_MARGIN) { - target = this->listenKeyIsolatedMarginTarget; - } - if (marginType == CCAPI_EM_MARGIN_TYPE_ISOLATED_MARGIN) { - auto symbol = wsConnectionPtr->subscriptionList.at(0).getInstrument(); - target += "?" + symbol; - } - req.target(target); - auto credential = wsConnectionPtr->subscriptionList.at(0).getCredential(); - if (credential.empty()) { - credential = this->credentialDefault; - } - auto apiKey = mapGetWithDefault(credential, this->apiKeyName); - req.set("X-MBX-APIKEY", apiKey); - this->sendRequest( - req, - [wsConnectionPtr, that = shared_from_base()](const beast::error_code& ec) { that->onFail_(wsConnectionPtr); }, - [wsConnectionPtr, that = shared_from_base()](const http::response& res) { - int statusCode = res.result_int(); - std::string body = res.body(); - if (statusCode / 100 == 2) { - std::string urlWebsocketBase; - try { - rj::Document document; - document.Parse(body.c_str()); - std::string listenKey = document["listenKey"].GetString(); - std::string url = that->baseUrlWs + "/" + listenKey; - wsConnectionPtr->setUrl(url); - that->connect(wsConnectionPtr); - that->extraPropertyByConnectionIdMap[wsConnectionPtr->id].insert({ - {"listenKey", listenKey}, - }); - return; - } catch (const std::runtime_error& e) { - CCAPI_LOGGER_ERROR(std::string("e.what() = ") + e.what()); + if (wsConnectionPtr->host == this->websocketOrderEntryHost) { + ExecutionManagementService::prepareConnect(wsConnectionPtr); + } else { + auto hostPort = this->extractHostFromUrl(this->baseUrlRest); + std::string host = hostPort.first; + std::string port = hostPort.second; + http::request req; + req.set(http::field::host, host); + req.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING); + req.method(http::verb::post); + std::string target = this->listenKeyTarget; + const auto& marginType = wsConnectionPtr->subscriptionList.at(0).getMarginType(); + if (marginType == CCAPI_EM_MARGIN_TYPE_CROSS_MARGIN) { + target = this->listenKeyCrossMarginTarget; + } else if (marginType == CCAPI_EM_MARGIN_TYPE_ISOLATED_MARGIN) { + target = this->listenKeyIsolatedMarginTarget; + } + if (marginType == CCAPI_EM_MARGIN_TYPE_ISOLATED_MARGIN) { + auto symbol = wsConnectionPtr->subscriptionList.at(0).getInstrument(); + target += "?" + symbol; + } + req.target(target); + auto credential = wsConnectionPtr->subscriptionList.at(0).getCredential(); + if (credential.empty()) { + credential = this->credentialDefault; + } + auto apiKey = mapGetWithDefault(credential, this->apiKeyName); + req.set("X-MBX-APIKEY", apiKey); + this->sendRequest( + req, + [wsConnectionPtr, that = shared_from_base()](const beast::error_code& ec) { that->onFail_(wsConnectionPtr); }, + [wsConnectionPtr, that = shared_from_base()](const http::response& res) { + int statusCode = res.result_int(); + std::string body = res.body(); + if (statusCode / 100 == 2) { + std::string urlWebsocketBase; + try { + rj::Document document; + document.Parse(body.c_str()); + std::string listenKey = document["listenKey"].GetString(); + std::string url = that->baseUrlWs + "/" + listenKey; + wsConnectionPtr->setUrl(url); + that->connect(wsConnectionPtr); + that->extraPropertyByConnectionIdMap[wsConnectionPtr->id].insert({ + {"listenKey", listenKey}, + }); + return; + } catch (const std::runtime_error& e) { + CCAPI_LOGGER_ERROR(std::string("e.what() = ") + e.what()); + } } - } - that->onFail_(wsConnectionPtr); - }, - this->sessionOptions.httpRequestTimeoutMilliseconds); + that->onFail_(wsConnectionPtr); + }, + this->sessionOptions.httpRequestTimeoutMilliseconds); + } } void onOpen(std::shared_ptr wsConnectionPtr) override { ExecutionManagementService::onOpen(wsConnectionPtr); - auto now = UtilTime::now(); - Event event; - event.setType(Event::Type::SUBSCRIPTION_STATUS); - Message message; - message.setTimeReceived(now); - message.setType(Message::Type::SUBSCRIPTION_STARTED); - message.setCorrelationIdList({wsConnectionPtr->subscriptionList.at(0).getCorrelationId()}); - event.setMessageList({message}); - this->eventHandler(event, nullptr); - this->setPingListenKeyTimer(wsConnectionPtr); + if (wsConnectionPtr->host != this->websocketOrderEntryHost) { + auto now = UtilTime::now(); + Event event; + event.setType(Event::Type::SUBSCRIPTION_STATUS); + Message message; + message.setTimeReceived(now); + message.setType(Message::Type::SUBSCRIPTION_STARTED); + message.setCorrelationIdList({wsConnectionPtr->subscriptionList.at(0).getCorrelationId()}); + event.setMessageList({message}); + this->eventHandler(event, nullptr); + this->setPingListenKeyTimer(wsConnectionPtr); + } } void setPingListenKeyTimer(const std::shared_ptr wsConnectionPtr) { @@ -328,7 +334,7 @@ class ExecutionManagementServiceBinanceBase : public ExecutionManagementService {CCAPI_EM_ORDER_QUANTITY, std::make_pair("origQty", JsonDataType::STRING)}, {CCAPI_EM_ORDER_LIMIT_PRICE, std::make_pair("price", JsonDataType::STRING)}, {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY, std::make_pair("executedQty", JsonDataType::STRING)}, - {CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, std::make_pair(this->isDerivatives ? "cumQuote" : "cummulativeQuoteQty", JsonDataType::STRING)}, + {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, std::make_pair(this->isDerivatives ? "cumQuote" : "cummulativeQuoteQty", JsonDataType::STRING)}, {CCAPI_EM_ORDER_STATUS, std::make_pair("status", JsonDataType::STRING)}, {CCAPI_EM_ORDER_INSTRUMENT, std::make_pair("symbol", JsonDataType::STRING)}, {CCAPI_LAST_UPDATED_TIME_SECONDS, std::make_pair("updateTime", JsonDataType::STRING)}, @@ -442,127 +448,351 @@ class ExecutionManagementServiceBinanceBase : public ExecutionManagementService Event event; std::vector messageList; - const auto& fieldSet = subscription.getFieldSet(); - const auto& instrumentSet = subscription.getInstrumentSet(); - std::string type = document["e"].GetString(); - if (type == (this->isDerivatives ? "ORDER_TRADE_UPDATE" : "executionReport")) { - event.setType(Event::Type::SUBSCRIPTION_DATA); - const rj::Value& data = this->isDerivatives ? document["o"] : document; - std::string executionType = data["x"].GetString(); - std::string instrument = data["s"].GetString(); - if (instrumentSet.empty() || instrumentSet.find(UtilString::toUpper(instrument)) != instrumentSet.end() || - instrumentSet.find(UtilString::toLower(instrument)) != instrumentSet.end()) { - if (executionType == "TRADE" && fieldSet.find(CCAPI_EM_PRIVATE_TRADE) != fieldSet.end()) { - Message message; - message.setTimeReceived(timeReceived); - message.setCorrelationIdList({subscription.getCorrelationId()}); - message.setTime(TimePoint(std::chrono::milliseconds(std::stoll((this->isDerivatives ? document : data)["E"].GetString())))); - message.setType(Message::Type::EXECUTION_MANAGEMENT_EVENTS_PRIVATE_TRADE); - std::vector elementList; + if (wsConnectionPtr->host == this->websocketOrderEntryHost) { + Message message; + message.setTimeReceived(timeReceived); + message.setCorrelationIdList({subscription.getCorrelationId()}); + std::string id = document["id"].GetString(); + int statusCode = std::stoi(document["status"].GetString()); + bool success = statusCode / 100 == 2; + if (id == this->websocketOrderEntrySessionLogonJsonId) { + if (success) { + event.setType(Event::Type::AUTHORIZATION_STATUS); + message.setType(Message::Type::AUTHORIZATION_SUCCESS); Element element; - element.insert(CCAPI_TRADE_ID, std::string(data["t"].GetString())); - element.insert(CCAPI_EM_ORDER_LAST_EXECUTED_PRICE, std::string(data["L"].GetString())); - element.insert(CCAPI_EM_ORDER_LAST_EXECUTED_SIZE, std::string(data["l"].GetString())); - element.insert(CCAPI_EM_ORDER_SIDE, std::string(data["S"].GetString()) == "BUY" ? CCAPI_EM_ORDER_SIDE_BUY : CCAPI_EM_ORDER_SIDE_SELL); - element.insert(CCAPI_IS_MAKER, data["m"].GetBool() ? "1" : "0"); - element.insert(CCAPI_EM_ORDER_ID, std::string(data["i"].GetString())); - element.insert(CCAPI_EM_CLIENT_ORDER_ID, std::string(data["c"].GetString())); - element.insert(CCAPI_EM_ORDER_INSTRUMENT, instrument); - { - auto it = data.FindMember("n"); - if (it != data.MemberEnd() && !it->value.IsNull()) { - element.insert(CCAPI_EM_ORDER_FEE_QUANTITY, std::string(it->value.GetString())); + element.insert(CCAPI_CONNECTION_ID, wsConnectionPtr->id); + element.insert(CCAPI_CONNECTION_URL, wsConnectionPtr->url); + element.insert(CCAPI_INFO_MESSAGE, textMessage); + message.setElementList({element}); + } else { + event.setType(Event::Type::AUTHORIZATION_STATUS); + message.setType(Message::Type::AUTHORIZATION_FAILURE); + Element element; + element.insert(CCAPI_CONNECTION_ID, wsConnectionPtr->id); + element.insert(CCAPI_CONNECTION_URL, wsConnectionPtr->url); + element.insert(CCAPI_ERROR_MESSAGE, textMessage); + message.setElementList({element}); + } + } else if (UtilString::startsWith(id, this->websocketOrderEntryCreateOrderJsonIdPrefix) || + UtilString::startsWith(id, this->websocketOrderEntryCancelOrderJsonIdPrefix)) { + bool isCreateOrder = UtilString::startsWith(id, this->websocketOrderEntryCreateOrderJsonIdPrefix); + std::string_view wsRequestIdStr; + if (isCreateOrder) { + wsRequestIdStr = std::string_view(id).substr(this->websocketOrderEntryCreateOrderJsonIdPrefix.size()); + } else { + wsRequestIdStr = std::string_view(id).substr(this->websocketOrderEntryCancelOrderJsonIdPrefix.size()); + } + unsigned long wsRequestId = std::stoul(std::string(wsRequestIdStr)); + const auto& requestCorrelationId = this->requestCorrelationIdByWsRequestIdByConnectionIdMap.at(wsConnectionPtr->id).at(wsRequestId); + event.setType(Event::Type::RESPONSE); + if (!success) { + message.setType(Message::Type::RESPONSE_ERROR); + Element element; + element.insert(CCAPI_ERROR_MESSAGE, textMessage); + message.setElementList({element}); + message.setCorrelationIdList({requestCorrelationId}); + } else { + std::vector elementList; + if (isCreateOrder) { + message.setType(Message::Type::CREATE_ORDER); + } else { + message.setType(Message::Type::CANCEL_ORDER); + } + this->extractOrderInfoFromResponse(elementList, document); + message.setElementList(elementList); + message.setCorrelationIdList({requestCorrelationId}); + } + } + messageList.emplace_back(std::move(message)); + } else { + const auto& fieldSet = subscription.getFieldSet(); + const auto& instrumentSet = subscription.getInstrumentSet(); + std::string type = document["e"].GetString(); + if (type == (this->isDerivatives ? "ORDER_TRADE_UPDATE" : "executionReport")) { + event.setType(Event::Type::SUBSCRIPTION_DATA); + const rj::Value& data = this->isDerivatives ? document["o"] : document; + std::string executionType = data["x"].GetString(); + std::string instrument = data["s"].GetString(); + if (instrumentSet.empty() || instrumentSet.find(UtilString::toUpper(instrument)) != instrumentSet.end() || + instrumentSet.find(UtilString::toLower(instrument)) != instrumentSet.end()) { + if (executionType == "TRADE" && fieldSet.find(CCAPI_EM_PRIVATE_TRADE) != fieldSet.end()) { + Message message; + message.setTimeReceived(timeReceived); + message.setCorrelationIdList({subscription.getCorrelationId()}); + message.setTime(TimePoint(std::chrono::milliseconds(std::stoll((this->isDerivatives ? document : data)["E"].GetString())))); + message.setType(Message::Type::EXECUTION_MANAGEMENT_EVENTS_PRIVATE_TRADE); + std::vector elementList; + Element element; + element.insert(CCAPI_TRADE_ID, std::string(data["t"].GetString())); + element.insert(CCAPI_EM_ORDER_LAST_EXECUTED_PRICE, std::string(data["L"].GetString())); + element.insert(CCAPI_EM_ORDER_LAST_EXECUTED_SIZE, std::string(data["l"].GetString())); + element.insert(CCAPI_EM_ORDER_SIDE, std::string(data["S"].GetString()) == "BUY" ? CCAPI_EM_ORDER_SIDE_BUY : CCAPI_EM_ORDER_SIDE_SELL); + element.insert(CCAPI_IS_MAKER, data["m"].GetBool() ? "1" : "0"); + element.insert(CCAPI_EM_ORDER_ID, std::string(data["i"].GetString())); + element.insert(CCAPI_EM_CLIENT_ORDER_ID, std::string(data["c"].GetString())); + element.insert(CCAPI_EM_ORDER_INSTRUMENT, instrument); + { + auto it = data.FindMember("n"); + if (it != data.MemberEnd() && !it->value.IsNull()) { + element.insert(CCAPI_EM_ORDER_FEE_QUANTITY, std::string(it->value.GetString())); + } } + { + auto it = data.FindMember("N"); + if (it != data.MemberEnd() && !it->value.IsNull()) { + element.insert(CCAPI_EM_ORDER_FEE_ASSET, std::string(it->value.GetString())); + } + } + elementList.emplace_back(std::move(element)); + message.setElementList(elementList); + messageList.emplace_back(std::move(message)); } - { - auto it = data.FindMember("N"); - if (it != data.MemberEnd() && !it->value.IsNull()) { - element.insert(CCAPI_EM_ORDER_FEE_ASSET, std::string(it->value.GetString())); + if (fieldSet.find(CCAPI_EM_ORDER_UPDATE) != fieldSet.end()) { + Message message; + message.setTimeReceived(timeReceived); + message.setCorrelationIdList({subscription.getCorrelationId()}); + message.setTime(TimePoint(std::chrono::milliseconds(std::stoll((this->isDerivatives ? document : data)["E"].GetString())))); + message.setType(Message::Type::EXECUTION_MANAGEMENT_EVENTS_ORDER_UPDATE); + const std::map>& extractionFieldNameMap = { + {CCAPI_EM_ORDER_ID, std::make_pair("i", JsonDataType::INTEGER)}, + {CCAPI_EM_CLIENT_ORDER_ID, std::make_pair("c", JsonDataType::STRING)}, + {CCAPI_EM_ORDER_SIDE, std::make_pair("S", JsonDataType::STRING)}, + {CCAPI_EM_ORDER_LIMIT_PRICE, std::make_pair("p", JsonDataType::STRING)}, + {CCAPI_EM_ORDER_QUANTITY, std::make_pair("q", JsonDataType::STRING)}, + {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY, std::make_pair("z", JsonDataType::STRING)}, + {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, std::make_pair("Z", JsonDataType::STRING)}, + {CCAPI_EM_ORDER_STATUS, std::make_pair("X", JsonDataType::STRING)}, + {CCAPI_EM_ORDER_INSTRUMENT, std::make_pair("s", JsonDataType::STRING)}, + }; + Element info; + this->extractOrderInfo(info, data, extractionFieldNameMap); + { + auto it = data.FindMember("C"); + if (it != data.MemberEnd() && !it->value.IsNull() && it->value.GetStringLength()) { + info.insert(CCAPI_EM_ORIGINAL_CLIENT_ORDER_ID, std::string(it->value.GetString())); + } } + { + auto it = data.FindMember("ap"); + if (it != data.MemberEnd() && !it->value.IsNull()) { + info.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, + Decimal(UtilString::printDoubleScientific(std::stod(it->value.GetString()) * std::stod(data["z"].GetString()))).toString()); + } + } + std::vector elementList; + elementList.emplace_back(std::move(info)); + message.setElementList(elementList); + messageList.emplace_back(std::move(message)); + } + } + } else if (this->isDerivatives && type == "ACCOUNT_UPDATE") { + event.setType(Event::Type::SUBSCRIPTION_DATA); + const rj::Value& data = document["a"]; + if (fieldSet.find(CCAPI_EM_BALANCE_UPDATE) != fieldSet.end() && !data["B"].Empty()) { + Message message; + message.setTimeReceived(timeReceived); + message.setCorrelationIdList({subscription.getCorrelationId()}); + message.setTime(TimePoint(std::chrono::milliseconds(std::stoll(document["E"].GetString())))); + message.setType(Message::Type::EXECUTION_MANAGEMENT_EVENTS_BALANCE_UPDATE); + std::vector elementList; + for (const auto& x : data["B"].GetArray()) { + Element element; + element.insert(CCAPI_EM_ASSET, x["a"].GetString()); + element.insert(CCAPI_EM_QUANTITY_TOTAL, x["wb"].GetString()); + elementList.emplace_back(std::move(element)); } - elementList.emplace_back(std::move(element)); message.setElementList(elementList); messageList.emplace_back(std::move(message)); } - if (fieldSet.find(CCAPI_EM_ORDER_UPDATE) != fieldSet.end()) { + if (fieldSet.find(CCAPI_EM_POSITION_UPDATE) != fieldSet.end() && !data["P"].Empty()) { Message message; message.setTimeReceived(timeReceived); message.setCorrelationIdList({subscription.getCorrelationId()}); message.setTime(TimePoint(std::chrono::milliseconds(std::stoll((this->isDerivatives ? document : data)["E"].GetString())))); - message.setType(Message::Type::EXECUTION_MANAGEMENT_EVENTS_ORDER_UPDATE); - const std::map>& extractionFieldNameMap = { - {CCAPI_EM_ORDER_ID, std::make_pair("i", JsonDataType::INTEGER)}, - {CCAPI_EM_CLIENT_ORDER_ID, std::make_pair("c", JsonDataType::STRING)}, - {CCAPI_EM_ORDER_SIDE, std::make_pair("S", JsonDataType::STRING)}, - {CCAPI_EM_ORDER_LIMIT_PRICE, std::make_pair("p", JsonDataType::STRING)}, - {CCAPI_EM_ORDER_QUANTITY, std::make_pair("q", JsonDataType::STRING)}, - {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY, std::make_pair("z", JsonDataType::STRING)}, - {CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, std::make_pair("Z", JsonDataType::STRING)}, - {CCAPI_EM_ORDER_STATUS, std::make_pair("X", JsonDataType::STRING)}, - {CCAPI_EM_ORDER_INSTRUMENT, std::make_pair("s", JsonDataType::STRING)}, - }; - Element info; - this->extractOrderInfo(info, data, extractionFieldNameMap); - { - auto it = data.FindMember("C"); - if (it != data.MemberEnd() && !it->value.IsNull() && it->value.GetStringLength()) { - info.insert(CCAPI_EM_ORIGINAL_CLIENT_ORDER_ID, std::string(it->value.GetString())); - } - } - { - auto it = data.FindMember("ap"); - if (it != data.MemberEnd() && !it->value.IsNull()) { - info.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, - Decimal(UtilString::printDoubleScientific(std::stod(it->value.GetString()) * std::stod(data["z"].GetString()))).toString()); - } - } + message.setType(Message::Type::EXECUTION_MANAGEMENT_EVENTS_POSITION_UPDATE); std::vector elementList; - elementList.emplace_back(std::move(info)); + for (const auto& x : data["P"].GetArray()) { + Element element; + element.insert(CCAPI_INSTRUMENT, x["s"].GetString()); + element.insert(CCAPI_EM_POSITION_SIDE, x["ps"].GetString()); + element.insert(CCAPI_EM_POSITION_QUANTITY, x["pa"].GetString()); + element.insert(CCAPI_EM_POSITION_ENTRY_PRICE, x["ep"].GetString()); + element.insert(CCAPI_EM_UNREALIZED_PNL, x["up"].GetString()); + elementList.emplace_back(std::move(element)); + } message.setElementList(elementList); messageList.emplace_back(std::move(message)); } } - } else if (this->isDerivatives && type == "ACCOUNT_UPDATE") { - event.setType(Event::Type::SUBSCRIPTION_DATA); - const rj::Value& data = document["a"]; - if (fieldSet.find(CCAPI_EM_BALANCE_UPDATE) != fieldSet.end() && !data["B"].Empty()) { - Message message; - message.setTimeReceived(timeReceived); - message.setCorrelationIdList({subscription.getCorrelationId()}); - message.setTime(TimePoint(std::chrono::milliseconds(std::stoll(document["E"].GetString())))); - message.setType(Message::Type::EXECUTION_MANAGEMENT_EVENTS_BALANCE_UPDATE); - std::vector elementList; - for (const auto& x : data["B"].GetArray()) { - Element element; - element.insert(CCAPI_EM_ASSET, x["a"].GetString()); - element.insert(CCAPI_EM_QUANTITY_TOTAL, x["wb"].GetString()); - elementList.emplace_back(std::move(element)); + } + + event.setMessageList(messageList); + return event; + } + + void convertRequestForWebsocket(rj::Document& document, rj::Document::AllocatorType& allocator, const WsConnection& wsConnection, const Request& request, + unsigned long wsRequestId, const TimePoint& now, const std::string& symbolId, + const std::map& credential) override { + document.SetObject(); + this->requestCorrelationIdByWsRequestIdByConnectionIdMap[wsConnection.id][wsRequestId] = request.getCorrelationId(); + Request::Operation operation = request.getOperation(); + switch (operation) { + case Request::Operation::CREATE_ORDER: { + document.AddMember("id", rj::Value((this->websocketOrderEntryCreateOrderJsonIdPrefix + std::to_string(wsRequestId)).c_str(), allocator).Move(), + allocator); + document.AddMember("method", rj::Value("order.place").Move(), allocator); + const std::map param = request.getFirstParamWithDefault(); + rj::Value params(rj::kObjectType); + this->appendParam(params, allocator, param); + if (!symbolId.empty()) { + ExecutionManagementService::appendSymbolId(params, allocator, symbolId, "symbol"); } - message.setElementList(elementList); - messageList.emplace_back(std::move(message)); + if (param.find("type") == param.end()) { + params.AddMember("type", "LIMIT", allocator); + if (param.find("timeInForce") == param.end()) { + params.AddMember("timeInForce", "GTC", allocator); + } + } + if (param.find("newClientOrderId") == param.end() && param.find(CCAPI_EM_CLIENT_ORDER_ID) == param.end()) { + std::string nonce = std::to_string(this->generateNonce(now, request.getIndex())); + params.AddMember( + "newClientOrderId", + rj::Value((std::string("x-") + (this->isDerivatives ? CCAPI_BINANCE_USDS_FUTURES_API_LINK_ID : CCAPI_BINANCE_API_LINK_ID) + "-" + nonce).c_str(), + allocator) + .Move(), + allocator); + } + if (param.find("timestamp") == param.end()) { + params.AddMember("timestamp", rj::Value(std::chrono::duration_cast(now.time_since_epoch()).count()).Move(), allocator); + } + document.AddMember("params", params, allocator); + } break; + case Request::Operation::CANCEL_ORDER: { + document.AddMember("id", rj::Value((this->websocketOrderEntryCancelOrderJsonIdPrefix + std::to_string(wsRequestId)).c_str(), allocator).Move(), + allocator); + document.AddMember("method", rj::Value("order.cancel").Move(), allocator); + const std::map param = request.getFirstParamWithDefault(); + rj::Value params(rj::kObjectType); + this->appendParam(params, allocator, param, + { + {CCAPI_EM_ORDER_ID, "orderId"}, + {CCAPI_EM_CLIENT_ORDER_ID, "origClientOrderId"}, + }); + if (!symbolId.empty()) { + ExecutionManagementService::appendSymbolId(params, allocator, symbolId, "symbol"); + } + if (param.find("timestamp") == param.end()) { + params.AddMember("timestamp", rj::Value(std::chrono::duration_cast(now.time_since_epoch()).count()).Move(), allocator); + } + document.AddMember("params", params, allocator); + } break; + default: + this->convertRequestForWebsocketCustom(document, allocator, wsConnection, request, wsRequestId, now, symbolId, credential); + } + } + + void appendParam(rj::Value& rjValue, rj::Document::AllocatorType& allocator, const std::map& param, + const std::map standardizationMap = { + {CCAPI_EM_ORDER_SIDE, "side"}, + {CCAPI_EM_ORDER_QUANTITY, "quantity"}, + {CCAPI_EM_ORDER_LIMIT_PRICE, "price"}, + {CCAPI_EM_CLIENT_ORDER_ID, "newClientOrderId"}, + {CCAPI_EM_ORDER_ID, "orderId"}, + }) { + for (const auto& kv : param) { + auto key = standardizationMap.find(kv.first) != standardizationMap.end() ? standardizationMap.at(kv.first) : kv.first; + auto value = kv.second; + if (key == "side") { + value = value == CCAPI_EM_ORDER_SIDE_BUY ? "BUY" : "SELL"; } - if (fieldSet.find(CCAPI_EM_POSITION_UPDATE) != fieldSet.end() && !data["P"].Empty()) { - Message message; - message.setTimeReceived(timeReceived); - message.setCorrelationIdList({subscription.getCorrelationId()}); - message.setTime(TimePoint(std::chrono::milliseconds(std::stoll((this->isDerivatives ? document : data)["E"].GetString())))); - message.setType(Message::Type::EXECUTION_MANAGEMENT_EVENTS_POSITION_UPDATE); - std::vector elementList; - for (const auto& x : data["P"].GetArray()) { - Element element; - element.insert(CCAPI_INSTRUMENT, x["s"].GetString()); - element.insert(CCAPI_EM_POSITION_SIDE, x["ps"].GetString()); - element.insert(CCAPI_EM_POSITION_QUANTITY, x["pa"].GetString()); - element.insert(CCAPI_EM_POSITION_ENTRY_PRICE, x["ep"].GetString()); - element.insert(CCAPI_EM_UNREALIZED_PNL, x["up"].GetString()); - elementList.emplace_back(std::move(element)); + if (value != "null") { + rjValue.AddMember(rj::Value(key.c_str(), allocator).Move(), rj::Value(value.c_str(), allocator).Move(), allocator); + } + } + } + + virtual void extractOrderInfoFromResponse(std::vector& elementList, const rj::Document& document) { + std::map> extractionFieldNameMap = { + {CCAPI_EM_ORDER_ID, std::make_pair("orderId", JsonDataType::INTEGER)}, + {CCAPI_EM_ORDER_SIDE, std::make_pair("side", JsonDataType::STRING)}, + {CCAPI_EM_ORDER_QUANTITY, std::make_pair("origQty", JsonDataType::STRING)}, + {CCAPI_EM_ORDER_LIMIT_PRICE, std::make_pair("price", JsonDataType::STRING)}, + {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY, std::make_pair("executedQty", JsonDataType::STRING)}, + {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, std::make_pair(this->isDerivatives ? "cumQuote" : "cummulativeQuoteQty", JsonDataType::STRING)}, + {CCAPI_EM_ORDER_STATUS, std::make_pair("status", JsonDataType::STRING)}, + {CCAPI_EM_ORDER_INSTRUMENT, std::make_pair("symbol", JsonDataType::STRING)}, + {CCAPI_LAST_UPDATED_TIME_SECONDS, std::make_pair(this->isDerivatives ? "updateTime" : "transactTime", JsonDataType::STRING)}, + {CCAPI_EM_CLIENT_ORDER_ID, std::make_pair("clientOrderId", JsonDataType::STRING)}, + }; + + Element element; + this->extractOrderInfo(element, document["result"], extractionFieldNameMap, + { + {CCAPI_LAST_UPDATED_TIME_SECONDS, [](const std::string& input) { return UtilTime::convertMillisecondsStrToSecondsStr(input); }}, + }); + elementList.emplace_back(std::move(element)); + } + + std::vector createSendStringListFromSubscription(const WsConnection& wsConnection, const Subscription& subscription, const TimePoint& now, + const std::map& credential) override { + if (wsConnection.host == this->websocketOrderEntryHost) { + auto it = credential.find(this->websocketOrderEntryApiPrivateKeyPathName); + if (it == credential.end()) { + throw std::runtime_error("Missing credential: " + this->websocketOrderEntryApiPrivateKeyPathName); + } + rj::Document document; + document.SetObject(); + rj::Document::AllocatorType& allocator = document.GetAllocator(); + + document.AddMember("id", rj::Value(this->websocketOrderEntrySessionLogonJsonId.c_str(), allocator).Move(), allocator); + document.AddMember("method", "session.logon", allocator); + + const auto& apiKey = credential.at(this->websocketOrderEntryApiKeyName); + const auto& timestamp = std::chrono::duration_cast(now.time_since_epoch()).count(); + + std::map paramsMap{ + {"apiKey", apiKey}, + {"timestamp", std::to_string(timestamp)}, + }; + + rj::Value params(rj::kObjectType); + std::string payload; + int i = 0; + for (const auto& [key, value] : paramsMap) { + if (key == "timestamp") { + params.AddMember("timestamp", rj::Value().SetInt64(std::stoll(value)), allocator); + } else { + params.AddMember("apiKey", rj::Value(value.c_str(), allocator).Move(), allocator); } - message.setElementList(elementList); - messageList.emplace_back(std::move(message)); + payload += key; + payload += "="; + payload += value; + + if (i < paramsMap.size() - 1) { + payload += "&"; + } + ++i; + } + + std::string password; + if (auto it = credential.find(this->websocketOrderEntryApiPrivateKeyPasswordName); it != credential.end()) { + password = it->second; } + EVP_PKEY* pkey = UtilAlgorithm::loadPrivateKey(UtilAlgorithm::readFile(it->second), password); + std::string signature = UtilAlgorithm::signPayload(pkey, payload); + params.AddMember("signature", rj::Value(signature.c_str(), allocator).Move(), allocator); + + document.AddMember("params", params, allocator); + + rj::StringBuffer buffer; + rj::Writer writer(buffer); + document.Accept(writer); + + return {buffer.GetString()}; + + } else { + return {}; } - event.setMessageList(messageList); - return event; } bool isDerivatives{}; @@ -578,7 +808,16 @@ class ExecutionManagementServiceBinanceBase : public ExecutionManagementService std::string getAccountBalancesIsolatedMarginTarget; std::string listenKeyCrossMarginTarget; std::string listenKeyIsolatedMarginTarget; + + std::string websocketOrderEntryApiKeyName; + std::string websocketOrderEntryApiPrivateKeyPathName; + std::string websocketOrderEntryApiPrivateKeyPasswordName; + std::string websocketOrderEntrySessionLogonJsonId{"session_logon"}; + std::string websocketOrderEntryCreateOrderJsonIdPrefix{"order_place"}; + std::string websocketOrderEntryCancelOrderJsonIdPrefix{"order_cancel"}; + std::string websocketOrderEntryHost; }; + } /* namespace ccapi */ #endif #endif diff --git a/include/ccapi_cpp/service/ccapi_execution_management_service_binance_coin_futures.h b/include/ccapi_cpp/service/ccapi_execution_management_service_binance_coin_futures.h index b4f76970..d5d9f998 100644 --- a/include/ccapi_cpp/service/ccapi_execution_management_service_binance_coin_futures.h +++ b/include/ccapi_cpp/service/ccapi_execution_management_service_binance_coin_futures.h @@ -12,12 +12,19 @@ class ExecutionManagementServiceBinanceCoinFutures : public ExecutionManagementS : ExecutionManagementServiceBinanceDerivativesBase(eventHandler, sessionOptions, sessionConfigs, serviceContextPtr) { this->exchangeName = CCAPI_EXCHANGE_NAME_BINANCE_COIN_FUTURES; this->baseUrlWs = sessionConfigs.getUrlWebsocketBase().at(this->exchangeName) + "/ws"; + this->baseUrlWsOrderEntry = sessionConfigs.getUrlWebsocketOrderEntryBase().at(this->exchangeName) + CCAPI_BINANCE_COIN_FUTURES_WS_ORDER_ENTRY_PATH; this->baseUrlRest = sessionConfigs.getUrlRestBase().at(this->exchangeName); this->setHostRestFromUrlRest(this->baseUrlRest); this->setHostWsFromUrlWs(this->baseUrlWs); + this->setHostWsFromUrlWsOrderEntry(this->baseUrlWsOrderEntry); this->apiKeyName = CCAPI_BINANCE_COIN_FUTURES_API_KEY; this->apiSecretName = CCAPI_BINANCE_COIN_FUTURES_API_SECRET; - this->setupCredential({this->apiKeyName, this->apiSecretName}); + this->websocketOrderEntryApiKeyName = CCAPI_BINANCE_COIN_FUTURES_WEBSOCKET_ORDER_ENTRY_API_KEY; + this->websocketOrderEntryApiPrivateKeyPathName = CCAPI_BINANCE_COIN_FUTURES_WEBSOCKET_ORDER_ENTRY_API_PRIVATE_KEY_PATH; + this->websocketOrderEntryApiPrivateKeyPasswordName = CCAPI_BINANCE_COIN_FUTURES_WEBSOCKET_ORDER_ENTRY_API_PRIVATE_KEY_PASSWORD; + this->setupCredential({this->apiKeyName, this->apiSecretName, this->websocketOrderEntryApiKeyName, this->websocketOrderEntryApiPrivateKeyPathName, + this->websocketOrderEntryApiPrivateKeyPasswordName}); + this->websocketOrderEntryHost = CCAPI_BINANCE_COIN_FUTURES_HOST_WS_ORDER_ENTRY; this->createOrderTarget = CCAPI_BINANCE_COIN_FUTURES_CREATE_ORDER_PATH; this->cancelOrderTarget = "/dapi/v1/order"; this->getOrderTarget = "/dapi/v1/order"; diff --git a/include/ccapi_cpp/service/ccapi_execution_management_service_binance_usds_futures.h b/include/ccapi_cpp/service/ccapi_execution_management_service_binance_usds_futures.h index a97c6d2a..d9498609 100644 --- a/include/ccapi_cpp/service/ccapi_execution_management_service_binance_usds_futures.h +++ b/include/ccapi_cpp/service/ccapi_execution_management_service_binance_usds_futures.h @@ -12,12 +12,19 @@ class ExecutionManagementServiceBinanceUsdsFutures : public ExecutionManagementS : ExecutionManagementServiceBinanceDerivativesBase(eventHandler, sessionOptions, sessionConfigs, serviceContextPtr) { this->exchangeName = CCAPI_EXCHANGE_NAME_BINANCE_USDS_FUTURES; this->baseUrlWs = sessionConfigs.getUrlWebsocketBase().at(this->exchangeName) + "/ws"; + this->baseUrlWsOrderEntry = sessionConfigs.getUrlWebsocketOrderEntryBase().at(this->exchangeName) + CCAPI_BINANCE_USDS_FUTURES_WS_ORDER_ENTRY_PATH; this->baseUrlRest = sessionConfigs.getUrlRestBase().at(this->exchangeName); this->setHostRestFromUrlRest(this->baseUrlRest); this->setHostWsFromUrlWs(this->baseUrlWs); + this->setHostWsFromUrlWsOrderEntry(this->baseUrlWsOrderEntry); this->apiKeyName = CCAPI_BINANCE_USDS_FUTURES_API_KEY; this->apiSecretName = CCAPI_BINANCE_USDS_FUTURES_API_SECRET; - this->setupCredential({this->apiKeyName, this->apiSecretName}); + this->websocketOrderEntryApiKeyName = CCAPI_BINANCE_USDS_FUTURES_WEBSOCKET_ORDER_ENTRY_API_KEY; + this->websocketOrderEntryApiPrivateKeyPathName = CCAPI_BINANCE_USDS_FUTURES_WEBSOCKET_ORDER_ENTRY_API_PRIVATE_KEY_PATH; + this->websocketOrderEntryApiPrivateKeyPasswordName = CCAPI_BINANCE_USDS_FUTURES_WEBSOCKET_ORDER_ENTRY_API_PRIVATE_KEY_PASSWORD; + this->setupCredential({this->apiKeyName, this->apiSecretName, this->websocketOrderEntryApiKeyName, this->websocketOrderEntryApiPrivateKeyPathName, + this->websocketOrderEntryApiPrivateKeyPasswordName}); + this->websocketOrderEntryHost = CCAPI_BINANCE_USDS_FUTURES_HOST_WS_ORDER_ENTRY; this->createOrderTarget = CCAPI_BINANCE_USDS_FUTURES_CREATE_ORDER_PATH; this->cancelOrderTarget = "/fapi/v1/order"; this->getOrderTarget = "/fapi/v1/order"; diff --git a/include/ccapi_cpp/service/ccapi_execution_management_service_bitfinex.h b/include/ccapi_cpp/service/ccapi_execution_management_service_bitfinex.h index 3d1e2da5..437026a8 100644 --- a/include/ccapi_cpp/service/ccapi_execution_management_service_bitfinex.h +++ b/include/ccapi_cpp/service/ccapi_execution_management_service_bitfinex.h @@ -315,7 +315,7 @@ class ExecutionManagementServiceBitfinex : public ExecutionManagementService { element.insert(CCAPI_EM_ORDER_REMAINING_QUANTITY, x[6].GetString()); element.insert(CCAPI_EM_ORDER_STATUS, x[13].GetString()); element.insert(CCAPI_EM_ORDER_LIMIT_PRICE, x[16].GetString()); - element.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, + element.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, Decimal(UtilString::printDoubleScientific(std::stod(x[17].GetString()) * (std::stod(originalAmount) - std::stod(amount)))).toString()); } diff --git a/include/ccapi_cpp/service/ccapi_execution_management_service_bitget.h b/include/ccapi_cpp/service/ccapi_execution_management_service_bitget.h index 07779ed4..07d4a563 100644 --- a/include/ccapi_cpp/service/ccapi_execution_management_service_bitget.h +++ b/include/ccapi_cpp/service/ccapi_execution_management_service_bitget.h @@ -182,7 +182,7 @@ class ExecutionManagementServiceBitget : public ExecutionManagementServiceBitget {CCAPI_EM_ORDER_QUANTITY, std::make_pair("size", JsonDataType::STRING)}, {CCAPI_EM_ORDER_LIMIT_PRICE, std::make_pair("price", JsonDataType::STRING)}, {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY, std::make_pair("baseVolume", JsonDataType::STRING)}, - {CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, std::make_pair("quoteVolume", JsonDataType::STRING)}, + {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, std::make_pair("quoteVolume", JsonDataType::STRING)}, {CCAPI_EM_ORDER_STATUS, std::make_pair("status", JsonDataType::STRING)}, {CCAPI_EM_ORDER_INSTRUMENT, std::make_pair("symbol", JsonDataType::STRING)}}; const rj::Value& data = document["data"]; @@ -229,7 +229,7 @@ class ExecutionManagementServiceBitget : public ExecutionManagementServiceBitget auto it1Str = std::string(it1->value.GetString()); auto it2Str = std::string(it2->value.GetString()); if (!it1Str.empty() && !it2Str.empty()) { - element.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, + element.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, Decimal(UtilString::printDoubleScientific(std::stod(it1Str) * std::stod(it2Str))).toString()); } } diff --git a/include/ccapi_cpp/service/ccapi_execution_management_service_bitget_futures.h b/include/ccapi_cpp/service/ccapi_execution_management_service_bitget_futures.h index a495b132..2023178f 100644 --- a/include/ccapi_cpp/service/ccapi_execution_management_service_bitget_futures.h +++ b/include/ccapi_cpp/service/ccapi_execution_management_service_bitget_futures.h @@ -283,7 +283,7 @@ class ExecutionManagementServiceBitgetFutures : public ExecutionManagementServic auto it1Str = std::string(it1->value.GetString()); auto it2Str = std::string(it2->value.GetString()); if (!it1Str.empty() && !it2Str.empty()) { - element.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, + element.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, Decimal(UtilString::printDoubleScientific(std::stod(it1Str) * std::stod(it2Str))).toString()); } } diff --git a/include/ccapi_cpp/service/ccapi_execution_management_service_bitmart.h b/include/ccapi_cpp/service/ccapi_execution_management_service_bitmart.h index 98bfe204..797f886a 100644 --- a/include/ccapi_cpp/service/ccapi_execution_management_service_bitmart.h +++ b/include/ccapi_cpp/service/ccapi_execution_management_service_bitmart.h @@ -234,7 +234,7 @@ class ExecutionManagementServiceBitmart : public ExecutionManagementService { {CCAPI_EM_ORDER_QUANTITY, std::make_pair("size", JsonDataType::STRING)}, {CCAPI_EM_ORDER_LIMIT_PRICE, std::make_pair("price", JsonDataType::STRING)}, {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY, std::make_pair("filled_size", JsonDataType::STRING)}, - {CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, std::make_pair("filled_notional", JsonDataType::STRING)}, + {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, std::make_pair("filled_notional", JsonDataType::STRING)}, {CCAPI_EM_ORDER_STATUS, std::make_pair("state", JsonDataType::STRING)}, {CCAPI_EM_ORDER_INSTRUMENT, std::make_pair("symbol", JsonDataType::STRING)}}; const rj::Value& data = document["data"]; @@ -430,7 +430,7 @@ class ExecutionManagementServiceBitmart : public ExecutionManagementService { {CCAPI_EM_ORDER_LIMIT_PRICE, std::make_pair("price", JsonDataType::STRING)}, {CCAPI_EM_ORDER_QUANTITY, std::make_pair("size", JsonDataType::STRING)}, {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY, std::make_pair("filled_size", JsonDataType::STRING)}, - {CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, std::make_pair("filled_notional", JsonDataType::STRING)}, + {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, std::make_pair("filled_notional", JsonDataType::STRING)}, {CCAPI_EM_ORDER_STATUS, std::make_pair("state", JsonDataType::STRING)}, }; Element info; diff --git a/include/ccapi_cpp/service/ccapi_execution_management_service_bitmex.h b/include/ccapi_cpp/service/ccapi_execution_management_service_bitmex.h index 8d74e788..3cbe7bc3 100644 --- a/include/ccapi_cpp/service/ccapi_execution_management_service_bitmex.h +++ b/include/ccapi_cpp/service/ccapi_execution_management_service_bitmex.h @@ -278,7 +278,7 @@ class ExecutionManagementServiceBitmex : public ExecutionManagementService { auto it2 = x.FindMember("avgPx"); if (it1 != x.MemberEnd() && it2 != x.MemberEnd()) { element.insert( - CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, + CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, Decimal(UtilString::printDoubleScientific(std::stod(it1->value.GetString()) * (it2->value.IsNull() ? 0 : std::stod(it2->value.GetString())))) .toString()); } @@ -447,7 +447,7 @@ class ExecutionManagementServiceBitmex : public ExecutionManagementService { this->extractOrderInfo(info, x, extractionFieldNameMap); auto it = x.FindMember("avgPx"); if (it != x.MemberEnd() && !it->value.IsNull()) { - info.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, + info.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, Decimal(UtilString::printDoubleScientific(std::stod(it->value.GetString()) * std::stod(x["cumQty"].GetString()))).toString()); } std::vector elementList; diff --git a/include/ccapi_cpp/service/ccapi_execution_management_service_bybit.h b/include/ccapi_cpp/service/ccapi_execution_management_service_bybit.h index 6f28275e..e5ee2a4e 100644 --- a/include/ccapi_cpp/service/ccapi_execution_management_service_bybit.h +++ b/include/ccapi_cpp/service/ccapi_execution_management_service_bybit.h @@ -309,7 +309,7 @@ class ExecutionManagementServiceBybit : public ExecutionManagementService { {CCAPI_EM_ORDER_QUANTITY, std::make_pair("qty", JsonDataType::STRING)}, {CCAPI_EM_ORDER_LIMIT_PRICE, std::make_pair("price", JsonDataType::STRING)}, {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY, std::make_pair("cumExecQty", JsonDataType::STRING)}, - {CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, std::make_pair("cumExecValue", JsonDataType::STRING)}, + {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, std::make_pair("cumExecValue", JsonDataType::STRING)}, {CCAPI_EM_ORDER_STATUS, std::make_pair("orderStatus", JsonDataType::STRING)}, {CCAPI_EM_ORDER_INSTRUMENT, std::make_pair("symbol", JsonDataType::STRING)}, }; @@ -438,7 +438,7 @@ class ExecutionManagementServiceBybit : public ExecutionManagementService { {CCAPI_EM_ORDER_LIMIT_PRICE, std::make_pair("price", JsonDataType::STRING)}, {CCAPI_EM_ORDER_QUANTITY, std::make_pair("qty", JsonDataType::STRING)}, {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY, std::make_pair("cumExecQty", JsonDataType::STRING)}, - {CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, std::make_pair("cumExecValue", JsonDataType::STRING)}, + {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, std::make_pair("cumExecValue", JsonDataType::STRING)}, {CCAPI_EM_ORDER_STATUS, std::make_pair("orderStatus", JsonDataType::STRING)}, {CCAPI_EM_ORDER_INSTRUMENT, std::make_pair("symbol", JsonDataType::STRING)}, }; diff --git a/include/ccapi_cpp/service/ccapi_execution_management_service_coinbase.h b/include/ccapi_cpp/service/ccapi_execution_management_service_coinbase.h index 43433648..c5343370 100644 --- a/include/ccapi_cpp/service/ccapi_execution_management_service_coinbase.h +++ b/include/ccapi_cpp/service/ccapi_execution_management_service_coinbase.h @@ -186,7 +186,7 @@ class ExecutionManagementServiceCoinbase : public ExecutionManagementService { {CCAPI_EM_ORDER_QUANTITY, std::make_pair("size", JsonDataType::STRING)}, {CCAPI_EM_ORDER_LIMIT_PRICE, std::make_pair("price", JsonDataType::STRING)}, {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY, std::make_pair("filled_size", JsonDataType::STRING)}, - {CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, std::make_pair("executed_value", JsonDataType::STRING)}, + {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, std::make_pair("executed_value", JsonDataType::STRING)}, {CCAPI_EM_ORDER_STATUS, std::make_pair("status", JsonDataType::STRING)}, {CCAPI_EM_ORDER_INSTRUMENT, std::make_pair("product_id", JsonDataType::STRING)}}; if (operation == Request::Operation::CANCEL_ORDER) { diff --git a/include/ccapi_cpp/service/ccapi_execution_management_service_cryptocom.h b/include/ccapi_cpp/service/ccapi_execution_management_service_cryptocom.h index c5511390..d5a24349 100644 --- a/include/ccapi_cpp/service/ccapi_execution_management_service_cryptocom.h +++ b/include/ccapi_cpp/service/ccapi_execution_management_service_cryptocom.h @@ -160,7 +160,8 @@ class ExecutionManagementServiceCryptocom : public ExecutionManagementService { ExecutionManagementService::convertRequestForRestGenericPrivateRequest(req, request, now, symbolId, credential); } break; case Request::Operation::CREATE_ORDER: { - const std::map param = request.getFirstParamWithDefault(); + std::map param = request.getFirstParamWithDefault(); + param.emplace("broker_id", CCAPI_CRYPTOCOM_BROKER_CODE); this->prepareReq(req, param, now, symbolId, credential, this->createOrderMethod, { {CCAPI_EM_CLIENT_ORDER_ID, "client_oid"}, @@ -208,7 +209,8 @@ class ExecutionManagementServiceCryptocom : public ExecutionManagementService { const std::map& credential) override { switch (request.getOperation()) { case Request::Operation::CREATE_ORDER: { - const std::map param = request.getFirstParamWithDefault(); + std::map param = request.getFirstParamWithDefault(); + param.emplace("broker_id", CCAPI_CRYPTOCOM_BROKER_CODE); document.SetObject(); rj::Document::AllocatorType& allocator = document.GetAllocator(); std::map paramCopy; @@ -270,7 +272,7 @@ class ExecutionManagementServiceCryptocom : public ExecutionManagementService { {CCAPI_EM_ORDER_QUANTITY, std::make_pair("quantity", JsonDataType::STRING)}, {CCAPI_EM_ORDER_LIMIT_PRICE, std::make_pair("price", JsonDataType::STRING)}, {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY, std::make_pair("cumulative_quantity", JsonDataType::STRING)}, - {CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, std::make_pair("cumulative_value", JsonDataType::STRING)}, + {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, std::make_pair("cumulative_value", JsonDataType::STRING)}, {CCAPI_EM_ORDER_STATUS, std::make_pair("status", JsonDataType::STRING)}, {CCAPI_EM_ORDER_INSTRUMENT, std::make_pair("instrument_name", JsonDataType::STRING)}, }; @@ -421,7 +423,7 @@ class ExecutionManagementServiceCryptocom : public ExecutionManagementService { {CCAPI_EM_ORDER_QUANTITY, std::make_pair("quantity", JsonDataType::STRING)}, {CCAPI_EM_ORDER_LIMIT_PRICE, std::make_pair("price", JsonDataType::STRING)}, {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY, std::make_pair("cumulative_quantity", JsonDataType::STRING)}, - {CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, std::make_pair("cumulative_value", JsonDataType::STRING)}, + {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, std::make_pair("cumulative_value", JsonDataType::STRING)}, {CCAPI_EM_ORDER_STATUS, std::make_pair("status", JsonDataType::STRING)}, {CCAPI_EM_ORDER_INSTRUMENT, std::make_pair("instrument_name", JsonDataType::STRING)}, }; diff --git a/include/ccapi_cpp/service/ccapi_execution_management_service_deribit.h b/include/ccapi_cpp/service/ccapi_execution_management_service_deribit.h index baa066a9..d62fa151 100644 --- a/include/ccapi_cpp/service/ccapi_execution_management_service_deribit.h +++ b/include/ccapi_cpp/service/ccapi_execution_management_service_deribit.h @@ -293,7 +293,7 @@ class ExecutionManagementServiceDeribit : public ExecutionManagementService { auto it2 = x.FindMember("average_price"); if (it1 != x.MemberEnd() && it2 != x.MemberEnd()) { element.insert( - CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, + CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, Decimal(UtilString::printDoubleScientific(std::stod(it1->value.GetString()) * (it2->value.IsNull() ? 0 : std::stod(it2->value.GetString())))) .toString()); } @@ -488,7 +488,7 @@ class ExecutionManagementServiceDeribit : public ExecutionManagementService { auto it1 = x.FindMember("filled_amount"); auto it2 = x.FindMember("average_price"); if (it1 != x.MemberEnd() && it2 != x.MemberEnd()) { - info.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, + info.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, Decimal(UtilString::printDoubleScientific(std::stod(it1->value.GetString()) * (it2->value.IsNull() ? 0 : std::stod(it2->value.GetString())))) .toString()); diff --git a/include/ccapi_cpp/service/ccapi_execution_management_service_erisx.h b/include/ccapi_cpp/service/ccapi_execution_management_service_erisx.h index 675ac230..62b3a3e2 100644 --- a/include/ccapi_cpp/service/ccapi_execution_management_service_erisx.h +++ b/include/ccapi_cpp/service/ccapi_execution_management_service_erisx.h @@ -226,7 +226,7 @@ class ExecutionManagementServiceErisx : public ExecutionManagementService { auto it1 = x.FindMember("cumQty"); auto it2 = x.FindMember("avgPrice"); if (it1 != x.MemberEnd() && it2 != x.MemberEnd()) { - element.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, + element.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, Decimal(UtilString::printDoubleScientific(std::stod(it1->value.GetString()) * std::stod(it2->value.GetString()))).toString()); } } diff --git a/include/ccapi_cpp/service/ccapi_execution_management_service_ftx_base.h b/include/ccapi_cpp/service/ccapi_execution_management_service_ftx_base.h index f4888053..161125a4 100644 --- a/include/ccapi_cpp/service/ccapi_execution_management_service_ftx_base.h +++ b/include/ccapi_cpp/service/ccapi_execution_management_service_ftx_base.h @@ -275,7 +275,7 @@ class ExecutionManagementServiceFtxBase : public ExecutionManagementService { auto it1 = x.FindMember("filledSize"); auto it2 = x.FindMember("avgFillPrice"); if (it1 != x.MemberEnd() && !it1->value.IsNull() && it2 != x.MemberEnd() && !it2->value.IsNull()) { - element.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, + element.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, Decimal(UtilString::printDoubleScientific(std::stod(it1->value.GetString()) * std::stod(it2->value.GetString()))).toString()); } } @@ -403,7 +403,7 @@ class ExecutionManagementServiceFtxBase : public ExecutionManagementService { auto it1 = data.FindMember("filledSize"); auto it2 = data.FindMember("avgFillPrice"); if (it1 != data.MemberEnd() && !it1->value.IsNull() && it2 != data.MemberEnd() && !it2->value.IsNull()) { - info.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, + info.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, Decimal(UtilString::printDoubleScientific(std::stod(it1->value.GetString()) * std::stod(it2->value.GetString()))).toString()); } } diff --git a/include/ccapi_cpp/service/ccapi_execution_management_service_gemini.h b/include/ccapi_cpp/service/ccapi_execution_management_service_gemini.h index 3154fdc9..9b440137 100644 --- a/include/ccapi_cpp/service/ccapi_execution_management_service_gemini.h +++ b/include/ccapi_cpp/service/ccapi_execution_management_service_gemini.h @@ -253,7 +253,7 @@ class ExecutionManagementServiceGemini : public ExecutionManagementService { auto it1 = x.FindMember("executed_amount"); auto it2 = x.FindMember("avg_execution_price"); if (it1 != x.MemberEnd() && it2 != x.MemberEnd()) { - element.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, + element.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, Decimal(UtilString::printDoubleScientific(std::stod(it1->value.GetString()) * std::stod(it2->value.GetString()))).toString()); } } @@ -385,7 +385,7 @@ class ExecutionManagementServiceGemini : public ExecutionManagementService { auto it1 = x.FindMember("executed_amount"); auto it2 = x.FindMember("avg_execution_price"); if (it1 != x.MemberEnd() && it2 != x.MemberEnd()) { - info.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, + info.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, Decimal(UtilString::printDoubleScientific(std::stod(it1->value.GetString()) * std::stod(it2->value.GetString()))).toString()); } } diff --git a/include/ccapi_cpp/service/ccapi_execution_management_service_huobi.h b/include/ccapi_cpp/service/ccapi_execution_management_service_huobi.h index d2c337e3..4eea83c7 100644 --- a/include/ccapi_cpp/service/ccapi_execution_management_service_huobi.h +++ b/include/ccapi_cpp/service/ccapi_execution_management_service_huobi.h @@ -174,7 +174,7 @@ class ExecutionManagementServiceHuobi : public ExecutionManagementServiceHuobiBa {CCAPI_EM_ORDER_QUANTITY, std::make_pair("amount", JsonDataType::STRING)}, {CCAPI_EM_ORDER_LIMIT_PRICE, std::make_pair("price", JsonDataType::STRING)}, {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY, std::make_pair("filled-amount", JsonDataType::STRING)}, - {CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, std::make_pair("filled-cash-amount", JsonDataType::STRING)}, + {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, std::make_pair("filled-cash-amount", JsonDataType::STRING)}, {CCAPI_EM_ORDER_STATUS, std::make_pair("state", JsonDataType::STRING)}, {CCAPI_EM_ORDER_INSTRUMENT, std::make_pair("symbol", JsonDataType::STRING)}}; const rj::Value& data = document["data"]; @@ -187,7 +187,7 @@ class ExecutionManagementServiceHuobi : public ExecutionManagementServiceHuobiBa this->extractOrderInfo(element, data, extractionFieldNameMap); if (operation == Request::Operation::GET_ORDER) { element.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY, std::string(data["field-amount"].GetString())); - element.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, std::string(data["field-cash-amount"].GetString())); + element.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, std::string(data["field-cash-amount"].GetString())); } elementList.emplace_back(std::move(element)); } else { diff --git a/include/ccapi_cpp/service/ccapi_execution_management_service_huobi_derivatives_base.h b/include/ccapi_cpp/service/ccapi_execution_management_service_huobi_derivatives_base.h index 57a4580c..a5058a19 100644 --- a/include/ccapi_cpp/service/ccapi_execution_management_service_huobi_derivatives_base.h +++ b/include/ccapi_cpp/service/ccapi_execution_management_service_huobi_derivatives_base.h @@ -216,7 +216,7 @@ class ExecutionManagementServiceHuobiDerivativesBase : public ExecutionManagemen auto it2 = x.FindMember("trade_avg_price"); if (it1 != x.MemberEnd() && it2 != x.MemberEnd()) { element.insert( - CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, + CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, Decimal(UtilString::printDoubleScientific(std::stod(it1->value.GetString()) * (it2->value.IsNull() ? 0 : std::stod(it2->value.GetString())))) .toString()); } @@ -355,7 +355,7 @@ class ExecutionManagementServiceHuobiDerivativesBase : public ExecutionManagemen auto it1 = document.FindMember("trade_volume"); auto it2 = document.FindMember("trade_avg_price"); if (it1 != document.MemberEnd() && it2 != document.MemberEnd()) { - info.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, + info.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, Decimal(UtilString::printDoubleScientific(std::stod(it1->value.GetString()) * std::stod(it2->value.GetString()))).toString()); } } diff --git a/include/ccapi_cpp/service/ccapi_execution_management_service_kraken.h b/include/ccapi_cpp/service/ccapi_execution_management_service_kraken.h index 0a6d5bde..0c370444 100644 --- a/include/ccapi_cpp/service/ccapi_execution_management_service_kraken.h +++ b/include/ccapi_cpp/service/ccapi_execution_management_service_kraken.h @@ -220,7 +220,7 @@ class ExecutionManagementServiceKraken : public ExecutionManagementService { auto it1 = itr->value.FindMember("vol_exec"); auto it2 = itr->value.FindMember("price"); if (it1 != itr->value.MemberEnd() && it2 != itr->value.MemberEnd()) { - element.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, + element.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, Decimal(UtilString::printDoubleScientific(std::stod(it1->value.GetString()) * std::stod(it2->value.GetString()))).toString()); } element.insert(CCAPI_EM_ORDER_ID, itr->name.GetString()); @@ -422,7 +422,7 @@ class ExecutionManagementServiceKraken : public ExecutionManagementService { auto it2 = itr->value.FindMember("avg_price"); if (it1 != itr->value.MemberEnd() && it2 != itr->value.MemberEnd()) { element.insert( - CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, + CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, Decimal(UtilString::printDoubleScientific(std::stod(it1->value.GetString()) * std::stod(it2->value.GetString()))).toString()); } element.insert(CCAPI_EM_ORDER_ID, itr->name.GetString()); @@ -434,7 +434,7 @@ class ExecutionManagementServiceKraken : public ExecutionManagementService { auto it1 = itr->value.FindMember("vol_exec"); auto it2 = itr->value.FindMember("avg_price"); if (it1 != itr->value.MemberEnd() && it2 != itr->value.MemberEnd()) { - element.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, + element.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, Decimal(UtilString::printDoubleScientific(std::stod(it1->value.GetString()) * std::stod(it2->value.GetString()))).toString()); } element.insert(CCAPI_EM_ORDER_ID, itr->name.GetString()); diff --git a/include/ccapi_cpp/service/ccapi_execution_management_service_kucoin_base.h b/include/ccapi_cpp/service/ccapi_execution_management_service_kucoin_base.h index be7015e5..db056221 100644 --- a/include/ccapi_cpp/service/ccapi_execution_management_service_kucoin_base.h +++ b/include/ccapi_cpp/service/ccapi_execution_management_service_kucoin_base.h @@ -297,7 +297,7 @@ class ExecutionManagementServiceKucoinBase : public ExecutionManagementService { {CCAPI_EM_ORDER_QUANTITY, std::make_pair("size", JsonDataType::STRING)}, {CCAPI_EM_ORDER_LIMIT_PRICE, std::make_pair("price", JsonDataType::STRING)}, {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY, std::make_pair("dealSize", JsonDataType::STRING)}, - {CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, std::make_pair("dealFunds", JsonDataType::STRING)}, + {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, std::make_pair("dealFunds", JsonDataType::STRING)}, {CCAPI_EM_ORDER_INSTRUMENT, std::make_pair("symbol", JsonDataType::STRING)}}; const rj::Value& data = document["data"]; if (operation == Request::Operation::CANCEL_ORDER || operation == Request::Operation::CANCEL_OPEN_ORDERS) { diff --git a/include/ccapi_cpp/service/ccapi_execution_management_service_mexc.h b/include/ccapi_cpp/service/ccapi_execution_management_service_mexc.h index e43b9d06..51e6f91e 100644 --- a/include/ccapi_cpp/service/ccapi_execution_management_service_mexc.h +++ b/include/ccapi_cpp/service/ccapi_execution_management_service_mexc.h @@ -182,7 +182,7 @@ class ExecutionManagementServiceMexc : public ExecutionManagementService { {CCAPI_EM_ORDER_QUANTITY, std::make_pair("origQty", JsonDataType::STRING)}, {CCAPI_EM_ORDER_LIMIT_PRICE, std::make_pair("price", JsonDataType::STRING)}, {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY, std::make_pair("executedQty", JsonDataType::STRING)}, - {CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, std::make_pair("cummulativeQuoteQty", JsonDataType::STRING)}, + {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, std::make_pair("cummulativeQuoteQty", JsonDataType::STRING)}, {CCAPI_EM_ORDER_STATUS, std::make_pair("status", JsonDataType::STRING)}, {CCAPI_EM_ORDER_INSTRUMENT, std::make_pair("symbol", JsonDataType::STRING)}, }; @@ -421,7 +421,7 @@ class ExecutionManagementServiceMexc : public ExecutionManagementService { {CCAPI_EM_ORDER_LIMIT_PRICE, std::make_pair("p", JsonDataType::STRING)}, {CCAPI_EM_ORDER_QUANTITY, std::make_pair("v", JsonDataType::STRING)}, {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY, std::make_pair("cv", JsonDataType::STRING)}, - {CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, std::make_pair("ca", JsonDataType::STRING)}, + {CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, std::make_pair("ca", JsonDataType::STRING)}, {CCAPI_EM_ORDER_AVERAGE_FILLED_PRICE, std::make_pair("ap", JsonDataType::STRING)}, {CCAPI_EM_ORDER_REMAINING_QUANTITY, std::make_pair("V", JsonDataType::STRING)}, {CCAPI_EM_ORDER_STATUS, std::make_pair("s", JsonDataType::STRING)}, diff --git a/include/ccapi_cpp/service/ccapi_execution_management_service_mexc_futures.h b/include/ccapi_cpp/service/ccapi_execution_management_service_mexc_futures.h index 81924ef6..1f2fc65a 100644 --- a/include/ccapi_cpp/service/ccapi_execution_management_service_mexc_futures.h +++ b/include/ccapi_cpp/service/ccapi_execution_management_service_mexc_futures.h @@ -328,7 +328,7 @@ class ExecutionManagementServiceMexcFutures : public ExecutionManagementService // auto it1Str = std::string(it1->value.GetString()); // auto it2Str = std::string(it2->value.GetString()); // if (!it1Str.empty() && !it2Str.empty()) { - // element.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, Decimal(UtilString::printDoubleScientific(std::stod(it1Str) * + // element.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, Decimal(UtilString::printDoubleScientific(std::stod(it1Str) * // std::stod(it2Str))).toString()); // } // } 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 f491967f..56ca584a 100644 --- a/include/ccapi_cpp/service/ccapi_execution_management_service_okx.h +++ b/include/ccapi_cpp/service/ccapi_execution_management_service_okx.h @@ -335,18 +335,18 @@ class ExecutionManagementServiceOkx : public ExecutionManagementService { void extractOrderInfo(Element& element, const rj::Value& x, const std::map>& extractionFieldNameMap, const std::map> conversionMap = {}) override { ExecutionManagementService::extractOrderInfo(element, x, extractionFieldNameMap); - { - auto it1 = x.FindMember("accFillSz"); - auto it2 = x.FindMember("avgPx"); - if (it1 != x.MemberEnd() && it2 != x.MemberEnd()) { - auto it1Str = std::string(it1->value.GetString()); - auto it2Str = std::string(it2->value.GetString()); - if (!it1Str.empty() && !it2Str.empty()) { - element.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY, - Decimal(UtilString::printDoubleScientific(std::stod(it1Str) * std::stod(it2Str))).toString()); - } - } - } + // { + // auto it1 = x.FindMember("accFillSz"); + // auto it2 = x.FindMember("avgPx"); + // if (it1 != x.MemberEnd() && it2 != x.MemberEnd()) { + // auto it1Str = std::string(it1->value.GetString()); + // auto it2Str = std::string(it2->value.GetString()); + // if (!it1Str.empty() && !it2Str.empty()) { + // element.insert(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY, + // Decimal(UtilString::printDoubleScientific(std::stod(it1Str) * std::stod(it2Str))).toString()); + // } + // } + // } } std::vector createSendStringListFromSubscription(const WsConnection& wsConnection, const Subscription& subscription, const TimePoint& now, diff --git a/include/ccapi_cpp/service/ccapi_market_data_service_ascendex.h b/include/ccapi_cpp/service/ccapi_market_data_service_ascendex.h index a97c8922..ee7823a5 100644 --- a/include/ccapi_cpp/service/ccapi_market_data_service_ascendex.h +++ b/include/ccapi_cpp/service/ccapi_market_data_service_ascendex.h @@ -269,7 +269,7 @@ class MarketDataServiceAscendex : public MarketDataService { element.insert(CCAPI_QUOTE_ASSET, x["quoteAsset"].GetString()); element.insert(CCAPI_ORDER_PRICE_INCREMENT, x["tickSize"].GetString()); element.insert(CCAPI_ORDER_QUANTITY_INCREMENT, x["lotSize"].GetString()); - element.insert(CCAPI_ORDER_PRICE_TIMES_QUANTITY_MIN, x["minNotional"].GetString()); + element.insert(CCAPI_ORDER_QUOTE_QUANTITY_MIN, x["minNotional"].GetString()); } void convertTextMessageToMarketDataMessage(const Request& request, const std::string& textMessage, const TimePoint& timeReceived, Event& event, diff --git a/include/ccapi_cpp/service/ccapi_market_data_service_binance_base.h b/include/ccapi_cpp/service/ccapi_market_data_service_binance_base.h index 146ec1de..d8f0892f 100644 --- a/include/ccapi_cpp/service/ccapi_market_data_service_binance_base.h +++ b/include/ccapi_cpp/service/ccapi_market_data_service_binance_base.h @@ -365,6 +365,9 @@ class MarketDataServiceBinanceBase : public MarketDataService { case Request::Operation::GET_INSTRUMENTS: { req.method(http::verb::get); auto target = this->getInstrumentTarget; + if (!this->isDerivatives) { + target += "?showPermissionSets=false"; + } req.target(target); } break; case Request::Operation::GET_BBOS: { @@ -379,6 +382,7 @@ class MarketDataServiceBinanceBase : public MarketDataService { void extractInstrumentInfo(Element& element, const rj::Value& x) { element.insert(CCAPI_INSTRUMENT, x["symbol"].GetString()); + element.insert(CCAPI_INSTRUMENT_STATUS, x["status"].GetString()); element.insert(CCAPI_BASE_ASSET, x["baseAsset"].GetString()); element.insert(CCAPI_QUOTE_ASSET, x["quoteAsset"].GetString()); for (const auto& y : x["filters"].GetArray()) { @@ -388,8 +392,9 @@ class MarketDataServiceBinanceBase : public MarketDataService { } else if (filterType == "LOT_SIZE") { element.insert(CCAPI_ORDER_QUANTITY_INCREMENT, y["stepSize"].GetString()); element.insert(CCAPI_ORDER_QUANTITY_MIN, y["minQty"].GetString()); - } else if (filterType == "MIN_NOTIONAL") { - element.insert(CCAPI_ORDER_PRICE_TIMES_QUANTITY_MIN, y["minNotional"].GetString()); + } else if (filterType == "NOTIONAL") { + element.insert(CCAPI_ORDER_QUOTE_QUANTITY_MIN, y["minNotional"].GetString()); + element.insert(CCAPI_ORDER_QUOTE_QUANTITY_MAX, y["maxNotional"].GetString()); } } } diff --git a/include/ccapi_cpp/service/ccapi_market_data_service_binance_derivatives_base.h b/include/ccapi_cpp/service/ccapi_market_data_service_binance_derivatives_base.h index b1763f8d..8224fb9f 100644 --- a/include/ccapi_cpp/service/ccapi_market_data_service_binance_derivatives_base.h +++ b/include/ccapi_cpp/service/ccapi_market_data_service_binance_derivatives_base.h @@ -49,10 +49,16 @@ class MarketDataServiceBinanceDerivativesBase : public MarketDataServiceBinanceB void extractInstrumentInfo(Element& element, const rj::Value& x) { element.insert(CCAPI_INSTRUMENT, x["symbol"].GetString()); - element.insert(CCAPI_INSTRUMENT_STATUS, x["status"].GetString()); + if (x.HasMember("status")) { + element.insert(CCAPI_INSTRUMENT_STATUS, x["status"].GetString()); + } else if (x.HasMember("contractStatus")) { + element.insert(CCAPI_INSTRUMENT_STATUS, x["contractStatus"].GetString()); + } + if (x.HasMember("contractSize")) { + element.insert(CCAPI_CONTRACT_SIZE, x["contractSize"].GetString()); + } element.insert(CCAPI_BASE_ASSET, x["baseAsset"].GetString()); element.insert(CCAPI_QUOTE_ASSET, x["quoteAsset"].GetString()); - element.insert(CCAPI_INSTRUMENT, x["symbol"].GetString()); element.insert(CCAPI_MARGIN_ASSET, x["marginAsset"].GetString()); element.insert(CCAPI_UNDERLYING_SYMBOL, x["pair"].GetString()); for (const auto& y : x["filters"].GetArray()) { @@ -64,7 +70,7 @@ class MarketDataServiceBinanceDerivativesBase : public MarketDataServiceBinanceB element.insert(CCAPI_ORDER_QUANTITY_MIN, y["minQty"].GetString()); element.insert(CCAPI_ORDER_QUANTITY_MAX, y["maxQty"].GetString()); } else if (filterType == "MIN_NOTIONAL") { - element.insert(CCAPI_ORDER_PRICE_TIMES_QUANTITY_MIN, y["notional"].GetString()); + element.insert(CCAPI_ORDER_QUOTE_QUANTITY_MIN, y["notional"].GetString()); } } } diff --git a/include/ccapi_cpp/service/ccapi_market_data_service_bitmart.h b/include/ccapi_cpp/service/ccapi_market_data_service_bitmart.h index 898717e5..24b0ec6f 100644 --- a/include/ccapi_cpp/service/ccapi_market_data_service_bitmart.h +++ b/include/ccapi_cpp/service/ccapi_market_data_service_bitmart.h @@ -235,8 +235,7 @@ class MarketDataServiceBitmart : public MarketDataService { } element.insert(CCAPI_ORDER_QUANTITY_INCREMENT, UtilString::normalizeDecimalString(x["quote_increment"].GetString())); element.insert(CCAPI_ORDER_QUANTITY_MIN, UtilString::normalizeDecimalString(x["base_min_size"].GetString())); - element.insert(CCAPI_ORDER_PRICE_TIMES_QUANTITY_MIN, - std::max(Decimal(x["min_buy_amount"].GetString()), Decimal(x["min_sell_amount"].GetString())).toString()); + element.insert(CCAPI_ORDER_QUOTE_QUANTITY_MIN, std::max(Decimal(x["min_buy_amount"].GetString()), Decimal(x["min_sell_amount"].GetString())).toString()); } void convertTextMessageToMarketDataMessage(const Request& request, const std::string& textMessage, const TimePoint& timeReceived, Event& event, diff --git a/include/ccapi_cpp/service/ccapi_market_data_service_bitstamp.h b/include/ccapi_cpp/service/ccapi_market_data_service_bitstamp.h index 81800853..efc1493d 100644 --- a/include/ccapi_cpp/service/ccapi_market_data_service_bitstamp.h +++ b/include/ccapi_cpp/service/ccapi_market_data_service_bitstamp.h @@ -213,7 +213,7 @@ class MarketDataServiceBitstamp : public MarketDataService { auto splittedMinimumOrder = UtilString::split(x["minimum_order"].GetString(), ' '); if (splittedMinimumOrder.size() == 2) { if (splittedMinimumOrder.at(1) == quoteAsset) { - element.insert(CCAPI_ORDER_PRICE_TIMES_QUANTITY_MIN, splittedMinimumOrder.at(0)); + element.insert(CCAPI_ORDER_QUOTE_QUANTITY_MIN, splittedMinimumOrder.at(0)); } else if (splittedMinimumOrder.at(1) == baseAsset) { element.insert(CCAPI_ORDER_QUANTITY_MIN, splittedMinimumOrder.at(0)); } diff --git a/include/ccapi_cpp/service/ccapi_market_data_service_bybit.h b/include/ccapi_cpp/service/ccapi_market_data_service_bybit.h index 742c454a..3ea48e99 100644 --- a/include/ccapi_cpp/service/ccapi_market_data_service_bybit.h +++ b/include/ccapi_cpp/service/ccapi_market_data_service_bybit.h @@ -171,7 +171,7 @@ class MarketDataServiceBybit : public MarketDataService { if (channelId.rfind(CCAPI_WEBSOCKET_BYBIT_CHANNEL_ORDERBOOK, 0) == 0) { MarketDataMessage marketDataMessage; marketDataMessage.exchangeSubscriptionId = exchangeSubscriptionId; - marketDataMessage.tp = TimePoint(std::chrono::milliseconds(std::stoll(document["ts"].GetString()))); + marketDataMessage.tp = TimePoint(std::chrono::milliseconds(std::stoll(document["cts"].GetString()))); marketDataMessage.type = MarketDataMessage::Type::MARKET_DATA_EVENTS_MARKET_DEPTH; std::string type = document["type"].GetString(); marketDataMessage.recapType = type == "snapshot" ? MarketDataMessage::RecapType::SOLICITED : MarketDataMessage::RecapType::NONE; @@ -308,6 +308,7 @@ class MarketDataServiceBybit : public MarketDataService { this->appendParam(queryString, param, { {CCAPI_INSTRUMENT_TYPE, "category"}, + {CCAPI_LIMIT, "limit"}, }); req.target(target + "?" + queryString); } break; @@ -339,14 +340,17 @@ class MarketDataServiceBybit : public MarketDataService { if (category == "spot") { element.insert(CCAPI_ORDER_QUANTITY_INCREMENT, x["lotSizeFilter"]["basePrecision"].GetString()); element.insert(CCAPI_ORDER_QUANTITY_MIN, x["lotSizeFilter"]["minOrderQty"].GetString()); - element.insert(CCAPI_ORDER_PRICE_TIMES_QUANTITY_MIN, x["lotSizeFilter"]["minOrderAmt"].GetString()); + element.insert(CCAPI_ORDER_QUOTE_QUANTITY_MIN, x["lotSizeFilter"]["minOrderAmt"].GetString()); + element.insert(CCAPI_ORDER_QUOTE_QUANTITY_MAX, x["lotSizeFilter"]["maxOrderAmt"].GetString()); } else if (category == "linear" || category == "inverse") { element.insert(CCAPI_ORDER_QUANTITY_INCREMENT, x["lotSizeFilter"]["qtyStep"].GetString()); element.insert(CCAPI_ORDER_QUANTITY_MIN, x["lotSizeFilter"]["minOrderQty"].GetString()); - element.insert(CCAPI_ORDER_PRICE_TIMES_QUANTITY_MIN, x["lotSizeFilter"]["minNotionalValue"].GetString()); + element.insert(CCAPI_ORDER_QUANTITY_MAX, x["lotSizeFilter"]["maxOrderQty"].GetString()); + element.insert(CCAPI_ORDER_QUOTE_QUANTITY_MIN, x["lotSizeFilter"]["minNotionalValue"].GetString()); } else if (category == "option") { element.insert(CCAPI_ORDER_QUANTITY_INCREMENT, x["lotSizeFilter"]["qtyStep"].GetString()); element.insert(CCAPI_ORDER_QUANTITY_MIN, x["lotSizeFilter"]["minOrderQty"].GetString()); + element.insert(CCAPI_ORDER_QUANTITY_MAX, x["lotSizeFilter"]["maxOrderQty"].GetString()); } } diff --git a/include/ccapi_cpp/service/ccapi_market_data_service_huobi_base.h b/include/ccapi_cpp/service/ccapi_market_data_service_huobi_base.h index 7e9f9641..1e98805a 100644 --- a/include/ccapi_cpp/service/ccapi_market_data_service_huobi_base.h +++ b/include/ccapi_cpp/service/ccapi_market_data_service_huobi_base.h @@ -332,7 +332,7 @@ class MarketDataServiceHuobiBase : public MarketDataService { element.insert(CCAPI_ORDER_QUANTITY_INCREMENT, "1"); } element.insert(CCAPI_ORDER_QUANTITY_MIN, x["limit-order-min-order-amt"].GetString()); - element.insert(CCAPI_ORDER_PRICE_TIMES_QUANTITY_MIN, x["min-order-value"].GetString()); + element.insert(CCAPI_ORDER_QUOTE_QUANTITY_MIN, x["min-order-value"].GetString()); } void convertTextMessageToMarketDataMessage(const Request& request, const std::string& textMessage, const TimePoint& timeReceived, Event& event, diff --git a/include/ccapi_cpp/service/ccapi_market_data_service_kucoin.h b/include/ccapi_cpp/service/ccapi_market_data_service_kucoin.h index 75524efc..8e8621c1 100644 --- a/include/ccapi_cpp/service/ccapi_market_data_service_kucoin.h +++ b/include/ccapi_cpp/service/ccapi_market_data_service_kucoin.h @@ -51,7 +51,7 @@ class MarketDataServiceKucoin : public MarketDataServiceKucoinBase { element.insert(CCAPI_ORDER_PRICE_INCREMENT, x["priceIncrement"].GetString()); element.insert(CCAPI_ORDER_QUANTITY_INCREMENT, x["baseIncrement"].GetString()); element.insert(CCAPI_ORDER_QUANTITY_MIN, x["baseMinSize"].GetString()); - element.insert(CCAPI_ORDER_PRICE_TIMES_QUANTITY_MIN, x["quoteMinSize"].GetString()); + element.insert(CCAPI_ORDER_QUOTE_QUANTITY_MIN, x["quoteMinSize"].GetString()); } }; } /* namespace ccapi */ diff --git a/include/ccapi_cpp/service/ccapi_market_data_service_mexc.h b/include/ccapi_cpp/service/ccapi_market_data_service_mexc.h index 164a8afc..94ec6480 100644 --- a/include/ccapi_cpp/service/ccapi_market_data_service_mexc.h +++ b/include/ccapi_cpp/service/ccapi_market_data_service_mexc.h @@ -263,7 +263,7 @@ class MarketDataServiceMexc : public MarketDataService { } element.insert(CCAPI_ORDER_QUANTITY_INCREMENT, x["baseSizePrecision"].GetString()); element.insert(CCAPI_ORDER_QUANTITY_MIN, x["baseSizePrecision"].GetString()); - element.insert(CCAPI_ORDER_PRICE_TIMES_QUANTITY_MIN, x["quoteAmountPrecision"].GetString()); + element.insert(CCAPI_ORDER_QUOTE_QUANTITY_MIN, x["quoteAmountPrecision"].GetString()); } void convertTextMessageToMarketDataMessage(const Request& request, const std::string& textMessage, const TimePoint& timeReceived, Event& event, diff --git a/include/ccapi_cpp/service/ccapi_market_data_service_whitebit.h b/include/ccapi_cpp/service/ccapi_market_data_service_whitebit.h index ad195c93..cd6da1d5 100644 --- a/include/ccapi_cpp/service/ccapi_market_data_service_whitebit.h +++ b/include/ccapi_cpp/service/ccapi_market_data_service_whitebit.h @@ -271,7 +271,7 @@ class MarketDataServiceWhitebit : public MarketDataService { element.insert(CCAPI_ORDER_QUANTITY_INCREMENT, "1" + std::string(-stockPrec, '0')); } element.insert(CCAPI_ORDER_QUANTITY_MIN, x["minAmount"].GetString()); - element.insert(CCAPI_ORDER_PRICE_TIMES_QUANTITY_MIN, x["minTotal"].GetString()); + element.insert(CCAPI_ORDER_QUOTE_QUANTITY_MIN, x["minTotal"].GetString()); } void convertTextMessageToMarketDataMessage(const Request& request, const std::string& textMessage, const TimePoint& timeReceived, Event& event, diff --git a/include/ccapi_cpp/service/ccapi_service.h b/include/ccapi_cpp/service/ccapi_service.h index 92891483..4028627c 100644 --- a/include/ccapi_cpp/service/ccapi_service.h +++ b/include/ccapi_cpp/service/ccapi_service.h @@ -1,5 +1,10 @@ #ifndef INCLUDE_CCAPI_CPP_SERVICE_CCAPI_SERVICE_H_ #define INCLUDE_CCAPI_CPP_SERVICE_CCAPI_SERVICE_H_ + +#ifndef CCAPI_HTTP_RESPONSE_PARSER_BODY_LIMIT +#define CCAPI_HTTP_RESPONSE_PARSER_BODY_LIMIT (64 * 1024 * 1024) +#endif + #include "ccapi_cpp/ccapi_logger.h" #ifndef RAPIDJSON_HAS_CXX11_NOEXCEPT #define RAPIDJSON_HAS_CXX11_NOEXCEPT 0 @@ -464,20 +469,22 @@ class Service : public std::enable_shared_from_this { } CCAPI_LOGGER_TRACE("written"); std::shared_ptr bufferPtr(new beast::flat_buffer()); - std::shared_ptr> resPtr(new http::response()); + std::shared_ptr> resParserPtr(new http::response_parser()); + resParserPtr->body_limit(CCAPI_HTTP_RESPONSE_PARSER_BODY_LIMIT); beast::ssl_stream& stream = *httpConnectionPtr->streamPtr; CCAPI_LOGGER_TRACE("before async_read"); http::async_read( - stream, *bufferPtr, *resPtr, - beast::bind_front_handler(&Service::onRead, shared_from_this(), httpConnectionPtr, reqPtr, errorHandler, responseHandler, bufferPtr, resPtr)); + stream, *bufferPtr, *resParserPtr, + beast::bind_front_handler(&Service::onRead, shared_from_this(), httpConnectionPtr, reqPtr, errorHandler, responseHandler, bufferPtr, resParserPtr)); CCAPI_LOGGER_TRACE("after async_read"); } void onRead(std::shared_ptr httpConnectionPtr, std::shared_ptr> reqPtr, std::function errorHandler, std::function&)> responseHandler, - std::shared_ptr bufferPtr, std::shared_ptr> resPtr, beast::error_code ec, + std::shared_ptr bufferPtr, std::shared_ptr> resParserPtr, beast::error_code ec, std::size_t bytes_transferred) { CCAPI_LOGGER_TRACE("async_read callback start"); + auto resPtr = &resParserPtr->get(); boost::ignore_unused(bytes_transferred); if (ec) { CCAPI_LOGGER_TRACE("fail"); @@ -687,20 +694,22 @@ class Service : public std::enable_shared_from_this { } CCAPI_LOGGER_TRACE("written"); std::shared_ptr bufferPtr(new beast::flat_buffer()); - std::shared_ptr> resPtr(new http::response()); + std::shared_ptr> resParserPtr(new http::response_parser()); + resParserPtr->body_limit(CCAPI_HTTP_RESPONSE_PARSER_BODY_LIMIT); beast::ssl_stream& stream = *httpConnectionPtr->streamPtr; CCAPI_LOGGER_TRACE("before async_read"); http::async_read( - stream, *bufferPtr, *resPtr, - beast::bind_front_handler(&Service::onRead_2, shared_from_this(), httpConnectionPtr, request, reqPtr, retry, bufferPtr, resPtr, eventQueuePtr)); + stream, *bufferPtr, *resParserPtr, + beast::bind_front_handler(&Service::onRead_2, shared_from_this(), httpConnectionPtr, request, reqPtr, retry, bufferPtr, resParserPtr, eventQueuePtr)); CCAPI_LOGGER_TRACE("after async_read"); } void onRead_2(std::shared_ptr httpConnectionPtr, Request request, std::shared_ptr> reqPtr, HttpRetry retry, - std::shared_ptr bufferPtr, std::shared_ptr> resPtr, Queue* eventQueuePtr, - beast::error_code ec, std::size_t bytes_transferred) { + std::shared_ptr bufferPtr, std::shared_ptr> resParserPtr, + Queue* eventQueuePtr, beast::error_code ec, std::size_t bytes_transferred) { CCAPI_LOGGER_TRACE("async_read callback start"); CCAPI_LOGGER_TRACE("local endpoint has address " + beast::get_lowest_layer(*httpConnectionPtr->streamPtr).socket().local_endpoint().address().to_string()); + auto resPtr = &resParserPtr->get(); auto now = UtilTime::now(); boost::ignore_unused(bytes_transferred); if (ec) { diff --git a/test/test_unit/src/execution_management/binance_us/test.cpp b/test/test_unit/src/execution_management/binance_us/test.cpp index 71748ba0..19ed21c4 100644 --- a/test/test_unit/src/execution_management/binance_us/test.cpp +++ b/test/test_unit/src/execution_management/binance_us/test.cpp @@ -215,7 +215,7 @@ TEST_F(ExecutionManagementServiceBinanceUsTest, convertTextMessageToMessageRestG EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_QUANTITY), "1.0"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_LIMIT_PRICE), "0.1"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY), "0.0"); - EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY), "0.01"); + EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY), "0.01"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_STATUS), "NEW"); } @@ -286,7 +286,7 @@ void verifyconvertTextMessageToMessageRestGetOpenOrders(const ExecutionManagemen EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_QUANTITY), "1.0"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_LIMIT_PRICE), "0.1"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY), "0.0"); - EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY), "0.01"); + EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY), "0.01"); if (!isOneInstrument) { EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_INSTRUMENT), "LTCBTC"); } @@ -364,7 +364,7 @@ TEST_F(ExecutionManagementServiceBinanceUsTest, createEventExecutionTypeTrade) { #ifdef CCAPI_LEGACY_USE_WEBSOCKETPP auto messageList = this->service->createEvent(WsConnection(), wspp::lib::weak_ptr(), subscription, textMessage, document, this->now).getMessageList(); #else - auto messageList = this->service->createEvent(std::shared_ptr(), subscription, textMessage, document, this->now).getMessageList(); + auto messageList = this->service->createEvent(std::make_shared(), subscription, textMessage, document, this->now).getMessageList(); #endif EXPECT_EQ(messageList.size(), 1); verifyCorrelationId(messageList, subscription.getCorrelationId()); @@ -425,7 +425,7 @@ TEST_F(ExecutionManagementServiceBinanceUsTest, createEventExecutionTypeNew) { #ifdef CCAPI_LEGACY_USE_WEBSOCKETPP auto messageList = this->service->createEvent(WsConnection(), wspp::lib::weak_ptr(), subscription, textMessage, document, this->now).getMessageList(); #else - auto messageList = this->service->createEvent(std::shared_ptr(), subscription, textMessage, document, this->now).getMessageList(); + auto messageList = this->service->createEvent(std::make_shared(), subscription, textMessage, document, this->now).getMessageList(); #endif EXPECT_EQ(messageList.size(), 1); verifyCorrelationId(messageList, subscription.getCorrelationId()); @@ -441,7 +441,7 @@ TEST_F(ExecutionManagementServiceBinanceUsTest, createEventExecutionTypeNew) { EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY), "0.00000000"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_STATUS), "NEW"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_INSTRUMENT), "ETHBTC"); - EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY), "0.00000000"); + EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY), "0.00000000"); } TEST_F(ExecutionManagementServiceBinanceUsTest, convertRequestGetAccountBalances) { diff --git a/test/test_unit/src/execution_management/binance_usds_futures/test.cpp b/test/test_unit/src/execution_management/binance_usds_futures/test.cpp index 898d801d..7a83ec45 100644 --- a/test/test_unit/src/execution_management/binance_usds_futures/test.cpp +++ b/test/test_unit/src/execution_management/binance_usds_futures/test.cpp @@ -74,7 +74,7 @@ TEST_F(ExecutionManagementServiceBinanceUsdsFuturesTest, convertTextMessageToMes auto elementList = message.getElementList(); EXPECT_EQ(elementList.size(), 1); Element element = elementList.at(0); - EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY), "0.01"); + EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY), "0.01"); } TEST_F(ExecutionManagementServiceBinanceUsdsFuturesTest, createEventExecutionTypeTrade) { @@ -124,8 +124,9 @@ TEST_F(ExecutionManagementServiceBinanceUsdsFuturesTest, createEventExecutionTyp #ifdef CCAPI_LEGACY_USE_WEBSOCKETPP auto messageList = this->service->createEvent(WsConnection(), wspp::lib::weak_ptr(), subscription, textMessage, document, this->now).getMessageList(); #else - auto messageList = this->service->createEvent(std::shared_ptr(), subscription, textMessage, document, this->now).getMessageList(); + auto messageList = this->service->createEvent(std::make_shared(), subscription, textMessage, document, this->now).getMessageList(); #endif + EXPECT_EQ(messageList.size(), 1); verifyCorrelationId(messageList, subscription.getCorrelationId()); auto message = messageList.at(0); @@ -172,7 +173,7 @@ TEST_F(ExecutionManagementServiceBinanceUsdsFuturesTest, createEventBalanceUpdat )"; rj::Document document; document.Parse(textMessage.c_str()); - auto messageList = this->service->createEvent(std::shared_ptr(), subscription, textMessage, document, this->now).getMessageList(); + auto messageList = this->service->createEvent(std::make_shared(), subscription, textMessage, document, this->now).getMessageList(); EXPECT_EQ(messageList.size(), 1); verifyCorrelationId(messageList, subscription.getCorrelationId()); auto message = messageList.at(0); @@ -233,7 +234,7 @@ TEST_F(ExecutionManagementServiceBinanceUsdsFuturesTest, createEventPositionUpda )"; rj::Document document; document.Parse(textMessage.c_str()); - auto messageList = this->service->createEvent(std::shared_ptr(), subscription, textMessage, document, this->now).getMessageList(); + auto messageList = this->service->createEvent(std::make_shared(), subscription, textMessage, document, this->now).getMessageList(); EXPECT_EQ(messageList.size(), 1); verifyCorrelationId(messageList, subscription.getCorrelationId()); auto message = messageList.at(0); @@ -293,7 +294,7 @@ TEST_F(ExecutionManagementServiceBinanceUsdsFuturesTest, createEventExecutionTyp #ifdef CCAPI_LEGACY_USE_WEBSOCKETPP auto messageList = this->service->createEvent(WsConnection(), wspp::lib::weak_ptr(), subscription, textMessage, document, this->now).getMessageList(); #else - auto messageList = this->service->createEvent(std::shared_ptr(), subscription, textMessage, document, this->now).getMessageList(); + auto messageList = this->service->createEvent(std::make_shared(), subscription, textMessage, document, this->now).getMessageList(); #endif EXPECT_EQ(messageList.size(), 1); verifyCorrelationId(messageList, subscription.getCorrelationId()); @@ -309,7 +310,7 @@ TEST_F(ExecutionManagementServiceBinanceUsdsFuturesTest, createEventExecutionTyp EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY), "0"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_STATUS), "NEW"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_INSTRUMENT), "BTCUSDT"); - EXPECT_DOUBLE_EQ(std::stod(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY)), 0); + EXPECT_DOUBLE_EQ(std::stod(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY)), 0); } TEST_F(ExecutionManagementServiceBinanceUsdsFuturesTest, convertRequestGetAccountBalances) { diff --git a/test/test_unit/src/execution_management/bitmex/test.cpp b/test/test_unit/src/execution_management/bitmex/test.cpp index 1b5563b9..30c6d7c3 100644 --- a/test/test_unit/src/execution_management/bitmex/test.cpp +++ b/test/test_unit/src/execution_management/bitmex/test.cpp @@ -291,7 +291,7 @@ TEST_F(ExecutionManagementServiceBitmexTest, convertTextMessageToMessageRestGetO EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_SIDE), CCAPI_EM_ORDER_SIDE_BUY); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_QUANTITY), "1"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY), "0"); - EXPECT_DOUBLE_EQ(std::stod(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY)), 0); + EXPECT_DOUBLE_EQ(std::stod(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY)), 0); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_STATUS), "New"); } @@ -376,7 +376,7 @@ void verifyconvertTextMessageToMessageRestGetOpenOrders(const ExecutionManagemen EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_QUANTITY), "1"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_LIMIT_PRICE), "0.10000000"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY), "0"); - EXPECT_DOUBLE_EQ(std::stod(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY)), 0); + EXPECT_DOUBLE_EQ(std::stod(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY)), 0); if (!isOneInstrument) { EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_INSTRUMENT), "XBTUSD"); } @@ -769,7 +769,7 @@ TEST_F(ExecutionManagementServiceBitmexTest, createEventPrivateTrade) { #ifdef CCAPI_LEGACY_USE_WEBSOCKETPP auto messageList = this->service->createEvent(WsConnection(), wspp::lib::weak_ptr(), subscription, textMessage, document, this->now).getMessageList(); #else - auto messageList = this->service->createEvent(std::shared_ptr(), subscription, textMessage, document, this->now).getMessageList(); + auto messageList = this->service->createEvent(std::make_shared(), subscription, textMessage, document, this->now).getMessageList(); #endif EXPECT_EQ(messageList.size(), 1); verifyCorrelationId(messageList, subscription.getCorrelationId()); @@ -839,7 +839,7 @@ TEST_F(ExecutionManagementServiceBitmexTest, createEventOrderUpdate) { #ifdef CCAPI_LEGACY_USE_WEBSOCKETPP auto messageList = this->service->createEvent(WsConnection(), wspp::lib::weak_ptr(), subscription, textMessage, document, this->now).getMessageList(); #else - auto messageList = this->service->createEvent(std::shared_ptr(), subscription, textMessage, document, this->now).getMessageList(); + auto messageList = this->service->createEvent(std::make_shared(), subscription, textMessage, document, this->now).getMessageList(); #endif EXPECT_EQ(messageList.size(), 1); verifyCorrelationId(messageList, subscription.getCorrelationId()); diff --git a/test/test_unit/src/execution_management/coinbase/test.cpp b/test/test_unit/src/execution_management/coinbase/test.cpp index cc70137a..d7774265 100644 --- a/test/test_unit/src/execution_management/coinbase/test.cpp +++ b/test/test_unit/src/execution_management/coinbase/test.cpp @@ -212,7 +212,7 @@ TEST_F(ExecutionManagementServiceCoinbaseTest, convertTextMessageToMessageRestGe EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_SIDE), CCAPI_EM_ORDER_SIDE_BUY); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_QUANTITY), "1.00000000"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY), "0.01291771"); - EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY), "9.9750556620000000"); + EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY), "9.9750556620000000"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_STATUS), "done"); } @@ -293,7 +293,7 @@ void verifyconvertTextMessageToMessageRestGetOpenOrders(const ExecutionManagemen EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_QUANTITY), "0.01000000"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_LIMIT_PRICE), "0.10000000"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY), "0.00000000"); - EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY), "0.0000000000000000"); + EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY), "0.0000000000000000"); if (!isOneInstrument) { EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_INSTRUMENT), "BTC-USD"); } @@ -448,7 +448,7 @@ TEST_F(ExecutionManagementServiceCoinbaseTest, createEventMatchTaker) { #ifdef CCAPI_LEGACY_USE_WEBSOCKETPP auto messageList = this->service->createEvent(WsConnection(), wspp::lib::weak_ptr(), subscription, textMessage, document, this->now).getMessageList(); #else - auto messageList = this->service->createEvent(std::shared_ptr(), subscription, textMessage, document, this->now).getMessageList(); + auto messageList = this->service->createEvent(std::make_shared(), subscription, textMessage, document, this->now).getMessageList(); #endif EXPECT_EQ(messageList.size(), 1); verifyCorrelationId(messageList, subscription.getCorrelationId()); @@ -492,7 +492,7 @@ TEST_F(ExecutionManagementServiceCoinbaseTest, createEventMatchMaker) { #ifdef CCAPI_LEGACY_USE_WEBSOCKETPP auto messageList = this->service->createEvent(WsConnection(), wspp::lib::weak_ptr(), subscription, textMessage, document, this->now).getMessageList(); #else - auto messageList = this->service->createEvent(std::shared_ptr(), subscription, textMessage, document, this->now).getMessageList(); + auto messageList = this->service->createEvent(std::make_shared(), subscription, textMessage, document, this->now).getMessageList(); #endif EXPECT_EQ(messageList.size(), 1); verifyCorrelationId(messageList, subscription.getCorrelationId()); @@ -532,7 +532,7 @@ TEST_F(ExecutionManagementServiceCoinbaseTest, createEventReceived) { #ifdef CCAPI_LEGACY_USE_WEBSOCKETPP auto messageList = this->service->createEvent(WsConnection(), wspp::lib::weak_ptr(), subscription, textMessage, document, this->now).getMessageList(); #else - auto messageList = this->service->createEvent(std::shared_ptr(), subscription, textMessage, document, this->now).getMessageList(); + auto messageList = this->service->createEvent(std::make_shared(), subscription, textMessage, document, this->now).getMessageList(); #endif EXPECT_EQ(messageList.size(), 1); verifyCorrelationId(messageList, subscription.getCorrelationId()); @@ -570,7 +570,7 @@ TEST_F(ExecutionManagementServiceCoinbaseTest, createEventReceivedMarketOrder) { #ifdef CCAPI_LEGACY_USE_WEBSOCKETPP auto messageList = this->service->createEvent(WsConnection(), wspp::lib::weak_ptr(), subscription, textMessage, document, this->now).getMessageList(); #else - auto messageList = this->service->createEvent(std::shared_ptr(), subscription, textMessage, document, this->now).getMessageList(); + auto messageList = this->service->createEvent(std::make_shared(), subscription, textMessage, document, this->now).getMessageList(); #endif EXPECT_EQ(messageList.size(), 1); verifyCorrelationId(messageList, subscription.getCorrelationId()); @@ -606,7 +606,7 @@ TEST_F(ExecutionManagementServiceCoinbaseTest, createEventOpen) { #ifdef CCAPI_LEGACY_USE_WEBSOCKETPP auto messageList = this->service->createEvent(WsConnection(), wspp::lib::weak_ptr(), subscription, textMessage, document, this->now).getMessageList(); #else - auto messageList = this->service->createEvent(std::shared_ptr(), subscription, textMessage, document, this->now).getMessageList(); + auto messageList = this->service->createEvent(std::make_shared(), subscription, textMessage, document, this->now).getMessageList(); #endif EXPECT_EQ(messageList.size(), 1); verifyCorrelationId(messageList, subscription.getCorrelationId()); @@ -645,7 +645,7 @@ TEST_F(ExecutionManagementServiceCoinbaseTest, createEventDoneFilled) { #ifdef CCAPI_LEGACY_USE_WEBSOCKETPP auto messageList = this->service->createEvent(WsConnection(), wspp::lib::weak_ptr(), subscription, textMessage, document, this->now).getMessageList(); #else - auto messageList = this->service->createEvent(std::shared_ptr(), subscription, textMessage, document, this->now).getMessageList(); + auto messageList = this->service->createEvent(std::make_shared(), subscription, textMessage, document, this->now).getMessageList(); #endif EXPECT_EQ(messageList.size(), 1); verifyCorrelationId(messageList, subscription.getCorrelationId()); @@ -684,7 +684,7 @@ TEST_F(ExecutionManagementServiceCoinbaseTest, createEventChange) { #ifdef CCAPI_LEGACY_USE_WEBSOCKETPP auto messageList = this->service->createEvent(WsConnection(), wspp::lib::weak_ptr(), subscription, textMessage, document, this->now).getMessageList(); #else - auto messageList = this->service->createEvent(std::shared_ptr(), subscription, textMessage, document, this->now).getMessageList(); + auto messageList = this->service->createEvent(std::make_shared(), subscription, textMessage, document, this->now).getMessageList(); #endif EXPECT_EQ(messageList.size(), 1); verifyCorrelationId(messageList, subscription.getCorrelationId()); @@ -724,7 +724,7 @@ TEST_F(ExecutionManagementServiceCoinbaseTest, createEventActivate) { #ifdef CCAPI_LEGACY_USE_WEBSOCKETPP auto messageList = this->service->createEvent(WsConnection(), wspp::lib::weak_ptr(), subscription, textMessage, document, this->now).getMessageList(); #else - auto messageList = this->service->createEvent(std::shared_ptr(), subscription, textMessage, document, this->now).getMessageList(); + auto messageList = this->service->createEvent(std::make_shared(), subscription, textMessage, document, this->now).getMessageList(); #endif EXPECT_EQ(messageList.size(), 1); verifyCorrelationId(messageList, subscription.getCorrelationId()); diff --git a/test/test_unit/src/execution_management/erisx/test.cpp b/test/test_unit/src/execution_management/erisx/test.cpp index 12b97226..715e30a5 100644 --- a/test/test_unit/src/execution_management/erisx/test.cpp +++ b/test/test_unit/src/execution_management/erisx/test.cpp @@ -334,7 +334,7 @@ TEST_F(ExecutionManagementServiceErisxTest, convertTextMessageToMessageRestGetOr EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_SIDE), CCAPI_EM_ORDER_SIDE_BUY); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_QUANTITY), "3.0"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY), "0.0"); - EXPECT_DOUBLE_EQ(std::stod(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY)), 0); + EXPECT_DOUBLE_EQ(std::stod(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY)), 0); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_STATUS), "CANCELED"); } @@ -435,7 +435,7 @@ TEST_F(ExecutionManagementServiceErisxTest, convertTextMessageToMessageRestGetOp EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_QUANTITY), "0.1113"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_LIMIT_PRICE), "290.3"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY), "0.0"); - EXPECT_DOUBLE_EQ(std::stod(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY)), 0); + EXPECT_DOUBLE_EQ(std::stod(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY)), 0); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_INSTRUMENT), "BCH/USD"); } diff --git a/test/test_unit/src/execution_management/gateio/test.cpp b/test/test_unit/src/execution_management/gateio/test.cpp index b380a689..e51d8793 100644 --- a/test/test_unit/src/execution_management/gateio/test.cpp +++ b/test/test_unit/src/execution_management/gateio/test.cpp @@ -455,7 +455,7 @@ TEST_F(ExecutionManagementServiceGateioTest, createEventUserTrades) { #ifdef CCAPI_LEGACY_USE_WEBSOCKETPP auto messageList = this->service->createEvent(WsConnection(), wspp::lib::weak_ptr(), subscription, textMessage, document, this->now).getMessageList(); #else - auto messageList = this->service->createEvent(std::shared_ptr(), subscription, textMessage, document, this->now).getMessageList(); + auto messageList = this->service->createEvent(std::make_shared(), subscription, textMessage, document, this->now).getMessageList(); #endif EXPECT_EQ(messageList.size(), 1); verifyCorrelationId(messageList, subscription.getCorrelationId()); @@ -516,7 +516,7 @@ TEST_F(ExecutionManagementServiceGateioTest, createEventOrders) { #ifdef CCAPI_LEGACY_USE_WEBSOCKETPP auto messageList = this->service->createEvent(WsConnection(), wspp::lib::weak_ptr(), subscription, textMessage, document, this->now).getMessageList(); #else - auto messageList = this->service->createEvent(std::shared_ptr(), subscription, textMessage, document, this->now).getMessageList(); + auto messageList = this->service->createEvent(std::make_shared(), subscription, textMessage, document, this->now).getMessageList(); #endif EXPECT_EQ(messageList.size(), 1); verifyCorrelationId(messageList, subscription.getCorrelationId()); diff --git a/test/test_unit/src/execution_management/gemini/test.cpp b/test/test_unit/src/execution_management/gemini/test.cpp index c0120ddf..b232da9e 100644 --- a/test/test_unit/src/execution_management/gemini/test.cpp +++ b/test/test_unit/src/execution_management/gemini/test.cpp @@ -234,7 +234,7 @@ TEST_F(ExecutionManagementServiceGeminiTest, convertTextMessageToMessageRestGetO EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_SIDE), CCAPI_EM_ORDER_SIDE_BUY); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_QUANTITY), "3"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY), "3"); - EXPECT_DOUBLE_EQ(std::stod(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY)), 1200); + EXPECT_DOUBLE_EQ(std::stod(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY)), 1200); EXPECT_EQ(element.getValue("is_live"), "false"); } @@ -308,7 +308,7 @@ TEST_F(ExecutionManagementServiceGeminiTest, convertTextMessageToMessageRestGetO EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_QUANTITY), "1"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_LIMIT_PRICE), "125.51"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY), "0"); - EXPECT_DOUBLE_EQ(std::stod(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY)), 0); + EXPECT_DOUBLE_EQ(std::stod(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY)), 0); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_INSTRUMENT), "ethusd"); } @@ -483,7 +483,7 @@ TEST_F(ExecutionManagementServiceGeminiTest, createEventPrivateTrade) { #ifdef CCAPI_LEGACY_USE_WEBSOCKETPP auto messageList = this->service->createEvent(WsConnection(), wspp::lib::weak_ptr(), subscription, textMessage, document, this->now).getMessageList(); #else - auto messageList = this->service->createEvent(std::shared_ptr(), subscription, textMessage, document, this->now).getMessageList(); + auto messageList = this->service->createEvent(std::make_shared(), subscription, textMessage, document, this->now).getMessageList(); #endif EXPECT_EQ(messageList.size(), 1); verifyCorrelationId(messageList, subscription.getCorrelationId()); @@ -543,7 +543,7 @@ TEST_F(ExecutionManagementServiceGeminiTest, createEventOrderUpdate) { #ifdef CCAPI_LEGACY_USE_WEBSOCKETPP auto messageList = this->service->createEvent(WsConnection(), wspp::lib::weak_ptr(), subscription, textMessage, document, this->now).getMessageList(); #else - auto messageList = this->service->createEvent(std::shared_ptr(), subscription, textMessage, document, this->now).getMessageList(); + auto messageList = this->service->createEvent(std::make_shared(), subscription, textMessage, document, this->now).getMessageList(); #endif EXPECT_EQ(messageList.size(), 1); verifyCorrelationId(messageList, subscription.getCorrelationId()); @@ -559,7 +559,7 @@ TEST_F(ExecutionManagementServiceGeminiTest, createEventOrderUpdate) { EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_QUANTITY), "0.01"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_REMAINING_QUANTITY), "0"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY), "0.01"); - EXPECT_DOUBLE_EQ(std::stod(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY)), 32908.69 * 0.01); + EXPECT_DOUBLE_EQ(std::stod(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY)), 32908.69 * 0.01); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_INSTRUMENT), "btcusd"); EXPECT_EQ(element.getValue("is_live"), "false"); EXPECT_EQ(element.getValue("is_cancelled"), "false"); diff --git a/test/test_unit/src/execution_management/huobi/test.cpp b/test/test_unit/src/execution_management/huobi/test.cpp index 0c85d96a..a2a2c09e 100644 --- a/test/test_unit/src/execution_management/huobi/test.cpp +++ b/test/test_unit/src/execution_management/huobi/test.cpp @@ -242,7 +242,7 @@ TEST_F(ExecutionManagementServiceHuobiTest, convertTextMessageToMessageRestGetOr EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_QUANTITY), "10.1000000000"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_LIMIT_PRICE), "100.1000000000"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY), "10.1000000000"); - EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY), "1011.0100000000"); + EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY), "1011.0100000000"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_STATUS), "filled"); } @@ -297,7 +297,7 @@ TEST_F(ExecutionManagementServiceHuobiTest, convertTextMessageToMessageRestGetOp EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_QUANTITY), "1.000000000000000000"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_LIMIT_PRICE), "0.453000000000000000"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY), "0.0"); - EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY), "0.0"); + EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY), "0.0"); } TEST_F(ExecutionManagementServiceHuobiTest, convertRequestCancelOpenOrders) { diff --git a/test/test_unit/src/execution_management/huobi_usdt_swap/test.cpp b/test/test_unit/src/execution_management/huobi_usdt_swap/test.cpp index 353c5a79..0bf175ad 100644 --- a/test/test_unit/src/execution_management/huobi_usdt_swap/test.cpp +++ b/test/test_unit/src/execution_management/huobi_usdt_swap/test.cpp @@ -283,8 +283,8 @@ TEST_F(ExecutionManagementServiceHuobiUsdtSwapTest, convertTextMessageToMessageR EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_QUANTITY), "1"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_LIMIT_PRICE), "17"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY), "1"); - CCAPI_LOGGER_DEBUG(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY)); - EXPECT_DOUBLE_EQ(std::stod(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY)), 50); + CCAPI_LOGGER_DEBUG(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY)); + EXPECT_DOUBLE_EQ(std::stod(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY)), 50); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_STATUS), "6"); } @@ -363,7 +363,7 @@ TEST_F(ExecutionManagementServiceHuobiUsdtSwapTest, convertTextMessageToMessageR EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_QUANTITY), "1"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_LIMIT_PRICE), "80"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY), "0"); - EXPECT_DOUBLE_EQ(std::stod(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY)), 0); + EXPECT_DOUBLE_EQ(std::stod(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY)), 0); } TEST_F(ExecutionManagementServiceHuobiUsdtSwapTest, convertRequestGetAccountBalances) { @@ -624,7 +624,7 @@ TEST_F(ExecutionManagementServiceHuobiUsdtSwapTest, createEventOrderData) { EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY), "8"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_STATUS), "6"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_INSTRUMENT), "BTC-USDT"); - EXPECT_DOUBLE_EQ(std::stod(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY)), 400000); + EXPECT_DOUBLE_EQ(std::stod(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY)), 400000); } } /* namespace ccapi */ #endif diff --git a/test/test_unit/src/execution_management/kraken/test.cpp b/test/test_unit/src/execution_management/kraken/test.cpp index f16b503f..ae4bf074 100644 --- a/test/test_unit/src/execution_management/kraken/test.cpp +++ b/test/test_unit/src/execution_management/kraken/test.cpp @@ -236,7 +236,7 @@ TEST_F(ExecutionManagementServiceKrakenTest, convertTextMessageToMessageRestGetO EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_LIMIT_PRICE), "37500.0"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_QUANTITY), "1.25000000"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY), "1.25000000"); - EXPECT_DOUBLE_EQ(std::stod(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY)), 30021.0 * 1.25000000); + EXPECT_DOUBLE_EQ(std::stod(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY)), 30021.0 * 1.25000000); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_STATUS), "closed"); } @@ -414,7 +414,7 @@ TEST_F(ExecutionManagementServiceKrakenTest, verifyconvertTextMessageToMessageRe EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_QUANTITY), "1.25000000"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_LIMIT_PRICE), "30010.0"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY), "0.37500000"); - EXPECT_DOUBLE_EQ(std::stod(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY)), 0.37500000 * 30010.0); + EXPECT_DOUBLE_EQ(std::stod(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUOTE_QUANTITY)), 0.37500000 * 30010.0); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_INSTRUMENT), "XBTUSD"); } @@ -688,7 +688,7 @@ TEST_F(ExecutionManagementServiceKrakenTest, createEventOwnTrades) { #ifdef CCAPI_LEGACY_USE_WEBSOCKETPP auto messageList = this->service->createEvent(WsConnection(), wspp::lib::weak_ptr(), subscription, textMessage, document, this->now).getMessageList(); #else - auto messageList = this->service->createEvent(std::shared_ptr(), subscription, textMessage, document, this->now).getMessageList(); + auto messageList = this->service->createEvent(std::make_shared(), subscription, textMessage, document, this->now).getMessageList(); #endif EXPECT_EQ(messageList.size(), 3); verifyCorrelationId(messageList, subscription.getCorrelationId()); @@ -837,7 +837,7 @@ TEST_F(ExecutionManagementServiceKrakenTest, createEventOpenOrders) { #ifdef CCAPI_LEGACY_USE_WEBSOCKETPP auto messageList = this->service->createEvent(WsConnection(), wspp::lib::weak_ptr(), subscription, textMessage, document, this->now).getMessageList(); #else - auto messageList = this->service->createEvent(std::shared_ptr(), subscription, textMessage, document, this->now).getMessageList(); + auto messageList = this->service->createEvent(std::make_shared(), subscription, textMessage, document, this->now).getMessageList(); #endif EXPECT_EQ(messageList.size(), 1); verifyCorrelationId(messageList, subscription.getCorrelationId()); diff --git a/test/test_unit/src/execution_management/kraken_futures/test.cpp b/test/test_unit/src/execution_management/kraken_futures/test.cpp index 0a468cb9..d8bed221 100644 --- a/test/test_unit/src/execution_management/kraken_futures/test.cpp +++ b/test/test_unit/src/execution_management/kraken_futures/test.cpp @@ -443,7 +443,7 @@ TEST_F(ExecutionManagementServiceKrakenFuturesTest, createEventFills) { #ifdef CCAPI_LEGACY_USE_WEBSOCKETPP auto messageList = this->service->createEvent(WsConnection(), wspp::lib::weak_ptr(), subscription, textMessage, document, this->now).getMessageList(); #else - auto messageList = this->service->createEvent(std::shared_ptr(), subscription, textMessage, document, this->now).getMessageList(); + auto messageList = this->service->createEvent(std::make_shared(), subscription, textMessage, document, this->now).getMessageList(); #endif EXPECT_EQ(messageList.size(), 1); verifyCorrelationId(messageList, subscription.getCorrelationId()); @@ -490,7 +490,7 @@ TEST_F(ExecutionManagementServiceKrakenFuturesTest, createEventOpenOrders) { #ifdef CCAPI_LEGACY_USE_WEBSOCKETPP auto messageList = this->service->createEvent(WsConnection(), wspp::lib::weak_ptr(), subscription, textMessage, document, this->now).getMessageList(); #else - auto messageList = this->service->createEvent(std::shared_ptr(), subscription, textMessage, document, this->now).getMessageList(); + auto messageList = this->service->createEvent(std::make_shared(), subscription, textMessage, document, this->now).getMessageList(); #endif EXPECT_EQ(messageList.size(), 1); verifyCorrelationId(messageList, subscription.getCorrelationId()); diff --git a/test/test_unit/src/execution_management/kucoin/test.cpp b/test/test_unit/src/execution_management/kucoin/test.cpp index 7b786110..e85374eb 100644 --- a/test/test_unit/src/execution_management/kucoin/test.cpp +++ b/test/test_unit/src/execution_management/kucoin/test.cpp @@ -486,7 +486,7 @@ TEST_F(ExecutionManagementServiceKucoinTest, createEventOpen) { #ifdef CCAPI_LEGACY_USE_WEBSOCKETPP auto messageList = this->service->createEvent(WsConnection(), wspp::lib::weak_ptr(), subscription, textMessage, document, this->now).getMessageList(); #else - auto messageList = this->service->createEvent(std::shared_ptr(), subscription, textMessage, document, this->now).getMessageList(); + auto messageList = this->service->createEvent(std::make_shared(), subscription, textMessage, document, this->now).getMessageList(); #endif EXPECT_EQ(messageList.size(), 1); verifyCorrelationId(messageList, subscription.getCorrelationId()); @@ -539,7 +539,7 @@ TEST_F(ExecutionManagementServiceKucoinTest, createEventMatch) { #ifdef CCAPI_LEGACY_USE_WEBSOCKETPP auto messageList = this->service->createEvent(WsConnection(), wspp::lib::weak_ptr(), subscription, textMessage, document, this->now).getMessageList(); #else - auto messageList = this->service->createEvent(std::shared_ptr(), subscription, textMessage, document, this->now).getMessageList(); + auto messageList = this->service->createEvent(std::make_shared(), subscription, textMessage, document, this->now).getMessageList(); #endif EXPECT_EQ(messageList.size(), 1); verifyCorrelationId(messageList, subscription.getCorrelationId()); @@ -587,7 +587,7 @@ TEST_F(ExecutionManagementServiceKucoinTest, createEventFilled) { #ifdef CCAPI_LEGACY_USE_WEBSOCKETPP auto messageList = this->service->createEvent(WsConnection(), wspp::lib::weak_ptr(), subscription, textMessage, document, this->now).getMessageList(); #else - auto messageList = this->service->createEvent(std::shared_ptr(), subscription, textMessage, document, this->now).getMessageList(); + auto messageList = this->service->createEvent(std::make_shared(), subscription, textMessage, document, this->now).getMessageList(); #endif EXPECT_EQ(messageList.size(), 1); verifyCorrelationId(messageList, subscription.getCorrelationId()); @@ -636,7 +636,7 @@ TEST_F(ExecutionManagementServiceKucoinTest, createEventCanceled) { #ifdef CCAPI_LEGACY_USE_WEBSOCKETPP auto messageList = this->service->createEvent(WsConnection(), wspp::lib::weak_ptr(), subscription, textMessage, document, this->now).getMessageList(); #else - auto messageList = this->service->createEvent(std::shared_ptr(), subscription, textMessage, document, this->now).getMessageList(); + auto messageList = this->service->createEvent(std::make_shared(), subscription, textMessage, document, this->now).getMessageList(); #endif EXPECT_EQ(messageList.size(), 1); verifyCorrelationId(messageList, subscription.getCorrelationId()); @@ -686,7 +686,7 @@ TEST_F(ExecutionManagementServiceKucoinTest, createEventChange) { #ifdef CCAPI_LEGACY_USE_WEBSOCKETPP auto messageList = this->service->createEvent(WsConnection(), wspp::lib::weak_ptr(), subscription, textMessage, document, this->now).getMessageList(); #else - auto messageList = this->service->createEvent(std::shared_ptr(), subscription, textMessage, document, this->now).getMessageList(); + auto messageList = this->service->createEvent(std::make_shared(), subscription, textMessage, document, this->now).getMessageList(); #endif EXPECT_EQ(messageList.size(), 1); verifyCorrelationId(messageList, subscription.getCorrelationId()); diff --git a/test/test_unit/src/execution_management/okx/test.cpp b/test/test_unit/src/execution_management/okx/test.cpp index 72fe44ef..62eadd1e 100644 --- a/test/test_unit/src/execution_management/okx/test.cpp +++ b/test/test_unit/src/execution_management/okx/test.cpp @@ -259,7 +259,6 @@ TEST_F(ExecutionManagementServiceOkxTest, convertTextMessageToMessageRestGetOrde EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_SIDE), CCAPI_EM_ORDER_SIDE_BUY); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_QUANTITY), "323"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY), "3"); - EXPECT_DOUBLE_EQ(std::stod(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY)), 6); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_STATUS), "live"); } @@ -344,7 +343,6 @@ void verifyconvertTextMessageToMessageRestGetOpenOrders(const ExecutionManagemen EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_QUANTITY), "3"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_LIMIT_PRICE), "999"); EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_QUANTITY), "323"); - EXPECT_EQ(std::stod(element.getValue(CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_QUANTITY)), 0); if (!isOneInstrument) { EXPECT_EQ(element.getValue(CCAPI_EM_ORDER_INSTRUMENT), "BTC-USDT"); }