| | |
| | | BUY_SCORE_RANK_3 = 260 |
| | | |
| | | # 开盘啦 |
| | | KPL_INVALID_BLOCKS = {"一季报增长", "二季报增长", "三季报增长", "四季报增长", "业绩增长", "中报增长", "年报增长", "年报预增", "无", "次新股", "ST摘帽", "ST板块", "超跌", |
| | | KPL_INVALID_BLOCKS = {"一季报增长", "二季报增长", "三季报增长", "四季报增长", "业绩增长", "中报增长", "年报增长", "年报预增", "无", "次新股", "ST摘帽", "ST板块", |
| | | "超跌", |
| | | "股权转让", "并购重组", "再融资", "年报预增", " 专精特新", "壳资源", "行业龙头", "科创板", "实控人变更"} |
| | | # 是否开启API交易 |
| | | API_TRADE_ENABLE = True |
| | |
| | | |
| | | # 可买入的金额 |
| | | AVAILABLE_BUY_MONEYS = [5000, 20000, 30000, 40000, 50000] |
| | | |
| | | # 板上放量是否可扫入 |
| | | CAN_RADICAL_BUY_AT_LIMIT_UP = False |
| | | |
| | | # 每次扫入是否都需要大单 |
| | | CAN_RADICAL_BUY_NEED_BIG_ORDER_EVERYTIME = True |
| | |
| | | from l2.place_order_single_data_manager import L2TradeSingleDataProcessor |
| | | from log_module import async_log_util, log_export |
| | | from third_data import kpl_data_manager, block_info |
| | | from trade.buy_radical.radical_buy_data_manager import EveryLimitupBigDealOrderManager |
| | | from utils import global_util, tool, buy_condition_util, buy_strategy_util, trade_util |
| | | import l2_data_util |
| | | from db import redis_manager_delegate as redis_manager |
| | |
| | | bigger_money = l2_data_util.get_big_money_val(limit_up_price, tool.is_ge_code(code)) |
| | | min_num = int(bigger_money / limit_up_price / 100) |
| | | # 如果有大单成交就不需要看大单 |
| | | total_deal_money = BigOrderDealManager().get_total_buy_money(code) |
| | | |
| | | if constant.CAN_RADICAL_BUY_NEED_BIG_ORDER_EVERYTIME: |
| | | # 每次下单都需要大单 |
| | | total_deal_money = EveryLimitupBigDealOrderManager.get_big_buy_deal_order_money(code) |
| | | else: |
| | | # 只需要总成交的大单 |
| | | total_deal_money = BigOrderDealManager().get_total_buy_money(code) |
| | | refer_sell_data = L2MarketSellManager().get_refer_sell_data(code, radical_data[3]) |
| | | # 参考总卖额 |
| | | refer_sell_money = 0 |
| | | if refer_sell_data: |
| | | refer_sell_money = refer_sell_data[1] |
| | | THRESHOLD_MONEY = 2990000 |
| | | if total_deal_money >= THRESHOLD_MONEY: |
| | | if refer_sell_money >= 1e7: |
| | | THRESHOLD_MONEY = 2990000 * 2 |
| | | else: |
| | | THRESHOLD_MONEY = 2990000 |
| | | if total_deal_money >= THRESHOLD_MONEY: |
| | | min_num = int(5000 / limit_up_price) |
| | | |
| | | # 总委托大单金额 |
| | | total_delegating_big_money = 0 |
| | | single_index = None |
| | | for i in range(start_index, end_index + 1): |
| | | data = total_datas[i] |
| | |
| | | # 判断是否为大单 |
| | | order_money = dealing_active_order_info[2] + round(val["price"], 2) * val["num"] * 100 |
| | | if order_money >= bigger_money: |
| | | total_deal_money += order_money |
| | | if total_deal_money >= THRESHOLD_MONEY: |
| | | single_index = i |
| | | break |
| | | total_delegating_big_money += order_money |
| | | if total_delegating_big_money + total_deal_money >= THRESHOLD_MONEY: |
| | | single_index = i |
| | | break |
| | | |
| | | if int(val["orderNo"]) <= radical_data[1]: |
| | | # 主动买单后的数据不算 |
| | | continue |
| | | |
| | | total_deal_money += round(val["price"], 2) * val["num"] * 100 |
| | | if total_deal_money >= THRESHOLD_MONEY: |
| | | total_delegating_big_money += round(val["price"], 2) * val["num"] * 100 |
| | | if total_delegating_big_money + total_deal_money >= THRESHOLD_MONEY: |
| | | single_index = i |
| | | break |
| | | if single_index is not None: |
| | |
| | | |
| | | if not radical_data: |
| | | return False, None, "不满足激进买的条件" |
| | | if t.time() > radical_data[0] and not is_radical_buy: |
| | | # 没扫入过才需要判断时间 |
| | | return False, None, "超过生效时间" |
| | | |
| | | if constant.CAN_RADICAL_BUY_AT_LIMIT_UP: |
| | | # 板上放量可扫入 |
| | | if t.time() > radical_data[0] and not is_radical_buy: |
| | | # 没扫入过才需要判断时间 |
| | | return False, None, "超过生效时间" |
| | | else: |
| | | # 板上放量不可扫入 |
| | | if t.time() > radical_data[0]: |
| | | return False, None, "超过生效时间" |
| | | |
| | | result = __can_order() |
| | | l2_log.debug(code, f"L2扫入判断:{result}") |
| | | if result[0]: |
| | | # 已经扫入下过单的就需要判断板上放量的距离 |
| | | if is_radical_buy: |
| | | # 已经扫入下过单且允许板上放量扫入的就需要判断板上放量的距离 |
| | | if is_radical_buy and constant.CAN_RADICAL_BUY_AT_LIMIT_UP: |
| | | is_limit_up_buy = cls.__is_at_limit_up_buy(code) |
| | | if is_limit_up_buy: |
| | | # 判断成交进度到当前数据的笔数,如果少于10笔且还有未成交的大单(>=299)就可以下单 |
| | |
| | | deal_codes) |
| | | if not buy_blocks: |
| | | return False, result[1], f"板块代码已有成交:{radical_data[2]}" |
| | | # 如果板上放量不可买入就需要删除信号 |
| | | if not constant.CAN_RADICAL_BUY_AT_LIMIT_UP and code in RadicalBuyDealCodesManager.buy_by_l2_delegate_expire_time_dict: |
| | | RadicalBuyDealCodesManager.buy_by_l2_delegate_expire_time_dict.pop(code) |
| | | return True, result[1], radical_data[2] |
| | | return result |
| | | |
| | |
| | | buy_datas, bigger_buy_datas = HuaXinBuyOrderManager.statistic_big_buy_data(code, datas, limit_up_price) |
| | | if buy_datas: |
| | | BigOrderDealManager().add_buy_datas(code, buy_datas) |
| | | EveryLimitupBigDealOrderManager.add_big_buy_order_deal(code, [x[0] for x in buy_datas]) |
| | | EveryLimitupBigDealOrderManager.add_big_buy_order_deal(code, [(x[0], x[2]) for x in buy_datas]) |
| | | try: |
| | | is_placed_order = l2_data_manager.TradePointManager.is_placed_order(order_begin_pos) |
| | | if is_placed_order: |
| | |
| | | if buy_result: |
| | | # 下单成功 |
| | | radical_buy_data_manager.BlockPlaceOrderRecordManager().add_record(code, buy_blocks) |
| | | radical_buy_strategy.clear_latest_deal_active_buy_order(code) |
| | | else: |
| | | RadicalBuyDealCodesManager.buy_by_l2_delegate_expire_time_dict[code] = ( |
| | | time.time() + 30, transaction_datas[-1][6], buy_blocks) |
| | | time.time() + 30, transaction_datas[-1][6], buy_blocks, l2_huaxin_util.convert_time(transaction_datas[-1][3])) |
| | | else: |
| | | async_log_util.info(logger_l2_radical_buy, f"不能下单:{code}-{result_by_volume}") |
| | | else: |
| | |
| | | return None |
| | | |
| | | |
| | | if __name__ == "__main__": |
| | | # print(getLimitUpInfoNew()) |
| | | def getZLJECodesRank(index): |
| | | """ |
| | | 获取主力金额的排行 |
| | | @return: |
| | | """ |
| | | data = f"Order=1&a=RealRankingInfo_W8&st=50&c=NewStockRanking&PhoneOSNew=1&RStart=0925&DeviceID=d6f20ce9-fa08-31c9-a493-536ebb8e9773&VerSion=5.13.0.0&Isst=0&index={index}&Date=&REnd=1420&apiv=w35&Type=1&FilterMotherboard=0&Filter=0&Ratio=6&FilterTIB=1&FilterGem=0&" |
| | | result = __base_request("https://apphwhq.longhuvip.com/w1/api/index.php", data=data, timeout=3) |
| | | result = json.loads(result) |
| | | return result |
| | | |
| | | # __getConceptBK("300564") |
| | | data = getMarketJingXuanRealRankingInfoByTimeRange("0925", "1000", "2024-11-12") |
| | | data = json.loads(data) |
| | | print(json.loads(data)) |
| | | data = getMarketJingXuanRealRankingInfoByTimeRange("0925", "1500", "2024-11-13") |
| | | print(json.loads(data)) |
| | | data = getMarketJingXuanRealRankingInfoByTimeRange("0925", "1000", "2024-11-13") |
| | | print(json.loads(data)) |
| | | # data=json.loads(data) |
| | | # print(len(data["list"])) |
| | | # data = json.loads(getCodesByPlate("801235")) |
| | | # print(data) |
| | | |
| | | if __name__ == "__main__": |
| | | result = getZLJECodesRank(0) |
| | | for d in result['list']: |
| | | print(d) |
| | |
| | | @param code: |
| | | @return: |
| | | """ |
| | | return self.__radical_buy_reasons_dict.get(code) |
| | | if code in self.__radical_buy_reasons_dict: |
| | | return set(self.__radical_buy_reasons_dict.get(code)) |
| | | return None |
| | | |
| | | |
| | | class TodayLimitUpReasonChangeManager: |
| | |
| | | volume_rate = 0.5 |
| | | big_order_deal_enough = True, "", True |
| | | if not constant.TEST: |
| | | big_order_deal_enough = is_big_order_deal_enough(code, volume_rate) |
| | | big_order_deal_enough = is_big_order_deal_enough(code, volume_rate, 0) |
| | | if not big_order_deal_enough[0] and big_order_deal_enough[2]: |
| | | return False, "交易前两分钟大单不足" |
| | | |
| | |
| | | if volume_rate is None: |
| | | volume_rate = 0.5 |
| | | big_order_deal_enough = is_big_order_deal_enough(code, |
| | | volume_rate) # BigOrderDealManager().get_total_buy_count(code) |
| | | volume_rate, |
| | | 0) # BigOrderDealManager().get_total_buy_count(code) |
| | | if big_order_deal_enough[0]: |
| | | gpcode_manager.MustBuyCodesManager().add_code(code) |
| | | |
| | |
| | | return self.__codes |
| | | |
| | | |
| | | def is_big_order_deal_enough(code, volume_rate): |
| | | def is_big_order_deal_enough(code, volume_rate, refer_total_sell_money, delegating_big_order_money=0): |
| | | """ |
| | | 大单成交是否足够 |
| | | @param delegating_big_order_money: 正在委托的大单金额 |
| | | @param refer_total_sell_money: 引用的总卖额 |
| | | @param code: |
| | | @param volume_rate: |
| | | @return: 大单是否足够, 原因, 是否是短时生效 |
| | |
| | | before_time = tool.get_now_time_as_int() < 93200 |
| | | # 计算大单参考数量 |
| | | threshold_count = 1 # int(round(0.4 * money_y)) |
| | | if refer_total_sell_money >= 1e7: |
| | | threshold_count = 2 |
| | | else: |
| | | threshold_count = 1 |
| | | if before_time: |
| | | threshold_count = int(round(0.4 * money_y * 1.5)) |
| | | threshold_money = threshold_count * 299 * 10000 |
| | | |
| | | if volume_rate >= 0.5 or True: |
| | | if volume_rate >= 0.5 and False: |
| | | # 按量大于50%算 |
| | | # 当换手量>50%时,则,不需要每次扫入时需要≥2笔大单,而是累计需要≥2笔大单即可 |
| | | deal_big_order_money = BigOrderDealManager().get_total_buy_money(code) |
| | |
| | | else: |
| | | return False, f"量比-{volume_rate}, 总大单成交金额({deal_big_order_money})<{threshold_money}", before_time |
| | | else: |
| | | current_big_order_deal_count = EveryLimitupBigDealOrderManager.get_big_buy_deal_order_count(code) |
| | | if current_big_order_deal_count >= threshold_count: |
| | | return True, f"量比-{volume_rate}, 本次大单成交数量({current_big_order_deal_count})>={threshold_count}", before_time |
| | | current_big_order_deal_money = EveryLimitupBigDealOrderManager.get_big_buy_deal_order_money(code) |
| | | if current_big_order_deal_money + delegating_big_order_money >= threshold_money: |
| | | return True, f"量比-{volume_rate}, 本次大单成交金额({current_big_order_deal_money})+委托大单金额({delegating_big_order_money})>={threshold_money}", before_time |
| | | else: |
| | | return False, f"量比-{volume_rate}, 本次大单成交数量({current_big_order_deal_count})<{threshold_count}", before_time |
| | | return False, f"量比-{volume_rate}, 本次大单成交金额({current_big_order_deal_money}) + 委托大单金额({delegating_big_order_money}) <{threshold_money}", before_time |
| | | |
| | | |
| | | class EveryLimitupBigDealOrderManager: |
| | |
| | | 每次上板的大单管理 |
| | | """ |
| | | # 成交大单的订单号:{"code":{"order_no",...}} |
| | | __deal_big_order_nos_dict = {} |
| | | __deal_big_order_infos_dict = {} |
| | | # 成交大单号 |
| | | __deal_big_order_no_dict = {} |
| | | |
| | | @classmethod |
| | | def open_limit_up(cls, code): |
| | | if code in cls.__deal_big_order_nos_dict: |
| | | cls.__deal_big_order_nos_dict[code].clear() |
| | | if code in cls.__deal_big_order_infos_dict: |
| | | cls.__deal_big_order_infos_dict[code].clear() |
| | | |
| | | @classmethod |
| | | def add_big_buy_order_deal(cls, code, order_nos: list): |
| | | if code not in cls.__deal_big_order_nos_dict: |
| | | cls.__deal_big_order_nos_dict[code] = set() |
| | | for order_no in order_nos: |
| | | cls.__deal_big_order_nos_dict[code].add(order_no) |
| | | def add_big_buy_order_deal(cls, code, order_infos: list): |
| | | """ |
| | | 加入大单成交 |
| | | @param code: |
| | | @param order_infos:[(订单号,金额)] |
| | | @return: |
| | | """ |
| | | if code not in cls.__deal_big_order_infos_dict: |
| | | cls.__deal_big_order_infos_dict[code] = [] |
| | | |
| | | if code not in cls.__deal_big_order_no_dict: |
| | | cls.__deal_big_order_no_dict[code] = set() |
| | | |
| | | for order_info in order_infos: |
| | | if order_info[0] not in cls.__deal_big_order_no_dict[code]: |
| | | cls.__deal_big_order_infos_dict[code].append(order_info) |
| | | cls.__deal_big_order_no_dict[code].add(order_info[0]) |
| | | |
| | | @classmethod |
| | | def get_big_buy_deal_order_count(cls, code): |
| | | if code in cls.__deal_big_order_nos_dict: |
| | | return len(cls.__deal_big_order_nos_dict[code]) |
| | | if code in cls.__deal_big_order_infos_dict: |
| | | return len(cls.__deal_big_order_infos_dict[code]) |
| | | return 0 |
| | | |
| | | @classmethod |
| | | def get_big_buy_deal_order_money(cls, code): |
| | | if code in cls.__deal_big_order_infos_dict: |
| | | return sum([x[1] for x in cls.__deal_big_order_infos_dict[code]]) |
| | | return 0 |
| | | |
| | | |
| | |
| | | return BUY_MODE_NONE, "尚未获取到总卖额(备用)" |
| | | |
| | | |
| | | def clear_latest_deal_active_buy_order(code): |
| | | """ |
| | | 清除最近主动成交的订单信息 |
| | | @param code: |
| | | @return: |
| | | """ |
| | | if code in __latest_deal_active_buy_order: |
| | | __latest_deal_active_buy_order.pop(code) |
| | | |
| | | |
| | | def process_limit_up_active_buy_deal(code, transaction_datas): |
| | | async_log_util.info(hx_logger_l2_transaction, f"板上成交:{code}-{transaction_datas}") |
| | | """ |
| | |
| | | money = transaction_data[1] * transaction_data[2] |
| | | price = transaction_data[1] |
| | | |
| | | # 统计当前的买单 |
| | | # 统计成交的买单 |
| | | if __latest_deal_active_buy_order[code][0] == transaction_data[6]: |
| | | __latest_deal_active_buy_order[code][1] += transaction_data[2] |
| | | __latest_deal_active_buy_order[code][2] += money |
| | |
| | | |
| | | price = transaction_datas[-1][1] |
| | | huaxin_timestamp = transaction_datas[-1][3] |
| | | |
| | | # 获取参考总卖额 |
| | | refer_sell_data = L2MarketSellManager().get_refer_sell_data(code, l2_huaxin_util.convert_time( |
| | | huaxin_timestamp)) |
| | | async_log_util.info(logger_l2_radical_buy, f"参考总卖额(备用):{code}-{refer_sell_data}") |
| | | |
| | | # 参考总卖额 |
| | | refer_sell_money = 0 |
| | | |
| | | if refer_sell_data: |
| | | refer_sell_money = refer_sell_data[1] |
| | | |
| | | |
| | | # 处于涨停卖的委托订单总手数 |
| | | selling_num = L2LimitUpSellDataManager.get_delegating_sell_num(code) |
| | | if selling_num is None: |
| | |
| | | THRESHOLD_RATE = radical_buy_data_manager.get_volume_rate_threshold(code, volume_rate) |
| | | if rate >= THRESHOLD_RATE: |
| | | # 根据大单判断是否可以扫 |
| | | big_order_deal_result = radical_buy_data_manager.is_big_order_deal_enough(code, volume_rate) |
| | | big_order_deal_result = radical_buy_data_manager.is_big_order_deal_enough(code, volume_rate, refer_sell_money) |
| | | if big_order_deal_result[0]: |
| | | return BUY_MODE_DIRECT, f"剩余涨停总卖额-{selling_num * price},原涨停总卖-{total_sell},已成交额-{__deal_active_buy_total_money[code]},成交比例-{rate}/{THRESHOLD_RATE}" |
| | | else: |
| | |
| | | if volume_rate is None: |
| | | volume_rate = 0.5 |
| | | # 根据大单判断是否可以扫 |
| | | big_order_deal_result = radical_buy_data_manager.is_big_order_deal_enough(code, volume_rate) |
| | | big_order_deal_result = radical_buy_data_manager.is_big_order_deal_enough(code, volume_rate, refer_sell_money) |
| | | result = __get_deal_rate_by(code, huaxin_timestamp) |
| | | if result[0] == BUY_MODE_DIRECT: |
| | | if big_order_deal_result[0]: |
| | |
| | | __deal_codes_cache = set() |
| | | __instance = None |
| | | __mysqldb = Mysqldb() |
| | | # 根据L2数据来激进买入的有效时间:{"code":(有效截至时间, 买单号, 扫入的板块)} |
| | | # 根据L2数据来激进买入的有效时间:{"code":(有效截至时间, 买单号, 扫入的板块, 最近成交时间)} |
| | | buy_by_l2_delegate_expire_time_dict = {} |
| | | # 仅仅买的板块 |
| | | radical_buy_blocks_dict = {} |