Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
dc1a08b
fix golang bindings
cryptochassis Nov 24, 2025
73cce37
fix ci
cryptochassis Nov 24, 2025
3bccd62
Merge pull request #556 from crypto-chassis/hotfix
cryptochassis Nov 24, 2025
97620b7
Bump actions/checkout from 5 to 6
dependabot[bot] Nov 24, 2025
95367ec
Merge pull request #557 from crypto-chassis/dependabot/github_actions…
cryptochassis Nov 24, 2025
fe1067a
update binding/go/CMakeLists.txt
cryptochassis Nov 25, 2025
aa354f1
add binance full order book
cryptochassis Dec 8, 2025
2f91852
Merge pull request #560 from crypto-chassis/feat-binance-order-book
cryptochassis Dec 8, 2025
c84dfc2
update examples
cryptochassis Dec 22, 2025
f3106ca
update README.md
cryptochassis Dec 22, 2025
43d0c6f
Merge pull request #562 from crypto-chassis/update-example
cryptochassis Dec 22, 2025
b335017
fix binance GET_MARKET_DEPTH rest api response
cryptochassis Jan 5, 2026
5abc118
Merge pull request #565 from crypto-chassis/fix-binance-get-market-depth
cryptochassis Jan 5, 2026
6ee9533
fix several issues for bitstamp
cryptochassis Jan 28, 2026
42e3016
revert accidental pragma once
cryptochassis Jan 28, 2026
ae73601
update .github/workflows/test.yml
cryptochassis Jan 28, 2026
d962345
update .github/workflows/test.yml
cryptochassis Jan 28, 2026
d78dd74
update .github/workflows/test.yml
cryptochassis Jan 28, 2026
18fac14
Merge pull request #566 from crypto-chassis/fix-bitstamp
cryptochassis Jan 28, 2026
a52c755
Fix example paths in README.md
cryptochassis Feb 13, 2026
ea0ab8b
make error log for SSL_set_tlsext_host_name clearer
cryptochassis Mar 5, 2026
5791ba4
Merge pull request #567 from crypto-chassis/chore
cryptochassis Mar 10, 2026
b62586f
Change header guard to use pragma once
cryptochassis Mar 26, 2026
6d7759a
Merge pull request #568 from crypto-chassis/pragma-once
cryptochassis Mar 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ on:
- '**/README.md'
- '**.example'

concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

env:
CMAKE_VERSION: 3.17.5
NINJA_VERSION: 1.9.0
Expand Down Expand Up @@ -53,7 +57,7 @@ jobs:
# }

steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v6

