From 18cd3598a6abf19dac1a02eb19c9db8edae8cc0c Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期二, 11 七月 2023 16:45:56 +0800
Subject: [PATCH] 华鑫适配

---
 third_data/hot_block_data_process.py |  226 ++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 211 insertions(+), 15 deletions(-)

diff --git a/third_data/hot_block_data_process.py b/third_data/hot_block_data_process.py
index 6ff6a26..72866b0 100644
--- a/third_data/hot_block_data_process.py
+++ b/third_data/hot_block_data_process.py
@@ -1,13 +1,18 @@
 """
 鐑棬鏉垮潡鏁版嵁澶勭悊
 """
+import datetime
 import json
 
-import tool
+from utils import tool
 from db import redis_manager
 from db import mysql_data
+from code_attribute import limit_up_time_manager, gpcode_manager
+from l2 import code_price_manager
+from third_data.history_k_data_util import HistoryKDatasUtils
 
 __redisManager = redis_manager.RedisManager(0)
+INVALID_BLOCKS = ["鍏朵粬", "ST鑲�", "ST鎽樺附", "涓氱哗澧為暱", "涓氱哗棰勫", "鍏憡", "娆℃柊鑲�"]
 
 
 def __get_redis():
@@ -21,38 +26,63 @@
 
     @classmethod
     def save(cls, day, datas):
-        cls.latest_datas = datas
+
         mysqldb = mysql_data.Mysqldb()
         # 缁熻浠g爜鎵�灞炴澘鍧�
         code_block_dict = {}
         for data in datas:
             for code_info in data[2]:
-                code = code_info[0].split(".")[0]
+                code = code_info[0][1].split(".")[0]
                 if not code_block_dict.get(code):
                     code_block_dict[code] = set()
                 code_block_dict[code].add(data[0])
 
+        # 濡傛灉鏈鍜屼笂娆$浉宸殑浠g爜涓斾箣鍓嶆湁杩囨定鍋滃氨鍒ゆ柇涓虹偢鏉�
+        if cls.latest_datas:
+            latest_codes = set()
+            for data in cls.latest_datas:
+                for code_info in data[2]:
+                    code = code_info[0][1].split(".")[0]
+                    latest_codes.add(code)
+            now_codes = set(code_block_dict.keys())
+            del_set = latest_codes - now_codes
+            for code in del_set:
+                # 鑾峰彇涔嬪墠鏄惁娑ㄥ仠杩�
+                results = cls.list_by_code(code, tool.get_now_date())
+                if results:
+                    first_limit_up_time = results[0][8]
+                    if len(first_limit_up_time) > 6:
+                        # 涔嬪墠娑ㄥ仠杩囷紝鏇存柊鐐告澘鏃堕棿
+                        for result in results:
+                            mysqldb.execute(
+                                f"update xgb_hot_block set _open_limit_up_time='{tool.get_now_time_str()}',_update_time=now() where _id='{result[0]}'")
+        cls.latest_datas = datas
         for data in datas:
             for code_info in data[2]:
-                code = code_info[0].split(".")[0]
+                code = code_info[0][1].split(".")[0]
                 _id = f"{day}_{data[0]}_{code}"
 
                 result = mysqldb.select_one("select * from xgb_hot_block where _id='{}'".format(_id))
                 limit_up_time = code_info[4]
                 if len(limit_up_time) <= 6:
                     limit_up_time = ''
