Skip to content

Commit

Permalink
Merge pull request #381 from crypto-chassis/develop
Browse files Browse the repository at this point in the history
Release
  • Loading branch information
cryptochassis authored Apr 17, 2023
2 parents 477bada + d7d8fc1 commit 980782e
Show file tree
Hide file tree
Showing 5 changed files with 66 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ class ExecutionManagementServiceBybit : public ExecutionManagementServiceBybitBa
this->cancelOrderTarget = "/spot/v3/private/cancel-order";
this->getOrderTarget = "/spot/v3/private/order";
this->getOpenOrdersTarget = "/spot/v3/private/open-orders";
this->cancelOpenOrdersTarget = "/spot/v3/private/cancel-orders";
this->getAccountBalancesTarget = "/spot/v3/private/account";
}
virtual ~ExecutionManagementServiceBybit() {}
Expand Down Expand Up @@ -85,7 +86,7 @@ class ExecutionManagementServiceBybit : public ExecutionManagementServiceBybitBa
document.AddMember("orderType", rj::Value("LIMIT").Move(), allocator);
}
if (!symbolId.empty()) {
this->appendSymbolId(document, allocator, symbolId);
this->appendSymbolId(document, allocator, symbolId, "symbol");
}
rj::StringBuffer stringBuffer;
rj::Writer<rj::StringBuffer> writer(stringBuffer);
Expand Down Expand Up @@ -126,11 +127,31 @@ class ExecutionManagementServiceBybit : public ExecutionManagementServiceBybitBa
const std::map<std::string, std::string> param = request.getFirstParamWithDefault();
this->appendParamToQueryString(queryString, param);
if (!symbolId.empty()) {
this->appendSymbolId(queryString, symbolId);
this->appendSymbolId(queryString, symbolId, "symbol");
}
req.target(this->getOpenOrdersTarget + "?" + queryString);
this->signRequest(req, queryString, now, credential);
} break;
case Request::Operation::CANCEL_OPEN_ORDERS: {
req.method(http::verb::post);
req.set(beast::http::field::content_type, "application/json");
const std::map<std::string, std::string> param = request.getFirstParamWithDefault();
req.target(this->cancelOpenOrdersTarget);
rj::Document document;
document.SetObject();
rj::Document::AllocatorType& allocator = document.GetAllocator();
this->appendParam(document, allocator, param);
if (!symbolId.empty()) {
this->appendSymbolId(document, allocator, symbolId, "symbol");
}
rj::StringBuffer stringBuffer;
rj::Writer<rj::StringBuffer> writer(stringBuffer);
document.Accept(writer);
auto body = stringBuffer.GetString();
req.body() = body;
req.prepare_payload();
this->signRequest(req, body, now, credential);
} break;
case Request::Operation::GET_ACCOUNT_BALANCES: {
req.method(http::verb::get);
std::string queryString;
Expand Down Expand Up @@ -161,7 +182,7 @@ class ExecutionManagementServiceBybit : public ExecutionManagementServiceBybitBa
this->extractOrderInfo(element, x, extractionFieldNameMap);
elementList.emplace_back(std::move(element));
}
} else {
} else if (operation != Request::Operation::CANCEL_OPEN_ORDERS) {
Element element;
this->extractOrderInfo(element, document["result"], extractionFieldNameMap);
elementList.emplace_back(std::move(element));
Expand Down Expand Up @@ -198,14 +219,15 @@ class ExecutionManagementServiceBybit : public ExecutionManagementServiceBybitBa
event.setType(Event::Type::SUBSCRIPTION_DATA);
const rj::Value& data = document["data"];
for (const auto& x : data.GetArray()) {
Message message;
message.setTimeReceived(timeReceived);
message.setCorrelationIdList({subscription.getCorrelationId()});
std::string instrument = x["s"].GetString();
if (instrumentSet.empty() || instrumentSet.find(instrument) != instrumentSet.end()) {
message.setTime(TimePoint(std::chrono::milliseconds(std::stoll(x["E"].GetString()))));
auto time = TimePoint(std::chrono::milliseconds(std::stoll(x["E"].GetString())));
auto itTradeId = x.FindMember("t");
if (itTradeId != x.MemberEnd() && !itTradeId->value.IsNull() && fieldSet.find(CCAPI_EM_PRIVATE_TRADE) != fieldSet.end()) {
Message message;
message.setTimeReceived(timeReceived);
message.setCorrelationIdList({subscription.getCorrelationId()});
message.setTime(time);
message.setType(Message::Type::EXECUTION_MANAGEMENT_EVENTS_PRIVATE_TRADE);
std::vector<Element> elementList;
Element element;
Expand Down Expand Up @@ -233,6 +255,10 @@ class ExecutionManagementServiceBybit : public ExecutionManagementServiceBybitBa
messageList.emplace_back(std::move(message));
}
if (fieldSet.find(CCAPI_EM_ORDER_UPDATE) != fieldSet.end()) {
Message message;
message.setTimeReceived(timeReceived);
message.setCorrelationIdList({subscription.getCorrelationId()});
message.setTime(time);
message.setType(Message::Type::EXECUTION_MANAGEMENT_EVENTS_ORDER_UPDATE);
const std::map<std::string, std::pair<std::string, JsonDataType> >& extractionFieldNameMap = {
{CCAPI_EM_ORDER_ID, std::make_pair("i", JsonDataType::INTEGER)},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,14 +54,14 @@ class ExecutionManagementServiceBybitBase : public ExecutionManagementService {
queryString += "&";
}
}
void appendSymbolId(std::string& queryString, const std::string& symbolId) {
queryString += "symbol=";
queryString += Url::urlEncode(symbolId);
queryString += "&";
}
void appendSymbolId(rj::Value& rjValue, rj::Document::AllocatorType& allocator, const std::string& symbolId) {
rjValue.AddMember("symbol", rj::Value(symbolId.c_str(), allocator).Move(), allocator);
}
// void appendSymbolId(std::string& queryString, const std::string& symbolId) {
// queryString += "symbol=";
// queryString += Url::urlEncode(symbolId);
// queryString += "&";
// }
// void appendSymbolId(rj::Value& rjValue, rj::Document::AllocatorType& allocator, const std::string& symbolId) {
// rjValue.AddMember("symbol", rj::Value(symbolId.c_str(), allocator).Move(), allocator);
// }
void prepareReq(http::request<http::string_body>& req, const TimePoint& now, const std::map<std::string, std::string>& credential) {
auto apiKey = mapGetWithDefault(credential, this->apiKeyName);
req.set("X-BAPI-SIGN-TYPE", "2");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ class ExecutionManagementServiceBybitDerivatives : public ExecutionManagementSer
document.AddMember("orderType", rj::Value("Limit").Move(), allocator);
}
if (!symbolId.empty()) {
this->appendSymbolId(document, allocator, symbolId);
this->appendSymbolId(document, allocator, symbolId, "symbol");
}
rj::StringBuffer stringBuffer;
rj::Writer<rj::StringBuffer> writer(stringBuffer);
Expand All @@ -107,7 +107,7 @@ class ExecutionManagementServiceBybitDerivatives : public ExecutionManagementSer
document.SetObject();
rj::Document::AllocatorType& allocator = document.GetAllocator();
this->appendParam(document, allocator, param);
this->appendSymbolId(document, allocator, symbolId);
this->appendSymbolId(document, allocator, symbolId, "symbol");
rj::StringBuffer stringBuffer;
rj::Writer<rj::StringBuffer> writer(stringBuffer);
document.Accept(writer);
Expand Down Expand Up @@ -142,7 +142,7 @@ class ExecutionManagementServiceBybitDerivatives : public ExecutionManagementSer
{CCAPI_INSTRUMENT_TYPE, "category"},
});
if (!symbolId.empty()) {
this->appendSymbolId(queryString, symbolId);
this->appendSymbolId(queryString, symbolId, "symbol");
}
req.target(this->getOpenOrdersTarget + "?" + queryString);
this->signRequest(req, queryString, now, credential);
Expand All @@ -157,7 +157,7 @@ class ExecutionManagementServiceBybitDerivatives : public ExecutionManagementSer
rj::Document::AllocatorType& allocator = document.GetAllocator();
this->appendParam(document, allocator, param);
if (!symbolId.empty()) {
this->appendSymbolId(document, allocator, symbolId);
this->appendSymbolId(document, allocator, symbolId, "symbol");
}
rj::StringBuffer stringBuffer;
rj::Writer<rj::StringBuffer> writer(stringBuffer);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -200,19 +200,17 @@ class ExecutionManagementServiceKucoinBase : public ExecutionManagementService {
std::string id = useOrderId ? param.at(CCAPI_EM_ORDER_ID)
: param.find(CCAPI_EM_CLIENT_ORDER_ID) != param.end() ? param.at(CCAPI_EM_CLIENT_ORDER_ID)
: "";
auto target =
std::regex_replace(useOrderId ? this->getOrderTarget : this->getOrderByClientOrderIdTarget, std::regex("<id>"), Url::urlEncode(id));
auto target = std::regex_replace(useOrderId ? this->getOrderTarget : this->getOrderByClientOrderIdTarget, std::regex("<id>"), Url::urlEncode(id));
req.target(target);
this->signRequest(req, "", credential);
} break;
case Request::Operation::GET_OPEN_ORDERS: {
req.method(http::verb::get);
auto target = this->getOpenOrdersTarget;
target += "?status=active";
target += std::string("&tradeType=") +
(request.getMarginType() == CCAPI_EM_MARGIN_TYPE_CROSS_MARGIN ? "MARGIN_TRADE"
: request.getMarginType() == CCAPI_EM_MARGIN_TYPE_ISOLATED_MARGIN ? "MARGIN_ISOLATED_TRADE"
: "TRADE");
target += std::string("&tradeType=") + (request.getMarginType() == CCAPI_EM_MARGIN_TYPE_CROSS_MARGIN ? "MARGIN_TRADE"
: request.getMarginType() == CCAPI_EM_MARGIN_TYPE_ISOLATED_MARGIN ? "MARGIN_ISOLATED_TRADE"
: "TRADE");
if (!symbolId.empty()) {
target += "&symbol=";
target += symbolId;
Expand All @@ -223,10 +221,9 @@ class ExecutionManagementServiceKucoinBase : public ExecutionManagementService {
case Request::Operation::CANCEL_OPEN_ORDERS: {
req.method(http::verb::delete_);
auto target = this->cancelOpenOrdersTarget;
target += std::string("?tradeType=") +
(request.getMarginType() == CCAPI_EM_MARGIN_TYPE_CROSS_MARGIN ? "MARGIN_TRADE"
: request.getMarginType() == CCAPI_EM_MARGIN_TYPE_ISOLATED_MARGIN ? "MARGIN_ISOLATED_TRADE"
: "TRADE");
target += std::string("?tradeType=") + (request.getMarginType() == CCAPI_EM_MARGIN_TYPE_CROSS_MARGIN ? "MARGIN_TRADE"
: request.getMarginType() == CCAPI_EM_MARGIN_TYPE_ISOLATED_MARGIN ? "MARGIN_ISOLATED_TRADE"
: "TRADE");
if (!symbolId.empty()) {
target += "&symbol=";
target += symbolId;
Expand Down Expand Up @@ -387,9 +384,13 @@ class ExecutionManagementServiceKucoinBase : public ExecutionManagementService {
std::string instrument = data["symbol"].GetString();
if (instrumentSet.empty() || instrumentSet.find(instrument) != instrumentSet.end()) {
std::string ts = std::string(data["ts"].GetString());
message.setTime(UtilTime::makeTimePoint({std::stoll(ts.substr(0, ts.length() - 9)), std::stoll(ts.substr(ts.length() - 9))}));
auto time = UtilTime::makeTimePoint({std::stoll(ts.substr(0, ts.length() - 9)), std::stoll(ts.substr(ts.length() - 9))});
std::string dataType = data["type"].GetString();
if (dataType == "match" && (fieldSet.find(CCAPI_EM_PRIVATE_TRADE) != fieldSet.end() || fieldSet.find(CCAPI_EM_ORDER_UPDATE) != fieldSet.end())) {
if (dataType == "match" && fieldSet.find(CCAPI_EM_PRIVATE_TRADE) != fieldSet.end()) {
Message message;
message.setTimeReceived(timeReceived);
message.setCorrelationIdList({subscription.getCorrelationId()});
message.setTime(time);
message.setType(Message::Type::EXECUTION_MANAGEMENT_EVENTS_PRIVATE_TRADE);
std::vector<Element> elementList;
Element element;
Expand All @@ -405,6 +406,10 @@ class ExecutionManagementServiceKucoinBase : public ExecutionManagementService {
messageList.emplace_back(std::move(message));
}
if (fieldSet.find(CCAPI_EM_ORDER_UPDATE) != fieldSet.end()) {
Message message;
message.setTimeReceived(timeReceived);
message.setCorrelationIdList({subscription.getCorrelationId()});
message.setTime(time);
message.setType(Message::Type::EXECUTION_MANAGEMENT_EVENTS_ORDER_UPDATE);
std::map<std::string, std::pair<std::string, JsonDataType> > extractionFieldNameMap = {
{CCAPI_EM_ORDER_ID, std::make_pair("orderId", JsonDataType::STRING)},
Expand Down
4 changes: 4 additions & 0 deletions include/ccapi_cpp/service/ccapi_service.h
Original file line number Diff line number Diff line change
Expand Up @@ -592,6 +592,7 @@ class Service : public std::enable_shared_from_this<Service> {
if (ec) {
CCAPI_LOGGER_TRACE("fail");
this->onError(Event::Type::REQUEST_STATUS, Message::Type::REQUEST_FAILURE, ec, "write", {request.getCorrelationId()}, eventQueuePtr);
this->httpConnectionPool.purge();
auto now = UtilTime::now();
auto req = this->convertRequest(request, now);
retry.numRetry += 1;
Expand Down Expand Up @@ -832,6 +833,9 @@ class Service : public std::enable_shared_from_this<Service> {
++i;
}
}
void appendSymbolId(rj::Value& rjValue, rj::Document::AllocatorType& allocator, const std::string& symbolId, const std::string symbolIdCalled) {
rjValue.AddMember(rj::Value(symbolIdCalled.c_str(), allocator).Move(), rj::Value(symbolId.c_str(), allocator).Move(), allocator);
}
void appendSymbolId(std::string& queryString, const std::string& symbolId, const std::string symbolIdCalled) {
if (!symbolId.empty()) {
queryString += symbolIdCalled;
Expand Down

0 comments on commit 980782e

Please sign in to comment.