Remove breakpoints, simplify backoff logic
							parent
							
								
									ff22f2d240
								
							
						
					
					
						commit
						8af5fe3c64
					
				| 
						 | 
					@ -181,6 +181,7 @@ class Client:
 | 
				
			||||||
            self._key_id = config.key_id
 | 
					            self._key_id = config.key_id
 | 
				
			||||||
            self._key_secret = config.key_secret
 | 
					            self._key_secret = config.key_secret
 | 
				
			||||||
            self._key_passphrase = config.key_passphrase
 | 
					            self._key_passphrase = config.key_passphrase
 | 
				
			||||||
 | 
					            log.info('User credentials added')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _gen_auth_req_headers(
 | 
					    def _gen_auth_req_headers(
 | 
				
			||||||
        self,
 | 
					        self,
 | 
				
			||||||
| 
						 | 
					@ -193,7 +194,6 @@ class Client:
 | 
				
			||||||
        https://docs.kucoin.com/#authentication
 | 
					        https://docs.kucoin.com/#authentication
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        '''
 | 
					        '''
 | 
				
			||||||
        breakpoint()
 | 
					 | 
				
			||||||
        now = int(time.time() * 1000)
 | 
					        now = int(time.time() * 1000)
 | 
				
			||||||
        path = f'/api/{api_v}{endpoint}'
 | 
					        path = f'/api/{api_v}{endpoint}'
 | 
				
			||||||
        str_to_sign = str(now) + action + path
 | 
					        str_to_sign = str(now) + action + path
 | 
				
			||||||
| 
						 | 
					@ -273,6 +273,8 @@ class Client:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        entries = await self._request('GET', '/symbols')
 | 
					        entries = await self._request('GET', '/symbols')
 | 
				
			||||||
        syms = {item['name']: KucoinMktPair(**item) for item in entries}
 | 
					        syms = {item['name']: KucoinMktPair(**item) for item in entries}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        log.info('Kucoin market pairs fetches')
 | 
				
			||||||
        return syms
 | 
					        return syms
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async def cache_pairs(
 | 
					    async def cache_pairs(
 | 
				
			||||||
| 
						 | 
					@ -358,7 +360,7 @@ class Client:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if not isinstance(data, list):
 | 
					            if not isinstance(data, list):
 | 
				
			||||||
                # Do a gradual backoff if Kucoin is rate limiting us
 | 
					                # Do a gradual backoff if Kucoin is rate limiting us
 | 
				
			||||||
                backoff_interval = i + (randint(0, 1000) / 1000)
 | 
					                backoff_interval = i
 | 
				
			||||||
                log.warn(f'History call failed, backing off for {backoff_interval}s')
 | 
					                log.warn(f'History call failed, backing off for {backoff_interval}s')
 | 
				
			||||||
                await trio.sleep(backoff_interval)
 | 
					                await trio.sleep(backoff_interval)
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
| 
						 | 
					@ -388,7 +390,6 @@ class Client:
 | 
				
			||||||
                    case 'index':
 | 
					                    case 'index':
 | 
				
			||||||
                        row.append(int(value))
 | 
					                        row.append(int(value))
 | 
				
			||||||
                    case 'time':
 | 
					                    case 'time':
 | 
				
			||||||
                        # row.append(int(value) + (3600 * 4))
 | 
					 | 
				
			||||||
                        row.append(value)
 | 
					                        row.append(value)
 | 
				
			||||||
                    case _:
 | 
					                    case _:
 | 
				
			||||||
                        row.append(float(value))
 | 
					                        row.append(float(value))
 | 
				
			||||||
| 
						 | 
					@ -399,10 +400,6 @@ class Client:
 | 
				
			||||||
        return array
 | 
					        return array
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def kucoin_timestamp(dt: datetime):
 | 
					 | 
				
			||||||
    return math.trunc(time.mktime(dt.timetuple()))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def fqsn_to_kucoin_sym(fqsn: str, pairs: dict[str, KucoinMktPair]) -> str:
 | 
					def fqsn_to_kucoin_sym(fqsn: str, pairs: dict[str, KucoinMktPair]) -> str:
 | 
				
			||||||
    pair_data = pairs[fqsn]
 | 
					    pair_data = pairs[fqsn]
 | 
				
			||||||
    return pair_data.baseCurrency + '-' + pair_data.quoteCurrency
 | 
					    return pair_data.baseCurrency + '-' + pair_data.quoteCurrency
 | 
				
			||||||
| 
						 | 
					@ -483,12 +480,13 @@ async def stream_quotes(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    '''
 | 
					                    '''
 | 
				
			||||||
                    async with trio.open_nursery() as n:
 | 
					                    async with trio.open_nursery() as n:
 | 
				
			||||||
 | 
					                        # TODO: cache this task so it's only called once
 | 
				
			||||||
                        async def ping_server():
 | 
					                        async def ping_server():
 | 
				
			||||||
                            while True:
 | 
					                            while True:
 | 
				
			||||||
                                await trio.sleep((ping_interval - 1000) / 1000)
 | 
					                                await trio.sleep((ping_interval - 1000) / 1000)
 | 
				
			||||||
                                await ws.send_msg({'id': connect_id, 'type': 'ping'})
 | 
					                                await ws.send_msg({'id': connect_id, 'type': 'ping'})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        log.info(f'Starting ping task for {sym}')
 | 
				
			||||||
                        n.start_soon(ping_server)
 | 
					                        n.start_soon(ping_server)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        yield ws
 | 
					                        yield ws
 | 
				
			||||||
| 
						 | 
					@ -497,12 +495,13 @@ async def stream_quotes(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                # Spawn the ping task here
 | 
					                # Spawn the ping task here
 | 
				
			||||||
                async with open_ping_task(ws) as ws:
 | 
					                async with open_ping_task(ws) as ws:
 | 
				
			||||||
                    # subscribe to market feedz here
 | 
					                    tasks = []
 | 
				
			||||||
                    log.info(f'Subscribing to {kucoin_sym} feed')
 | 
					                    tasks.append(make_sub(kucoin_sym, connect_id, level='l3'))
 | 
				
			||||||
                    trade_sub = make_sub(kucoin_sym, connect_id, level='l3')
 | 
					                    tasks.append(make_sub(kucoin_sym, connect_id, level='l1'))
 | 
				
			||||||
                    l1_sub = make_sub(kucoin_sym, connect_id, level='l1')
 | 
					
 | 
				
			||||||
                    await ws.send_msg(trade_sub)
 | 
					                    for task in tasks:
 | 
				
			||||||
                    await ws.send_msg(l1_sub)
 | 
					                        log.info(f'Subscribing to {task.level} feed for {sym}')
 | 
				
			||||||
 | 
					                        await ws.send_msg(task)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    yield
 | 
					                    yield
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -547,6 +546,7 @@ def make_sub(sym, connect_id, level='l1') -> dict[str, str | bool]:
 | 
				
			||||||
                'privateChannel': False,
 | 
					                'privateChannel': False,
 | 
				
			||||||
                'response': True,
 | 
					                'response': True,
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        case 'l3':
 | 
					        case 'l3':
 | 
				
			||||||
            return {
 | 
					            return {
 | 
				
			||||||
                'id': connect_id,
 | 
					                'id': connect_id,
 | 
				
			||||||
| 
						 | 
					@ -555,8 +555,6 @@ def make_sub(sym, connect_id, level='l1') -> dict[str, str | bool]:
 | 
				
			||||||
                'privateChannel': False,
 | 
					                'privateChannel': False,
 | 
				
			||||||
                'response': True,
 | 
					                'response': True,
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        case _:
 | 
					 | 
				
			||||||
            return {}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async def stream_messages(ws: NoBsWs, sym: str) -> AsyncGenerator[NoBsWs, dict]:
 | 
					async def stream_messages(ws: NoBsWs, sym: str) -> AsyncGenerator[NoBsWs, dict]:
 | 
				
			||||||
| 
						 | 
					@ -630,6 +628,7 @@ async def open_history_client(
 | 
				
			||||||
    type: str = '1m',
 | 
					    type: str = '1m',
 | 
				
			||||||
) -> AsyncGenerator[Callable, None]:
 | 
					) -> AsyncGenerator[Callable, None]:
 | 
				
			||||||
    async with open_cached_client('kucoin') as client:
 | 
					    async with open_cached_client('kucoin') as client:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        log.info('Attempting to open kucoin history client')
 | 
					        log.info('Attempting to open kucoin history client')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        async def get_ohlc_history(
 | 
					        async def get_ohlc_history(
 | 
				
			||||||
| 
						 | 
					@ -637,6 +636,7 @@ async def open_history_client(
 | 
				
			||||||
            end_dt: datetime | None = None,
 | 
					            end_dt: datetime | None = None,
 | 
				
			||||||
            start_dt: datetime | None = None,
 | 
					            start_dt: datetime | None = None,
 | 
				
			||||||
        ) -> tuple[np.ndarray, datetime | None, datetime | None]:  # start  # end
 | 
					        ) -> tuple[np.ndarray, datetime | None, datetime | None]:  # start  # end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if timeframe != 60:
 | 
					            if timeframe != 60:
 | 
				
			||||||
                raise DataUnavailable('Only 1m bars are supported')
 | 
					                raise DataUnavailable('Only 1m bars are supported')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -647,6 +647,7 @@ async def open_history_client(
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            times = array['time']
 | 
					            times = array['time']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if end_dt is None:
 | 
					            if end_dt is None:
 | 
				
			||||||
                inow = round(time.time())
 | 
					                inow = round(time.time())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -656,13 +657,12 @@ async def open_history_client(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if (inow - times[-1]) > 60:
 | 
					                if (inow - times[-1]) > 60:
 | 
				
			||||||
                    await tractor.breakpoint()
 | 
					                    await tractor.breakpoint()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            start_dt = pendulum.from_timestamp(times[0])
 | 
					            start_dt = pendulum.from_timestamp(times[0])
 | 
				
			||||||
            end_dt = pendulum.from_timestamp(times[-1])
 | 
					            end_dt = pendulum.from_timestamp(times[-1])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            log.info('History succesfully fetched baby')
 | 
					            log.info('History succesfully fetched baby')
 | 
				
			||||||
            # breakpoint()
 | 
					
 | 
				
			||||||
            # print(f'OUTPUTTED END TIME: {time.ctime(kucoin_timestamp(end_dt))}')
 | 
					 | 
				
			||||||
            # print(f'OUTPUTTED START TIME: {time.ctime(kucoin_timestamp(start_dt))}')
 | 
					 | 
				
			||||||
            # print(f'DIFFERENCE IN MINUTES {(end_dt - start_dt).in_minutes()}')
 | 
					 | 
				
			||||||
            return array, start_dt, end_dt
 | 
					            return array, start_dt, end_dt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        yield get_ohlc_history, {}
 | 
					        yield get_ohlc_history, {}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue