"""
|
成交大单管理
|
"""
|
import json
|
|
from db.redis_manager import RedisUtils
|
from utils import tool
|
from db import redis_manager
|
from l2 import l2_data_util, l2_data_source_util
|
|
__last_progress = {}
|
__redisManager = redis_manager.RedisManager(2)
|
|
|
def __get_redis():
|
return __redisManager.getRedis()
|
|
|
def __get_cancel_data(code, buy_data, local_today_num_operate_map):
|
val = buy_data['val']
|
cancel_datas = local_today_num_operate_map.get(
|
"{}-{}-{}".format(val["num"], "1", val["price"]))
|
if cancel_datas:
|
for cancel_data in cancel_datas:
|
buy_index = l2_data_source_util.L2DataSourceUtils.get_buy_index_with_cancel_data(code, cancel_data,
|
local_today_num_operate_map)
|
if buy_index == buy_data["index"]:
|
return cancel_data
|
return None
|
|
|
def __save_traded_index(code, index):
|
RedisUtils.sadd(__get_redis(), f"deal_indexes-{code}", index)
|
RedisUtils.expire(__get_redis(), f"deal_indexes-{code}", tool.get_expire())
|
|
|
def __get_traded_indexes(code):
|
return RedisUtils.smembers(__get_redis(), f"deal_indexes-{code}")
|
|
|
# 获取成交的索引
|
def get_traded_indexes(code):
|
return __get_traded_indexes(code)
|
|
|
__deal_compute_progress_cache = {}
|
|
|
# 获取成交计算进度
|
def __get_deal_compute_progress(code):
|
val = RedisUtils.get(__get_redis(), f"deal_compute_info-{code}")
|
if val is None:
|
return -1, 0
|
val = json.loads(val)
|
return val[0], val[1]
|
|
|
# 获取成交计算进度
|
def __get_deal_compute_progress_cache(code):
|
cache_result = tool.CodeDataCacheUtil.get_cache(__deal_compute_progress_cache, code)
|
if cache_result[0]:
|
return cache_result[1]
|
val = __get_deal_compute_progress(code)
|
tool.CodeDataCacheUtil.set_cache(__deal_compute_progress_cache, code, val)
|
return val
|
|
|
# 设置成交进度
|
def __set_deal_compute_progress(code, index, money):
|
tool.CodeDataCacheUtil.set_cache(__deal_compute_progress_cache, code, (index, money))
|
RedisUtils.setex(__get_redis(), f"deal_compute_info-{code}", tool.get_expire(), json.dumps((index, money)))
|
|
|
# 设置成交进度
|
def set_trade_progress(code, progress, total_data, local_today_num_operate_map):
|
if __last_progress.get(code) == progress:
|
return
|
__last_progress[code] = progress
|
# 计算从开始位置到成交位置
|
c_index, deal_num = __get_deal_compute_progress_cache(code)
|
process_index = c_index
|
for i in range(c_index + 1, progress):
|
data = total_data[i]
|
val = data['val']
|
process_index = i
|
# 是否有大单
|
if not l2_data_util.is_big_money(val):
|
continue
|
if l2_data_util.L2DataUtil.is_limit_up_price_buy(val):
|
# 是否已经取消
|
cancel_data = __get_cancel_data(code, data, local_today_num_operate_map)
|
if cancel_data is None:
|
deal_num += val["num"] * data["re"]
|
__save_traded_index(code, data["index"])
|
|
__set_deal_compute_progress(code, process_index, deal_num)
|
|
|
def get_deal_big_money_num(code):
|
if code in __deal_compute_progress_cache:
|
return __deal_compute_progress_cache.get(code)[1]
|
compute_index, num = __get_deal_compute_progress_cache(code)
|
return num
|