Administrator
2022-09-23 21d753614ea7bbe936b8560cbf466c4e438821b2
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# l2数据工具
# 比较时间的大小
import hashlib
import json
import time
 
import l2_data_manager
import tool
from log import logger_l2_trade, logger_l2_big_data
from trade_gui import async_call
 
 
def compare_time(time1, time2):
    result = int(time1.replace(":", "", 2)) - int(time2.replace(":", "", 2))
    return result
 
 
# 将key转为l2数据对象
def l2_data_key_2_obj(k, value):
    key = k.replace("l2-", "")
    split_data = key.split("-")
    code = split_data[0]
    operateType = split_data[1]
    time = split_data[2]
    num = split_data[3]
    price = split_data[4]
    limitPrice = split_data[5]
    cancelTime = split_data[6]
    cancelTimeUnit = split_data[7]
    item = {"operateType": operateType, "time": time, "num": num, "price": price, "limitPrice": limitPrice,
            "cancelTime": cancelTime, "cancelTimeUnit": cancelTimeUnit}
    json_value = json.loads(value)
    _data = {"key": key, "val": item, "re": json_value["re"], "index": int(json_value["index"])}
    return _data
 
 
# 将数据根据num-operate分类
def load_num_operate_map(local_today_num_operate_map, code, source_datas, clear=False):
    if local_today_num_operate_map.get(code) is None:
        local_today_num_operate_map[code] = {}
    if clear:
        local_today_num_operate_map[code] = {}
 
    for data in source_datas:
        key = "{}-{}-{}".format(data["val"]["num"], data["val"]["operateType"],data["val"]["price"])
        if local_today_num_operate_map[code].get(key) is None:
            local_today_num_operate_map[code].setdefault(key, [])
        local_today_num_operate_map[code].get(key).append(data)
 
 
# 减去时间
def __sub_time(time_str, seconds):
    time_seconds = get_time_as_seconds(time_str) - seconds
    h = time_seconds // 3600
    m = time_seconds % 3600 // 60
    s = time_seconds % 60
    return "{0:0>2}:{1:0>2}:{2:0>2}".format(h, m, s)
 
 
def get_time_as_seconds(time_str):
    times = time_str.split(":")
    time_seconds = int(times[0]) * 3600 + int(times[1]) * 60 + int(times[2])
    return time_seconds
 
 
# 计算时间的区间
def __compute_time_space_as_second(cancel_time, cancel_time_unit):
    __time = int(cancel_time)
    if int(cancel_time) == 0:
        return 0, 0
    unit = int(cancel_time_unit)
    if unit == 0:
        # 秒
        return __time, (__time + 1)
    elif unit == 1:
        # 分钟
        return __time * 60, (__time + 1) * 60
    elif unit == 2:
        # 小时
        return __time * 3600, (__time + 1) * 3600
 
 
# 根据买撤数据(与今日总的数据)计算买入数据
def get_buy_data_with_cancel_data(cancel_data, local_today_num_operate_map):
    # 计算时间区间
    min_space, max_space = __compute_time_space_as_second(cancel_data["val"]["cancelTime"],
                                                          cancel_data["val"]["cancelTimeUnit"])
    max_time = __sub_time(cancel_data["val"]["time"], min_space)
    min_time = __sub_time(cancel_data["val"]["time"], max_space)
    buy_datas = local_today_num_operate_map.get("{}-{}-{}".format(cancel_data["val"]["num"], "0",cancel_data["val"]["price"]))
    if buy_datas is None:
        # 无数据
        return None, None
    for i in range(0, len(buy_datas)):
        data = buy_datas[i]
        if int(data["val"]["operateType"]) != 0:
            continue
        if int(data["val"]["num"]) != int(cancel_data["val"]["num"]):
            continue
        if min_space == 0 and max_space == 0:
            if compare_time(data["val"]["time"], min_time) == 0:
                return data["index"], data
 
        elif compare_time(data["val"]["time"], min_time) > 0 and compare_time(data["val"]["time"], max_time) <= 0:
            return data["index"], data
    return None, None
 
 
__last_big_data = {}
 
 
@async_call
def save_big_data(code, same_time_nums, datas):
    return None
    latest_datas = __last_big_data.get(code)
    d1 = json.dumps(datas)
    d2 = json.dumps(latest_datas)
    if latest_datas is not None and d1.strip() == d2.strip():
        return None
    __last_big_data[code] = datas
    # 获取不一样的快照
    if latest_datas is not None:
        for i in range(len(d1)):
            if d1[i] != d2[i]:
                # 保存快照
                # logger_l2_big_data.debug("code:{} d1:{}  d2:{}", code, d1[i - 60: i + 30], d2[i - 60: i + 30])
                break
 
    for key in same_time_nums:
        if same_time_nums[key] > 20:
            redis = l2_data_manager._redisManager.getRedis()
            redis.setex("big_data-{}-{}".format(code, int(round(time.time() * 1000))), tool.get_expire(), d1)
            break
 
 
def test(datas):
    datas["code"] = "test"
 
 
if __name__ == "__main__":
    # cancel_data = {"val": {"operateType": 1, "num": 1520, "cancelTime": 1, "cancelTimeUnit": 1, "time": "09:32:30"}}
    # today_datas=[{"val": {"operateType": 1, "num": 1520, "cancelTime": 1, "cancelTimeUnit": 0, "time": "09:32:30"}},{"val": {"operateType": 0, "num": 1520, "cancelTime": 0, "cancelTimeUnit": 0, "time": "09:31:31"}}]
    # result= get_buy_data_with_cancel_data(cancel_data,today_datas)
    # print(result)
    code = "001209"
    l2_data_manager.load_l2_data(code)
    total_datas = l2_data_manager.local_today_datas[code]
    index, data = get_buy_data_with_cancel_data(total_datas[118], l2_data_manager.local_today_num_operate_map.get(code))
    print(index, data)