예제 #1
0
    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)
예제 #2
0
    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)
예제 #3
0
    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())
예제 #4
0
    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())
예제 #5
0
파일: bitmex.py 프로젝트: surume-ika/ebisu
 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)
예제 #6
0
    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())
예제 #8
0
 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