Administrator
2024-01-05 fd2767c1e2bec489fb93bf69bcbf70e289d1382e
bug修复/回踩不够拉黑/闪电下单涨停挂单笔数必须≥5笔
8个文件已修改
91 ■■■■ 已修改文件
code_attribute/code_nature_analyse.py 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
code_attribute/first_target_code_data_processor.py 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
l2/cancel_buy_strategy.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
l2/l2_data_manager_new.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
test/test_code_attribute.py 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
third_data/kpl_api.py 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
trade/huaxin/huaxin_trade_record_manager.py 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
trade/huaxin/huaxin_trade_server.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
code_attribute/code_nature_analyse.py
@@ -405,6 +405,52 @@
    return False
# 连续涨停后是否回调不足够
def is_continue_limit_up_not_enough_fall_dwon(record_datas):
    # 10 天内是否有连续3板
    datas = copy.deepcopy(record_datas)
    datas.sort(key=lambda x: x["bob"])
    datas = datas[0 - 10:]
    limit_up_continue_count_info = None
    max_limit_up_continue_count_info_list = []  # [连续涨停次数,涨停起点]
    for i in range(len(datas)):
        item = datas[i]
        if __is_limit_up(item):
            if not limit_up_continue_count_info:
                limit_up_continue_count_info = [1, i]
            else:
                limit_up_continue_count_info[0] += 1
        else:
            if limit_up_continue_count_info:
                max_limit_up_continue_count_info_list.append(limit_up_continue_count_info)
                limit_up_continue_count_info = None
    max_limit_up_info = None
    for x in max_limit_up_continue_count_info_list:
        if max_limit_up_info is None:
            max_limit_up_info = x
        if max_limit_up_info[0] <=  x[0]:
            max_limit_up_info = x
    if not max_limit_up_info or max_limit_up_info[0] < 3:
        print("无3连板")
        return False
    start_index = max_limit_up_info[1]
    max_price_info = [0, None]
    for i in range(start_index, len(datas)):
        item = datas[i]
        if item["high"] > max_price_info[0]:
            max_price_info = [item["high"], i]
    # 计算回踩价格
    lowest_price_threhhold = round((1-0.28) * max_price_info[0], 2)
    for i in range(max_price_info[1] + 1, len(datas)):
        item = datas[i]
        if item["low"] < lowest_price_threhhold:
            print("回踩足够")
            return False
    return True
# 是否有涨停
def get_first_limit_up_count(datas):
    datas = copy.deepcopy(datas)
code_attribute/first_target_code_data_processor.py
@@ -103,7 +103,8 @@
    # 获取60天最大记录
    for code in codes:
        need_get_volumn = False
        if code not in global_util.max60_volumn or global_util.max60_volumn.get(code) is None or code_nature_analyse.CodeNatureRecordManager().get_k_format_cache(code) is None:
        if code not in global_util.max60_volumn or global_util.max60_volumn.get(
                code) is None or code_nature_analyse.CodeNatureRecordManager().get_k_format_cache(code) is None:
            need_get_volumn = True
        # if not need_get_volumn and code_nature_analyse.CodeNatureRecordManager.get_nature_cache(
        #         code) is None:
@@ -141,7 +142,10 @@
                if code_nature_analyse.is_price_too_high_in_days(volumes_data, limit_up_price):
                    # 判断是否太高
                    l2_trade_util.forbidden_trade(code, "6天内股价长得太高")
                    # HighIncreaseCodeManager().add_code(code)
                if code_nature_analyse.is_continue_limit_up_not_enough_fall_dwon(volumes_data):
                    # 判断是否太高
                    l2_trade_util.forbidden_trade(code, "回踩不够")
                if code_nature_analyse.is_have_latest_max_volume(volumes_data, 2):
                    # 最近2天是否是最高量
@@ -232,4 +236,3 @@
    gpcode_first_screen_manager.process_ticks(prices)
    logger_l2_codes_subscript.info(f"({request_id})l2代码相关数据加载完成")
    return tick_datas
