bbgo_origin/python/bbgo/services.py

154 lines
6.2 KiB
Python
Raw Normal View History

2022-04-14 08:06:36 +00:00
from __future__ import annotations
from typing import Iterator
2022-03-07 04:06:16 +00:00
from typing import List
from typing import Tuple
2022-03-07 04:06:16 +00:00
import bbgo_pb2
import bbgo_pb2_grpc
2022-03-07 04:06:16 +00:00
2022-04-13 06:52:34 +00:00
from .data import ErrorMessage
from .data import KLine
from .data import MarketDataEvent
2022-04-13 09:40:21 +00:00
from .data import Subscription
from .data import UserDataEvent
2022-04-14 08:06:36 +00:00
from .utils import get_insecure_channel
2022-04-13 06:52:34 +00:00
2022-03-07 04:06:16 +00:00
2022-04-09 09:30:13 +00:00
class UserDataService(object):
2022-04-14 08:06:36 +00:00
stub: bbgo_pb2_grpc.UserDataServiceStub
2022-04-09 09:30:13 +00:00
2022-04-14 08:06:36 +00:00
def __init__(self, host: str, port: int) -> None:
self.stub = bbgo_pb2_grpc.UserDataServiceStub(get_insecure_channel(host, port))
2022-04-09 09:30:13 +00:00
def subscribe(self, session: str) -> Iterator[UserDataEvent]:
request = bbgo_pb2.UserDataRequest(session)
response_iter = self.stub.Subscribe(request)
for response in response_iter:
yield UserDataEvent.from_pb(response)
2022-04-09 09:30:13 +00:00
2022-04-09 09:24:34 +00:00
class MarketService(object):
2022-04-14 08:06:36 +00:00
stub: bbgo_pb2_grpc.MarketDataServiceStub
2022-03-07 04:06:16 +00:00
2022-04-14 08:06:36 +00:00
def __init__(self, host: str, port: int) -> None:
self.stub = bbgo_pb2_grpc.MarketDataServiceStub(get_insecure_channel(host, port))
2022-04-09 09:24:34 +00:00
def subscribe(self, subscriptions: List[Subscription]) -> Iterator[MarketDataEvent]:
2022-04-13 09:40:21 +00:00
request = bbgo_pb2.SubscribeRequest(subscriptions=[s.to_pb() for s in subscriptions])
response_iter = self.stub.Subscribe(request)
for response in response_iter:
yield MarketDataEvent.from_pb(response)
2022-04-09 09:24:34 +00:00
def query_klines(self,
exchange: str,
symbol: str,
limit: int = 30,
2022-04-13 06:52:34 +00:00
interval: str = '1m',
start_time: int = None,
end_time: int = None) -> Tuple[List[KLine], ErrorMessage]:
2022-04-09 09:24:34 +00:00
request = bbgo_pb2.QueryKLinesRequest(exchange=exchange,
symbol=symbol,
limit=limit,
interval=interval,
2022-04-13 06:52:34 +00:00
start_time=start_time,
end_time=end_time)
response = self.stub.QueryKLines(request)
klines = []
for kline in response.klines:
klines.append(KLine.from_pb(kline))
error = ErrorMessage.from_pb(response.error)
2022-04-09 09:24:34 +00:00
2022-04-13 06:52:34 +00:00
return klines, error
2022-04-09 09:24:34 +00:00
class TradingService(object):
2022-04-14 08:06:36 +00:00
stub: bbgo_pb2_grpc.TradingServiceStub
2022-04-09 09:24:34 +00:00
2022-04-14 08:06:36 +00:00
def __init__(self, host: str, port: int) -> None:
self.stub = bbgo_pb2_grpc.TradingServiceStub(get_insecure_channel(host, port))
2022-03-07 04:06:16 +00:00
def submit_order(self,
exchange: str,
symbol: str,
side: bbgo_pb2.Side,
quantity: float,
order_type: bbgo_pb2.OrderType,
price: float = None,
stop_price: float = None,
client_order_id: float = None,
group_id: float = None) -> bbgo_pb2.Order:
submit_order = bbgo_pb2.SubmitOrder(exchange=exchange,
symbol=symbol,
side=side,
quantity=quantity,
order_type=order_type,
price=price,
stop_price=stop_price,
client_order_id=client_order_id,
group_id=group_id)
request = bbgo_pb2.SubmitOrderRequest(submit_order=submit_order)
response = self.stub.SubmitOrder(request)
return response
def cancel_order(self, exchange: str, order_id: int, client_order_id: int = None) -> bbgo_pb2.CancelOrderResponse:
request = bbgo_pb2.CancelOrderRequest(exchange=exchange, id=order_id, client_order_id=client_order_id)
response = self.stub.CancelOrder(request)
return response
def query_order(self, order_id: int = None, client_order_id: int = None) -> bbgo_pb2.QueryOrderResponse:
request = bbgo_pb2.QueryOrderRequest(id=order_id, client_order_id=client_order_id)
response = self.stub.QueryOrder(request)
return response
def query_orders(self,
exchange: str,
symbol: str,
states: List[str] = None,
order_by: str = 'asc',
group_id: int = None,
pagination: bool = True,
page: int = 0,
limit: int = 100,
offset: int = 0) -> bbgo_pb2.QueryOrdersResponse:
# set default value to ['wait', 'convert']
states = states or ['wait', 'convert']
request = bbgo_pb2.QueryOrdersRequest(exchange=exchange,
symbol=symbol,
states=states,
order_by=order_by,
group_id=group_id,
pagination=pagination,
page=page,
limit=limit,
offset=offset)
reponse = self.stub.QueryOrders(request)
return reponse
def query_trades(self,
exchange: str,
symbol: str,
timestamp: int,
order_by: str = 'asc',
pagination: bool = True,
page: int = 1,
limit: int = 100,
offset: int = 0) -> bbgo_pb2.QueryTradesResponse:
request = bbgo_pb2.QueryTradesRequest(exchange=exchange,
symbol=symbol,
timestamp=timestamp,
order_by=order_by,
pagination=pagination,
page=page,
limit=limit,
offset=offset)
response = self.stub.QueryTrades(request)
return response