Trading Essentials Quickstart
Learn how to leverage the crypto trading API to automate and streamline trading across multiple exchanges.
Trading Essentials: Quickstart
Introduction
In this tutorial, you'll learn how to leverage our crypto trading API to automate and streamline your trading across multiple exchanges. Discover how to connect your accounts, execute trades, and efficiently manage your portfolio with just a few clicks.
With our solution, you gain the power to control trades on various exchanges using just one API.
Background
The EMS Trading API lets you manage multiple trading accounts on different exchanges all in one place, making trading easier with combined and consistent data.
It gives you up-to-date market info, past data, and options to use it through the cloud or on your systems.
Perfect for traders, big companies, and experts like developers and analysts, this API is fast, efficient, and reliable, providing a complete trading solution with easy access to unique insights and information.
On the Agenda
- Obtain a Free API Key: Secure your gateway to multi-exchange trading with a free API key from our site.
- Check available exchanges: Verify the list of supported exchanges via
EMS API - Connect your Exchanges: Quickly integrate your accounts with exchanges like
BITMEXandKRAKEN. - Execute BUY on KRAKEN: Check your balance, initiate the
BUYorder, and confirm the status of the order - Execute SELL on KRAKEN: Initiate
SELLorder and check the order status report
Getting started
To execute the EMS Trading API, you'll need a Free API Key from our website.
Check available exchanges
To access a list of supported exchanges that can be connected via the EMS API, execute the following:
import requests
url = "https://ems-mgmt.coinapi.io/v1/exchanges"
payload={}
headers = {
'Accept': 'application/json',
'X-CoinAPI-Key': '73034021-THIS-IS-SAMPLE-COINAPI-KEY'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)Here's a snippet extracted from the server's reply:
[
{
"exchange_id": "BITMEX",
"location_id": "aws-eu-west-1-prd",
"required_parameters": [
"PrivateApiKey",
"PublicApiKey"
]
},
{
"exchange_id": "COINBASE",
"location_id": "aws-us-east-1-prd",
"required_parameters": [
"PassPhrase",
"PrivateApiKey",
"PublicApiKey"
]
},
{
"exchange_id": "GEMINI",
"location_id": "aws-us-east-1-prd",
"required_parameters": [
"PrivateApiKey",
"PublicApiKey"
]
},
{
"exchange_id": "KRAKEN",
"location_id": "aws-us-west-2-prd",
"required_parameters": [
"PrivateApiKey",
"PublicApiKey"
]
}
]
// other exchanges and their parameters...[!NOTE] To access the full list of supported exchanges, you can execute the endpoint https://ems-mgmt.coinapi.io/v1/exchanges. Above, we only showcase a partial list as an example.
Connect your Exchanges
To begin trading on cryptocurrency exchanges, you'll need to connect your accounts. Below are examples of integrating with two popular exchanges:
[!NOTE] While the examples in this quickstart provided are focused on integrating with
BITMEXandKRAKEN, the process is quite similar for various exchanges.
BITMEX
BITMEX stands as a premier cryptocurrency exchange, offering a robust platform for traders and investors worldwide.
Obtain Public key
To begin trading on BITMEX, you'll need to obtain your public and private keys from BITMEX.
Connect your account
After acquiring keys, the initial step includes sharing your exchange keys through the account creation process for the designated exchange.
import requests
import json
url = "https://ems-mgmt.coinapi.io/v1/accounts"
payload = {
"exchange_id": "BITMEX/JOHN",
"parameters": [
{
"key": "PublicApiKey",
"value": "73034021-THIS-IS-SAMPLE-PUBLIC-KEY-FROM-BITMEX"
},
{
"key": "PrivateApiKey",
"value": "73034021-THIS-IS-SAMPLE-PRIVATE-KEY-FROM-BITMEX"
}
]
}
headers = {
"X-CoinAPI-Key": "73034021-THIS-IS-SAMPLE-COINAPI-KEY",
"Content-Type": "application/json"
}
# Convert payload to JSON string
json_payload = json.dumps(payload)
# Make the request
response = requests.post(url, data=json_payload, headers=headers)
# Print the response
print("Response Code:", response.status_code)Once the update is successful, you'll receive an HTTP status code of 200.
KRAKEN
Obtain Public key
To begin trading on KRAKEN, you'll need to obtain your public and private keys from KRAKEN.
Connect your account
After acquiring keys, the initial step includes sharing your exchange keys through the account creation process for the designated exchange.
import requests
import json
url = "https://ems-mgmt.coinapi.io/v1/accounts"
payload = {
"exchange_id": "KRAKEN/JOHN",
"parameters": [
{
"key": "PublicApiKey",
"value": "73034021-THIS-IS-SAMPLE-PUBLIC-KEY-FROM-KRAKEN"
},
{
"key": "PrivateApiKey",
"value": "73034021-THIS-IS-SAMPLE-PRIVATE-KEY-FROM-KRAKEN"
}
]
}
headers = {
"X-CoinAPI-Key": "73034021-THIS-IS-SAMPLE-COINAPI-KEY",
"Content-Type": "application/json"
}
# Convert payload to JSON string
json_payload = json.dumps(payload)
# Make the request
response = requests.post(url, data=json_payload, headers=headers)
# Print the response
print("Response Code:", response.status_code)Get the list of Connected Exchanges
To check which accounts have been created on our side, execute the following code:
import requests
import json
url = "https://ems-mgmt.coinapi.io/v1/accounts"
headers = {
"X-CoinAPI-Key": "73034021-THIS-IS-SAMPLE-COINAPI-KEY"
}
# Make the request
response = requests.get(url, headers=headers)
if response.status_code == 200:
accounts_json = response.json()
print(json.dumps(accounts_json, indent=4))
else:
print("Error:", response.status_code)Here's an example response, listing all accounts created with your API KEY:
[
{
"exchange_id": "BITMEX/JOHN",
"parameters": [
{
"key": "PublicApiKey",
"value": "73034021-THIS-IS-SAMPLE-PUBLIC-KEY-FROM-BITMEX"
},
{
"key": "PrivateApiKey",
"value": "73034021-THIS-IS-SAMPLE-PRIVATE-KEY-FROM-BITMEX"
}
]
},
{
"exchange_id": "KRAKEN/JOHN",
"parameters": [
{
"key": "PublicApiKey",
"value": "73034021-THIS-IS-SAMPLE-PUBLIC-KEY-FROM-KRAKEN"
},
{
"key": "PrivateApiKey",
"value": "73034021-THIS-IS-SAMPLE-PRIVATE-KEY-FROM-KRAKEN"
}
]
}
]Trades execution
Placing an order on an exchange involves providing instructions for executing a trade at a designated price and quantity.
Check balance (Optional)
Before diving into trading, it's a good idea to check the balance on your account(s). Here's an example of checking the account balance for all of the exchanges associated with the account.
import requests
import json
url = "https://global.ems.coinapi.net/v1/balances"
payload={}
headers = {
'Accept': 'application/json',
'X-CoinAPI-Key': '73034021-THIS-IS-SAMPLE-COINAPI-KEY'
}
# Make the request
response = requests.get(url, headers=headers)
if response.status_code == 200:
accounts_json = response.json()
print(json.dumps(accounts_json, indent=4))
else:
print("Error:", response.status_code)The response may be as follows (for BITMEX/JOHN and KRAKEN/JOHN accounts):
[
{
"type": "BALANCE_SNAPSHOT",
"exchange_id": "BITMEX/JOHN",
"data": [
{
"id": "XBT",
"asset_id_exchange": "XBT",
"asset_id_coinapi": "BTC",
"balance": 0.02164794,
"available": 0.02164794,
"locked": 0.0,
"traded": 0.0,
"last_updated_by": "EXCHANGE",
"rate_usd": 52357.18111158658
},
{
"id": "BMEx",
"asset_id_exchange": "BMEx",
"asset_id_coinapi": "BMEX",
"balance": 300000.0,
"available": 300000.0,
"locked": 0.0,
"traded": 0.0,
"last_updated_by": "EXCHANGE",
"rate_usd": 0.2521371329127946
}
]
},
{
"type": "BALANCE_SNAPSHOT",
"exchange_id": "KRAKEN/JOHN",
"data": [
{
"id": "ETHW",
"asset_id_exchange": "ETHW",
"asset_id_coinapi": "ETHW",
"balance": 1.73e-05,
"available": 1.73e-05,
"locked": 0.0,
"traded": 0.0,
"last_updated_by": "EXCHANGE",
"rate_usd": 2.9136466899640077
},
{
"id": "BCH",
"asset_id_exchange": "BCH",
"asset_id_coinapi": "BCH",
"balance": 2.9e-09,
"available": 2.9e-09,
"locked": 0.0,
"traded": 0.0,
"last_updated_by": "EXCHANGE",
"rate_usd": 265.7082181877394
},
{
"id": "ZCAD",
"asset_id_exchange": "ZCAD",
"asset_id_coinapi": "CAD",
"balance": 0.7905,
"available": 0.7905,
"locked": 0.0,
"traded": 0.0,
"last_updated_by": "EXCHANGE",
"rate_usd": 0.7405719177575096
},
{
"id": "ZEUR",
"asset_id_exchange": "ZEUR",
"asset_id_coinapi": "EUR",
"balance": 0.0098,
"available": 0.0098,
"locked": 0.0,
"traded": 0.0,
"last_updated_by": "EXCHANGE",
"rate_usd": 1.0809450373867444
},
{
"id": "ADA",
"asset_id_exchange": "ADA",
"asset_id_coinapi": "ADA",
"balance": 2e-08,
"available": 2e-08,
"locked": 0.0,
"traded": 0.0,
"last_updated_by": "EXCHANGE",
"rate_usd": 0.6244338769954291
},
{
"id": "ZUSD",
"asset_id_exchange": "ZUSD",
"locked": 0.0,
"traded": 0.0,
"last_updated_by": "EXCHANGE",
"rate_usd": null
},
{
"id": "XXBT",
"asset_id_exchange": "XXBT",
"asset_id_coinapi": "BTC",
"balance": 8.58e-08,
"available": 8.58e-08,
"locked": 0.0,
"traded": 0.0,
"last_updated_by": "EXCHANGE",
"rate_usd": 52320.9229657045
}
]
}
]Submit Order (SELL)
Here's an example of submitting a SELL order on the KRAKEN exchange with the following details:
- Desired amount of USD to sell:
10 - Expected price to be executed at:
150 - Initial balance of USD:
77.3669 - Save down somewhere the
YOUR-UNIQUE-IDENTIFIER-FOR-ORDER-001identifier to track the status of the order
import requests
import json
from datetime import datetime, timedelta
url = "https://global.ems.coinapi.net/v1/orders"
payload = json.dumps({
"exchange_id": "KRAKEN/JOHN",
"client_order_id": "YOUR-UNIQUE-IDENTIFIER-FOR-ORDER-001",
"symbol_id_coinapi": "KRAKEN_SPOT_USD_JPY",
"amount_order": 10,
"price": 150,
"side": "SELL",
"order_type": "LIMIT",
"time_in_force": "GOOD_TILL_CANCEL",
"exec_inst": [
"MAKER_OR_CANCEL"
]
})
# Headers
headers = {
"X-CoinAPI-Key": "73034021-THIS-IS-SAMPLE-COINAPI-KEY",
"Content-Type": "application/json"
}
# Make the request
try:
response = requests.post(url, data=payload, headers=headers)
# Check status code
if response.status_code == 200:
print("Response JSON:", response.json())
else:
print("Response Code:", response.status_code)
except Exception as e:
print("An error occurred:", e)Examples of Possible Responses:
Successful Routing
The order has been sent to the exchange:
{
"type": "ORDER_EXEC_REPORT_UPDATE",
"id": "YOUR-UNIQUE-IDENTIFIER-FOR-ORDER-001",
"client_order_id_format_exchange": "74733759",
"exchange_order_id": "OX6EKO-67KDQ-KGNYFI",
"amount_open": 10.0,
"amount_filled": 0.0,
"status": "ROUTED",
"status_history": [
["RECEIVED", "2024-02-22T23:55:31.5424443Z"],
["ROUTING", "2024-02-22T23:55:31.5439512Z"],
["ROUTED", "2024-02-22T23:55:31.8127436Z"]
],
"error_message": null,
"fills": [],
"exchange_id": "KRAKEN/JOHN",
"client_order_id": "YOUR-UNIQUE-IDENTIFIER-FOR-ORDER-001",
"symbol_id_exchange": "USDJPY",
"symbol_id_coinapi": "KRAKEN_SPOT_USD_JPY",
"amount_order": 10.0,
"price": 150.0,
"avg_px": 0.0,
"side": "SELL",
"order_type": "LIMIT",
"time_in_force": "GOOD_TILL_CANCEL",
"expire_time": null,
"exec_inst": ["MAKER_OR_CANCEL"]
}Invalid Volume Error
If you encounter a volume error due to a mismatch with the minimum order size:
{
"type": "ORDER_EXEC_REPORT_UPDATE",
"id": "YOUR-UNIQUE-IDENTIFIER-FOR-ORDER-001",
"client_order_id_format_exchange": "74733759",
"exchange_order_id": null,
"amount_open": 5e-15,
"amount_filled": 0.0,
"status": "REJECTED",
"status_history": [
["RECEIVED", "2024-02-23T00:04:36.8301287Z"],
["ROUTING", "2024-02-23T00:04:36.8315182Z"],
["REJECTED", "2024-02-23T00:04:36.9940661Z"]
],
"error_message": "EGeneral:Invalid arguments:volume",
"fills": [],
"exchange_id": "KRAKEN/JOHN",
"client_order_id": "YOUR-UNIQUE-IDENTIFIER-FOR-ORDER-001",
"symbol_id_exchange": "USDJPY",
"symbol_id_coinapi": "KRAKEN_SPOT_USD_JPY",
"amount_order": 5e-15,
"price": 150.0,
"avg_px": 0.0,
"side": "SELL",
"order_type": "LIMIT",
"time_in_force": "GOOD_TILL_CANCEL",
"expire_time": null,
"exec_inst": ["MAKER_OR_CANCEL"]
}Insufficient Funds Error
If you encounter an insufficient funds error due to insufficient balance in your account:
{
"type": "ORDER_EXEC_REPORT_UPDATE",
"id": "YOUR-UNIQUE-IDENTIFIER-FOR-ORDER-001",
"client_order_id_format_exchange": "74733759",
"exchange_order_id": null,
"amount_open": 555555555555555.0,
"amount_filled": 0.0,
"status": "REJECTED",
"status_history": [
["RECEIVED", "2024-02-23T00:05:34.6909879Z"],
["ROUTING", "2024-02-23T00:05:34.6918765Z"],
["REJECTED", "2024-02-23T00:05:34.8518753Z"]
],
"error_message": "EGeneral:Invalid arguments:volume",
"fills": [],
"exchange_id": "KRAKEN/JOHN",
"client_order_id": "YOUR-UNIQUE-IDENTIFIER-FOR-ORDER-001",
"symbol_id_exchange": "USDJPY",
"symbol_id_coinapi": "KRAKEN_SPOT_USD_JPY",
"amount_order": 555555555555555.0,
"price": 150.0,
"avg_px": 0.0,
"side": "SELL",
"order_type": "LIMIT",
"time_in_force": "GOOD_TILL_CANCEL",
"expire_time": null,
"exec_inst": ["MAKER_OR_CANCEL"]
}[!NOTE]
- Here you can check the comprehensive list of execution instructions for the
exec_instparameter- You can find available values for the
time_in_forceparameter here- EMS exclusively supports the LIMIT
order_type.- The supported values for
symbol_id_coinapican be found by executing the endpoint provided here.- The meaning of the order
statusin the response (ROUTED,REJECTED, etc.) can be found here- To view the possible values for the order lifecycle, click here
- Instead of utilizing CoinAPI's
symbol_id_coinapi, you can opt for the symbol provided by the exchange throughsymbol_id_exchange
Here are some of the most common codes that may be returned for order creation:
| Http Status Code | Description |
|---|---|
| 200 (ok) | Order accepted |
| 400 (bad request) | Incorrect input parameters. |
| 490 (unreachable) | Exchange cannot be reached. |
| 504 (timeout) | Exchange didn't respond in the defined timeout. |
Verify order status
Ensure that you've saved the client_order_id parameter associated with your specific order.
This identifier will be necessary to check its status.
import requests
import json
from datetime import datetime, timedelta
url = "https://global.ems.coinapi.net/v1/orders/status/YOUR-UNIQUE-IDENTIFIER-FOR-ORDER-001"
# Headers
headers = {
"X-CoinAPI-Key": "73034021-THIS-IS-SAMPLE-COINAPI-KEY",
"Content-Type": "application/json"
}
# Make the request
try:
response = requests.get(url, headers=headers)
# Check status code
if response.status_code == 200:
print("Response JSON:", response.json())
else:
print("Response Code:", response.status_code)
for header, value in response.headers.items():
print(header + ': ' + value)
except Exception as e:
print("An error occurred:", e)An example order status report that was executed with
YOUR-UNIQUE-IDENTIFIER-FOR-ORDER-001 identifier and which was CANCELED.
{
"type": "ORDER_EXEC_REPORT_UPDATE",
"id": "YOUR-UNIQUE-IDENTIFIER-FOR-ORDER-001",
"client_order_id_format_exchange": "1945919824",
"exchange_order_id": "OUQMAY-ODBWL-AXG4ZE",
"amount_open": 10.0,
"amount_filled": 0.0,
"status": "CANCELED",
"status_history": [
["RECEIVED", "2024-02-23T00:16:20.2139293Z"],
["ROUTING", "2024-02-23T00:16:20.2389572Z"],
["ROUTED", "2024-02-23T00:16:20.4016779Z"],
["NEW", "2024-02-23T00:16:20.4021975Z"],
["CANCELED", "2024-02-23T00:16:20.4026337Z"]
],
"error_message": null,
"fills": [],
"exchange_id": "KRAKEN/JOHN",
"client_order_id": "YOUR-UNIQUE-IDENTIFIER-FOR-ORDER-001",
"symbol_id_exchange": "USDJPY",
"symbol_id_coinapi": "KRAKEN_SPOT_USD_JPY",
"amount_order": 10.0,
"price": 150.0,
"avg_px": 0.0,
"side": "SELL",
"order_type": "LIMIT",
"time_in_force": "GOOD_TILL_CANCEL",
"expire_time": null,
"exec_inst": ["MAKER_OR_CANCEL"]
}Check all open orders
You can also check all of the open orders.
import requests
import json
from datetime import datetime, timedelta
url = " https://global.ems.coinapi.net/v1/orders"
# Headers
headers = {
"X-CoinAPI-Key": "73034021-THIS-IS-SAMPLE-COINAPI-KEY",
"Content-Type": "application/json"
}
# Make the request
try:
response = requests.get(url, headers=headers)
# Check status code
if response.status_code == 200:
print("Response JSON:", response.json())
else:
print("Response Code:", response.status_code)
for header, value in response.headers.items():
print(header + ': ' + value)
except Exception as e:
print("An error occurred:", e)[!NOTE] After an order is closed/finalized, it will no longer be visible through the endpoint mentioned above.
Submit Order (BUY)
Here's an example of submitting a BUY order on the KRAKEN exchange with the following details:
- Desired amount of
OXTto buy:100 - Expected price to be executed at:
0.11 - Save down somewhere the
YOUR-UNIQUE-IDENTIFIER-FOR-ORDER-007identifier to track the status of the order
import requests
import json
from datetime import datetime, timedelta
url = "https://global.ems.coinapi.net/v1/orders"
payload = json.dumps({
"exchange_id": "KRAKEN/JOHN",
"client_order_id": "YOUR-UNIQUE-IDENTIFIER-FOR-ORDER-007",
"symbol_id_coinapi": "KRAKEN_SPOT_OXT_USD",
"amount_order": 100,
"price": 0.11,
"side": "BUY",
"order_type": "LIMIT",
"time_in_force": "GOOD_TILL_CANCEL",
"exec_inst": [
"MAKER_OR_CANCEL"
]
})
# Headers
headers = {
"X-CoinAPI-Key": "73034021-THIS-IS-SAMPLE-COINAPI-KEY",
"Content-Type": "application/json"
}
# Make the request
try:
response = requests.post(url, data=payload, headers=headers)
# Check status code
if response.status_code == 200:
print("Response JSON:", response.json())
else:
print("Response Code:", response.status_code)
for header, value in response.headers.items():
print(header + ': ' + value)
except Exception as e:
print("An error occurred:", e)Successfully routed order Response:
{
"type": "ORDER_EXEC_REPORT_UPDATE",
"id": "YOUR-UNIQUE-IDENTIFIER-FOR-ORDER-007",
"client_order_id_format_exchange": "1946142760",
"exchange_order_id": "OJCPEO-PO7WD-VTPUF2",
"amount_open": 100.0,
"amount_filled": 0.0,
"status": "ROUTED",
"status_history": [
["RECEIVED", "2024-02-23T01:13:15.6096269Z"],
["ROUTING", "2024-02-23T01:13:15.6102840Z"],
["ROUTED", "2024-02-23T01:13:15.7772494Z"]
],
"error_message": null,
"fills": [],
"exchange_id": "KRAKEN/JOHN",
"client_order_id": "YOUR-UNIQUE-IDENTIFIER-FOR-ORDER-007",
"symbol_id_exchange": "OXTUSD",
"symbol_id_coinapi": "KRAKEN_SPOT_OXT_USD",
"amount_order": 100.0,
"price": 0.11,
"avg_px": 0.0,
"side": "BUY",
"order_type": "LIMIT",
"time_in_force": "GOOD_TILL_CANCEL",
"expire_time": null,
"exec_inst": ["MAKER_OR_CANCEL"]
}Below is the order status report response for a BUY operation with the client_order_id set as YOUR-UNIQUE-IDENTIFIER-FOR-ORDER-007:
{
"type": "ORDER_EXEC_REPORT_UPDATE",
"id": "YOUR-UNIQUE-IDENTIFIER-FOR-ORDER-007",
"client_order_id_format_exchange": "1946142760",
"exchange_order_id": "OJCPEO-PO7WD-VTPUF2",
"amount_open": 100.0,
"amount_filled": 0.0,
"status": "NEW",
"status_history": [
["RECEIVED", "2024-02-23T01:13:15.6096269Z"],
["ROUTING", "2024-02-23T01:13:15.6102840Z"],
["ROUTED", "2024-02-23T01:13:15.7772494Z"],
["NEW", "2024-02-23T01:13:15.8077026Z"]
],
"error_message": null,
"fills": [],
"exchange_id": "KRAKEN/JOHN",
"client_order_id": "YOUR-UNIQUE-IDENTIFIER-FOR-ORDER-007",
"symbol_id_exchange": "OXTUSD",
"symbol_id_coinapi": "KRAKEN_SPOT_OXT_USD",
"amount_order": 100.0,
"price": 0.11,
"avg_px": 0.0,
"side": "BUY",
"order_type": "LIMIT",
"time_in_force": "GOOD_TILL_CANCEL",
"expire_time": null,
"exec_inst": ["MAKER_OR_CANCEL"]
}Cancelling all open orders
To cancel all open orders associated with the KRAKEN/JOHN:
import requests
import json
from datetime import datetime, timedelta
url = "https://global.ems.coinapi.net/v1/orders/cancel/all"
payload = json.dumps({"exchange_id ": "KRAKEN/JOHN"})
# Headers
headers = {
"X-CoinAPI-Key": "73034021-THIS-IS-SAMPLE-COINAPI-KEY",
"Content-Type": "application/json"
}
# Make the request
try:
response = requests.post(url, data=payload, headers=headers)
# Check status code
if response.status_code == 200:
print("Response JSON:", response.json())
else:
print("Response Code:", response.status_code)
for header, value in response.headers.items():
print(header + ': ' + value)
except Exception as e:
print("An error occurred:", e)Here's a sample order report for a canceled BUY order via the EMS API:
{
"type": "ORDER_EXEC_REPORT_UPDATE",
"id": "YOUR-UNIQUE-IDENTIFIER-FOR-ORDER-007",
"client_order_id_format_exchange": "1946142760",
"exchange_order_id": "OJCPEO-PO7WD-VTPUF2",
"amount_open": 100.0,
"amount_filled": 0.0,
"status": "CANCELED",
"status_history": [
["RECEIVED", "2024-02-23T01:13:15.6096269Z"],
["ROUTING", "2024-02-23T01:13:15.6102840Z"],
["ROUTED", "2024-02-23T01:13:15.7772494Z"],
["NEW", "2024-02-23T01:13:15.8077026Z"],
["PENDING_CANCEL", "2024-02-23T01:18:49.2279836Z"],
["CANCELED", "2024-02-23T01:18:49.4245926Z"]
],
"error_message": null,
"fills": [],
"exchange_id": "KRAKEN/JOHN",
"client_order_id": "YOUR-UNIQUE-IDENTIFIER-FOR-ORDER-007",
"symbol_id_exchange": "OXTUSD",
"symbol_id_coinapi": "KRAKEN_SPOT_OXT_USD",
"amount_order": 100.0,
"price": 0.11,
"avg_px": 0.0,
"side": "BUY",
"order_type": "LIMIT",
"time_in_force": "GOOD_TILL_CANCEL",
"expire_time": null,
"exec_inst": ["MAKER_OR_CANCEL"]
}The explanations and practical code examples provided should let you have a better understanding
of how to leverage the EMS API for cryptocurrency trading across multiple exchanges.