| | |
| | | from l2.l2_transaction_data_manager import HuaXinBuyOrderManager, HuaXinSellOrderStatisticManager, BigOrderDealManager |
| | | from log_module import async_log_util |
| | | from third_data import code_plate_key_manager |
| | | from trade.buy_radical import radical_buy_data_manager |
| | | |
| | | from utils import tool |
| | | from l2.transaction_progress import TradeBuyQueue |
| | |
| | | def get_cancel_rate(cls, code, buy_exec_time, is_up=False, is_l_down_recomputed=False, buy_mode = None): |
| | | try: |
| | | must_buy = cls.__MustBuyCodesManager.is_in_cache(code) |
| | | if must_buy: |
| | | if buy_mode == OrderBeginPosInfo.MODE_RADICAL: |
| | | # 扫入的化撤单比例调整为80% |
| | | if buy_mode == OrderBeginPosInfo.MODE_RADICAL: |
| | | if must_buy: |
| | | # 扫入加红 |
| | | return constant.L_CANCEL_RATE_WITH_MUST_BUY_FOR_REDICAL_BUY, True |
| | | else: |
| | | if is_up: |
| | | return constant.L_CANCEL_RATE_UP_WITH_MUST_BUY, True |
| | | else: |
| | | return constant.L_CANCEL_RATE_WITH_MUST_BUY, True |
| | | 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[1]/deal_big_order_info[2] > 0.8: |
| | | # 大单成交比例达到80%,半加红 |
| | | return constant.L_CANCEL_RATE_WITH_HALF_MUST_BUY_FOR_REDICAL_BUY, False |
| | | if must_buy: |
| | | if is_up: |
| | | return constant.L_CANCEL_RATE_UP_WITH_MUST_BUY, True |
| | | else: |
| | | return constant.L_CANCEL_RATE_WITH_MUST_BUY, True |
| | | except Exception as e: |
| | | async_log_util.error(logger_l2_l_cancel, str(e)) |
| | | |
| | |
| | | |
| | | L_CANCEL_RATE_WITH_MUST_BUY = 0.9 # 加红L后 |
| | | |
| | | L_CANCEL_RATE_WITH_MUST_BUY_FOR_REDICAL_BUY = 0.8 # 扫入加红 |
| | | L_CANCEL_RATE_WITH_MUST_BUY_FOR_REDICAL_BUY = 0.95 # 扫入加红 |
| | | |
| | | L_CANCEL_RATE_WITH_HALF_MUST_BUY_FOR_REDICAL_BUY = 0.85 # 扫入半加红 |
| | | |
| | | # L上撤单比例 |
| | | L_CANCEL_RATE_UP = 0.79 # L前 |
| | |
| | | G_CANCEL_RATE_FOR_GOOD_MARKET = 0.59 |
| | | |
| | | # 华鑫L2的卡位数量 |
| | | HUAXIN_L2_MAX_CODES_COUNT = 75 |
| | | HUAXIN_L2_MAX_CODES_COUNT = 90 |
| | | |
| | | TRADE_WAY_HUAXIN = "huaxin" |
| | | TRADE_WAY_JUEJIN = "juejin" |
| | |
| | | # 终端信息采集 |
| | | # UserProductInfo填写终端名称 |
| | | login_req.UserProductInfo = 'jiabei' |
| | | login_req.DynamicPassword = 'rxoB195F' |
| | | # 按照监管要求填写终端信息 |
| | | login_req.TerminalInfo = f'PC;IIP=NA;IPORT=NA;LIP={LOCAL_IP};MAC=5C6F69CC2B40;HD=004bc76004aff0882b9052ba0eb00506;@jiabei' |
| | | # 以下内外网IP地址若不填则柜台系统自动采集,若填写则以终端填值为准报送 |
| | |
| | | TradeSimpleApi.req_id += 1 |
| | | ret = api.ReqUserLogin(login_req, TradeSimpleApi.req_id) |
| | | if ret != 0: |
| | | logger.info('ReqUserLogin fail, ret[%d]' % ret) |
| | | logger_trade.info('ReqUserLogin fail, ret[%d]' % ret) |
| | | else: |
| | | logger.info('GetConnectionInfo fail, [%d] [%d] [%s]!!!' % ( |
| | | logger_trade.info('GetConnectionInfo fail, [%d] [%d] [%s]!!!' % ( |
| | | nRequestID, pRspInfoField.ErrorID, pRspInfoField.ErrorMsg)) |
| | | |
| | | def OnRspUserLogin(self, pRspUserLoginField: "CTORATstpRspUserLoginField", pRspInfoField: "CTORATstpRspInfoField", |
| | | nRequestID: "int") -> "void": |
| | | if pRspInfoField.ErrorID == 0: |
| | | logger.info('Login success! [%d]' % nRequestID) |
| | | logger_trade.info('Login success! [%d]' % nRequestID) |
| | | self.__front_id = pRspUserLoginField.FrontID |
| | | self.__session_id = pRspUserLoginField.SessionID |
| | | TradeSimpleApi.set_login_info(self.__session_id, self.__front_id) |
| | |
| | | TradeSimpleApi().get_money_account() |
| | | |
| | | else: |
| | | logger.info('Login fail!!! [%d] [%d] [%s]' |
| | | logger_trade.info('Login fail!!! [%d] [%d] [%s]' |
| | | % (nRequestID, pRspInfoField.ErrorID, pRspInfoField.ErrorMsg)) |
| | | |
| | | def OnRspUserPasswordUpdate(self, pUserPasswordUpdateField: "CTORATstpUserPasswordUpdateField", |
| | |
| | | L2MarketSellManager().set_current_total_sell_data(code, time_str, |
| | | data["totalAskVolume"] * data["avgAskPrice"], |
| | | data["totalAskVolume"], sell_1_info, data.get("sell")) |
| | | |
| | | if data["sell"] and len(data["sell"]) > 1 and data["sell"][1][1] > 0: |
| | | # 出现卖二 |
| | | radical_buy_strategy.clear_data(code, force=True) |
| | | |
| | | # 设置扫入数据 |
| | | RadicalCodeMarketInfoManager().set_market_info(code, time_str, round(float(limit_up_price), 2), data["buy"][0], sell_1_info) |
| | | RadicalCodeMarketInfoManager().set_market_info(code, time_str, round(float(limit_up_price), 2), data["buy"][0], |
| | | sell_1_info) |
| | | # 判断是否下单 |
| | | state = CodesTradeStateManager().get_trade_state_cache(code) |
| | | if not trade_util.is_can_order_by_state(state): |
| | | # 不处于可下单状态 |
| | | RadicalBuyDataManager().market_info_change(code) |
| | | |
| | | |
| | | @classmethod |
| | | def trading_order_canceled(cls, code, order_no): |
| | |
| | | if buy_result: |
| | | # 下单成功 |
| | | radical_buy_data_manager.BlockPlaceOrderRecordManager().add_record(code, buy_blocks) |
| | | radical_buy_strategy.clear_data(code) |
| | | radical_buy_strategy.clear_data(code, force=True) |
| | | RDCancelBigNumComputer().clear_data(code) |
| | | # 大单成交足够 |
| | | RadicalBuyDataManager().big_order_deal_enough(code) |
| | |
| | | """ |
| | | if gpcode_manager.MustBuyCodesManager().is_in_cache(code): |
| | | return |
| | | cls.place_order_success(code) |
| | | total_deal_big_order_result = get_total_deal_big_order_info(code, |
| | | gpcode_manager.get_limit_up_price_as_num(code)) |
| | | if total_deal_big_order_result[0] <= 0: |
| | |
| | | """ |
| | | 总成交大单啊是否足够 |
| | | @param code: |
| | | @return:(缺少的资金,总成交金额, 要求的大单) |
| | | @return:(缺少的资金,总成交金额, 要求的大单金额) |
| | | """ |
| | | TOTAL_BIG_DEAL_MONEY_THRESHOLD_COUNT = round( |
| | | code_volumn_manager.CodeVolumeManager().get_max_volume_in_5days(code) * limit_up_price / 1e8, 2) |
| | |
| | | __latest_deal_active_buy_order = {} |
| | | |
| | | |
| | | def clear_data(code): |
| | | def clear_data(code, force=False): |
| | | """ |
| | | 清除数据:下单过后/开板后清除数据 |
| | | @param force: 是否强制清除 |
| | | @param code: |
| | | @return: |
| | | """ |
| | | if code in __deal_active_buy_total_money: |
| | | __deal_active_buy_total_money.pop(code) |
| | | # async_log_util.info(logger_l2_radical_buy, f"{code}-清除扫入数据") |
| | | if code in __latest_deal_active_buy_order: |
| | | __latest_deal_active_buy_order.pop(code) |
| | | # 清除L2下单信号 |
| | | if code in RadicalBuyDealCodesManager.buy_by_l2_delegate_expire_time_dict: |
| | | RadicalBuyDealCodesManager.buy_by_l2_delegate_expire_time_dict.pop(code) |
| | | |
| | | if not force: |
| | | # 非强制清除数据要看大单成交是否足够 |
| | | big_deal_info = radical_buy_data_manager.get_total_deal_big_order_info(code, |
| | | gpcode_manager.get_limit_up_price_as_num( |
| | | code)) |
| | | if big_deal_info[0] > 0: |
| | | # 大单不够 |
| | | force = True |
| | | |
| | | if force: |
| | | if __deal_active_buy_total_money.get(code): |
| | | async_log_util.info(logger_l2_radical_buy, f"清除涨停卖成交数据") |
| | | # 强制清除数据 |
| | | if code in __deal_active_buy_total_money: |
| | | __deal_active_buy_total_money.pop(code) |
| | | # 清除L2下单信号 |
| | | if code in RadicalBuyDealCodesManager.buy_by_l2_delegate_expire_time_dict: |
| | | RadicalBuyDealCodesManager.buy_by_l2_delegate_expire_time_dict.pop(code) |
| | | |
| | | |
| | | def process_limit_up_active_buy_deal(code, transaction_datas): |