l2/cancel_buy_strategy.py
@@ -1472,7 +1472,7 @@
            logger_l2_l_cancel.exception(e)
            raise e
        extra_msg = "L后"
        if not can_cancel and int(tool.get_now_time_str().replace(":", "")) > int("100000"):
        if not can_cancel:
            # 成交位临近撤
            try:
                can_cancel, cancel_data = self.__compute_near_by_trade_progress_need_cancel(code, buy_exec_index,
l2/l2_data_manager_new.py
@@ -1756,8 +1756,8 @@
                    buy_count -= int(total_datas[i]["re"])
            l2_log.buy_debug(code, "位置-{},总手数:{},目标手数:{}", i,
                             buy_nums, threshold_num)
            # 有撤单信号,且小于阈值
            if buy_nums >= threshold_num and trigger_buy:
            # 纯买额足够,且笔数大于5笔
            if buy_nums >= threshold_num and trigger_buy and buy_count>=5:
                try:
                    info = cls.__trade_log_placr_order_info_dict[code]
                    info.set_trade_factor(threshold_money, 0, [])
test/test_code_attribute.py
@@ -10,13 +10,8 @@
if __name__ == "__main__":
    code = "000897"
    limit_up_price = 2.39
    code = "002167"
    volumes_data = init_data_util.get_volumns_by_code(code, 150)
    volumes = init_data_util.parse_max_volume(volumes_data[:90],
                                              code_nature_analyse.is_new_top(
                                                  limit_up_price,
                                                  volumes_data[:90]) or code_nature_analyse.is_near_top(
                                                  limit_up_price,
                                                  volumes_data[:90]))
    print(volumes)
    volumes_data=volumes_data[0:]
    if code_nature_analyse.is_continue_limit_up_not_enough_fall_dwon(volumes_data):
        print("回踩不够")
third_data/kpl_api.py
@@ -47,8 +47,9 @@
def __getLimitUpInfo(pidType, page, pageSize):
    data = f"Order=0&a=DailyLimitPerformance&st={pageSize}&apiv=w35&Type=4&c=HomeDingPan&PhoneOSNew=1&DeviceID=a38adabd-99ef-3116-8bb9-6d893c846e23&VerSion=5.13.0.0&Index={(page - 1) * pageSize}&PidType={pidType}&"
    data = f"Order=0&a=DailyLimitPerformance&st={pageSize}&apiv=w35&Type=4&c=HomeDingPan&PhoneOSNew=1&DeviceID=a38adabd-99ef-3116-8bb9-6d893c846e24&VerSion=5.13.0.0&Index={(page - 1) * pageSize}&PidType={pidType}&"
    result = __base_request("https://apphq.longhuvip.com/w1/api/index.php", data=data)
    print(result)
    return result
@@ -58,7 +59,9 @@
    for pid_info in pids:
        results = []
        for i in range(10):
            start_time = time.time()
            result = __getLimitUpInfo(pid_info[0], i + 1, 20)
            print("请求用时", time.time() - start_time)
            result = json.loads(result)
            datas = result["info"][0]
            results.extend(datas)
@@ -257,4 +260,3 @@
if __name__ == "__main__":
    print(getLimitUpInfoNew())
trade/huaxin/huaxin_trade_record_manager.py
@@ -34,9 +34,14 @@
        __current_delegate_records_cache = fresults
    # 获取当前处于委托状态的订单
    def list_current_delegates(self):
    def list_current_delegates(self, code=None):
        if self.__current_delegate_records_dict_cache:
            return [self.__current_delegate_records_dict_cache[k] for k in self.__current_delegate_records_dict_cache]
            fresults = []
            for k in self.__current_delegate_records_dict_cache:
                if code and self.__current_delegate_records_dict_cache[k]["securityID"] != code:
                    continue
                fresults.append(self.__current_delegate_records_dict_cache[k])
            return fresults
        return None
    @classmethod
trade/huaxin/huaxin_trade_server.py
@@ -1076,7 +1076,7 @@
                            else:
                                deal_order_system_id_infos[d["orderSysID"]][0] += d["volume"]
                    # 获取9:30之前的卖委托
                    current_delegates = DelegateRecordManager().list_current_delegates()
                    current_delegates = DelegateRecordManager().list_current_delegates(code)
                    if current_delegates:
                        for d in current_delegates:
                            if d["orderSysID"] not in deal_order_system_id_infos: