from huobi.constant import * from huobi.model.market import * from huobi.utils import * from huobi.utils.input_checker import check_in_list class MarketClient(object): def __init__(self, **kwargs): """ Create the request client instance. :param kwargs: The option of request connection. api_key: The public key applied from Huobi. secret_key: The private key applied from Huobi. url: The URL name like "https://api.huobi.pro". init_log: to init logger """ self.__kwargs = kwargs def get_candlestick(self, symbol, period, size=200): """ Get the candlestick/kline for the specified symbol. The data number is 150 as default. :param symbol: The symbol, like "btcusdt". To query hb10, put "hb10" at here. (mandatory) :param period: The candlestick/kline interval, MIN1, MIN5, DAY1 etc. (mandatory) :param size: The start time of of requested candlestick/kline data. (optional) :return: The list of candlestick/kline data. """ check_symbol(symbol) check_should_not_none(period, "period") check_range(size, 1, 2000, "size") params = { "symbol": symbol, "period": period, "size": size } from huobi.service.market.get_candlestick import GetCandleStickService return GetCandleStickService(params).request(**self.__kwargs) def sub_candlestick(self, symbols: 'str', interval: 'CandlestickInterval', callback, error_handler): """ Subscribe candlestick/kline event. If the candlestick/kline is updated, server will send the data to client and onReceive in callback will be called. :param symbols: The symbols, like "btcusdt". Use comma to separate multi symbols, like "btcusdt,ethusdt". :param interval: The candlestick/kline interval, MIN1, MIN5, DAY1 etc. :param callback: The implementation is required. onReceive will be called if receive server's update. example: def callback(candlestick_event: 'CandlestickEvent'): pass :param error_handler: The error handler will be called if subscription failed or error happen between client and Huobi server example: def error_handler(exception: 'HuobiApiException') pass :return: No return """ symbol_list = symbols.split(",") check_symbol_list(symbol_list) check_should_not_none(interval, "interval") check_should_not_none(callback, "callback") params = { "symbol_list": symbol_list, "interval": interval, } from huobi.service.market.sub_candlestick import SubCandleStickService SubCandleStickService(params).subscribe(callback, error_handler, **self.__kwargs) def req_candlestick(self, symbols: 'str', interval: 'CandlestickInterval', callback, from_ts_second=None, end_ts_second=None, error_handler=None): """ Subscribe candlestick/kline event. If the candlestick/kline is updated, server will send the data to client and onReceive in callback will be called. :param symbols: The symbols, like "btcusdt". Use comma to separate multi symbols, like "btcusdt,ethusdt". :param interval: The candlestick/kline interval, MIN1, MIN5, DAY1 etc. :param callback: The implementation is required. onReceive will be called if receive server's update. example: def callback(candlestick_event: 'CandlestickEvent'): pass :param from_ts_second : data from timestamp [it's second] :param end_ts_second : data util timestamp [it's second] :param error_handler: The error handler will be called if subscription failed or error happen between client and Huobi server example: def error_handler(exception: 'HuobiApiException') pass :return: No return """ symbol_list = symbols.split(",") check_symbol_list(symbol_list) check_should_not_none(interval, "interval") check_should_not_none(callback, "callback") params = { "symbol_list": symbol_list, "interval": interval, "from_ts_second": from_ts_second, "end_ts_second": end_ts_second } from huobi.service.market.req_candlestick import ReqCandleStickService ReqCandleStickService(params).subscribe(callback, error_handler, **self.__kwargs) def get_pricedepth(self, symbol: 'str', depth_type: 'str', depth_size: 'int' = None) -> PriceDepth: """ Get the Market Depth of a symbol. :param symbol: The symbol, like "btcusdt". (mandatory) :param depth_type: The tpye, like "step0" to "step5". (mandatory) :param depth_size(optional): The maximum number of Market Depth step0 requested. range [1 - 150], default is 150 The maximum number of Market Depth step1,step2,step3,step4,step5 requested. size is in [5, 10, 20], default is 20. :return: Market Depth data. """ check_symbol(symbol) check_in_list(depth_type, [DepthStep.STEP0, DepthStep.STEP1, DepthStep.STEP2, DepthStep.STEP3, DepthStep.STEP4, DepthStep.STEP5], "depth_type") params = { "symbol": symbol, "type": depth_type, # "depth": depth_size } from huobi.service.market.get_pricedepth import GetPriceDepthService ret_data = GetPriceDepthService(params).request(**self.__kwargs) if depth_size is not None: if (ret_data.bids is not None) and (len(ret_data.bids) > depth_size): ret_data.bids = ret_data.bids[0:depth_size] if (ret_data.asks is not None) and (len(ret_data.asks) > depth_size): ret_data.asks = ret_data.asks[0:depth_size] return ret_data @staticmethod def get_depth_step_list(): return [DepthStep.STEP0, DepthStep.STEP1, DepthStep.STEP2, DepthStep.STEP3, DepthStep.STEP4, DepthStep.STEP5] @staticmethod def get_valid_depth_step(value, defalut_value): step_list = MarketClient.get_depth_step_list() if value in step_list: return value else: return defalut_value def sub_pricedepth(self, symbols: 'str', depth_step: 'str', callback, error_handler=None): """ Subscribe price depth event. If the price depth is updated, server will send the data to client and onReceive in callback will be called. :param symbols: The symbols, like "btcusdt". Use comma to separate multi symbols, like "btcusdt,ethusdt". :param depth_step: The depth precision, string from step0 to step5. :param callback: The implementation is required. onReceive will be called if receive server's update. example: def callback(price_depth_event: 'PriceDepthEvent'): pass :param error_handler: The error handler will be called if subscription failed or error happen between client and Huobi server example: def error_handler(exception: 'HuobiApiException') pass :return: No return """ symbol_list = symbols.split(",") check_symbol_list(symbol_list) new_step = MarketClient.get_valid_depth_step(value=depth_step, defalut_value=DepthStep.STEP0) check_should_not_none(callback, "callback") params = { "symbol_list": symbol_list, "step": new_step, } from huobi.service.market.sub_pricedepth import SubPriceDepthService SubPriceDepthService(params).subscribe(callback, error_handler, **self.__kwargs) def sub_pricedepth_bbo(self, symbols: 'str', callback, error_handler=None): """ Subscribe price depth event. If the price depth is updated, server will send the data to client and onReceive in callback will be called. :param symbols: The symbols, like "btcusdt". Use comma to separate multi symbols, like "btcusdt,ethusdt". :param callback: The implementation is required. onReceive will be called if receive server's update. example: def callback(price_depth_event: 'PriceDepthEvent'): pass :param error_handler: The error handler will be called if subscription failed or error happen between client and Huobi server example: def error_handler(exception: 'HuobiApiException') pass :return: No return """ symbol_list = symbols.split(",") check_symbol_list(symbol_list) check_should_not_none(callback, "callback") params = { "symbol_list": symbol_list, } from huobi.service.market.sub_pricedepth_bbo import SubPriceDepthBboService SubPriceDepthBboService(params).subscribe(callback, error_handler, **self.__kwargs) def req_pricedepth(self, symbols: 'str', depth_step: 'str', callback, error_handler=None): """ Subscribe price depth event. If the price depth is updated, server will send the data to client and onReceive in callback will be called. :param symbols: The symbols, like "btcusdt". Use comma to separate multi symbols, like "btcusdt,ethusdt". :param depth_step: The depth precision, string from step0 to step5. :param callback: The implementation is required. onReceive will be called if receive server's update. example: def callback(price_depth_event: 'PriceDepthEvent'): pass :param error_handler: The error handler will be called if subscription failed or error happen between client and Huobi server example: def error_handler(exception: 'HuobiApiException') pass :return: No return """ symbol_list = symbols.split(",") check_symbol_list(symbol_list) new_step = MarketClient.get_valid_depth_step(value=depth_step, defalut_value=DepthStep.STEP0) check_should_not_none(callback, "callback") params = { "symbol_list": symbol_list, "step": new_step, } from huobi.service.market.req_pricedepth import ReqPriceDepthService ReqPriceDepthService(params).subscribe(callback, error_handler, **self.__kwargs) def get_market_detail(self, symbol: 'str') -> MarketDetail: """ Get trade statistics in 24 hours. :param symbol: The symbol, like "btcusdt". (mandatory) :return: Trade statistics. """ check_symbol(symbol) params = { "symbol": symbol, } from huobi.service.market.get_market_detail import GetMarketDetailService return GetMarketDetailService(params).request(**self.__kwargs) def sub_market_detail(self, symbols: 'str', callback, error_handler=None): """ Subscribe 24 hours trade statistics event. If statistics is generated, server will send the data to client and onReceive in callback will be called. :param symbols: The symbols, like "btcusdt". Use comma to separate multi symbols, like "btcusdt,ethusdt". :param callback: The implementation is required. onReceive will be called if receive server's update. example: def callback(trade_statistics_event: 'TradeStatisticsEvent'): pass :param error_handler: The error handler will be called if subscription failed or error happen between client and Huobi server example: def error_handler(exception: 'HuobiApiException') pass :return: No return """ symbol_list = symbols.split(",") check_symbol_list(symbol_list) check_should_not_none(callback, "callback") params = { "symbol_list": symbol_list, } from huobi.service.market.sub_market_detail import SubMarketDetailService SubMarketDetailService(params).subscribe(callback, error_handler, **self.__kwargs) def req_market_detail(self, symbols: 'str', callback, error_handler=None): """ Subscribe 24 hours trade statistics event. If statistics is generated, server will send the data to client and onReceive in callback will be called. :param symbols: The symbols, like "btcusdt". Use comma to separate multi symbols, like "btcusdt,ethusdt". :param callback: The implementation is required. onReceive will be called if receive server's update. example: def callback(trade_statistics_event: 'TradeStatisticsEvent'): pass :param error_handler: The error handler will be called if subscription failed or error happen between client and Huobi server example: def error_handler(exception: 'HuobiApiException') pass :return: No return """ symbol_list = symbols.split(",") check_symbol_list(symbol_list) check_should_not_none(callback, "callback") params = { "symbol_list": symbol_list, } from huobi.service.market.req_market_detail import ReqMarketDetailService ReqMarketDetailService(params).subscribe(callback, error_handler, **self.__kwargs) def get_market_trade(self, symbol: 'str') -> list: """ Get the most recent trades with their price, volume and direction. :param symbol: The symbol, like "btcusdt". (mandatory) :return: The list of trade. """ check_symbol(symbol) params = { "symbol": symbol, } from huobi.service.market.get_market_trade import GetMarketTradeService return GetMarketTradeService(params).request(**self.__kwargs) def get_history_trade(self, symbol: 'str', size: 'int' = None) -> list: """ Get the most recent trades with their price, volume and direction. :param symbol: The symbol, like "btcusdt". (mandatory) :param size: The number of historical trade requested, range [1 - 2000] (optional) :return: The list of trade. """ check_symbol(symbol) check_range(size, 1, 2000, "size") params = { "symbol": symbol, "size": size } from huobi.service.market.get_history_trade import GetHistoryTradeService return GetHistoryTradeService(params).request(**self.__kwargs) def sub_trade_detail(self, symbols: 'str', callback, error_handler=None): """ Subscribe price depth event. If the price depth is updated, server will send the data to client and onReceive in callback will be called. :param symbols: The symbols, like "btcusdt". Use comma to separate multi symbols, like "btcusdt,ethusdt". :param callback: The implementation is required. onReceive will be called if receive server's update. example: def callback(trade_event: 'TradeEvent'): pass :param error_handler: The error handler will be called if subscription failed or error happen between client and Huobi server example: def error_handler(exception: 'HuobiApiException') pass :return: No return """ symbol_list = symbols.split(",") check_symbol_list(symbol_list) check_should_not_none(callback, "callback") params = { "symbol_list": symbol_list, } from huobi.service.market.sub_trade_detail import SubTradeDetailService SubTradeDetailService(params).subscribe(callback, error_handler, **self.__kwargs) def req_trade_detail(self, symbols: 'str', callback, error_handler=None): """ Subscribe price depth event. If the price depth is updated, server will send the data to client and onReceive in callback will be called. :param symbols: The symbols, like "btcusdt". Use comma to separate multi symbols, like "btcusdt,ethusdt". :param callback: The implementation is required. onReceive will be called if receive server's update. example: def callback(trade_event: 'TradeEvent'): pass :param error_handler: The error handler will be called if subscription failed or error happen between client and Huobi server example: def error_handler(exception: 'HuobiApiException') pass :return: No return """ symbol_list = symbols.split(",") check_symbol_list(symbol_list) check_should_not_none(callback, "callback") params = { "symbol_list": symbol_list, } from huobi.service.market.req_trade_detail import ReqTradeDetailService ReqTradeDetailService(params).subscribe(callback, error_handler, **self.__kwargs) def get_market_detail_merged(self, symbol): check_symbol(symbol) params = { "symbol": symbol } from huobi.service.market.get_market_detail_merged import GetMarketDetailMergedService return GetMarketDetailMergedService(params).request(**self.__kwargs) def get_market_tickers(self) -> list: """ get market tickers :return: market ticker list. """ params = {} from huobi.service.market.get_market_tickers import GetMarketTickersService return GetMarketTickersService(params).request(**self.__kwargs) """ increase mbp(market by price) """ def sub_mbp_increase(self, symbols: 'str', levels: 'int', callback, error_handler=None): """ Subscribe mbp event. If the mbp is updated, server will send the data to client and onReceive in callback will be called. :param symbols: The symbols, like "btcusdt". Use comma to separate multi symbols, like "btcusdt,ethusdt". :param levels: level, 5,10,20,150. current only support 150 :param callback: The implementation is required. onReceive will be called if receive server's update. example: def callback(price_depth_event: 'PriceDepthEvent'): pass :param error_handler: The error handler will be called if subscription failed or error happen between client and Huobi server example: def error_handler(exception: 'HuobiApiException') pass :return: No return """ check_should_not_none(symbols, "symbol") symbol_list = symbols.split(",") check_symbol_list(symbol_list) check_should_not_none(levels, "levels") check_should_not_none(callback, "callback") params = { "symbol_list": symbol_list, "levels": levels } from huobi.service.market.sub_mbp_increase import SubMbpIncreaseService SubMbpIncreaseService(params).subscribe(callback, error_handler, **self.__kwargs) """ subscribe full mbp(market by price) """ def sub_mbp_full(self, symbols: 'str', levels: 'int', callback, error_handler=None): """ Subscribe full mbp event. If the mbp is updated, server will send the data to client and onReceive in callback will be called. :param symbols: The symbols, like "btcusdt". Use comma to separate multi symbols, like "btcusdt,ethusdt". :param levels: level, 5,10,20 :param callback: The implementation is required. onReceive will be called if receive server's update. example: def callback(price_depth_event: 'PriceDepthEvent'): pass :param error_handler: The error handler will be called if subscription failed or error happen between client and Huobi server example: def error_handler(exception: 'HuobiApiException') pass :return: No return """ check_should_not_none(symbols, "symbol") symbol_list = symbols.split(",") check_symbol_list(symbol_list) check_should_not_none(levels, "levels") check_in_list(levels, [MbpLevel.MBP5, MbpLevel.MBP10, MbpLevel.MBP20], "levels") check_should_not_none(callback, "callback") params = { "symbol_list": symbol_list, "levels": levels } from huobi.service.market.sub_mbp_full import SubMbpFullService SubMbpFullService(params).subscribe(callback, error_handler, **self.__kwargs) def req_mbp(self, symbols: 'str', levels: 'int', callback, auto_close=True, error_handler=None): """ Subscribe mbp event. If the mbp is updated, server will send the data to client and onReceive in callback will be called. :param symbols: The symbols, like "btcusdt". Use comma to separate multi symbols, like "btcusdt,ethusdt". :param levels: level, 5,10,20,150. current only support 150 :param callback: The implementation is required. onReceive will be called if receive server's update. example: def callback(price_depth_event: 'PriceDepthEvent'): pass :param auto_close : close websocket connection after get data :param error_handler: The error handler will be called if subscription failed or error happen between client and Huobi server example: def error_handler(exception: 'HuobiApiException') pass :return: No return """ check_should_not_none(symbols, "symbol") symbol_list = symbols.split(",") check_symbol_list(symbol_list) check_should_not_none(levels, "levels") check_should_not_none(callback, "callback") params = { "symbol_list": symbol_list, "levels": levels } from huobi.service.market.req_mbp import ReqMbpService ReqMbpService(params).subscribe(callback, error_handler, **self.__kwargs)