| | |
| | | if self.__real_time_buy1_data[code][1] == data["TradePrice"]: |
| | | # 与买的价格一致 |
| | | self.__real_time_buy1_data[code][3] -= data["TradeVolume"] |
| | | |
| | | q: collections.deque = self.temp_transaction_queue_dict.get(code) |
| | | q.append((data['SecurityID'], data['TradePrice'], data['TradeVolume'], |
| | | data['OrderTime'], data['MainSeq'], data['SubSeq'], data['BuyNo'], |
| | |
| | | "acceptTime": pOrderField.AcceptTime, "cancelTime": pOrderField.CancelTime, |
| | | "limitPrice": pOrderField.LimitPrice, "accountID": pOrderField.AccountID, |
| | | "turnover": pOrderField.Turnover, "orderRef": pOrderField.OrderRef, |
| | | "volume": pOrderField.VolumeTotalOriginal, |
| | | "volume": pOrderField.VolumeTotalOriginal, "sinfo":pOrderField.SInfo, |
| | | "volumeTraded": pOrderField.VolumeTraded, "orderStatus": pOrderField.OrderStatus, |
| | | "orderSubmitStatus": pOrderField.OrderSubmitStatus, "statusMsg": pOrderField.StatusMsg}) |
| | | else: |
| | |
| | | |
| | | orderEntity = HuaxinOrderEntity(code, orderStatus, orderRef, accountID, orderSysID, |
| | | insertTime=insertTime, acceptTime=acceptTime, |
| | | insertDate=insertDate, direction=direction) |
| | | insertDate=insertDate, direction=direction, sinfo=sinfo) |
| | | try: |
| | | if str(orderEntity.direction) == str(huaxin_util.TORA_TSTP_D_Sell): |
| | | try: |
| | |
| | | # 买入需要刷新持仓列表 |
| | | huaxin_trade_data_update.add_position_list() |
| | | # TradeResultProcessor.process_buy_order(order) |
| | | need_watch_cancel = TradeResultProcessor.process_sell_order(orderEntity) |
| | | need_watch_cancel = TradeResultProcessor.is_need_watch_cancel(orderEntity) |
| | | if need_watch_cancel: |
| | | threading.Thread(target=lambda: __cancel_order(orderEntity.code, orderEntity.orderRef), |
| | | daemon=True).start() |
| | |
| | | class HuaxinOrderEntity: |
| | | def __init__(self, code, orderStatus, orderRef, accountID, orderSysID, direction=None, insertDate=None, |
| | | insertTime=None, |
| | | acceptTime=None, is_shadow_order=False): |
| | | acceptTime=None, is_shadow_order=False, sinfo=None): |
| | | self.code = code |
| | | self.orderStatus = orderStatus |
| | | self.orderRef = orderRef |
| | |
| | | self.acceptTime = acceptTime |
| | | self.direction = direction |
| | | self.is_shadow_order = is_shadow_order |
| | | self.sinfo = sinfo |
| | | |
| | | |
| | | class CancelOrderManager: |
| | |
| | | |
| | | # 返回是否要监控撤单 |
| | | @classmethod |
| | | def process_sell_order(cls, order: HuaxinOrderEntity): |
| | | # 处理卖单 |
| | | if order.direction != str(huaxin_util.TORA_TSTP_D_Sell): |
| | | def is_need_watch_cancel(cls, order: HuaxinOrderEntity): |
| | | # 机器买入的不能撤单 |
| | | if order.sinfo.find("ba_") == 0: |
| | | return False |
| | | |
| | | # if order.direction != str(huaxin_util.TORA_TSTP_D_Sell): |
| | | # return False |
| | | cls.order_ref_dict[order.orderRef] = order |
| | | |
| | | # 下单时间在9:30以后的如果2s没成交就撤单 |
| | | if tool.trade_time_sub(order.insertTime, "09:30:00") >= 0 and str( |
| | | order.orderStatus) == huaxin_util.TORA_TSTP_OST_Accepted: |
| | | sell_mode = AutoCancelSellModeManager().get_mode_cache(order.code) |
| | | if sell_mode == AutoCancelSellModeManager.MODE_CANCEL_MECHINE and order.orderRef < 90000: |
| | | # 只撤机器的单 |
| | | if sell_mode == AutoCancelSellModeManager.MODE_CANCEL_MECHINE: |
| | | # 不撤手动买入/卖出的单 |
| | | if order.orderRef < 90000: |
| | | # 非系统单 |
| | | return False |
| | | return False |
| | | return True |
| | | return False |
| | |
| | | |
| | | # 自动撤卖模式管理 |
| | | class AutoCancelSellModeManager: |
| | | # 撤所有 |
| | | # 撤所有,包括撤手动下的单 |
| | | MODE_CANCEL_ALL = 0 |
| | | # 撤机器下单 |
| | | # 撤机器下单,不撤手动下的单 |
| | | MODE_CANCEL_MECHINE = 1 |
| | | |
| | | __instance = None |
| | |
| | | cls.process_for_sell(datas) |
| | | |
| | | @classmethod |
| | | def excute_sell_rule(cls, code, buy1_volume, buy1_price, source="l1"): |
| | | def excute_sell_rule(cls, code, buy1_volume, buy1_price, source="L1"): |
| | | """ |
| | | 执行卖出规则 |
| | | :param code: |
| | | :param buy1_volume: |
| | | :param buy1_price: |
| | | :param source: |
| | | :return: |
| | | """ |
| | | rules = TradeRuleManager().list_can_excut_rules_cache(types=[TradeRuleManager.TYPE_SELL]) |
| | | if not rules: |
| | | return |
| | |
| | | for d in datas: |
| | | code = d["securityID"] |
| | | buy1 = d["buy"][0] |
| | | L1DataProcessor.excute_sell_rule(code, buy1[1], buy1[0], "l2") |
| | | L1DataProcessor.excute_sell_rule(code, buy1[1], buy1[0], "L2") |
| | | |
| | | def OnRealTimeBuy1Info(self, code, buy1_info): |
| | | # buy1_info: [买1时间,买1价格, 原始买1量, 实时买1量] |
| | |
| | | codes = [rule.code for rule in rules] |
| | | if code in codes: |
| | | async_log_util.info(logger_debug, f"OnRealTimeBuy1Info:{code}-{buy1_info}") |
| | | # L1DataProcessor.excute_sell_rule(code, buy1_info[3], buy1_info[1], "l2-real") |
| | | L1DataProcessor.excute_sell_rule(code, buy1_info[3], buy1_info[1], "L2-real") |
| | | |
| | | |
| | | def __sell_for_last_day_break_limit_up(): |