Administrator
5 天以前 a2dc7b4f0ff68f8ea87b1d5c32539dbe0961a4b4
api/outside_api_command_callback.py
@@ -14,12 +14,13 @@
import constant
import inited_data
import outside_api_command_manager
from cancel_strategy.s_l_h_cancel_strategy import SCancelBigNumComputer, LCancelRateManager
from code_attribute import gpcode_manager, code_volumn_manager, zyltgb_util
from cancel_strategy.s_l_h_cancel_strategy import SCancelBigNumComputer, LCancelRateManager, \
    CancelRateHumanSettingManager, LCancelBigNumComputer, LDownCancelWatchIndexStatisticManager
from code_attribute import gpcode_manager, code_volumn_manager, zyltgb_util, code_nature_analyse
from code_attribute.code_data_util import ZYLTGBUtil
from code_attribute.code_l1_data_manager import L1DataManager
from code_attribute.gpcode_manager import CodePrePriceManager, CodesNameManager, WantBuyCodesManager, \
    HumanRemoveForbiddenManager
    HumanRemoveForbiddenManager, HumanForbiddenManager
from db import mysql_data_delegate as mysql_data, redis_manager_delegate as redis_manager
from db.redis_manager_delegate import RedisUtils
from huaxin_client import l1_subscript_codes_manager
@@ -54,13 +55,14 @@
from trade.huaxin import huaxin_trade_api, huaxin_trade_data_update, \
    huaxin_trade_record_manager, huaxin_trade_order_processor, huaxin_sell_util
from trade.huaxin.huaxin_trade_record_manager import PositionManager, DealRecordManager, DelegateRecordManager
from trade.buy_radical.radical_buy_data_manager import RadicalBuyBlockManager, BeforeSubDealBigOrderManager
from trade.buy_radical.radical_buy_data_manager import RadicalBuyBlockManager, BeforeSubDealBigOrderManager, \
    TotalDealBigOrderThresholdMoneyManager
from trade.sell import sell_manager
from trade.sell.sell_rule_manager import TradeRuleManager, SellRule
from trade.trade_data_manager import RadicalBuyDealCodesManager
from trade.trade_manager import TradeTargetCodeModeManager, AutoCancelSellModeManager
from trade.trade_manager import TradeTargetCodeModeManager, AutoCancelSellModeManager, CodesContinueBuyMoneyManager
from settings.trade_setting import MarketSituationManager, TradeBlockBuyModeManager
from utils import socket_util, data_export_util, tool, huaxin_util, output_util, global_util
from utils import socket_util, data_export_util, tool, huaxin_util, output_util, global_util, init_data_util
from servers import server_util
@@ -298,6 +300,7 @@
                        l2_trade_util.remove_from_forbidden_trade_codes(code)
                        # 加想买单要从黑名单移除
                        HumanRemoveForbiddenManager().add_code(code)
                        HumanForbiddenManager().remove_code(code)
                    name = gpcode_manager.get_code_name(code)
                    if not name:
                        results = HistoryKDatasUtils.get_gp_codes_names([code])
@@ -324,6 +327,7 @@
                    l2_trade_util.forbidden_trade(code, msg="手动加入 trade_server", force=True)
                    WantBuyCodesManager().remove_code(code)
                    HumanRemoveForbiddenManager().remove_code(code)
                    HumanForbiddenManager().add_code(code)
                    name = gpcode_manager.get_code_name(code)
                    if not name:
                        results = HistoryKDatasUtils.get_gp_codes_names([code])
@@ -332,6 +336,7 @@
                elif operate == outside_api_command_manager.OPERRATE_DELETE:
                    l2_trade_util.remove_from_forbidden_trade_codes(code)
                    HumanRemoveForbiddenManager().add_code(code)
                    HumanForbiddenManager().remove_code(code)
                elif operate == outside_api_command_manager.OPERRATE_GET:
                    codes = gpcode_manager.BlackListCodeManager().list_codes_cache()
                    datas = []
