# 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): 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)