# l2数据工具
|
"""
|
L2数据处理工具包
|
"""
|
|
# 比较时间的大小
|
import json
|
import time
|
|
import l2_data_manager
|
import tool
|
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)
|