import json import random import time import authority import global_util import redis_manager import tool import juejin import data_process import decimal __redisManager = redis_manager.RedisManager(0) def set_gp_list(gpset): # 获取基本信息 code_datas = juejin.JueJinManager.get_gp_latest_info(gpset) codes = [] for _data in code_datas: # 正常的股票 if _data["sec_type"] == 1 and _data["sec_level"] == 1: code = _data["symbol"].split(".")[1] if code.find("30") != 0 and code.find("68") != 0: codes.append(code) redis_instance = __redisManager.getRedis() # 删除之前的 redis_instance.delete("gp_list") for d in codes: redis_instance.sadd("gp_list", d) # 涨停犁碑坳 def set_limit_up_list(gpset): # 保存到内存中 global_util.add_limit_up_codes(gpset) # 获取基本信息 redis_instance = __redisManager.getRedis() # 删除之前的 redis_instance.delete("gp_limit_up_list") for d in gpset: redis_instance.sadd("gp_limit_up_list", json.dumps(d)) redis_instance.expire("gp_limit_up_list", tool.get_expire()) redis_instance.setex("gp_limit_up_list_update_time",tool.get_expire(),round( time.time()*1000)) # 获取涨停列表 def get_limit_up_list(): redis_instance = __redisManager.getRedis() return redis_instance.get("gp_limit_up_list_update_time"), redis_instance.smembers("gp_limit_up_list") def rm_gp(code): redis_instance = __redisManager.getRedis() redis_instance.srem("gp_list", code) def is_in_gp_pool(code): redis_instance = __redisManager.getRedis() return redis_instance.sismember("gp_list", code) def get_gp_list(): redis_instance = __redisManager.getRedis() return redis_instance.smembers("gp_list") def get_gp_list_with_prefix(data=None): if data is None: data = get_gp_list() list = [] for d in data: if d[0:2] == '00': list.append("SZSE.{}".format(d)) elif d[0:2] == '60': list.append("SHSE.{}".format(d)) return list # 获取收盘价 def get_price_pre(code): redis_instance = __redisManager.getRedis() result = redis_instance.get("price-pre-{}".format(code)) if result is not None: return float(result) return None # 设置收盘价 def set_price_pre(code, price): codes= get_gp_list() if code not in codes: return redis_instance = __redisManager.getRedis() redis_instance.setex("price-pre-{}".format(code), tool.get_expire(), str(price)) # 获取涨停价 def get_limit_up_price(code): price = get_price_pre(code) if price is None: return None return tool.to_price(decimal.Decimal(str(price)) * decimal.Decimal("1.1")) # 获取跌停价 def get_limit_down_price(code): price = get_price_pre(code) if price is None: return None return tool.to_price(decimal.Decimal(str(price)) * decimal.Decimal("0.9")) # 获取现价 def get_price(code): redis_instance = __redisManager.getRedis() result = redis_instance.get("price-{}".format(code)) if result is not None: return float(result) return None # 设置现价 def set_price(code, price): redis_instance = __redisManager.getRedis() redis_instance.setex("price-{}".format(code), tool.get_expire(), price) # 获取正在监听的代码 def get_listen_codes(): redis_instance = __redisManager.getRedis() keys = redis_instance.keys("listen_code-*-*") codes = set() for k in keys: code = redis_instance.get(k) if code is not None and len(code) > 0: codes.add(code) return codes # 根据位置获取正在监听的代码 def get_listen_code_by_pos(client_id, pos): redis_instance = __redisManager.getRedis() key="listen_code-{}-{}".format(client_id, pos) value = redis_instance.get(key) # print("redis:", key,value) return value # 设置位置的监听代码 def set_listen_code_by_pos(client_id, pos, code): redis_instance = __redisManager.getRedis() redis_instance.setex("listen_code-{}-{}".format(client_id, pos), tool.get_expire(), code) # 初始化位置 def init_listen_code_by_pos(client_id, pos): redis_instance = __redisManager.getRedis() key = "listen_code-{}-{}".format(client_id, pos) redis_instance.setnx(key, "") redis_instance.expire(key, tool.get_expire()) # 获取可以操作的位置 def get_can_listen_pos(client_id=0): client_ids = [] if client_id <= 0: client_ids = data_process.getValidL2Clients() else: client_ids.append(client_id) random.shuffle(client_ids) for client_id in client_ids: redis_instance = __redisManager.getRedis() k = "listen_code-{}-*".format(client_id) keys = redis_instance.keys(k) random.shuffle(keys) codes = [] for key in keys: result = redis_instance.get(key) if result is None or len(result) == 0: return client_id, int(key.replace("listen_code-{}-".format(client_id), "")) else: codes.append((key, result)) # 查询是否有重复的代码 codes_set = set() count = 0; for code in codes: count = count + 1 codes_set.add(code[1]) if len(codes_set) < count: return client_id, int(code[0].replace("listen_code-{}-".format(client_id), "")) return None, None # 获取正在监听的代码的位置 def get_listen_code_pos(code): redis_instance = __redisManager.getRedis() keys = redis_instance.keys("listen_code-*-*") for key in keys: result = redis_instance.get(key) if result is not None and code == result: return key.split("-")[1], key.split("-")[2] return None, None # 是否正在监听 def is_listen(code): codes = get_listen_codes() return codes.__contains__(code) # 监听是否满了 def is_listen_full(): clients = data_process.getValidL2Clients() codes = get_listen_codes() return len(codes) >= 8*len(clients) # 是否正在操作 def is_operate(code): redis_instance = __redisManager.getRedis() return redis_instance.get("gp_operate-{}".format(code)) is not None # 设置正在操作的代码 def set_operate(code): redis_instance = __redisManager.getRedis() redis_instance.setex("gp_operate-{}".format(code), 30, "1") # 移除正在操作的代码 def rm_operate(code): redis_instance = __redisManager.getRedis() redis_instance.delete("gp_operate-{}".format(code)) if __name__ == '__main__': # print(get_can_listen_pos(0)) # print(get_listen_codes()) # print(is_listen_full()) # print(is_listen("002271")) # print(get_listen_code_pos("002272")) code= get_listen_code_by_pos(2, 7) print(code)