+                # 00/60寮�澶翠唬鐮� 鏈夋定鍋滄椂闂�
+                if code.find("00") == 0 or code.find("60") == 0:
+                    if len(limit_up_time) > 6:
+                        code_price_manager.Buy1PriceManager.set_limit_up_time(code, limit_up_time)
+
                 if not result:
                     mysqldb.execute(
-                        f"insert into xgb_hot_block(_id,_day,_block_name,_code,_limit_up_time,_price,_rate,_update_time,_first_limit_up_time) values('{_id}','{day}','{data[0]}','{code}','{code_info[4]}','{code_info[2]}','{code_info[3]}',now(),'{limit_up_time}')")
+                        f"insert into xgb_hot_block(_id,_day,_block_name,_code,_limit_up_time,_price,_rate,_update_time,_first_limit_up_time,_code_name) values('{_id}','{day}','{data[0]}','{code}','{code_info[4]}','{code_info[2]}','{code_info[3]}',now(),'{limit_up_time}','{code_info[0][0]}')")
                 else:
                     # 濡傛灉涓婃鐨勬暟鎹拰杩欐涓�鏍峰氨涓嶆洿鏂帮紝鍚﹀垯闇�瑕佹洿鏂版暟鎹�
                     if cls.__last_datas.get(_id) != code_info:
                         mysqldb.execute(
-                            f"update xgb_hot_block set _limit_up_time='{code_info[4]}',_price='{code_info[2]}',_rate='{code_info[3]}',_update_time=now() where _id='{_id}'")
+                            f"update xgb_hot_block set _limit_up_time='{code_info[4]}',_price='{code_info[2]}',_rate='{code_info[3]}',_update_time=now(),_code_name='{code_info[0][0]}' where _id='{_id}'")
                         if (not result[8] or len(result[8]) <= 6) and len(limit_up_time) >= 6:
+                            # 娌℃湁棣栨娑ㄥ仠鏃堕棿
                             mysqldb.execute(
                                 f"update xgb_hot_block set _first_limit_up_time='{limit_up_time}',_update_time=now() where _id='{_id}'")
-
                 cls.__last_datas[_id] = code_info
                 # 鑾峰彇鍘熸潵鐨勪唬鐮佹墍灞炴澘鍧�,鍒犻櫎涔嬪墠閿欒鐨勬澘鍧�
                 old_datas = XGBHotBlockDataManager.list_by_code(code, day)
@@ -78,33 +108,171 @@
         mysqldb = mysql_data.Mysqldb()
         return mysqldb.select_all(f"select * from xgb_hot_block where _block_name='{block_name}' and _day='{day}'")
 
+    @staticmethod
+    def list_blocks_with_day(days):
+        mysqldb = mysql_data.Mysqldb()
+        sql = "select _block_name,_day from xgb_hot_block where "
+        wheres = []
+        for day in days:
+            wheres.append(f"_day = '{day}'")
+        sql += " or ".join(wheres)
+        sql += " group by _block_name,_day"
+
+        results = mysqldb.select_all(sql)
+        return results
+
+    @staticmethod
+    def get_latest_blocks(code):
+        wheres = []
+        for b in INVALID_BLOCKS:
+            wheres.append(f"hb.`_block_name` != '{b}'")
+        wheres = " and ".join(wheres)
+        sql = f"SELECT GROUP_CONCAT(_block_name) FROM (SELECT hb.`_block_name`,hb.`_day` FROM `xgb_hot_block` hb WHERE hb.`_code`='{code}' AND {wheres} ORDER BY hb.`_day` DESC LIMIT 10) a  GROUP BY a._day ORDER BY a._day DESC LIMIT 1"
+        mysqldb = mysql_data.Mysqldb()
+        return mysqldb.select_one(sql)
+
+
+class XGBDataUtil:
+
+    # 鏉垮潡涓槸鍚︽湁楂樹綅绁�
+    @classmethod
+    def is_has_high_code(cls, block_name, latest_datas):
+        if not latest_datas:
+            return False
+        for block in latest_datas:
+            if block[0] != block_name:
+                continue
+            for code_data in block[2]:
+                if code_data[1] and code_data[1].find("鏉�") >= 0:
+                    day = code_data[1][-2:-1]
+                    if int(day) >= 2:
+                        return True, code_data
+        return False, None
+
+
+__blocks_dict = {}
+
+
+def get_latest_block(day_count=15):
+    now_day = tool.get_now_date_str()
+    if now_day in __blocks_dict:
+        return __blocks_dict[now_day]
+    now_date = datetime.datetime.now()
+    end_date = HistoryKDatasUtils.get_previous_trading_date(tool.get_now_date_str())
+    start_date = now_date - datetime.timedelta(days=(day_count * 2 + 10))
+    start_date = start_date.strftime("%Y-%m-%d")
+    days = HistoryKDatasUtils.get_trading_dates(start_date, end_date)
+    days = days[0 - day_count:]
+    results = XGBHotBlockDataManager.list_blocks_with_day(days)
+    __blocks_dict[now_day] = results
+    return results
+
+
+# 鍔犺浇涔嬪墠鐨勬澘鍧�
+__before_block_dict = {}
+
+
+def __load_before_block(code):
+    if code not in __before_block_dict:
+        blocks = XGBHotBlockDataManager.get_latest_blocks(code)
+        if blocks:
+            blocks = blocks[0].split(',')
+            __before_block_dict[code] = blocks
+
+    return __before_block_dict.get(code)
+
+
+def __get_code_from_code_info(code_info):
+    code = code_info[0][1].split(".")[0]
+    return code
+
 
 # 鑾峰彇浠g爜鎵�鍦ㄦ澘鍧椾俊鎭�
 def get_info(code):
     blocks = get_code_blocks(code)