@@ -341,14 +346,14 @@
                    fresult = {"code": 0, "data": datas}
            elif code_list_type == outside_api_command_manager.CODE_LIST_WHITE:
                if operate == outside_api_command_manager.OPERRATE_SET:
                    gpcode_manager.WhiteListCodeManager().add_code(code)
                    gpcode_manager.WhiteListCodeManager().add_code(code, is_human=True)
                    name = gpcode_manager.get_code_name(code)
                    if not name:
                        results = HistoryKDatasUtils.get_gp_codes_names([code])
                        if results:
                            gpcode_manager.CodesNameManager.add_first_code_name(code, results[code])
                elif operate == outside_api_command_manager.OPERRATE_DELETE:
                    gpcode_manager.WhiteListCodeManager().remove_code(code)
                    gpcode_manager.WhiteListCodeManager().remove_code(code, is_human=True)
                elif operate == outside_api_command_manager.OPERRATE_GET:
                    codes = gpcode_manager.WhiteListCodeManager().list_codes_cache()
                    datas = []
@@ -395,7 +400,13 @@
            elif code_list_type == outside_api_command_manager.CODE_LIST_GREEN:
                if operate == outside_api_command_manager.OPERRATE_SET:
                    gpcode_manager.GreenListCodeManager().add_code(code)
                    trade_record_log_util.add_green(code, "人为加绿")
                    gpcode_manager.WantBuyCodesManager().add_code(code)
                    # 加白
                    gpcode_manager.WhiteListCodeManager().add_code(code, is_human=True)
                    trade_record_log_util.add_white_buy(code, "加绿加白")
                    name = gpcode_manager.get_code_name(code)
                    if not name:
                        results = HistoryKDatasUtils.get_gp_codes_names([code])
@@ -403,7 +414,7 @@
                            gpcode_manager.CodesNameManager.add_first_code_name(code, results[code])
                elif operate == outside_api_command_manager.OPERRATE_DELETE:
                    gpcode_manager.GreenListCodeManager().remove_code(code)
                    gpcode_manager.WantBuyCodesManager().remove_code(code)
                    gpcode_manager.WhiteListCodeManager().remove_code(code)
                elif operate == outside_api_command_manager.OPERRATE_GET:
                    codes = gpcode_manager.GreenListCodeManager().list_codes_cache()
                    datas = []
@@ -875,12 +886,16 @@
                    [huaxin_util.TORA_TSTP_OST_Accepted, huaxin_util.TORA_TSTP_OST_PartTraded])
                fdatas = []
                if current_delegates:
                    codes_set = set()
                    for c in current_delegates:
                        try:
                            if int(c["direction"]) != huaxin_util.TORA_TSTP_D_Buy:
                                continue
                            code = c["securityID"]
                            if code in codes_set:
                                continue
                            orderSysID = c.get("orderSysID")
                            codes_set.add(code)
                            code_name = gpcode_manager.get_code_name(code)
                            # 获取下单位置信息
                            order_begin_pos = TradePointManager().get_buy_compute_start_data_cache(code)
@@ -1063,18 +1078,21 @@
                            except:
                                pass
                            # L撤比例
                            l_down_cancel_rate, must_buy = LCancelRateManager.get_cancel_rate(code,
                                                                                              buy_mode=OrderBeginPosInfo.MODE_RADICAL)
                            l_down_cancel_rate, must_buy, cancel_rate_info = LCancelRateManager.get_cancel_rate(code,
                                                                                                                buy_mode=OrderBeginPosInfo.MODE_RADICAL)
                            # 在挂的距离成交进度位金额/(远近期参考量-单当日实时成交量)*100%
                            expire_rate = "未知"
                            try:
                                referer_volume = code_volumn_manager.CodeVolumeManager().get_radical_buy_refer_volume(
                                    code, limit_up_price)
                                today_volumn = code_volumn_manager.CodeVolumeManager().get_today_volumn(code)
                                expire_rate = f"{round(100 * total_left_num * 100 / (referer_volume - today_volumn), 2)}%"
                            except:
                                pass
                                    code, float(limit_up_price))
                                today_volumn = code_volumn_manager.CodeVolumeManager().get_today_volumn_cache(code)
                                if referer_volume == today_volumn:
                                    expire_rate = "100%"
                                else:
                                    expire_rate = f"{100 - round(100 * total_left_num * 100 / (referer_volume - today_volumn), 2)}%"
                            except Exception as e:
                                logger_debug.exception(e)
                            fdata = {"id": orderSysID, "code_info": (code, code_name), "total_num": total_nums,
                                     "finish_num": deal_or_cancel_num,
@@ -1100,6 +1118,7 @@
                                     "block": '',
                                     "trade_queue": [],
                                     "l_down_cancel_rate": l_down_cancel_rate,
                                     "l_down_cancel_rate_info": cancel_rate_info,
                                     "expire_rate": expire_rate
                                     }
                            limit_up_data = kpl_data_manager.KPLLimitUpDataRecordManager.record_code_dict.get(code)
