| | |
| | | from trade import trade_data_manager, trade_queue_manager, l2_trade_factor |
| | | from l2 import l2_log, l2_data_log, l2_data_source_util |
| | | from l2.l2_data_util import L2DataUtil, local_today_num_operate_map, local_today_datas |
| | | from log_module.log import logger_buy_1_volumn, logger_l2_h_cancel, logger_l2_s_cancel |
| | | from log_module.log import logger_buy_1_volumn, logger_l2_h_cancel, logger_l2_s_cancel, logger_l2_d_cancel, \ |
| | | logger_l2_l_cancel |
| | | |
| | | |
| | | class SecondCancelBigNumComputer: |
| | |
| | | return False, "尚未获取到真实下单位置" |
| | | |
| | | left_num = 0 |
| | | for i in range(index, real_order_index + 1): |
| | | for i in range(index + 1, real_order_index): |
| | | data = total_data[i] |
| | | val = data['val'] |
| | | if not L2DataUtil.is_limit_up_price_buy(val): |
| | |
| | | total_data, |
| | | local_today_num_operate_map) |
| | | left_num += val['num'] * left_count |
| | | |
| | | # 剩下的不足动态M值的1/2 |
| | | rate = round(limit_up_price * left_num * 100 / m_value, 3) |
| | | rate = round(float(limit_up_price) * left_num * 100 / m_value, 3) |
| | | logger_l2_d_cancel.info( |
| | | f"{code}成交进度({index})到下单位置({real_order_index})的剩余笔数:{left_num},撤单比例:{rate},m值:{m_value}") |
| | | if rate < constant.D_CANCEL_RATE: |
| | | l2_log.cancel_debug(code, "D撤撤单,比例为:{},目标比例{}", rate, constant.D_CANCEL_RATE) |
| | | return True, f"D撤比例为:{rate}" |
| | | return False, "" |
| | | |
| | |
| | | @classmethod |
| | | def set_real_order_index(cls, code, index): |
| | | cls.__set_real_order_index(code, index) |
| | | logger_l2_d_cancel.info(f"{code}成交进度设置:{index}") |
| | | |
| | | @classmethod |
| | | def place_order_success(cls, code): |
| | | cls.clear(code) |
| | | |
| | | @classmethod |
| | | def cancel_success(cls, code): |
| | |
| | | cls.__getRedis().delete(f"l_cancel_watch_index-{code}") |
| | | |
| | | @classmethod |
| | | def clear(cls): |
| | | def clear(cls,code=None): |
| | | if code: |
| | | cls.del_watch_index(code) |
| | | else: |
| | | keys = cls.__getRedis().keys(f"l_cancel_watch_index-*") |
| | | for k in keys: |
| | | cls.__getRedis().delete(k) |
| | |
| | | watch_indexes.add(index) |
| | | if len(watch_indexes) >= constant.L_CANCEL_MAX_WATCH_COUNT: |
| | | break |
| | | logger_l2_l_cancel.info(f"{code}:设置监听范围,成交进度-{index} 监听范围-{watch_indexes}") |
| | | # 数据维护 |
| | | add_indexes = watch_indexes - old_watch_indexes |
| | | delete_indexes = old_watch_indexes - watch_indexes |
| | |
| | | if not watch_indexes: |
| | | return False, None |
| | | |
| | | # 计算监听的总条数 |
| | | total_count = 0 |
| | | for wi in watch_indexes: |
| | | total_count += total_data[wi]["re"] |
| | | # 判断撤单中是否有监听中的索引 |
| | | need_compute = False |
| | | for i in range(start_index, end_index + 1): |
| | | data = total_data[i] |
| | | val = data["val"] |
| | |
| | | buy_index = l2_data_source_util.L2DataSourceUtils.get_buy_index_with_cancel_data(code, data, |
| | | local_today_num_operate_map) |
| | | if buy_index is not None and buy_index in watch_indexes: |
| | | need_compute = True |
| | | break |
| | | if need_compute: |
| | | # 计算撤单比例 |
| | | canceled_count = 0 |
| | | total_count = 0 |
| | | for wi in watch_indexes: |
| | | left_count = l2_data_source_util.L2DataSourceUtils.get_limit_up_buy_no_canceled_count(code, |
| | | wi, |
| | | total_data, |
| | | local_today_num_operate_map) |
| | | canceled_count += (total_data[wi]["re"] - left_count) |
| | | total_count += total_data[wi]["re"] |
| | | if canceled_count / total_count >= constant.L_CANCEL_RATE: |
| | | return True, data |
| | | rate = round(canceled_count / total_count, 3) |
| | | logger_l2_l_cancel.info(f"计算范围:{start_index}-{end_index},已撤单比例:{rate}") |
| | | if rate >= constant.L_CANCEL_RATE: |
| | | return True, total_data[-1] |
| | | |
| | | return False, None |
| | | |
| | | @classmethod |
| | | def place_order_success(cls, code): |
| | | cls.clear(code) |
| | | |
| | | @classmethod |
| | | def cancel_success(cls, code): |
| | | cls.clear(code) |
| | | |
| | | # --------------------------------封单额变化撤------------------------ |
| | | # 涨停封单额统计 |
| | |
| | | filter=lambda record: record["extra"].get("name") == "h_cancel", |
| | | rotation="00:00", compression="zip", enqueue=True) |
| | | |
| | | logger.add(self.get_path("l2", "cancel/l_cancel"), |
| | | filter=lambda record: record["extra"].get("name") == "l_cancel", |
| | | rotation="00:00", compression="zip", enqueue=True) |
| | | |
| | | logger.add(self.get_path("l2", "cancel/d_cancel"), |
| | | filter=lambda record: record["extra"].get("name") == "d_cancel", |
| | | rotation="00:00", compression="zip", enqueue=True) |
| | | |
| | | logger.add(self.get_path("l2", "l2_trade_buy"), |
| | | filter=lambda record: record["extra"].get("name") == "l2_trade_buy", |
| | | rotation="00:00", compression="zip", enqueue=True) |
| | |
| | | logger_l2_trade_cancel = __mylogger.get_logger("l2_trade_cancel") |
| | | logger_l2_s_cancel = __mylogger.get_logger("s_cancel") |
| | | logger_l2_h_cancel = __mylogger.get_logger("h_cancel") |
| | | logger_l2_d_cancel = __mylogger.get_logger("d_cancel") |
| | | logger_l2_l_cancel = __mylogger.get_logger("l_cancel") |
| | | logger_l2_trade_buy = __mylogger.get_logger("l2_trade_buy") |
| | | logger_l2_trade_queue = __mylogger.get_logger("l2_trade_queue") |
| | | logger_l2_trade_buy_queue = __mylogger.get_logger("l2_trade_buy_queue") |
| | |
| | | total_datas[-1]["index"]) |
| | | f6 = dask.delayed(SecondCancelBigNumComputer.cancel_success)(code) |
| | | f7 = dask.delayed(DCancelBigNumComputer.cancel_success)(code) |
| | | dask.compute(f1, f2, f3, f4, f5, f6, f7) |
| | | f8 = dask.delayed(LCancelBigNumComputer.cancel_success)(code) |
| | | dask.compute(f1, f2, f3, f4, f5, f6, f7, f8) |
| | | |
| | | |
| | | # 真实买成功 |
| | |
| | | f5 = dask.delayed(l2_data_manager.TradePointManager.delete_count_info_for_cancel_buy)(code) |
| | | f6 = dask.delayed(SecondCancelBigNumComputer.cancel_success)(code) |
| | | f7 = dask.delayed(DCancelBigNumComputer.cancel_success)(code) |
| | | dask.compute(f1, f2, f3, f4, f5, f6, f7) |
| | | f8 = dask.delayed(LCancelBigNumComputer.cancel_success)(code) |
| | | |
| | | dask.compute(f1, f2, f3, f4, f5, f6, f7, f8) |
| | | |
| | | |
| | | if __name__ == "__main__": |
| | |
| | | f5 = dask.delayed(l2_data_manager.TradePointManager.delete_count_info_for_cancel_buy)(code) |
| | | f6 = dask.delayed(SecondCancelBigNumComputer.cancel_success)(code) |
| | | f7 = dask.delayed(DCancelBigNumComputer.cancel_success)(code) |
| | | dask.compute(f2, f3, f4, f5, f6, f7) |
| | | f8 = dask.delayed(LCancelBigNumComputer.cancel_success)(code) |
| | | dask.compute(f2, f3, f4, f5, f6, f7, f8) |