def fetch_ohlcv(self, bin_size, start_time, end_time): """ fetch OHLCV data :param start_time: start time :param end_time: end time :return: """ self.__init_client() fetch_bin_size = allowed_range[bin_size][0] left_time = start_time right_time = end_time data = to_data_frame([]) while True: source = retry(lambda: self.public_client.Trade.Trade_getBucketed( symbol=self.pair, binSize=fetch_bin_size, startTime=left_time, endTime=right_time, count=500, partial=True).result()) if len(source) == 0: break source = to_data_frame(source) data = pd.concat([data, source]) if right_time > source.iloc[-1].name + delta(fetch_bin_size): left_time = source.iloc[-1].name + delta(fetch_bin_size) time.sleep(2) else: break return resample(data, bin_size)
def fetch_ohlcv(self, bin_size, start_time, end_time): """ fetch OHLCV data :param start_time: start time :param end_time: end time :return: """ self.__init_client() fetch_bin_size = allowed_range[bin_size][0] left_time = start_time right_time = end_time data = to_data_frame([]) while True: if left_time > right_time: break logger.info(f"fetching OHLCV data") left_time_to_timestamp = int(datetime.timestamp(left_time) * 1000) right_time_to_timestamp = int( datetime.timestamp(right_time) * 1000) source = retry(lambda: self.client.futures_klines( symbol=self.pair, interval=fetch_bin_size, startTime=left_time_to_timestamp, endTime=right_time_to_timestamp, limit=1500)) if len(source) == 0: break source_to_object_list = [] for s in source: timestamp_to_datetime = datetime.fromtimestamp( s[6] / 1000).astimezone(UTC) source_to_object_list.append({ "timestamp": timestamp_to_datetime, "high": float(s[2]), "low": float(s[3]), "open": float(s[1]), "close": float(s[4]), "volume": float(s[5]) }) source = to_data_frame(source_to_object_list) data = pd.concat([data, source]) if right_time > source.iloc[-1].name + delta(fetch_bin_size): left_time = source.iloc[-1].name + delta(fetch_bin_size) time.sleep(2) else: break return resample(data, bin_size)
def __on_message(self, ws, message): """ On Message listener :param ws: :param message: :return: """ try: obj = json.loads(message) if 'e' in obj['data']: e = obj['data']['e'] action = "" datas = obj['data'] if e.startswith("kline"): data = [{ "timestamp" : datas['k']['T'], "high" : float(datas['k']['h']), "low" : float(datas['k']['l']), "open" : float(datas['k']['o']), "close" : float(datas['k']['c']), "volume" : float(datas['k']['v']) }] data[0]['timestamp'] = datetime.fromtimestamp(data[0]['timestamp']/1000).strftime('%Y-%m-%dT%H:%M:%S') data[0]['timestamp'] = datetime.strptime(data[0]['timestamp'],'%Y-%m-%dT%H:%M:%S') self.__emit(obj['data']['k']['i'], action, to_data_frame([data[0]])) elif e.startswith("24hrTicker"): self.__emit(e, action, datas) elif e.startswith("ACCOUNT_UPDATE"): self.__emit(e, action, datas['a']['P']) self.__emit('wallet', action, datas['a']['B'][0]) self.__emit('margin', action, datas['a']['B'][0]) # todo ORDER_TRADE_UPDATE elif e.startswith("ORDER_TRADE_UPDATE"): self.__emit(e, action, datas['o']) #todo orderbook stream # elif table.startswith(""): # self.__emit(e, action, data) elif e.startswith("listenKeyExpired"): self.__emit('close', action, datas) self.__get_auth_user_data_streams() logger.info(f"listenKeyExpired!!!") #self.__on_close(ws) elif not 'e' in obj['data']: e = 'IndividualSymbolBookTickerStreams' action = '' data = obj['data'] #logger.info(f"{data}") self.__emit(e, action, data) except Exception as e: logger.error(e) logger.error(traceback.format_exc())
def __on_message(self, ws, message): """ On Message listener :param ws: :param message: :return: """ try: obj = json.loads(message) if 'table' in obj: if len(obj['data']) <= 0: return table = obj['table'] action = obj['action'] data = obj['data'] if table.startswith("tradeBin"): data[0]['timestamp'] = datetime.strptime( data[0]['timestamp'][:-5], '%Y-%m-%dT%H:%M:%S') new_data = [] new_data.append(data[0]) #add placeholder tick so it resamples correctly new_data.append({ "timestamp": data[0]['timestamp'] + timedelta(seconds=0.01), "open": data[0]['close'], "high": data[0]['close'], "low": data[0]['close'], "close": data[0]['close'], "volume": 0 }) self.__emit(table, action, to_data_frame(new_data)) elif table.startswith("instrument"): self.__emit(table, action, data[0]) elif table.startswith("margin"): self.__emit(table, action, data[0]) elif table.startswith("position"): self.__emit(table, action, data[0]) elif table.startswith("wallet"): self.__emit(table, action, data[0]) elif table.startswith("orderBookL2"): self.__emit(table, action, data) except Exception as e: logger.error(e) logger.error(traceback.format_exc())
def fetch_ohlcv(self, bin_size, start_time, end_time): """ 足データを取得する :param start_time: 開始時間 :param end_time: 終了時間 :return: """ self.__init_client() fetch_bin_size = allowed_range[bin_size][0] data = retry(lambda: self.public_client.Trade.Trade_getBucketed( symbol="XBTUSD", binSize=fetch_bin_size, startTime=start_time, endTime=end_time, count=500, partial=False).result()) data_frame = to_data_frame(data) return resample(data_frame, bin_size)
def __on_message(self, ws, message): """ On Message listener :param ws: :param message: :return: """ try: obj = json.loads(message) if 'table' in obj: if len(obj['data']) <= 0: return table = obj['table'] action = obj['action'] data = obj['data'] if table.startswith("tradeBin"): data[0]['timestamp'] = datetime.strptime( data[0]['timestamp'][:-5], '%Y-%m-%dT%H:%M:%S') self.__emit(table, action, to_data_frame([data[0]])) elif table.startswith("instrument"): self.__emit(table, action, data[0]) elif table.startswith("margin"): self.__emit(table, action, data[0]) elif table.startswith("position"): self.__emit(table, action, data[0]) elif table.startswith("wallet"): self.__emit(table, action, data[0]) elif table.startswith("orderBookL2"): self.__emit(table, action, data) except Exception as e: logger.error(e) logger.error(traceback.format_exc())
def __on_message(self, ws, message): """ On Message listener :param ws: :param message: :return: """ try: obj = json.loads(message) if 'e' in obj['data']: e = obj['data']['e'] action = "" datas = obj['data'] if e.startswith("kline"): if self.use_healthcecks: current_minute = datetime.now().time().minute if self.last_heartbeat != current_minute: # Send a heartbeat to Healthchecks.io try: requests.get(conf['healthchecks.io'][ self.account]['websocket_heartbeat']) #logger.info("WS Heart Beat sent!") self.last_heartbeat = current_minute except Exception as e: pass data = [{ "timestamp": datas['k']['T'], "high": float(datas['k']['h']), "low": float(datas['k']['l']), "open": float(datas['k']['o']), "close": float(datas['k']['c']), "volume": float(datas['k']['v']) }] data[0]['timestamp'] = datetime.fromtimestamp( data[0]['timestamp'] / 1000).astimezone(UTC) self.__emit(obj['data']['k']['i'], obj['data']['k']['i'], to_data_frame([data[0]])) elif e.startswith("24hrTicker"): self.__emit(e, action, datas) elif e.startswith("ACCOUNT_UPDATE"): self.__emit(e, action, datas['a']['P']) self.__emit('wallet', action, datas['a']['B'][0]) self.__emit('margin', action, datas['a']['B'][0]) # todo ORDER_TRADE_UPDATE elif e.startswith("ORDER_TRADE_UPDATE"): self.__emit(e, action, datas['o']) #todo orderbook stream # elif table.startswith(""): # self.__emit(e, action, data) elif e.startswith("listenKeyExpired"): self.__emit('close', action, datas) self.__get_auth_user_data_streams() logger.info(f"listenKeyExpired!!!") #self.__on_close(ws) self.ws.close() elif not 'e' in obj['data']: e = 'IndividualSymbolBookTickerStreams' action = '' data = obj['data'] #logger.info(f"{data}") self.__emit(e, action, data) except Exception as e: logger.error(e) logger.error(traceback.format_exc())
def test_to_data_frame(self): data = {'timestamp': datetime.datetime(2018, 6, 8, 23, 56), 'symbol': 'XBTUSD', 'open': 7625.5, 'high': 7625.5, 'low': 7625, 'close': 7625, 'trades': 66, 'volume': 645499, 'vwap': 7625.4385, 'lastSize': 2001, 'turnover': 8465106620, 'homeNotional': 84.6510662, 'foreignNotional': 645499} data_frame = to_data_frame([data]) now = datetime.datetime.now(datetime.timezone.utc) assert data_frame.iloc[0].name < now