"""
|
代码价格管理
|
"""
|
import json
|
|
from db.redis_manager import RedisUtils
|
from utils import tool
|
from db import redis_manager
|
from log_module.log import logger_trade_queue_price_info
|
|
|
class Buy1PriceManager:
|
__redisManager = redis_manager.RedisManager(1)
|
__latest_data = {}
|
__current_buy_1_price = {}
|
__buy1_price_info_cache = {}
|
|
@classmethod
|
def __get_redis(cls):
|
return cls.__redisManager.getRedis()
|
|
# 保存买1价格信息
|
@classmethod
|
def __save_buy1_price_info(cls, code, limit_up_time, open_limit_up_time):
|
tool.CodeDataCacheUtil.set_cache(cls.__buy1_price_info_cache, code, (limit_up_time, open_limit_up_time))
|
RedisUtils.setex(cls.__get_redis(), f"buy1_price_limit_up_info-{code}", tool.get_expire(),
|
json.dumps((limit_up_time, open_limit_up_time)))
|
|
@classmethod
|
def __get_buy1_price_info(cls, code):
|
data = RedisUtils.get(cls.__get_redis(), f"buy1_price_limit_up_info-{code}")
|
if not data:
|
return None, None
|
data = json.loads(data)
|
return data[0], data[1]
|
|
@classmethod
|
def __get_buy1_price_info_cache(cls, code):
|
cache_result = tool.CodeDataCacheUtil.get_cache(cls.__buy1_price_info_cache, code)
|
if cache_result[0]:
|
return cache_result[1]
|
val = cls.__get_buy1_price_info(code)
|
tool.CodeDataCacheUtil.set_cache(cls.__buy1_price_info_cache, code, val)
|
return val
|
|
@classmethod
|
def __save_buy1_price(cls, code, buy_1_price):
|
cls.__current_buy_1_price[code] = buy_1_price
|
RedisUtils.setex(cls.__get_redis(), f"buy1_price-{code}", tool.get_expire(), buy_1_price)
|
|
@classmethod
|
def __get_buy1_price(cls, code):
|
return RedisUtils.get(cls.__get_redis(), f"buy1_price-{code}")
|
|
# 设置炸板后的最低价
|
@classmethod
|
def __save_open_limit_up_lowest_price(cls, code, price):
|
RedisUtils.setex(cls.__get_redis(), f"open_limit_up_lowest_price-{code}", tool.get_expire(), f"{price}")
|
|
@classmethod
|
def __get_open_limit_up_lowest_price(cls, code):
|
return RedisUtils.get(cls.__get_redis(), f"open_limit_up_lowest_price-{code}")
|
|
@classmethod
|
def set_open_limit_up_lowest_price(cls, code, price):
|
old_price = cls.__get_open_limit_up_lowest_price(code)
|
if not old_price or float(old_price) - float(price) > 0.001:
|
cls.__save_open_limit_up_lowest_price(code, price)
|
|
@classmethod
|
def get_buy1_price(cls, code):
|
if code in cls.__current_buy_1_price:
|
return cls.__current_buy_1_price.get(code)
|
return cls.__get_buy1_price(code)
|
|
@classmethod
|
def get_open_limit_up_lowest_price(cls, code):
|
price = cls.__get_open_limit_up_lowest_price(code)
|
return price
|
|
# 处理
|
@classmethod
|
def process(cls, code, buy_1_price, time_str, limit_up_price, sell_1_price, sell_1_volumn):
|
data_str = f"{buy_1_price},{time_str},{limit_up_price},{sell_1_price},{sell_1_volumn}"
|
if cls.__latest_data.get(code) == data_str:
|
return
|
cls.__latest_data[code] = data_str
|
# 保存买1价格
|
cls.__save_buy1_price(code, buy_1_price)
|
|
# 记录日志
|
logger_trade_queue_price_info.info(
|
f"code={code} data: time_str-{time_str}, buy_1_price-{buy_1_price},limit_up_price-{limit_up_price},sell_1_price-{sell_1_price},sell_1_volumn-{sell_1_volumn}")
|
# 买1价格不能小于1块
|
if float(buy_1_price) < 1.0:
|
return
|
|
is_limit_up = abs(float(limit_up_price) - float(buy_1_price)) < 0.01
|
old_limit_up_time, old_open_limit_up_time = cls.__get_buy1_price_info_cache(code)
|
if old_limit_up_time and old_open_limit_up_time:
|
return
|
if is_limit_up and old_limit_up_time is None and float(sell_1_price) < 0.1 and int(sell_1_volumn) <= 0:
|
# 卖1消失,买1为涨停价则表示涨停
|
cls.__save_buy1_price_info(code, time_str, None)
|
elif old_limit_up_time and not is_limit_up and old_open_limit_up_time is None:
|
# 有涨停时间,当前没有涨停,之前没有打开涨停
|
cls.__save_buy1_price_info(code, old_limit_up_time, time_str)
|
|
if old_limit_up_time and not is_limit_up:
|
# 之前涨停过且现在尚未涨停
|
cls.set_open_limit_up_lowest_price(code, buy_1_price)
|
|
# 是否可以下单
|
@classmethod
|
def is_can_buy(cls, code):
|
old_limit_up_time, old_open_limit_up_time = cls.__get_buy1_price_info_cache(code)
|
if old_limit_up_time and old_open_limit_up_time:
|
return True
|
return False
|
|
# 获取涨停信息
|
# 返回涨停时间与炸板时间
|
@classmethod
|
def get_limit_up_info(cls, code):
|
old_limit_up_time, old_open_limit_up_time = cls.__get_buy1_price_info_cache(code)
|
return old_limit_up_time, old_open_limit_up_time
|
|
# 设置涨停时间
|
@classmethod
|
def set_limit_up_time(cls, code, time_str):
|
limit_up_time, open_limit_up_time = cls.get_limit_up_info(code)
|
if limit_up_time is None:
|
cls.__save_buy1_price_info(code, time_str, None)
|
|
|
if __name__ == "__main__":
|
print(Buy1PriceManager.get_limit_up_info("002777"))
|