+    if not blocks:
+        blocks = __load_before_block(code)
+    latest_blocks_info = get_latest_block(15)
+    # 缁熻鏉垮潡鍑虹幇娆℃暟
 
+    # 鑾峰彇鐩爣鏉垮潡
     target_block = None
     if blocks:
         for block in blocks:
-            if block == '鍏憡' or block == '鍏朵粬':
+            if block in INVALID_BLOCKS:
                 continue
             target_block = block
             break
     if not target_block:
         return None
 
-    limit_up_codes_set = set()
+    # 缁熻鏉垮潡涓殑骞冲潎娑ㄥ箙
+    total_rates = 0
+    total_count = 0
+    target_block_rate = 0
+    if XGBHotBlockDataManager.latest_datas:
+        for b in XGBHotBlockDataManager.latest_datas:
+            if b[0] != target_block:
+                continue
+            if b[1]:
+                target_block_rate = float(b[1].strip().replace("%", ''))
+            for code_info in b[2]:
+                code__ = __get_code_from_code_info(code_info)
+                rate = float(code_info[3].strip().replace("%", ''))
+                if code__ != code:
+                    total_rates += rate
+                    total_count += 1
+
+    # 缁熻鏉垮潡鍑虹幇鐨勬鏁�
+    target_block_histry_count = 0
+    if blocks:
+        for block_info in latest_blocks_info:
+            if block_info[0] != target_block:
+                continue
+            target_block_histry_count += 1
+
+    # 鏄惁鍑虹幇杩囬珮浣嶆澘
+    high_block_infos = []
+    for block in blocks:
+        if block == '鍏憡' or block == '鍏朵粬':
+            continue
+        if XGBHotBlockDataManager.latest_datas:
+            has_high, high_code_info = XGBDataUtil.is_has_high_code(block, XGBHotBlockDataManager.latest_datas)
+            if has_high:
+                high_block_info = (high_code_info[0], high_code_info[1])
+                high_block_infos.append(high_block_info)
+
+    limit_up_codes_info_set = set()
+    # 鏉垮潡涓嬬殑浠g爜鏁伴噺
+    block_codes_set = set()
     if XGBHotBlockDataManager.latest_datas:
         for block in XGBHotBlockDataManager.latest_datas:
             if block[0] == target_block:
                 for code_data in block[2]:
+                    code_ = code_data[0][1].split('.')[0]
                     if len(code_data[4]) > 6:
