├── .clang-format
├── .cmake-format.yml
├── .github
├── ISSUE_TEMPLATE
│ ├── bug_report.md
│ └── feature_request.md
├── dependabot.yml
└── workflows
│ ├── release.yml
│ └── test.yml
├── .gitignore
├── LICENSE
├── README.md
├── binding
├── CMakeLists.txt
├── ccapi_logger.cpp
├── csharp
│ ├── CMakeLists.txt
│ ├── ccapi.csproj.in
│ ├── example
│ │ ├── enable_library_logging
│ │ │ ├── MainProgram.cs
│ │ │ └── main.csproj
│ │ ├── execution_management_simple_request
│ │ │ ├── MainProgram.cs
│ │ │ └── main.csproj
│ │ ├── execution_management_simple_subscription
│ │ │ ├── MainProgram.cs
│ │ │ └── main.csproj
│ │ ├── fix_simple
│ │ │ ├── MainProgram.cs
│ │ │ └── main.csproj
│ │ ├── handle_exception
│ │ │ ├── MainProgram.cs
│ │ │ └── main.csproj
│ │ ├── market_data_multiple_subscription
│ │ │ ├── MainProgram.cs
│ │ │ └── main.csproj
│ │ ├── market_data_simple_request
│ │ │ ├── MainProgram.cs
│ │ │ └── main.csproj
│ │ └── market_data_simple_subscription
│ │ │ ├── MainProgram.cs
│ │ │ └── main.csproj
│ ├── swig_interface_ccapi_language_specific.i
│ └── test
│ │ ├── MainProgram.cs
│ │ └── main.csproj
├── go
│ ├── CMakeLists.txt
│ ├── example
│ │ ├── enable_library_logging
│ │ │ ├── go.mod
│ │ │ └── main.go
│ │ ├── execution_management_simple_request
│ │ │ ├── go.mod
│ │ │ └── main.go
│ │ ├── execution_management_simple_subscription
│ │ │ ├── go.mod
│ │ │ └── main.go
│ │ ├── fix_simple
│ │ │ ├── go.mod
│ │ │ └── main.go
│ │ ├── handle_exception
│ │ │ ├── go.mod
│ │ │ └── main.go
│ │ ├── market_data_multiple_subscription
│ │ │ ├── go.mod
│ │ │ └── main.go
│ │ ├── market_data_simple_request
│ │ │ ├── go.mod
│ │ │ └── main.go
│ │ └── market_data_simple_subscription
│ │ │ ├── go.mod
│ │ │ └── main.go
│ ├── go.mod.in
│ ├── go.mod.in_2
│ └── test
│ │ └── main.go
├── java
│ ├── CMakeLists.txt
│ ├── example
│ │ ├── enable_library_logging
│ │ │ └── Main.java
│ │ ├── execution_management_simple_request
│ │ │ └── Main.java
│ │ ├── execution_management_simple_subscription
│ │ │ └── Main.java
│ │ ├── fix_simple
│ │ │ └── Main.java
│ │ ├── handle_exception
│ │ │ └── Main.java
│ │ ├── market_data_multiple_subscription
│ │ │ └── Main.java
│ │ ├── market_data_simple_request
│ │ │ └── Main.java
│ │ └── market_data_simple_subscription
│ │ │ └── Main.java
│ └── test
│ │ └── Main.java
├── javascript
│ ├── CMakeLists.txt
│ ├── binding.gyp.in
│ ├── example
│ │ ├── execution_management_simple_request
│ │ │ ├── index.js
│ │ │ └── package.json
│ │ ├── execution_management_simple_subscription
│ │ │ ├── index.js
│ │ │ └── package.json
│ │ ├── fix_simple
│ │ │ ├── index.js
│ │ │ └── package.json
│ │ ├── handle_exception
│ │ │ ├── index.js
│ │ │ └── package.json
│ │ ├── market_data_multiple_subscription
│ │ │ ├── index.js
│ │ │ └── package.json
│ │ ├── market_data_simple_request
│ │ │ ├── index.js
│ │ │ └── package.json
│ │ └── market_data_simple_subscription
│ │ │ ├── index.js
│ │ │ └── package.json
│ ├── package.json.in
│ └── test
│ │ └── index.js
├── python
│ ├── CMakeLists.txt
│ ├── example
│ │ ├── data_visualization
│ │ │ └── main.py
│ │ ├── enable_library_logging
│ │ │ └── main.py
│ │ ├── execution_management_simple_request
│ │ │ └── main.py
│ │ ├── execution_management_simple_subscription
│ │ │ └── main.py
│ │ ├── fix_simple
│ │ │ └── main.py
│ │ ├── handle_exception
│ │ │ └── main.py
│ │ ├── market_data_multiple_subscription
│ │ │ └── main.py
│ │ ├── market_data_simple_request
│ │ │ └── main.py
│ │ └── market_data_simple_subscription
│ │ │ └── main.py
│ ├── setup.py.in
│ └── test
│ │ └── main.py
└── swig_interface.i.in
├── example
├── CMakeLists.txt
└── src
│ ├── enable_library_logging
│ ├── CMakeLists.txt
│ └── main.cpp
│ ├── execution_management_advanced_request
│ ├── CMakeLists.txt
│ └── main.cpp
│ ├── execution_management_advanced_subscription
│ ├── CMakeLists.txt
│ └── main.cpp
│ ├── execution_management_simple_request
│ ├── CMakeLists.txt
│ └── main.cpp
│ ├── execution_management_simple_subscription
│ ├── CMakeLists.txt
│ └── main.cpp
│ ├── fix_advanced
│ ├── CMakeLists.txt
│ └── main.cpp
│ ├── fix_simple
│ ├── CMakeLists.txt
│ └── main.cpp
│ ├── generic_private_request
│ ├── CMakeLists.txt
│ └── main.cpp
│ ├── generic_public_request
│ ├── CMakeLists.txt
│ └── main.cpp
│ ├── market_data_advanced_request
│ ├── CMakeLists.txt
│ └── main.cpp
│ ├── market_data_advanced_subscription
│ ├── CMakeLists.txt
│ └── main.cpp
│ ├── market_data_simple_request
│ ├── CMakeLists.txt
│ └── main.cpp
│ ├── market_data_simple_subscription
│ ├── CMakeLists.txt
│ └── main.cpp
│ ├── override_exchange_url_at_runtime
│ ├── CMakeLists.txt
│ └── main.cpp
│ ├── test_order_latency
│ ├── CMakeLists.txt
│ └── main.cpp
│ └── utility_set_timer
│ ├── CMakeLists.txt
│ └── main.cpp
├── format.sh
├── format_cmake.sh
├── format_cpp.sh
├── format_csharp.sh
├── format_go.sh
├── format_java.sh
├── format_javascript.sh
├── format_python.sh
├── include
└── ccapi_cpp
│ ├── ccapi_decimal.h
│ ├── ccapi_element.h
│ ├── ccapi_event.h
│ ├── ccapi_event_dispatcher.h
│ ├── ccapi_event_handler.h
│ ├── ccapi_fix_connection.h
│ ├── ccapi_hmac.h
│ ├── ccapi_http_connection.h
│ ├── ccapi_http_retry.h
│ ├── ccapi_inflate_stream.h
│ ├── ccapi_jwt.h
│ ├── ccapi_logger.h
│ ├── ccapi_macro.h
│ ├── ccapi_market_data_message.h
│ ├── ccapi_message.h
│ ├── ccapi_queue.h
│ ├── ccapi_request.h
│ ├── ccapi_session.h
│ ├── ccapi_session_configs.h
│ ├── ccapi_session_options.h
│ ├── ccapi_subscription.h
│ ├── ccapi_url.h
│ ├── ccapi_util.h
│ ├── ccapi_util_private.h
│ ├── ccapi_ws_connection.h
│ └── service
│ ├── ccapi_execution_management_service.h
│ ├── ccapi_execution_management_service_ascendex.h
│ ├── ccapi_execution_management_service_binance.h
│ ├── ccapi_execution_management_service_binance_base.h
│ ├── ccapi_execution_management_service_binance_coin_futures.h
│ ├── ccapi_execution_management_service_binance_derivatives_base.h
│ ├── ccapi_execution_management_service_binance_us.h
│ ├── ccapi_execution_management_service_binance_usds_futures.h
│ ├── ccapi_execution_management_service_bitfinex.h
│ ├── ccapi_execution_management_service_bitget.h
│ ├── ccapi_execution_management_service_bitget_base.h
│ ├── ccapi_execution_management_service_bitget_futures.h
│ ├── ccapi_execution_management_service_bitmart.h
│ ├── ccapi_execution_management_service_bitmex.h
│ ├── ccapi_execution_management_service_bitstamp.h
│ ├── ccapi_execution_management_service_bybit.h
│ ├── ccapi_execution_management_service_coinbase.h
│ ├── ccapi_execution_management_service_cryptocom.h
│ ├── ccapi_execution_management_service_deribit.h
│ ├── ccapi_execution_management_service_erisx.h
│ ├── ccapi_execution_management_service_ftx.h
│ ├── ccapi_execution_management_service_ftx_base.h
│ ├── ccapi_execution_management_service_ftx_us.h
│ ├── ccapi_execution_management_service_gateio.h
│ ├── ccapi_execution_management_service_gateio_base.h
│ ├── ccapi_execution_management_service_gateio_perpetual_futures.h
│ ├── ccapi_execution_management_service_gemini.h
│ ├── ccapi_execution_management_service_huobi.h
│ ├── ccapi_execution_management_service_huobi_base.h
│ ├── ccapi_execution_management_service_huobi_coin_swap.h
│ ├── ccapi_execution_management_service_huobi_derivatives_base.h
│ ├── ccapi_execution_management_service_huobi_usdt_swap.h
│ ├── ccapi_execution_management_service_kraken.h
│ ├── ccapi_execution_management_service_kraken_futures.h
│ ├── ccapi_execution_management_service_kucoin.h
│ ├── ccapi_execution_management_service_kucoin_base.h
│ ├── ccapi_execution_management_service_kucoin_futures.h
│ ├── ccapi_execution_management_service_mexc.h
│ ├── ccapi_execution_management_service_mexc_futures.h
│ ├── ccapi_execution_management_service_okx.h
│ ├── ccapi_execution_management_service_whitebit.h
│ ├── ccapi_fix_service.h
│ ├── ccapi_fix_service_coinbase.h
│ ├── ccapi_fix_service_ftx.h
│ ├── ccapi_fix_service_ftx_base.h
│ ├── ccapi_fix_service_ftx_us.h
│ ├── ccapi_fix_service_gemini.h
│ ├── ccapi_market_data_service.h
│ ├── ccapi_market_data_service_ascendex.h
│ ├── ccapi_market_data_service_binance.h
│ ├── ccapi_market_data_service_binance_base.h
│ ├── ccapi_market_data_service_binance_coin_futures.h
│ ├── ccapi_market_data_service_binance_derivatives_base.h
│ ├── ccapi_market_data_service_binance_us.h
│ ├── ccapi_market_data_service_binance_usds_futures.h
│ ├── ccapi_market_data_service_bitfinex.h
│ ├── ccapi_market_data_service_bitget.h
│ ├── ccapi_market_data_service_bitget_base.h
│ ├── ccapi_market_data_service_bitget_futures.h
│ ├── ccapi_market_data_service_bitmart.h
│ ├── ccapi_market_data_service_bitmex.h
│ ├── ccapi_market_data_service_bitstamp.h
│ ├── ccapi_market_data_service_bybit.h
│ ├── ccapi_market_data_service_coinbase.h
│ ├── ccapi_market_data_service_cryptocom.h
│ ├── ccapi_market_data_service_deribit.h
│ ├── ccapi_market_data_service_erisx.h
│ ├── ccapi_market_data_service_ftx.h
│ ├── ccapi_market_data_service_ftx_base.h
│ ├── ccapi_market_data_service_ftx_us.h
│ ├── ccapi_market_data_service_gateio.h
│ ├── ccapi_market_data_service_gateio_base.h
│ ├── ccapi_market_data_service_gateio_perpetual_futures.h
│ ├── ccapi_market_data_service_gemini.h
│ ├── ccapi_market_data_service_huobi.h
│ ├── ccapi_market_data_service_huobi_base.h
│ ├── ccapi_market_data_service_huobi_coin_swap.h
│ ├── ccapi_market_data_service_huobi_derivatives_base.h
│ ├── ccapi_market_data_service_huobi_usdt_swap.h
│ ├── ccapi_market_data_service_kraken.h
│ ├── ccapi_market_data_service_kraken_futures.h
│ ├── ccapi_market_data_service_kucoin.h
│ ├── ccapi_market_data_service_kucoin_base.h
│ ├── ccapi_market_data_service_kucoin_futures.h
│ ├── ccapi_market_data_service_mexc.h
│ ├── ccapi_market_data_service_mexc_futures.h
│ ├── ccapi_market_data_service_okx.h
│ ├── ccapi_market_data_service_whitebit.h
│ ├── ccapi_service.h
│ └── ccapi_service_context.h
└── test
├── CMakeLists.txt
├── ccapi_logger.cpp
├── test_build
├── CMakeLists.txt
└── test.cpp
└── test_unit
├── CMakeLists.txt
├── CMakeLists.txt.in
├── include
└── ccapi_cpp
│ ├── ccapi_test_execution_management_helper.h
│ └── ccapi_test_market_data_helper.h
└── src
├── common
├── CMakeLists.txt
├── decimal
│ ├── CMakeLists.txt
│ └── ccapi_decimal_test.cpp
├── event
│ ├── CMakeLists.txt
│ └── ccapi_event_test.cpp
├── hash
│ ├── CMakeLists.txt
│ └── ccapi_hash_test.cpp
├── hmac
│ ├── CMakeLists.txt
│ └── ccapi_hmac_test.cpp
├── jwt
│ ├── CMakeLists.txt
│ └── ccapi_jwt_test.cpp
├── subscription
│ ├── CMakeLists.txt
│ └── ccapi_subscription_test.cpp
├── url
│ ├── CMakeLists.txt
│ └── ccapi_url_test.cpp
└── util
│ ├── CMakeLists.txt
│ └── ccapi_util_test.cpp
├── execution_management
├── binance_us
│ ├── CMakeLists.txt
│ └── test.cpp
├── binance_usds_futures
│ ├── CMakeLists.txt
│ └── test.cpp
├── bitmex
│ ├── CMakeLists.txt
│ └── test.cpp
├── coinbase
│ ├── CMakeLists.txt
│ └── test.cpp
├── erisx
│ ├── CMakeLists.txt
│ └── test.cpp
├── gateio
│ ├── CMakeLists.txt
│ └── test.cpp
├── gemini
│ ├── CMakeLists.txt
│ └── test.cpp
├── huobi
│ ├── CMakeLists.txt
│ └── test.cpp
├── huobi_coin_swap
│ ├── CMakeLists.txt
│ └── test.cpp
├── huobi_usdt_swap
│ ├── CMakeLists.txt
│ └── test.cpp
├── kraken
│ ├── CMakeLists.txt
│ └── test.cpp
├── kraken_futures
│ ├── CMakeLists.txt
│ └── test.cpp
├── kucoin
│ ├── CMakeLists.txt
│ └── test.cpp
└── okx
│ ├── CMakeLists.txt
│ └── test.cpp
└── market_data
└── generic
├── CMakeLists.txt
└── test.cpp
/.clang-format:
--------------------------------------------------------------------------------
1 | BasedOnStyle: Google
2 | ColumnLimit: 160
3 | SeparateDefinitionBlocks: Always
4 | MaxEmptyLinesToKeep: 1
5 | Standard: c++17
6 | InsertNewlineAtEOF: true
7 |
--------------------------------------------------------------------------------
/.cmake-format.yml:
--------------------------------------------------------------------------------
1 | # CMake format settings
2 | indent_width: 2 # Number of spaces for indentation
3 | continuation_indent_width: 4 # Indentation for continued lines
4 | line_width: 160 # Maximum line width
5 | tab_size: 2 # Tab size (number of spaces per tab)
6 | use_tabs: false # Whether to use tabs instead of spaces
7 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Create a report to help us improve
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Describe the bug**
11 | A clear and concise description of what the bug is.
12 |
13 | **To Reproduce**
14 | Steps to reproduce the behavior:
15 | 1. Go to '...'
16 | 2. Click on '....'
17 | 3. Scroll down to '....'
18 | 4. See error
19 |
20 | **Expected behavior**
21 | A clear and concise description of what you expected to happen.
22 |
23 | **Screenshots**
24 | If applicable, add screenshots to help explain your problem.
25 |
26 | **Additional context**
27 | Add any other context about the problem here (such as operating system, compiler used, git commit hash used, etc.).
28 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: Suggest an idea for this project
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Is your feature request related to a problem? Please describe.**
11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12 |
13 | **Describe the solution you'd like**
14 | A clear and concise description of what you want to happen.
15 |
16 | **Describe alternatives you've considered**
17 | A clear and concise description of any alternative solutions or features you've considered.
18 |
19 | **Additional context**
20 | Add any other context or screenshots about the feature request here.
21 |
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | # To get started with Dependabot version updates, you'll need to specify which
2 | # package ecosystems to update and where the package manifests are located.
3 | # Please see the documentation for all configuration options:
4 | # https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
5 |
6 | version: 2
7 | updates:
8 | - package-ecosystem: "github-actions" # See documentation for possible values
9 | directory: "/" # Location of package manifests
10 | schedule:
11 | interval: "weekly"
12 |
--------------------------------------------------------------------------------
/.github/workflows/release.yml:
--------------------------------------------------------------------------------
1 | name: Release
2 | on:
3 | push:
4 | branches:
5 | - master
6 | jobs:
7 | release:
8 | name: release
9 | runs-on: ubuntu-latest
10 | steps:
11 | - uses: actions/checkout@v4
12 | - uses: actions/setup-node@v4
13 | - run: 'echo ''{
14 | "name": "ccapi_cpp",
15 | "version": "1.0.0",
16 | "devDependencies": {
17 | "semantic-release": "^17.1.1",
18 | "conventional-changelog-conventionalcommits":"^4.4.0"
19 | },
20 | "release": {
21 | "branches": ["master"],
22 | "plugins": [["@semantic-release/commit-analyzer", {
23 | "preset": "conventionalcommits",
24 | "releaseRules": [
25 | {"type": "fix", "release": "patch"},
26 | {"type": "feat", "release": "minor"},
27 | {"type": "build", "release": "patch"},
28 | {"type": "chore", "release": "patch"},
29 | {"type": "ci", "release": "patch"},
30 | {"type": "docs", "release": "patch"},
31 | {"type": "style", "release": "patch"},
32 | {"type": "refactor", "release": "patch"},
33 | {"type": "perf", "release": "patch"},
34 | {"type": "test", "release": "patch"},
35 | {"type": "minor", "release": "minor"},
36 | {"type": "major", "release": "major"},
37 | {"type": "misc", "release": "patch"}
38 | ]
39 | }], ["@semantic-release/release-notes-generator", {
40 | "preset": "conventionalcommits"
41 | }], "@semantic-release/github"]
42 | }
43 | }'' > "package.json"'
44 | - run: npm install
45 | - run: npm ci
46 | - env:
47 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
48 | run: npx semantic-release
49 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # CLion
2 | .idea/
3 | app/.idea/
4 | app/cmake-build-debug/
5 | include/.idea/
6 |
7 | # Deploy
8 | build/
9 | *_dev.env
10 | *_dev_*.env
11 |
12 | # General
13 | .DS_Store
14 | .AppleDouble
15 | .LSOverride
16 |
17 |
18 | # Icon must end with two \r
19 | Icon
20 |
21 |
22 | # Thumbnails
23 | ._*
24 |
25 | # Files that might appear in the root of a volume
26 | .DocumentRevisions-V100
27 | .fseventsd
28 | .Spotlight-V100
29 | .TemporaryItems
30 | .Trashes
31 | .VolumeIcon.icns
32 | .com.apple.timemachine.donotpresent
33 |
34 | # Directories potentially created on remote AFP share
35 | .AppleDB
36 | .AppleDesktop
37 | Network Trash Folder
38 | Temporary Items
39 | .apdisk
40 |
41 | .metadata
42 | bin/
43 | tmp/
44 | *.tmp
45 | *.bak
46 | *.swp
47 | *~.nib
48 | local.properties
49 | .settings/
50 | .loadpath
51 | .recommenders
52 |
53 | # External tool builders
54 | .externalToolBuilders/
55 |
56 | # Locally stored "Eclipse launch configurations"
57 | *.launch
58 |
59 | # PyDev specific (Python IDE for Eclipse)
60 | *.pydevproject
61 |
62 | # CDT-specific (C/C++ Development Tooling)
63 | .cproject
64 |
65 | # CDT- autotools
66 | .autotools
67 |
68 | # Java annotation processor (APT)
69 | .factorypath
70 |
71 | # PDT-specific (PHP Development Tools)
72 | .buildpath
73 |
74 | # sbteclipse plugin
75 | .target
76 |
77 | # Tern plugin
78 | .tern-project
79 |
80 | # TeXlipse plugin
81 | .texlipse
82 |
83 | # STS (Spring Tool Suite)
84 | .springBeans
85 |
86 | # Code Recommenders
87 | .recommenders/
88 |
89 | # Annotation Processing
90 | .apt_generated/
91 |
92 | # Scala IDE specific (Scala & Java development for Eclipse)
93 | .cache-main
94 | .scala_dependencies
95 | .worksheet
96 |
97 | # Byte-compiled / optimized / DLL files
98 | __pycache__/
99 | *.py[cod]
100 |
101 | # C extensions
102 | *.so
103 |
104 | # Distribution / packaging
105 | bin/
106 | build/
107 | develop-eggs/
108 | dist/
109 | eggs/
110 | lib/
111 | lib64/
112 | parts/
113 | sdist/
114 | var/
115 | *.egg-info/
116 | .installed.cfg
117 | *.egg
118 |
119 | # Installer logs
120 | pip-log.txt
121 | pip-delete-this-directory.txt
122 |
123 | # Unit test / coverage reports
124 | .tox/
125 | .coverage
126 | .cache
127 | nosetests.xml
128 | coverage.xml
129 |
130 | # Translations
131 | *.mo
132 |
133 | # Mr Developer
134 | .mr.developer.cfg
135 | .project
136 | .pydevproject
137 |
138 | # Rope
139 | .ropeproject
140 |
141 | # Django stuff:
142 | *.log
143 | *.pot
144 |
145 | # Sphinx documentation
146 | docs/_build/
147 |
148 | # Other
149 | .project
150 | .venv/
151 | target/
152 | obj/
153 | node_modules/
154 | package-lock.json
155 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) Crypto Chassis
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/binding/ccapi_logger.cpp:
--------------------------------------------------------------------------------
1 | #include "ccapi_cpp/ccapi_logger.h"
2 |
3 | namespace ccapi {
4 | Logger* Logger::logger = nullptr;
5 | }
6 |
--------------------------------------------------------------------------------
/binding/csharp/ccapi.csproj.in:
--------------------------------------------------------------------------------
1 |
2 |
3 | net6.0
4 | enable
5 |
6 |
7 |
--------------------------------------------------------------------------------
/binding/csharp/example/enable_library_logging/MainProgram.cs:
--------------------------------------------------------------------------------
1 | // usage: when generating the binding code, do cmake -DCCAPI_ENABLE_LOG_TRACE=ON ..., see https://github.com/crypto-chassis/ccapi#non-c
2 | public class MainProgram {
3 | class MyLogger : ccapi.Logger {
4 | public override void LogMessage(string severity, string threadId, string timeISO, string fileName, string lineNumber, string message) {
5 | lock (this._myLock) {
6 | System.Console.WriteLine(
7 | string.Format("{0}: [{1}] {{{2}:{3}}} {4}{5}{6}", threadId, timeISO, fileName, lineNumber, severity, new string(' ', 8), message));
8 | }
9 | }
10 | private readonly object _myLock = new object();
11 | }
12 | public static void Main(string[] args) {
13 | var myLogger = new MyLogger();
14 | ccapi.Logger.logger = myLogger;
15 | var option = new ccapi.SessionOptions();
16 | var config = new ccapi.SessionConfigs();
17 | var session = new ccapi.Session(option, config);
18 | var subscription = new ccapi.Subscription("okx", "BTC-USDT", "MARKET_DEPTH");
19 | session.Subscribe(subscription);
20 | System.Threading.Thread.Sleep(10000);
21 | session.Stop();
22 | System.Console.WriteLine("Bye");
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/binding/csharp/example/enable_library_logging/main.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | Exe
4 | net6.0
5 | enable
6 | Release
7 | to be provided in command line
8 |
9 |
10 |
11 | $(CcapiLibraryPath)
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/binding/csharp/example/execution_management_simple_request/MainProgram.cs:
--------------------------------------------------------------------------------
1 | class MainProgram {
2 | class MyEventHandler : ccapi.EventHandler {
3 | public override bool ProcessEvent(ccapi.Event event_, ccapi.Session session) {
4 | System.Console.WriteLine(string.Format("Received an event:\n{0}", event_.ToStringPretty(2, 2)));
5 | return true;
6 | }
7 | }
8 | static void Main(string[] args) {
9 | if (System.Environment.GetEnvironmentVariable("OKX_API_KEY") is null) {
10 | System.Console.Error.WriteLine("Please set environment variable OKX_API_KEY");
11 | return;
12 | }
13 | if (System.Environment.GetEnvironmentVariable("OKX_API_SECRET") is null) {
14 | System.Console.Error.WriteLine("Please set environment variable OKX_API_SECRET");
15 | return;
16 | }
17 | if (System.Environment.GetEnvironmentVariable("OKX_API_PASSPHRASE") is null) {
18 | System.Console.Error.WriteLine("Please set environment variable OKX_API_PASSPHRASE");
19 | return;
20 | }
21 | var eventHandler = new MyEventHandler();
22 | var option = new ccapi.SessionOptions();
23 | var config = new ccapi.SessionConfigs();
24 | var session = new ccapi.Session(option, config, eventHandler);
25 | var request = new ccapi.Request(ccapi.Request.Operation.CREATE_ORDER, "okx", "BTC-USDT");
26 | var param = new ccapi.MapStringString();
27 | param.Add("SIDE", "BUY");
28 | param.Add("QUANTITY", "0.0005");
29 | param.Add("LIMIT_PRICE", "20000");
30 | request.AppendParam(param);
31 | session.SendRequest(request);
32 | System.Threading.Thread.Sleep(10000);
33 | session.Stop();
34 | System.Console.WriteLine("Bye");
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/binding/csharp/example/execution_management_simple_request/main.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | Exe
4 | net6.0
5 | enable
6 | Release
7 | to be provided in command line
8 |
9 |
10 |
11 | $(CcapiLibraryPath)
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/binding/csharp/example/execution_management_simple_subscription/MainProgram.cs:
--------------------------------------------------------------------------------
1 | class MainProgram {
2 | class MyEventHandler : ccapi.EventHandler {
3 | public override bool ProcessEvent(ccapi.Event event_, ccapi.Session session) {
4 | if (event_.GetType_() == ccapi.Event.Type.SUBSCRIPTION_STATUS) {
5 | System.Console.WriteLine(string.Format("Received an event of type SUBSCRIPTION_STATUS:\n{0}", event_.ToStringPretty(2, 2)));
6 | var message = event_.GetMessageList()[0];
7 | if (message.GetType_() == ccapi.Message.Type.SUBSCRIPTION_STARTED) {
8 | var request = new ccapi.Request(ccapi.Request.Operation.CREATE_ORDER, "okx", "BTC-USDT");
9 | var param = new ccapi.MapStringString();
10 | param.Add("SIDE", "BUY");
11 | param.Add("QUANTITY", "0.0005");
12 | param.Add("LIMIT_PRICE", "20000");
13 | request.AppendParam(param);
14 | session.SendRequest(request);
15 | }
16 | } else if (event_.GetType_() == ccapi.Event.Type.SUBSCRIPTION_DATA) {
17 | System.Console.WriteLine(string.Format("Received an event of type SUBSCRIPTION_DATA:\n{0}", event_.ToStringPretty(2, 2)));
18 | }
19 | return true;
20 | }
21 | }
22 | static void Main(string[] args) {
23 | if (System.Environment.GetEnvironmentVariable("OKX_API_KEY") is null) {
24 | System.Console.Error.WriteLine("Please set environment variable OKX_API_KEY");
25 | return;
26 | }
27 | if (System.Environment.GetEnvironmentVariable("OKX_API_SECRET") is null) {
28 | System.Console.Error.WriteLine("Please set environment variable OKX_API_SECRET");
29 | return;
30 | }
31 | if (System.Environment.GetEnvironmentVariable("OKX_API_PASSPHRASE") is null) {
32 | System.Console.Error.WriteLine("Please set environment variable OKX_API_PASSPHRASE");
33 | return;
34 | }
35 | var eventHandler = new MyEventHandler();
36 | var option = new ccapi.SessionOptions();
37 | var config = new ccapi.SessionConfigs();
38 | var session = new ccapi.Session(option, config, eventHandler);
39 | var subscriptionList = new ccapi.SubscriptionList();
40 | subscriptionList.Add(new ccapi.Subscription("okx", "BTC-USDT", "ORDER_UPDATE"));
41 | session.Subscribe(subscriptionList);
42 | System.Threading.Thread.Sleep(10000);
43 | session.Stop();
44 | System.Console.WriteLine("Bye");
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/binding/csharp/example/execution_management_simple_subscription/main.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | Exe
4 | net6.0
5 | enable
6 | Release
7 | to be provided in command line
8 |
9 |
10 |
11 | $(CcapiLibraryPath)
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/binding/csharp/example/fix_simple/MainProgram.cs:
--------------------------------------------------------------------------------
1 | class MainProgram {
2 | class MyEventHandler : ccapi.EventHandler {
3 | public override bool ProcessEvent(ccapi.Event event_, ccapi.Session session) {
4 | if (event_.GetType_() == ccapi.Event.Type.AUTHORIZATION_STATUS) {
5 | System.Console.WriteLine(string.Format("Received an event of type AUTHORIZATION_STATUS:\n{0}", event_.ToStringPretty(2, 2)));
6 | var message = event_.GetMessageList()[0];
7 | if (message.GetType_() == ccapi.Message.Type.AUTHORIZATION_SUCCESS) {
8 | var request = new ccapi.Request(ccapi.Request.Operation.FIX, "coinbase", "", "same correlation id for subscription and request");
9 | var param = new ccapi.VectorPairIntString();
10 | param.Add(new ccapi.PairIntString(35, "D"));
11 | param.Add(new ccapi.PairIntString(11, "6d4eb0fb-2229-469f-873e-557dd78ac11e"));
12 | param.Add(new ccapi.PairIntString(55, "BTC-USD"));
13 | param.Add(new ccapi.PairIntString(54, "1"));
14 | param.Add(new ccapi.PairIntString(44, "20000"));
15 | param.Add(new ccapi.PairIntString(38, "0.001"));
16 | param.Add(new ccapi.PairIntString(40, "2"));
17 | param.Add(new ccapi.PairIntString(59, "1"));
18 | request.AppendParamFix(param);
19 | session.SendRequestByFix(request);
20 | }
21 | } else if (event_.GetType_() == ccapi.Event.Type.FIX) {
22 | System.Console.WriteLine(string.Format("Received an event of type FIX:\n{0}", event_.ToStringPretty(2, 2)));
23 | }
24 | return true;
25 | }
26 | }
27 | static void Main(string[] args) {
28 | if (System.Environment.GetEnvironmentVariable("COINBASE_API_KEY") is null) {
29 | System.Console.Error.WriteLine("Please set environment variable COINBASE_API_KEY");
30 | return;
31 | }
32 | if (System.Environment.GetEnvironmentVariable("COINBASE_API_SECRET") is null) {
33 | System.Console.Error.WriteLine("Please set environment variable COINBASE_API_SECRET");
34 | return;
35 | }
36 | if (System.Environment.GetEnvironmentVariable("COINBASE_API_PASSPHRASE") is null) {
37 | System.Console.Error.WriteLine("Please set environment variable COINBASE_API_PASSPHRASE");
38 | return;
39 | }
40 | var eventHandler = new MyEventHandler();
41 | var option = new ccapi.SessionOptions();
42 | var config = new ccapi.SessionConfigs();
43 | var session = new ccapi.Session(option, config, eventHandler);
44 | var subscription = new ccapi.Subscription("coinbase", "", "FIX", "", "same correlation id for subscription and request");
45 | session.SubscribeByFix(subscription);
46 | System.Threading.Thread.Sleep(10000);
47 | session.Stop();
48 | System.Console.WriteLine("Bye");
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/binding/csharp/example/fix_simple/main.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | Exe
4 | net6.0
5 | enable
6 | Release
7 | to be provided in command line
8 |
9 |
10 |
11 | $(CcapiLibraryPath)
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/binding/csharp/example/handle_exception/MainProgram.cs:
--------------------------------------------------------------------------------
1 | class MainProgram {
2 | class MyEventHandler : ccapi.EventHandler {
3 | public override bool ProcessEvent(ccapi.Event event_, ccapi.Session session) {
4 | try {
5 | throw new System.Exception("oops");
6 | } catch (System.Exception e) {
7 | System.Console.WriteLine(e.ToString());
8 | System.Environment.Exit(1);
9 | }
10 | return true;
11 | }
12 | }
13 | static void Main(string[] args) {
14 | var eventHandler = new MyEventHandler();
15 | var option = new ccapi.SessionOptions();
16 | var config = new ccapi.SessionConfigs();
17 | var session = new ccapi.Session(option, config, eventHandler);
18 | var subscriptionList = new ccapi.SubscriptionList();
19 | subscriptionList.Add(new ccapi.Subscription("okx", "BTC-USDT", "MARKET_DEPTH"));
20 | session.Subscribe(subscriptionList);
21 | System.Threading.Thread.Sleep(10000);
22 | session.Stop();
23 | System.Console.WriteLine("Bye");
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/binding/csharp/example/handle_exception/main.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | Exe
4 | net6.0
5 | enable
6 | Release
7 | to be provided in command line
8 |
9 |
10 |
11 | $(CcapiLibraryPath)
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/binding/csharp/example/market_data_multiple_subscription/MainProgram.cs:
--------------------------------------------------------------------------------
1 | class MainProgram {
2 | class MyEventHandler : ccapi.EventHandler {
3 | public override bool ProcessEvent(ccapi.Event event_, ccapi.Session session) {
4 | if (event_.GetType_() == ccapi.Event.Type.SUBSCRIPTION_DATA) {
5 | foreach (var message in event_.GetMessageList()) {
6 | var correlationId = message.GetCorrelationIdList()[0];
7 | System.Console.WriteLine(string.Format("{0}: Best bid and ask at {1} are:", correlationId, message.GetTimeISO()));
8 | foreach (var element in message.GetElementList()) {
9 | var elementNameValueMap = element.GetNameValueMap();
10 | foreach (var entry in elementNameValueMap) {
11 | var name = entry.Key;
12 | var value = entry.Value;
13 | System.Console.WriteLine(string.Format(" {0} = {1}", name, value));
14 | }
15 | }
16 | }
17 | }
18 | return true;
19 | }
20 | }
21 | static void Main(string[] args) {
22 | var eventHandler = new MyEventHandler();
23 | var option = new ccapi.SessionOptions();
24 | var config = new ccapi.SessionConfigs();
25 | var session = new ccapi.Session(option, config, eventHandler);
26 | var subscriptionList = new ccapi.SubscriptionList();
27 | subscriptionList.Add(new ccapi.Subscription("okx", "BTC-USDT", "MARKET_DEPTH", "", "BTC"));
28 | subscriptionList.Add(new ccapi.Subscription("okx", "ETH-USDT", "MARKET_DEPTH", "", "ETH"));
29 | session.Subscribe(subscriptionList);
30 | System.Threading.Thread.Sleep(10000);
31 | session.Stop();
32 | System.Console.WriteLine("Bye");
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/binding/csharp/example/market_data_multiple_subscription/main.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | Exe
4 | net6.0
5 | enable
6 | Release
7 | to be provided in command line
8 |
9 |
10 |
11 | $(CcapiLibraryPath)
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/binding/csharp/example/market_data_simple_request/MainProgram.cs:
--------------------------------------------------------------------------------
1 | class MainProgram {
2 | class MyEventHandler : ccapi.EventHandler {
3 | public override bool ProcessEvent(ccapi.Event event_, ccapi.Session session) {
4 | System.Console.WriteLine(string.Format("Received an event:\n{0}", event_.ToStringPretty(2, 2)));
5 | return true;
6 | }
7 | }
8 | static void Main(string[] args) {
9 | var eventHandler = new MyEventHandler();
10 | var option = new ccapi.SessionOptions();
11 | var config = new ccapi.SessionConfigs();
12 | var session = new ccapi.Session(option, config, eventHandler);
13 | var request = new ccapi.Request(ccapi.Request.Operation.GET_RECENT_TRADES, "okx", "BTC-USDT");
14 | var param = new ccapi.MapStringString();
15 | param.Add("LIMIT", "1");
16 | request.AppendParam(param);
17 | session.SendRequest(request);
18 | System.Threading.Thread.Sleep(10000);
19 | session.Stop();
20 | System.Console.WriteLine("Bye");
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/binding/csharp/example/market_data_simple_request/main.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | Exe
4 | net6.0
5 | enable
6 | Release
7 | to be provided in command line
8 |
9 |
10 |
11 | $(CcapiLibraryPath)
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/binding/csharp/example/market_data_simple_subscription/MainProgram.cs:
--------------------------------------------------------------------------------
1 | class MainProgram {
2 | class MyEventHandler : ccapi.EventHandler {
3 | public override bool ProcessEvent(ccapi.Event event_, ccapi.Session session) {
4 | if (event_.GetType_() == ccapi.Event.Type.SUBSCRIPTION_STATUS) {
5 | System.Console.WriteLine(string.Format("Received an event of type SUBSCRIPTION_STATUS:\n{0}", event_.ToStringPretty(2, 2)));
6 | } else if (event_.GetType_() == ccapi.Event.Type.SUBSCRIPTION_DATA) {
7 | foreach (var message in event_.GetMessageList()) {
8 | System.Console.WriteLine(string.Format("Best bid and ask at {0} are:", message.GetTimeISO()));
9 | foreach (var element in message.GetElementList()) {
10 | var elementNameValueMap = element.GetNameValueMap();
11 | foreach (var entry in elementNameValueMap) {
12 | var name = entry.Key;
13 | var value = entry.Value;
14 | System.Console.WriteLine(string.Format(" {0} = {1}", name, value));
15 | }
16 | }
17 | }
18 | }
19 | return true;
20 | }
21 | }
22 | static void Main(string[] args) {
23 | var eventHandler = new MyEventHandler();
24 | var option = new ccapi.SessionOptions();
25 | var config = new ccapi.SessionConfigs();
26 | var session = new ccapi.Session(option, config, eventHandler);
27 | var subscriptionList = new ccapi.SubscriptionList();
28 | subscriptionList.Add(new ccapi.Subscription("okx", "BTC-USDT", "MARKET_DEPTH"));
29 | session.Subscribe(subscriptionList);
30 | System.Threading.Thread.Sleep(10000);
31 | session.Stop();
32 | System.Console.WriteLine("Bye");
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/binding/csharp/example/market_data_simple_subscription/main.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | Exe
4 | net6.0
5 | enable
6 | Release
7 | to be provided in command line
8 |
9 |
10 |
11 | $(CcapiLibraryPath)
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/binding/csharp/swig_interface_ccapi_language_specific.i:
--------------------------------------------------------------------------------
1 | %rename("%(camelcase)s", %$isfunction, %$ismember, %$ispublic) "";
2 | %rename("%(camelcase)s", %$isfunction, %$ismember, %$isprotected) "";
3 | %rename("_%(lowercamelcase)s", %$ismember, %$isprivate) "";
4 | %rename("%(regex:/^(toString|getType|setType)$/\\u\\1_/)s") "";
5 |
--------------------------------------------------------------------------------
/binding/csharp/test/MainProgram.cs:
--------------------------------------------------------------------------------
1 | class MainProgram {
2 | class MyEventHandler : ccapi.EventHandler {
3 | public override bool ProcessEvent(ccapi.Event event_, ccapi.Session session) {
4 | return true;
5 | }
6 | }
7 | static void Main(string[] args) {
8 | var eventHandler = new MyEventHandler();
9 | var option = new ccapi.SessionOptions();
10 | var config = new ccapi.SessionConfigs();
11 | var session = new ccapi.Session(option, config, eventHandler);
12 | var subscriptionList = new ccapi.SubscriptionList();
13 | subscriptionList.Add(new ccapi.Subscription("okx", "BTC-USDT", "MARKET_DEPTH"));
14 | session.Subscribe(subscriptionList);
15 | var request = new ccapi.Request(ccapi.Request.Operation.GET_RECENT_TRADES, "okx", "BTC-USDT");
16 | var param = new ccapi.MapStringString();
17 | param.Add("LIMIT", "1");
18 | request.AppendParam(param);
19 | session.SendRequest(request);
20 | session.Stop();
21 | System.Console.WriteLine("Bye");
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/binding/csharp/test/main.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | Exe
4 | net6.0
5 | enable
6 | Release
7 | to be provided in command line
8 |
9 |
10 |
11 | $(CcapiLibraryPath)
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/binding/go/example/enable_library_logging/go.mod:
--------------------------------------------------------------------------------
1 | module main
2 |
3 | require (
4 | cryptochassis.com/ccapi v1.0.0
5 | )
6 |
7 | replace cryptochassis.com/ccapi => ../../../build/go/packaging/1.0.0
8 |
--------------------------------------------------------------------------------
/binding/go/example/enable_library_logging/main.go:
--------------------------------------------------------------------------------
1 | // usage: when generating the binding code, do cmake -DCCAPI_ENABLE_LOG_TRACE=ON ..., see https://github.com/crypto-chassis/ccapi#non-c
2 | package main
3 |
4 | import (
5 | "cryptochassis.com/ccapi"
6 | "fmt"
7 | "strings"
8 | "sync"
9 | "time"
10 | )
11 |
12 | type MyLogger struct {
13 | ccapi.Logger
14 | m sync.Mutex
15 | }
16 |
17 | func (ml *MyLogger) LogMessage(severity string, threadId string, timeISO string, fileName string, lineNumber string, message string) {
18 | ml.m.Lock()
19 | defer ml.m.Unlock()
20 | fmt.Printf("%s: [%s] {%s:%s} %s%s%s\n", threadId, timeISO, fileName, lineNumber, severity, strings.Repeat(" ", 8), message)
21 | }
22 |
23 | func main() {
24 | ml := &MyLogger{}
25 | ml.Logger = ccapi.NewDirectorLogger(ml)
26 | defer func() {
27 | ccapi.DeleteDirectorLogger(ml.Logger)
28 | }()
29 | ccapi.SetLoggerLogger(ml)
30 | option := ccapi.NewSessionOptions()
31 | defer ccapi.DeleteSessionOptions(option)
32 | config := ccapi.NewSessionConfigs()
33 | defer ccapi.DeleteSessionConfigs(config)
34 | session := ccapi.NewSession(option, config)
35 | defer ccapi.DeleteSession(session)
36 | subscriptionList := ccapi.NewSubscriptionList()
37 | defer ccapi.DeleteSubscriptionList(subscriptionList)
38 | subscription := ccapi.NewSubscription("okx", "BTC-USDT", "MARKET_DEPTH")
39 | defer ccapi.DeleteSubscription(subscription)
40 | subscriptionList.Add(subscription)
41 | session.Subscribe(subscriptionList)
42 | time.Sleep(10 * time.Second)
43 | session.Stop()
44 | fmt.Println("Bye")
45 | }
46 |
--------------------------------------------------------------------------------
/binding/go/example/execution_management_simple_request/go.mod:
--------------------------------------------------------------------------------
1 | module main
2 |
3 | require (
4 | cryptochassis.com/ccapi v1.0.0
5 | )
6 |
7 | replace cryptochassis.com/ccapi => ../../../build/go/packaging/1.0.0
8 |
--------------------------------------------------------------------------------
/binding/go/example/execution_management_simple_request/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "cryptochassis.com/ccapi"
5 | "fmt"
6 | "os"
7 | "time"
8 | )
9 |
10 | type MyEventHandler struct {
11 | ccapi.EventHandler
12 | }
13 |
14 | func (*MyEventHandler) ProcessEvent(event ccapi.Event, session ccapi.Session) bool {
15 | fmt.Printf("Received an event:\n%s\n", event.ToStringPretty(2, 2))
16 | return true
17 | }
18 |
19 | func main() {
20 | if len(os.Getenv("OKX_API_KEY")) == 0 {
21 | fmt.Fprintf(os.Stderr, "Please set environment variable OKX_API_KEY\n")
22 | os.Exit(1)
23 | }
24 | if len(os.Getenv("OKX_API_SECRET")) == 0 {
25 | fmt.Fprintf(os.Stderr, "Please set environment variable OKX_API_SECRET\n")
26 | os.Exit(1)
27 | }
28 | if len(os.Getenv("OKX_API_PASSPHRASE")) == 0 {
29 | fmt.Fprintf(os.Stderr, "Please set environment variable OKX_API_PASSPHRASE\n")
30 | os.Exit(1)
31 | }
32 | option := ccapi.NewSessionOptions()
33 | defer ccapi.DeleteSessionOptions(option)
34 | config := ccapi.NewSessionConfigs()
35 | defer ccapi.DeleteSessionConfigs(config)
36 | meh := &MyEventHandler{}
37 | meh.EventHandler = ccapi.NewDirectorEventHandler(meh)
38 | defer func() {
39 | ccapi.DeleteDirectorEventHandler(meh.EventHandler)
40 | }()
41 | session := ccapi.NewSession(option, config, meh.EventHandler)
42 | defer ccapi.DeleteSession(session)
43 | request := ccapi.NewRequest(ccapi.RequestOperation_CREATE_ORDER, "okx", "BTC-USDT")
44 | defer ccapi.DeleteRequest(request)
45 | param := ccapi.NewMapStringString()
46 | defer ccapi.DeleteMapStringString(param)
47 | param.Set("SIDE", "BUY")
48 | param.Set("QUANTITY", "0.0005")
49 | param.Set("LIMIT_PRICE", "20000")
50 | request.AppendParam(param)
51 | session.SendRequest(request)
52 | time.Sleep(10 * time.Second)
53 | session.Stop()
54 | fmt.Println("Bye")
55 | }
56 |
--------------------------------------------------------------------------------
/binding/go/example/execution_management_simple_subscription/go.mod:
--------------------------------------------------------------------------------
1 | module main
2 |
3 | require (
4 | cryptochassis.com/ccapi v1.0.0
5 | )
6 |
7 | replace cryptochassis.com/ccapi => ../../../build/go/packaging/1.0.0
8 |
--------------------------------------------------------------------------------
/binding/go/example/execution_management_simple_subscription/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "cryptochassis.com/ccapi"
5 | "fmt"
6 | "os"
7 | "time"
8 | )
9 |
10 | type MyEventHandler struct {
11 | ccapi.EventHandler
12 | }
13 |
14 | func (*MyEventHandler) ProcessEvent(event ccapi.Event, session ccapi.Session) bool {
15 | if event.GetType() == ccapi.EventType_SUBSCRIPTION_STATUS {
16 | fmt.Printf("Received an event of type SUBSCRIPTION_STATUS:\n%s\n", event.ToStringPretty(2, 2))
17 | message := event.GetMessageList().Get(0)
18 | if message.GetType() == ccapi.MessageType_SUBSCRIPTION_STARTED {
19 | request := ccapi.NewRequest(ccapi.RequestOperation_CREATE_ORDER, "okx", "BTC-USDT")
20 | defer ccapi.DeleteRequest(request)
21 | param := ccapi.NewMapStringString()
22 | defer ccapi.DeleteMapStringString(param)
23 | param.Set("SIDE", "BUY")
24 | param.Set("QUANTITY", "0.0005")
25 | param.Set("LIMIT_PRICE", "20000")
26 | request.AppendParam(param)
27 | session.SendRequest(request)
28 | }
29 | } else if event.GetType() == ccapi.EventType_SUBSCRIPTION_DATA {
30 | fmt.Printf("Received an event of type SUBSCRIPTION_DATA:\n%s\n", event.ToStringPretty(2, 2))
31 | }
32 | return true
33 | }
34 |
35 | func main() {
36 | if len(os.Getenv("OKX_API_KEY")) == 0 {
37 | fmt.Fprintf(os.Stderr, "Please set environment variable OKX_API_KEY\n")
38 | os.Exit(1)
39 | }
40 | if len(os.Getenv("OKX_API_SECRET")) == 0 {
41 | fmt.Fprintf(os.Stderr, "Please set environment variable OKX_API_SECRET\n")
42 | os.Exit(1)
43 | }
44 | if len(os.Getenv("OKX_API_PASSPHRASE")) == 0 {
45 | fmt.Fprintf(os.Stderr, "Please set environment variable OKX_API_PASSPHRASE\n")
46 | os.Exit(1)
47 | }
48 | option := ccapi.NewSessionOptions()
49 | defer ccapi.DeleteSessionOptions(option)
50 | config := ccapi.NewSessionConfigs()
51 | defer ccapi.DeleteSessionConfigs(config)
52 | meh := &MyEventHandler{}
53 | meh.EventHandler = ccapi.NewDirectorEventHandler(meh)
54 | defer func() {
55 | ccapi.DeleteDirectorEventHandler(meh.EventHandler)
56 | }()
57 | session := ccapi.NewSession(option, config, meh.EventHandler)
58 | defer ccapi.DeleteSession(session)
59 | subscriptionList := ccapi.NewSubscriptionList()
60 | defer ccapi.DeleteSubscriptionList(subscriptionList)
61 | subscription := ccapi.NewSubscription("okx", "BTC-USDT", "ORDER_UPDATE")
62 | defer ccapi.DeleteSubscription(subscription)
63 | subscriptionList.Add(subscription)
64 | session.Subscribe(subscriptionList)
65 | time.Sleep(10 * time.Second)
66 | session.Stop()
67 | fmt.Println("Bye")
68 | }
69 |
--------------------------------------------------------------------------------
/binding/go/example/fix_simple/go.mod:
--------------------------------------------------------------------------------
1 | module main
2 |
3 | require (
4 | cryptochassis.com/ccapi v1.0.0
5 | )
6 |
7 | replace cryptochassis.com/ccapi => ../../../build/go/packaging/1.0.0
8 |
--------------------------------------------------------------------------------
/binding/go/example/fix_simple/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "cryptochassis.com/ccapi"
5 | "fmt"
6 | "os"
7 | "time"
8 | )
9 |
10 | type MyEventHandler struct {
11 | ccapi.EventHandler
12 | }
13 |
14 | func (*MyEventHandler) ProcessEvent(event ccapi.Event, session ccapi.Session) bool {
15 | if event.GetType() == ccapi.EventType_AUTHORIZATION_STATUS {
16 | fmt.Printf("Received an event of type AUTHORIZATION_STATUS:\n%s\n", event.ToStringPretty(2, 2))
17 | message := event.GetMessageList().Get(0)
18 | if message.GetType() == ccapi.MessageType_AUTHORIZATION_SUCCESS {
19 | request := ccapi.NewRequest(ccapi.RequestOperation_FIX, "coinbase", "", "same correlation id for subscription and request")
20 | defer ccapi.DeleteRequest(request)
21 | param := ccapi.NewVectorPairIntString()
22 | defer ccapi.DeleteVectorPairIntString(param)
23 | fixParams := []struct {
24 | tag int
25 | value string
26 | }{
27 | {35, "D"},
28 | {11, "6d4eb0fb-2229-469f-873e-557dd78ac11e"},
29 | {55, "BTC-USD"},
30 | {54, "1"},
31 | {44, "20000"},
32 | {38, "0.001"},
33 | {40, "2"},
34 | {59, "1"},
35 | }
36 | for _, fixParam := range fixParams {
37 | aParam := ccapi.NewPairIntString()
38 | aParam.SetFirst(fixParam.tag)
39 | aParam.SetSecond(fixParam.value)
40 | defer ccapi.DeletePairIntString(aParam)
41 | param.Add(aParam)
42 | }
43 | request.AppendParamFix(param)
44 | session.SendRequestByFix(request)
45 | }
46 | } else if event.GetType() == ccapi.EventType_FIX {
47 | fmt.Printf("Received an event of type FIX:\n%s\n", event.ToStringPretty(2, 2))
48 | }
49 | return true
50 | }
51 |
52 | func main() {
53 | if len(os.Getenv("COINBASE_API_KEY")) == 0 {
54 | fmt.Fprintf(os.Stderr, "Please set environment variable COINBASE_API_KEY\n")
55 | os.Exit(1)
56 | }
57 | if len(os.Getenv("COINBASE_API_SECRET")) == 0 {
58 | fmt.Fprintf(os.Stderr, "Please set environment variable COINBASE_API_SECRET\n")
59 | os.Exit(1)
60 | }
61 | if len(os.Getenv("COINBASE_API_PASSPHRASE")) == 0 {
62 | fmt.Fprintf(os.Stderr, "Please set environment variable COINBASE_API_PASSPHRASE\n")
63 | os.Exit(1)
64 | }
65 | option := ccapi.NewSessionOptions()
66 | defer ccapi.DeleteSessionOptions(option)
67 | config := ccapi.NewSessionConfigs()
68 | defer ccapi.DeleteSessionConfigs(config)
69 | meh := &MyEventHandler{}
70 | meh.EventHandler = ccapi.NewDirectorEventHandler(meh)
71 | defer func() {
72 | ccapi.DeleteDirectorEventHandler(meh.EventHandler)
73 | }()
74 | session := ccapi.NewSession(option, config, meh.EventHandler)
75 | defer ccapi.DeleteSession(session)
76 | subscription := ccapi.NewSubscription("coinbase", "", "FIX", "", "same correlation id for subscription and request")
77 | defer ccapi.DeleteSubscription(subscription)
78 | session.SubscribeByFix(subscription)
79 | time.Sleep(10 * time.Second)
80 | session.Stop()
81 | fmt.Println("Bye")
82 | }
83 |
--------------------------------------------------------------------------------
/binding/go/example/handle_exception/go.mod:
--------------------------------------------------------------------------------
1 | module main
2 |
3 | require (
4 | cryptochassis.com/ccapi v1.0.0
5 | )
6 |
7 | replace cryptochassis.com/ccapi => ../../../build/go/packaging/1.0.0
8 |
--------------------------------------------------------------------------------
/binding/go/example/handle_exception/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "cryptochassis.com/ccapi"
5 | "fmt"
6 | "os"
7 | "runtime/debug"
8 | "time"
9 | )
10 |
11 | type MyEventHandler struct {
12 | ccapi.EventHandler
13 | }
14 |
15 | func (*MyEventHandler) ProcessEvent(event ccapi.Event, session ccapi.Session) bool {
16 | defer func() {
17 | if panicInfo := recover(); panicInfo != nil {
18 | fmt.Printf("%v, %s", panicInfo, string(debug.Stack()))
19 | os.Exit(1)
20 | }
21 | }()
22 | panic("oops")
23 | return true
24 | }
25 |
26 | func main() {
27 | option := ccapi.NewSessionOptions()
28 | defer ccapi.DeleteSessionOptions(option)
29 | config := ccapi.NewSessionConfigs()
30 | defer ccapi.DeleteSessionConfigs(config)
31 | meh := &MyEventHandler{}
32 | meh.EventHandler = ccapi.NewDirectorEventHandler(meh)
33 | defer func() {
34 | ccapi.DeleteDirectorEventHandler(meh.EventHandler)
35 | }()
36 | session := ccapi.NewSession(option, config, meh.EventHandler)
37 | defer ccapi.DeleteSession(session)
38 | subscriptionList := ccapi.NewSubscriptionList()
39 | defer ccapi.DeleteSubscriptionList(subscriptionList)
40 | subscription := ccapi.NewSubscription("okx", "BTC-USDT", "MARKET_DEPTH")
41 | defer ccapi.DeleteSubscription(subscription)
42 | subscriptionList.Add(subscription)
43 | session.Subscribe(subscriptionList)
44 | time.Sleep(10 * time.Second)
45 | session.Stop()
46 | fmt.Println("Bye")
47 | }
48 |
--------------------------------------------------------------------------------
/binding/go/example/market_data_multiple_subscription/go.mod:
--------------------------------------------------------------------------------
1 | module main
2 |
3 | require (
4 | cryptochassis.com/ccapi v1.0.0
5 | )
6 |
7 | replace cryptochassis.com/ccapi => ../../../build/go/packaging/1.0.0
8 |
--------------------------------------------------------------------------------
/binding/go/example/market_data_multiple_subscription/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "cryptochassis.com/ccapi"
5 | "fmt"
6 | "time"
7 | )
8 |
9 | type MyEventHandler struct {
10 | ccapi.EventHandler
11 | }
12 |
13 | func (*MyEventHandler) ProcessEvent(event ccapi.Event, session ccapi.Session) bool {
14 | if event.GetType() == ccapi.EventType_SUBSCRIPTION_DATA {
15 | messageList := event.GetMessageList()
16 | for i := 0; i < int(messageList.Size()); i++ {
17 | message := messageList.Get(i)
18 | correlationId := message.GetCorrelationIdList().Get(0)
19 | fmt.Printf("%s: Best bid and ask at %s are:\n", correlationId, message.GetTimeISO())
20 | elementList := message.GetElementList()
21 | for j := 0; j < int(elementList.Size()); j++ {
22 | element := elementList.Get(j)
23 | nameValueMap := element.GetNameValueMap()
24 | if nameValueMap.Has_key("BID_PRICE") {
25 | fmt.Printf(" %s = %s\n", "BID_PRICE", nameValueMap.Get("BID_PRICE"))
26 | }
27 | if nameValueMap.Has_key("BID_SIZE") {
28 | fmt.Printf(" %s = %s\n", "BID_SIZE", nameValueMap.Get("BID_SIZE"))
29 | }
30 | if nameValueMap.Has_key("ASK_PRICE") {
31 | fmt.Printf(" %s = %s\n", "ASK_PRICE", nameValueMap.Get("ASK_PRICE"))
32 | }
33 | if nameValueMap.Has_key("ASK_SIZE") {
34 | fmt.Printf(" %s = %s\n", "ASK_SIZE", nameValueMap.Get("ASK_SIZE"))
35 | }
36 | }
37 | }
38 | }
39 | return true
40 | }
41 |
42 | func main() {
43 | option := ccapi.NewSessionOptions()
44 | defer ccapi.DeleteSessionOptions(option)
45 | config := ccapi.NewSessionConfigs()
46 | defer ccapi.DeleteSessionConfigs(config)
47 | meh := &MyEventHandler{}
48 | meh.EventHandler = ccapi.NewDirectorEventHandler(meh)
49 | defer func() {
50 | ccapi.DeleteDirectorEventHandler(meh.EventHandler)
51 | }()
52 | session := ccapi.NewSession(option, config, meh.EventHandler)
53 | defer ccapi.DeleteSession(session)
54 | subscriptionList := ccapi.NewSubscriptionList()
55 | defer ccapi.DeleteSubscriptionList(subscriptionList)
56 | {
57 | subscription := ccapi.NewSubscription("okx", "BTC-USDT", "MARKET_DEPTH", "", "BTC")
58 | defer ccapi.DeleteSubscription(subscription)
59 | subscriptionList.Add(subscription)
60 | }
61 | {
62 | subscription := ccapi.NewSubscription("okx", "ETH-USDT", "MARKET_DEPTH", "", "ETH")
63 | defer ccapi.DeleteSubscription(subscription)
64 | subscriptionList.Add(subscription)
65 | }
66 |
67 | session.Subscribe(subscriptionList)
68 | time.Sleep(10 * time.Second)
69 | session.Stop()
70 | fmt.Println("Bye")
71 | }
72 |
--------------------------------------------------------------------------------
/binding/go/example/market_data_simple_request/go.mod:
--------------------------------------------------------------------------------
1 | module main
2 |
3 | require (
4 | cryptochassis.com/ccapi v1.0.0
5 | )
6 |
7 | replace cryptochassis.com/ccapi => ../../../build/go/packaging/1.0.0
8 |
--------------------------------------------------------------------------------
/binding/go/example/market_data_simple_request/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "cryptochassis.com/ccapi"
5 | "fmt"
6 | "time"
7 | )
8 |
9 | type MyEventHandler struct {
10 | ccapi.EventHandler
11 | }
12 |
13 | func (*MyEventHandler) ProcessEvent(event ccapi.Event, session ccapi.Session) bool {
14 | fmt.Printf("Received an event:\n%s\n", event.ToStringPretty(2, 2))
15 | return true
16 | }
17 |
18 | func main() {
19 | option := ccapi.NewSessionOptions()
20 | defer ccapi.DeleteSessionOptions(option)
21 | config := ccapi.NewSessionConfigs()
22 | defer ccapi.DeleteSessionConfigs(config)
23 | meh := &MyEventHandler{}
24 | meh.EventHandler = ccapi.NewDirectorEventHandler(meh)
25 | defer func() {
26 | ccapi.DeleteDirectorEventHandler(meh.EventHandler)
27 | }()
28 | session := ccapi.NewSession(option, config, meh.EventHandler)
29 | defer ccapi.DeleteSession(session)
30 | request := ccapi.NewRequest(ccapi.RequestOperation_GET_RECENT_TRADES, "okx", "BTC-USDT")
31 | defer ccapi.DeleteRequest(request)
32 | param := ccapi.NewMapStringString()
33 | defer ccapi.DeleteMapStringString(param)
34 | param.Set("LIMIT", "1")
35 | request.AppendParam(param)
36 | session.SendRequest(request)
37 | time.Sleep(10 * time.Second)
38 | session.Stop()
39 | fmt.Println("Bye")
40 | }
41 |
--------------------------------------------------------------------------------
/binding/go/example/market_data_simple_subscription/go.mod:
--------------------------------------------------------------------------------
1 | module main
2 |
3 | require (
4 | cryptochassis.com/ccapi v1.0.0
5 | )
6 |
7 | replace cryptochassis.com/ccapi => ../../../build/go/packaging/1.0.0
8 |
--------------------------------------------------------------------------------
/binding/go/example/market_data_simple_subscription/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "cryptochassis.com/ccapi"
5 | "fmt"
6 | "time"
7 | )
8 |
9 | type MyEventHandler struct {
10 | ccapi.EventHandler
11 | }
12 |
13 | func (*MyEventHandler) ProcessEvent(event ccapi.Event, session ccapi.Session) bool {
14 | if event.GetType() == ccapi.EventType_SUBSCRIPTION_STATUS {
15 | fmt.Printf("Received an event of type SUBSCRIPTION_STATUS:\n%s\n", event.ToStringPretty(2, 2))
16 | } else if event.GetType() == ccapi.EventType_SUBSCRIPTION_DATA {
17 | messageList := event.GetMessageList()
18 | for i := 0; i < int(messageList.Size()); i++ {
19 | message := messageList.Get(i)
20 | fmt.Printf("Best bid and ask at %s are:\n", message.GetTimeISO())
21 | elementList := message.GetElementList()
22 | for j := 0; j < int(elementList.Size()); j++ {
23 | element := elementList.Get(j)
24 | elementNameValueMap := element.GetNameValueMap()
25 | if elementNameValueMap.Has_key("BID_PRICE") {
26 | fmt.Printf(" BID_PRICE = %s\n", elementNameValueMap.Get("BID_PRICE"))
27 | }
28 | if elementNameValueMap.Has_key("BID_SIZE") {
29 | fmt.Printf(" BID_SIZE = %s\n", elementNameValueMap.Get("BID_SIZE"))
30 | }
31 | if elementNameValueMap.Has_key("ASK_PRICE") {
32 | fmt.Printf(" ASK_PRICE = %s\n", elementNameValueMap.Get("ASK_PRICE"))
33 | }
34 | if elementNameValueMap.Has_key("ASK_SIZE") {
35 | fmt.Printf(" ASK_SIZE = %s\n", elementNameValueMap.Get("ASK_SIZE"))
36 | }
37 | }
38 | }
39 | }
40 | return true
41 | }
42 |
43 | func main() {
44 | option := ccapi.NewSessionOptions()
45 | defer ccapi.DeleteSessionOptions(option)
46 | config := ccapi.NewSessionConfigs()
47 | defer ccapi.DeleteSessionConfigs(config)
48 | meh := &MyEventHandler{}
49 | meh.EventHandler = ccapi.NewDirectorEventHandler(meh)
50 | defer func() {
51 | ccapi.DeleteDirectorEventHandler(meh.EventHandler)
52 | }()
53 | session := ccapi.NewSession(option, config, meh.EventHandler)
54 | defer ccapi.DeleteSession(session)
55 | subscriptionList := ccapi.NewSubscriptionList()
56 | defer ccapi.DeleteSubscriptionList(subscriptionList)
57 | subscription := ccapi.NewSubscription("okx", "BTC-USDT", "MARKET_DEPTH")
58 | defer ccapi.DeleteSubscription(subscription)
59 | subscriptionList.Add(subscription)
60 | session.Subscribe(subscriptionList)
61 | time.Sleep(10 * time.Second)
62 | session.Stop()
63 | fmt.Println("Bye")
64 | }
65 |
--------------------------------------------------------------------------------
/binding/go/go.mod.in:
--------------------------------------------------------------------------------
1 | module cryptochassis.com
2 |
--------------------------------------------------------------------------------
/binding/go/go.mod.in_2:
--------------------------------------------------------------------------------
1 | module main
2 |
3 | require (
4 | cryptochassis.com/ccapi v1.0.0
5 | )
6 |
7 | replace cryptochassis.com/ccapi => @PACKAGING_DIR_FULL@
8 |
--------------------------------------------------------------------------------
/binding/go/test/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "cryptochassis.com/ccapi"
5 | "fmt"
6 | "time"
7 | )
8 |
9 | type MyEventHandler struct {
10 | ccapi.EventHandler
11 | }
12 |
13 | func (*MyEventHandler) ProcessEvent(event ccapi.Event, session ccapi.Session) bool {
14 | return true
15 | }
16 |
17 | func main() {
18 | option := ccapi.NewSessionOptions()
19 | defer ccapi.DeleteSessionOptions(option)
20 | config := ccapi.NewSessionConfigs()
21 | defer ccapi.DeleteSessionConfigs(config)
22 | meh := &MyEventHandler{}
23 | meh.EventHandler = ccapi.NewDirectorEventHandler(meh)
24 | defer func() {
25 | ccapi.DeleteDirectorEventHandler(meh.EventHandler)
26 | }()
27 | session := ccapi.NewSession(option, config, meh.EventHandler)
28 | defer ccapi.DeleteSession(session)
29 | subscriptionList := ccapi.NewSubscriptionList()
30 | defer ccapi.DeleteSubscriptionList(subscriptionList)
31 | subscription := ccapi.NewSubscription("okx", "BTC-USDT", "MARKET_DEPTH")
32 | defer ccapi.DeleteSubscription(subscription)
33 | subscriptionList.Add(subscription)
34 | session.Subscribe(subscriptionList)
35 | request := ccapi.NewRequest(ccapi.RequestOperation_GET_RECENT_TRADES, "okx", "BTC-USDT")
36 | defer ccapi.DeleteRequest(request)
37 | param := ccapi.NewMapStringString()
38 | defer ccapi.DeleteMapStringString(param)
39 | param.Set("LIMIT", "1")
40 | request.AppendParam(param)
41 | session.SendRequest(request)
42 | time.Sleep(time.Second)
43 | session.Stop()
44 | fmt.Println("Bye")
45 | }
46 |
--------------------------------------------------------------------------------
/binding/java/example/enable_library_logging/Main.java:
--------------------------------------------------------------------------------
1 | // usage: when generating the binding code, do cmake -DCCAPI_ENABLE_LOG_TRACE=ON ..., see https://github.com/crypto-chassis/ccapi#non-c
2 | import com.cryptochassis.ccapi.Logger;
3 | import com.cryptochassis.ccapi.Session;
4 | import com.cryptochassis.ccapi.SessionConfigs;
5 | import com.cryptochassis.ccapi.SessionOptions;
6 | import com.cryptochassis.ccapi.Subscription;
7 | import java.util.concurrent.locks.ReentrantLock;
8 |
9 | public class Main {
10 | static class MyLogger extends Logger {
11 | @Override
12 | public void logMessage(String severity, String threadId, String timeISO, String fileName, String lineNumber, String message) {
13 | this.lock.lock();
14 | try {
15 | System.out.println(String.format("%s: [%s] {%s:%s} %s%s%s", threadId, timeISO, fileName, lineNumber, severity, " ".repeat(8), message));
16 | } finally {
17 | this.lock.unlock();
18 | }
19 | }
20 | ReentrantLock lock = new ReentrantLock();
21 | }
22 | public static void main(String[] args) {
23 | System.loadLibrary("ccapi_binding_java");
24 | var myLogger = new MyLogger();
25 | Logger.setLogger(myLogger);
26 | var option = new SessionOptions();
27 | var config = new SessionConfigs();
28 | var session = new Session(option, config);
29 | var subscription = new Subscription("okx", "BTC-USDT", "MARKET_DEPTH");
30 | session.subscribe(subscription);
31 | try {
32 | Thread.sleep(10000);
33 | } catch (InterruptedException e) {
34 | }
35 | session.stop();
36 | System.out.println("Bye");
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/binding/java/example/execution_management_simple_request/Main.java:
--------------------------------------------------------------------------------
1 | import com.cryptochassis.ccapi.Event;
2 | import com.cryptochassis.ccapi.EventHandler;
3 | import com.cryptochassis.ccapi.MapStringString;
4 | import com.cryptochassis.ccapi.Request;
5 | import com.cryptochassis.ccapi.Session;
6 | import com.cryptochassis.ccapi.SessionConfigs;
7 | import com.cryptochassis.ccapi.SessionOptions;
8 |
9 | public class Main {
10 | static class MyEventHandler extends EventHandler {
11 | @Override
12 | public boolean processEvent(Event event, Session session) {
13 | System.out.println(String.format("Received an event:\n%s", event.toStringPretty(2, 2)));
14 | return true;
15 | }
16 | }
17 | public static void main(String[] args) {
18 | if (System.getenv("OKX_API_KEY") == null) {
19 | System.err.println("Please set environment variable OKX_API_KEY");
20 | return;
21 | }
22 | if (System.getenv("OKX_API_SECRET") == null) {
23 | System.err.println("Please set environment variable OKX_API_SECRET");
24 | return;
25 | }
26 | if (System.getenv("OKX_API_PASSPHRASE") == null) {
27 | System.err.println("Please set environment variable OKX_API_PASSPHRASE");
28 | return;
29 | }
30 | System.loadLibrary("ccapi_binding_java");
31 | var eventHandler = new MyEventHandler();
32 | var option = new SessionOptions();
33 | var config = new SessionConfigs();
34 | var session = new Session(option, config, eventHandler);
35 | var request = new Request(Request.Operation.CREATE_ORDER, "okx", "BTC-USDT");
36 | var param = new MapStringString();
37 | param.put("SIDE", "BUY");
38 | param.put("QUANTITY", "0.0005");
39 | param.put("LIMIT_PRICE", "20000");
40 | request.appendParam(param);
41 | session.sendRequest(request);
42 | try {
43 | Thread.sleep(10000);
44 | } catch (InterruptedException e) {
45 | }
46 | session.stop();
47 | System.out.println("Bye");
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/binding/java/example/execution_management_simple_subscription/Main.java:
--------------------------------------------------------------------------------
1 | import com.cryptochassis.ccapi.Event;
2 | import com.cryptochassis.ccapi.EventHandler;
3 | import com.cryptochassis.ccapi.MapStringString;
4 | import com.cryptochassis.ccapi.Message;
5 | import com.cryptochassis.ccapi.Request;
6 | import com.cryptochassis.ccapi.Session;
7 | import com.cryptochassis.ccapi.SessionConfigs;
8 | import com.cryptochassis.ccapi.SessionOptions;
9 | import com.cryptochassis.ccapi.Subscription;
10 | import com.cryptochassis.ccapi.SubscriptionList;
11 |
12 | public class Main {
13 | static class MyEventHandler extends EventHandler {
14 | @Override
15 | public boolean processEvent(Event event, Session session) {
16 | if (event.getType() == Event.Type.SUBSCRIPTION_STATUS) {
17 | System.out.println(String.format("Received an event of type SUBSCRIPTION_STATUS:\n%s", event.toStringPretty(2, 2)));
18 | var message = event.getMessageList().get(0);
19 | if (message.getType() == Message.Type.SUBSCRIPTION_STARTED) {
20 | var request = new Request(Request.Operation.CREATE_ORDER, "okx", "BTC-USDT");
21 | var param = new MapStringString();
22 | param.put("SIDE", "BUY");
23 | param.put("QUANTITY", "0.0005");
24 | param.put("LIMIT_PRICE", "20000");
25 | request.appendParam(param);
26 | session.sendRequest(request);
27 | }
28 | } else if (event.getType() == Event.Type.SUBSCRIPTION_DATA) {
29 | System.out.println(String.format("Received an event of type SUBSCRIPTION_DATA:\n%s", event.toStringPretty(2, 2)));
30 | }
31 | return true;
32 | }
33 | }
34 | public static void main(String[] args) {
35 | if (System.getenv("OKX_API_KEY") == null) {
36 | System.err.println("Please set environment variable OKX_API_KEY");
37 | return;
38 | }
39 | if (System.getenv("OKX_API_SECRET") == null) {
40 | System.err.println("Please set environment variable OKX_API_SECRET");
41 | return;
42 | }
43 | if (System.getenv("OKX_API_PASSPHRASE") == null) {
44 | System.err.println("Please set environment variable OKX_API_PASSPHRASE");
45 | return;
46 | }
47 | System.loadLibrary("ccapi_binding_java");
48 | var eventHandler = new MyEventHandler();
49 | var option = new SessionOptions();
50 | var config = new SessionConfigs();
51 | var session = new Session(option, config, eventHandler);
52 | var subscriptionList = new SubscriptionList();
53 | subscriptionList.add(new Subscription("okx", "BTC-USDT", "ORDER_UPDATE"));
54 | session.subscribe(subscriptionList);
55 | try {
56 | Thread.sleep(10000);
57 | } catch (InterruptedException e) {
58 | }
59 | session.stop();
60 | System.out.println("Bye");
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/binding/java/example/handle_exception/Main.java:
--------------------------------------------------------------------------------
1 | import com.cryptochassis.ccapi.Event;
2 | import com.cryptochassis.ccapi.EventHandler;
3 | import com.cryptochassis.ccapi.Session;
4 | import com.cryptochassis.ccapi.SessionConfigs;
5 | import com.cryptochassis.ccapi.SessionOptions;
6 | import com.cryptochassis.ccapi.Subscription;
7 | import com.cryptochassis.ccapi.SubscriptionList;
8 |
9 | public class Main {
10 | static class MyEventHandler extends EventHandler {
11 | @Override
12 | public boolean processEvent(Event event, Session session) {
13 | try {
14 | throw new Exception("oops");
15 | } catch (Exception e) {
16 | e.printStackTrace();
17 | System.exit(1);
18 | }
19 | return true;
20 | }
21 | }
22 | public static void main(String[] args) {
23 | System.loadLibrary("ccapi_binding_java");
24 | var eventHandler = new MyEventHandler();
25 | var option = new SessionOptions();
26 | var config = new SessionConfigs();
27 | var session = new Session(option, config, eventHandler);
28 | var subscriptionList = new SubscriptionList();
29 | subscriptionList.add(new Subscription("okx", "BTC-USDT", "MARKET_DEPTH"));
30 | session.subscribe(subscriptionList);
31 | try {
32 | Thread.sleep(10000);
33 | } catch (InterruptedException e) {
34 | }
35 | session.stop();
36 | System.out.println("Bye");
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/binding/java/example/market_data_multiple_subscription/Main.java:
--------------------------------------------------------------------------------
1 | import com.cryptochassis.ccapi.Event;
2 | import com.cryptochassis.ccapi.EventHandler;
3 | import com.cryptochassis.ccapi.Session;
4 | import com.cryptochassis.ccapi.SessionConfigs;
5 | import com.cryptochassis.ccapi.SessionOptions;
6 | import com.cryptochassis.ccapi.Subscription;
7 | import com.cryptochassis.ccapi.SubscriptionList;
8 |
9 | public class Main {
10 | static class MyEventHandler extends EventHandler {
11 | @Override
12 | public boolean processEvent(Event event, Session session) {
13 | if (event.getType() == Event.Type.SUBSCRIPTION_DATA) {
14 | for (var message : event.getMessageList()) {
15 | var correlationId = message.getCorrelationIdList().get(0);
16 | System.out.println(String.format("%s: Best bid and ask at %s are:", correlationId, message.getTimeISO()));
17 | for (var element : message.getElementList()) {
18 | var elementNameValueMap = element.getNameValueMap();
19 | for (var entry : elementNameValueMap.entrySet()) {
20 | var name = entry.getKey();
21 | var value = entry.getValue();
22 | System.out.println(String.format(" %s = %s", name, value));
23 | }
24 | }
25 | }
26 | }
27 | return true;
28 | }
29 | }
30 | public static void main(String[] args) {
31 | System.loadLibrary("ccapi_binding_java");
32 | var eventHandler = new MyEventHandler();
33 | var option = new SessionOptions();
34 | var config = new SessionConfigs();
35 | var session = new Session(option, config, eventHandler);
36 | var subscriptionList = new SubscriptionList();
37 | subscriptionList.add(new Subscription("okx", "BTC-USDT", "MARKET_DEPTH", "", "BTC"));
38 | subscriptionList.add(new Subscription("okx", "ETH-USDT", "MARKET_DEPTH", "", "ETH"));
39 | session.subscribe(subscriptionList);
40 | try {
41 | Thread.sleep(10000);
42 | } catch (InterruptedException e) {
43 | }
44 | session.stop();
45 | System.out.println("Bye");
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/binding/java/example/market_data_simple_request/Main.java:
--------------------------------------------------------------------------------
1 | import com.cryptochassis.ccapi.Event;
2 | import com.cryptochassis.ccapi.EventHandler;
3 | import com.cryptochassis.ccapi.MapStringString;
4 | import com.cryptochassis.ccapi.Request;
5 | import com.cryptochassis.ccapi.Session;
6 | import com.cryptochassis.ccapi.SessionConfigs;
7 | import com.cryptochassis.ccapi.SessionOptions;
8 |
9 | public class Main {
10 | static class MyEventHandler extends EventHandler {
11 | @Override
12 | public boolean processEvent(Event event, Session session) {
13 | System.out.println(String.format("Received an event:\n%s", event.toStringPretty(2, 2)));
14 | return true;
15 | }
16 | }
17 | public static void main(String[] args) {
18 | System.loadLibrary("ccapi_binding_java");
19 | var eventHandler = new MyEventHandler();
20 | var option = new SessionOptions();
21 | var config = new SessionConfigs();
22 | var session = new Session(option, config, eventHandler);
23 | var request = new Request(Request.Operation.GET_RECENT_TRADES, "okx", "BTC-USDT");
24 | var param = new MapStringString();
25 | param.put("LIMIT", "1");
26 | request.appendParam(param);
27 | session.sendRequest(request);
28 | try {
29 | Thread.sleep(10000);
30 | } catch (InterruptedException e) {
31 | }
32 | session.stop();
33 | System.out.println("Bye");
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/binding/java/example/market_data_simple_subscription/Main.java:
--------------------------------------------------------------------------------
1 | import com.cryptochassis.ccapi.Event;
2 | import com.cryptochassis.ccapi.EventHandler;
3 | import com.cryptochassis.ccapi.Session;
4 | import com.cryptochassis.ccapi.SessionConfigs;
5 | import com.cryptochassis.ccapi.SessionOptions;
6 | import com.cryptochassis.ccapi.Subscription;
7 | import com.cryptochassis.ccapi.SubscriptionList;
8 |
9 | public class Main {
10 | static class MyEventHandler extends EventHandler {
11 | @Override
12 | public boolean processEvent(Event event, Session session) {
13 | if (event.getType() == Event.Type.SUBSCRIPTION_STATUS) {
14 | System.out.println(String.format("Received an event of type SUBSCRIPTION_STATUS:\n%s", event.toStringPretty(2, 2)));
15 | } else if (event.getType() == Event.Type.SUBSCRIPTION_DATA) {
16 | for (var message : event.getMessageList()) {
17 | System.out.println(String.format("Best bid and ask at %s are:", message.getTimeISO()));
18 | for (var element : message.getElementList()) {
19 | var elementNameValueMap = element.getNameValueMap();
20 | for (var entry : elementNameValueMap.entrySet()) {
21 | var name = entry.getKey();
22 | var value = entry.getValue();
23 | System.out.println(String.format(" %s = %s", name, value));
24 | }
25 | }
26 | }
27 | }
28 | return true;
29 | }
30 | }
31 | public static void main(String[] args) {
32 | System.loadLibrary("ccapi_binding_java");
33 | var eventHandler = new MyEventHandler();
34 | var option = new SessionOptions();
35 | var config = new SessionConfigs();
36 | var session = new Session(option, config, eventHandler);
37 | var subscriptionList = new SubscriptionList();
38 | subscriptionList.add(new Subscription("okx", "BTC-USDT", "MARKET_DEPTH"));
39 | session.subscribe(subscriptionList);
40 | try {
41 | Thread.sleep(10000);
42 | } catch (InterruptedException e) {
43 | }
44 | session.stop();
45 | System.out.println("Bye");
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/binding/java/test/Main.java:
--------------------------------------------------------------------------------
1 | import com.cryptochassis.ccapi.Event;
2 | import com.cryptochassis.ccapi.EventHandler;
3 | import com.cryptochassis.ccapi.MapStringString;
4 | import com.cryptochassis.ccapi.Request;
5 | import com.cryptochassis.ccapi.Session;
6 | import com.cryptochassis.ccapi.SessionConfigs;
7 | import com.cryptochassis.ccapi.SessionOptions;
8 | import com.cryptochassis.ccapi.Subscription;
9 | import com.cryptochassis.ccapi.SubscriptionList;
10 |
11 | public class Main {
12 | static class MyEventHandler extends EventHandler {
13 | @Override
14 | public boolean processEvent(Event event, Session session) {
15 | return true;
16 | }
17 | }
18 | public static void main(String[] args) {
19 | System.loadLibrary("ccapi_binding_java");
20 | var eventHandler = new MyEventHandler();
21 | var option = new SessionOptions();
22 | var config = new SessionConfigs();
23 | var session = new Session(option, config, eventHandler);
24 | var subscriptionList = new SubscriptionList();
25 | subscriptionList.add(new Subscription("okx", "BTC-USDT", "MARKET_DEPTH"));
26 | session.subscribe(subscriptionList);
27 | var request = new Request(Request.Operation.GET_RECENT_TRADES, "okx", "BTC-USDT");
28 | var param = new MapStringString();
29 | param.put("LIMIT", "1");
30 | request.appendParam(param);
31 | session.sendRequest(request);
32 | session.stop();
33 | System.out.println("Bye");
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/binding/javascript/binding.gyp.in:
--------------------------------------------------------------------------------
1 | {
2 | "targets": [
3 | {
4 | "target_name": "index",
5 | "sources": [
6 | "swig_interface_wrap.cxx",
7 | "ccapi_logger.cpp"
8 | ],
9 | "include_dirs": [
10 | "@CCAPI_PROJECT_DIR@/include",
11 | "@BOOST_INCLUDE_DIR@",
12 | "@RAPIDJSON_INCLUDE_DIR@",
13 | "@HFFIX_INCLUDE_DIR@",
14 | "<(node_root_dir)/deps/openssl/openssl/include"
15 | ],
16 | "cflags_cc!": [
17 | "-fno-exceptions"
18 | ],
19 | "conditions": [
20 | [
21 | "OS=='mac'",
22 | {
23 | "xcode_settings": {
24 | "OTHER_CPLUSPLUSFLAGS" : [ "@BINDING_GYP_CFLAGS_CC@" ],
25 | "GCC_ENABLE_CPP_EXCEPTIONS": "YES"
26 | }
27 | }
28 | ],
29 | [
30 | "target_arch=='ia32'",
31 | {
32 | "include_dirs": [
33 | "<(node_root_dir)/deps/openssl/config/piii"
34 | ]
35 | }
36 | ],
37 | [
38 | "target_arch=='x64'",
39 | {
40 | "include_dirs": [
41 | "<(node_root_dir)/deps/openssl/config/k8"
42 | ]
43 | }
44 | ],
45 | [
46 | "target_arch=='arm'",
47 | {
48 | "include_dirs": [
49 | "<(node_root_dir)/deps/openssl/config/arm"
50 | ]
51 | }
52 | ]
53 | ],
54 | "cflags_cc": [
55 | "@BINDING_GYP_CFLAGS_CC@"
56 | ],
57 | "ldflags": [
58 | "@BINDING_GYP_LDFLAGS@"
59 | ],
60 | "defines": [
61 | "@BINDING_GYP_DEFINES@"
62 | ]
63 | }
64 | ]
65 | }
66 |
--------------------------------------------------------------------------------
/binding/javascript/example/execution_management_simple_request/index.js:
--------------------------------------------------------------------------------
1 | const ccapi = require('ccapi')
2 | if (!process.env.OKX_API_KEY) {
3 | console.error('Please set environment variable OKX_API_KEY')
4 | process.exit(1)
5 | }
6 | if (!process.env.OKX_API_SECRET) {
7 | console.error('Please set environment variable OKX_API_SECRET')
8 | process.exit(1)
9 | }
10 | if (!process.env.OKX_API_PASSPHRASE) {
11 | console.error('Please set environment variable OKX_API_PASSPHRASE')
12 | process.exit(1)
13 | }
14 | const Session = ccapi.Session
15 | const SessionConfigs = ccapi.SessionConfigs
16 | const SessionOptions = ccapi.SessionOptions
17 | const Request = ccapi.Request
18 | const MapStringString = ccapi.MapStringString
19 | const sessionConfigs = new SessionConfigs()
20 | const sessionOptions = new SessionOptions()
21 | const session = new Session(sessionOptions, sessionConfigs)
22 | const request = new Request(Request.Operation_CREATE_ORDER, 'okx', 'BTC-USDT')
23 | const param = new MapStringString()
24 | param.set('SIDE', 'BUY')
25 | param.set('QUANTITY', '0.0005')
26 | param.set('LIMIT_PRICE', '20000')
27 | request.appendParam(param)
28 | session.sendRequest(request)
29 | const intervalId = setInterval(() => {
30 | const eventList = session.getEventQueue().purge()
31 | for (let i = 0; i < eventList.size(); i++) {
32 | const event = eventList.get(i)
33 | console.log(`Received an event:\n${event.toStringPretty(2, 2)}`)
34 | }
35 | }, 1)
36 | setTimeout(() => {
37 | clearInterval(intervalId)
38 | session.stop()
39 | console.log('Bye')
40 | }, 10000)
41 |
--------------------------------------------------------------------------------
/binding/javascript/example/execution_management_simple_request/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "dependencies": {
3 | "ccapi": "file:../../../build/javascript/packaging/1.0.0"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/binding/javascript/example/execution_management_simple_subscription/index.js:
--------------------------------------------------------------------------------
1 | const ccapi = require('ccapi')
2 | if (!process.env.OKX_API_KEY) {
3 | console.error('Please set environment variable OKX_API_KEY')
4 | process.exit(1)
5 | }
6 | if (!process.env.OKX_API_SECRET) {
7 | console.error('Please set environment variable OKX_API_SECRET')
8 | process.exit(1)
9 | }
10 | if (!process.env.OKX_API_PASSPHRASE) {
11 | console.error('Please set environment variable OKX_API_PASSPHRASE')
12 | process.exit(1)
13 | }
14 | const Session = ccapi.Session
15 | const SessionConfigs = ccapi.SessionConfigs
16 | const SessionOptions = ccapi.SessionOptions
17 | const Subscription = ccapi.Subscription
18 | const Request = ccapi.Request
19 | const MapStringString = ccapi.MapStringString
20 | const Event = ccapi.Event
21 | const Message = ccapi.Message
22 | const sessionConfigs = new SessionConfigs()
23 | const sessionOptions = new SessionOptions()
24 | const session = new Session(sessionOptions, sessionConfigs)
25 | const subscription = new Subscription('okx', 'BTC-USDT', 'ORDER_UPDATE')
26 | session.subscribe(subscription)
27 | const intervalId = setInterval(() => {
28 | const eventList = session.getEventQueue().purge()
29 | for (let i = 0; i < eventList.size(); i++) {
30 | const event = eventList.get(i)
31 | if (event.getType() == Event.Type_SUBSCRIPTION_STATUS) {
32 | console.log(`Received an event of type SUBSCRIPTION_STATUS:\n${event.toStringPretty(2, 2)}`)
33 | const message = event.getMessageList().get(0)
34 | if (message.getType() == Message.Type_SUBSCRIPTION_STARTED) {
35 | const request = new Request(Request.Operation_CREATE_ORDER, 'okx', 'BTC-USDT')
36 | const param = new MapStringString()
37 | param.set('SIDE', 'BUY')
38 | param.set('QUANTITY', '0.0005')
39 | param.set('LIMIT_PRICE', '20000')
40 | request.appendParam(param)
41 | session.sendRequest(request)
42 | }
43 | }
44 | else if (event.getType() == ccapi.Event.Type_SUBSCRIPTION_DATA) {
45 | console.log(`Received an event of type SUBSCRIPTION_DATA:\n${event.toStringPretty(2, 2)}`)
46 | }
47 | }
48 | }, 1)
49 | setTimeout(() => {
50 | clearInterval(intervalId)
51 | session.stop()
52 | console.log('Bye')
53 | }, 10000)
54 |
--------------------------------------------------------------------------------
/binding/javascript/example/execution_management_simple_subscription/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "dependencies": {
3 | "ccapi": "file:../../../build/javascript/packaging/1.0.0"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/binding/javascript/example/fix_simple/index.js:
--------------------------------------------------------------------------------
1 | const ccapi = require('ccapi')
2 | if (!process.env.COINBASE_API_KEY) {
3 | console.error('Please set environment variable COINBASE_API_KEY')
4 | process.exit(1)
5 | }
6 | if (!process.env.COINBASE_API_SECRET) {
7 | console.error('Please set environment variable COINBASE_API_SECRET')
8 | process.exit(1)
9 | }
10 | if (!process.env.COINBASE_API_PASSPHRASE) {
11 | console.error('Please set environment variable COINBASE_API_PASSPHRASE')
12 | process.exit(1)
13 | }
14 | const Session = ccapi.Session
15 | const SessionConfigs = ccapi.SessionConfigs
16 | const SessionOptions = ccapi.SessionOptions
17 | const Subscription = ccapi.Subscription
18 | const Request = ccapi.Request
19 | const VectorPairIntString = ccapi.VectorPairIntString
20 | const PairIntString = ccapi.PairIntString
21 | const Event = ccapi.Event
22 | const Message = ccapi.Message
23 | const sessionConfigs = new SessionConfigs()
24 | const sessionOptions = new SessionOptions()
25 | const session = new Session(sessionOptions, sessionConfigs)
26 | const subscription = new Subscription('coinbase', '', 'FIX', '', 'same correlation id for subscription and request')
27 | session.subscribeByFix(subscription)
28 | const intervalId = setInterval(() => {
29 | const eventList = session.getEventQueue().purge()
30 | for (let i = 0; i < eventList.size(); i++) {
31 | const event = eventList.get(i)
32 | console.log(`Received an event of type any:\n${event.toStringPretty(2, 2)}`)
33 | if (event.getType() == Event.Type_AUTHORIZATION_STATUS) {
34 | const message = event.getMessageList().get(0)
35 | if (message.getType() == Message.Type_AUTHORIZATION_SUCCESS) {
36 | const request = new Request(ccapi.Request.Operation_FIX, 'coinbase', '', 'same correlation id for subscription and request')
37 | const param = new VectorPairIntString()
38 | param.add(new PairIntString(35, 'D'))
39 | param.add(new PairIntString(11, '6d4eb0fb-2229-469f-873e-557dd78ac11e'))
40 | param.add(new PairIntString(55, 'BTC-USD'))
41 | param.add(new PairIntString(54, '1'))
42 | param.add(new PairIntString(44, '20000'))
43 | param.add(new PairIntString(38, '0.001'))
44 | param.add(new PairIntString(40, '2'))
45 | param.add(new PairIntString(59, '1'))
46 | request.appendParamFix(param)
47 | session.sendRequestByFix(request)
48 | }
49 | }
50 | else if (event.getType() == ccapi.Event.Type_FIX) {
51 | console.log(`Received an event of type FIX:\n${event.toStringPretty(2, 2)}`)
52 | }
53 | }
54 | }, 1)
55 | setTimeout(() => {
56 | clearInterval(intervalId)
57 | session.stop()
58 | console.log('Bye')
59 | }, 10000)
60 |
--------------------------------------------------------------------------------
/binding/javascript/example/fix_simple/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "dependencies": {
3 | "ccapi": "file:../../../build/javascript/packaging/1.0.0"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/binding/javascript/example/handle_exception/index.js:
--------------------------------------------------------------------------------
1 | const ccapi = require('ccapi')
2 | const Session = ccapi.Session
3 | const SessionConfigs = ccapi.SessionConfigs
4 | const SessionOptions = ccapi.SessionOptions
5 | const Subscription = ccapi.Subscription
6 | const Event = ccapi.Event
7 | const sessionConfigs = new SessionConfigs()
8 | const sessionOptions = new SessionOptions()
9 | const session = new Session(sessionOptions, sessionConfigs)
10 | const subscription = new Subscription('okx', 'BTC-USDT', 'MARKET_DEPTH')
11 | session.subscribe(subscription)
12 | const intervalId = setInterval(() => {
13 | try {
14 | throw new Error('oops')
15 | } catch (error) {
16 | console.error(error.stack)
17 | process.exit(1)
18 | }
19 | }, 1)
20 | setTimeout(() => {
21 | clearInterval(intervalId)
22 | session.stop()
23 | console.log('Bye')
24 | }, 10000)
25 |
--------------------------------------------------------------------------------
/binding/javascript/example/handle_exception/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "dependencies": {
3 | "ccapi": "file:../../../build/javascript/packaging/1.0.0"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/binding/javascript/example/market_data_multiple_subscription/index.js:
--------------------------------------------------------------------------------
1 | const ccapi = require('ccapi')
2 | const Session = ccapi.Session
3 | const SessionConfigs = ccapi.SessionConfigs
4 | const SessionOptions = ccapi.SessionOptions
5 | const SubscriptionList = ccapi.SubscriptionList
6 | const Subscription = ccapi.Subscription
7 | const Event = ccapi.Event
8 | const sessionConfigs = new SessionConfigs()
9 | const sessionOptions = new SessionOptions()
10 | const session = new Session(sessionOptions, sessionConfigs)
11 | const subscriptionList = new SubscriptionList()
12 | subscriptionList.add(new Subscription('okx', 'BTC-USDT', 'MARKET_DEPTH', '', 'BTC'))
13 | subscriptionList.add(new Subscription('okx', 'ETH-USDT', 'MARKET_DEPTH', '', 'ETH'))
14 | session.subscribe(subscriptionList)
15 | const intervalId = setInterval(() => {
16 | const eventList = session.getEventQueue().purge()
17 | for (let i = 0; i < eventList.size(); i++) {
18 | const event = eventList.get(i)
19 | if (event.getType() == Event.Type_SUBSCRIPTION_STATUS) {
20 | console.log(`Received an event of type SUBSCRIPTION_STATUS:\n${event.toStringPretty(2, 2)}`)
21 | }
22 | else if (event.getType() == Event.Type_SUBSCRIPTION_DATA) {
23 | const messageList = event.getMessageList()
24 | for (let j = 0; j < messageList.size(); j++) {
25 | const message = messageList.get(j)
26 | const correlationId = message.getCorrelationIdList().get(0)
27 | console.log(`${correlationId}: Best bid and ask at ${message.getTimeISO()} are:`)
28 | const elementList = message.getElementList()
29 | for (let k = 0; k < elementList.size(); k++) {
30 | const element = elementList.get(k)
31 | elementNameValueMap = element.getNameValueMap()
32 | if (elementNameValueMap.has_key('BID_PRICE')) {
33 | console.log(` BID_PRICE = ${elementNameValueMap.get('BID_PRICE')}`)
34 | }
35 | if (elementNameValueMap.has_key('BID_SIZE')) {
36 | console.log(` BID_SIZE = ${elementNameValueMap.get('BID_SIZE')}`)
37 | }
38 | if (elementNameValueMap.has_key('ASK_PRICE')) {
39 | console.log(` ASK_PRICE = ${elementNameValueMap.get('ASK_PRICE')}`)
40 | }
41 | if (elementNameValueMap.has_key('ASK_SIZE')) {
42 | console.log(` ASK_SIZE = ${elementNameValueMap.get('ASK_SIZE')}`)
43 | }
44 | }
45 | }
46 | }
47 | }
48 | }, 1)
49 | setTimeout(() => {
50 | clearInterval(intervalId)
51 | session.stop()
52 | console.log('Bye')
53 | }, 10000)
54 |
--------------------------------------------------------------------------------
/binding/javascript/example/market_data_multiple_subscription/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "dependencies": {
3 | "ccapi": "file:../../../build/javascript/packaging/1.0.0"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/binding/javascript/example/market_data_simple_request/index.js:
--------------------------------------------------------------------------------
1 | const ccapi = require('ccapi')
2 | const Session = ccapi.Session
3 | const SessionConfigs = ccapi.SessionConfigs
4 | const SessionOptions = ccapi.SessionOptions
5 | const Request = ccapi.Request
6 | const MapStringString = ccapi.MapStringString
7 | const sessionConfigs = new SessionConfigs()
8 | const sessionOptions = new SessionOptions()
9 | const session = new Session(sessionOptions, sessionConfigs)
10 | const request = new Request(Request.Operation_GET_RECENT_TRADES, 'okx', 'BTC-USDT')
11 | const param = new MapStringString()
12 | param.set('LIMIT', '1')
13 | request.appendParam(param)
14 | session.sendRequest(request)
15 | const intervalId = setInterval(() => {
16 | const eventList = session.getEventQueue().purge()
17 | for (let i = 0; i < eventList.size(); i++) {
18 | const event = eventList.get(i)
19 | console.log(`Received an event:\n${event.toStringPretty(2, 2)}`)
20 | }
21 | }, 1)
22 | setTimeout(() => {
23 | clearInterval(intervalId)
24 | session.stop()
25 | console.log('Bye')
26 | }, 10000)
27 |
--------------------------------------------------------------------------------
/binding/javascript/example/market_data_simple_request/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "dependencies": {
3 | "ccapi": "file:../../../build/javascript/packaging/1.0.0"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/binding/javascript/example/market_data_simple_subscription/index.js:
--------------------------------------------------------------------------------
1 | const ccapi = require('ccapi')
2 | const Session = ccapi.Session
3 | const SessionConfigs = ccapi.SessionConfigs
4 | const SessionOptions = ccapi.SessionOptions
5 | const Subscription = ccapi.Subscription
6 | const Event = ccapi.Event
7 | const sessionConfigs = new SessionConfigs()
8 | const sessionOptions = new SessionOptions()
9 | const session = new Session(sessionOptions, sessionConfigs)
10 | const subscription = new Subscription('okx', 'BTC-USDT', 'MARKET_DEPTH')
11 | session.subscribe(subscription)
12 | const intervalId = setInterval(() => {
13 | const eventList = session.getEventQueue().purge()
14 | for (let i = 0; i < eventList.size(); i++) {
15 | const event = eventList.get(i)
16 | if (event.getType() == Event.Type_SUBSCRIPTION_STATUS) {
17 | console.log(`Received an event of type SUBSCRIPTION_STATUS:\n${event.toStringPretty(2, 2)}`)
18 | }
19 | else if (event.getType() == Event.Type_SUBSCRIPTION_DATA) {
20 | const messageList = event.getMessageList()
21 | for (let j = 0; j < messageList.size(); j++) {
22 | const message = messageList.get(j)
23 | console.log(`Best bid and ask at ${message.getTimeISO()} are:`)
24 | const elementList = message.getElementList()
25 | for (let k = 0; k < elementList.size(); k++) {
26 | const element = elementList.get(k)
27 | elementNameValueMap = element.getNameValueMap()
28 | if (elementNameValueMap.has_key('BID_PRICE')) {
29 | console.log(` BID_PRICE = ${elementNameValueMap.get('BID_PRICE')}`)
30 | }
31 | if (elementNameValueMap.has_key('BID_SIZE')) {
32 | console.log(` BID_SIZE = ${elementNameValueMap.get('BID_SIZE')}`)
33 | }
34 | if (elementNameValueMap.has_key('ASK_PRICE')) {
35 | console.log(` ASK_PRICE = ${elementNameValueMap.get('ASK_PRICE')}`)
36 | }
37 | if (elementNameValueMap.has_key('ASK_SIZE')) {
38 | console.log(` ASK_SIZE = ${elementNameValueMap.get('ASK_SIZE')}`)
39 | }
40 | }
41 | }
42 | }
43 | }
44 | }, 1)
45 | setTimeout(() => {
46 | clearInterval(intervalId)
47 | session.stop()
48 | console.log('Bye')
49 | }, 10000)
50 |
--------------------------------------------------------------------------------
/binding/javascript/example/market_data_simple_subscription/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "dependencies": {
3 | "ccapi": "file:../../../build/javascript/packaging/1.0.0"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/binding/javascript/package.json.in:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ccapi",
3 | "version": "@BUILD_VERSION@"
4 | }
5 |
--------------------------------------------------------------------------------
/binding/javascript/test/index.js:
--------------------------------------------------------------------------------
1 | const ccapi = require('ccapi')
2 | const Session = ccapi.Session
3 | const SessionConfigs = ccapi.SessionConfigs
4 | const SessionOptions = ccapi.SessionOptions
5 | const Subscription = ccapi.Subscription
6 | const Request = ccapi.Request
7 | const MapStringString = ccapi.MapStringString
8 | const Event = ccapi.Event
9 | const sessionConfigs = new SessionConfigs()
10 | const sessionOptions = new SessionOptions()
11 | const session = new Session(sessionOptions, sessionConfigs)
12 | const subscription = new Subscription('okx', 'BTC-USDT', 'MARKET_DEPTH')
13 | session.subscribe(subscription)
14 | const request = new Request(Request.Operation_GET_RECENT_TRADES, 'okx', 'BTC-USDT')
15 | const param = new MapStringString()
16 | param.set('LIMIT', '1')
17 | request.appendParam(param)
18 | session.sendRequest(request)
19 | setTimeout(() => {
20 | session.stop()
21 | console.log('Bye')
22 | }, 1)
23 |
--------------------------------------------------------------------------------
/binding/python/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME binding_python)
2 | project(${NAME})
3 | set(SWIG_TARGET_NAME ccapi_${NAME})
4 |
5 | # Find Python
6 | find_package(Python REQUIRED COMPONENTS Interpreter Development)
7 | message(STATUS "Python_VERSION: ${Python_VERSION}")
8 | message(STATUS "Python_EXECUTABLE: ${Python_EXECUTABLE}")
9 | if(Python_VERSION VERSION_LESS 3)
10 | message(FATAL_ERROR "Require Python 3")
11 | endif()
12 | set_property(SOURCE ${SWIG_INTERFACE} PROPERTY CPLUSPLUS ON)
13 | set_property(SOURCE ${SWIG_INTERFACE}
14 | PROPERTY COMPILE_OPTIONS "-py3;-builtin;-threads;-doxygen")
15 | swig_add_library(
16 | ${SWIG_TARGET_NAME}
17 | LANGUAGE python OUTPUT_DIR ${CMAKE_BINARY_DIR}/python/${SWIG_TARGET_NAME}
18 | SOURCES ${SWIG_INTERFACE} ${SOURCE_LOGGER})
19 | if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP)
20 | add_dependencies(${SWIG_TARGET_NAME} boost rapidjson hffix)
21 | endif()
22 | set_property(TARGET ${SWIG_TARGET_NAME}
23 | PROPERTY SWIG_USE_TARGET_INCLUDE_DIRECTORIES ON)
24 | target_include_directories(${SWIG_TARGET_NAME} PRIVATE ${Python_INCLUDE_DIRS})
25 | target_link_libraries(${SWIG_TARGET_NAME} PRIVATE ${Python_LIBRARIES})
26 |
27 | # ##############################################################################
28 | # ## Python Packaging ##
29 | # ##############################################################################
30 | configure_file(${CMAKE_CURRENT_SOURCE_DIR}/setup.py.in
31 | ${CMAKE_CURRENT_BINARY_DIR}/setup.py.in @ONLY)
32 | file(
33 | GENERATE
34 | OUTPUT setup.py
35 | INPUT ${CMAKE_CURRENT_BINARY_DIR}/setup.py.in)
36 |
37 | set(PACKAGING_DIR packaging)
38 | set(PACKAGING_DIR_FULL
39 | ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGING_DIR}/${BUILD_VERSION})
40 | file(MAKE_DIRECTORY ${PACKAGING_DIR_FULL})
41 | set(PYTHON_PACKAGING_TARGET_NAME python_${PACKAGING_DIR})
42 | add_custom_target(
43 | ${PYTHON_PACKAGING_TARGET_NAME} ALL
44 | COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/setup.py
45 | ${PACKAGING_DIR_FULL}
46 | COMMAND
47 | ${CMAKE_COMMAND} -E copy
48 | ${CMAKE_CURRENT_BINARY_DIR}/${SWIG_TARGET_NAME}/ccapi.py
49 | ${PACKAGING_DIR_FULL}
50 | COMMAND ${CMAKE_COMMAND} -E copy $
51 | ${PACKAGING_DIR_FULL}
52 | COMMAND ${Python_EXECUTABLE} -m pip install --upgrade setuptools wheel
53 | COMMAND ${Python_EXECUTABLE} setup.py bdist_wheel
54 | COMMAND ${Python_EXECUTABLE} -m pip install --upgrade .
55 | WORKING_DIRECTORY ${PACKAGING_DIR_FULL})
56 | add_dependencies(${PYTHON_PACKAGING_TARGET_NAME} ${SWIG_TARGET_NAME})
57 |
58 | # Test
59 | if(BUILD_TEST)
60 | set(TEST_DIR ${CMAKE_CURRENT_BINARY_DIR}/test)
61 | configure_file(test/main.py ${TEST_DIR}/main.py COPYONLY)
62 | add_test(
63 | NAME python_test
64 | COMMAND ${Python_EXECUTABLE} main.py
65 | WORKING_DIRECTORY ${TEST_DIR})
66 | endif()
67 |
--------------------------------------------------------------------------------
/binding/python/example/data_visualization/main.py:
--------------------------------------------------------------------------------
1 | import time
2 | from ccapi import EventHandler, SessionOptions, SessionConfigs, Session, Subscription, Event
3 | import matplotlib.pyplot as plt
4 | import seaborn as sns
5 | import time
6 |
7 | if __name__ == "__main__":
8 | option = SessionOptions()
9 | config = SessionConfigs()
10 | session = Session(option, config)
11 | exchange = "okx"
12 | instrument = "BTC-USDT"
13 | subscription = Subscription(exchange, instrument, "MARKET_DEPTH", "MARKET_DEPTH_MAX=400&CONFLATE_INTERVAL_MILLISECONDS=100")
14 | session.subscribe(subscription)
15 | fig, ax = plt.subplots()
16 | startTime = time.time()
17 | while True:
18 | bids = {"price": [], "size": []}
19 | asks = {"price": [], "size": []}
20 | eventList = session.getEventQueue().purge()
21 | if eventList:
22 | event = eventList[-1]
23 | if event.getType() == Event.Type_SUBSCRIPTION_DATA:
24 | for message in event.getMessageList():
25 | for element in message.getElementList():
26 | elementNameValueMap = element.getNameValueMap()
27 | for name, value in elementNameValueMap.items():
28 | if name == "BID_PRICE":
29 | bids["price"].append(float(value))
30 | if name == "BID_SIZE":
31 | bids["size"].append(float(value))
32 | if name == "ASK_PRICE":
33 | asks["price"].append(float(value))
34 | if name == "ASK_SIZE":
35 | asks["size"].append(float(value))
36 | ax.clear()
37 | ax.set_title(f"{instrument} Order Book On {exchange.title()} at {message.getTimeISO()}")
38 | ax.set_xlabel("Price")
39 | ax.set_ylabel("Amount")
40 | sns.ecdfplot(
41 | x="price",
42 | weights="size",
43 | legend=False,
44 | stat="count",
45 | complementary=True,
46 | data={"price": bids["price"], "size": bids["size"]},
47 | ax=ax,
48 | color="g",
49 | )
50 | sns.ecdfplot(x="price", weights="size", legend=False, stat="count", data={"price": asks["price"], "size": asks["size"]}, ax=ax, color="r")
51 | plt.pause(0.1)
52 | if time.time() - startTime > 10:
53 | break
54 | session.stop()
55 | print("Bye")
56 |
--------------------------------------------------------------------------------
/binding/python/example/enable_library_logging/main.py:
--------------------------------------------------------------------------------
1 | # usage: when generating the binding code, do cmake -DCCAPI_ENABLE_LOG_TRACE=ON ..., see https://github.com/crypto-chassis/ccapi#non-c
2 | from threading import Lock
3 | import time
4 | from ccapi import Logger, Session, Subscription
5 |
6 |
7 | class MyLogger(Logger):
8 | def __init__(self):
9 | super().__init__()
10 | self._lock = Lock()
11 |
12 | def logMessage(self, severity: str, threadId: str, timeISO: str, fileName: str, lineNumber: str, message: str) -> None:
13 | self._lock.acquire()
14 | print(f'{threadId}: [{timeISO}] {{{fileName}:{lineNumber}}} {severity}{" " * 8}{message}')
15 | self._lock.release()
16 |
17 |
18 | myLogger = MyLogger()
19 | Logger.logger = myLogger
20 | if __name__ == "__main__":
21 | session = Session()
22 | subscription = Subscription("coinbase", "BTC-USD", "MARKET_DEPTH")
23 | session.subscribe(subscription)
24 | time.sleep(10)
25 | session.stop()
26 | print("Bye")
27 | Logger.logger = None
28 |
--------------------------------------------------------------------------------
/binding/python/example/execution_management_simple_request/main.py:
--------------------------------------------------------------------------------
1 | import os
2 | import sys
3 | import time
4 | from ccapi import Event, SessionOptions, SessionConfigs, Session, EventHandler, Request
5 |
6 |
7 | class MyEventHandler(EventHandler):
8 | def __init__(self):
9 | super().__init__()
10 |
11 | def processEvent(self, event: Event, session: Session) -> bool:
12 | print(f"Received an event:\n{event.toStringPretty(2, 2)}")
13 | return True # This line is needed.
14 |
15 |
16 | if __name__ == "__main__":
17 | if not os.environ.get("BINANCE_US_API_KEY"):
18 | print("Please set environment variable BINANCE_US_API_KEY", file=sys.stderr)
19 | sys.exit(1)
20 | if not os.environ.get("BINANCE_US_API_SECRET"):
21 | print("Please set environment variable BINANCE_US_API_SECRET", file=sys.stderr)
22 | sys.exit(1)
23 | eventHandler = MyEventHandler()
24 | option = SessionOptions()
25 | config = SessionConfigs()
26 | session = Session(option, config, eventHandler)
27 | request = Request(Request.Operation_CREATE_ORDER, "binance-us", "BTCUSD")
28 | request.appendParam(
29 | {
30 | "SIDE": "BUY",
31 | "QUANTITY": "0.0005",
32 | "LIMIT_PRICE": "20000",
33 | }
34 | )
35 | session.sendRequest(request)
36 | time.sleep(10)
37 | session.stop()
38 | print("Bye")
39 |
--------------------------------------------------------------------------------
/binding/python/example/execution_management_simple_subscription/main.py:
--------------------------------------------------------------------------------
1 | import os
2 | import sys
3 | import time
4 | from ccapi import EventHandler, SessionOptions, SessionConfigs, Session, Subscription, Request, Event, Message
5 |
6 |
7 | class MyEventHandler(EventHandler):
8 | def __init__(self):
9 | super().__init__()
10 |
11 | def processEvent(self, event: Event, session: Session) -> bool:
12 | if event.getType() == Event.Type_SUBSCRIPTION_STATUS:
13 | print(f"Received an event of type SUBSCRIPTION_STATUS:\n{event.toStringPretty(2, 2)}")
14 | message = event.getMessageList()[0]
15 | if message.getType() == Message.Type_SUBSCRIPTION_STARTED:
16 | request = Request(Request.Operation_CREATE_ORDER, "coinbase", "BTC-USD")
17 | request.appendParam(
18 | {
19 | "SIDE": "BUY",
20 | "LIMIT_PRICE": "20000",
21 | "QUANTITY": "0.001",
22 | }
23 | )
24 | session.sendRequest(request)
25 | elif event.getType() == Event.Type_SUBSCRIPTION_DATA:
26 | print(f"Received an event of type SUBSCRIPTION_DATA:\n{event.toStringPretty(2, 2)}")
27 | return True # This line is needed.
28 |
29 |
30 | if __name__ == "__main__":
31 | if not os.environ.get("COINBASE_API_KEY"):
32 | print("Please set environment variable COINBASE_API_KEY", file=sys.stderr)
33 | sys.exit(1)
34 | if not os.environ.get("COINBASE_API_SECRET"):
35 | print("Please set environment variable COINBASE_API_SECRET", file=sys.stderr)
36 | sys.exit(1)
37 | if not os.environ.get("COINBASE_API_PASSPHRASE"):
38 | print("Please set environment variable COINBASE_API_PASSPHRASE", file=sys.stderr)
39 | sys.exit(1)
40 | eventHandler = MyEventHandler()
41 | option = SessionOptions()
42 | config = SessionConfigs()
43 | session = Session(option, config, eventHandler)
44 | subscription = Subscription("coinbase", "BTC-USD", "ORDER_UPDATE")
45 | session.subscribe(subscription)
46 | time.sleep(10)
47 | session.stop()
48 | print("Bye")
49 |
--------------------------------------------------------------------------------
/binding/python/example/fix_simple/main.py:
--------------------------------------------------------------------------------
1 | import os
2 | import sys
3 | import time
4 | from ccapi import EventHandler, SessionOptions, SessionConfigs, Session, Subscription, Request, Event, Message
5 |
6 |
7 | class MyEventHandler(EventHandler):
8 | def __init__(self):
9 | super().__init__()
10 |
11 | def processEvent(self, event: Event, session: Session) -> bool:
12 | if event.getType() == Event.Type_AUTHORIZATION_STATUS:
13 | print(f"Received an event of type AUTHORIZATION_STATUS:\n{event.toStringPretty(2, 2)}")
14 | message = event.getMessageList()[0]
15 | if message.getType() == Message.Type_AUTHORIZATION_SUCCESS:
16 | request = Request(Request.Operation_FIX, "coinbase", "", "same correlation id for subscription and request")
17 | request.appendParamFix(
18 | [
19 | (35, "D"),
20 | (11, "6d4eb0fb-2229-469f-873e-557dd78ac11e"),
21 | (55, "BTC-USD"),
22 | (54, "1"),
23 | (44, "20000"),
24 | (38, "0.001"),
25 | (40, "2"),
26 | (59, "1"),
27 | ]
28 | )
29 | session.sendRequestByFix(request)
30 | elif event.getType() == Event.Type_FIX:
31 | print(f"Received an event of type FIX:\n{event.toStringPretty(2, 2)}")
32 | return True # This line is needed.
33 |
34 |
35 | if __name__ == "__main__":
36 | if not os.environ.get("COINBASE_API_KEY"):
37 | print("Please set environment variable COINBASE_API_KEY", file=sys.stderr)
38 | sys.exit(1)
39 | if not os.environ.get("COINBASE_API_SECRET"):
40 | print("Please set environment variable COINBASE_API_SECRET", file=sys.stderr)
41 | sys.exit(1)
42 | if not os.environ.get("COINBASE_API_PASSPHRASE"):
43 | print("Please set environment variable COINBASE_API_PASSPHRASE", file=sys.stderr)
44 | sys.exit(1)
45 | eventHandler = MyEventHandler()
46 | option = SessionOptions()
47 | config = SessionConfigs()
48 | session = Session(option, config, eventHandler)
49 | subscription = Subscription("coinbase", "", "FIX", "", "same correlation id for subscription and request")
50 | session.subscribeByFix(subscription)
51 | time.sleep(10)
52 | session.stop()
53 | print("Bye")
54 |
--------------------------------------------------------------------------------
/binding/python/example/handle_exception/main.py:
--------------------------------------------------------------------------------
1 | import sys
2 | import time
3 | import traceback
4 | from ccapi import EventHandler, SessionOptions, SessionConfigs, Session, Subscription, Event
5 |
6 |
7 | class MyEventHandler(EventHandler):
8 | def __init__(self):
9 | super().__init__()
10 |
11 | def processEvent(self, event: Event, session: Session) -> bool:
12 | try:
13 | raise Exception("oops")
14 | except Exception:
15 | print(traceback.format_exc())
16 | sys.exit(1)
17 | return True # This line is needed.
18 |
19 |
20 | if __name__ == "__main__":
21 | eventHandler = MyEventHandler()
22 | option = SessionOptions()
23 | config = SessionConfigs()
24 | session = Session(option, config, eventHandler)
25 | subscription = Subscription("coinbase", "BTC-USD", "MARKET_DEPTH")
26 | session.subscribe(subscription)
27 | time.sleep(10)
28 | session.stop()
29 | print("Bye")
30 |
--------------------------------------------------------------------------------
/binding/python/example/market_data_multiple_subscription/main.py:
--------------------------------------------------------------------------------
1 | import time
2 | from ccapi import EventHandler, SessionOptions, SessionConfigs, Session, Subscription, Event, SubscriptionList
3 |
4 |
5 | class MyEventHandler(EventHandler):
6 | def __init__(self):
7 | super().__init__()
8 |
9 | def processEvent(self, event: Event, session: Session) -> bool:
10 | if event.getType() == Event.Type_SUBSCRIPTION_DATA:
11 | for message in event.getMessageList():
12 | correlationId = message.getCorrelationIdList()[0]
13 | print(f"{correlationId}: Best bid and ask at {message.getTimeISO()} are:")
14 | for element in message.getElementList():
15 | elementNameValueMap = element.getNameValueMap()
16 | for name, value in elementNameValueMap.items():
17 | print(f" {name} = {value}")
18 | return True # This line is needed.
19 |
20 |
21 | if __name__ == "__main__":
22 | eventHandler = MyEventHandler()
23 | option = SessionOptions()
24 | config = SessionConfigs()
25 | session = Session(option, config, eventHandler)
26 | subscriptionList = SubscriptionList()
27 | subscriptionList.append(Subscription("coinbase", "BTC-USD", "MARKET_DEPTH", "", "BTC"))
28 | subscriptionList.append(Subscription("coinbase", "ETH-USD", "MARKET_DEPTH", "", "ETH"))
29 | session.subscribe(subscriptionList)
30 | time.sleep(10)
31 | session.stop()
32 | print("Bye")
33 |
--------------------------------------------------------------------------------
/binding/python/example/market_data_simple_request/main.py:
--------------------------------------------------------------------------------
1 | import time
2 | from ccapi import EventHandler, SessionOptions, SessionConfigs, Session, Request, Event
3 |
4 |
5 | class MyEventHandler(EventHandler):
6 | def __init__(self):
7 | super().__init__()
8 |
9 | def processEvent(self, event: Event, session: Session) -> bool:
10 | print(f"Received an event:\n{event.toStringPretty(2, 2)}")
11 | return True # This line is needed.
12 |
13 |
14 | if __name__ == "__main__":
15 | eventHandler = MyEventHandler()
16 | option = SessionOptions()
17 | config = SessionConfigs()
18 | session = Session(option, config, eventHandler)
19 | request = Request(Request.Operation_GET_RECENT_TRADES, "coinbase", "BTC-USD")
20 | request.appendParam(
21 | {
22 | "LIMIT": "1",
23 | }
24 | )
25 | session.sendRequest(request)
26 | time.sleep(10)
27 | session.stop()
28 | print("Bye")
29 |
--------------------------------------------------------------------------------
/binding/python/example/market_data_simple_subscription/main.py:
--------------------------------------------------------------------------------
1 | import time
2 | from ccapi import EventHandler, SessionOptions, SessionConfigs, Session, Subscription, Event
3 |
4 |
5 | class MyEventHandler(EventHandler):
6 | def __init__(self):
7 | super().__init__()
8 |
9 | def processEvent(self, event: Event, session: Session) -> bool:
10 | if event.getType() == Event.Type_SUBSCRIPTION_STATUS:
11 | print(f"Received an event of type SUBSCRIPTION_STATUS:\n{event.toStringPretty(2, 2)}")
12 | elif event.getType() == Event.Type_SUBSCRIPTION_DATA:
13 | for message in event.getMessageList():
14 | print(f"Best bid and ask at {message.getTimeISO()} are:")
15 | for element in message.getElementList():
16 | elementNameValueMap = element.getNameValueMap()
17 | for name, value in elementNameValueMap.items():
18 | print(f" {name} = {value}")
19 | return True # This line is needed.
20 |
21 |
22 | if __name__ == "__main__":
23 | eventHandler = MyEventHandler()
24 | option = SessionOptions()
25 | config = SessionConfigs()
26 | session = Session(option, config, eventHandler)
27 | subscription = Subscription("okx", "BTC-USDT", "MARKET_DEPTH")
28 | session.subscribe(subscription)
29 | time.sleep(10)
30 | session.stop()
31 | print("Bye")
32 |
--------------------------------------------------------------------------------
/binding/python/setup.py.in:
--------------------------------------------------------------------------------
1 | from setuptools import setup
2 | from setuptools.command.install import install
3 | from setuptools.dist import Distribution
4 |
5 | class BinaryDistribution(Distribution):
6 | def has_ext_modules(self):
7 | return True
8 |
9 | class InstallPlatlib(install):
10 | def finalize_options(self):
11 | super().finalize_options()
12 | self.install_lib=self.install_platlib
13 |
14 | setup(
15 | name='ccapi',
16 | version='@BUILD_VERSION@',
17 | distclass=BinaryDistribution,
18 | cmdclass={'install': InstallPlatlib},
19 | packages=[''],
20 | py_modules = ['ccapi'],
21 | package_data={'': ['$']},
22 | install_requires=['setuptools', 'wheel'],
23 | )
24 |
--------------------------------------------------------------------------------
/binding/python/test/main.py:
--------------------------------------------------------------------------------
1 | import time
2 | from ccapi import EventHandler, SessionOptions, SessionConfigs, Session, Subscription, Event, Request
3 |
4 |
5 | class MyEventHandler(EventHandler):
6 | def __init__(self):
7 | super().__init__()
8 |
9 | def processEvent(self, event: Event, session: Session) -> bool:
10 | return True # This line is needed.
11 |
12 |
13 | if __name__ == "__main__":
14 | eventHandler = MyEventHandler()
15 | option = SessionOptions()
16 | config = SessionConfigs()
17 | session = Session(option, config, eventHandler)
18 | subscription = Subscription("okx", "BTC-USDT", "MARKET_DEPTH")
19 | session.subscribe(subscription)
20 | request = Request(Request.Operation_GET_RECENT_TRADES, "okx", "BTC-USDT")
21 | request.appendParam(
22 | {
23 | "LIMIT": "1",
24 | }
25 | )
26 | session.sendRequest(request)
27 | session.stop()
28 | print("Bye")
29 |
--------------------------------------------------------------------------------
/binding/swig_interface.i.in:
--------------------------------------------------------------------------------
1 | %module(directors="1") ccapi
2 | %{
3 | #ifndef SWIG
4 | #define SWIG
5 | #endif
6 | #include "ccapi_cpp/ccapi_macro.h"
7 | #include "ccapi_cpp/ccapi_util.h"
8 | #include "ccapi_cpp/ccapi_element.h"
9 | #include "ccapi_cpp/ccapi_message.h"
10 | #include "ccapi_cpp/ccapi_event.h"
11 | #include "ccapi_cpp/ccapi_event_handler.h"
12 | #include "ccapi_cpp/ccapi_event_dispatcher.h"
13 | #include "ccapi_cpp/ccapi_subscription.h"
14 | #include "ccapi_cpp/ccapi_request.h"
15 | #include "ccapi_cpp/ccapi_session_options.h"
16 | #include "ccapi_cpp/ccapi_session_configs.h"
17 | #include "ccapi_cpp/ccapi_queue.h"
18 | #include "ccapi_cpp/ccapi_session.h"
19 | #include "ccapi_cpp/ccapi_logger.h"
20 | %}
21 | %feature("director") ccapi::EventHandler;
22 | %feature("director") ccapi::Logger;
23 | %include "exception.i"
24 | %include "std_pair.i"
25 | %include "std_string.i"
26 | %include "std_map.i"
27 | %include "std_vector.i"
28 | %exception {
29 | try {
30 | $action
31 | } catch (std::exception &e) {
32 | std::string s("error: "), s2(e.what());
33 | s = s + s2;
34 | SWIG_exception(SWIG_RuntimeError, s.c_str());
35 | }
36 | }
37 | %template(MapStringString) std::map;
38 | %template(MapIntString) std::map;
39 | %template(PairIntString) std::pair;
40 | %template(PairLongLongLongLong) std::pair;
41 | %template(VectorPairIntString) std::vector >;
42 | %template(ElementList) std::vector;
43 | %template(VectorString) std::vector;
44 | %template(MessageList) std::vector;
45 | %template(MapStringMapStringString) std::map >;
46 | %template(EventList) std::vector;
47 | %template(SubscriptionList) std::vector;
48 | %template(RequestList) std::vector;
49 |
50 | @SWIG_INTERFACE_CCAPI_LANGUAGE_SPECIFIC@
51 |
52 | %include "ccapi_cpp/ccapi_macro.h"
53 | %include "ccapi_cpp/ccapi_util.h"
54 | %include "ccapi_cpp/ccapi_element.h"
55 | %include "ccapi_cpp/ccapi_message.h"
56 | %include "ccapi_cpp/ccapi_event.h"
57 | %include "ccapi_cpp/ccapi_event_handler.h"
58 | %include "ccapi_cpp/ccapi_event_dispatcher.h"
59 | %include "ccapi_cpp/ccapi_subscription.h"
60 | %include "ccapi_cpp/ccapi_request.h"
61 | %include "ccapi_cpp/ccapi_session_options.h"
62 | %include "ccapi_cpp/ccapi_session_configs.h"
63 | %include "ccapi_cpp/ccapi_queue.h"
64 | %include "ccapi_cpp/ccapi_session.h"
65 | %include "ccapi_cpp/ccapi_logger.h"
66 | %template(EventQueue) ccapi::Queue;
67 |
--------------------------------------------------------------------------------
/example/src/enable_library_logging/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME enable_library_logging)
2 | project(${NAME})
3 | add_compile_definitions(CCAPI_ENABLE_LOG_TRACE)
4 | add_compile_definitions(CCAPI_ENABLE_SERVICE_MARKET_DATA)
5 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_OKX)
6 | add_executable(${NAME} main.cpp)
7 | add_dependencies(${NAME} boost rapidjson)
8 |
--------------------------------------------------------------------------------
/example/src/enable_library_logging/main.cpp:
--------------------------------------------------------------------------------
1 | #include "ccapi_cpp/ccapi_session.h"
2 |
3 | namespace ccapi {
4 | class MyLogger final : public Logger {
5 | public:
6 | void logMessage(const std::string& severity, const std::string& threadId, const std::string& timeISO, const std::string& fileName,
7 | const std::string& lineNumber, const std::string& message) override {
8 | std::lock_guard lock(m);
9 | std::cout << threadId << ": [" << timeISO << "] {" << fileName << ":" << lineNumber << "} " << severity << std::string(8, ' ') << message << std::endl;
10 | }
11 |
12 | private:
13 | std::mutex m;
14 | };
15 |
16 | MyLogger myLogger;
17 | Logger* Logger::logger = &myLogger;
18 | } /* namespace ccapi */
19 |
20 | using ::ccapi::Session;
21 | using ::ccapi::Subscription;
22 |
23 | int main(int argc, char** argv) {
24 | Session session;
25 | Subscription subscription("okx", "BTC-USDT", "MARKET_DEPTH");
26 | session.subscribe(subscription);
27 | std::this_thread::sleep_for(std::chrono::seconds(10));
28 | session.stop();
29 | std::cout << "Bye" << std::endl;
30 | return EXIT_SUCCESS;
31 | }
32 |
--------------------------------------------------------------------------------
/example/src/execution_management_advanced_request/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME execution_management_advanced_request)
2 | project(${NAME})
3 | add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT)
4 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_OKX)
5 | add_executable(${NAME} main.cpp)
6 | add_dependencies(${NAME} boost rapidjson)
7 |
--------------------------------------------------------------------------------
/example/src/execution_management_advanced_request/main.cpp:
--------------------------------------------------------------------------------
1 | #include "ccapi_cpp/ccapi_session.h"
2 |
3 | namespace ccapi {
4 | Logger* Logger::logger = nullptr; // This line is needed.
5 |
6 | class MyEventHandler : public EventHandler {
7 | public:
8 | bool processEvent(const Event& event, Session* sessionPtr) override {
9 | std::cout << "Received an event:\n" + event.toStringPretty(2, 2) << std::endl;
10 | return true;
11 | }
12 | };
13 | } /* namespace ccapi */
14 |
15 | using ::ccapi::MyEventHandler;
16 | using ::ccapi::Request;
17 | using ::ccapi::Session;
18 | using ::ccapi::SessionConfigs;
19 | using ::ccapi::SessionOptions;
20 | using ::ccapi::UtilSystem;
21 |
22 | int main(int argc, char** argv) {
23 | if (UtilSystem::getEnvAsString("OKX_API_KEY").empty()) {
24 | std::cerr << "Please set environment variable OKX_API_KEY" << std::endl;
25 | return EXIT_FAILURE;
26 | }
27 | if (UtilSystem::getEnvAsString("OKX_API_SECRET").empty()) {
28 | std::cerr << "Please set environment variable OKX_API_SECRET" << std::endl;
29 | return EXIT_FAILURE;
30 | }
31 | if (UtilSystem::getEnvAsString("OKX_API_PASSPHRASE").empty()) {
32 | std::cerr << "Please set environment variable OKX_API_PASSPHRASE" << std::endl;
33 | return EXIT_FAILURE;
34 | }
35 | SessionOptions sessionOptions;
36 | SessionConfigs sessionConfigs;
37 | MyEventHandler eventHandler;
38 | Session session(sessionOptions, sessionConfigs, &eventHandler);
39 | Request request(Request::Operation::CREATE_ORDER, "okx", "BTC-USDT");
40 | request.appendParam({
41 | {"tdMode", "cross"},
42 | {"ccy", "USDT"},
43 | });
44 | session.sendRequest(request);
45 | std::this_thread::sleep_for(std::chrono::seconds(10));
46 | session.stop();
47 | std::cout << "Bye" << std::endl;
48 | return EXIT_SUCCESS;
49 | }
50 |
--------------------------------------------------------------------------------
/example/src/execution_management_advanced_subscription/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME execution_management_advanced_subscription)
2 | project(${NAME})
3 | add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT)
4 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_OKX)
5 | add_executable(${NAME} main.cpp)
6 | add_dependencies(${NAME} boost rapidjson)
7 |
--------------------------------------------------------------------------------
/example/src/execution_management_advanced_subscription/main.cpp:
--------------------------------------------------------------------------------
1 | #include "ccapi_cpp/ccapi_session.h"
2 |
3 | namespace ccapi {
4 | Logger* Logger::logger = nullptr; // This line is needed.
5 |
6 | class MyEventHandler : public EventHandler {
7 | public:
8 | MyEventHandler(const std::string& websocketOrderEntrySubscriptionCorrelationId)
9 | : websocketOrderEntrySubscriptionCorrelationId(websocketOrderEntrySubscriptionCorrelationId) {}
10 |
11 | bool processEvent(const Event& event, Session* sessionPtr) override {
12 | std::cout << "Received an event:\n" + event.toStringPretty(2, 2) << std::endl;
13 | if (!willSendRequest) {
14 | sessionPtr->setTimer("id", 1000, nullptr, [this, sessionPtr]() {
15 | Request request(Request::Operation::CREATE_ORDER, "okx", "BTC-USDT");
16 | request.appendParam({
17 | {"SIDE", "BUY"},
18 | {"LIMIT_PRICE", "20000"},
19 | {"QUANTITY", "0.001"},
20 | });
21 | std::cout << "About to send a request:\n" + request.toString() << std::endl;
22 | sessionPtr->sendRequestByWebsocket(this->websocketOrderEntrySubscriptionCorrelationId, request);
23 | });
24 | willSendRequest = true;
25 | }
26 | return true;
27 | }
28 |
29 | private:
30 | std::string websocketOrderEntrySubscriptionCorrelationId;
31 | bool willSendRequest{};
32 | };
33 | } /* namespace ccapi */
34 |
35 | using ::ccapi::MyEventHandler;
36 | using ::ccapi::Request;
37 | using ::ccapi::Session;
38 | using ::ccapi::SessionConfigs;
39 | using ::ccapi::SessionOptions;
40 | using ::ccapi::Subscription;
41 | using ::ccapi::UtilSystem;
42 |
43 | int main(int argc, char** argv) {
44 | if (UtilSystem::getEnvAsString("OKX_API_KEY").empty()) {
45 | std::cerr << "Please set environment variable OKX_API_KEY" << std::endl;
46 | return EXIT_FAILURE;
47 | }
48 | if (UtilSystem::getEnvAsString("OKX_API_SECRET").empty()) {
49 | std::cerr << "Please set environment variable OKX_API_SECRET" << std::endl;
50 | return EXIT_FAILURE;
51 | }
52 | if (UtilSystem::getEnvAsString("OKX_API_PASSPHRASE").empty()) {
53 | std::cerr << "Please set environment variable OKX_API_PASSPHRASE" << std::endl;
54 | return EXIT_FAILURE;
55 | }
56 | SessionOptions sessionOptions;
57 | SessionConfigs sessionConfigs;
58 | std::string websocketOrderEntrySubscriptionCorrelationId("any");
59 | MyEventHandler eventHandler(websocketOrderEntrySubscriptionCorrelationId);
60 | Session session(sessionOptions, sessionConfigs, &eventHandler);
61 | Subscription subscription("okx", "", "ORDER_UPDATE", "", websocketOrderEntrySubscriptionCorrelationId);
62 | session.subscribe(subscription);
63 | std::this_thread::sleep_for(std::chrono::seconds(10));
64 | session.stop();
65 | std::cout << "Bye" << std::endl;
66 | return EXIT_SUCCESS;
67 | }
68 |
--------------------------------------------------------------------------------
/example/src/execution_management_simple_request/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME execution_management_simple_request)
2 | project(${NAME})
3 | add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT)
4 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_OKX)
5 | add_executable(${NAME} main.cpp)
6 | add_dependencies(${NAME} boost rapidjson)
7 |
--------------------------------------------------------------------------------
/example/src/execution_management_simple_subscription/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME execution_management_simple_subscription)
2 | project(${NAME})
3 | add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT)
4 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_OKX)
5 | add_executable(${NAME} main.cpp)
6 | add_dependencies(${NAME} boost rapidjson)
7 |
--------------------------------------------------------------------------------
/example/src/execution_management_simple_subscription/main.cpp:
--------------------------------------------------------------------------------
1 | #include "ccapi_cpp/ccapi_session.h"
2 |
3 | namespace ccapi {
4 | Logger* Logger::logger = nullptr; // This line is needed.
5 |
6 | class MyEventHandler : public EventHandler {
7 | public:
8 | bool processEvent(const Event& event, Session* sessionPtr) override {
9 | if (event.getType() == Event::Type::SUBSCRIPTION_STATUS) {
10 | std::cout << "Received an event of type SUBSCRIPTION_STATUS:\n" + event.toStringPretty(2, 2) << std::endl;
11 | auto message = event.getMessageList().at(0);
12 | if (message.getType() == Message::Type::SUBSCRIPTION_STARTED) {
13 | Request request(Request::Operation::CREATE_ORDER, "okx", "BTC-USDT");
14 | request.appendParam({
15 | {"SIDE", "BUY"},
16 | {"LIMIT_PRICE", "20000"},
17 | {"QUANTITY", "0.001"},
18 | {"CLIENT_ORDER_ID", "6d4eb0fb"},
19 | });
20 | sessionPtr->sendRequest(request);
21 | }
22 | } else if (event.getType() == Event::Type::SUBSCRIPTION_DATA) {
23 | std::cout << "Received an event of type SUBSCRIPTION_DATA:\n" + event.toStringPretty(2, 2) << std::endl;
24 | }
25 | return true;
26 | }
27 | };
28 | } /* namespace ccapi */
29 |
30 | using ::ccapi::MyEventHandler;
31 | using ::ccapi::Request;
32 | using ::ccapi::Session;
33 | using ::ccapi::SessionConfigs;
34 | using ::ccapi::SessionOptions;
35 | using ::ccapi::Subscription;
36 | using ::ccapi::UtilSystem;
37 |
38 | int main(int argc, char** argv) {
39 | if (UtilSystem::getEnvAsString("OKX_API_KEY").empty()) {
40 | std::cerr << "Please set environment variable OKX_API_KEY" << std::endl;
41 | return EXIT_FAILURE;
42 | }
43 | if (UtilSystem::getEnvAsString("OKX_API_SECRET").empty()) {
44 | std::cerr << "Please set environment variable OKX_API_SECRET" << std::endl;
45 | return EXIT_FAILURE;
46 | }
47 | if (UtilSystem::getEnvAsString("OKX_API_PASSPHRASE").empty()) {
48 | std::cerr << "Please set environment variable OKX_API_PASSPHRASE" << std::endl;
49 | return EXIT_FAILURE;
50 | }
51 | SessionOptions sessionOptions;
52 | SessionConfigs sessionConfigs;
53 | MyEventHandler eventHandler;
54 | Session session(sessionOptions, sessionConfigs, &eventHandler);
55 | Subscription subscription("okx", "BTC-USDT", "ORDER_UPDATE");
56 | session.subscribe(subscription);
57 | std::this_thread::sleep_for(std::chrono::seconds(10));
58 | session.stop();
59 | std::cout << "Bye" << std::endl;
60 | return EXIT_SUCCESS;
61 | }
62 |
--------------------------------------------------------------------------------
/example/src/fix_advanced/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME fix_advanced)
2 | project(${NAME})
3 | add_compile_definitions(CCAPI_ENABLE_SERVICE_FIX)
4 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_COINBASE)
5 | add_executable(${NAME} main.cpp)
6 | add_dependencies(${NAME} boost rapidjson hffix)
7 |
--------------------------------------------------------------------------------
/example/src/fix_advanced/main.cpp:
--------------------------------------------------------------------------------
1 | #include "ccapi_cpp/ccapi_session.h"
2 |
3 | namespace ccapi {
4 | Logger* Logger::logger = nullptr; // This line is needed.
5 |
6 | class MyEventHandler : public EventHandler {
7 | public:
8 | bool processEvent(const Event& event, Session* sessionPtr) override {
9 | if (event.getType() == Event::Type::AUTHORIZATION_STATUS) {
10 | std::cout << "Received an event of type AUTHORIZATION_STATUS:\n" + event.toStringPretty(2, 2) << std::endl;
11 | auto message = event.getMessageList().at(0);
12 | if (message.getType() == Message::Type::AUTHORIZATION_SUCCESS) {
13 | Request request(Request::Operation::FIX, "coinbase", "", "same correlation id for subscription and request");
14 | request.appendParamFix({
15 | {35, "D"},
16 | {11, "6d4eb0fb-2229-469f-873e-557dd78ac11e"},
17 | {55, "BTC-USD"},
18 | {54, "1"},
19 | {44, "20000"},
20 | {38, "0.001"},
21 | {40, "2"},
22 | {59, "1"},
23 | });
24 | sessionPtr->sendRequestByFix(request);
25 | }
26 | } else if (event.getType() == Event::Type::FIX) {
27 | std::cout << "Received an event of type FIX:\n" + event.toStringPretty(2, 2) << std::endl;
28 | }
29 | return true;
30 | }
31 | };
32 | } /* namespace ccapi */
33 |
34 | using ::ccapi::MyEventHandler;
35 | using ::ccapi::Session;
36 | using ::ccapi::SessionConfigs;
37 | using ::ccapi::SessionOptions;
38 | using ::ccapi::Subscription;
39 | using ::ccapi::UtilSystem;
40 |
41 | int main(int argc, char** argv) {
42 | if (UtilSystem::getEnvAsString("COINBASE_API_KEY").empty()) {
43 | std::cerr << "Please set environment variable COINBASE_API_KEY" << std::endl;
44 | return EXIT_FAILURE;
45 | }
46 | if (UtilSystem::getEnvAsString("COINBASE_API_SECRET").empty()) {
47 | std::cerr << "Please set environment variable COINBASE_API_SECRET" << std::endl;
48 | return EXIT_FAILURE;
49 | }
50 | if (UtilSystem::getEnvAsString("COINBASE_API_PASSPHRASE").empty()) {
51 | std::cerr << "Please set environment variable COINBASE_API_PASSPHRASE" << std::endl;
52 | return EXIT_FAILURE;
53 | }
54 | SessionOptions sessionOptions;
55 | sessionOptions.heartbeatFixIntervalMilliseconds = 30000; // Note the unit is millisecond
56 | sessionOptions.heartbeatFixTimeoutMilliseconds = 5000; // Note the unit is millisecond, should be less than heartbeatFixIntervalMilliseconds
57 | SessionConfigs sessionConfigs;
58 | MyEventHandler eventHandler;
59 | Session session(sessionOptions, sessionConfigs, &eventHandler);
60 | Subscription subscription("coinbase", "", "FIX", "8013=S&9406=Y",
61 | "same correlation id for subscription and request"); // https://docs.pro.coinbase.com/#logon-a
62 | session.subscribeByFix(subscription);
63 | std::this_thread::sleep_for(std::chrono::seconds(10));
64 | session.stop();
65 | return EXIT_SUCCESS;
66 | }
67 |
--------------------------------------------------------------------------------
/example/src/fix_simple/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME fix_simple)
2 | project(${NAME})
3 | add_compile_definitions(CCAPI_ENABLE_SERVICE_FIX)
4 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_COINBASE)
5 | add_executable(${NAME} main.cpp)
6 | add_dependencies(${NAME} boost rapidjson hffix)
7 |
--------------------------------------------------------------------------------
/example/src/fix_simple/main.cpp:
--------------------------------------------------------------------------------
1 | #include "ccapi_cpp/ccapi_session.h"
2 |
3 | namespace ccapi {
4 | Logger* Logger::logger = nullptr; // This line is needed.
5 |
6 | class MyEventHandler : public EventHandler {
7 | public:
8 | bool processEvent(const Event& event, Session* sessionPtr) override {
9 | if (event.getType() == Event::Type::AUTHORIZATION_STATUS) {
10 | std::cout << "Received an event of type AUTHORIZATION_STATUS:\n" + event.toStringPretty(2, 2) << std::endl;
11 | auto message = event.getMessageList().at(0);
12 | if (message.getType() == Message::Type::AUTHORIZATION_SUCCESS) {
13 | Request request(Request::Operation::FIX, "coinbase", "", "same correlation id for subscription and request");
14 | request.appendParamFix({
15 | {35, "D"},
16 | {11, "6d4eb0fb-2229-469f-873e-557dd78ac11e"},
17 | {55, "BTC-USD"},
18 | {54, "1"},
19 | {44, "20000"},
20 | {38, "0.001"},
21 | {40, "2"},
22 | {59, "1"},
23 | });
24 | sessionPtr->sendRequestByFix(request);
25 | }
26 | } else if (event.getType() == Event::Type::FIX) {
27 | std::cout << "Received an event of type FIX:\n" + event.toStringPretty(2, 2) << std::endl;
28 | }
29 | return true;
30 | }
31 | };
32 | } /* namespace ccapi */
33 |
34 | using ::ccapi::MyEventHandler;
35 | using ::ccapi::Session;
36 | using ::ccapi::SessionConfigs;
37 | using ::ccapi::SessionOptions;
38 | using ::ccapi::Subscription;
39 | using ::ccapi::UtilSystem;
40 |
41 | int main(int argc, char** argv) {
42 | if (UtilSystem::getEnvAsString("COINBASE_API_KEY").empty()) {
43 | std::cerr << "Please set environment variable COINBASE_API_KEY" << std::endl;
44 | return EXIT_FAILURE;
45 | }
46 | if (UtilSystem::getEnvAsString("COINBASE_API_SECRET").empty()) {
47 | std::cerr << "Please set environment variable COINBASE_API_SECRET" << std::endl;
48 | return EXIT_FAILURE;
49 | }
50 | if (UtilSystem::getEnvAsString("COINBASE_API_PASSPHRASE").empty()) {
51 | std::cerr << "Please set environment variable COINBASE_API_PASSPHRASE" << std::endl;
52 | return EXIT_FAILURE;
53 | }
54 | SessionOptions sessionOptions;
55 | SessionConfigs sessionConfigs;
56 | MyEventHandler eventHandler;
57 | Session session(sessionOptions, sessionConfigs, &eventHandler);
58 | Subscription subscription("coinbase", "", "FIX", "", "same correlation id for subscription and request");
59 | session.subscribeByFix(subscription);
60 | std::this_thread::sleep_for(std::chrono::seconds(10));
61 | session.stop();
62 | std::cout << "Bye" << std::endl;
63 | return EXIT_SUCCESS;
64 | }
65 |
--------------------------------------------------------------------------------
/example/src/generic_private_request/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME generic_private_request)
2 | project(${NAME})
3 | add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT)
4 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_OKX)
5 | add_executable(${NAME} main.cpp)
6 | add_dependencies(${NAME} boost rapidjson)
7 |
--------------------------------------------------------------------------------
/example/src/generic_private_request/main.cpp:
--------------------------------------------------------------------------------
1 | #include "ccapi_cpp/ccapi_session.h"
2 |
3 | namespace ccapi {
4 | Logger* Logger::logger = nullptr; // This line is needed.
5 |
6 | class MyEventHandler : public EventHandler {
7 | public:
8 | bool processEvent(const Event& event, Session* sessionPtr) override {
9 | std::cout << "Received an event:\n" + event.toStringPretty(2, 2) << std::endl;
10 | return true;
11 | }
12 | };
13 | } /* namespace ccapi */
14 |
15 | using ::ccapi::ExecutionManagementService;
16 | using ::ccapi::MyEventHandler;
17 | using ::ccapi::Request;
18 | using ::ccapi::Session;
19 | using ::ccapi::SessionConfigs;
20 | using ::ccapi::SessionOptions;
21 | using ::ccapi::UtilSystem;
22 | using ::ccapi::UtilTime;
23 |
24 | int main(int argc, char** argv) {
25 | if (UtilSystem::getEnvAsString("OKX_API_KEY").empty()) {
26 | std::cerr << "Please set environment variable OKX_API_KEY" << std::endl;
27 | return EXIT_FAILURE;
28 | }
29 | if (UtilSystem::getEnvAsString("OKX_API_SECRET").empty()) {
30 | std::cerr << "Please set environment variable OKX_API_SECRET" << std::endl;
31 | return EXIT_FAILURE;
32 | }
33 | if (UtilSystem::getEnvAsString("OKX_API_PASSPHRASE").empty()) {
34 | std::cerr << "Please set environment variable OKX_API_PASSPHRASE" << std::endl;
35 | return EXIT_FAILURE;
36 | }
37 | SessionOptions sessionOptions;
38 | SessionConfigs sessionConfigs;
39 | MyEventHandler eventHandler;
40 | Session session(sessionOptions, sessionConfigs, &eventHandler);
41 | Request request(Request::Operation::GENERIC_PRIVATE_REQUEST, "okx", "", "close all positions");
42 | request.appendParam({
43 | {"HTTP_METHOD", "POST"},
44 | {"HTTP_PATH", "/api/v5/trade/close-position"},
45 | {"HTTP_BODY", R"({
46 | "instId": "BTC-USDT-SWAP",
47 | "mgnMode": "cross"
48 | })"},
49 | });
50 | session.sendRequest(request);
51 | std::this_thread::sleep_for(std::chrono::seconds(10));
52 | session.stop();
53 | std::cout << "Bye" << std::endl;
54 | return EXIT_SUCCESS;
55 | }
56 |
--------------------------------------------------------------------------------
/example/src/generic_public_request/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME generic_public_request)
2 | project(${NAME})
3 | add_compile_definitions(CCAPI_ENABLE_SERVICE_MARKET_DATA)
4 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_OKX)
5 | add_executable(${NAME} main.cpp)
6 | add_dependencies(${NAME} boost rapidjson)
7 |
--------------------------------------------------------------------------------
/example/src/generic_public_request/main.cpp:
--------------------------------------------------------------------------------
1 | #include "ccapi_cpp/ccapi_session.h"
2 |
3 | namespace ccapi {
4 | Logger* Logger::logger = nullptr; // This line is needed.
5 |
6 | class MyEventHandler : public EventHandler {
7 | public:
8 | bool processEvent(const Event& event, Session* sessionPtr) override {
9 | std::cout << "Received an event:\n" + event.toStringPretty(2, 2) << std::endl;
10 | return true;
11 | }
12 | };
13 | } /* namespace ccapi */
14 |
15 | using ::ccapi::MyEventHandler;
16 | using ::ccapi::Request;
17 | using ::ccapi::Session;
18 | using ::ccapi::SessionConfigs;
19 | using ::ccapi::SessionOptions;
20 | using ::ccapi::UtilSystem;
21 |
22 | int main(int argc, char** argv) {
23 | SessionOptions sessionOptions;
24 | SessionConfigs sessionConfigs;
25 | MyEventHandler eventHandler;
26 | Session session(sessionOptions, sessionConfigs, &eventHandler);
27 | Request request(Request::Operation::GENERIC_PUBLIC_REQUEST, "okx", "", "Check Server Time");
28 | request.appendParam({
29 | {"HTTP_METHOD", "GET"},
30 | {"HTTP_PATH", "/api/v5/public/time"},
31 | });
32 | session.sendRequest(request);
33 | std::this_thread::sleep_for(std::chrono::seconds(10));
34 | session.stop();
35 | std::cout << "Bye" << std::endl;
36 | return EXIT_SUCCESS;
37 | }
38 |
--------------------------------------------------------------------------------
/example/src/market_data_advanced_request/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME market_data_advanced_request)
2 | project(${NAME})
3 | add_compile_definitions(CCAPI_ENABLE_SERVICE_MARKET_DATA)
4 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_OKX)
5 | add_executable(${NAME} main.cpp)
6 | add_dependencies(${NAME} boost rapidjson)
7 |
--------------------------------------------------------------------------------
/example/src/market_data_advanced_request/main.cpp:
--------------------------------------------------------------------------------
1 | #include "ccapi_cpp/ccapi_session.h"
2 |
3 | namespace ccapi {
4 | Logger* Logger::logger = nullptr; // This line is needed.
5 |
6 | class MyEventHandler : public EventHandler {
7 | public:
8 | bool processEvent(const Event& event, Session* sessionPtr) override {
9 | std::cout << "Received an event:\n" + event.toStringPretty(2, 2) << std::endl;
10 | return true;
11 | }
12 | };
13 | } /* namespace ccapi */
14 |
15 | using ::ccapi::MyEventHandler;
16 | using ::ccapi::Request;
17 | using ::ccapi::Session;
18 | using ::ccapi::SessionConfigs;
19 | using ::ccapi::SessionOptions;
20 |
21 | int main(int argc, char** argv) {
22 | SessionOptions sessionOptions;
23 | SessionConfigs sessionConfigs;
24 | MyEventHandler eventHandler;
25 | Session session(sessionOptions, sessionConfigs, &eventHandler);
26 | Request request(Request::Operation::GET_HISTORICAL_TRADES, "okx", "BTC-USDT");
27 | request.appendParam({
28 | {"before", "1"},
29 | {"after", "3"},
30 | {"limit", "1"},
31 | });
32 | session.sendRequest(request);
33 | std::this_thread::sleep_for(std::chrono::seconds(10));
34 | session.stop();
35 | std::cout << "Bye" << std::endl;
36 | return EXIT_SUCCESS;
37 | }
38 |
--------------------------------------------------------------------------------
/example/src/market_data_advanced_subscription/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME market_data_advanced_subscription)
2 | project(${NAME})
3 | add_compile_definitions(CCAPI_ENABLE_SERVICE_MARKET_DATA)
4 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_OKX)
5 | add_executable(${NAME} main.cpp)
6 | add_dependencies(${NAME} boost rapidjson)
7 |
--------------------------------------------------------------------------------
/example/src/market_data_advanced_subscription/main.cpp:
--------------------------------------------------------------------------------
1 | #include "ccapi_cpp/ccapi_session.h"
2 |
3 | namespace ccapi {
4 | Logger* Logger::logger = nullptr; // This line is needed.
5 |
6 | class MyEventHandler : public EventHandler {
7 | public:
8 | bool processEvent(const Event& event, Session* sessionPtr) override {
9 | std::cout << toString(event) + "\n" << std::endl;
10 | return true;
11 | }
12 | };
13 | } /* namespace ccapi */
14 |
15 | using ::ccapi::Event;
16 | using ::ccapi::EventDispatcher;
17 | using ::ccapi::MyEventHandler;
18 | using ::ccapi::Session;
19 | using ::ccapi::SessionConfigs;
20 | using ::ccapi::SessionOptions;
21 | using ::ccapi::Subscription;
22 | using ::ccapi::toString;
23 |
24 | int main(int argc, char** argv) {
25 | std::vector modeList = {
26 | "dispatch_events_to_multiple_threads",
27 | "handle_events_in_batching_mode",
28 | };
29 | if (argc != 2 || std::find(modeList.begin(), modeList.end(), argv[1]) == modeList.end()) {
30 | std::cerr << "Please provide one command line argument from this list: " + toString(modeList) << std::endl;
31 | return EXIT_FAILURE;
32 | }
33 | std::string mode(argv[1]);
34 | if (mode == "dispatch_events_to_multiple_threads") {
35 | SessionOptions sessionOptions;
36 | SessionConfigs sessionConfigs;
37 | MyEventHandler eventHandler;
38 | EventDispatcher eventDispatcher(2);
39 | Session session(sessionOptions, sessionConfigs, &eventHandler, &eventDispatcher);
40 | Subscription subscription("okx", "BTC-USDT", "MARKET_DEPTH");
41 | session.subscribe(subscription);
42 | std::this_thread::sleep_for(std::chrono::seconds(10));
43 | session.stop();
44 | eventDispatcher.stop();
45 | } else if (mode == "handle_events_in_batching_mode") {
46 | SessionOptions sessionOptions;
47 | SessionConfigs sessionConfigs;
48 | Session session(sessionOptions, sessionConfigs);
49 | Subscription subscription("okx", "BTC-USDT", "MARKET_DEPTH");
50 | session.subscribe(subscription);
51 | std::this_thread::sleep_for(std::chrono::seconds(10));
52 | std::vector eventList = session.getEventQueue().purge();
53 | for (const auto& event : eventList) {
54 | std::cout << toString(event) + "\n" << std::endl;
55 | }
56 | session.stop();
57 | }
58 | std::cout << "Bye" << std::endl;
59 | return EXIT_SUCCESS;
60 | }
61 |
--------------------------------------------------------------------------------
/example/src/market_data_simple_request/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME market_data_simple_request)
2 | project(${NAME})
3 | add_compile_definitions(CCAPI_ENABLE_SERVICE_MARKET_DATA)
4 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_OKX)
5 | add_executable(${NAME} main.cpp)
6 | add_dependencies(${NAME} boost rapidjson)
7 |
--------------------------------------------------------------------------------
/example/src/market_data_simple_request/main.cpp:
--------------------------------------------------------------------------------
1 | #include "ccapi_cpp/ccapi_session.h"
2 |
3 | namespace ccapi {
4 | Logger* Logger::logger = nullptr; // This line is needed.
5 |
6 | class MyEventHandler : public EventHandler {
7 | public:
8 | bool processEvent(const Event& event, Session* sessionPtr) override {
9 | std::cout << "Received an event:\n" + event.toStringPretty(2, 2) << std::endl;
10 | return true;
11 | }
12 | };
13 | } /* namespace ccapi */
14 |
15 | using ::ccapi::MyEventHandler;
16 | using ::ccapi::Request;
17 | using ::ccapi::Session;
18 | using ::ccapi::SessionConfigs;
19 | using ::ccapi::SessionOptions;
20 |
21 | int main(int argc, char** argv) {
22 | SessionOptions sessionOptions;
23 | SessionConfigs sessionConfigs;
24 | MyEventHandler eventHandler;
25 | Session session(sessionOptions, sessionConfigs, &eventHandler);
26 | Request request(Request::Operation::GET_RECENT_TRADES, "okx", "BTC-USDT");
27 | request.appendParam({
28 | {"LIMIT", "1"},
29 | });
30 | session.sendRequest(request);
31 | std::this_thread::sleep_for(std::chrono::seconds(10));
32 | session.stop();
33 | std::cout << "Bye" << std::endl;
34 | return EXIT_SUCCESS;
35 | }
36 |
--------------------------------------------------------------------------------
/example/src/market_data_simple_subscription/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME market_data_simple_subscription)
2 | project(${NAME})
3 | add_compile_definitions(CCAPI_ENABLE_SERVICE_MARKET_DATA)
4 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_OKX)
5 | add_executable(${NAME} main.cpp)
6 | add_dependencies(${NAME} boost rapidjson)
7 |
--------------------------------------------------------------------------------
/example/src/market_data_simple_subscription/main.cpp:
--------------------------------------------------------------------------------
1 | #include "ccapi_cpp/ccapi_session.h"
2 |
3 | namespace ccapi {
4 | Logger* Logger::logger = nullptr; // This line is needed.
5 |
6 | class MyEventHandler : public EventHandler {
7 | public:
8 | bool processEvent(const Event& event, Session* sessionPtr) override {
9 | if (event.getType() == Event::Type::SUBSCRIPTION_STATUS) {
10 | std::cout << "Received an event of type SUBSCRIPTION_STATUS:\n" + event.toStringPretty(2, 2) << std::endl;
11 | } else if (event.getType() == Event::Type::SUBSCRIPTION_DATA) {
12 | for (const auto& message : event.getMessageList()) {
13 | std::cout << std::string("Best bid and ask at ") + UtilTime::getISOTimestamp(message.getTime()) + " are:" << std::endl;
14 | for (const auto& element : message.getElementList()) {
15 | const std::map& elementNameValueMap = element.getNameValueMap();
16 | std::cout << " " + toString(elementNameValueMap) << std::endl;
17 | }
18 | }
19 | }
20 | return true;
21 | }
22 | };
23 | } /* namespace ccapi */
24 |
25 | using ::ccapi::MyEventHandler;
26 | using ::ccapi::Session;
27 | using ::ccapi::SessionConfigs;
28 | using ::ccapi::SessionOptions;
29 | using ::ccapi::Subscription;
30 | using ::ccapi::toString;
31 |
32 | int main(int argc, char** argv) {
33 | SessionOptions sessionOptions;
34 | SessionConfigs sessionConfigs;
35 | MyEventHandler eventHandler;
36 | Session session(sessionOptions, sessionConfigs, &eventHandler);
37 | Subscription subscription("okx", "BTC-USDT", "MARKET_DEPTH");
38 | session.subscribe(subscription);
39 | std::this_thread::sleep_for(std::chrono::seconds(10));
40 | session.stop();
41 | std::cout << "Bye" << std::endl;
42 | return EXIT_SUCCESS;
43 | }
44 |
--------------------------------------------------------------------------------
/example/src/override_exchange_url_at_runtime/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME override_exchange_url_at_runtime)
2 | project(${NAME})
3 | add_compile_definitions(CCAPI_ENABLE_SERVICE_MARKET_DATA)
4 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_OKX)
5 | add_executable(${NAME} main.cpp)
6 | add_dependencies(${NAME} boost rapidjson)
7 |
--------------------------------------------------------------------------------
/example/src/override_exchange_url_at_runtime/main.cpp:
--------------------------------------------------------------------------------
1 | #include "ccapi_cpp/ccapi_session.h"
2 |
3 | namespace ccapi {
4 | Logger* Logger::logger = nullptr; // This line is needed.
5 |
6 | class MyEventHandler : public EventHandler {
7 | public:
8 | bool processEvent(const Event& event, Session* sessionPtr) override {
9 | if (event.getType() == Event::Type::SESSION_STATUS) {
10 | for (const auto& message : event.getMessageList()) {
11 | if (message.getType() == Message::Type::SESSION_CONNECTION_UP) {
12 | for (const auto& element : message.getElementList()) {
13 | const std::map& elementNameValueMap = element.getNameValueMap();
14 | std::cout << "Connected to " + toString(elementNameValueMap.at("CONNECTION_URL")) << std::endl;
15 | }
16 | }
17 | }
18 | }
19 | return true;
20 | }
21 | };
22 | } /* namespace ccapi */
23 |
24 | using ::ccapi::MyEventHandler;
25 | using ::ccapi::Session;
26 | using ::ccapi::SessionConfigs;
27 | using ::ccapi::SessionOptions;
28 | using ::ccapi::Subscription;
29 | using ::ccapi::toString;
30 |
31 | int main(int argc, char** argv) {
32 | SessionOptions sessionOptions;
33 | SessionConfigs sessionConfigs;
34 | std::map urlWebsocketBase = sessionConfigs.getUrlWebsocketBase();
35 | urlWebsocketBase["okx"] = "wss://wsaws.okx.com:8443";
36 | sessionConfigs.setUrlWebsocketBase(urlWebsocketBase);
37 | MyEventHandler eventHandler;
38 | Session session(sessionOptions, sessionConfigs, &eventHandler);
39 | Subscription subscription("okx", "BTC-USDT", "MARKET_DEPTH");
40 | session.subscribe(subscription);
41 | std::this_thread::sleep_for(std::chrono::seconds(10));
42 | session.stop();
43 | std::cout << "Bye" << std::endl;
44 | return EXIT_SUCCESS;
45 | }
46 |
--------------------------------------------------------------------------------
/example/src/test_order_latency/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME test_order_latency)
2 | project(${NAME})
3 | add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT)
4 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_OKX)
5 | add_executable(${NAME} main.cpp)
6 | add_dependencies(${NAME} boost rapidjson)
7 |
--------------------------------------------------------------------------------
/example/src/utility_set_timer/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME utility_set_timer)
2 | project(${NAME})
3 | add_compile_definitions(CCAPI_ENABLE_SERVICE_MARKET_DATA)
4 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_OKX)
5 | add_executable(${NAME} main.cpp)
6 | add_dependencies(${NAME} boost rapidjson)
7 |
--------------------------------------------------------------------------------
/example/src/utility_set_timer/main.cpp:
--------------------------------------------------------------------------------
1 | #include "ccapi_cpp/ccapi_session.h"
2 |
3 | namespace ccapi {
4 | Logger* Logger::logger = nullptr; // This line is needed.
5 |
6 | class MyEventHandler : public EventHandler {
7 | public:
8 | bool processEvent(const Event& event, Session* sessionPtr) override {
9 | if (numEvent == 0) {
10 | std::cout << std::string("Timer is set at ") + UtilTime::getISOTimestamp(UtilTime::now()) << std::endl;
11 | sessionPtr->setTimer(
12 | "id", 1000,
13 | [](const boost::system::error_code&) { std::cout << std::string("Timer is canceled at ") + UtilTime::getISOTimestamp(UtilTime::now()) << std::endl; },
14 | []() { std::cout << std::string("Timer is triggered at ") + UtilTime::getISOTimestamp(UtilTime::now()) << std::endl; });
15 | }
16 | ++numEvent;
17 | return true;
18 | }
19 |
20 | int numEvent{};
21 | };
22 | } /* namespace ccapi */
23 |
24 | using ::ccapi::MyEventHandler;
25 | using ::ccapi::Session;
26 | using ::ccapi::SessionConfigs;
27 | using ::ccapi::SessionOptions;
28 | using ::ccapi::Subscription;
29 |
30 | int main(int argc, char** argv) {
31 | SessionOptions sessionOptions;
32 | SessionConfigs sessionConfigs;
33 | MyEventHandler eventHandler;
34 | Session session(sessionOptions, sessionConfigs, &eventHandler);
35 | Subscription subscription("okx", "BTC-USDT", "MARKET_DEPTH");
36 | session.subscribe(subscription);
37 | std::this_thread::sleep_for(std::chrono::seconds(10));
38 | session.stop();
39 | std::cout << "Bye" << std::endl;
40 | return EXIT_SUCCESS;
41 | }
42 |
--------------------------------------------------------------------------------
/format.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | ./format_cpp.sh
3 | # ./format_csharp.sh
4 | # ./format_go.sh
5 | # ./format_java.sh
6 | # ./format_javascript.sh
7 | ./format_python.sh
8 |
--------------------------------------------------------------------------------
/format_cmake.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | find . -type f -not -path "*/build/*" \( -name "CMakeLists.txt" -or -name "*.cmake" \) -exec cmake-format -i {} \+
3 |
--------------------------------------------------------------------------------
/format_cpp.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | find . -type f -not -path "*/build/*" \( -name "*.h" -or -name "*.cpp" -or -name "*.hpp" \) -exec clang-format -i -style=file {} \+
3 |
--------------------------------------------------------------------------------
/format_csharp.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | find . -type f -path "*/binding/*" -not -path "*/build/*" -name "*.cs" -exec clang-format -i -style=file {} \+
3 |
--------------------------------------------------------------------------------
/format_go.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | find . -type f -path "*/binding/*" -not -path "*/build/*" -name "*.go" -exec gofmt -w {} \+
3 |
--------------------------------------------------------------------------------
/format_java.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | find . -type f -path "*/binding/*" -not -path "*/build/*" -name "*.java" -exec clang-format -i -style=file {} \+
3 |
--------------------------------------------------------------------------------
/format_javascript.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | find . -type f -path "*/binding/*" -not -path "*/build/*" -name "*.js" -exec clang-format -i -style=file {} \+
3 |
--------------------------------------------------------------------------------
/format_python.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | find . -type f -path "*/binding/*" -not -path "*/build/*" -not -path "*/.venv/*" -name "*.py" -exec black --line-length 160 {} \+
3 |
--------------------------------------------------------------------------------
/include/ccapi_cpp/ccapi_event_handler.h:
--------------------------------------------------------------------------------
1 | #ifndef INCLUDE_CCAPI_CPP_CCAPI_EVENT_HANDLER_H_
2 | #define INCLUDE_CCAPI_CPP_CCAPI_EVENT_HANDLER_H_
3 | #include "ccapi_cpp/ccapi_event.h"
4 |
5 | namespace ccapi {
6 | class Session;
7 |
8 | /**
9 | * Defines the callback supplied by the application to process Events. Applications which use event driven programming supply instances of their own subclass of
10 | * this class to the Session to receive callbacks when an Event is available.
11 | */
12 | class EventHandler {
13 | public:
14 | virtual ~EventHandler() {}
15 |
16 | virtual bool processEvent(const Event& event, Session* sessionPtr) { return true; }
17 |
18 | // An implementation of processEvent should process the specified
19 | // 'event' which originates from the specified 'session' and
20 | // return true to indicate events should continue to be delivered
21 | // or false to terminate dispatching of events.
22 | //
23 | // If the application wishes to process the event further
24 | // after returning from the processEvents() call it must make
25 | // a copy of the Event to ensure the underlying data is not
26 | // freed.
27 | // Note: no exceptions are thrown
28 | };
29 | } /* namespace ccapi */
30 | #endif // INCLUDE_CCAPI_CPP_CCAPI_EVENT_HANDLER_H_
31 |
--------------------------------------------------------------------------------
/include/ccapi_cpp/ccapi_fix_connection.h:
--------------------------------------------------------------------------------
1 | #ifndef INCLUDE_CCAPI_CPP_CCAPI_FIX_CONNECTION_H_
2 | #define INCLUDE_CCAPI_CPP_CCAPI_FIX_CONNECTION_H_
3 | #include
4 |
5 | #include "ccapi_cpp/ccapi_logger.h"
6 | #include "ccapi_cpp/ccapi_subscription.h"
7 | namespace beast = boost::beast;
8 |
9 | namespace ccapi {
10 | /**
11 | * This class represents a TCP socket connection for the FIX API.
12 | */
13 | template
14 | class FixConnection {
15 | public:
16 | FixConnection(std::string host, std::string port, Subscription subscription, std::shared_ptr streamPtr)
17 | : host(host), port(port), subscription(subscription), streamPtr(streamPtr) {
18 | this->id = subscription.getCorrelationId();
19 | this->url = host + ":" + port;
20 | }
21 |
22 | std::string toString() const {
23 | std::ostringstream oss;
24 | oss << streamPtr;
25 | std::string output = "FixConnection [id = " + id + ", host = " + host + ", port = " + port + ", subscription = " + ccapi::toString(subscription) +
26 | ", status = " + statusToString(status) + ", streamPtr = " + oss.str() + "]";
27 | return output;
28 | }
29 | enum class Status {
30 | UNKNOWN,
31 | CONNECTING,
32 | OPEN,
33 | FAILED,
34 | CLOSING,
35 | CLOSED,
36 | };
37 |
38 | static std::string statusToString(Status status) {
39 | std::string output;
40 | switch (status) {
41 | case Status::UNKNOWN:
42 | output = "UNKNOWN";
43 | break;
44 | case Status::CONNECTING:
45 | output = "CONNECTING";
46 | break;
47 | case Status::OPEN:
48 | output = "OPEN";
49 | break;
50 | case Status::FAILED:
51 | output = "FAILED";
52 | break;
53 | case Status::CLOSING:
54 | output = "CLOSING";
55 | break;
56 | case Status::CLOSED:
57 | output = "CLOSED";
58 | break;
59 | default:
60 | CCAPI_LOGGER_FATAL(CCAPI_UNSUPPORTED_VALUE);
61 | }
62 | return output;
63 | }
64 |
65 | std::string id;
66 | std::string host;
67 | std::string port;
68 | std::string url;
69 | Subscription subscription;
70 | Status status{Status::UNKNOWN};
71 | std::shared_ptr streamPtr;
72 | };
73 | } /* namespace ccapi */
74 | #endif // INCLUDE_CCAPI_CPP_CCAPI_FIX_CONNECTION_H_
75 |
--------------------------------------------------------------------------------
/include/ccapi_cpp/ccapi_hmac.h:
--------------------------------------------------------------------------------
1 | #ifndef INCLUDE_CCAPI_CPP_CCAPI_HMAC_H_
2 | #define INCLUDE_CCAPI_CPP_CCAPI_HMAC_H_
3 |
4 | #include
5 | #include
6 | #include
7 |
8 | #include
9 | #include
10 |
11 | namespace ccapi {
12 | class Hmac {
13 | public:
14 | enum class ShaVersion {
15 | UNKNOWN,
16 | SHA1,
17 | SHA224,
18 | SHA256,
19 | SHA384,
20 | SHA512,
21 | };
22 |
23 | static std::string hmac(const ShaVersion shaVersion, const std::string& key, const std::string& msg, bool returnHex = false) {
24 | const EVP_MD* md = nullptr;
25 |
26 | switch (shaVersion) {
27 | case ShaVersion::SHA1:
28 | md = EVP_sha1();
29 | break;
30 | case ShaVersion::SHA224:
31 | md = EVP_sha224();
32 | break;
33 | case ShaVersion::SHA256:
34 | md = EVP_sha256();
35 | break;
36 | case ShaVersion::SHA384:
37 | md = EVP_sha384();
38 | break;
39 | case ShaVersion::SHA512:
40 | md = EVP_sha512();
41 | break;
42 | default:
43 | return ""; // Optionally throw or log unsupported algorithm
44 | }
45 |
46 | unsigned char hash[EVP_MAX_MD_SIZE];
47 | unsigned int len = 0;
48 |
49 | HMAC_CTX* hmac = HMAC_CTX_new();
50 | HMAC_Init_ex(hmac, key.data(), static_cast(key.size()), md, nullptr);
51 | HMAC_Update(hmac, reinterpret_cast(msg.data()), msg.size());
52 | HMAC_Final(hmac, hash, &len);
53 | HMAC_CTX_free(hmac);
54 |
55 | std::stringstream ss;
56 | if (returnHex) {
57 | ss << std::hex << std::setfill('0');
58 | for (unsigned int i = 0; i < len; ++i) {
59 | ss << std::setw(2) << static_cast(hash[i]);
60 | }
61 | } else {
62 | for (unsigned int i = 0; i < len; ++i) {
63 | ss << static_cast(hash[i]);
64 | }
65 | }
66 |
67 | return ss.str();
68 | }
69 | };
70 | } /* namespace ccapi */
71 | #endif // INCLUDE_CCAPI_CPP_CCAPI_HMAC_H_
72 |
--------------------------------------------------------------------------------
/include/ccapi_cpp/ccapi_http_connection.h:
--------------------------------------------------------------------------------
1 | #ifndef INCLUDE_CCAPI_CPP_CCAPI_HTTP_CONNECTION_H_
2 | #define INCLUDE_CCAPI_CPP_CCAPI_HTTP_CONNECTION_H_
3 | #include
4 |
5 | #include "ccapi_cpp/ccapi_logger.h"
6 | namespace beast = boost::beast;
7 |
8 | namespace ccapi {
9 | class HttpConnection {
10 | /**
11 | * This class represents a TCP socket connection for the REST API.
12 | */
13 | public:
14 | HttpConnection(std::string host, std::string port, std::shared_ptr> streamPtr)
15 | : host(host), port(port), streamPtr(streamPtr) {}
16 |
17 | std::string toString() const {
18 | std::ostringstream oss;
19 | oss << streamPtr;
20 | std::string output = "HttpConnection [host = " + host + ", port = " + port + ", streamPtr = " + oss.str() +
21 | ", lastReceiveDataTp = " + UtilTime::getISOTimestamp(lastReceiveDataTp) + "]";
22 | return output;
23 | }
24 |
25 | std::string host;
26 | std::string port;
27 | std::shared_ptr> streamPtr;
28 | TimePoint lastReceiveDataTp{std::chrono::seconds{0}};
29 | };
30 | } /* namespace ccapi */
31 | #endif // INCLUDE_CCAPI_CPP_CCAPI_HTTP_CONNECTION_H_
32 |
--------------------------------------------------------------------------------
/include/ccapi_cpp/ccapi_http_retry.h:
--------------------------------------------------------------------------------
1 | #ifndef INCLUDE_CCAPI_CPP_CCAPI_HTTP_RETRY_H_
2 | #define INCLUDE_CCAPI_CPP_CCAPI_HTTP_RETRY_H_
3 | #include
4 | #include
5 |
6 | namespace ccapi {
7 | /**
8 | * This class is used for retrying http requests for the REST API.
9 | */
10 | class HttpRetry {
11 | public:
12 | explicit HttpRetry(int numRetry = 0, int numRedirect = 0, std::string redirectUrlStr = "",
13 | std::shared_ptr> promisePtr = std::shared_ptr>(nullptr))
14 | : numRetry(numRetry), numRedirect(numRedirect), promisePtr(promisePtr) {}
15 |
16 | std::string toString() const {
17 | std::ostringstream oss;
18 | oss << promisePtr;
19 | std::string output =
20 | "HttpConnection [numRetry = " + ccapi::toString(numRetry) + ", numRedirect = " + ccapi::toString(numRedirect) + ", promisePtr = " + oss.str() + "]";
21 | return output;
22 | }
23 |
24 | int numRetry;
25 | int numRedirect;
26 | std::shared_ptr> promisePtr;
27 | };
28 |
29 | } /* namespace ccapi */
30 | #endif // INCLUDE_CCAPI_CPP_CCAPI_HTTP_RETRY_H_
31 |
--------------------------------------------------------------------------------
/include/ccapi_cpp/ccapi_jwt.h:
--------------------------------------------------------------------------------
1 | #ifndef INCLUDE_CCAPI_CPP_CCAPI_JWT_H_
2 | #define INCLUDE_CCAPI_CPP_CCAPI_JWT_H_
3 | #include "ccapi_cpp/ccapi_hmac.h"
4 | #include "ccapi_cpp/ccapi_logger.h"
5 | #include "ccapi_cpp/ccapi_macro.h"
6 | #include "ccapi_cpp/ccapi_util_private.h"
7 |
8 | namespace ccapi {
9 | /**
10 | * This class is used for handling jwt tokens.
11 | */
12 | class Jwt {
13 | public:
14 | static std::string generate(const Hmac::ShaVersion shaVersion, const std::string& secret, const std::string& payload) {
15 | std::string output;
16 | switch (shaVersion) {
17 | case Hmac::ShaVersion::SHA256:
18 | output += UtilAlgorithm::base64UrlEncode("{\"alg\":\"HS256\",\"typ\":\"JWT\"}");
19 | break;
20 | default:
21 | CCAPI_LOGGER_FATAL(CCAPI_UNSUPPORTED_VALUE);
22 | }
23 | output += ".";
24 | output += UtilAlgorithm::base64UrlEncode(payload);
25 | std::string signature = Hmac::hmac(shaVersion, secret, output);
26 | output += ".";
27 | output += UtilAlgorithm::base64UrlEncode(signature);
28 | return output;
29 | }
30 | };
31 | } // namespace ccapi
32 | #endif // INCLUDE_CCAPI_CPP_CCAPI_JWT_H_
33 |
--------------------------------------------------------------------------------
/include/ccapi_cpp/ccapi_util.h:
--------------------------------------------------------------------------------
1 | #ifndef INCLUDE_CCAPI_CPP_CCAPI_UTIL_H_
2 | #define INCLUDE_CCAPI_CPP_CCAPI_UTIL_H_
3 | #include
4 | #include
5 |
6 | namespace ccapi {
7 | typedef std::chrono::time_point TimePoint;
8 | } /* namespace ccapi */
9 | #endif // INCLUDE_CCAPI_CPP_CCAPI_UTIL_H_
10 |
--------------------------------------------------------------------------------
/include/ccapi_cpp/service/ccapi_execution_management_service_binance_us.h:
--------------------------------------------------------------------------------
1 | #ifndef INCLUDE_CCAPI_CPP_SERVICE_CCAPI_EXECUTION_MANAGEMENT_SERVICE_BINANCE_US_H_
2 | #define INCLUDE_CCAPI_CPP_SERVICE_CCAPI_EXECUTION_MANAGEMENT_SERVICE_BINANCE_US_H_
3 | #ifdef CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT
4 | #ifdef CCAPI_ENABLE_EXCHANGE_BINANCE_US
5 | #include "ccapi_cpp/service/ccapi_execution_management_service_binance_base.h"
6 |
7 | namespace ccapi {
8 | class ExecutionManagementServiceBinanceUs : public ExecutionManagementServiceBinanceBase {
9 | public:
10 | ExecutionManagementServiceBinanceUs(std::function*)> eventHandler, SessionOptions sessionOptions, SessionConfigs sessionConfigs,
11 | ServiceContextPtr serviceContextPtr)
12 | : ExecutionManagementServiceBinanceBase(eventHandler, sessionOptions, sessionConfigs, serviceContextPtr) {
13 | this->exchangeName = CCAPI_EXCHANGE_NAME_BINANCE_US;
14 | this->baseUrlWs = sessionConfigs.getUrlWebsocketBase().at(this->exchangeName) + "/ws";
15 | this->baseUrlRest = sessionConfigs.getUrlRestBase().at(this->exchangeName);
16 | this->setHostRestFromUrlRest(this->baseUrlRest);
17 | this->setHostWsFromUrlWs(this->baseUrlWs);
18 | this->apiKeyName = CCAPI_BINANCE_US_API_KEY;
19 | this->apiSecretName = CCAPI_BINANCE_US_API_SECRET;
20 | this->setupCredential({this->apiKeyName, this->apiSecretName});
21 | this->createOrderTarget = CCAPI_BINANCE_US_CREATE_ORDER_PATH;
22 | this->cancelOrderTarget = "/api/v3/order";
23 | this->getOrderTarget = "/api/v3/order";
24 | this->getOpenOrdersTarget = "/api/v3/openOrders";
25 | this->cancelOpenOrdersTarget = "/api/v3/openOrders";
26 | this->listenKeyTarget = CCAPI_BINANCE_US_LISTEN_KEY_PATH;
27 | this->getAccountBalancesTarget = "/api/v3/account";
28 | }
29 |
30 | virtual ~ExecutionManagementServiceBinanceUs() {}
31 | };
32 | } /* namespace ccapi */
33 | #endif
34 | #endif
35 | #endif // INCLUDE_CCAPI_CPP_SERVICE_CCAPI_EXECUTION_MANAGEMENT_SERVICE_BINANCE_US_H_
36 |
--------------------------------------------------------------------------------
/include/ccapi_cpp/service/ccapi_execution_management_service_ftx_us.h:
--------------------------------------------------------------------------------
1 | #ifndef INCLUDE_CCAPI_CPP_SERVICE_CCAPI_EXECUTION_MANAGEMENT_SERVICE_FTX_US_H_
2 | #define INCLUDE_CCAPI_CPP_SERVICE_CCAPI_EXECUTION_MANAGEMENT_SERVICE_FTX_US_H_
3 | #ifdef CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT
4 | #ifdef CCAPI_ENABLE_EXCHANGE_FTX_US
5 | #include "ccapi_cpp/service/ccapi_execution_management_service_ftx_base.h"
6 |
7 | namespace ccapi {
8 | class ExecutionManagementServiceFtxUs : public ExecutionManagementServiceFtxBase {
9 | public:
10 | ExecutionManagementServiceFtxUs(std::function*)> eventHandler, SessionOptions sessionOptions, SessionConfigs sessionConfigs,
11 | ServiceContextPtr serviceContextPtr)
12 | : ExecutionManagementServiceFtxBase(eventHandler, sessionOptions, sessionConfigs, serviceContextPtr) {
13 | this->exchangeName = CCAPI_EXCHANGE_NAME_FTX_US;
14 | this->baseUrlWs = sessionConfigs.getUrlWebsocketBase().at(this->exchangeName) + "/ws";
15 | this->baseUrlRest = sessionConfigs.getUrlRestBase().at(this->exchangeName);
16 | this->setHostRestFromUrlRest(this->baseUrlRest);
17 | this->setHostWsFromUrlWs(this->baseUrlWs);
18 | try {
19 | this->tcpResolverResultsRest = this->resolver.resolve(this->hostRest, this->portRest);
20 | } catch (const std::exception& e) {
21 | CCAPI_LOGGER_FATAL(std::string("e.what() = ") + e.what());
22 | }
23 |
24 | try {
25 | this->tcpResolverResultsWs = this->resolverWs.resolve(this->hostWs, this->portWs);
26 | } catch (const std::exception& e) {
27 | CCAPI_LOGGER_FATAL(std::string("e.what() = ") + e.what());
28 | }
29 |
30 | this->apiKeyName = CCAPI_FTX_US_API_KEY;
31 | this->apiSecretName = CCAPI_FTX_US_API_SECRET;
32 | this->apiSubaccountName = CCAPI_FTX_US_API_SUBACCOUNT;
33 | this->setupCredential({this->apiKeyName, this->apiSecretName, this->apiSubaccountName});
34 | this->ftx = "FTXUS";
35 | }
36 |
37 | virtual ~ExecutionManagementServiceFtxUs() {}
38 | };
39 | } /* namespace ccapi */
40 | #endif
41 | #endif
42 | #endif // INCLUDE_CCAPI_CPP_SERVICE_CCAPI_EXECUTION_MANAGEMENT_SERVICE_FTX_US_H_
43 |
--------------------------------------------------------------------------------
/include/ccapi_cpp/service/ccapi_execution_management_service_gateio.h:
--------------------------------------------------------------------------------
1 | #ifndef INCLUDE_CCAPI_CPP_SERVICE_CCAPI_EXECUTION_MANAGEMENT_SERVICE_GATEIO_H_
2 | #define INCLUDE_CCAPI_CPP_SERVICE_CCAPI_EXECUTION_MANAGEMENT_SERVICE_GATEIO_H_
3 | #ifdef CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT
4 | #ifdef CCAPI_ENABLE_EXCHANGE_GATEIO
5 | #include "ccapi_cpp/service/ccapi_execution_management_service_gateio_base.h"
6 |
7 | namespace ccapi {
8 | class ExecutionManagementServiceGateio : public ExecutionManagementServiceGateioBase {
9 | public:
10 | ExecutionManagementServiceGateio(std::function*)> eventHandler, SessionOptions sessionOptions, SessionConfigs sessionConfigs,
11 | ServiceContextPtr serviceContextPtr)
12 | : ExecutionManagementServiceGateioBase(eventHandler, sessionOptions, sessionConfigs, serviceContextPtr) {
13 | this->exchangeName = CCAPI_EXCHANGE_NAME_GATEIO;
14 | this->baseUrlWs = sessionConfigs.getUrlWebsocketBase().at(this->exchangeName) + "/ws/v4/";
15 | this->baseUrlRest = sessionConfigs.getUrlRestBase().at(this->exchangeName);
16 | this->setHostRestFromUrlRest(this->baseUrlRest);
17 | this->setHostWsFromUrlWs(this->baseUrlWs);
18 | this->apiKeyName = CCAPI_GATEIO_API_KEY;
19 | this->apiSecretName = CCAPI_GATEIO_API_SECRET;
20 | this->setupCredential({this->apiKeyName, this->apiSecretName});
21 | std::string prefix = "/api/v4";
22 | this->createOrderTarget = prefix + "/spot/orders";
23 | this->cancelOrderTarget = prefix + "/spot/orders/{order_id}";
24 | this->getOrderTarget = prefix + "/spot/orders/{order_id}";
25 | this->getOpenOrdersTarget = prefix + "/spot/orders";
26 | this->cancelOpenOrdersTarget = prefix + "/spot/orders";
27 | this->getAccountsTarget = prefix + "/spot/accounts";
28 | this->symbolName = "currency_pair";
29 | this->websocketChannelUserTrades = "spot.usertrades";
30 | this->websocketChannelOrders = "spot.orders";
31 | this->amountName = "amount";
32 | }
33 |
34 | virtual ~ExecutionManagementServiceGateio() {}
35 | };
36 | } /* namespace ccapi */
37 | #endif
38 | #endif
39 | #endif // INCLUDE_CCAPI_CPP_SERVICE_CCAPI_EXECUTION_MANAGEMENT_SERVICE_GATEIO_H_
40 |
--------------------------------------------------------------------------------
/include/ccapi_cpp/service/ccapi_execution_management_service_huobi_coin_swap.h:
--------------------------------------------------------------------------------
1 | #ifndef INCLUDE_CCAPI_CPP_SERVICE_CCAPI_EXECUTION_MANAGEMENT_SERVICE_HUOBI_COIN_SWAP_H_
2 | #define INCLUDE_CCAPI_CPP_SERVICE_CCAPI_EXECUTION_MANAGEMENT_SERVICE_HUOBI_COIN_SWAP_H_
3 | #ifdef CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT
4 | #ifdef CCAPI_ENABLE_EXCHANGE_HUOBI_COIN_SWAP
5 | #include "ccapi_cpp/service/ccapi_execution_management_service_huobi_derivatives_base.h"
6 |
7 | namespace ccapi {
8 | class ExecutionManagementServiceHuobiCoinSwap : public ExecutionManagementServiceHuobiDerivativesBase {
9 | public:
10 | ExecutionManagementServiceHuobiCoinSwap(std::function*)> eventHandler, SessionOptions sessionOptions, SessionConfigs sessionConfigs,
11 | ServiceContextPtr serviceContextPtr)
12 | : ExecutionManagementServiceHuobiDerivativesBase(eventHandler, sessionOptions, sessionConfigs, serviceContextPtr) {
13 | this->exchangeName = CCAPI_EXCHANGE_NAME_HUOBI_COIN_SWAP;
14 | this->baseUrlWs = sessionConfigs.getUrlWebsocketBase().at(this->exchangeName) + "/swap-notification";
15 | this->baseUrlRest = sessionConfigs.getUrlRestBase().at(this->exchangeName);
16 | this->setHostRestFromUrlRest(this->baseUrlRest);
17 | this->setHostWsFromUrlWs(this->baseUrlWs);
18 | this->apiKeyName = CCAPI_HUOBI_COIN_SWAP_API_KEY;
19 | this->apiSecretName = CCAPI_HUOBI_COIN_SWAP_API_SECRET;
20 | this->setupCredential({this->apiKeyName, this->apiSecretName});
21 | this->createOrderTarget = CCAPI_HUOBI_COIN_SWAP_CREATE_ORDER_PATH;
22 | this->cancelOrderTarget = CCAPI_HUOBI_COIN_SWAP_CANCEL_ORDER_PATH;
23 | this->getOrderTarget = CCAPI_HUOBI_COIN_SWAP_GET_ORDER_PATH;
24 | this->getOpenOrdersTarget = CCAPI_HUOBI_COIN_SWAP_GET_OPEN_ORDERS_PATH;
25 | this->getAccountBalancesTarget = CCAPI_HUOBI_COIN_SWAP_GET_ACCOUNT_BALANCES_PATH;
26 | this->getAccountPositionsTarget = CCAPI_HUOBI_COIN_SWAP_GET_ACCOUNT_POSITIONS_PATH;
27 | this->authenticationPath = "/swap-api/v1/swap_order";
28 | this->orderDataTopic = CCAPI_HUOBI_COIN_SWAP_SUBSCRIBE_ORDER_DATA_TOPIC;
29 | this->matchOrderDataTopic = CCAPI_HUOBI_COIN_SWAP_SUBSCRIBE_MATCH_ORDER_DATA_TOPIC;
30 | }
31 |
32 | virtual ~ExecutionManagementServiceHuobiCoinSwap() {}
33 | };
34 | } /* namespace ccapi */
35 | #endif
36 | #endif
37 | #endif // INCLUDE_CCAPI_CPP_SERVICE_CCAPI_EXECUTION_MANAGEMENT_SERVICE_HUOBI_COIN_SWAP_H_
38 |
--------------------------------------------------------------------------------
/include/ccapi_cpp/service/ccapi_execution_management_service_huobi_usdt_swap.h:
--------------------------------------------------------------------------------
1 | #ifndef INCLUDE_CCAPI_CPP_SERVICE_CCAPI_EXECUTION_MANAGEMENT_SERVICE_HUOBI_USDT_SWAP_H_
2 | #define INCLUDE_CCAPI_CPP_SERVICE_CCAPI_EXECUTION_MANAGEMENT_SERVICE_HUOBI_USDT_SWAP_H_
3 | #ifdef CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT
4 | #ifdef CCAPI_ENABLE_EXCHANGE_HUOBI_USDT_SWAP
5 | #include "ccapi_cpp/service/ccapi_execution_management_service_huobi_derivatives_base.h"
6 |
7 | namespace ccapi {
8 | class ExecutionManagementServiceHuobiUsdtSwap : public ExecutionManagementServiceHuobiDerivativesBase {
9 | public:
10 | ExecutionManagementServiceHuobiUsdtSwap(std::function*)> eventHandler, SessionOptions sessionOptions, SessionConfigs sessionConfigs,
11 | ServiceContextPtr serviceContextPtr)
12 | : ExecutionManagementServiceHuobiDerivativesBase(eventHandler, sessionOptions, sessionConfigs, serviceContextPtr) {
13 | this->exchangeName = CCAPI_EXCHANGE_NAME_HUOBI_USDT_SWAP;
14 | this->baseUrlWs = sessionConfigs.getUrlWebsocketBase().at(this->exchangeName) + "/linear-swap-notification";
15 | this->baseUrlRest = sessionConfigs.getUrlRestBase().at(this->exchangeName);
16 | this->setHostRestFromUrlRest(this->baseUrlRest);
17 | this->setHostWsFromUrlWs(this->baseUrlWs);
18 | this->apiKeyName = CCAPI_HUOBI_USDT_SWAP_API_KEY;
19 | this->apiSecretName = CCAPI_HUOBI_USDT_SWAP_API_SECRET;
20 | this->setupCredential({this->apiKeyName, this->apiSecretName});
21 | this->createOrderTarget = CCAPI_HUOBI_USDT_SWAP_CREATE_ORDER_PATH;
22 | this->cancelOrderTarget = CCAPI_HUOBI_USDT_SWAP_CANCEL_ORDER_PATH;
23 | this->getOrderTarget = CCAPI_HUOBI_USDT_SWAP_GET_ORDER_PATH;
24 | this->getOpenOrdersTarget = CCAPI_HUOBI_USDT_SWAP_GET_OPEN_ORDERS_PATH;
25 | this->getAccountBalancesTarget = CCAPI_HUOBI_USDT_SWAP_GET_ACCOUNT_BALANCES_PATH;
26 | this->getAccountPositionsTarget = CCAPI_HUOBI_USDT_SWAP_GET_ACCOUNT_POSITIONS_PATH;
27 | this->authenticationPath = "/linear-swap-notification";
28 | this->orderDataTopic = CCAPI_HUOBI_USDT_SWAP_SUBSCRIBE_ORDER_DATA_TOPIC;
29 | this->matchOrderDataTopic = CCAPI_HUOBI_USDT_SWAP_SUBSCRIBE_MATCH_ORDER_DATA_TOPIC;
30 | }
31 |
32 | virtual ~ExecutionManagementServiceHuobiUsdtSwap() {}
33 | };
34 | } /* namespace ccapi */
35 | #endif
36 | #endif
37 | #endif // INCLUDE_CCAPI_CPP_SERVICE_CCAPI_EXECUTION_MANAGEMENT_SERVICE_HUOBI_USDT_SWAP_H_
38 |
--------------------------------------------------------------------------------
/include/ccapi_cpp/service/ccapi_execution_management_service_whitebit.h:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crypto-chassis/ccapi/6b023a3709749a20528087f981c0a232d8ef0f9e/include/ccapi_cpp/service/ccapi_execution_management_service_whitebit.h
--------------------------------------------------------------------------------
/include/ccapi_cpp/service/ccapi_fix_service_ftx.h:
--------------------------------------------------------------------------------
1 | #ifndef INCLUDE_CCAPI_CPP_SERVICE_CCAPI_FIX_SERVICE_FTX_H_
2 | #define INCLUDE_CCAPI_CPP_SERVICE_CCAPI_FIX_SERVICE_FTX_H_
3 | #ifdef CCAPI_ENABLE_SERVICE_FIX
4 | #ifdef CCAPI_ENABLE_EXCHANGE_FTX
5 | #include "ccapi_cpp/ccapi_hmac.h"
6 | #include "ccapi_cpp/service/ccapi_fix_service_ftx_base.h"
7 |
8 | namespace ccapi {
9 | class FixServiceFtx : public FixServiceFtxBase {
10 | public:
11 | FixServiceFtx(std::function*)> eventHandler, SessionOptions sessionOptions, SessionConfigs sessionConfigs,
12 | ServiceContextPtr serviceContextPtr)
13 | : FixServiceFtxBase(eventHandler, sessionOptions, sessionConfigs, serviceContextPtr) {
14 | this->exchangeName = CCAPI_EXCHANGE_NAME_FTX;
15 | this->baseUrlFix = this->sessionConfigs.getUrlFixBase().at(this->exchangeName);
16 | this->setHostFixFromUrlFix(this->hostFix, this->portFix, this->baseUrlFix);
17 | this->apiKeyName = CCAPI_FTX_API_KEY;
18 | this->apiSecretName = CCAPI_FTX_API_SECRET;
19 | this->apiSubaccountName = CCAPI_FTX_API_SUBACCOUNT;
20 | this->setupCredential({this->apiKeyName, this->apiSecretName, this->apiSubaccountName});
21 | try {
22 | this->tcpResolverResultsFix = this->resolver.resolve(this->hostFix, this->portFix);
23 | } catch (const std::exception& e) {
24 | CCAPI_LOGGER_FATAL(std::string("e.what() = ") + e.what());
25 | }
26 | this->protocolVersion = CCAPI_FIX_PROTOCOL_VERSION_FTX;
27 | this->targetCompID = "FTX";
28 | }
29 |
30 | virtual ~FixServiceFtx() {}
31 | };
32 | } /* namespace ccapi */
33 | #endif
34 | #endif
35 | #endif // INCLUDE_CCAPI_CPP_SERVICE_CCAPI_FIX_SERVICE_FTX_H_
36 |
--------------------------------------------------------------------------------
/include/ccapi_cpp/service/ccapi_fix_service_ftx_us.h:
--------------------------------------------------------------------------------
1 | #ifndef INCLUDE_CCAPI_CPP_SERVICE_CCAPI_FIX_SERVICE_FTX_US_H_
2 | #define INCLUDE_CCAPI_CPP_SERVICE_CCAPI_FIX_SERVICE_FTX_US_H_
3 | #ifdef CCAPI_ENABLE_SERVICE_FIX
4 | #ifdef CCAPI_ENABLE_EXCHANGE_FTX_US
5 | #include "ccapi_cpp/ccapi_hmac.h"
6 | #include "ccapi_cpp/service/ccapi_fix_service_ftx_base.h"
7 |
8 | namespace ccapi {
9 | class FixServiceFtxUs : public FixServiceFtxBase {
10 | public:
11 | FixServiceFtxUs(std::function*)> eventHandler, SessionOptions sessionOptions, SessionConfigs sessionConfigs,
12 | ServiceContextPtr serviceContextPtr)
13 | : FixServiceFtxBase(eventHandler, sessionOptions, sessionConfigs, serviceContextPtr) {
14 | this->exchangeName = CCAPI_EXCHANGE_NAME_FTX_US;
15 | this->baseUrlFix = this->sessionConfigs.getUrlFixBase().at(this->exchangeName);
16 | this->setHostFixFromUrlFix(this->hostFix, this->portFix, this->baseUrlFix);
17 | this->apiKeyName = CCAPI_FTX_US_API_KEY;
18 | this->apiSecretName = CCAPI_FTX_US_API_SECRET;
19 | this->apiSubaccountName = CCAPI_FTX_US_API_SUBACCOUNT;
20 | this->setupCredential({this->apiKeyName, this->apiSecretName, this->apiSubaccountName});
21 | try {
22 | this->tcpResolverResultsFix = this->resolver.resolve(this->hostFix, this->portFix);
23 | } catch (const std::exception& e) {
24 | CCAPI_LOGGER_FATAL(std::string("e.what() = ") + e.what());
25 | }
26 | this->protocolVersion = CCAPI_FIX_PROTOCOL_VERSION_FTX_US;
27 | this->targetCompID = "FTXUS";
28 | }
29 |
30 | virtual ~FixServiceFtxUs() {}
31 | };
32 | } /* namespace ccapi */
33 | #endif
34 | #endif
35 | #endif // INCLUDE_CCAPI_CPP_SERVICE_CCAPI_FIX_SERVICE_FTX_US_H_
36 |
--------------------------------------------------------------------------------
/include/ccapi_cpp/service/ccapi_fix_service_gemini.h:
--------------------------------------------------------------------------------
1 | #ifndef INCLUDE_CCAPI_CPP_SERVICE_CCAPI_FIX_SERVICE_GEMINI_H_
2 | #define INCLUDE_CCAPI_CPP_SERVICE_CCAPI_FIX_SERVICE_GEMINI_H_
3 | #ifdef CCAPI_ENABLE_SERVICE_FIX
4 | #ifdef CCAPI_ENABLE_EXCHANGE_GEMINI
5 | #include "ccapi_cpp/service/ccapi_fix_service.h"
6 |
7 | namespace ccapi {
8 | class FixServiceGemini : public FixService {
9 | public:
10 | FixServiceGemini(std::function*)> eventHandler, SessionOptions sessionOptions, SessionConfigs sessionConfigs,
11 | ServiceContextPtr serviceContextPtr)
12 | : FixService(eventHandler, sessionOptions, sessionConfigs, serviceContextPtr) {
13 | this->exchangeName = CCAPI_EXCHANGE_NAME_GEMINI;
14 | this->hostFix = CCAPI_GEMINI_URL_FIX_HOST;
15 | this->portFix = CCAPI_GEMINI_URL_FIX_PORT;
16 | try {
17 | this->tcpResolverResultsFix = this->resolver.resolve(this->hostFix, this->portFix);
18 | } catch (const std::exception& e) {
19 | CCAPI_LOGGER_FATAL(std::string("e.what() = ") + e.what());
20 | }
21 | this->protocolVersion = CCAPI_FIX_PROTOCOL_VERSION_GEMINI;
22 | this->senderCompID = CCAPI_GEMINI_API_SENDER_COMP_ID;
23 | this->targetCompID = CCAPI_GEMINI_API_TARGET_COMP_ID;
24 | }
25 |
26 | virtual ~FixServiceGemini() {}
27 | #ifndef CCAPI_EXPOSE_INTERNAL
28 |
29 | protected:
30 | #endif
31 | virtual std::vector> createCommonParam(const std::string& connectionId, const std::string& nowFixTimeStr) {
32 | return {
33 | {hff::tag::SenderCompID, CCAPI_GEMINI_API_SENDER_COMP_ID},
34 | {hff::tag::TargetCompID, CCAPI_GEMINI_API_TARGET_COMP_ID},
35 | {hff::tag::MsgSeqNum, std::to_string(++this->sequenceSentByConnectionIdMap[connectionId])},
36 | {hff::tag::SendingTime, nowFixTimeStr},
37 | };
38 | }
39 |
40 | virtual std::vector> createLogonParam(const std::string& connectionId, const std::string& nowFixTimeStr,
41 | const std::map logonOptionMap = {}) {
42 | std::vector> param;
43 | auto msgType = "A";
44 | param.push_back({hff::tag::MsgType, msgType});
45 | param.push_back({hff::tag::ResetSeqNumFlag, "Y"});
46 | param.push_back({hff::tag::EncryptMethod, "0"});
47 | param.push_back({hff::tag::HeartBtInt, std::to_string(this->sessionOptions.heartbeatFixIntervalMilliseconds / 1000)});
48 | for (const auto& x : logonOptionMap) {
49 | param.push_back({x.first, x.second});
50 | }
51 | return param;
52 | }
53 | };
54 | } /* namespace ccapi */
55 | #endif
56 | #endif
57 | #endif // INCLUDE_CCAPI_CPP_SERVICE_CCAPI_FIX_SERVICE_GEMINI_H_
58 |
--------------------------------------------------------------------------------
/include/ccapi_cpp/service/ccapi_market_data_service_binance.h:
--------------------------------------------------------------------------------
1 | #ifndef INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_BINANCE_H_
2 | #define INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_BINANCE_H_
3 | #ifdef CCAPI_ENABLE_SERVICE_MARKET_DATA
4 | #ifdef CCAPI_ENABLE_EXCHANGE_BINANCE
5 | #include "ccapi_cpp/service/ccapi_market_data_service_binance_base.h"
6 |
7 | namespace ccapi {
8 | class MarketDataServiceBinance : public MarketDataServiceBinanceBase {
9 | public:
10 | MarketDataServiceBinance(std::function*)> eventHandler, SessionOptions sessionOptions, SessionConfigs sessionConfigs,
11 | ServiceContext* serviceContextPtr)
12 | : MarketDataServiceBinanceBase(eventHandler, sessionOptions, sessionConfigs, serviceContextPtr) {
13 | this->exchangeName = CCAPI_EXCHANGE_NAME_BINANCE;
14 | this->baseUrlWs = sessionConfigs.getUrlWebsocketBase().at(this->exchangeName) + "/stream";
15 | this->baseUrlRest = sessionConfigs.getUrlRestBase().at(this->exchangeName);
16 | this->setHostRestFromUrlRest(this->baseUrlRest);
17 | this->setHostWsFromUrlWs(this->baseUrlWs);
18 | this->apiKeyName = CCAPI_BINANCE_API_KEY;
19 | this->setupCredential({this->apiKeyName});
20 | this->getRecentTradesTarget = "/api/v3/trades";
21 | this->getHistoricalTradesTarget = "/api/v3/historicalTrades";
22 | this->getRecentAggTradesTarget = "/api/v3/aggTrades";
23 | this->getHistoricalAggTradesTarget = "/api/v3/aggTrades";
24 | this->getRecentCandlesticksTarget = "/api/v3/klines";
25 | this->getHistoricalCandlesticksTarget = "/api/v3/klines";
26 | this->getMarketDepthTarget = "/api/v3/depth";
27 | this->getServerTimeTarget = "/api/v3/time";
28 | this->getInstrumentTarget = "/api/v3/exchangeInfo";
29 | this->getInstrumentsTarget = "/api/v3/exchangeInfo";
30 | this->getBbosTarget = "/api/v3/ticker/bookTicker";
31 | }
32 |
33 | virtual ~MarketDataServiceBinance() {}
34 | };
35 | } /* namespace ccapi */
36 | #endif
37 | #endif
38 | #endif // INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_BINANCE_H_
39 |
--------------------------------------------------------------------------------
/include/ccapi_cpp/service/ccapi_market_data_service_binance_coin_futures.h:
--------------------------------------------------------------------------------
1 | #ifndef INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_BINANCE_COIN_FUTURES_H_
2 | #define INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_BINANCE_COIN_FUTURES_H_
3 | #ifdef CCAPI_ENABLE_SERVICE_MARKET_DATA
4 | #ifdef CCAPI_ENABLE_EXCHANGE_BINANCE_COIN_FUTURES
5 | #include "ccapi_cpp/service/ccapi_market_data_service_binance_derivatives_base.h"
6 |
7 | namespace ccapi {
8 | class MarketDataServiceBinanceCoinFutures : public MarketDataServiceBinanceDerivativesBase {
9 | public:
10 | MarketDataServiceBinanceCoinFutures(std::function*)> eventHandler, SessionOptions sessionOptions, SessionConfigs sessionConfigs,
11 | ServiceContext* serviceContextPtr)
12 | : MarketDataServiceBinanceDerivativesBase(eventHandler, sessionOptions, sessionConfigs, serviceContextPtr) {
13 | this->exchangeName = CCAPI_EXCHANGE_NAME_BINANCE_COIN_FUTURES;
14 | this->baseUrlWs = sessionConfigs.getUrlWebsocketBase().at(this->exchangeName) + "/stream";
15 | this->baseUrlRest = sessionConfigs.getUrlRestBase().at(this->exchangeName);
16 | this->setHostRestFromUrlRest(this->baseUrlRest);
17 | this->setHostWsFromUrlWs(this->baseUrlWs);
18 | this->apiKeyName = CCAPI_BINANCE_COIN_FUTURES_API_KEY;
19 | this->setupCredential({this->apiKeyName});
20 | this->getRecentTradesTarget = "/dapi/v1/trades";
21 | this->getHistoricalTradesTarget = "/dapi/v1/historicalTrades";
22 | this->getRecentAggTradesTarget = "/dapi/v1/aggTrades";
23 | this->getHistoricalAggTradesTarget = "/dapi/v1/aggTrades";
24 | this->getRecentCandlesticksTarget = "/dapi/v1/klines";
25 | this->getHistoricalCandlesticksTarget = "/dapi/v1/klines";
26 | this->getMarketDepthTarget = "/dapi/v1/depth";
27 | this->getServerTimeTarget = "/dapi/v1/time";
28 | this->getInstrumentTarget = "/dapi/v1/exchangeInfo";
29 | this->getInstrumentsTarget = "/dapi/v1/exchangeInfo";
30 | this->getBbosTarget = "/dapi/v1/ticker/bookTicker";
31 | }
32 |
33 | virtual ~MarketDataServiceBinanceCoinFutures() {}
34 | };
35 | } /* namespace ccapi */
36 | #endif
37 | #endif
38 | #endif // INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_BINANCE_COIN_FUTURES_H_
39 |
--------------------------------------------------------------------------------
/include/ccapi_cpp/service/ccapi_market_data_service_binance_us.h:
--------------------------------------------------------------------------------
1 | #ifndef INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_BINANCE_US_H_
2 | #define INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_BINANCE_US_H_
3 | #ifdef CCAPI_ENABLE_SERVICE_MARKET_DATA
4 | #ifdef CCAPI_ENABLE_EXCHANGE_BINANCE_US
5 | #include "ccapi_cpp/service/ccapi_market_data_service_binance_base.h"
6 |
7 | namespace ccapi {
8 | class MarketDataServiceBinanceUs : public MarketDataServiceBinanceBase {
9 | public:
10 | MarketDataServiceBinanceUs(std::function*)> eventHandler, SessionOptions sessionOptions, SessionConfigs sessionConfigs,
11 | ServiceContext* serviceContextPtr)
12 | : MarketDataServiceBinanceBase(eventHandler, sessionOptions, sessionConfigs, serviceContextPtr) {
13 | this->exchangeName = CCAPI_EXCHANGE_NAME_BINANCE_US;
14 | this->baseUrlWs = sessionConfigs.getUrlWebsocketBase().at(this->exchangeName) + "/stream";
15 | this->baseUrlRest = sessionConfigs.getUrlRestBase().at(this->exchangeName);
16 | this->setHostRestFromUrlRest(this->baseUrlRest);
17 | this->setHostWsFromUrlWs(this->baseUrlWs);
18 | this->apiKeyName = CCAPI_BINANCE_US_API_KEY;
19 | this->setupCredential({this->apiKeyName});
20 | this->getRecentTradesTarget = "/api/v3/trades";
21 | this->getHistoricalTradesTarget = "/api/v3/historicalTrades";
22 | this->getRecentAggTradesTarget = "/api/v3/aggTrades";
23 | this->getHistoricalAggTradesTarget = "/api/v3/aggTrades";
24 | this->getRecentCandlesticksTarget = "/api/v3/klines";
25 | this->getHistoricalCandlesticksTarget = "/api/v3/klines";
26 | this->getMarketDepthTarget = "/api/v3/depth";
27 | this->getServerTimeTarget = "/api/v3/time";
28 | this->getInstrumentTarget = "/api/v3/exchangeInfo";
29 | this->getInstrumentsTarget = "/api/v3/exchangeInfo";
30 | this->getBbosTarget = "/api/v3/ticker/bookTicker";
31 | }
32 |
33 | virtual ~MarketDataServiceBinanceUs() {}
34 | };
35 | } /* namespace ccapi */
36 | #endif
37 | #endif
38 | #endif // INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_BINANCE_US_H_
39 |
--------------------------------------------------------------------------------
/include/ccapi_cpp/service/ccapi_market_data_service_binance_usds_futures.h:
--------------------------------------------------------------------------------
1 | #ifndef INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_BINANCE_USDS_FUTURES_H_
2 | #define INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_BINANCE_USDS_FUTURES_H_
3 | #ifdef CCAPI_ENABLE_SERVICE_MARKET_DATA
4 | #ifdef CCAPI_ENABLE_EXCHANGE_BINANCE_USDS_FUTURES
5 | #include "ccapi_cpp/service/ccapi_market_data_service_binance_derivatives_base.h"
6 |
7 | namespace ccapi {
8 | class MarketDataServiceBinanceUsdsFutures : public MarketDataServiceBinanceDerivativesBase {
9 | public:
10 | MarketDataServiceBinanceUsdsFutures(std::function*)> eventHandler, SessionOptions sessionOptions, SessionConfigs sessionConfigs,
11 | ServiceContext* serviceContextPtr)
12 | : MarketDataServiceBinanceDerivativesBase(eventHandler, sessionOptions, sessionConfigs, serviceContextPtr) {
13 | this->exchangeName = CCAPI_EXCHANGE_NAME_BINANCE_USDS_FUTURES;
14 | this->baseUrlWs = sessionConfigs.getUrlWebsocketBase().at(this->exchangeName) + "/stream";
15 | this->baseUrlRest = sessionConfigs.getUrlRestBase().at(this->exchangeName);
16 | this->setHostRestFromUrlRest(this->baseUrlRest);
17 | this->setHostWsFromUrlWs(this->baseUrlWs);
18 | this->apiKeyName = CCAPI_BINANCE_USDS_FUTURES_API_KEY;
19 | this->setupCredential({this->apiKeyName});
20 | this->getRecentTradesTarget = "/fapi/v1/trades";
21 | this->getHistoricalTradesTarget = "/fapi/v1/historicalTrades";
22 | this->getRecentAggTradesTarget = "/fapi/v1/aggTrades";
23 | this->getHistoricalAggTradesTarget = "/fapi/v1/aggTrades";
24 | this->getRecentCandlesticksTarget = "/fapi/v1/klines";
25 | this->getHistoricalCandlesticksTarget = "/fapi/v1/klines";
26 | this->getMarketDepthTarget = "/fapi/v1/depth";
27 | this->getServerTimeTarget = "/fapi/v1/time";
28 | this->getInstrumentTarget = "/fapi/v1/exchangeInfo";
29 | this->getInstrumentsTarget = "/fapi/v1/exchangeInfo";
30 | this->getBbosTarget = "/fapi/v1/ticker/bookTicker";
31 | }
32 |
33 | virtual ~MarketDataServiceBinanceUsdsFutures() {}
34 | };
35 | } /* namespace ccapi */
36 | #endif
37 | #endif
38 | #endif // INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_BINANCE_USDS_FUTURES_H_
39 |
--------------------------------------------------------------------------------
/include/ccapi_cpp/service/ccapi_market_data_service_bitget.h:
--------------------------------------------------------------------------------
1 | #ifndef INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_BITGET_H_
2 | #define INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_BITGET_H_
3 | #ifdef CCAPI_ENABLE_SERVICE_MARKET_DATA
4 | #ifdef CCAPI_ENABLE_EXCHANGE_BITGET
5 | #include "ccapi_cpp/service/ccapi_market_data_service_bitget_base.h"
6 |
7 | namespace ccapi {
8 | class MarketDataServiceBitget : public MarketDataServiceBitgetBase {
9 | public:
10 | MarketDataServiceBitget(std::function*)> eventHandler, SessionOptions sessionOptions, SessionConfigs sessionConfigs,
11 | ServiceContext* serviceContextPtr)
12 | : MarketDataServiceBitgetBase(eventHandler, sessionOptions, sessionConfigs, serviceContextPtr) {
13 | this->exchangeName = CCAPI_EXCHANGE_NAME_BITGET;
14 | this->baseUrlWs = sessionConfigs.getUrlWebsocketBase().at(this->exchangeName) + "/v2/ws/public";
15 | this->baseUrlRest = sessionConfigs.getUrlRestBase().at(this->exchangeName);
16 | this->setHostRestFromUrlRest(this->baseUrlRest);
17 | this->setHostWsFromUrlWs(this->baseUrlWs);
18 | this->getRecentTradesTarget = "/api/v2/spot/market/fills";
19 | this->getHistoricalTradesTarget = "/api/v2/spot/market/fills-history";
20 | this->getInstrumentTarget = "/api/v2/spot/public/symbols";
21 | this->getInstrumentsTarget = "/api/v2/spot/public/symbols";
22 | this->getRecentCandlesticksTarget = "/api/v2/spot/market/candles";
23 | this->getHistoricalCandlesticksTarget = "/api/v2/spot/market/candles";
24 | this->getBboTarget = "/api/v2/spot/market/tickers";
25 | this->getBbosTarget = "/api/v2/spot/market/tickers";
26 | }
27 |
28 | virtual ~MarketDataServiceBitget() {}
29 | };
30 | } /* namespace ccapi */
31 | #endif
32 | #endif
33 | #endif // INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_BITGET_H_
34 |
--------------------------------------------------------------------------------
/include/ccapi_cpp/service/ccapi_market_data_service_bitget_futures.h:
--------------------------------------------------------------------------------
1 | #ifndef INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_BITGET_FUTURES_H_
2 | #define INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_BITGET_FUTURES_H_
3 | #ifdef CCAPI_ENABLE_SERVICE_MARKET_DATA
4 | #ifdef CCAPI_ENABLE_EXCHANGE_BITGET_FUTURES
5 | #include "ccapi_cpp/service/ccapi_market_data_service_bitget_base.h"
6 |
7 | namespace ccapi {
8 | class MarketDataServiceBitgetFutures : public MarketDataServiceBitgetBase {
9 | public:
10 | MarketDataServiceBitgetFutures(std::function*)> eventHandler, SessionOptions sessionOptions, SessionConfigs sessionConfigs,
11 | ServiceContext* serviceContextPtr)
12 | : MarketDataServiceBitgetBase(eventHandler, sessionOptions, sessionConfigs, serviceContextPtr) {
13 | this->exchangeName = CCAPI_EXCHANGE_NAME_BITGET_FUTURES;
14 | this->baseUrlWs = sessionConfigs.getUrlWebsocketBase().at(this->exchangeName) + "/v2/ws/public";
15 | this->baseUrlRest = sessionConfigs.getUrlRestBase().at(this->exchangeName);
16 | this->setHostRestFromUrlRest(this->baseUrlRest);
17 | this->setHostWsFromUrlWs(this->baseUrlWs);
18 | this->getRecentTradesTarget = "/api/v2/mix/market/fills";
19 | this->getHistoricalTradesTarget = "/api/v2/mix/market/fills-history";
20 | this->getInstrumentTarget = "/api/v2/mix/market/contracts";
21 | this->getInstrumentsTarget = "/api/v2/mix/market/contracts";
22 | this->getRecentCandlesticksTarget = "/api/v2/mix/market/candles";
23 | this->getHistoricalCandlesticksTarget = "/api/v2/mix/market/candles";
24 | this->getBboTarget = "/api/v2/mix/market/tickers";
25 | this->getBbosTarget = "/api/v2/mix/market/ticker";
26 | this->isDerivatives = true;
27 | }
28 |
29 | virtual ~MarketDataServiceBitgetFutures() {}
30 | };
31 | } /* namespace ccapi */
32 | #endif
33 | #endif
34 | #endif // INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_BITGET_FUTURES_H_
35 |
--------------------------------------------------------------------------------
/include/ccapi_cpp/service/ccapi_market_data_service_ftx.h:
--------------------------------------------------------------------------------
1 | #ifndef INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_FTX_H_
2 | #define INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_FTX_H_
3 | #ifdef CCAPI_ENABLE_SERVICE_MARKET_DATA
4 | #ifdef CCAPI_ENABLE_EXCHANGE_FTX
5 | #include "ccapi_cpp/service/ccapi_market_data_service_ftx_base.h"
6 |
7 | namespace ccapi {
8 | class MarketDataServiceFtx : public MarketDataServiceFtxBase {
9 | public:
10 | MarketDataServiceFtx(std::function*)> eventHandler, SessionOptions sessionOptions, SessionConfigs sessionConfigs,
11 | ServiceContext* serviceContextPtr)
12 | : MarketDataServiceFtxBase(eventHandler, sessionOptions, sessionConfigs, serviceContextPtr) {
13 | this->exchangeName = CCAPI_EXCHANGE_NAME_FTX;
14 | this->baseUrlWs = sessionConfigs.getUrlWebsocketBase().at(this->exchangeName) + "/ws";
15 | this->baseUrlRest = sessionConfigs.getUrlRestBase().at(this->exchangeName);
16 | this->setHostRestFromUrlRest(this->baseUrlRest);
17 | this->setHostWsFromUrlWs(this->baseUrlWs);
18 | try {
19 | this->tcpResolverResultsRest = this->resolver.resolve(this->hostRest, this->portRest);
20 | } catch (const std::exception& e) {
21 | CCAPI_LOGGER_FATAL(std::string("e.what() = ") + e.what());
22 | }
23 |
24 | try {
25 | this->tcpResolverResultsWs = this->resolverWs.resolve(this->hostWs, this->portWs);
26 | } catch (const std::exception& e) {
27 | CCAPI_LOGGER_FATAL(std::string("e.what() = ") + e.what());
28 | }
29 | }
30 |
31 | virtual ~MarketDataServiceFtx() {}
32 | };
33 | } /* namespace ccapi */
34 | #endif
35 | #endif
36 | #endif // INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_FTX_H_
37 |
--------------------------------------------------------------------------------
/include/ccapi_cpp/service/ccapi_market_data_service_ftx_us.h:
--------------------------------------------------------------------------------
1 | #ifndef INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_FTX_US_H_
2 | #define INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_FTX_US_H_
3 | #ifdef CCAPI_ENABLE_SERVICE_MARKET_DATA
4 | #ifdef CCAPI_ENABLE_EXCHANGE_FTX_US
5 | #include "ccapi_cpp/service/ccapi_market_data_service_ftx_base.h"
6 |
7 | namespace ccapi {
8 | class MarketDataServiceFtxUs : public MarketDataServiceFtxBase {
9 | public:
10 | MarketDataServiceFtxUs(std::function*)> eventHandler, SessionOptions sessionOptions, SessionConfigs sessionConfigs,
11 | ServiceContext* serviceContextPtr)
12 | : MarketDataServiceFtxBase(eventHandler, sessionOptions, sessionConfigs, serviceContextPtr) {
13 | this->exchangeName = CCAPI_EXCHANGE_NAME_FTX_US;
14 | this->baseUrlWs = sessionConfigs.getUrlWebsocketBase().at(this->exchangeName) + "/ws";
15 | this->baseUrlRest = sessionConfigs.getUrlRestBase().at(this->exchangeName);
16 | this->setHostRestFromUrlRest(this->baseUrlRest);
17 | this->setHostWsFromUrlWs(this->baseUrlWs);
18 | try {
19 | this->tcpResolverResultsRest = this->resolver.resolve(this->hostRest, this->portRest);
20 | } catch (const std::exception& e) {
21 | CCAPI_LOGGER_FATAL(std::string("e.what() = ") + e.what());
22 | }
23 |
24 | try {
25 | this->tcpResolverResultsWs = this->resolverWs.resolve(this->hostWs, this->portWs);
26 | } catch (const std::exception& e) {
27 | CCAPI_LOGGER_FATAL(std::string("e.what() = ") + e.what());
28 | }
29 | }
30 |
31 | virtual ~MarketDataServiceFtxUs() {}
32 | };
33 | } /* namespace ccapi */
34 | #endif
35 | #endif
36 | #endif // INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_FTX_US_H_
37 |
--------------------------------------------------------------------------------
/include/ccapi_cpp/service/ccapi_market_data_service_huobi_coin_swap.h:
--------------------------------------------------------------------------------
1 | #ifndef INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_HUOBI_COIN_SWAP_H_
2 | #define INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_HUOBI_COIN_SWAP_H_
3 | #ifdef CCAPI_ENABLE_SERVICE_MARKET_DATA
4 | #ifdef CCAPI_ENABLE_EXCHANGE_HUOBI_COIN_SWAP
5 | #include "ccapi_cpp/service/ccapi_market_data_service_huobi_derivatives_base.h"
6 |
7 | namespace ccapi {
8 | class MarketDataServiceHuobiCoinSwap : public MarketDataServiceHuobiDerivativesBase {
9 | public:
10 | MarketDataServiceHuobiCoinSwap(std::function*)> eventHandler, SessionOptions sessionOptions, SessionConfigs sessionConfigs,
11 | ServiceContext* serviceContextPtr)
12 | : MarketDataServiceHuobiDerivativesBase(eventHandler, sessionOptions, sessionConfigs, serviceContextPtr) {
13 | this->exchangeName = CCAPI_EXCHANGE_NAME_HUOBI_COIN_SWAP;
14 | this->baseUrlWs = sessionConfigs.getUrlWebsocketBase().at(this->exchangeName) + "/swap-ws";
15 | this->baseUrlRest = sessionConfigs.getUrlRestBase().at(this->exchangeName);
16 | this->setHostRestFromUrlRest(this->baseUrlRest);
17 | this->setHostWsFromUrlWs(this->baseUrlWs);
18 | this->getRecentTradesTarget = CCAPI_HUOBI_COIN_SWAP_GET_RECENT_TRADES_PATH;
19 | this->getInstrumentTarget = "/swap-api/v1/swap_contract_info";
20 | this->getInstrumentsTarget = "/swap-api/v1/swap_contract_info";
21 | }
22 |
23 | virtual ~MarketDataServiceHuobiCoinSwap() {}
24 | };
25 | } /* namespace ccapi */
26 | #endif
27 | #endif
28 | #endif // INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_HUOBI_COIN_SWAP_H_
29 |
--------------------------------------------------------------------------------
/include/ccapi_cpp/service/ccapi_market_data_service_huobi_usdt_swap.h:
--------------------------------------------------------------------------------
1 | #ifndef INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_HUOBI_USDT_SWAP_H_
2 | #define INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_HUOBI_USDT_SWAP_H_
3 | #ifdef CCAPI_ENABLE_SERVICE_MARKET_DATA
4 | #ifdef CCAPI_ENABLE_EXCHANGE_HUOBI_USDT_SWAP
5 | #include "ccapi_cpp/service/ccapi_market_data_service_huobi_derivatives_base.h"
6 |
7 | namespace ccapi {
8 | class MarketDataServiceHuobiUsdtSwap : public MarketDataServiceHuobiDerivativesBase {
9 | public:
10 | MarketDataServiceHuobiUsdtSwap(std::function*)> eventHandler, SessionOptions sessionOptions, SessionConfigs sessionConfigs,
11 | ServiceContext* serviceContextPtr)
12 | : MarketDataServiceHuobiDerivativesBase(eventHandler, sessionOptions, sessionConfigs, serviceContextPtr) {
13 | this->exchangeName = CCAPI_EXCHANGE_NAME_HUOBI_USDT_SWAP;
14 | this->baseUrlWs = sessionConfigs.getUrlWebsocketBase().at(this->exchangeName) + "/linear-swap-ws";
15 | this->baseUrlRest = sessionConfigs.getUrlRestBase().at(this->exchangeName);
16 | this->setHostRestFromUrlRest(this->baseUrlRest);
17 | this->setHostWsFromUrlWs(this->baseUrlWs);
18 | this->getRecentTradesTarget = CCAPI_HUOBI_USDT_SWAP_GET_RECENT_TRADES_PATH;
19 | this->getInstrumentTarget = "/linear-swap-api/v1/swap_contract_info";
20 | this->getInstrumentsTarget = "/linear-swap-api/v1/swap_contract_info";
21 | }
22 |
23 | virtual ~MarketDataServiceHuobiUsdtSwap() {}
24 | };
25 | } /* namespace ccapi */
26 | #endif
27 | #endif
28 | #endif // INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_HUOBI_USDT_SWAP_H_
29 |
--------------------------------------------------------------------------------
/include/ccapi_cpp/service/ccapi_market_data_service_kucoin_futures.h:
--------------------------------------------------------------------------------
1 | #ifndef INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_KUCOIN_FUTURES_H_
2 | #define INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_KUCOIN_FUTURES_H_
3 | #ifdef CCAPI_ENABLE_SERVICE_MARKET_DATA
4 | #if defined(CCAPI_ENABLE_EXCHANGE_KUCOIN_FUTURES)
5 | #include "ccapi_cpp/service/ccapi_market_data_service_kucoin_base.h"
6 |
7 | namespace ccapi {
8 | class MarketDataServiceKucoinFutures : public MarketDataServiceKucoinBase {
9 | public:
10 | MarketDataServiceKucoinFutures(std::function*)> eventHandler, SessionOptions sessionOptions, SessionConfigs sessionConfigs,
11 | ServiceContext* serviceContextPtr)
12 | : MarketDataServiceKucoinBase(eventHandler, sessionOptions, sessionConfigs, serviceContextPtr) {
13 | this->exchangeName = CCAPI_EXCHANGE_NAME_KUCOIN_FUTURES;
14 | this->baseUrlWs = sessionConfigs.getUrlWebsocketBase().at(this->exchangeName);
15 | this->baseUrlRest = sessionConfigs.getUrlRestBase().at(this->exchangeName);
16 | this->setHostRestFromUrlRest(this->baseUrlRest);
17 | this->getRecentTradesTarget = "/api/v1/trade/history";
18 | this->getHistoricalTradesTarget = "/api/v1/trade/history";
19 | this->getRecentCandlesticksTarget = "/api/v1/kline/query";
20 | this->getHistoricalCandlesticksTarget = "/api/v1/kline/query";
21 | this->getMarketDepthTarget = "/api/v1/level2/depth";
22 | this->getInstrumentTarget = "/api/v1/contracts/active";
23 | this->getInstrumentsTarget = "/api/v1/contracts/active";
24 | this->isDerivatives = true;
25 | this->channelMarketTicker = CCAPI_WEBSOCKET_KUCOIN_FUTURES_CHANNEL_MARKET_TICKER;
26 | this->channelMarketLevel2Depth5 = CCAPI_WEBSOCKET_KUCOIN_FUTURES_CHANNEL_MARKET_LEVEL2DEPTH5;
27 | this->channelMarketLevel2Depth50 = CCAPI_WEBSOCKET_KUCOIN_FUTURES_CHANNEL_MARKET_LEVEL2DEPTH50;
28 | this->tickerSubject = "tickerV2";
29 | this->tickerBestBidPriceKey = "bestBidPrice";
30 | this->tickerBestAskPriceKey = "bestAskPrice";
31 | this->matchSubject = "match";
32 | this->level2Subject = "level2";
33 | this->recentTradesTimeKey = "ts";
34 | }
35 |
36 | virtual ~MarketDataServiceKucoinFutures() {}
37 | #ifndef CCAPI_EXPOSE_INTERNAL
38 |
39 | private:
40 | #endif
41 | void extractInstrumentInfo(Element& element, const rj::Value& x) override {
42 | element.insert(CCAPI_INSTRUMENT, x["symbol"].GetString());
43 | element.insert(CCAPI_UNDERLYING_SYMBOL, x["indexSymbol"].GetString());
44 | element.insert(CCAPI_ORDER_PRICE_INCREMENT, x["tickSize"].GetString());
45 | element.insert(CCAPI_ORDER_QUANTITY_INCREMENT, x["lotSize"].GetString());
46 | element.insert(CCAPI_CONTRACT_MULTIPLIER, x["multiplier"].GetString());
47 | }
48 | };
49 | } /* namespace ccapi */
50 | #endif
51 | #endif
52 | #endif // INCLUDE_CCAPI_CPP_SERVICE_CCAPI_MARKET_DATA_SERVICE_KUCOIN_FUTURES_H_
53 |
--------------------------------------------------------------------------------
/test/ccapi_logger.cpp:
--------------------------------------------------------------------------------
1 | #include "ccapi_cpp/ccapi_logger.h"
2 |
3 | #include
4 |
5 | namespace ccapi {
6 | Logger* Logger::logger = nullptr;
7 | }
8 |
--------------------------------------------------------------------------------
/test/test_build/test.cpp:
--------------------------------------------------------------------------------
1 | #include "ccapi_cpp/ccapi_session.h"
2 | using ::ccapi::Session;
3 |
4 | int main(int argc, char **argv) {
5 | Session session;
6 | return EXIT_SUCCESS;
7 | }
8 |
--------------------------------------------------------------------------------
/test/test_unit/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME unit_test)
2 | project(${NAME})
3 |
4 | # Download and unpack googletest at configure time
5 | configure_file(CMakeLists.txt.in googletest-download/CMakeLists.txt)
6 | execute_process(
7 | COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
8 | RESULT_VARIABLE result
9 | WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googletest-download)
10 | if(result)
11 | message(FATAL_ERROR "CMake step for googletest failed: ${result}")
12 | endif()
13 | execute_process(
14 | COMMAND ${CMAKE_COMMAND} --build .
15 | RESULT_VARIABLE result
16 | WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googletest-download)
17 | if(result)
18 | message(FATAL_ERROR "Build step for googletest failed: ${result}")
19 | endif()
20 |
21 | # Prevent overriding the parent project's compiler/linker settings on Windows
22 | set(gtest_force_shared_crt
23 | ON
24 | CACHE BOOL "" FORCE)
25 |
26 | # Add googletest directly to our build. This defines the gtest and gtest_main
27 | # targets.
28 | add_subdirectory(${CMAKE_CURRENT_BINARY_DIR}/googletest-src
29 | ${CMAKE_CURRENT_BINARY_DIR}/googletest-build EXCLUDE_FROM_ALL)
30 |
31 | # The gtest/gtest_main targets carry header search path dependencies
32 | # automatically when using CMake 2.8.11 or later. Otherwise we have to add them
33 | # here ourselves.
34 | if(CMAKE_VERSION VERSION_LESS 2.8.11)
35 | include_directories("${gtest_SOURCE_DIR}/include")
36 | endif()
37 | # find_package(GTest REQUIRED CONFIG)
38 | include(GoogleTest)
39 | include_directories(${CCAPI_PROJECT_DIR}/test/test_unit/include)
40 | include_directories(${CCAPI_PROJECT_DIR}/app/include)
41 | link_libraries(gtest_main gmock_main)
42 | add_compile_definitions(CCAPI_EXPOSE_INTERNAL)
43 | add_subdirectory(src/common)
44 | add_subdirectory(src/market_data/generic)
45 | add_subdirectory(src/execution_management/binance_usds_futures)
46 | # add_subdirectory(src/execution_management/binance_us)
47 | # add_subdirectory(src/execution_management/bitmex)
48 | add_subdirectory(src/execution_management/coinbase)
49 | # add_subdirectory(src/execution_management/erisx)
50 | add_subdirectory(src/execution_management/gateio)
51 | # add_subdirectory(src/execution_management/gemini)
52 | # add_subdirectory(src/execution_management/huobi)
53 | # add_subdirectory(src/execution_management/huobi_usdt_swap)
54 | # add_subdirectory(src/execution_management/huobi_coin_swap)
55 | # add_subdirectory(src/execution_management/kucoin)
56 | # add_subdirectory(src/execution_management/kraken)
57 | # add_subdirectory(src/execution_management/kraken_futures)
58 | add_subdirectory(src/execution_management/okx)
59 |
--------------------------------------------------------------------------------
/test/test_unit/CMakeLists.txt.in:
--------------------------------------------------------------------------------
1 | project(googletest-download)
2 | cmake_minimum_required(VERSION 3.14)
3 | include(ExternalProject)
4 | ExternalProject_Add(googletest
5 | GIT_REPOSITORY https://github.com/google/googletest.git
6 | GIT_TAG v1.17.0
7 | SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/googletest-src"
8 | BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/googletest-build"
9 | CONFIGURE_COMMAND ""
10 | BUILD_COMMAND ""
11 | INSTALL_COMMAND ""
12 | TEST_COMMAND ""
13 | )
14 |
--------------------------------------------------------------------------------
/test/test_unit/include/ccapi_cpp/ccapi_test_execution_management_helper.h:
--------------------------------------------------------------------------------
1 | #ifndef TEST_TEST_UNIT_INCLUDE_CCAPI_CPP_CCAPI_TEST_EXECUTION_MANAGEMENT_HELPER_H_
2 | #define TEST_TEST_UNIT_INCLUDE_CCAPI_CPP_CCAPI_TEST_EXECUTION_MANAGEMENT_HELPER_H_
3 | #include "ccapi_cpp/ccapi_message.h"
4 |
5 | namespace ccapi {
6 | inline void verifyCorrelationId(const std::vector& messageList, const std::string& correlationId) {
7 | for (const auto& message : messageList) {
8 | auto correlationIdList = message.getCorrelationIdList();
9 | EXPECT_EQ(correlationIdList.size(), 1);
10 | EXPECT_EQ(correlationIdList.at(0), correlationId);
11 | }
12 | }
13 | } /* namespace ccapi */
14 | #endif // TEST_TEST_UNIT_INCLUDE_CCAPI_CPP_CCAPI_TEST_EXECUTION_MANAGEMENT_HELPER_H_
15 |
--------------------------------------------------------------------------------
/test/test_unit/include/ccapi_cpp/ccapi_test_market_data_helper.h:
--------------------------------------------------------------------------------
1 | #ifndef TEST_TEST_UNIT_INCLUDE_CCAPI_CPP_CCAPI_TEST_MARKET_DATA_HELPER_H_
2 | #define TEST_TEST_UNIT_INCLUDE_CCAPI_CPP_CCAPI_TEST_MARKET_DATA_HELPER_H_
3 | #include "ccapi_cpp/service/ccapi_market_data_service.h"
4 |
5 | namespace ccapi {
6 | class MarketDataServiceGeneric final : public MarketDataService {
7 | public:
8 | MarketDataServiceGeneric(std::function*)> wsEventHandler, SessionOptions sessionOptions, SessionConfigs sessionConfigs,
9 | ServiceContext* serviceContextPtr)
10 | : MarketDataService(wsEventHandler, sessionOptions, sessionConfigs, serviceContextPtr) {}
11 |
12 | using MarketDataService::updateOrderBook;
13 | };
14 | } /* namespace ccapi */
15 | #endif // TEST_TEST_UNIT_INCLUDE_CCAPI_CPP_CCAPI_TEST_MARKET_DATA_HELPER_H_
16 |
--------------------------------------------------------------------------------
/test/test_unit/src/common/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | add_subdirectory(decimal)
2 | add_subdirectory(event)
3 | add_subdirectory(hash)
4 | add_subdirectory(hmac)
5 | add_subdirectory(jwt)
6 | add_subdirectory(subscription)
7 | add_subdirectory(url)
8 | add_subdirectory(util)
9 |
--------------------------------------------------------------------------------
/test/test_unit/src/common/decimal/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME decimal)
2 | project(${NAME})
3 | add_executable(${NAME} ${SOURCE_LOGGER} ccapi_decimal_test.cpp)
4 | if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP)
5 | add_dependencies(${NAME} boost rapidjson)
6 | endif()
7 | gtest_discover_tests(${NAME})
8 |
--------------------------------------------------------------------------------
/test/test_unit/src/common/event/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME event)
2 | project(${NAME})
3 | add_executable(${NAME} ${SOURCE_LOGGER} ccapi_event_test.cpp)
4 | if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP)
5 | add_dependencies(${NAME} boost rapidjson)
6 | endif()
7 | gtest_discover_tests(${NAME})
8 |
--------------------------------------------------------------------------------
/test/test_unit/src/common/event/ccapi_event_test.cpp:
--------------------------------------------------------------------------------
1 | #include "ccapi_cpp/ccapi_event.h"
2 |
3 | #include "gmock/gmock.h"
4 | #include "gtest/gtest.h"
5 | using ::testing::ElementsAre;
6 |
7 | namespace ccapi {
8 | TEST(EventTest, addMessagesZeroAddZero) {
9 | Event e;
10 | std::vector ml;
11 | e.addMessages(ml);
12 | EXPECT_TRUE(e.getMessageList().empty());
13 | }
14 |
15 | TEST(EventTest, addMessagesZeroAddSome) {
16 | Event e;
17 | std::vector ml;
18 | ml.push_back(Message());
19 | e.addMessages(ml);
20 | EXPECT_EQ(e.getMessageList().size(), 1);
21 | }
22 |
23 | TEST(EventTest, addMessagesSomeAddZero) {
24 | Event e;
25 | e.setMessageList({Message()});
26 | std::vector ml;
27 | e.addMessages(ml);
28 | EXPECT_EQ(e.getMessageList().size(), 1);
29 | }
30 |
31 | TEST(EventTest, addMessagesSomeAddSome) {
32 | Message m1;
33 | m1.setType(Message::Type::SESSION_CONNECTION_UP);
34 | Message m2;
35 | m2.setType(Message::Type::MARKET_DATA_EVENTS_TRADE);
36 | Event e;
37 | e.setMessageList({m1});
38 | std::vector ml{m2};
39 | e.addMessages(ml);
40 | EXPECT_EQ(e.getMessageList().size(), 2);
41 | EXPECT_EQ(e.getMessageList().at(0).getType(), Message::Type::SESSION_CONNECTION_UP);
42 | EXPECT_EQ(e.getMessageList().at(1).getType(), Message::Type::MARKET_DATA_EVENTS_TRADE);
43 | }
44 |
45 | } /* namespace ccapi */
46 |
--------------------------------------------------------------------------------
/test/test_unit/src/common/hash/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME common)
2 | project(${NAME})
3 | add_executable(${NAME} ${SOURCE_LOGGER} ccapi_hash_test.cpp)
4 | if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP)
5 | add_dependencies(${NAME} boost rapidjson)
6 | endif()
7 | gtest_discover_tests(${NAME})
8 |
--------------------------------------------------------------------------------
/test/test_unit/src/common/hash/ccapi_hash_test.cpp:
--------------------------------------------------------------------------------
1 | #include "ccapi_cpp/ccapi_util_private.h"
2 | #include "gtest/gtest.h"
3 |
4 | namespace ccapi {
5 | TEST(HashTest, hash256ReturnHex) {
6 | auto result = UtilAlgorithm::computeHash(UtilAlgorithm::ShaVersion::SHA256,
7 | "1633827062021004nonce=1633827062021004&price=20000&volume=1&type=buy&ordertype=limit&pair=XXBTZUSD", true);
8 | EXPECT_EQ(result, "a6c7b5f88e73b93aa18bc09a3096aa3fa614d68594128a3f06adeaade351ea9f");
9 | }
10 |
11 | TEST(HashTest, hash256) {
12 | auto result = UtilAlgorithm::stringToHex(UtilAlgorithm::computeHash(
13 | UtilAlgorithm::ShaVersion::SHA256, "1633827062021004nonce=1633827062021004&price=20000&volume=1&type=buy&ordertype=limit&pair=XXBTZUSD", false));
14 | EXPECT_EQ(result, "a6c7b5f88e73b93aa18bc09a3096aa3fa614d68594128a3f06adeaade351ea9f");
15 | }
16 |
17 | TEST(HashTest, hash512ReturnHex) {
18 | auto result =
19 | UtilAlgorithm::computeHash(UtilAlgorithm::ShaVersion::SHA512, R"({"price":"20000","amount":"0.001","side":"buy","currency_pair":"BTC_USDT"})", true);
20 | EXPECT_EQ(result, "c6fa1c13d45b685ac529fa3b629a9ba74b20512985c2e82b41a426e15c78fbcd4bb11fc3af6e1dfc3f2c2cc96bbecd2504614034089af407819da1c7e145dd59");
21 | }
22 |
23 | TEST(HashTest, hash512) {
24 | auto result = UtilAlgorithm::stringToHex(
25 | UtilAlgorithm::computeHash(UtilAlgorithm::ShaVersion::SHA512, R"({"price":"20000","amount":"0.001","side":"buy","currency_pair":"BTC_USDT"})", false));
26 | EXPECT_EQ(result, "c6fa1c13d45b685ac529fa3b629a9ba74b20512985c2e82b41a426e15c78fbcd4bb11fc3af6e1dfc3f2c2cc96bbecd2504614034089af407819da1c7e145dd59");
27 | }
28 | } /* namespace ccapi */
29 |
--------------------------------------------------------------------------------
/test/test_unit/src/common/hmac/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME hmac)
2 | project(${NAME})
3 | add_executable(${NAME} ${SOURCE_LOGGER} ccapi_hmac_test.cpp)
4 | if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP)
5 | add_dependencies(${NAME} boost rapidjson)
6 | endif()
7 | add_executable(${NAME}_hmac_openssl ${SOURCE_LOGGER} ccapi_hmac_test.cpp)
8 | if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP)
9 | add_dependencies(${NAME}_hmac_openssl boost rapidjson)
10 | endif()
11 | target_compile_definitions(${NAME}_hmac_openssl PRIVATE CCAPI_SHA_USE_OPENSSL)
12 | gtest_discover_tests(${NAME})
13 | gtest_discover_tests(${NAME}_hmac_openssl)
14 |
--------------------------------------------------------------------------------
/test/test_unit/src/common/hmac/ccapi_hmac_test.cpp:
--------------------------------------------------------------------------------
1 | #include "ccapi_cpp/ccapi_hmac.h"
2 |
3 | #include "ccapi_cpp/ccapi_util_private.h"
4 | #include "gtest/gtest.h"
5 |
6 | namespace ccapi {
7 | TEST(HmacTest, hmac256ReturnHex) {
8 | auto result = Hmac::hmac(Hmac::ShaVersion::SHA256, "NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j",
9 | "symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000×tamp=1499827319559", true);
10 | EXPECT_EQ(result, "c8db56825ae71d6d79447849e617115f4a920fa2acdcab2b053c4b2838bd6b71");
11 | }
12 |
13 | TEST(HmacTest, hmac256) {
14 | auto result = UtilAlgorithm::base64Encode(Hmac::hmac(
15 | Hmac::ShaVersion::SHA256, UtilAlgorithm::base64Decode("+xT7GWTDRHi09EZEhkOC8S7ktzngKtoT1ZoZ6QclGURlq3ePfUd7kLQzK4+P54685NEqYDaIerYj9cuYFILOhQ=="),
16 | "1610078918POST/orders{\"size\": \"0.00005\", \"price\": \"20000\", \"side\": \"buy\", \"product_id\": \"BTC-USD\"}", false));
17 | EXPECT_EQ(result, "oh4uOQrCJXLUV1rmcnQvL6BTdqdcE5MYu0Q7osUH3ug=");
18 | }
19 | } /* namespace ccapi */
20 |
--------------------------------------------------------------------------------
/test/test_unit/src/common/jwt/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME jwt)
2 | project(${NAME})
3 | add_executable(${NAME} ${SOURCE_LOGGER} ccapi_jwt_test.cpp)
4 | if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP)
5 | add_dependencies(${NAME} boost rapidjson)
6 | endif()
7 | gtest_discover_tests(${NAME})
8 |
--------------------------------------------------------------------------------
/test/test_unit/src/common/jwt/ccapi_jwt_test.cpp:
--------------------------------------------------------------------------------
1 | #include "ccapi_cpp/ccapi_jwt.h"
2 |
3 | #include "gtest/gtest.h"
4 |
5 | namespace ccapi {
6 | TEST(JwtTest, generate) {
7 | auto result = Jwt::generate(Hmac::ShaVersion::SHA256, "your-256-bit-secret", "{\"sub\":\"1234567890\",\"name\":\"John Doe\",\"iat\":1516239022}");
8 | EXPECT_EQ(result,
9 | "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ."
10 | "SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c");
11 | }
12 | } /* namespace ccapi */
13 |
--------------------------------------------------------------------------------
/test/test_unit/src/common/subscription/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME subscription)
2 | project(${NAME})
3 | add_executable(${NAME} ${SOURCE_LOGGER} ccapi_subscription_test.cpp)
4 | if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP)
5 | add_dependencies(${NAME} boost rapidjson)
6 | endif()
7 | gtest_discover_tests(${NAME})
8 |
--------------------------------------------------------------------------------
/test/test_unit/src/common/subscription/ccapi_subscription_test.cpp:
--------------------------------------------------------------------------------
1 | #include "ccapi_cpp/ccapi_subscription.h"
2 |
3 | #include "gtest/gtest.h"
4 |
5 | namespace ccapi {
6 | TEST(SubscriptionTest, marketDepth) {
7 | Subscription subscription("", "", CCAPI_MARKET_DEPTH);
8 | EXPECT_EQ(subscription.getServiceName(), CCAPI_MARKET_DATA);
9 | }
10 |
11 | TEST(SubscriptionTest, trade) {
12 | Subscription subscription("", "", CCAPI_TRADE);
13 | EXPECT_EQ(subscription.getServiceName(), CCAPI_MARKET_DATA);
14 | }
15 |
16 | TEST(SubscriptionTest, privateTrade) {
17 | Subscription subscription("", "", CCAPI_EM_PRIVATE_TRADE);
18 | EXPECT_EQ(subscription.getServiceName(), CCAPI_EXECUTION_MANAGEMENT);
19 | }
20 |
21 | TEST(SubscriptionTest, orderUpdate) {
22 | Subscription subscription("", "", CCAPI_EM_ORDER_UPDATE);
23 | EXPECT_EQ(subscription.getServiceName(), CCAPI_EXECUTION_MANAGEMENT);
24 | }
25 | } /* namespace ccapi */
26 |
--------------------------------------------------------------------------------
/test/test_unit/src/common/url/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME url)
2 | project(${NAME})
3 | add_executable(${NAME} ${SOURCE_LOGGER} ccapi_url_test.cpp)
4 | if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP)
5 | add_dependencies(${NAME} boost rapidjson)
6 | endif()
7 | gtest_discover_tests(${NAME})
8 |
--------------------------------------------------------------------------------
/test/test_unit/src/common/url/ccapi_url_test.cpp:
--------------------------------------------------------------------------------
1 | #include "ccapi_cpp/ccapi_url.h"
2 |
3 | #include "gtest/gtest.h"
4 |
5 | namespace ccapi {
6 | TEST(UrlTest, urlEncode) {
7 | auto result = Url::urlEncode("12!@&34?=");
8 | EXPECT_EQ(result, "12%21%40%2634%3F%3D");
9 | }
10 |
11 | TEST(UrlTest, urlDecode) {
12 | auto result = Url::urlDecode("12%21%40%2634%3F%3D");
13 | EXPECT_EQ(result, "12!@&34?=");
14 | }
15 | } /* namespace ccapi */
16 |
--------------------------------------------------------------------------------
/test/test_unit/src/common/util/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME util)
2 | project(${NAME})
3 | add_executable(${NAME} ${SOURCE_LOGGER} ccapi_util_test.cpp)
4 | if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP)
5 | add_dependencies(${NAME} boost rapidjson)
6 | endif()
7 | gtest_discover_tests(${NAME})
8 |
--------------------------------------------------------------------------------
/test/test_unit/src/execution_management/binance_us/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME execution_management_binance_us)
2 | project(${NAME})
3 | add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT)
4 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_BINANCE_US)
5 | add_executable(${NAME} ${SOURCE_LOGGER} test.cpp)
6 | if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP)
7 | add_dependencies(${NAME} boost rapidjson)
8 | endif()
9 | gtest_discover_tests(${NAME})
10 |
--------------------------------------------------------------------------------
/test/test_unit/src/execution_management/binance_usds_futures/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME execution_management_binance_usds_futures)
2 | project(${NAME})
3 | add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT)
4 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_BINANCE_USDS_FUTURES)
5 | add_executable(${NAME} ${SOURCE_LOGGER} test.cpp)
6 | if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP)
7 | add_dependencies(${NAME} boost rapidjson)
8 | endif()
9 | gtest_discover_tests(${NAME})
10 |
--------------------------------------------------------------------------------
/test/test_unit/src/execution_management/bitmex/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME execution_management_bitmex)
2 | project(${NAME})
3 | add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT)
4 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_BITMEX)
5 | add_executable(${NAME} ${SOURCE_LOGGER} test.cpp)
6 | if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP)
7 | add_dependencies(${NAME} boost rapidjson)
8 | endif()
9 | gtest_discover_tests(${NAME})
10 |
--------------------------------------------------------------------------------
/test/test_unit/src/execution_management/coinbase/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME execution_management_coinbase)
2 | project(${NAME})
3 | add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT)
4 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_COINBASE)
5 | add_executable(${NAME} ${SOURCE_LOGGER} test.cpp)
6 | if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP)
7 | add_dependencies(${NAME} boost rapidjson)
8 | endif()
9 | gtest_discover_tests(${NAME})
10 |
--------------------------------------------------------------------------------
/test/test_unit/src/execution_management/erisx/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME execution_management_erisx)
2 | project(${NAME})
3 | add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT)
4 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_ERISX)
5 | add_executable(${NAME} ${SOURCE_LOGGER} test.cpp)
6 | if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP)
7 | add_dependencies(${NAME} boost rapidjson)
8 | endif()
9 | gtest_discover_tests(${NAME})
10 |
--------------------------------------------------------------------------------
/test/test_unit/src/execution_management/gateio/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME execution_management_gateio)
2 | project(${NAME})
3 | add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT)
4 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_GATEIO)
5 | add_executable(${NAME} ${SOURCE_LOGGER} test.cpp)
6 | if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP)
7 | add_dependencies(${NAME} boost rapidjson)
8 | endif()
9 | gtest_discover_tests(${NAME})
10 |
--------------------------------------------------------------------------------
/test/test_unit/src/execution_management/gemini/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME execution_management_gemini)
2 | project(${NAME})
3 | add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT)
4 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_GEMINI)
5 | add_executable(${NAME} ${SOURCE_LOGGER} test.cpp)
6 | if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP)
7 | add_dependencies(${NAME} boost rapidjson)
8 | endif()
9 | gtest_discover_tests(${NAME})
10 |
--------------------------------------------------------------------------------
/test/test_unit/src/execution_management/huobi/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME execution_management_huobi)
2 | project(${NAME})
3 | add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT)
4 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_HUOBI)
5 | add_executable(${NAME} ${SOURCE_LOGGER} test.cpp)
6 | if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP)
7 | add_dependencies(${NAME} boost rapidjson)
8 | endif()
9 | gtest_discover_tests(${NAME})
10 |
--------------------------------------------------------------------------------
/test/test_unit/src/execution_management/huobi_coin_swap/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME execution_management_huobi_coin_swap)
2 | project(${NAME})
3 | find_package(ZLIB)
4 | add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT)
5 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_HUOBI_COIN_SWAP)
6 | add_executable(${NAME} ${SOURCE_LOGGER} test.cpp)
7 | if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP)
8 | add_dependencies(${NAME} boost rapidjson)
9 | endif()
10 | target_link_libraries(${NAME} PRIVATE ZLIB::ZLIB)
11 | gtest_discover_tests(${NAME})
12 |
--------------------------------------------------------------------------------
/test/test_unit/src/execution_management/huobi_usdt_swap/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME execution_management_huobi_usdt_swap)
2 | project(${NAME})
3 | find_package(ZLIB)
4 | add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT)
5 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_HUOBI_USDT_SWAP)
6 | add_executable(${NAME} ${SOURCE_LOGGER} test.cpp)
7 | if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP)
8 | add_dependencies(${NAME} boost rapidjson)
9 | endif()
10 | target_link_libraries(${NAME} PRIVATE ZLIB::ZLIB)
11 | gtest_discover_tests(${NAME})
12 |
--------------------------------------------------------------------------------
/test/test_unit/src/execution_management/kraken/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME execution_management_kraken)
2 | project(${NAME})
3 | add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT)
4 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_KRAKEN)
5 | add_executable(${NAME} ${SOURCE_LOGGER} test.cpp)
6 | if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP)
7 | add_dependencies(${NAME} boost rapidjson)
8 | endif()
9 | gtest_discover_tests(${NAME})
10 |
--------------------------------------------------------------------------------
/test/test_unit/src/execution_management/kraken_futures/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME execution_management_kraken_futures)
2 | project(${NAME})
3 | add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT)
4 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_KRAKEN_FUTURES)
5 | add_executable(${NAME} ${SOURCE_LOGGER} test.cpp)
6 | if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP)
7 | add_dependencies(${NAME} boost rapidjson)
8 | endif()
9 | gtest_discover_tests(${NAME})
10 |
--------------------------------------------------------------------------------
/test/test_unit/src/execution_management/kucoin/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME execution_management_kucoin)
2 | project(${NAME})
3 | add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT)
4 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_KUCOIN)
5 | add_executable(${NAME} ${SOURCE_LOGGER} test.cpp)
6 | if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP)
7 | add_dependencies(${NAME} boost rapidjson)
8 | endif()
9 | gtest_discover_tests(${NAME})
10 |
--------------------------------------------------------------------------------
/test/test_unit/src/execution_management/okx/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME execution_management_okx)
2 | project(${NAME})
3 | add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT)
4 | add_compile_definitions(CCAPI_ENABLE_EXCHANGE_OKX)
5 | add_executable(${NAME} ${SOURCE_LOGGER} test.cpp)
6 | if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP)
7 | add_dependencies(${NAME} boost rapidjson)
8 | endif()
9 | gtest_discover_tests(${NAME})
10 |
--------------------------------------------------------------------------------
/test/test_unit/src/market_data/generic/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | set(NAME market_data_generic)
2 | project(${NAME})
3 | add_compile_definitions(CCAPI_ENABLE_SERVICE_MARKET_DATA)
4 | add_executable(${NAME} ${SOURCE_LOGGER} test.cpp)
5 | if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP)
6 | add_dependencies(${NAME} boost rapidjson)
7 | endif()
8 | gtest_discover_tests(${NAME})
9 |
--------------------------------------------------------------------------------
/test/test_unit/src/market_data/generic/test.cpp:
--------------------------------------------------------------------------------
1 | #ifdef CCAPI_ENABLE_SERVICE_MARKET_DATA
2 | #include "ccapi_cpp/ccapi_test_market_data_helper.h"
3 | #include "ccapi_cpp/service/ccapi_market_data_service.h"
4 | #include "gmock/gmock.h"
5 | #include "gtest/gtest.h"
6 | using ::testing::ElementsAre;
7 | using ::testing::Pair;
8 |
9 | namespace ccapi {
10 | class MarketDataServiceTest : public ::testing::Test {
11 | public:
12 | typedef Service::ServiceContextPtr ServiceContextPtr;
13 |
14 | void SetUp() override {
15 | this->service = std::make_shared([](Event&, Queue*) {}, SessionOptions(), SessionConfigs(), &this->serviceContext);
16 | }
17 |
18 | ServiceContext serviceContext;
19 | std::shared_ptr service{nullptr};
20 | };
21 |
22 | TEST_F(MarketDataServiceTest, updateOrderBookInsert) {
23 | std::map snapshot;
24 | Decimal p("1");
25 | auto pc = p;
26 | std::string s("2");
27 | auto sc = s;
28 | this->service->updateOrderBook(snapshot, p, s);
29 | EXPECT_THAT(snapshot, ElementsAre(Pair(pc, sc)));
30 | }
31 |
32 | TEST_F(MarketDataServiceTest, updateOrderBookUpdate) {
33 | std::map snapshot{
34 | {Decimal("1"), std::string("2")},
35 | };
36 | Decimal p("1");
37 | auto pc = p;
38 | std::string s("3");
39 | auto sc = s;
40 | this->service->updateOrderBook(snapshot, p, s);
41 | EXPECT_THAT(snapshot, ElementsAre(Pair(pc, sc)));
42 | }
43 |
44 | TEST_F(MarketDataServiceTest, updateOrderBookDelete) {
45 | std::map snapshot{
46 | {Decimal("1"), std::string("2")},
47 | };
48 | Decimal price("1");
49 | std::string size("0");
50 | this->service->updateOrderBook(snapshot, price, size);
51 | EXPECT_TRUE(snapshot.empty());
52 | }
53 |
54 | TEST_F(MarketDataServiceTest, updateOrderBookNoInsert) {
55 | std::map snapshot;
56 | Decimal price("1");
57 | std::string size("0");
58 | this->service->updateOrderBook(snapshot, price, size);
59 | EXPECT_TRUE(snapshot.empty());
60 | }
61 | } /* namespace ccapi */
62 | #endif
63 |
--------------------------------------------------------------------------------