├── .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 | --------------------------------------------------------------------------------