- name: Download Ninja and CMake
id: cmake_and_ninja
Expand Down
148 changes: 70 additions & 78 deletions README.md

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions binding/go/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@ foreach(ZLIB_LIBRARY IN LISTS ZLIB_LIBRARIES)
get_filename_component(ZLIB_LIBRARY_DIR ${ZLIB_LIBRARY} DIRECTORY)
list(APPEND CGO_LDFLAGS_LIST -L${ZLIB_LIBRARY_DIR} -lz)
endforeach()
list(REMOVE_DUPLICATES CGO_LDFLAGS_LIST)
list(JOIN CGO_LDFLAGS_LIST " " CGO_LDFLAGS)
message(STATUS "CGO_LDFLAGS: ${CGO_LDFLAGS}")
file(APPEND ${COMPILER_OPTIONS_FILE_PATH}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ type MyEventHandler struct {
}

func (*MyEventHandler) ProcessEvent(event ccapi.Event, session ccapi.Session) {
fmt.Printf("Received an event:\n%s\n", event.ToStringPretty(2, 2))
fmt.Printf("Received an event:\n%s\n", event.ToPrettyString(2, 2))
}

func main() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ type MyEventHandler struct {

func (*MyEventHandler) ProcessEvent(event ccapi.Event, session ccapi.Session) {
if event.GetType() == ccapi.EventType_SUBSCRIPTION_STATUS {
fmt.Printf("Received an event of type SUBSCRIPTION_STATUS:\n%s\n", event.ToStringPretty(2, 2))
fmt.Printf("Received an event of type SUBSCRIPTION_STATUS:\n%s\n", event.ToPrettyString(2, 2))
message := event.GetMessageList().Get(0)
if message.GetType() == ccapi.MessageType_SUBSCRIPTION_STARTED {
request := ccapi.NewRequest(ccapi.RequestOperation_CREATE_ORDER, "okx", "BTC-USDT")
Expand All @@ -27,7 +27,7 @@ func (*MyEventHandler) ProcessEvent(event ccapi.Event, session ccapi.Session) {
session.SendRequest(request)
}
} else if event.GetType() == ccapi.EventType_SUBSCRIPTION_DATA {
fmt.Printf("Received an event of type SUBSCRIPTION_DATA:\n%s\n", event.ToStringPretty(2, 2))
fmt.Printf("Received an event of type SUBSCRIPTION_DATA:\n%s\n", event.ToPrettyString(2, 2))
}
}

Expand Down
4 changes: 2 additions & 2 deletions binding/go/example/fix_simple/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ type MyEventHandler struct {

func (*MyEventHandler) ProcessEvent(event ccapi.Event, session ccapi.Session) {
if event.GetType() == ccapi.EventType_AUTHORIZATION_STATUS {
fmt.Printf("Received an event of type AUTHORIZATION_STATUS:\n%s\n", event.ToStringPretty(2, 2))
fmt.Printf("Received an event of type AUTHORIZATION_STATUS:\n%s\n", event.ToPrettyString(2, 2))
message := event.GetMessageList().Get(0)
if message.GetType() == ccapi.MessageType_AUTHORIZATION_SUCCESS {
request := ccapi.NewRequest(ccapi.RequestOperation_FIX, "coinbase", "", "same correlation id for subscription and request")
Expand Down Expand Up @@ -44,7 +44,7 @@ func (*MyEventHandler) ProcessEvent(event ccapi.Event, session ccapi.Session) {
session.SendRequestByFix(request)
}
} else if event.GetType() == ccapi.EventType_FIX {
fmt.Printf("Received an event of type FIX:\n%s\n", event.ToStringPretty(2, 2))
fmt.Printf("Received an event of type FIX:\n%s\n", event.ToPrettyString(2, 2))
}
}

Expand Down
2 changes: 1 addition & 1 deletion binding/go/example/market_data_simple_request/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ type MyEventHandler struct {
}

func (*MyEventHandler) ProcessEvent(event ccapi.Event, session ccapi.Session) {
fmt.Printf("Received an event:\n%s\n", event.ToStringPretty(2, 2))
fmt.Printf("Received an event:\n%s\n", event.ToPrettyString(2, 2))
}

func main() {
Expand Down
2 changes: 1 addition & 1 deletion binding/go/example/market_data_simple_subscription/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ type MyEventHandler struct {

func (*MyEventHandler) ProcessEvent(event ccapi.Event, session ccapi.Session) {
if event.GetType() == ccapi.EventType_SUBSCRIPTION_STATUS {
fmt.Printf("Received an event of type SUBSCRIPTION_STATUS:\n%s\n", event.ToStringPretty(2, 2))
fmt.Printf("Received an event of type SUBSCRIPTION_STATUS:\n%s\n", event.ToPrettyString(2, 2))
} else if event.GetType() == ccapi.EventType_SUBSCRIPTION_DATA {
messageList := event.GetMessageList()
for i := 0; i < int(messageList.Size()); i++ {
Expand Down
2 changes: 2 additions & 0 deletions binding/go/go.mod.in
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
module cryptochassis.com

go 1.17
2 changes: 2 additions & 0 deletions binding/go/go.mod.in_2
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
module main

go 1.17

require (
cryptochassis.com/ccapi v1.0.0
)
Expand Down
40 changes: 20 additions & 20 deletions example/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -68,23 +68,23 @@ if(WIN32)
endif()
link_libraries(OpenSSL::Crypto OpenSSL::SSL ${ADDITIONAL_LINK_LIBRARIES})
add_compile_options(-Wno-deprecated -Wno-nonnull -Wno-deprecated-declarations)
add_subdirectory(src/market_data_simple_request)
add_subdirectory(src/market_data_simple_subscription)
add_subdirectory(src/market_data_advanced_request)
add_subdirectory(src/market_data_advanced_subscription)
add_subdirectory(src/generic_public_request)
add_subdirectory(src/generic_private_request)
add_subdirectory(src/execution_management_simple_request)
add_subdirectory(src/execution_management_simple_subscription)
add_subdirectory(src/execution_management_advanced_request)
add_subdirectory(src/execution_management_advanced_subscription)
add_subdirectory(src/fix_simple)
add_subdirectory(src/fix_advanced)
add_subdirectory(src/enable_library_logging)
add_subdirectory(src/set_timer)
add_subdirectory(src/heartbeat)
add_subdirectory(src/override_exchange_url_at_runtime)
add_subdirectory(src/test_order_latency)
add_subdirectory(src/test_cpu_usage)
add_subdirectory(src/use_multiple_sessions)
add_subdirectory(src/reduce_build_time)
add_subdirectory(market_data_simple_request)
add_subdirectory(market_data_simple_subscription)
add_subdirectory(market_data_advanced_request)
add_subdirectory(market_data_advanced_subscription)
add_subdirectory(generic_public_request)
add_subdirectory(generic_private_request)
add_subdirectory(execution_management_simple_request)
add_subdirectory(execution_management_simple_subscription)
add_subdirectory(execution_management_advanced_request)
add_subdirectory(execution_management_advanced_subscription)
add_subdirectory(fix_simple)
add_subdirectory(fix_advanced)
add_subdirectory(enable_library_logging)
add_subdirectory(set_timer)
add_subdirectory(heartbeat)
add_subdirectory(override_exchange_url_at_runtime)
add_subdirectory(test_order_latency)
add_subdirectory(test_cpu_usage)
add_subdirectory(use_multiple_sessions)
add_subdirectory(reduce_build_time)
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@ set(NAME enable_library_logging)
project(${NAME})
add_compile_definitions(CCAPI_ENABLE_LOG_TRACE)
add_compile_definitions(CCAPI_ENABLE_SERVICE_MARKET_DATA)
add_compile_definitions(CCAPI_ENABLE_EXCHANGE_OKX)
add_compile_definitions(CCAPI_ENABLE_EXCHANGE_BYBIT)
add_executable(${NAME} main.cpp)
add_dependencies(${NAME} boost rapidjson)
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ using ::ccapi::Subscription;

int main(int argc, char** argv) {
Session session;
Subscription subscription("okx", "BTC-USDT", "MARKET_DEPTH");
Subscription subscription("bybit", "BTCUSDT", "MARKET_DEPTH");
session.subscribe(subscription);
std::this_thread::sleep_for(std::chrono::seconds(10));
session.stop();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
set(NAME execution_management_advanced_request)
project(${NAME})
add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT)
add_compile_definitions(CCAPI_ENABLE_EXCHANGE_OKX)
add_compile_definitions(CCAPI_ENABLE_EXCHANGE_BYBIT)
add_executable(${NAME} main.cpp)
add_dependencies(${NAME} boost rapidjson)
Original file line number Diff line number Diff line change
Expand Up @@ -19,23 +19,20 @@ using ::ccapi::SessionOptions;
using ::ccapi::UtilSystem;

int main(int argc, char** argv) {
if (UtilSystem::getEnvAsString("OKX_API_KEY").empty()) {
std::cerr << "Please set environment variable OKX_API_KEY" << std::endl;
if (UtilSystem::getEnvAsString("BYBIT_API_KEY").empty()) {
std::cerr << "Please set environment variable BYBIT_API_KEY" << std::endl;
return EXIT_FAILURE;
}
if (UtilSystem::getEnvAsString("OKX_API_SECRET").empty()) {
std::cerr << "Please set environment variable OKX_API_SECRET" << std::endl;
return EXIT_FAILURE;
}
if (UtilSystem::getEnvAsString("OKX_API_PASSPHRASE").empty()) {
std::cerr << "Please set environment variable OKX_API_PASSPHRASE" << std::endl;
if (UtilSystem::getEnvAsString("BYBIT_API_SECRET").empty()) {
std::cerr << "Please set environment variable BYBIT_API_SECRET" << std::endl;
return EXIT_FAILURE;
}

SessionOptions sessionOptions;
SessionConfigs sessionConfigs;
MyEventHandler eventHandler;
Session session(sessionOptions, sessionConfigs, &eventHandler);
Request request(Request::Operation::CREATE_ORDER, "okx", "BTC-USDT");
Request request(Request::Operation::CREATE_ORDER, "bybit", "BTCUSDT");
request.appendParam({
{"tdMode", "cross"},
{"ccy", "USDT"},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
set(NAME execution_management_advanced_subscription)
project(${NAME})
add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT)
add_compile_definitions(CCAPI_ENABLE_EXCHANGE_OKX)
add_compile_definitions(CCAPI_ENABLE_EXCHANGE_BYBIT)
add_executable(${NAME} main.cpp)
add_dependencies(${NAME} boost rapidjson)
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class MyEventHandler : public EventHandler {
std::cout << "Received an event:\n" + event.toPrettyString(2, 2) << std::endl;
if (!willSendRequest) {
sessionPtr->setTimer("id", 1000, nullptr, [this, sessionPtr]() {
Request request(Request::Operation::CREATE_ORDER, "okx", "BTC-USDT");
Request request(Request::Operation::CREATE_ORDER, "bybit", "BTCUSDT");
request.appendParam({
{"SIDE", "BUY"},
{"LIMIT_PRICE", "20000"},
Expand Down Expand Up @@ -43,25 +43,24 @@ using ::ccapi::Subscription;
using ::ccapi::UtilSystem;

int main(int argc, char** argv) {
if (UtilSystem::getEnvAsString("OKX_API_KEY").empty()) {
std::cerr << "Please set environment variable OKX_API_KEY" << std::endl;
if (UtilSystem::getEnvAsString("BYBIT_API_KEY").empty()) {
std::cerr << "Please set environment variable BYBIT_API_KEY" << std::endl;
return EXIT_FAILURE;
}
if (UtilSystem::getEnvAsString("OKX_API_SECRET").empty()) {
std::cerr << "Please set environment variable OKX_API_SECRET" << std::endl;
return EXIT_FAILURE;
}
if (UtilSystem::getEnvAsString("OKX_API_PASSPHRASE").empty()) {
std::cerr << "Please set environment variable OKX_API_PASSPHRASE" << std::endl;
if (UtilSystem::getEnvAsString("BYBIT_API_SECRET").empty()) {
std::cerr << "Please set environment variable BYBIT_API_SECRET" << std::endl;
return EXIT_FAILURE;
}

SessionOptions sessionOptions;
SessionConfigs sessionConfigs;
std::string websocketOrderEntrySubscriptionCorrelationId("any");
MyEventHandler eventHandler(websocketOrderEntrySubscriptionCorrelationId);
Session session(sessionOptions, sessionConfigs, &eventHandler);
Subscription subscription("okx", "", "ORDER_UPDATE", "", websocketOrderEntrySubscriptionCorrelationId);
session.subscribe(subscription);
Subscription subscription_1("bybit", "", "ORDER_UPDATE");
Subscription subscription_2("bybit", "", "WEBSOCKET_ORDER_ENTRY", "", websocketOrderEntrySubscriptionCorrelationId);
std::vector<ccapi::Subscription> subscriptions = {subscription_1, subscription_2};
session.subscribe(subscriptions);
std::this_thread::sleep_for(std::chrono::seconds(10));
session.stop();
std::cout << "Bye" << std::endl;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
set(NAME execution_management_simple_request)
project(${NAME})
add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT)
add_compile_definitions(CCAPI_ENABLE_EXCHANGE_OKX)
add_compile_definitions(CCAPI_ENABLE_EXCHANGE_BYBIT)
add_executable(${NAME} main.cpp)
add_dependencies(${NAME} boost rapidjson)
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,15 @@ using ::ccapi::toString;
using ::ccapi::UtilSystem;

int main(int argc, char** argv) {
if (UtilSystem::getEnvAsString("OKX_API_KEY").empty()) {
std::cerr << "Please set environment variable OKX_API_KEY" << std::endl;
if (UtilSystem::getEnvAsString("BYBIT_API_KEY").empty()) {
std::cerr << "Please set environment variable BYBIT_API_KEY" << std::endl;
return EXIT_FAILURE;
}
if (UtilSystem::getEnvAsString("OKX_API_SECRET").empty()) {
std::cerr << "Please set environment variable OKX_API_SECRET" << std::endl;
return EXIT_FAILURE;
}
if (UtilSystem::getEnvAsString("OKX_API_PASSPHRASE").empty()) {
std::cerr << "Please set environment variable OKX_API_PASSPHRASE" << std::endl;
if (UtilSystem::getEnvAsString("BYBIT_API_SECRET").empty()) {
std::cerr << "Please set environment variable BYBIT_API_SECRET" << std::endl;
return EXIT_FAILURE;
}

std::vector<std::string> modeList = {
"create_order", "cancel_order", "get_order", "get_open_orders", "cancel_open_orders", "get_account_balances",
};
Expand All @@ -52,7 +49,7 @@ int main(int argc, char** argv) {
session.stop();
return EXIT_FAILURE;
}
Request request(Request::Operation::CREATE_ORDER, "okx", argv[2]);
Request request(Request::Operation::CREATE_ORDER, "bybit", argv[2]);
request.appendParam({
{"SIDE", strcmp(argv[3], "buy") == 0 ? "BUY" : "SELL"},
{"QUANTITY", argv[4]},
Expand All @@ -67,7 +64,7 @@ int main(int argc, char** argv) {
session.stop();
return EXIT_FAILURE;
}
Request request(Request::Operation::CANCEL_ORDER, "okx", argv[2]);
Request request(Request::Operation::CANCEL_ORDER, "bybit", argv[2]);
request.appendParam({
{"ORDER_ID", argv[3]},
});
Expand All @@ -80,7 +77,7 @@ int main(int argc, char** argv) {
session.stop();
return EXIT_FAILURE;
}
Request request(Request::Operation::GET_ORDER, "okx", argv[2]);
Request request(Request::Operation::GET_ORDER, "bybit", argv[2]);
request.appendParam({
{"ORDER_ID", argv[3]},
});
Expand All @@ -93,7 +90,7 @@ int main(int argc, char** argv) {
session.stop();
return EXIT_FAILURE;
}
Request request(Request::Operation::GET_OPEN_ORDERS, "okx", argv[2]);
Request request(Request::Operation::GET_OPEN_ORDERS, "bybit", argv[2]);
session.sendRequest(request);
} else if (mode == "cancel_open_orders") {
if (argc != 3) {
Expand All @@ -103,10 +100,10 @@ int main(int argc, char** argv) {
session.stop();
return EXIT_FAILURE;
}
Request request(Request::Operation::CANCEL_OPEN_ORDERS, "okx", argv[2]);
Request request(Request::Operation::CANCEL_OPEN_ORDERS, "bybit", argv[2]);
session.sendRequest(request);
} else if (mode == "get_account_balances") {
Request request(Request::Operation::GET_ACCOUNT_BALANCES, "okx");
Request request(Request::Operation::GET_ACCOUNT_BALANCES, "bybit");
session.sendRequest(request);
}
std::this_thread::sleep_for(std::chrono::seconds(10));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
set(NAME execution_management_simple_subscription)
project(${NAME})
add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT)
add_compile_definitions(CCAPI_ENABLE_EXCHANGE_OKX)
add_compile_definitions(CCAPI_ENABLE_EXCHANGE_BYBIT)
add_executable(${NAME} main.cpp)
add_dependencies(${NAME} boost rapidjson)
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ class MyEventHandler : public EventHandler {
std::cout << "Received an event:\n" + event.toPrettyString(2, 2) << std::endl;
if (!willSendRequest) {
sessionPtr->setTimer("id", 1000, nullptr, [this, sessionPtr]() {
Request request(Request::Operation::CREATE_ORDER, "okx", "BTC-USDT");
Request request(Request::Operation::CREATE_ORDER, "bybit", "BTCUSDT");
request.appendParam({
{"SIDE", "BUY"},
{"LIMIT_PRICE", "20000"},
Expand Down Expand Up @@ -39,23 +39,20 @@ using ::ccapi::Subscription;
using ::ccapi::UtilSystem;

int main(int argc, char** argv) {
if (UtilSystem::getEnvAsString("OKX_API_KEY").empty()) {
std::cerr << "Please set environment variable OKX_API_KEY" << std::endl;
if (UtilSystem::getEnvAsString("BYBIT_API_KEY").empty()) {
std::cerr << "Please set environment variable BYBIT_API_KEY" << std::endl;
return EXIT_FAILURE;
}
if (UtilSystem::getEnvAsString("OKX_API_SECRET").empty()) {
std::cerr << "Please set environment variable OKX_API_SECRET" << std::endl;
return EXIT_FAILURE;
}
if (UtilSystem::getEnvAsString("OKX_API_PASSPHRASE").empty()) {
std::cerr << "Please set environment variable OKX_API_PASSPHRASE" << std::endl;
if (UtilSystem::getEnvAsString("BYBIT_API_SECRET").empty()) {
std::cerr << "Please set environment variable BYBIT_API_SECRET" << std::endl;
return EXIT_FAILURE;
}

SessionOptions sessionOptions;
SessionConfigs sessionConfigs;
MyEventHandler eventHandler;
Session session(sessionOptions, sessionConfigs, &eventHandler);
Subscription subscription("okx", "BTC-USDT", "ORDER_UPDATE");
Subscription subscription("bybit", "BTCUSDT", "ORDER_UPDATE");
session.subscribe(subscription);
std::this_thread::sleep_for(std::chrono::seconds(10));
session.stop();
Expand Down
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
set(NAME generic_private_request)
project(${NAME})
add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT)
add_compile_definitions(CCAPI_ENABLE_EXCHANGE_OKX)
add_compile_definitions(CCAPI_ENABLE_EXCHANGE_BYBIT)
add_executable(${NAME} main.cpp)
add_dependencies(${NAME} boost rapidjson)
Loading
Loading