| | |
| | | import redis_manager |
| | | import ths_industry_util |
| | | import tool |
| | | import trade_data_manager |
| | | import trade_manager |
| | | import trade_queue_manager |
| | | from l2_data_manager import L2DataException, TradePointManager, local_today_datas, L2DataUtil, load_l2_data, \ |
| | | local_today_num_operate_map |
| | | from log import logger_l2_trade, logger_l2_trade_cancel, logger_l2_trade_buy, logger_l2_process, logger_buy_1_volumn |
| | |
| | | random_key = {} |
| | | l2BigNumForMProcessor = L2BigNumForMProcessor() |
| | | __codeActualPriceProcessor = CodeActualPriceProcessor() |
| | | buy1PriceManager = trade_queue_manager.Buy1PriceManager() |
| | | |
| | | @classmethod |
| | | def debug(cls, code, content, *args): |
| | |
| | | @classmethod |
| | | def __buy(cls, code, capture_timestamp, last_data, last_data_index): |
| | | can, reason = cls.__can_buy(code) |
| | | # 不能购买 |
| | | if not can: |
| | | cls.debug(code, "不可以下单,原因:{}", reason) |
| | | return |
| | | else: |
| | | cls.debug(code, "可以下单,原因:{}", reason) |
| | | |
| | | # 删除虚拟下单 |
| | | if code in cls.unreal_buy_dict: |
| | | cls.unreal_buy_dict.pop(code) |
| | | cls.debug(code, "开始执行买入") |
| | | try: |
| | | trade_manager.start_buy(code, capture_timestamp, last_data, |
| | | last_data_index) |
| | | l2_data_manager.TradePointManager.delete_buy_cancel_point(code) |
| | | cls.debug(code, "执行买入成功") |
| | | except Exception as e: |
| | | cls.debug(code, "执行买入异常:{}", str(e)) |
| | | pass |
| | | finally: |
| | | cls.debug(code, "m值影响因子:{}", l2_trade_factor.L2TradeFactorUtil.factors_to_string(code)) |
| | | |
| | | if not can: |
| | | cls.debug(code, "不可以下单,原因:{}", reason) |
| | | if not reason.startswith("买1价不为涨停价"): |
| | | # 中断买入 |
| | | trade_manager.break_buy(code, reason) |
| | | return |
| | | else: |
| | | cls.debug(code, "可以下单,原因:{}", reason) |
| | | try: |
| | | cls.debug(code, "开始执行买入") |
| | | trade_manager.start_buy(code, capture_timestamp, last_data, |
| | | last_data_index) |
| | | l2_data_manager.TradePointManager.delete_buy_cancel_point(code) |
| | | cls.debug(code, "执行买入成功") |
| | | except Exception as e: |
| | | cls.debug(code, "执行买入异常:{}", str(e)) |
| | | pass |
| | | finally: |
| | | cls.debug(code, "m值影响因子:{}", l2_trade_factor.L2TradeFactorUtil.factors_to_string(code)) |
| | | |
| | | # 是否可以取消 |
| | | @classmethod |
| | | def __can_cancel(cls, code): |
| | | # 14点后如果是板块老大就不需要取消了 |
| | | now_time_str = tool.get_now_time_str() |
| | | if int(now_time_str.replace(":", "")) >= 140000: |
| | | industry, codes = ths_industry_util.get_same_industry_codes(code, gpcode_manager.get_gp_list()) |
| | | if industry is None: |
| | | return True, "没有获取到行业" |
| | | codes_index = limit_up_time_manager.sort_code_by_limit_time(codes) |
| | | if codes_index is not None and codes_index.get(code) is not None: |
| | | # 同一板块中老二后面的不能买 |
| | | if codes_index.get(code) == 0: |
| | | return False, "14:00后老大不能撤单" |
| | | elif codes_index.get(code) == 1: |
| | | # 判断老大是否都是09:30:00涨停的 |
| | | # 同1板块老大是09:30:00涨停,老二14:00砸开的不撤 |
| | | first_count = 0 |
| | | for key in codes_index: |
| | | if codes_index[key] == 0: |
| | | first_count += 1 |
| | | if limit_up_time_manager.get_limit_up_time(key) == "09:30:00": |
| | | first_count -= 1 |
| | | if first_count == 0: |
| | | return False, "14:00后老大都开盘涨停,老二不能撤单" |
| | | |
| | | return True, "" |
| | | |
| | | # 是否可以买 |
| | | @classmethod |
| | | def __can_buy(cls, code): |
| | | # 买1价格必须为涨停价才能买 |
| | | # buy1_price = cls.buy1PriceManager.get_price(code) |
| | | # if buy1_price is None: |
| | | # return False, "买1价尚未获取到" |
| | | # limit_up_price = gpcode_manager.get_limit_up_price(code) |
| | | # if limit_up_price is None: |
| | | # return False, "尚未获取到涨停价" |
| | | # if abs(float(buy1_price) - float(limit_up_price)) >= 0.01: |
| | | # return False, "买1价不为涨停价,买1价-{} 涨停价-{}".format(buy1_price, limit_up_price) |
| | | |
| | | # 量比超过1.3的不能买 |
| | | volumn_rate = l2_trade_factor.L2TradeFactorUtil.get_volumn_rate_by_code(code) |
| | |
| | | |
| | | @classmethod |
| | | def cancel_buy(cls, code, msg=None): |
| | | can_cancel, reason = cls.__can_cancel(code) |
| | | if not can_cancel: |
| | | # 不能取消 |
| | | cls.cancel_debug(code, "撤单中断,原因:{}", reason) |
| | | return |
| | | |
| | | l2_data_manager.L2ContinueLimitUpCountManager.del_data(code) |
| | | if code in cls.unreal_buy_dict: |
| | | cls.unreal_buy_dict.pop(code) |
| | |
| | | count = threshold_count - sub_threshold_count |
| | | if count < 3: |
| | | count = 3 |
| | | return count |
| | | return round(count*buy1_factor) |
| | | |
| | | _start_time = t.time() |
| | | total_datas = local_today_datas[code] |
| | | # 计算从买入信号开始到计算开始位置的大单数量 |
| | |
| | | buy_nums = origin_num |
| | | buy_count = origin_count |
| | | limit_up_price = gpcode_manager.get_limit_up_price(code) |
| | | buy1_price = cls.buy1PriceManager.get_price(code) |
| | | if limit_up_price is None: |
| | | raise Exception("涨停价无法获取") |
| | | # 目标手数 |
| | | threshold_num = threshold_money / (limit_up_price * 100) |
| | | |
| | | buy1_factor = 1 |
| | | # 获取买1是否为涨停价 |
| | | if buy1_price is None: |
| | | buy1_factor = 1.3 |
| | | elif limit_up_price is None: |
| | | buy1_factor = 1.3 |
| | | elif abs(float(buy1_price) - float(limit_up_price)) >= 0.01: |
| | | print("买1价不为涨停价,买1价-{} 涨停价-{}".format(buy1_price, limit_up_price)) |
| | | buy1_factor = 1.3 |
| | | |
| | | # 目标订单数量 |
| | | threshold_count = l2_trade_factor.L2TradeFactorUtil.get_safe_buy_count(code) |
| | | |
| | |
| | | return None, buy_nums, buy_count, ii |
| | | # 涨停买 |
| | | if L2DataUtil.is_limit_up_price_buy(_val): |
| | | if cls.__is_big_money(limit_up_price,_val): |
| | | if cls.__is_big_money(limit_up_price, _val): |
| | | sub_threshold_count += int(total_datas[i]["re"]) |
| | | # 涨停买 |
| | | buy_nums += int(_val["num"]) * int(total_datas[i]["re"]) |
| | | buy_count += int(total_datas[i]["re"]) |
| | | if buy_nums >= threshold_num and buy_count >= get_threshold_count(): |
| | | logger_l2_trade_buy.info("{}获取到买入执行点:{} 统计纯买手数:{} 目标纯买手数:{} 统计纯买单数:{} 目标纯买单数:{}, 大单数量:{}", code, i, buy_nums, |
| | | threshold_num, buy_count, get_threshold_count(),sub_threshold_count) |
| | | logger_l2_trade_buy.info("{}获取到买入执行点:{} 统计纯买手数:{} 目标纯买手数:{} 统计纯买单数:{} 目标纯买单数:{}, 大单数量:{}", code, i, |
| | | buy_nums, |
| | | threshold_num, buy_count, get_threshold_count(), sub_threshold_count) |
| | | elif L2DataUtil.is_limit_up_price_buy_cancel(_val): |
| | | if cls.__is_big_money(limit_up_price, _val): |
| | | sub_threshold_count -= int(total_datas[i]["re"]) |
| | |
| | | if buy_nums >= threshold_num and buy_count >= get_threshold_count(): |
| | | return i, buy_nums, buy_count, None |
| | | |
| | | cls.buy_debug(code, "尚未获取到买入执行点,起始计算位置:{} 统计纯买手数:{} 目标纯买手数:{} 统计纯买单数:{} 目标纯买单数:{} 大单数量:{}", compute_start_index, |
| | | cls.buy_debug(code, "尚未获取到买入执行点,起始计算位置:{} 统计纯买手数:{} 目标纯买手数:{} 统计纯买单数:{} 目标纯买单数:{} 大单数量:{}", |
| | | compute_start_index, |
| | | buy_nums, |
| | | threshold_num, buy_count, get_threshold_count(),sub_threshold_count) |
| | | threshold_num, buy_count, get_threshold_count(), sub_threshold_count) |
| | | |
| | | return None, buy_nums, buy_count, None |
| | | |