"""
|
现价处理器
|
"""
|
# 获取到现价
|
import decimal
|
import logging
|
|
import client_manager
|
import constant
|
import gpcode_manager
|
import tool
|
from l2_code_operate import L2CodeOperate
|
from trade import trade_manager, trade_gui, l2_trade_util
|
from trade.trade_data_manager import CodeActualPriceProcessor
|
|
__actualPriceProcessor = CodeActualPriceProcessor()
|
|
|
def accept_prices(prices):
|
# 获取首板代码
|
first_codes = gpcode_manager.get_first_gp_codes()
|
|
print("价格代码数量:", len(prices))
|
|
__actualPriceProcessor.save_current_price_codes_count(len(prices))
|
# 采集的代码数量不对
|
if len(gpcode_manager.get_gp_list()) - len(prices) > 10:
|
return
|
now_str = tool.get_now_time_str()
|
now_strs = now_str.split(":")
|
if True:
|
_code_list = []
|
_delete_list = []
|
for d in prices:
|
code, price = d["code"], float(d["price"])
|
gpcode_manager.set_price(code, price)
|
# 获取收盘价
|
pricePre = gpcode_manager.get_price_pre(code)
|
if pricePre is not None:
|
rate = round((price - pricePre) * 100 / pricePre, 2)
|
if first_codes and code in first_codes:
|
rate = rate / 2
|
if rate >= 0 and not trade_manager.ForbiddenBuyCodeByScoreManager.is_in(code):
|
# 暂存涨幅为正的代码
|
_code_list.append((rate, code))
|
else:
|
# 暂存涨幅为负的代码
|
_delete_list.append((rate, code))
|
try:
|
__actualPriceProcessor.process_rate(code, rate, now_str)
|
except Exception as e:
|
logging.exception(e)
|
|
try:
|
__actualPriceProcessor.save_current_price(code, price,
|
gpcode_manager.get_limit_up_price_by_preprice(
|
pricePre) == tool.to_price(
|
decimal.Decimal(d["price"])))
|
except Exception as e:
|
logging.exception(e)
|
|
# -------------------------------处理交易位置分配---------------------------------
|
# 排序
|
new_code_list = sorted(_code_list, key=lambda e: (e.__getitem__(0), e.__getitem__(1)), reverse=True)
|
# 预填充下单代码
|
_buy_win_codes = []
|
for d in new_code_list:
|
_buy_win_codes.append(d[1])
|
for d in _delete_list:
|
_buy_win_codes.append(d[1])
|
try:
|
trade_gui.THSBuyWinManagerNew.fill_codes(_buy_win_codes)
|
except Exception as e:
|
logging.exception(e)
|
pass
|
|
# -------------------------------处理L2监听---------------------------------
|
|
client_ids = client_manager.getValidL2Clients()
|
# 最多填充的代码数量
|
max_count = len(client_ids) * constant.L2_CODE_COUNT_PER_DEVICE
|
if max_count == 0:
|
max_count = constant.L2_CODE_COUNT_PER_DEVICE
|
|
_delete_list = []
|
for item in new_code_list:
|
if l2_trade_util.is_in_forbidden_trade_codes(item[1]) or item[0] < 0:
|
_delete_list.append(item)
|
|
for item in _delete_list:
|
new_code_list.remove(item)
|
# 截取前几个代码填充
|
add_list = new_code_list[:max_count]
|
# 后面的代码全部删除
|
_delete_list.extend(new_code_list[max_count:])
|
|
add_code_list = []
|
del_code_list = []
|
for d in add_list:
|
add_code_list.append(d[1])
|
|
for d in _delete_list:
|
del_code_list.append(d[1])
|
|
# 后面的代码数量
|
# 先删除应该删除的代码
|
for code in del_code_list:
|
if gpcode_manager.is_listen_old(code):
|
# 判断是否在监听里面
|
L2CodeOperate.get_instance().add_operate(0, code, "现价变化")
|
# 增加应该增加的代码
|
for code in add_code_list:
|
if not gpcode_manager.is_listen_old(code):
|
L2CodeOperate.get_instance().add_operate(1, code, "现价变化")
|
|
# 获取卡位数量
|
free_count = gpcode_manager.get_free_listen_pos_count()
|
if free_count < 2:
|
# 空闲位置不足
|
listen_codes = gpcode_manager.get_listen_codes()
|
for code in listen_codes:
|
if not gpcode_manager.is_in_gp_pool(code):
|
client_id, pos = gpcode_manager.get_listen_code_pos(code)
|
gpcode_manager.set_listen_code_by_pos(client_id, pos, "")
|
free_count += 1
|
if free_count > 2:
|
break
|
|
print(add_code_list, del_code_list)
|