mirror of
https://github.com/aljazceru/bitfinex-api-py.git
synced 2025-12-19 14:54:21 +01:00
79 lines
2.6 KiB
Python
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)
|