@@ -1145,7 +1164,17 @@
                                    fdata['mode'] = -1
                            except:
                                pass
                            # L后囊括快照
                            try:
                                current_info = LCancelBigNumComputer().statistic_l_down_watch_indexes_info(code)
                                last_info = LDownCancelWatchIndexStatisticManager().get_statistic_info(code)
                                fdata['l_down_watch_indexes_info'] = {}
                                if current_info:
                                    fdata['l_down_watch_indexes_info']['current'] = current_info
                                if last_info:
                                    fdata['l_down_watch_indexes_info']['last'] = last_info
                            except:
                                pass
                            fdatas.append(fdata)
                        except Exception as e:
                            logger_debug.exception(e)
@@ -1302,12 +1331,30 @@
                filter_blocks, match_blocks = RadicalBuyBlockManager.get_code_blocks(code)
                source_origin_dict[SOURCE_TYPE_KPL] = kpl_blocks
                source_dict[SOURCE_TYPE_KPL] = BlockMapManager().filter_blocks(kpl_blocks)
                dates = HistoryKDatasUtils.get_latest_trading_date_cache(5)
                latest_trading_date = None
                is_new_top = False
                if dates:
                    latest_trading_date = dates[0]
                if latest_trading_date:
                    volumes_data = HistoryKDataManager().get_history_bars(code, latest_trading_date)
                    if volumes_data:
                        is_new_top = code_nature_analyse.is_new_top(code,
                                                                    gpcode_manager.get_limit_up_price_by_preprice(code,
                                                                                                                  volumes_data[
                                                                                                                      0][
                                                                                                                      "close"]),
                                                                    volumes_data)
                data = {
                    "blocks": {},
                    "origin_blocks": {},
                    "match_blocks": [list(filter_blocks), list(match_blocks)],
                    # 板块净流入情况
                    "block_in_moneys": [RealTimeKplMarketData.get_block_info_at_block_in(b) for b in filter_blocks]
                    "block_in_moneys": [RealTimeKplMarketData.get_block_info_at_block_in(b) for b in filter_blocks],
                    # 是否是突破板
                    "is_new_top": is_new_top
                }
                for s in source_origin_dict:
                    data["origin_blocks"][s] = list(source_origin_dict[s])
