| | |
| | | def set_real_place_position(code, index, buy_single_index=None, is_default = True): |
| | | # DCancelBigNumComputer().set_real_order_index(code, index) |
| | | SecondCancelBigNumComputer().set_real_place_order_index(code, index) |
| | | LCancelBigNumComputer().set_real_place_order_index(code, index, buy_single_index=buy_single_index) |
| | | LCancelBigNumComputer().set_real_place_order_index(code, index, buy_single_index=buy_single_index, |
| | | is_default=is_default) |
| | | HourCancelBigNumComputer().set_real_place_order_index(code, index, buy_single_index) |
| | | GCancelBigNumComputer().set_real_place_order_index(code, index, buy_single_index, is_default) |
| | | FCancelBigNumComputer().set_real_order_index(code, index) |
| | |
| | | for k in keys: |
| | | code = k.split("-")[-1] |
| | | val = RedisUtils.get(__redis, k) |
| | | val = int(val) |
| | | val = json.loads(val) |
| | | CodeDataCacheUtil.set_cache(cls.__real_place_order_index_dict, code, val) |
| | | |
| | | keys = RedisUtils.keys(__redis, "l_cancel_near_by_index-*") |
| | |
| | | if not watch_index_info or watch_index_info[1] > 0: |
| | | return |
| | | # 获取成交进度位与真实下单位置 |
| | | real_place_order_index = self.__real_place_order_index_dict.get(code) |
| | | real_place_order_index_info = self.__real_place_order_index_dict.get(code) |
| | | last_trade_progress_index = self.__last_trade_progress_dict.get(code) |
| | | if not real_place_order_index or not last_trade_progress_index: |
| | | if not real_place_order_index_info or not last_trade_progress_index: |
| | | return |
| | | self.compute_watch_index(code, watch_index_info[0], last_trade_progress_index + 1, real_place_order_index, |
| | | self.compute_watch_index(code, watch_index_info[0], last_trade_progress_index + 1, |
| | | real_place_order_index_info[0], |
| | | re_compute=1) |
| | | |
| | | # 计算观察索引,倒序计算 |
| | |
| | | async_log_util.exception(logger_l2_l_cancel, e) |
| | | |
| | | # 设置真实下单位置 |
| | | def set_real_place_order_index(self, code, index, buy_single_index=None): |
| | | def set_real_place_order_index(self, code, index, buy_single_index=None, is_default=False): |
| | | l2_log.l_cancel_debug(code, f"设置真实下单位-{index},buy_single_index-{buy_single_index}") |
| | | self.__real_place_order_index_dict[code] = index |
| | | self.__real_place_order_index_dict[code] = (index, is_default) |
| | | RedisUtils.setex_async(self.__db, f"l_cancel_real_place_order_index-{code}", tool.get_expire(), index) |
| | | if buy_single_index is not None: |
| | | self.compute_watch_index(code, buy_single_index, buy_single_index, index) |
| | |
| | | if code not in self.__last_l_up_compute_info or time.time() - self.__last_l_up_compute_info[code][0] >= 3: |
| | | self.__compute_trade_progress_near_by_indexes(code, buy_single_index, |
| | | self.__last_trade_progress_dict.get(code) + 1, |
| | | self.__real_place_order_index_dict.get(code)) |
| | | self.__real_place_order_index_dict.get(code)[0]) |
| | | |
| | | # 计算范围内的成交位临近未撤大单 |
| | | def __compute_trade_progress_near_by_indexes(self, code, buy_single_index, start_index, end_index): |
| | |
| | | # 计算L后还没成交的手数 |
| | | def __compute_total_l_down_not_deal_num(self, code): |
| | | # 只有真实获取到下单位置后才开始计算 |
| | | |
| | | |
| | | try: |
| | | if code in self.__total_l_down_not_deal_num_dict and time.time() - \ |
| | |
| | | # L后已经不能守护 |
| | | HourCancelBigNumComputer().start_compute_watch_indexes(code, buy_single_index) |
| | | |
| | | # 重新计算成交位置临近大单撤单 |
| | | self.__compute_trade_progress_near_by_indexes(code, buy_single_index, index + 1, |
| | | self.__real_place_order_index_dict.get(code)) |
| | | real_place_order_index_info = self.__real_place_order_index_dict.get(code) |
| | | real_place_order_index = None |
| | | if real_place_order_index_info: |
| | | real_place_order_index = real_place_order_index_info[0] |
| | | |
| | | # 成交进度与L下撤无关 |
| | | # try: |
| | | # # 已经有计算的无法触发计算 |
| | | # old_watch_indexes = self.__get_watch_indexes_cache(code) |
| | | # if old_watch_indexes and self.__last_trade_progress_dict.get(code): |
| | | # return |
| | | # finally: |
| | | # self.__last_trade_progress_dict[code] = index |
| | | # |
| | | # if self.__real_place_order_index_dict.get(code): |
| | | # # 触发计算 |
| | | # self.compute_watch_index(code, self.__last_trade_progress_dict.get(code), |
| | | # self.__real_place_order_index_dict.get(code)) |
| | | # 重新计算成交位置临近大单撤单 |
| | | self.__compute_trade_progress_near_by_indexes(code, buy_single_index, index + 1, real_place_order_index) |
| | | |
| | | def add_transaction_datas(self, code, transaction_datas): |
| | | if not transaction_datas: |
| | |
| | | if orgin_deal_data is None: |
| | | return False, "L后暂时无成交" |
| | | |
| | | real_place_order_index_info = self.__real_place_order_index_dict.get(code) |
| | | if real_place_order_index_info and real_place_order_index_info[1]: |
| | | return False, "没获取到真实的下单位" |
| | | |
| | | threshold_rate = constant.L_CANCEL_FAST_DEAL_RATE |
| | | rate = orgin_deal_data[0] / (total_l_down_not_deal_num[0] * 100) |
| | | if rate > threshold_rate: |
| | |
| | | if buy_single_index is None: |
| | | return |
| | | # 重新囊括1笔 |
| | | real_place_order_index = self.__real_place_order_index_dict.get(code) |
| | | if real_place_order_index and real_place_order_index > index: |
| | | real_place_order_info = self.__real_place_order_index_dict.get(code) |
| | | if real_place_order_info and real_place_order_info[0] > index: |
| | | total_datas = local_today_datas.get(code) |
| | | min_num = int(5000 / (float(gpcode_manager.get_limit_up_price(code)))) |
| | | for j in range(index + 1, real_place_order_index): |
| | | for j in range(index + 1, real_place_order_info[0]): |
| | | data = total_datas[j] |
| | | val = data['val'] |
| | | if data["index"] in watch_indexes: |
| | |
| | | l2_log.l_cancel_debug(code, f"计算范围:{start_index}-{end_index},成交位临近已撤单比例:{rate}/{thresh_cancel_rate}") |
| | | if rate >= thresh_cancel_rate: |
| | | # 计算成交进度位置到当前下单位置的纯买额 |
| | | real_place_order_index = self.__real_place_order_index_dict.get(code) |
| | | real_place_order_index_info = self.__real_place_order_index_dict.get(code) |
| | | trade_progress_index = self.__last_trade_progress_dict.get(code) |
| | | if real_place_order_index and trade_progress_index: |
| | | if real_place_order_index_info and trade_progress_index: |
| | | total_num = 0 |
| | | thresh_hold_money = l2_trade_factor.L2PlaceOrderParamsManager.get_base_m_val(code) |
| | | thresh_hold_money = thresh_hold_money * 3 |
| | | # 阈值为2倍m值 |
| | | thresh_hold_num = thresh_hold_money // (float(gpcode_manager.get_limit_up_price(code)) * 100) |
| | | for i in range(trade_progress_index + 1, real_place_order_index): |
| | | for i in range(trade_progress_index + 1, real_place_order_index_info[0]): |
| | | data = total_data[i] |
| | | val = data['val'] |
| | | if not L2DataUtil.is_limit_up_price_buy(val): |
| | |
| | | if total_num > thresh_hold_num: |
| | | # 成交位到下单位还有足够的单没撤 |
| | | l2_log.l_cancel_debug(code, |
| | | f"L上撤阻断: 成交位-{trade_progress_index} 真实下单位-{real_place_order_index} 阈值-{thresh_hold_money}") |
| | | f"L上撤阻断: 成交位-{trade_progress_index} 真实下单位-{real_place_order_index_info[0]} 阈值-{thresh_hold_money}") |
| | | return False, None |
| | | |
| | | canceled_indexes.sort() |