Administrator
2024-05-14 a99df93c160cd4feb4fb9ee076a49672c5ee0d02
成交队列输出
2个文件已修改
1个文件已添加
112 ■■■■■ 已修改文件
output/l2_output_util.py 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
output/output_util.py 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
trade/huaxin/huaxin_trade_server.py 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
output/l2_output_util.py
New file
@@ -0,0 +1,83 @@
"""
L2数据输出工具
"""
from l2 import l2_data_util, l2_data_source_util
from l2.l2_data_util import L2DataUtil, local_today_canceled_buyno_map
from l2.l2_transaction_data_manager import HuaXinBuyOrderManager
from l2.transaction_progress import TradeBuyQueue
def __get_trade_queue(code, start_index, end_index, real_place_order_index, max_count, step=1):
    fresults = []
    # 正在成交的数据
    dealing_info = HuaXinBuyOrderManager.get_dealing_order_info(code)
    total_datas = l2_data_util.local_today_datas.get(code)
    for i in range(start_index, end_index, step):
        data = total_datas[i]
        val = data['val']
        if not L2DataUtil.is_limit_up_price_buy(val):
            continue
        if val["num"] * float(val['price']) < 5000 and real_place_order_index != i:
            continue
        left_count = l2_data_source_util.L2DataSourceUtils.get_limit_up_buy_no_canceled_count_v2(code, i,
                                                                                                 total_datas,
                                                                                                 local_today_canceled_buyno_map.get(
                                                                                                     code))
        if left_count > 0:
            type_ = 0
            num = val['num']
            if dealing_info and str(total_datas[i]["val"]["orderNo"]) == str(
                    dealing_info[0]):
                # 减去当前正在成交的数据中已经成交了的数据
                num -= dealing_info[1] // 100
            if i == real_place_order_index:
                type_ = 1
            elif num * float(val['price']) >= 29900:
                type_ = 2
            fresults.append((val['num'], type_))
            if len(fresults) > max_count:
                break
    return fresults
def get_trade_queue_at_near_place_order(code, real_place_order_index, max_count):
    """
    获取真实下单位附近的成交队列
    @param code:
    @param real_place_order_index:
    @param max_count:
    @return:
    """
    total_datas = l2_data_util.local_today_datas.get(code)
    trade_index, is_default = TradeBuyQueue().get_traded_index(code)
    if trade_index is None:
        trade_index = 0
    threshold_before_count = max_count // 2
    fresults = __get_trade_queue(code, real_place_order_index, trade_index - 1,real_place_order_index, threshold_before_count, -1)
    fresults.reverse()
    fresults.extend(__get_trade_queue(code, real_place_order_index+1,  total_datas[-1]['index'] + 1, real_place_order_index, max_count - threshold_before_count, 1))
    return fresults
def get_trade_queue(code, real_place_order_index, max_count):
    """
    获取真实下单位附近的成交队列
    @param code:
    @param real_place_order_index:
    @param max_count:
    @return:
    """
    total_datas = l2_data_util.local_today_datas.get(code)
    trade_index, is_default = TradeBuyQueue().get_traded_index(code)
    if trade_index is None:
        trade_index = 0
    # 前面最多取5条数据
    fresults = []
    fresults.extend(__get_trade_queue(code, trade_index,  total_datas[-1]['index'] + 1,real_place_order_index,  max_count, 1))
    return fresults
output/output_util.py
@@ -1,5 +1,5 @@
import time
from l2 import l2_data_util
def money_desc(money):
    if abs(money) > 100000000:
@@ -12,3 +12,5 @@
    if timestamp:
        return time.strftime("%H:%M:%S", time.localtime(int(timestamp)))
    return ""
trade/huaxin/huaxin_trade_server.py
@@ -47,6 +47,7 @@
    hx_logger_l2_orderdetail, hx_logger_l2_transaction, hx_logger_l2_market_data, logger_l2_g_cancel, logger_debug, \
    logger_system, logger_trade, logger_trade_position_api_request, logger_request_api, \
    logger_local_huaxin_l1_trade_info, logger_real_place_order_position, logger_l2_trade_buy
from output import l2_output_util
from third_data import block_info, kpl_data_manager, kpl_util
from third_data.code_plate_key_manager import KPLCodeJXBlockManager, CodePlateKeyBuyManager
from third_data.history_k_data_util import JueJinApi, HistoryKDatasUtils
@@ -1377,6 +1378,7 @@
                            if int(c["direction"]) != huaxin_util.TORA_TSTP_D_Buy:
                                continue
                            code = c["securityID"]
                            orderSysID = c.get("orderSysID")
                            code_name = gpcode_manager.get_code_name(code)
                            # 获取下单位置信息
                            order_begin_pos = TradePointManager().get_buy_compute_start_data_cache(code)
@@ -1553,7 +1555,7 @@
                                            break
                            except:
                                pass
                            fdata = {"code_info": (code, code_name), "total_num": total_nums,
                            fdata = {"id":orderSysID, "code_info": (code, code_name), "total_num": total_nums,
                                     "finish_num": deal_or_cancel_num,
                                     "buy1_money": output_util.money_desc(buy1_money),
                                     "big_num_count": total_big_count,
@@ -1574,13 +1576,24 @@
                                         total_left_num * float(limit_up_price) * 100 * 100 / buy1_money, 2),  # 成交进度比例
                                     "limit_up_price": float(gpcode_manager.get_limit_up_price(code)),
                                     "is_near_big_order": is_near_big_order,
                                     "block": ''
                                     "block": '',
                                     "trade_queue": []
                                     }
                            # 获取当前板块
                            try:
                                can_buy_result = CodePlateKeyBuyManager.can_buy(code)
                                if can_buy_result and can_buy_result[0]:
                                    fdata['block'] = ",".join(can_buy_result[0])
                            except:
                                pass
                            try:
                                real_place_order_index = SCancelBigNumComputer().get_real_place_order_index_cache(code)
                                if real_place_order_index is not None:
                                    trade_queue = l2_output_util.get_trade_queue_at_near_place_order(code,
                                                                                                     real_place_order_index,
                                                                                                     11)
                                    fdata['trade_queue'] = trade_queue
                            except:
                                pass
                            fdatas.append(fdata)
@@ -1661,6 +1674,14 @@
                # 修复任务
                kpl_data_manager.PullTask.repaire_pull_task()
                self.send_response({"code": 0, "data": {}}, client_id, request_id)
            elif ctype == "get_trade_queue":
                code = data["code"]
                real_place_order_index = SCancelBigNumComputer().get_real_place_order_index_cache(code)
                if real_place_order_index is not None:
                    trade_queue = l2_output_util.get_trade_queue(code,real_place_order_index, 11)
                    self.send_response({"code": 0, "data": trade_queue}, client_id, request_id)
                else:
                    raise Exception("没获取到真实下单位")
        except Exception as e:
            logging.exception(e)
            self.send_response({"code": 1, "msg": f"数据处理出错:{e}"}, client_id, request_id)