-                        limit_up_codes_set.add(code_data[0].split('.')[0])
+                        limit_up_codes_info_set.add((code_, code_data[4]))
+                        block_codes_set.add(code_)
+    # 鑾峰彇娑ㄥ仠鐨勯『搴�
+    limit_up_index = -1
+    limit_up_codes_info_list = list(limit_up_codes_info_set)
+    limit_up_codes_info_list.sort(key=lambda x: x[1])
+    for i in range(0, len(limit_up_codes_info_list)):
+        if limit_up_codes_info_list[i][0] == code:
+            limit_up_index = i
+    if limit_up_index < 0:
+        limit_up_index = len(limit_up_codes_info_list)
+
+    # 娑ㄥ仠浠g爜闆嗗悎
+    limit_up_codes_set = set([k[0] for k in limit_up_codes_info_list])
+
     limit_up_codes_set.discard(code)
-    limit_up_count = len(limit_up_codes_set)
+    block_codes_set.discard(code)
+    limit_up_codes_count = len(block_codes_set)
 
     total_datas = XGBHotBlockDataManager.total_datas
     break_codes = set()
+    re_limit_codes = set()
     for data in total_datas:
         block = data[2]
         if block != target_block:
@@ -112,15 +280,39 @@
         code = data[3]
         limit_up_time = data[4]
         first_limit_up_time = data[8]
+        open_limit_up_time = data[10]
         if len(limit_up_time) <= 6 and first_limit_up_time and len(first_limit_up_time) > 6:
             break_codes.add(code)
+        if len(limit_up_time) > 6 and open_limit_up_time and len(open_limit_up_time) > 6:
+            re_limit_codes.add(code)
+
     # 鎺掗櫎鑷繁
     break_codes.discard(code)
     # 鎺掗櫎宸茬粡娑ㄥ仠鐨勪唬鐮�
     break_codes = break_codes.difference(limit_up_codes_set)
     # 鐐告澘涓暟
     break_size = len(break_codes)
-    return target_block, limit_up_count, break_size
+
+    # 鐐告澘鍥炲皝鏁伴噺
+    re_limit_up_size = len(re_limit_codes)
+    fresult = {
+        # 鐩爣鏉垮潡淇℃伅锛堟澘鍧楀悕绉�,鏉垮潡娑ㄥ箙,鍘嗗彶鏉垮潡鍑虹幇娆℃暟锛�
+        "target_block_info": (target_block, target_block_rate, target_block_histry_count),
+        # 娑ㄥ仠椤哄簭
+        "limit_up_index": limit_up_index,
+        # 娑ㄥ仠浠g爜鏁伴噺
+        "limit_up_codes_count": limit_up_codes_count,
+        # 鏉垮潡浠g爜娑ㄥ箙淇℃伅
+        "block_codes_rates_info": (total_rates, total_count),
+        # 鐐告澘浠g爜鏁伴噺
+        "break_size": break_size,
+        # 鐐告澘鍥炲皝鏁伴噺
+        "re_limit_up_size": re_limit_up_size,
+        # 楂樹綅鐗堜俊鎭�
+        "high_block_infos": high_block_infos,
+    }
+
+    return fresult
 
 
 # 淇濆瓨鏁版嵁
@@ -131,7 +323,12 @@
     for block in datas:
         codes = []
         for code_data in block[2]:
-            code = code_data[0].split(".")[0]
+            code = code_data[0][1].split(".")[0]
+            if gpcode_manager.FirstCodeManager.is_in_first_record(code):
+                limit_up_time = code_data[4]
+                if limit_up_time and len(limit_up_time) > 6:
+                    if not limit_up_time_manager.get_limit_up_time(code):
+                        limit_up_time_manager.save_limit_up_time(code, limit_up_time)
             if code not in code_block_dict:
                 code_block_dict[code] = set()
             code_block_dict[code].add(block[0])
@@ -178,5 +375,4 @@
 if __name__ == "__main__":
     # XGBHotBlockDataManager.total_datas=XGBHotBlockDataManager.list_all("2023-03-23")
     # get_info('002230')
-    codes = set([1, 2, 3, 4])
-    print(codes.difference(set([1, 2])))
+    print(__load_before_block("603163"))

--
Gitblit v1.8.0