Skip to content

Commit

Permalink
Merge pull request #429 from crypto-chassis/develop
Browse files Browse the repository at this point in the history
Release
  • Loading branch information
cryptochassis committed Sep 15, 2023
2 parents fa1f634 + 11b0449 commit e978bd7
Show file tree
Hide file tree
Showing 25 changed files with 500 additions and 135 deletions.
1 change: 1 addition & 0 deletions binding/python/CMakeLists.txt
Expand Up @@ -44,6 +44,7 @@ add_custom_target(${PYTHON_PACKAGING_TARGET_NAME} ALL
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/setup.py ${PACKAGING_DIR_FULL}
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/${SWIG_TARGET_NAME}/ccapi.py ${PACKAGING_DIR_FULL}
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${SWIG_TARGET_NAME}> ${PACKAGING_DIR_FULL}
COMMAND ${Python_EXECUTABLE} -m pip install --upgrade setuptools wheel
COMMAND ${Python_EXECUTABLE} setup.py bdist_wheel
COMMAND ${Python_EXECUTABLE} -m pip install --upgrade .
WORKING_DIRECTORY ${PACKAGING_DIR_FULL}
Expand Down
55 changes: 55 additions & 0 deletions binding/python/example/data_visualization/main.py
@@ -0,0 +1,55 @@
import time
from ccapi import EventHandler, SessionOptions, SessionConfigs, Session, Subscription, Event
import matplotlib.pyplot as plt
import seaborn as sns
import time

if __name__ == "__main__":
option = SessionOptions()
config = SessionConfigs()
session = Session(option, config)
exchange = "okx"
instrument = "BTC-USDT"
subscription = Subscription(exchange, instrument, "MARKET_DEPTH", "MARKET_DEPTH_MAX=400&CONFLATE_INTERVAL_MILLISECONDS=100")
session.subscribe(subscription)
fig, ax = plt.subplots()
startTime = time.time()
while True:
bids = {"price": [], "size": []}
asks = {"price": [], "size": []}
eventList = session.getEventQueue().purge()
if eventList:
event = eventList[-1]
if event.getType() == Event.Type_SUBSCRIPTION_DATA:
for message in event.getMessageList():
for element in message.getElementList():
elementNameValueMap = element.getNameValueMap()
for name, value in elementNameValueMap.items():
if name == "BID_PRICE":
bids["price"].append(float(value))
if name == "BID_SIZE":
bids["size"].append(float(value))
if name == "ASK_PRICE":
asks["price"].append(float(value))
if name == "ASK_SIZE":
asks["size"].append(float(value))
ax.clear()
ax.set_title(f"{instrument} Order Book On {exchange.title()} at {message.getTimeISO()}")
ax.set_xlabel("Price")
ax.set_ylabel("Amount")
sns.ecdfplot(
x="price",
weights="size",
legend=False,
stat="count",
complementary=True,
data={"price": bids["price"], "size": bids["size"]},
ax=ax,
color="g",
)
sns.ecdfplot(x="price", weights="size", legend=False, stat="count", data={"price": asks["price"], "size": asks["size"]}, ax=ax, color="r")
plt.pause(0.1)
if time.time() - startTime > 10:
break
session.stop()
print("Bye")
11 changes: 8 additions & 3 deletions binding/python/example/enable_library_logging/main.py
Expand Up @@ -2,21 +2,26 @@
from threading import Lock
import time
from ccapi import Logger, Session, Subscription


class MyLogger(Logger):
def __init__(self):
super().__init__()
self._lock = Lock()

def logMessage(self, severity: str, threadId: str, timeISO: str, fileName: str, lineNumber: str, message: str) -> None:
self._lock.acquire()
print(f'{threadId}: [{timeISO}] {{{fileName}:{lineNumber}}} {severity}{" " * 8}{message}')
self._lock.release()


myLogger = MyLogger()
Logger.logger = myLogger
if __name__ == '__main__':
if __name__ == "__main__":
session = Session()
subscription = Subscription('coinbase', 'BTC-USD', 'MARKET_DEPTH')
subscription = Subscription("coinbase", "BTC-USD", "MARKET_DEPTH")
session.subscribe(subscription)
time.sleep(10)
session.stop()
print('Bye')
print("Bye")
Logger.logger = None
33 changes: 20 additions & 13 deletions binding/python/example/execution_management_simple_request/main.py
Expand Up @@ -2,30 +2,37 @@
import sys
import time
from ccapi import Event, SessionOptions, SessionConfigs, Session, EventHandler, Request


class MyEventHandler(EventHandler):
def __init__(self):
super().__init__()

def processEvent(self, event: Event, session: Session) -> bool:
print(f'Received an event:\n{event.toStringPretty(2, 2)}')
print(f"Received an event:\n{event.toStringPretty(2, 2)}")
return True # This line is needed.
if __name__ == '__main__':
if not os.environ.get('BINANCE_US_API_KEY'):
print('Please set environment variable BINANCE_US_API_KEY', file=sys.stderr)


if __name__ == "__main__":
if not os.environ.get("BINANCE_US_API_KEY"):
print("Please set environment variable BINANCE_US_API_KEY", file=sys.stderr)
sys.exit(1)
if not os.environ.get('BINANCE_US_API_SECRET'):
print('Please set environment variable BINANCE_US_API_SECRET', file=sys.stderr)
if not os.environ.get("BINANCE_US_API_SECRET"):
print("Please set environment variable BINANCE_US_API_SECRET", file=sys.stderr)
sys.exit(1)
eventHandler = MyEventHandler()
option = SessionOptions()
config = SessionConfigs()
session = Session(option, config, eventHandler)
request = Request(Request.Operation_CREATE_ORDER, 'binance-us', 'BTCUSD')
request.appendParam({
'SIDE':'BUY',
'QUANTITY':'0.0005',
'LIMIT_PRICE':'20000',
})
request = Request(Request.Operation_CREATE_ORDER, "binance-us", "BTCUSD")
request.appendParam(
{
"SIDE": "BUY",
"QUANTITY": "0.0005",
"LIMIT_PRICE": "20000",
}
)
session.sendRequest(request)
time.sleep(10)
session.stop()
print('Bye')
print("Bye")
Expand Up @@ -2,40 +2,47 @@
import sys
import time
from ccapi import EventHandler, SessionOptions, SessionConfigs, Session, Subscription, Request, Event, Message


class MyEventHandler(EventHandler):
def __init__(self):
super().__init__()

def processEvent(self, event: Event, session: Session) -> bool:
if event.getType() == Event.Type_SUBSCRIPTION_STATUS:
print(f'Received an event of type SUBSCRIPTION_STATUS:\n{event.toStringPretty(2, 2)}')
message = event.getMessageList()[0]
if message.getType() == Message.Type_SUBSCRIPTION_STARTED:
request = Request(Request.Operation_CREATE_ORDER, 'coinbase', 'BTC-USD')
request.appendParam({
'SIDE':'BUY',
'LIMIT_PRICE':'20000',
'QUANTITY':'0.001',
})
session.sendRequest(request)
print(f"Received an event of type SUBSCRIPTION_STATUS:\n{event.toStringPretty(2, 2)}")
message = event.getMessageList()[0]
if message.getType() == Message.Type_SUBSCRIPTION_STARTED:
request = Request(Request.Operation_CREATE_ORDER, "coinbase", "BTC-USD")
request.appendParam(
{
"SIDE": "BUY",
"LIMIT_PRICE": "20000",
"QUANTITY": "0.001",
}
)
session.sendRequest(request)
elif event.getType() == Event.Type_SUBSCRIPTION_DATA:
print(f'Received an event of type SUBSCRIPTION_DATA:\n{event.toStringPretty(2, 2)}')
print(f"Received an event of type SUBSCRIPTION_DATA:\n{event.toStringPretty(2, 2)}")
return True # This line is needed.
if __name__ == '__main__':
if not os.environ.get('COINBASE_API_KEY'):
print('Please set environment variable COINBASE_API_KEY', file=sys.stderr)


if __name__ == "__main__":
if not os.environ.get("COINBASE_API_KEY"):
print("Please set environment variable COINBASE_API_KEY", file=sys.stderr)
sys.exit(1)
if not os.environ.get('COINBASE_API_SECRET'):
print('Please set environment variable COINBASE_API_SECRET', file=sys.stderr)
if not os.environ.get("COINBASE_API_SECRET"):
print("Please set environment variable COINBASE_API_SECRET", file=sys.stderr)
sys.exit(1)
if not os.environ.get('COINBASE_API_PASSPHRASE'):
print('Please set environment variable COINBASE_API_PASSPHRASE', file=sys.stderr)
if not os.environ.get("COINBASE_API_PASSPHRASE"):
print("Please set environment variable COINBASE_API_PASSPHRASE", file=sys.stderr)
sys.exit(1)
eventHandler = MyEventHandler()
option = SessionOptions()
config = SessionConfigs()
session = Session(option, config, eventHandler)
subscription = Subscription('coinbase', 'BTC-USD', 'ORDER_UPDATE')
subscription = Subscription("coinbase", "BTC-USD", "ORDER_UPDATE")
session.subscribe(subscription)
time.sleep(10)
session.stop()
print('Bye')
print("Bye")
51 changes: 29 additions & 22 deletions binding/python/example/fix_simple/main.py
Expand Up @@ -2,45 +2,52 @@
import sys
import time
from ccapi import EventHandler, SessionOptions, SessionConfigs, Session, Subscription, Request, Event, Message


class MyEventHandler(EventHandler):
def __init__(self):
super().__init__()

def processEvent(self, event: Event, session: Session) -> bool:
if event.getType() == Event.Type_AUTHORIZATION_STATUS:
print(f'Received an event of type AUTHORIZATION_STATUS:\n{event.toStringPretty(2, 2)}')
print(f"Received an event of type AUTHORIZATION_STATUS:\n{event.toStringPretty(2, 2)}")
message = event.getMessageList()[0]
if message.getType() == Message.Type_AUTHORIZATION_SUCCESS:
request = Request(Request.Operation_FIX, 'coinbase', '', 'same correlation id for subscription and request')
request.appendParamFix([
(35,'D'),
(11,'6d4eb0fb-2229-469f-873e-557dd78ac11e'),
(55,'BTC-USD'),
(54,'1'),
(44,'20000'),
(38,'0.001'),
(40,'2'),
(59,'1'),
])
request = Request(Request.Operation_FIX, "coinbase", "", "same correlation id for subscription and request")
request.appendParamFix(
[
(35, "D"),
(11, "6d4eb0fb-2229-469f-873e-557dd78ac11e"),
(55, "BTC-USD"),
(54, "1"),
(44, "20000"),
(38, "0.001"),
(40, "2"),
(59, "1"),
]
)
session.sendRequestByFix(request)
elif event.getType() == Event.Type_FIX:
print(f'Received an event of type FIX:\n{event.toStringPretty(2, 2)}')
print(f"Received an event of type FIX:\n{event.toStringPretty(2, 2)}")
return True # This line is needed.
if __name__ == '__main__':
if not os.environ.get('COINBASE_API_KEY'):
print('Please set environment variable COINBASE_API_KEY', file=sys.stderr)


if __name__ == "__main__":
if not os.environ.get("COINBASE_API_KEY"):
print("Please set environment variable COINBASE_API_KEY", file=sys.stderr)
sys.exit(1)
if not os.environ.get('COINBASE_API_SECRET'):
print('Please set environment variable COINBASE_API_SECRET', file=sys.stderr)
if not os.environ.get("COINBASE_API_SECRET"):
print("Please set environment variable COINBASE_API_SECRET", file=sys.stderr)
sys.exit(1)
if not os.environ.get('COINBASE_API_PASSPHRASE'):
print('Please set environment variable COINBASE_API_PASSPHRASE', file=sys.stderr)
if not os.environ.get("COINBASE_API_PASSPHRASE"):
print("Please set environment variable COINBASE_API_PASSPHRASE", file=sys.stderr)
sys.exit(1)
eventHandler = MyEventHandler()
option = SessionOptions()
config = SessionConfigs()
session = Session(option, config, eventHandler)
subscription = Subscription('coinbase', '', 'FIX', '', 'same correlation id for subscription and request')
subscription = Subscription("coinbase", "", "FIX", "", "same correlation id for subscription and request")
session.subscribeByFix(subscription)
time.sleep(10)
session.stop()
print('Bye')
print("Bye")
13 changes: 9 additions & 4 deletions binding/python/example/handle_exception/main.py
Expand Up @@ -2,23 +2,28 @@
import time
import traceback
from ccapi import EventHandler, SessionOptions, SessionConfigs, Session, Subscription, Event


class MyEventHandler(EventHandler):
def __init__(self):
super().__init__()

def processEvent(self, event: Event, session: Session) -> bool:
try:
raise Exception('oops')
raise Exception("oops")
except Exception:
print(traceback.format_exc())
sys.exit(1)
return True # This line is needed.
if __name__ == '__main__':


if __name__ == "__main__":
eventHandler = MyEventHandler()
option = SessionOptions()
config = SessionConfigs()
session = Session(option, config, eventHandler)
subscription = Subscription('coinbase', 'BTC-USD', 'MARKET_DEPTH')
subscription = Subscription("coinbase", "BTC-USD", "MARKET_DEPTH")
session.subscribe(subscription)
time.sleep(10)
session.stop()
print('Bye')
print("Bye")
17 changes: 11 additions & 6 deletions binding/python/example/market_data_multiple_subscription/main.py
@@ -1,27 +1,32 @@
import time
from ccapi import EventHandler, SessionOptions, SessionConfigs, Session, Subscription, Event, SubscriptionList


class MyEventHandler(EventHandler):
def __init__(self):
super().__init__()

def processEvent(self, event: Event, session: Session) -> bool:
if event.getType() == Event.Type_SUBSCRIPTION_DATA:
for message in event.getMessageList():
correlationId = message.getCorrelationIdList()[0]
print(f'{correlationId}: Best bid and ask at {message.getTimeISO()} are:')
print(f"{correlationId}: Best bid and ask at {message.getTimeISO()} are:")
for element in message.getElementList():
elementNameValueMap = element.getNameValueMap()
for name, value in elementNameValueMap.items():
print(f' {name} = {value}')
print(f" {name} = {value}")
return True # This line is needed.
if __name__ == '__main__':


if __name__ == "__main__":
eventHandler = MyEventHandler()
option = SessionOptions()
config = SessionConfigs()
session = Session(option, config, eventHandler)
subscriptionList = SubscriptionList()
subscriptionList.append(Subscription('coinbase', 'BTC-USD', 'MARKET_DEPTH', '', 'BTC'))
subscriptionList.append(Subscription('coinbase', 'ETH-USD', 'MARKET_DEPTH', '', 'ETH'))
subscriptionList.append(Subscription("coinbase", "BTC-USD", "MARKET_DEPTH", "", "BTC"))
subscriptionList.append(Subscription("coinbase", "ETH-USD", "MARKET_DEPTH", "", "ETH"))
session.subscribe(subscriptionList)
time.sleep(10)
session.stop()
print('Bye')
print("Bye")
21 changes: 14 additions & 7 deletions binding/python/example/market_data_simple_request/main.py
@@ -1,21 +1,28 @@
import time
from ccapi import EventHandler, SessionOptions, SessionConfigs, Session, Request, Event


class MyEventHandler(EventHandler):
def __init__(self):
super().__init__()

def processEvent(self, event: Event, session: Session) -> bool:
print(f'Received an event:\n{event.toStringPretty(2, 2)}')
print(f"Received an event:\n{event.toStringPretty(2, 2)}")
return True # This line is needed.
if __name__ == '__main__':


if __name__ == "__main__":
eventHandler = MyEventHandler()
option = SessionOptions()
config = SessionConfigs()
session = Session(option, config, eventHandler)
request = Request(Request.Operation_GET_RECENT_TRADES, 'coinbase', 'BTC-USD')
request.appendParam({
'LIMIT':'1',
})
request = Request(Request.Operation_GET_RECENT_TRADES, "coinbase", "BTC-USD")
request.appendParam(
{
"LIMIT": "1",
}
)
session.sendRequest(request)
time.sleep(10)
session.stop()
print('Bye')
print("Bye")

0 comments on commit e978bd7

Please sign in to comment.