| | |
| | | from l2 import l2_data_manager, l2_data_log |
| | | |
| | | from log_module.log import * |
| | | from trade.buy_money_count_setting import BuyMoneyUtil |
| | | from trade.huaxin.huaxin_trade_record_manager import TradeOrderIdManager |
| | | from trade.order_statistic import DealAndDelegateWithBuyModeDataManager |
| | | from trade.trade_data_manager import AccountMoneyManager, RadicalBuyDealCodesManager |
| | | from utils import import_util, tool, huaxin_util |
| | | |
| | |
| | | |
| | | # 交易目标票模式 |
| | | class TradeTargetCodeModeManager: |
| | | # 只买辨识度 |
| | | MODE_ONLY_BUY_SPECIAL_CODES = 2 |
| | | # 只买想买单 |
| | | MODE_ONLY_BUY_WANT_CODES = 1 |
| | | # 买所有 |
| | |
| | | self.__trade_buy_mode_cache = self.get_mode() |
| | | |
| | | def set_mode(self, mode): |
| | | if mode != self.MODE_ONLY_BUY_WANT_CODES and mode != self.MODE_BUY_ALL: |
| | | if mode != self.MODE_ONLY_BUY_WANT_CODES and mode != self.MODE_BUY_ALL and mode != self.MODE_ONLY_BUY_SPECIAL_CODES: |
| | | raise Exception("mode参数值错误") |
| | | self.__trade_buy_mode_cache = mode |
| | | RedisUtils.setex(self.__get_redis(), "trade_buy_mode", tool.get_expire(), mode) |
| | |
| | | |
| | | def get_mode_cache(self): |
| | | return self.__auto_cancel_sell_mode |
| | | |
| | | |
| | | # 代码的交易状态管理 |
| | | class CodesTradeStateManager: |
| | |
| | | async_log_util.info(logger_trade, "{} trade.manager.start_buy 结束".format(code)) |
| | | |
| | | |
| | | def test_order(code, last_data, exec_index): |
| | | """ |
| | | TODO 测试下单 |
| | | @param code: |
| | | @param last_data: |
| | | @param exec_index: |
| | | @return: |
| | | """ |
| | | price = gpcode_manager.get_limit_up_price(code) |
| | | __buy(code, price, trade_constant.TRADE_STATE_NOT_TRADE, 0, last_data, last_data["index"], 0, exec_index=exec_index) |
| | | |
| | | |
| | | # 中断买入 |
| | | def break_buy(code, reason): |
| | | trade_data_manager.TradeBuyDataManager().remove_buy_position_info(code) |
| | |
| | | async_log_util.info(logger_trade, "{} trade_manager.__buy 开始".format(code)) |
| | | try: |
| | | if constant.API_TRADE_ENABLE: |
| | | count = tool.get_buy_volume(price) |
| | | can_buy, money, msg = BuyMoneyUtil.get_buy_data(tool.get_now_time_str(), mode, |
| | | DealAndDelegateWithBuyModeDataManager().get_deal_codes_info( |
| | | mode), |
| | | DealAndDelegateWithBuyModeDataManager().get_delegates_codes_info( |
| | | mode)) |
| | | if not can_buy: |
| | | raise Exception(msg) |
| | | count = tool.get_buy_volume_by_money(price, money) |
| | | |
| | | # if mode == OrderBeginPosInfo.MODE_RADICAL: |
| | | # # 激进买入金额为1手 |
| | | # count = 100 |
| | | if constant.TRADE_WAY == constant.TRADE_WAY_JUEJIN: |
| | | trade_juejin.order_volume(code, price, count) |
| | | elif constant.TRADE_WAY == constant.TRADE_WAY_HUAXIN: |
| | | order_ref = huaxin_util.create_order_ref() |
| | | TradeOrderIdManager().add_order_ref(code, order_ref) |
| | | trade_huaxin.order_volume(code, price, count, last_data, order_ref=order_ref, exec_index=exec_index) |
| | | if constant.IS_NEW_VERSION_PLACE_ORDER: |
| | | trade_huaxin.order_volume_new(code, price, count, last_data, exec_index=exec_index) |
| | | else: |
| | | order_ref = huaxin_util.create_order_ref() |
| | | TradeOrderIdManager().add_order_ref(code, order_ref) |
| | | trade_huaxin.order_volume(code, price, count, last_data, order_ref=order_ref, exec_index=exec_index) |
| | | else: |
| | | guiTrade.buy(code, price) |
| | | __place_order_success(code, capture_timestamp, last_data, last_data_index) |
| | |
| | | |
| | | # 开始取消买入 |
| | | def start_cancel_buy(code, force=False): |
| | | """ |
| | | 开始撤单 |
| | | @param code: |
| | | @param force: |
| | | @return: |
| | | """ |
| | | async_log_util.info(logger_trade, "{} trade_manager.start_cancel_buy 开始".format(code)) |
| | | trade_state = __CodesTradeStateManager.get_trade_state_cache(code) |
| | | try: |
| | |
| | | # 删除买撤记录的临时信息 |
| | | kp_client_msg_manager.add_msg(code, "买入成交") |
| | | l2_data_manager.TradePointManager().delete_buy_point(code) |
| | | # 移除交易窗口分配 |
| | | if trade_gui is not None: |
| | | trade_gui.THSBuyWinManagerNew.cancel_distribute_win_for_code(code) |
| | | # 交易成功时间过去3s之后,且当前委托列表里面还有该代码数据就再次执行撤单 |
| | | if tool.trade_time_sub(tool.get_now_time_str(), _time) > 3: |
| | | # 获取到当前是否委托 |
| | | for dd in latest_trade_delegate_data: |
| | | if dd["code"] == code: |
| | | logger_trade.info("{}交易成功触发,重复下单撤单".format(code)) |
| | | start_cancel_buy(code, True) |
| | | # 新版下单不处理 |
| | | if not constant.IS_NEW_VERSION_PLACE_ORDER: |
| | | if tool.trade_time_sub(tool.get_now_time_str(), _time) > 3: |
| | | # 获取到当前是否委托 |
| | | for dd in latest_trade_delegate_data: |
| | | if dd["code"] == code: |
| | | logger_trade.info("{}交易成功触发,重复下单撤单".format(code)) |
| | | start_cancel_buy(code, True) |
| | | |
| | | |
| | | # 处理委托成功数据 |
| | |
| | | latest_trade_delegate_data.extend(datas) |
| | | codes = [] |
| | | for data in datas: |
| | | |
| | | code = data["code"] |
| | | if code is not None: |
| | | codes.append(code) |
| | |
| | | # 加入黑名单 |
| | | if not l2_trade_util.is_in_forbidden_trade_codes(code): |
| | | l2_trade_util.forbidden_trade(code, "buy success", force=True) |
| | | if TradePointManager().get_latest_place_order_mode(code) == OrderBeginPosInfo.MODE_RADICAL: |
| | | mode = TradePointManager().get_latest_place_order_mode(code) |
| | | if mode is None: |
| | | mode = OrderBeginPosInfo.MODE_NORMAL |
| | | DealAndDelegateWithBuyModeDataManager().add_deal_code(code, tool.get_now_time_str(), mode) |
| | | if mode == OrderBeginPosInfo.MODE_RADICAL: |
| | | RadicalBuyDealCodesManager().add_deal_code(code) |
| | | # 取s消所有的挂单 |
| | | if constant.API_TRADE_ENABLE: |
| | | if constant.TRADE_WAY == constant.TRADE_WAY_JUEJIN: |
| | | trade_juejin.cancel_order(code) |
| | | elif constant.TRADE_WAY == constant.TRADE_WAY_HUAXIN: |
| | | trade_huaxin.cancel_order(code) |
| | | if not constant.IS_NEW_VERSION_PLACE_ORDER: |
| | | # 新版本拆单下单不撤单 |
| | | if constant.TRADE_WAY == constant.TRADE_WAY_JUEJIN: |
| | | trade_juejin.cancel_order(code) |
| | | elif constant.TRADE_WAY == constant.TRADE_WAY_HUAXIN: |
| | | trade_huaxin.cancel_order(code) |
| | | else: |
| | | guiTrade.cancel_buy(code) |
| | | |