Administrator
2023-08-04 b79f40afbe849f56f7c2db94e9bcebf3f5e92ec6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
"""
成交大单管理
"""
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