| | |
| | | def __need_cancel_for_up(self, code, big_sell_order_info, total_datas): |
| | | # 查询是否是真的真实下单位置 |
| | | trade_index, is_default = TradeBuyQueue().get_traded_index(code) |
| | | if trade_index is None: |
| | | trade_index = 0 |
| | | real_order_index_info = self.__get_real_place_order_index_info_cache(code) |
| | | if real_order_index_info is None or real_order_index_info[1]: |
| | | return False, "没找到真实下单位" |
| | |
| | | |
| | | |
| | | # 下单 |
| | | def place_order(code, price, volume, data, order_ref, shadow_price): |
| | | def place_order(code, price, volume, exec_index, latest_data, order_ref, shadow_price): |
| | | async_log_util.info(logger_real_place_order_position, |
| | | f"下单:code-{code} price-{price} shadow_price-{shadow_price} volume-{volume} exec-index-{data['index']} order_ref-{order_ref}") |
| | | _place_order_info_dict[code] = (price, volume, data, time.time(), order_ref, shadow_price) |
| | | f"下单:code-{code} price-{price} shadow_price-{shadow_price} volume-{volume} exec-index-{exec_index} order_ref-{order_ref}") |
| | | _place_order_info_dict[code] = (price, volume, latest_data, time.time(), order_ref, shadow_price, exec_index) |
| | | |
| | | |
| | | # 获取下单信息 |
| | |
| | | # 已经撤单 |
| | | need_update = True |
| | | if need_update: |
| | | async_log_util.info(logger_debug, f"下单位矫正# {code}需要更新真实下单位置: 当前真实下单位-{real_place_index} order_info-{order_info}") |
| | | async_log_util.info(logger_debug, |
| | | f"下单位矫正# {code}需要更新真实下单位置: 当前真实下单位-{real_place_index} order_info-{order_info}") |
| | | # 需要更新真实下单位置 |
| | | # 在时间内找引子单 |
| | | shadow_order_indexes = [] |
| | |
| | | pre_real_order_index) |
| | | if real_order_index: |
| | | try: |
| | | exec_data = order_info[2] |
| | | exec_index = order_info[6] |
| | | order_begin_pos = cls.__get_order_begin_pos( |
| | | code) |
| | | async_log_util.info(logger_debug, |
| | | f"下单位矫正:真实下单位-{real_order_index} 订单信息-{order_info} 下单信息-{order_begin_pos}") |
| | | if order_begin_pos and order_begin_pos.buy_exec_index == exec_data["index"]: |
| | | f"下单位矫正:真实下单位-{real_order_index} 订单信息-{order_info} 下单信息-{order_begin_pos.to_dict()}") |
| | | if order_begin_pos and order_begin_pos.buy_exec_index == exec_index: |
| | | cls.set_real_place_order_index(code, real_order_index, order_begin_pos) |
| | | async_log_util.info(logger_real_place_order_position, |
| | | f"真实下单位矫正:{code}-{real_order_index} 下单数据:{order_info}") |
| | |
| | | try: |
| | | l2_log.debug(code, "开始执行买入") |
| | | trade_manager.start_buy(code, capture_timestamp, last_data, |
| | | last_data_index, order_begin_pos.mode) |
| | | last_data_index, order_begin_pos.mode, order_begin_pos.buy_exec_index) |
| | | l2_log.debug(code, "执行买入成功") |
| | | ################下单成功处理################ |
| | | trade_result_manager.real_buy_success(code, cls.__TradePointManager) |
| | |
| | | break |
| | | except Exception as e: |
| | | async_log_util.error(hx_logger_l2_debug, str(e)) |
| | | try: |
| | | # 下单2s后才开始生效 |
| | | cresult = LCancelBigNumComputer().add_transaction_datas(code, datas) |
| | | if cresult[0] and not DCancelBigNumComputer().has_auto_cancel_rules(code): |
| | | L2TradeDataProcessor.cancel_buy(code, f"L后成交太快撤单:{cresult[1]}") |
| | | order_begin_pos = None |
| | | except Exception as e: |
| | | async_log_util.error(hx_logger_l2_debug, str(e)) |
| | | # 暂时注释掉 |
| | | # try: |
| | | # # 下单2s后才开始生效 |
| | | # cresult = LCancelBigNumComputer().add_transaction_datas(code, datas) |
| | | # if cresult[0] and not DCancelBigNumComputer().has_auto_cancel_rules(code): |
| | | # L2TradeDataProcessor.cancel_buy(code, f"L后成交太快撤单:{cresult[1]}") |
| | | # order_begin_pos = None |
| | | # except Exception as e: |
| | | # async_log_util.error(hx_logger_l2_debug, str(e)) |
| | | big_sell_order_info = None |
| | | try: |
| | | # 统计卖单 |
| | |
| | | __updating_jx_blocks_codes = set() |
| | | |
| | | @classmethod |
| | | def __sell(cls, datas): |
| | | def sell(cls, datas): |
| | | rules = TradeRuleManager().list_can_excut_rules_cache(types=[TradeRuleManager.TYPE_SELL]) |
| | | excuted_rule_ids = set() |
| | | if rules: |
| | |
| | | request_id = data_json["request_id"] |
| | | datas = data["data"] |
| | | cls.__save_l1_current_price(datas) |
| | | cls.__sell(datas) |
| | | cls.sell(datas) |
| | | |
| | | @classmethod |
| | | def l2_order(cls, code, _datas, timestamp): |
| | |
| | | # (代码, 现价, 涨幅, 量, 更新时间, 买1价格, 买1量) |
| | | datas = [("600571", 12.14, 9.96, 100000000, tool.get_now_time_str(), 12.14, 10210), |
| | | ("600571", 12.04, 9.96, 100000000, tool.get_now_time_str(), 12.04, 10210)] |
| | | cls.__sell(datas) |
| | | cls.sell(datas) |
| | | |
| | | |
| | | def clear_invalid_client(): |
| | |
| | | rule.code, rule.buy1_volume, rule.buy1_price, rule.sell_volume, rule.sell_price_type, rule.end_time, |
| | | rule.id_)) |
| | | rule.excuted = old_rule.excuted |
| | | rule.type = old_rule.type |
| | | rule.create_time = old_rule.create_time |
| | | |
| | | self.__sell_rules_dict_cache[rule.id_] = rule |
| | |
| | | |
| | | |
| | | # 通过量下单,返回(代码,账号ID,订单号) |
| | | def order_volume(code, price, count, last_data, order_ref=None): |
| | | def order_volume(code, price, count, last_data, order_ref=None, exec_index=None): |
| | | async_log_util.info(logger_trade, f"{code} trade_huaxin.order_volume 开始") |
| | | try: |
| | | price = round(float(price), 2) |
| | |
| | | raise Exception("只支持00开头与60开头的代码下单") |
| | | # 保存下单信息 |
| | | shadow_price = tool.get_shadow_price(price) |
| | | huaxin.huaxin_delegate_postion_manager.place_order(code, price, count, last_data, order_ref, |
| | | huaxin.huaxin_delegate_postion_manager.place_order(code, price, count, exec_index, last_data, order_ref, |
| | | shadow_price=shadow_price) |
| | | if not constant.TRADE_ENABLE: |
| | | return |
| | |
| | | |
| | | |
| | | # 开始交易 |
| | | def start_buy(code, capture_timestamp, last_data, last_data_index, mode=0): |
| | | def start_buy(code, capture_timestamp, last_data, last_data_index, mode=0, exec_index=None): |
| | | def is_forbidden(code): |
| | | if l2_trade_util.is_in_forbidden_trade_codes(code): |
| | | return Exception("禁止交易") |
| | |
| | | async_log_util.info(logger_trade, "{} trade.manager.start_buy 判断是否可买".format(code)) |
| | | __CodesTradeStateManager.set_trade_state(code, TRADE_STATE_BUY_PLACE_ORDER) |
| | | # 状态改变过后必须要有本地下单编号 |
| | | __buy(code, price, trade_state, capture_timestamp, last_data, last_data_index, mode) |
| | | __buy(code, price, trade_state, capture_timestamp, last_data, last_data_index, mode, exec_index=exec_index) |
| | | finally: |
| | | async_log_util.info(logger_trade, "{} trade.manager.start_buy 结束".format(code)) |
| | | |
| | |
| | | |
| | | # 购买 |
| | | # @tool.async_call |
| | | def __buy(code, price, trade_state, capture_timestamp, last_data, last_data_index, mode=0): |
| | | def __buy(code, price, trade_state, capture_timestamp, last_data, last_data_index, mode=0, exec_index=None): |
| | | async_log_util.info(logger_trade, "{} trade_manager.__buy 开始".format(code)) |
| | | try: |
| | | if constant.API_TRADE_ENABLE: |
| | |
| | | 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) |
| | | 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) |