Files
bitfinex-api-py/bfxapi/websockets/DataServerWebsocket.py
2018-11-16 14:38:41 +00:00

79 lines
2.6 KiB
Python

import json
from .GenericWebsocket import GenericWebsocket
class DataServerWebsocket(GenericWebsocket):
'''
Basic websocket client that simply reads data from the DataServer. This instance
of the websocket should only ever be used in backtest mode since it isnt capable
of handling orders.
Events:
- connected: called when a connection is made
- done: fires when the backtest has finished running
'''
WS_END = 'bt.end'
WS_CANDLE = 'bt.candle'
WS_TRADE = 'bt.trade'
WS_START = 'bt.start'
WS_SYNC_START = 'bt.sync.start'
WS_SYNC_END = 'bt.sync.end'
WS_CONNECT = 'connected'
def __init__(self, host='ws://localhost:8899', *args, **kwargs):
super(DataServerWebsocket, self).__init__(host, *args, **kwargs)
def run(self, fromDate, toDate, syncTrades=True, syncCandles=True, tf='1m',
candleFields='*', tradeFields='*', syncMissing=True):
self.fromDate = fromDate
self.toDate = toDate
self.tf = tf
self.sync = syncCandles
self.syncTrades = syncTrades
self.syncCandles = syncCandles
self.syncMissing = syncMissing
self.candleFields = candleFields
self.tradeFields = tradeFields
super(DataServerWebsocket, self).run()
async def on_message(self, message):
self.logger.debug(message)
msg = json.loads(message)
eType = msg[0]
if eType == self.WS_SYNC_START:
self.logger.info("Syncing data with backtest server, please wait...")
elif eType == self.WS_SYNC_END:
self.logger.info("Syncing complete.")
elif eType == self.WS_START:
self.logger.info("Backtest data stream starting...")
elif eType == self.WS_END:
self.logger.info("Backtest data stream complete.")
await self.on_close()
elif eType == self.WS_CANDLE:
await self._onCandle(msg)
elif eType == self.WS_TRADE:
await self._onTrade(msg)
elif eType == self.WS_CONNECT:
await self.on_open()
else:
self.logger.warn('Unknown websocket command: {}'.format(msg[0]))
def _exec_bt_string(self):
data = '["exec.bt", [{}, {}, "{}", "{}", "{}", "{}", "{}", "{}", "{}"]]'.format(
self.fromDate, self.toDate, self.symbol, self.tf, json.dumps(self.syncCandles),
json.dumps(self.syncTrades), self.candleFields, self.tradeFields, json.dumps(self.sync))
return data
async def on_open(self):
self._emit('connected')
data = self._exec_bt_string()
await self.ws.send(data)
async def _onCandle(self, data):
candle = data[3]
self._emit('new_canlde', candle)
async def _onTrade(self, data):
trade = data[2]
self._emit('new_trade', trade)