You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

497 lines
22 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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, 51020150. 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, 51020
: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, 51020150. 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)