| | |
| | | return None, "" |
| | | |
| | | |
| | | class LatestCancelIndexManager: |
| | | __db = 0 |
| | | __redis_manager = redis_manager.RedisManager(0) |
| | | __latest_cancel_index_cache = {} |
| | | __instance = None |
| | | |
| | | def __new__(cls, *args, **kwargs): |
| | | if not cls.__instance: |
| | | cls.__instance = super(LatestCancelIndexManager, cls).__new__(cls, *args, **kwargs) |
| | | cls.__load_datas() |
| | | return cls.__instance |
| | | |
| | | @classmethod |
| | | def __get_redis(cls): |
| | | return cls.__redis_manager.getRedis() |
| | | |
| | | @classmethod |
| | | def __load_datas(cls): |
| | | __redis = cls.__get_redis() |
| | | try: |
| | | keys = RedisUtils.keys(__redis, "latest_cancel_index-*") |
| | | for k in keys: |
| | | code = k.split("-")[-1] |
| | | val = RedisUtils.get(__redis, k) |
| | | val = int(val) |
| | | CodeDataCacheUtil.set_cache(cls.__latest_cancel_index_cache, code, val) |
| | | finally: |
| | | RedisUtils.realse(__redis) |
| | | |
| | | def __save_latest_cancel_index(self, code, index): |
| | | RedisUtils.setex_async(self.__db, f"latest_cancel_index-{code}", tool.get_expire(), index) |
| | | |
| | | def set_latest_cancel_index(self, code, index): |
| | | CodeDataCacheUtil.set_cache(self.__latest_cancel_index_cache, code, index) |
| | | self.__save_latest_cancel_index(code, index) |
| | | |
| | | def get_latest_cancel_index_cache(self, code): |
| | | result = CodeDataCacheUtil.get_cache(self.__latest_cancel_index_cache, code) |
| | | if result[0]: |
| | | return result[1] |
| | | return None |
| | | |
| | | pass |
| | | |
| | | |
| | | if __name__ == "__main__": |
| | | pass |
| | |
| | | time_str = f"{item[5]}" |
| | | if time_str.startswith("9"): |
| | | time_str = f"0{time_str}" |
| | | ms = "{:0<3}".format(time_str[6:]) |
| | | time_ = f"{time_str[0:2]}:{time_str[2:4]}:{time_str[4:6]}" |
| | | price = item[1] |
| | | if price <= 0: |
| | |
| | | else: |
| | | # 卖 |
| | | operateType = 2 |
| | | return {"time": time_, "price": price, "num": item[2] // 100, "limitPrice": limitPrice, |
| | | return {"time": time_, "tms": ms, "price": price, "num": item[2] // 100, "limitPrice": limitPrice, |
| | | "operateType": operateType, "cancelTime": 0, "cancelTimeUnit": 0, "orderNo": item[8], |
| | | "mainSeq": item[6], "subSeq": item[7]} |
| | | |
| | |
| | | for i in range(0, len(fdatas)): |
| | | fdatas[i]["index"] = start_index + i |
| | | return fdatas |
| | | |
| | | |
| | | if __name__ == "__main__": |
| | | ds =["('605167', 10.08, 68500, '1', '0', 9303108, 2, 439438, 436472, 'D', 1695864632451)", |
| | | "('603439', 17.97, 27800, '1', '0', 9304966, 6, 435127, 407524, 'D', 1695864649883)", |
| | | "('002369', 0.0, 100800, '1', '2', 93051880, 2011, 1431910, 1160638, 'D', 1695864651875)" |
| | | ] |
| | | for d in ds: |
| | | d = eval(d) |
| | | print(__convert_order(d, 15.55)) |
| | |
| | | from l2 import safe_count_manager, l2_data_manager, l2_log, l2_data_source_util, code_price_manager, \ |
| | | transaction_progress, cancel_buy_strategy, l2_data_log |
| | | from l2.cancel_buy_strategy import SecondCancelBigNumComputer, HourCancelBigNumComputer, DCancelBigNumComputer, \ |
| | | LCancelBigNumComputer |
| | | LCancelBigNumComputer, LatestCancelIndexManager |
| | | from l2.l2_data_manager import L2DataException |
| | | from l2.l2_data_util import local_today_datas, L2DataUtil, local_today_num_operate_map, local_today_buyno_map, \ |
| | | local_latest_datas, local_today_canceled_buyno_map |
| | |
| | | __WantBuyCodesManager = gpcode_manager.WantBuyCodesManager() |
| | | __TradeTargetCodeModeManager = TradeTargetCodeModeManager() |
| | | __TradeOrderIdManager = trade_huaxin.TradeOrderIdManager() |
| | | __LatestCancelIndexManager = LatestCancelIndexManager() |
| | | |
| | | # 获取代码评分 |
| | | @classmethod |
| | |
| | | # cancel_data, cancel_msg = s_cancel(buy_single_index, buy_exec_index) |
| | | if not cancel_data: |
| | | cancel_data, cancel_msg = h_cancel(buy_single_index, buy_exec_index) |
| | | # l2_log.debug(code, "撤单计算结束") |
| | | # _start_time = l2_data_log.l2_time(code, tool.get_now_timestamp() - _start_time, |
| | | # "已下单-撤单 判断是否需要撤单") |
| | | if cancel_data: |
| | | l2_log.debug(code, "触发撤单,撤单位置:{} ,撤单原因:{}", cancel_data["index"], cancel_msg) |
| | | l2_log.trade_record(code, "撤单", "'index':{} , 'msg':'{}'", cancel_data["index"], cancel_msg) |
| | | # 撤单 |
| | | cls.cancel_buy(code, cancel_msg) |
| | | # _start_time = l2_data_log.l2_time(code, tool.get_now_timestamp() - _start_time, |
| | | # "已下单-撤单 耗时") |
| | | cls.cancel_buy(code, cancel_msg, cancel_index=cancel_data["index"]) |
| | | # 撤单成功,继续计算下单 |
| | | cls.__process_not_order(code, cancel_data["index"] + 1, end_index, capture_time, is_first_code) |
| | | # _start_time = l2_data_log.l2_time(code, tool.get_now_timestamp() - _start_time, |
| | | # "处理剩余数据 耗时") |
| | | else: |
| | | pass |
| | | |
| | |
| | | if not L2DataUtil.is_limit_up_price_buy(val): |
| | | continue |
| | | left_count = l2_data_source_util.L2DataSourceUtils.get_limit_up_buy_no_canceled_count_v2(code, |
| | | data["index"], |
| | | data[ |
| | | "index"], |
| | | total_data, |
| | | local_today_canceled_buyno_map.get( |
| | | code)) |
| | |
| | | for i in range(trade_index + 1, total_data[-1]["index"] + 1): |
| | | if L2DataUtil.is_limit_up_price_buy(total_data[i]["val"]): |
| | | left_count = l2_data_source_util.L2DataSourceUtils.get_limit_up_buy_no_canceled_count_v2(code, |
| | | total_data[i]["index"], |
| | | total_data[ |
| | | i][ |
| | | "index"], |
| | | total_data, |
| | | local_today_canceled_buyno_map.get( |
| | | code)) |
| | |
| | | pass |
| | | |
| | | @classmethod |
| | | def cancel_buy(cls, code, msg=None, source="l2"): |
| | | def cancel_buy(cls, code, msg=None, source="l2", cancel_index=None): |
| | | # 是否是交易队列触发 |
| | | buy_single_index, buy_exec_index, buy_compute_index, num, count, max_num_set, buy_volume_rate = cls.__get_order_begin_pos( |
| | | code) |
| | |
| | | l2_log.cancel_debug(code, "撤单中断,原因:{}", reason) |
| | | l2_log.debug(code, "撤单中断,原因:{}", reason) |
| | | return False |
| | | if cancel_index is None: |
| | | cancel_index = total_datas[-1]["index"] |
| | | cls.__LatestCancelIndexManager.set_latest_cancel_index(code, cancel_index) |
| | | cancel_result = cls.__cancel_buy(code) |
| | | if cancel_result: |
| | | trade_result_manager.real_cancel_success(code, buy_single_index, buy_exec_index, total_datas) |
| | |
| | | return True |
| | | return False |
| | | |
| | | # l2时间差值 |
| | | @classmethod |
| | | def time_sub_as_ms(cls, val1, val2): |
| | | # 计算时间差值 |
| | | sub_s = tool.trade_time_sub(val1["time"], val2["time"]) |
| | | sub_ms = int(val1["tms"]) - int(val2["tms"]) |
| | | fs = sub_s * 1000 + sub_ms |
| | | return fs |
| | | |
| | | |
| | | class L2TradeQueueUtils(object): |
| | | # 买入数据是否已撤 |
| | |
| | | |
| | | |
| | | if __name__ == "__main__": |
| | | print(load_l2_data("002235")) |
| | | print(L2DataUtil.time_sub_as_ms({"time": "13:00:00", "time_ms": "980"}, {"time": "11:29:59", "time_ms": "590"})) |
| | |
| | | from l2 import l2_data_manager_new, l2_log, code_price_manager, l2_data_util, l2_data_manager, transaction_progress, \ |
| | | l2_data_log |
| | | from l2.cancel_buy_strategy import HourCancelBigNumComputer, LCancelBigNumComputer, DCancelBigNumComputer, \ |
| | | GCancelBigNumComputer, SecondCancelBigNumComputer, LCancelRateManager |
| | | GCancelBigNumComputer, SecondCancelBigNumComputer, LCancelRateManager, LatestCancelIndexManager |
| | | from l2.huaxin import huaxin_target_codes_manager |
| | | from l2.huaxin.huaxin_target_codes_manager import HuaXinL1TargetCodesManager |
| | | from l2.l2_data_manager_new import L2TradeDataProcessor |
| | |
| | | except Exception as e: |
| | | hx_logger_l2_transaction.exception(e) |
| | | finally: |
| | | async_log_util.info(hx_logger_l2_transaction, f"{code}处理用时:{int((time.time() - __start_time) * 1000)}") |
| | | async_log_util.info(hx_logger_l2_upload, f"{code}处理成交用时:{int((time.time() - __start_time) * 1000)}") |
| | | |
| | | @classmethod |
| | | def l2_market_data(cls, code, data): |
| | |
| | | cancel_style = xlwt.easyxf('pattern: pattern solid, fore_colour gray25') |
| | | |
| | | ws.write(index, 0, data["index"], style) |
| | | ws.write(index, 1, data["val"]["time"], style) |
| | | ws.write(index, 1, data["val"]["time"] + (f".{data['val']['tms']}" if "tms" in data["val"] else ''), style) |
| | | cancel_time = data["val"]["cancelTime"] |
| | | if cancel_time == '0': |
| | | cancel_time = '' |
| | |
| | | cancel_data = l2.l2_data_util.local_today_canceled_buyno_map.get(code).get(str(data["val"]["orderNo"])) |
| | | # 买 |
| | | if cancel_data: |
| | | if cancel_data["index"] == 137: |
| | | print("进入断点") |
| | | try: |
| | | ws.write(index, 8, "{}-{}".format(cancel_data["index"], cancel_data["val"]["time"]), cancel_style) |
| | | except Exception as e: |