@@ -1367,7 +1414,9 @@
                                    "zyltgb": constant.RADICAL_BUY_ZYLTGB_AS_YI_RANGES,
                                    "top_block_count_by_market_strong": constant.RADICAL_BUY_TOP_IN_COUNT_BY_MARKET_STRONG,
                                    "special_codes_max_block_in_rank": constant.RADICAL_BUY_TOP_IN_INDEX_WITH_SPECIAL,
                                    "ignore_block_in_money_market_strong": constant.IGNORE_BLOCK_IN_MONEY_MARKET_STRONG
                                    "ignore_block_in_money_market_strong": constant.IGNORE_BLOCK_IN_MONEY_MARKET_STRONG,
                                    "buy_first_limit_up": 1 if constant.CAN_BUY_FIRST_LIMIT_UP else 0,
                                    "can_auto_add_white": 1 if constant.CAN_AUTO_ADD_WHITE else 0
                                    }}
                self.send_response({"code": 0, "data": data, "msg": f""},
                                   client_id,
@@ -1388,6 +1437,13 @@
                    if radical_buy.get('ignore_block_in_money_market_strong') is not None:
                        constant.IGNORE_BLOCK_IN_MONEY_MARKET_STRONG = radical_buy.get(
                            'ignore_block_in_money_market_strong')
                    if radical_buy.get('buy_first_limit_up') is not None:
                        constant.CAN_BUY_FIRST_LIMIT_UP = True if radical_buy.get(
                            'buy_first_limit_up') else False
                    if radical_buy.get('can_auto_add_white') is not None:
                        constant.CAN_AUTO_ADD_WHITE = True if radical_buy.get(
                            'can_auto_add_white') else False
                self.send_response({"code": 0, "data": {}, "msg": f""},
                                   client_id,
                                   request_id)
@@ -1445,7 +1501,90 @@
                                   client_id,
                                   request_id)
            elif ctype == "test_cancel_order":
                # 获取相同板块的涨停代码数量
                code = data.get("code")
                trade_manager.start_cancel_buy(code, force=True)
                self.send_response({"code": 0, "data": {}},
                                   client_id,
                                   request_id)
            elif ctype == "set_total_deal_big_order_threshold_money":
                code = data.get("code")
                money = data.get("money")
                if not code or not money:
                    self.send_response({"code": 1, "data": {}, "msg": "code/money为空"},
                                       client_id,
                                       request_id)
                    return
                TotalDealBigOrderThresholdMoneyManager().set_money(code, int(money),
                                                                   trade_manager.CodesTradeStateManager().get_trade_state_cache(
                                                                       code))
                # 如果是加红状态,且大单不够就需要移红
                if gpcode_manager.MustBuyCodesManager().is_in_cache(code):
                    deal_big_order_info = radical_buy_data_manager.get_total_deal_big_order_info(code,
                                                                                                 gpcode_manager.get_limit_up_price_as_num(
                                                                                                     code))
                    if deal_big_order_info[0] > 0:
                        gpcode_manager.MustBuyCodesManager().remove_code(code)
                        trade_record_log_util.add_common_msg(code, "移红", f"大单阈值修改({money})")
                self.send_response({"code": 0, "data": {}},
                                   client_id,
                                   request_id)
            elif ctype == "set_l_down_rate":
                # 设置L后撤单比例
                code = data.get("code")
                rate = data.get("rate")
                if rate < 0 or rate > 2:
                    self.send_response({"code": 1, "msg": "比例范围不在0-1之间"},
                                       client_id,
                                       request_id)
                    return
                rate = round(rate, 2)
                old_rate = LCancelRateManager().get_cancel_rate(0)[0]
                # L后数据快照
                last_info = LCancelBigNumComputer().statistic_l_down_watch_indexes_info(code)
                LDownCancelWatchIndexStatisticManager().set_statistic_info(code, last_info)
                CancelRateHumanSettingManager().set_l_down(code, rate)
                # L后重新囊括
                if rate < old_rate:
                    # 改小才能重新囊括
                    LCancelBigNumComputer().re_compute_l_down_watch_indexes(code)
                self.send_response({"code": 0, "data": {}},
                                   client_id,
                                   request_id)
            elif ctype == "get_continue_buy_info":
                # 设置L后撤单比例
                code = data.get("code")
                money = CodesContinueBuyMoneyManager().get_continue_buy_money(code)
                if money is None:
                    money = 0
                self.send_response({"code": 0, "data": {"money": money, "money_list": constant.AVAILABLE_BUY_MONEYS}},
                                   client_id,
                                   request_id)
            elif ctype == "set_continue_buy_money":
                # 设置L后撤单比例
                code = data.get("code")
                money = data.get("money")
                if money <= 0:
                    # 表示移除续买金额
                    CodesContinueBuyMoneyManager().remove_continue_buy_money(code)
                    self.send_response({"code": 0, "data": {}},
                                       client_id,
                                       request_id)
                    return
                if money not in constant.AVAILABLE_BUY_MONEYS:
                    self.send_response({"code": 1, "msg": f"金额({money})没在{constant.AVAILABLE_BUY_MONEYS}中"},
                                       client_id,
                                       request_id)
                    return
                CodesContinueBuyMoneyManager().set_continue_buy_money(code, money)
                l2_trade_util.remove_from_forbidden_trade_codes(code)
                self.send_response({"code": 0, "data": {}},
                                   client_id,
                                   request_id)
        except Exception as e:
            logging.exception(e)