Skip to content

Commit

Permalink
Merge pull request #444 from crypto-chassis/develop
Browse files Browse the repository at this point in the history
Release
  • Loading branch information
cryptochassis committed Oct 23, 2023
2 parents 5cc7014 + b4b4b79 commit 96b45c1
Show file tree
Hide file tree
Showing 21 changed files with 117 additions and 68 deletions.
6 changes: 6 additions & 0 deletions include/ccapi_cpp/ccapi_macro.h
Expand Up @@ -244,6 +244,9 @@
#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
Expand Down Expand Up @@ -439,6 +442,9 @@
#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
Expand Down
13 changes: 13 additions & 0 deletions include/ccapi_cpp/ccapi_util_private.h
Expand Up @@ -403,6 +403,19 @@ class UtilTime CCAPI_FINAL {
return std::make_pair(std::stoll(milliseconds), 0);
}
}
static std::string convertMillisecondsStrToSecondsStr(const std::string& milliseconds) {
std::string output;
if (milliseconds.length() >= 4) {
output = milliseconds;
output.insert(milliseconds.length() - 3, 1, '.');
} else {
output = "0.";
output += std::string(3 - milliseconds.length(), '0');
output += milliseconds;
output = UtilString::normalizeDecimalString(output);
}
return output;
}
static std::pair<long long, long long> divideNanoWhole(const std::string& nanoseconds) {
return std::make_pair(std::stoll(nanoseconds.substr(0, nanoseconds.length() - 9)), std::stoll(nanoseconds.substr(nanoseconds.length() - 9)));
}
Expand Down
10 changes: 7 additions & 3 deletions include/ccapi_cpp/service/ccapi_execution_management_service.h
Expand Up @@ -164,8 +164,8 @@ class ExecutionManagementService : public Service {
this->eventHandler(event, eventQueuePtr);
}
}
virtual void extractOrderInfo(Element& element, const rj::Value& x,
const std::map<std::string, std::pair<std::string, JsonDataType> >& extractionFieldNameMap) {
virtual void extractOrderInfo(Element& element, const rj::Value& x, const std::map<std::string, std::pair<std::string, JsonDataType>>& extractionFieldNameMap,
const std::map<std::string, std::function<std::string(const std::string&)>> conversionMap = {}) {
for (const auto& y : extractionFieldNameMap) {
auto it = x.FindMember(y.second.first.c_str());
if (it != x.MemberEnd() && !it->value.IsNull()) {
Expand All @@ -176,6 +176,10 @@ class ExecutionManagementService : public Service {
if (y.first == CCAPI_EM_ORDER_SIDE) {
value = UtilString::toLower(value).rfind("buy", 0) == 0 ? CCAPI_EM_ORDER_SIDE_BUY : CCAPI_EM_ORDER_SIDE_SELL;
}
auto it2 = conversionMap.find(y.first);
if (it2 != conversionMap.end()) {
value = it2->second(value);
}
element.insert(y.first, value);
}
}
Expand Down Expand Up @@ -393,7 +397,7 @@ class ExecutionManagementService : public Service {
#ifdef CCAPI_LEGACY_USE_WEBSOCKETPP
std::map<std::string, WsConnection> wsConnectionByCorrelationIdMap;
#else
std::map<std::string, std::shared_ptr<WsConnection> >
std::map<std::string, std::shared_ptr<WsConnection>>
wsConnectionByCorrelationIdMap; // TODO(cryptochassis): for consistency, to be renamed to wsConnectionPtrByCorrelationIdMap
#endif
std::map<std::string, int> wsRequestIdByConnectionIdMap;
Expand Down
Expand Up @@ -288,7 +288,7 @@ class ExecutionManagementServiceAscendex : public ExecutionManagementService {
this->extractOrderInfoFromRequest(elementList, document);
}
void extractOrderInfoFromRequest(std::vector<Element>& elementList, const rj::Value& value) {
const std::map<std::string, std::pair<std::string, JsonDataType> >& extractionFieldNameMap = {
const std::map<std::string, std::pair<std::string, JsonDataType>>& extractionFieldNameMap = {
{CCAPI_EM_ORDER_ID, std::make_pair("orderId", JsonDataType::STRING)},
{CCAPI_EM_CLIENT_ORDER_ID, std::make_pair("id", JsonDataType::STRING)},
{CCAPI_EM_ORDER_SIDE, std::make_pair("side", JsonDataType::STRING)},
Expand Down Expand Up @@ -337,8 +337,8 @@ class ExecutionManagementServiceAscendex : public ExecutionManagementService {
CCAPI_LOGGER_FATAL(CCAPI_UNSUPPORTED_VALUE);
}
}
void extractOrderInfo(Element& element, const rj::Value& x,
const std::map<std::string, std::pair<std::string, JsonDataType> >& extractionFieldNameMap) override {
void extractOrderInfo(Element& element, const rj::Value& x, const std::map<std::string, std::pair<std::string, JsonDataType>>& extractionFieldNameMap,
const std::map<std::string, std::function<std::string(const std::string&)>> conversionMap = {}) override {
ExecutionManagementService::extractOrderInfo(element, x, extractionFieldNameMap);
{
auto it1 = x.FindMember("cumFilledQty");
Expand Down Expand Up @@ -477,7 +477,7 @@ class ExecutionManagementServiceAscendex : public ExecutionManagementService {
message.setTime(TimePoint(std::chrono::milliseconds(std::stoll(data["t"].GetString()))));
if (fieldSet.find(CCAPI_EM_ORDER_UPDATE) != fieldSet.end()) {
message.setType(Message::Type::EXECUTION_MANAGEMENT_EVENTS_ORDER_UPDATE);
const std::map<std::string, std::pair<std::string, JsonDataType> >& extractionFieldNameMap = {
const std::map<std::string, std::pair<std::string, JsonDataType>>& extractionFieldNameMap = {
{CCAPI_EM_ORDER_ID, std::make_pair("orderId", JsonDataType::INTEGER)},
{CCAPI_EM_ORDER_SIDE, std::make_pair("sd", JsonDataType::STRING)},
{CCAPI_EM_ORDER_LIMIT_PRICE, std::make_pair("p", JsonDataType::STRING)},
Expand Down
Expand Up @@ -446,6 +446,7 @@ class ExecutionManagementServiceBinanceBase : public ExecutionManagementService
{CCAPI_EM_ORDER_CUMULATIVE_FILLED_PRICE_TIMES_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)},
};
if (operation == Request::Operation::CANCEL_ORDER || operation == Request::Operation::CANCEL_OPEN_ORDERS) {
extractionFieldNameMap.insert({CCAPI_EM_CLIENT_ORDER_ID, std::make_pair("origClientOrderId", JsonDataType::STRING)});
Expand All @@ -454,12 +455,20 @@ class ExecutionManagementServiceBinanceBase : public ExecutionManagementService
}
if (document.IsObject()) {
Element element;
this->extractOrderInfo(element, document, extractionFieldNameMap);
this->extractOrderInfo(
element, document, extractionFieldNameMap,
{
{CCAPI_LAST_UPDATED_TIME_SECONDS, [](const std::string& input) { return UtilTime::convertMillisecondsStrToSecondsStr(input); }},
});
elementList.emplace_back(std::move(element));
} else {
for (const auto& x : document.GetArray()) {
Element element;
this->extractOrderInfo(element, x, extractionFieldNameMap);
this->extractOrderInfo(
element, x, extractionFieldNameMap,
{
{CCAPI_LAST_UPDATED_TIME_SECONDS, [](const std::string& input) { return UtilTime::convertMillisecondsStrToSecondsStr(input); }},
});
elementList.emplace_back(std::move(element));
}
}
Expand All @@ -475,6 +484,9 @@ class ExecutionManagementServiceBinanceBase : public ExecutionManagementService
element.insert(CCAPI_EM_ASSET, x["asset"].GetString());
element.insert(CCAPI_EM_QUANTITY_TOTAL, x["walletBalance"].GetString());
element.insert(CCAPI_EM_QUANTITY_AVAILABLE_FOR_TRADING, x["availableBalance"].GetString());
if (this->isDerivatives) {
element.insert(CCAPI_LAST_UPDATED_TIME_SECONDS, UtilTime::convertMillisecondsStrToSecondsStr(x["updateTime"].GetString()));
}
elementList.emplace_back(std::move(element));
}
} else {
Expand Down
Expand Up @@ -46,6 +46,7 @@ class ExecutionManagementServiceBinanceDerivativesBase : public ExecutionManagem
element.insert(CCAPI_EM_POSITION_ENTRY_PRICE, x["entryPrice"].GetString());
element.insert(CCAPI_EM_POSITION_LEVERAGE, x["leverage"].GetString());
element.insert(CCAPI_EM_UNREALIZED_PNL, x["unrealizedProfit"].GetString());
element.insert(CCAPI_LAST_UPDATED_TIME_SECONDS, UtilTime::convertMillisecondsStrToSecondsStr(x["updateTime"].GetString()));
elementList.emplace_back(std::move(element));
}
} break;
Expand Down
Expand Up @@ -167,7 +167,7 @@ class ExecutionManagementServiceBitget : public ExecutionManagementServiceBitget
}
void extractOrderInfoFromRequest(std::vector<Element>& elementList, const Request& request, const Request::Operation operation,
const rj::Document& document) override {
const std::map<std::string, std::pair<std::string, JsonDataType> >& extractionFieldNameMap = {
const std::map<std::string, std::pair<std::string, JsonDataType>>& extractionFieldNameMap = {
{CCAPI_EM_ORDER_ID, std::make_pair("orderId", JsonDataType::STRING)},
{CCAPI_EM_CLIENT_ORDER_ID, std::make_pair("clientOrderId", JsonDataType::STRING)},
{CCAPI_EM_ORDER_SIDE, std::make_pair("side", JsonDataType::STRING)},
Expand Down Expand Up @@ -211,8 +211,8 @@ class ExecutionManagementServiceBitget : public ExecutionManagementServiceBitget
CCAPI_LOGGER_FATAL(CCAPI_UNSUPPORTED_VALUE);
}
}
void extractOrderInfo(Element& element, const rj::Value& x,
const std::map<std::string, std::pair<std::string, JsonDataType> >& extractionFieldNameMap) override {
void extractOrderInfo(Element& element, const rj::Value& x, const std::map<std::string, std::pair<std::string, JsonDataType>>& extractionFieldNameMap,
const std::map<std::string, std::function<std::string(const std::string&)>> conversionMap = {}) override {
ExecutionManagementService::extractOrderInfo(element, x, extractionFieldNameMap);
{
auto it1 = x.FindMember("accFillSz");
Expand Down Expand Up @@ -365,7 +365,7 @@ Event createEvent(const Subscription& subscription, const std::string& textMessa
message.setCorrelationIdList({subscription.getCorrelationId()});
message.setTime(UtilTime::makeTimePointFromMilliseconds(std::stoll(std::string(x["uTime"].GetString()))));
message.setType(Message::Type::EXECUTION_MANAGEMENT_EVENTS_ORDER_UPDATE);
const std::map<std::string, std::pair<std::string, JsonDataType> >& extractionFieldNameMap = {
const std::map<std::string, std::pair<std::string, JsonDataType>>& extractionFieldNameMap = {
{CCAPI_EM_ORDER_ID, std::make_pair("ordId", JsonDataType::STRING)},
{CCAPI_EM_CLIENT_ORDER_ID, std::make_pair("clOrdId", JsonDataType::STRING)},
{CCAPI_EM_ORDER_SIDE, std::make_pair("side", JsonDataType::STRING)},
Expand Down
Expand Up @@ -213,7 +213,7 @@ class ExecutionManagementServiceBitgetFutures : public ExecutionManagementServic
}
void extractOrderInfoFromRequest(std::vector<Element>& elementList, const Request& request, const Request::Operation operation,
const rj::Document& document) override {
const std::map<std::string, std::pair<std::string, JsonDataType> >& extractionFieldNameMap = {
const std::map<std::string, std::pair<std::string, JsonDataType>>& extractionFieldNameMap = {
{CCAPI_EM_ORDER_ID, std::make_pair("orderId", JsonDataType::STRING)},
{CCAPI_EM_CLIENT_ORDER_ID, std::make_pair("clientOid", JsonDataType::STRING)},
{CCAPI_EM_ORDER_SIDE, std::make_pair("side", JsonDataType::STRING)},
Expand Down Expand Up @@ -266,8 +266,8 @@ class ExecutionManagementServiceBitgetFutures : public ExecutionManagementServic
CCAPI_LOGGER_FATAL(CCAPI_UNSUPPORTED_VALUE);
}
}
void extractOrderInfo(Element& element, const rj::Value& x,
const std::map<std::string, std::pair<std::string, JsonDataType> >& extractionFieldNameMap) override {
void extractOrderInfo(Element& element, const rj::Value& x, const std::map<std::string, std::pair<std::string, JsonDataType>>& extractionFieldNameMap,
const std::map<std::string, std::function<std::string(const std::string&)>> conversionMap = {}) override {
ExecutionManagementService::extractOrderInfo(element, x, extractionFieldNameMap);
{
auto it1 = x.FindMember("accFillSz");
Expand Down Expand Up @@ -429,7 +429,7 @@ class ExecutionManagementServiceBitgetFutures : public ExecutionManagementServic
message.setCorrelationIdList({subscription.getCorrelationId()});
message.setTime(UtilTime::makeTimePointFromMilliseconds(std::stoll(std::string(x["uTime"].GetString()))));
message.setType(Message::Type::EXECUTION_MANAGEMENT_EVENTS_ORDER_UPDATE);
const std::map<std::string, std::pair<std::string, JsonDataType> >& extractionFieldNameMap = {
const std::map<std::string, std::pair<std::string, JsonDataType>>& extractionFieldNameMap = {
{CCAPI_EM_ORDER_ID, std::make_pair("ordId", JsonDataType::STRING)},
{CCAPI_EM_CLIENT_ORDER_ID, std::make_pair("clOrdId", JsonDataType::STRING)},
{CCAPI_EM_ORDER_SIDE, std::make_pair("side", JsonDataType::STRING)},
Expand Down
Expand Up @@ -224,7 +224,7 @@ class ExecutionManagementServiceBitmex : public ExecutionManagementService {
}
void extractOrderInfoFromRequest(std::vector<Element>& elementList, const Request& request, const Request::Operation operation,
const rj::Document& document) override {
const std::map<std::string, std::pair<std::string, JsonDataType> >& extractionFieldNameMap = {
const std::map<std::string, std::pair<std::string, JsonDataType>>& extractionFieldNameMap = {
{CCAPI_EM_ORDER_ID, std::make_pair("orderID", JsonDataType::STRING)},
{CCAPI_EM_CLIENT_ORDER_ID, std::make_pair("clOrdID", JsonDataType::STRING)},
{CCAPI_EM_ORDER_SIDE, std::make_pair("side", JsonDataType::STRING)},
Expand Down Expand Up @@ -272,8 +272,8 @@ class ExecutionManagementServiceBitmex : public ExecutionManagementService {
CCAPI_LOGGER_FATAL(CCAPI_UNSUPPORTED_VALUE);
}
}
void extractOrderInfo(Element& element, const rj::Value& x,
const std::map<std::string, std::pair<std::string, JsonDataType> >& extractionFieldNameMap) override {
void extractOrderInfo(Element& element, const rj::Value& x, const std::map<std::string, std::pair<std::string, JsonDataType>>& extractionFieldNameMap,
const std::map<std::string, std::function<std::string(const std::string&)>> conversionMap = {}) override {
ExecutionManagementService::extractOrderInfo(element, x, extractionFieldNameMap);
{
auto it1 = x.FindMember("cumQty");
Expand Down Expand Up @@ -448,7 +448,7 @@ class ExecutionManagementServiceBitmex : public ExecutionManagementService {
}
} else if (table == "order" && fieldSet.find(CCAPI_EM_ORDER_UPDATE) != fieldSet.end()) {
message.setType(Message::Type::EXECUTION_MANAGEMENT_EVENTS_ORDER_UPDATE);
const std::map<std::string, std::pair<std::string, JsonDataType> >& extractionFieldNameMap = {
const std::map<std::string, std::pair<std::string, JsonDataType>>& extractionFieldNameMap = {
{CCAPI_EM_ORDER_ID, std::make_pair("orderID", JsonDataType::STRING)},
{CCAPI_EM_CLIENT_ORDER_ID, std::make_pair("clOrdID", JsonDataType::STRING)},
{CCAPI_EM_ORDER_SIDE, std::make_pair("side", JsonDataType::STRING)},
Expand Down
Expand Up @@ -204,8 +204,8 @@ class ExecutionManagementServiceBitstamp : public ExecutionManagementService {
this->convertRequestForRestCustom(req, request, now, symbolId, credential);
}
}
void extractOrderInfo(Element& element, const rj::Value& x,
const std::map<std::string, std::pair<std::string, JsonDataType>>& extractionFieldNameMap) override {
void extractOrderInfo(Element& element, const rj::Value& x, const std::map<std::string, std::pair<std::string, JsonDataType>>& extractionFieldNameMap,
const std::map<std::string, std::function<std::string(const std::string&)>> conversionMap = {}) override {
ExecutionManagementService::extractOrderInfo(element, x, extractionFieldNameMap);
{
auto it1 = x.FindMember("type");
Expand Down
Expand Up @@ -198,6 +198,7 @@ class ExecutionManagementServiceBybitDerivatives : public ExecutionManagementSer
{CCAPI_EM_ORDER_REMAINING_QUANTITY, std::make_pair("leavesQty", JsonDataType::STRING)},
{CCAPI_EM_ORDER_STATUS, std::make_pair("orderStatus", JsonDataType::STRING)},
{CCAPI_EM_ORDER_INSTRUMENT, std::make_pair("symbol", JsonDataType::STRING)},
{CCAPI_EM_ORDER_CUMULATIVE_FEE_QUANTITY, std::make_pair("cumExecFee", JsonDataType::STRING)},
};
if (operation == Request::Operation::GET_ORDER || operation == Request::Operation::GET_OPEN_ORDERS || operation == Request::Operation::CANCEL_OPEN_ORDERS) {
for (const auto& x : document["result"]["list"].GetArray()) {
Expand Down
Expand Up @@ -315,8 +315,8 @@ class ExecutionManagementServiceDeribit : public ExecutionManagementService {
CCAPI_LOGGER_FATAL(CCAPI_UNSUPPORTED_VALUE);
}
}
void extractOrderInfo(Element& element, const rj::Value& x,
const std::map<std::string, std::pair<std::string, JsonDataType>>& extractionFieldNameMap) override {
void extractOrderInfo(Element& element, const rj::Value& x, const std::map<std::string, std::pair<std::string, JsonDataType>>& extractionFieldNameMap,
const std::map<std::string, std::function<std::string(const std::string&)>> conversionMap = {}) override {
ExecutionManagementService::extractOrderInfo(element, x, extractionFieldNameMap);
{
auto it1 = x.FindMember("filled_amount");
Expand Down
Expand Up @@ -192,7 +192,7 @@ class ExecutionManagementServiceErisx : public ExecutionManagementService {
}
void extractOrderInfoFromRequest(std::vector<Element>& elementList, const Request& request, const Request::Operation operation,
const rj::Document& document) override {
const std::map<std::string, std::pair<std::string, JsonDataType> >& extractionFieldNameMap = {
const std::map<std::string, std::pair<std::string, JsonDataType>>& extractionFieldNameMap = {
{CCAPI_EM_ORDER_ID, std::make_pair("orderID", JsonDataType::STRING)},
{CCAPI_EM_CLIENT_ORDER_ID, std::make_pair("clOrdID", JsonDataType::STRING)},
{CCAPI_EM_ORDER_SIDE, std::make_pair("side", JsonDataType::STRING)},
Expand Down Expand Up @@ -221,8 +221,8 @@ class ExecutionManagementServiceErisx : public ExecutionManagementService {
}
void extractAccountInfoFromRequest(std::vector<Element>& elementList, const Request& request, const Request::Operation operation,
const rj::Document& document) override {}
void extractOrderInfo(Element& element, const rj::Value& x,
const std::map<std::string, std::pair<std::string, JsonDataType> >& extractionFieldNameMap) override {
void extractOrderInfo(Element& element, const rj::Value& x, const std::map<std::string, std::pair<std::string, JsonDataType>>& extractionFieldNameMap,
const std::map<std::string, std::function<std::string(const std::string&)>> conversionMap = {}) override {
ExecutionManagementService::extractOrderInfo(element, x, extractionFieldNameMap);
{
auto it1 = x.FindMember("cumQty");
Expand Down

0 comments on commit 96b45c1

Please sign in to comment.