Administrator
2024-12-24 e231e49fdbf1cc3c14b2da7738d7e049c45bfebe
trade/trade_strategy.py
@@ -25,7 +25,8 @@
from trade.huaxin_trade_record_manager import PositionManager, DelegateSellOrderManager
from trade.l2_data_manager import L2TransactionDataManager
from trade.sell_rule_manager import TradeRuleManager, SellRule
from utils import outside_api_command_manager, middle_api_protocol, tool, huaxin_util, socket_util, cb_data_util
from utils import outside_api_command_manager, middle_api_protocol, tool, huaxin_util, socket_util, cb_data_util, \
    kpl_data_manager
from utils.outside_api_command_manager import ActionCallback
import concurrent.futures
@@ -392,6 +393,35 @@
                else:
                    raise e
        elif ctype == "get_deal_queue":
            # 获取成交队列
            code = data["code"]
            try:
                fdata = {}
                # 获取已经成交的大单
                buy_order_info_list = L2TransactionDataManager().get_big_buy_orders(code)
                if buy_order_info_list is None:
                    buy_order_info_list = []
                MAX_COUNT = 50
                buy_order_info_list = buy_order_info_list[0 - MAX_COUNT:]
                # (类型,订单号,时间,量, 金额, 价格, 成交比例百分数)
                fdata["deal_list"] = [(0, x[0], l2_huaxin_util.convert_time(x[3]), x[1], x[2], str(x[4]), 100) for x in
                                      buy_order_info_list]
                dealing_buy_order_info = L2TransactionDataManager().get_dealing_buy_order(code)
                if dealing_buy_order_info:
                    buyno_map = local_today_buyno_map.get(code)
                    data = buyno_map.get(f"{dealing_buy_order_info[0]}")
                    if data:
                        # (类型, 订单号, 时间, 量, 金额, 价格, 成交比例百分数)
                        fdata["dealing"] = (0, dealing_buy_order_info[0], data["val"]["time"], data["val"]["num"] * 100,
                                            int(data["val"]["num"] * float(data["val"]["price"]) * 100),
                                            data["val"]["price"],
                                            int(round(dealing_buy_order_info[1] / data["val"]["num"])))
                self.send_response({"code": 0, "data": fdata}, client_id, request_id)
            except Exception as e:
                logger_debug.exception(e)
                raise e
class L1DataProcessor:
    # L1数据更新时间
@@ -577,6 +607,58 @@
            # L1DataProcessor.excute_sell_rule(code, buy1_info[3], buy1_info[1], "l2-real")
def __sell_for_last_day_break_limit_up():
    """
    卖前一天的炸板
    :return:
    """
    try:
        # 获取所有当前持仓
        codes = PositionManager.get_position_codes()
        yesterday_limit_up_codes = kpl_data_manager.KPLLimitUpDataManager().get_yesterday_limit_up_codes()
        for code in codes:
            if code in yesterday_limit_up_codes:
                # 昨日涨停
                continue
            # 获取当前价格
            price = L2DataProcessor.get_deal_price(code)
            if not price:
                continue
            pre_close_price = gpcode_manager.get_price_pre_cache(code)
            pre_close_price = round(float(pre_close_price), 2)
            rate = round((price - pre_close_price) * 100 / pre_close_price, 2)
            # 获取现有持仓
            avaiable_volume = PositionManager.get_code_volume_cache(code)
            orders = []
            big_orders = L2TransactionDataManager().get_big_buy_orders(code)
            if big_orders:
                for o in big_orders:
                    if o[2] >= 299e4:
                        orders.append(o)
            logger_debug.info("昨日炸板,今日开盘信息:代码-{},开盘价-【{}】,涨幅-【{}】,持仓-【{}】,成交大单数量-【{}】", code, price, rate, avaiable_volume,
                              len(orders))
            if rate <= -2:
                sell_volume_rate = 1
            elif rate <= 0:
                sell_volume_rate = 0.8
            elif rate <= 2:
                if len(orders) >= 1:
                    sell_volume_rate = 0.5
                else:
                    sell_volume_rate = 0.6
            else:
                if len(orders) >= 1:
                    sell_volume_rate = 0.4
                else:
                    sell_volume_rate = 0.6
            sell_volume = int(round((avaiable_volume // 100) * sell_volume_rate))
            logger_debug.info("昨日炸板,卖出信息:code-{},卖出比例-【{}】,卖出量-【{}】", sell_volume_rate, sell_volume)
    except Exception as e:
        logger_debug.exception(e)
# 做一些初始化的操作
def __init():
    def run_pending():
@@ -593,10 +675,13 @@
            time.sleep(10)
            huaxin_trade_data_update.add_position_list()
    l2_data_util.load_l2_data_all()
    # 定时持仓刷新
    schedule.every().day.at("09:00:00").do(huaxin_trade_data_update.add_position_list)
    schedule.every().day.at("09:10:00").do(huaxin_trade_data_update.add_position_list)
    schedule.every().day.at("09:15:00").do(huaxin_trade_data_update.add_position_list)
    schedule.every().day.at("09:26:00").do(__sell_for_last_day_break_limit_up)
    threading.Thread(target=run_pending, daemon=True).start()
    threading.Thread(target=request_position, daemon=True).start()