190 lines
7.2 KiB
Python
190 lines
7.2 KiB
Python
from google.protobuf import json_format
|
|
|
|
from tushare.subs.model.min import TsMin
|
|
from tushare.subs.model.tick import TsTick, TsTickIdx, TsTickOpt, TsTickFuture
|
|
|
|
datatype_map = {
|
|
"TICK": 1,
|
|
"TRANSACTION": 2,
|
|
"ORDER": 3,
|
|
"1MIN": 20,
|
|
"5MIN": 21,
|
|
"15MIN": 22,
|
|
"30MIN": 23,
|
|
"60MIN": 24,
|
|
"1DAY": 25,
|
|
"15SECOND": 26
|
|
}
|
|
datatype_map1 = {v: k for k, v in datatype_map.items()}
|
|
|
|
|
|
def _to_float(value):
|
|
try:
|
|
return float(value) / 10000
|
|
except:
|
|
return value
|
|
|
|
|
|
def recursive_to_price_float(data):
|
|
if isinstance(data, dict):
|
|
for k, v in data.items():
|
|
if k.endswith('Px'):
|
|
data[k] = _to_float(v)
|
|
elif k.endswith('PriceQueue'):
|
|
data[k] = [_to_float(v) for v in v]
|
|
elif isinstance(v, dict):
|
|
recursive_to_price_float(v)
|
|
|
|
|
|
def convert_ts_model(inst_data):
|
|
recursive_to_price_float(inst_data)
|
|
ts_inst = None
|
|
if 'MIN' in inst_data.get('marketDataType'):
|
|
ts_inst = convert_min_model(inst_data['marketDataType'].split('_')[-1].lower(), inst_data.get('mdKLine'))
|
|
elif '15S' in inst_data.get('marketDataType'):
|
|
ts_inst = convert_min_model(inst_data['marketDataType'].split('_')[-1].lower(), inst_data.get('mdKLine'))
|
|
elif 'TICK' in inst_data.get('marketDataType') and 'mdStock' in inst_data:
|
|
ts_inst = convert_tick_stock(inst_data.get('mdStock'))
|
|
elif 'TICK' in inst_data.get('marketDataType') and 'mdFund' in inst_data:
|
|
ts_inst = convert_tick_stock(inst_data.get('mdFund'))
|
|
elif 'TICK' in inst_data.get('marketDataType') and 'mdBond' in inst_data:
|
|
ts_inst = convert_tick_stock(inst_data.get('mdBond'))
|
|
elif 'TICK' in inst_data.get('marketDataType') and 'mdIndex' in inst_data:
|
|
ts_inst = convert_tick_index(inst_data.get('mdIndex'))
|
|
elif 'TICK' in inst_data.get('marketDataType') and 'mdOption' in inst_data:
|
|
ts_inst = convert_tick_option(inst_data.get('mdOption'))
|
|
|
|
return ts_inst and dict(ts_inst) or None
|
|
|
|
|
|
def convert_min_model(freq, md_kline) -> TsMin:
|
|
ds = str(md_kline.get('MDDate'))
|
|
ts = str(md_kline.get('MDTime'))
|
|
inst: TsMin = TsMin(
|
|
ts_code=md_kline.get('HTSCSecurityID'),
|
|
freq=freq,
|
|
trade_time=f'{ds[:4]}-{ds[4:6]}-{ds[6:]} {ts[:-7]}:{ts[-7:-5]}',
|
|
open=md_kline.get('OpenPx'),
|
|
close=md_kline.get('ClosePx'),
|
|
high=md_kline.get('HighPx'),
|
|
low=md_kline.get('LowPx'),
|
|
vol=md_kline.get('TotalVolumeTrade'),
|
|
amount=md_kline.get('TotalValueTrade'),
|
|
open_int=md_kline.get('KLineCategory', None)
|
|
)
|
|
return inst
|
|
|
|
|
|
def convert_tick_stock(md_stock) -> TsTick:
|
|
ds = str(md_stock.get('MDDate'))
|
|
ts = str(md_stock.get('MDTime'))
|
|
inst: TsTick = TsTick(
|
|
ts_code=md_stock.get('HTSCSecurityID'),
|
|
name='',
|
|
trade_time=f'{ds[:4]}-{ds[4:6]}-{ds[6:]} {ts[:-7]}:{ts[-7:-5]}:{ts[-5:-3]}',
|
|
pre_price=md_stock.get('PreClosePx'),
|
|
price=md_stock.get('LastPx'),
|
|
open=md_stock.get('OpenPx'),
|
|
high=md_stock.get('HighPx'),
|
|
low=md_stock.get('LowPx'),
|
|
close=md_stock.get('ClosePx'),
|
|
vol=md_stock.get('TotalVolumeTrade'),
|
|
amount=md_stock.get('TotalValueTrade'),
|
|
count=md_stock.get('NumTrades')
|
|
)
|
|
for i, v in enumerate(md_stock.get('SellPriceQueue')):
|
|
setattr(inst, f'ask_price{i+1}', v)
|
|
for i, v in enumerate(md_stock.get('SellOrderQtyQueue')):
|
|
setattr(inst, f'ask_volume{i+1}', v)
|
|
for i, v in enumerate(md_stock.get('BuyPriceQueue')):
|
|
setattr(inst, f'bid_price{i+1}', v)
|
|
for i, v in enumerate(md_stock.get('BuyOrderQtyQueue')):
|
|
setattr(inst, f'bid_volume{i+1}', v)
|
|
|
|
return inst
|
|
|
|
|
|
def convert_tick_index(md_index) -> TsTickIdx:
|
|
ds = str(md_index.get('MDDate'))
|
|
ts = str(md_index.get('MDTime'))
|
|
inst: TsTickIdx = TsTickIdx(
|
|
ts_code=md_index.get('HTSCSecurityID'),
|
|
name='',
|
|
trade_time=f'{ds[:4]}-{ds[4:6]}-{ds[6:]} {ts[:-7]}:{ts[-7:-5]}:{ts[-5:-3]}',
|
|
pre_close_price=md_index.get('PreClosePx'),
|
|
last_price=int(md_index.get('LastPx', 0)),
|
|
open_price=md_index.get('OpenPx'),
|
|
high_price=md_index.get('HighPx'),
|
|
low_price=md_index.get('LowPx'),
|
|
close_price=md_index.get('ClosePx'),
|
|
volume=md_index.get('TotalVolumeTrade'),
|
|
amount=md_index.get('TotalValueTrade')
|
|
)
|
|
return inst
|
|
|
|
|
|
def convert_tick_option(md_option) -> TsTickOpt:
|
|
ds = str(md_option.get('MDDate'))
|
|
ts = str(md_option.get('MDTime'))
|
|
inst: TsTickOpt = TsTickOpt(
|
|
ts_code=md_option.get('HTSCSecurityID'),
|
|
instrument_id='',
|
|
trade_time=f'{ds[:4]}-{ds[4:6]}-{ds[6:]} {ts[:-7]}:{ts[-7:-5]}:{ts[-5:-3]}',
|
|
pre_price=md_option.get('PreClosePx'),
|
|
price=md_option.get('LastPx'),
|
|
open=md_option.get('OpenPx'),
|
|
high=md_option.get('HighPx'),
|
|
low=md_option.get('LowPx'),
|
|
close=md_option.get('ClosePx'),
|
|
open_int=md_option.get('OpenInterest'),
|
|
vol=md_option.get('TotalVolumeTrade'),
|
|
amount=md_option.get('TotalValueTrade'),
|
|
num=md_option.get('NumTrades'),
|
|
ask_price1=md_option.get('BuyPriceQueue')[0],
|
|
ask_volume1=md_option.get('BuyOrderQtyQueue')[0],
|
|
bid_price1=md_option.get('SellPriceQueue')[0],
|
|
bid_volume1=md_option.get('SellOrderQtyQueue')[0],
|
|
pre_delta=md_option.get('PreDelta'),
|
|
curr_delta=md_option.get('CurrDelta'),
|
|
dif_price1=md_option.get('DiffPx1'),
|
|
dif_price2=md_option.get('DiffPx2'),
|
|
high_limit_price=md_option.get('MaxPx'),
|
|
low_limit_price=md_option.get('MinPx'),
|
|
refer_price=md_option.get('ReferencePx'),
|
|
)
|
|
return inst
|
|
|
|
|
|
def convert_tick_future(md_future) -> TsTickFuture:
|
|
ds = str(md_future.get('MDDate'))
|
|
ts = str(md_future.get('MDTime'))
|
|
inst: TsTickFuture = TsTickFuture(
|
|
ts_code=md_future.get('HTSCSecurityID'),
|
|
trade_time=f'{ds[:4]}-{ds[4:6]}-{ds[6:]} {ts[:-7]}:{ts[-7:-5]}:{ts[-5:-3]}',
|
|
pre_price=md_future.get('PreClosePx'),
|
|
price=md_future.get('LastPx'),
|
|
open=md_future.get('OpenPx'),
|
|
high=md_future.get('HighPx'),
|
|
low=md_future.get('LowPx'),
|
|
close=md_future.get('ClosePx'),
|
|
open_int=md_future.get('OpenInterest'),
|
|
vol=md_future.get('TotalVolumeTrade'),
|
|
amount=md_future.get('TotalValueTrade'),
|
|
num=md_future.get('NumTrades'),
|
|
ask_price1=md_future.get('BuyPriceQueue')[0],
|
|
ask_volume1=md_future.get('BuyOrderQtyQueue')[0],
|
|
bid_price1=md_future.get('SellPriceQueue')[0],
|
|
bid_volume1=md_future.get('SellOrderQtyQueue')[0],
|
|
pre_delta=md_future.get('PreDelta'),
|
|
curr_delta=md_future.get('CurrDelta'),
|
|
dif_price1=md_future.get('DiffPx1'),
|
|
dif_price2=md_future.get('DiffPx2'),
|
|
high_limit_price=md_future.get('MaxPx'),
|
|
low_limit_price=md_future.get('MinPx'),
|
|
refer_price=md_future.get('ReferencePx'),
|
|
pre_settle_price=md_future.get('PreSettlePrice'),
|
|
settle_price=md_future.get('SettlePrice'),
|
|
)
|
|
return inst
|
|
|