| | |
| | | return |
| | | |
| | | # 撤买 |
| | | def cancel_buy(self, code, sinfo, order_sys_id=None, order_ref=None, order_action_ref=None): |
| | | def cancel_buy(self, code, sinfo, order_sys_id=None, order_ref=None, order_action_ref=None, delay_s=0.0): |
| | | if delay_s > 0: |
| | | time.sleep(delay_s) |
| | | if sinfo in self.__cancel_buy_sinfo_set: |
| | | raise Exception(f'撤单请求已经提交:{sinfo}') |
| | | async_log_util.info(logger_local_huaxin_trade_debug, |
| | |
| | | # threading.Thread(target=lambda: self.__tradeSimpleApi.buy(code, volume, price, sinfo, order_ref), |
| | | # daemon=True).start() |
| | | self.trade_thread_pool.submit(self.__tradeSimpleApi.buy, code, volume, price, sinfo, order_ref) |
| | | # 下一个影子订单 |
| | | shadow_order_ref = order_ref + 1 |
| | | shadow_sinfo = f"s_b_{order_ref}" |
| | | shadow_price = price - 0.05 |
| | | self.trade_thread_pool.submit(self.__tradeSimpleApi.buy, code, volume, shadow_price, shadow_sinfo, |
| | | shadow_order_ref) |
| | | # 撤掉影子单 |
| | | shadow_cancel_order_ref = shadow_order_ref + 1 |
| | | self.trade_thread_pool.submit( |
| | | lambda: self.__tradeSimpleApi.cancel_buy(code, f"s_c_{shadow_order_ref}", order_sys_id=None, |
| | | order_ref=shadow_order_ref, |
| | | order_action_ref=shadow_cancel_order_ref, delay_s=0.05)) |
| | | async_log_util.info(logger_trade, f"{code}华鑫本地下单线程结束") |
| | | except Exception as e: |
| | | send_response(json.dumps({"code": 1, "msg": str(e)}), TYPE_ORDER, client_id, |
| | |
| | | |
| | | |
| | | # 下单 |
| | | def place_order(code, price, volume, data): |
| | | def place_order(code, price, volume, data, order_ref): |
| | | async_log_util.info(logger_real_place_order_position, |
| | | f"下单:code-{code} price-{price} volume-{volume} exec-index-{data['index']}") |
| | | _place_order_info_dict[code] = (price, volume, data, time.time()) |
| | | f"下单:code-{code} price-{price} volume-{volume} exec-index-{data['index']} order_ref-{order_ref}") |
| | | _place_order_info_dict[code] = (price, volume, data, time.time(), order_ref) |
| | | |
| | | |
| | | # 获取下单信息 |
| | | def get_order_info(code): |
| | | info = _place_order_info_dict.get(code) |
| | | if info and time.time() - info[3] > 3: |
| | | async_log_util.info(logger_real_place_order_position, "get_order_info 间隔3s以上:code-{}", code) |
| | | if info and time.time() - info[3] > 1: |
| | | async_log_util.info(logger_real_place_order_position, "get_order_info 间隔1s以上:code-{}", code) |
| | | # 间隔3s以上就无效了 |
| | | info = None |
| | | _place_order_info_dict.pop(code) |
| | |
| | | price = order_info[0] |
| | | volume = order_info[1] |
| | | exec_data = order_info[2] |
| | | order_ref = order_info[4] |
| | | # 获取量 |
| | | is_sz = code.startswith("00") |
| | | # 提交到交易所的时间预估 |
| | | min_space_time_ms = 10 if is_sz else 50 |
| | | min_space_time_ms = -1 if is_sz else 50 |
| | | for d in datas: |
| | | if d["val"]["num"] != volume // 100: |
| | | continue |
| | |
| | | # 时间差不能小于预估下单用时 |
| | | if L2DataUtil.time_sub_as_ms(d['val'], exec_data['val']) <= min_space_time_ms: |
| | | continue |
| | | # 真实下单位置与挂单位置不能相差1s |
| | | if L2DataUtil.time_sub_as_ms(d["val"], exec_data['val']) >= 1000: |
| | | continue |
| | | # 获取到了下单位置 |
| | | async_log_util.info(hx_logger_trade_debug, f"真实下单位置:{code}-{d['index']}") |
| | | async_log_util.info(logger_real_place_order_position, f"真实下单位置:{code}-{d['index']}") |
| | |
| | | __order_ref_lock.acquire() |
| | | try: |
| | | global __public_order_ref |
| | | __public_order_ref += random.randint(1, 20) |
| | | __public_order_ref += random.randint(5, 20) |
| | | return __public_order_ref |
| | | finally: |
| | | __order_ref_lock.release() |