Merge pull request #2069 from LimingFang/dev-coinbase

Dev coinbase
This commit is contained in:
vn.py 2019-09-04 22:37:57 +08:00 committed by GitHub
commit dc97cbde06
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 41 additions and 60 deletions

View File

@ -23,7 +23,6 @@ from vnpy.trader.constant import (
OrderType, OrderType,
Product, Product,
Status, Status,
Offset,
Interval Interval
) )
from vnpy.trader.gateway import BaseGateway from vnpy.trader.gateway import BaseGateway
@ -31,7 +30,6 @@ from vnpy.trader.object import (
TickData, TickData,
OrderData, OrderData,
TradeData, TradeData,
PositionData,
AccountData, AccountData,
ContractData, ContractData,
BarData, BarData,
@ -49,8 +47,6 @@ SANDBOX_WEBSOCKET_HOST = "wss://ws-feed-public.sandbox.pro.coinbase.com"
DIRECTION_VT2COINBASE = {Direction.LONG: "buy", Direction.SHORT: "sell"} DIRECTION_VT2COINBASE = {Direction.LONG: "buy", Direction.SHORT: "sell"}
DIRECTION_COINBASE2VT = {v: k for k, v in DIRECTION_VT2COINBASE.items()} DIRECTION_COINBASE2VT = {v: k for k, v in DIRECTION_VT2COINBASE.items()}
STOP_VT2COINBASE = {Direction.LONG: "entry", Direction.SHORT: "loss"}
ORDERTYPE_VT2COINBASE = { ORDERTYPE_VT2COINBASE = {
OrderType.LIMIT: "limit", OrderType.LIMIT: "limit",
OrderType.MARKET: "market", OrderType.MARKET: "market",
@ -96,13 +92,6 @@ class CoinbaseGateway(BaseGateway):
self.rest_api = CoinbaseRestApi(self) self.rest_api = CoinbaseRestApi(self)
self.ws_api = CoinbaseWebsocketApi(self) self.ws_api = CoinbaseWebsocketApi(self)
self.rest_api_inited = False
self.product_id = []
self.received_instrument = False
event_engine.register(EVENT_TIMER, self.process_timer_event)
def connect(self, setting: dict): def connect(self, setting: dict):
"""""" """"""
key = setting["ID"] key = setting["ID"]
@ -120,10 +109,7 @@ class CoinbaseGateway(BaseGateway):
self.rest_api.connect(key, secret, passphrase, session_number, server, self.rest_api.connect(key, secret, passphrase, session_number, server,
proxy_host, proxy_port) proxy_host, proxy_port)
while not self.received_instrument:
time.sleep(0.5)
self.write_log("合约查询成功")
self.ws_api.connect( self.ws_api.connect(
key, key,
secret, secret,
@ -146,7 +132,7 @@ class CoinbaseGateway(BaseGateway):
def query_account(self): def query_account(self):
"""""" """"""
return self.rest_api.qry_account() return self.rest_api.query_account()
def query_position(self): def query_position(self):
""" """
@ -168,12 +154,11 @@ class CoinbaseGateway(BaseGateway):
def process_timer_event(self, event: Event): def process_timer_event(self, event: Event):
"""""" """"""
self.rest_api.reset_rate_limit() self.rest_api.reset_rate_limit()
if self.rest_api_inited: self.init_query()
self.init_query()
def init_query(self): def init_query(self):
"""""" """"""
self.rest_api.qry_account() self.rest_api.query_account()
class CoinbaseWebsocketApi(WebsocketClient): class CoinbaseWebsocketApi(WebsocketClient):
@ -226,6 +211,8 @@ class CoinbaseWebsocketApi(WebsocketClient):
self.init(SANDBOX_WEBSOCKET_HOST, proxy_host, proxy_port) self.init(SANDBOX_WEBSOCKET_HOST, proxy_host, proxy_port)
self.start() self.start()
self.gateway.event_engine.register(EVENT_TIMER, self.gateway.process_timer_event)
def subscribe(self, req: SubscribeRequest): def subscribe(self, req: SubscribeRequest):
"""""" """"""
symbol = req.symbol symbol = req.symbol
@ -269,10 +256,11 @@ class CoinbaseWebsocketApi(WebsocketClient):
""" """
callback when data is received and unpacked callback when data is received and unpacked
""" """
if packet['type'] == 'error': if packet['type'] == 'error':
self.gateway.write_log("Websocket API报错 %s" % packet['message']) self.gateway.write_log(
self.gateway.write_log("Websocket API报错原因是 %s" % packet['reason']) "Websocket API报错 %s" % packet['message'])
self.gateway.write_log(
"Websocket API报错原因是 %s" % packet['reason'])
self.active = False self.active = False
else: else:
@ -385,6 +373,7 @@ class OrderBook():
self.gateway = gateway self.gateway = gateway
self.newest_tick = TickData( self.newest_tick = TickData(
"COINBASE", symbol, exchange, datetime.now()) "COINBASE", symbol, exchange, datetime.now())
self.first_update = False
def on_message(self, d: dict): def on_message(self, d: dict):
""" """
@ -426,21 +415,19 @@ class OrderBook():
self.generate_tick(dt) self.generate_tick(dt)
def on_ticker(self, d: dict): def on_ticker(self, d: dict):
""" """
call back when type is ticker call back when type is ticker
""" """
tick = self.newest_tick tick = self.newest_tick
tick.openPrice = float(d['open_24h']) tick.open_price = float(d['open_24h'])
tick.highPrice = float(d['high_24h']) tick.high_price = float(d['high_24h'])
tick.lowPrice = float(d['low_24h']) tick.low_price = float(d['low_24h'])
tick.lastPrice = float(d['price']) tick.last_price = float(d['price'])
tick.volume = float(d['volume_24h']) tick.volume = float(d['volume_24h'])
dt = datetime.strptime(
d['time'], "%Y-%m-%dT%H:%M:%S.%fZ")
self.gateway.on_tick(copy(tick)) self.gateway.on_tick(copy(tick))
def on_snapshot(self, asks: Sequence[List], bids: Sequence[List]): def on_snapshot(self, asks: Sequence[List], bids: Sequence[List]):
@ -556,47 +543,44 @@ class CoinbaseRestApi(RestClient):
self.init(SANDBOX_REST_HOST, proxy_host, proxy_port) self.init(SANDBOX_REST_HOST, proxy_host, proxy_port)
self.start(session_number) self.start(session_number)
self.gateway.rest_api_inited = True self.query_instrument()
self.query_orders()
self.qry_instrument()
# self.qry_orders()
self.gateway.write_log("REST API启动成功") self.gateway.write_log("REST API启动成功")
def qry_instrument(self): def query_instrument(self):
""" """
Get the instrument of Coinbase Get the instrument of Coinbase
""" """
self.add_request( self.add_request(
"GET", "GET",
"/products", "/products",
callback=self.on_qry_instrument, callback=self.on_query_instrument,
params={}, params={},
on_error=self.on_qry_instrument_error, on_error=self.on_query_instrument_error,
) )
def qry_orders(self): def query_orders(self):
"""""" """"""
params = {"status": "all"}
self.add_request( self.add_request(
"GET", "GET",
"/orders", "/orders?status=all",
callback=self.on_qry_orders, callback=self.on_query_orders,
params=params, params={},
on_error=self.on_qry_orders_error, on_error=self.on_query_orders_error,
) )
def qry_account(self): def query_account(self):
"""""" """"""
self.add_request( self.add_request(
"GET", "GET",
"/accounts", "/accounts",
callback=self.on_qry_account, callback=self.on_query_account,
params={}, params={},
on_error=self.on_qry_account_error, on_error=self.on_query_account_error,
) )
def on_qry_account(self, data, request): def on_query_account(self, data, request):
"""""" """"""
for acc in data: for acc in data:
account_id = str(acc['id']) account_id = str(acc['id'])
@ -612,7 +596,7 @@ class CoinbaseRestApi(RestClient):
self.gateway.on_account(copy(account)) self.gateway.on_account(copy(account))
def on_qry_account_error( def on_query_account_error(
self, self,
exception_type: type, exception_type: type,
exception_value: Exception, exception_value: Exception,
@ -622,7 +606,7 @@ class CoinbaseRestApi(RestClient):
if not issubclass(exception_type, ConnectionError): if not issubclass(exception_type, ConnectionError):
self.on_error(exception_type, exception_value, tb, request) self.on_error(exception_type, exception_value, tb, request)
def on_qry_orders_error( def on_query_orders_error(
self, self,
exception_type: type, exception_type: type,
exception_value: Exception, exception_value: Exception,
@ -632,12 +616,12 @@ class CoinbaseRestApi(RestClient):
if not issubclass(exception_type, ConnectionError): if not issubclass(exception_type, ConnectionError):
self.on_error(exception_type, exception_value, tb, request) self.on_error(exception_type, exception_value, tb, request)
def on_qry_orders(self, data, request): def on_query_orders(self, data, request):
"""""" """"""
for d in data: for d in data:
date, time = d['created_at'].split('T') date, time = d['created_at'].split('T')
if d['status'] == 'open': if d['status'] == 'open':
if not d['filled_size']: if not float(d['filled_size']):
status = Status.NOTTRADED status = Status.NOTTRADED
else: else:
status = Status.PARTTRADED status = Status.PARTTRADED
@ -661,11 +645,11 @@ class CoinbaseRestApi(RestClient):
self.gateway.on_order(copy(order)) self.gateway.on_order(copy(order))
orderDict[order.orderid] = order orderDict[order.orderid] = order
orderSysDict[order.orderid] = order.orderID orderSysDict[order.orderid] = order.orderid
self.gateway.writeLog(u'委托信息查询成功') self.gateway.write_log(u'委托信息查询成功')
def on_qry_instrument_error( def on_query_instrument_error(
self, self,
exception_type: type, exception_type: type,
exception_value: Exception, exception_value: Exception,
@ -678,7 +662,7 @@ class CoinbaseRestApi(RestClient):
if not issubclass(exception_type, ConnectionError): if not issubclass(exception_type, ConnectionError):
self.on_error(exception_type, exception_value, tb, request) self.on_error(exception_type, exception_value, tb, request)
def on_qry_instrument(self, data, request): def on_query_instrument(self, data, request):
"""""" """"""
for d in data: for d in data:
contract = ContractData( contract = ContractData(
@ -688,7 +672,7 @@ class CoinbaseRestApi(RestClient):
product=Product.SPOT, product=Product.SPOT,
pricetick=d['quote_increment'], pricetick=d['quote_increment'],
size=d['base_min_size'], size=d['base_min_size'],
stop_supported=(not d['limit_only']), stop_supported=False,
net_position=True, net_position=True,
history_data=False, history_data=False,
gateway_name=self.gateway_name, gateway_name=self.gateway_name,
@ -696,8 +680,7 @@ class CoinbaseRestApi(RestClient):
self.gateway.on_contract(contract) self.gateway.on_contract(contract)
self.gateway.product_id.append(d['id']) self.gateway.write_log("")
self.gateway.received_instrument = True
def send_order(self, req: OrderRequest): def send_order(self, req: OrderRequest):
"""""" """"""
@ -716,9 +699,7 @@ class CoinbaseRestApi(RestClient):
if req.type == OrderType.LIMIT: if req.type == OrderType.LIMIT:
data['price'] = req.price data['price'] = req.price
elif req.type == OrderType.STOP:
data['stop_price'] = req.price
data['stop'] = STOP_VT2COINBASE[req.Direction]
order = req.create_order_data(orderid, self.gateway_name) order = req.create_order_data(orderid, self.gateway_name)
self.add_request( self.add_request(

View File

@ -115,7 +115,7 @@ class Exchange(Enum):
HUOBI = "HUOBI" HUOBI = "HUOBI"
BITFINEX = "BITFINEX" BITFINEX = "BITFINEX"
BINANCE = "BINANCE" BINANCE = "BINANCE"
COINBASE = "COINBASE"
class Currency(Enum): class Currency(Enum):
""" """