From ae8d76a456b64c1c6c4ebf11b6ec33b7df217b1a Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期一, 18 八月 2025 13:43:46 +0800
Subject: [PATCH] bug修复

---
 third_data/history_k_data_util.py |  147 ++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 126 insertions(+), 21 deletions(-)

diff --git a/third_data/history_k_data_util.py b/third_data/history_k_data_util.py
index bfc77b7..197e0e0 100644
--- a/third_data/history_k_data_util.py
+++ b/third_data/history_k_data_util.py
@@ -4,13 +4,18 @@
 import datetime
 import decimal
 import json
+import time
 
 import requests
 
 import constant
 from db.redis_manager_delegate import RedisUtils
+from log_module.log import logger_request_api, logger_debug
+from third_data import hx_qc_value_util
 from utils import tool, middle_api_protocol
 from db import redis_manager_delegate as redis_manager
+
+
 # import gm.api as gmapi
 
 
@@ -29,7 +34,14 @@
         fdata = None
         if DELEGATE:
             fdata = middle_api_protocol.load_juejin(path_str, data_json)
-            fdata = middle_api_protocol.request(fdata)
+            __start_time = time.time()
+            try:
+                fdata = middle_api_protocol.request(fdata)
+            finally:
+                __use_time = time.time() - __start_time
+                if __use_time > 5:
+                    logger_request_api.info(f"鎺橀噾API璇锋眰鏃堕棿锛歿path_str}-{int(__use_time)}")
+
         else:
             url = f'{cls.__BASE_URL}{path_str}'
             # 鍙戦�丳OST璇锋眰
@@ -72,6 +84,11 @@
                               "skip_st": skip_st, "fields": fields})
 
     @classmethod
+    def get_history_instruments(cls, symbols, start_date, end_date, fields):
+        return cls.__request("get_history_instruments",
+                             {"symbols": symbols, "start_date": start_date, "end_date": end_date, "fields": fields})
+
+    @classmethod
     def get_previous_trading_date(cls, exchange, date):
         return cls.__request("get_previous_trading_date", {"exchange": exchange, "date": date})
 
@@ -104,9 +121,9 @@
     def get_juejin_code_list_with_prefix(cls, codes):
         list = []
         for d in codes:
-            if d[0:2] == '00':
+            if tool.is_sz_code(d):
                 list.append("SZSE.{}".format(d))
-            elif d[0:2] == '60':
+            elif tool.is_sh_code(d):
                 list.append("SHSE.{}".format(d))
         return list
 
@@ -137,7 +154,7 @@
             return results
 
     @classmethod
-    def get_gp_current_info(cls, codes):
+    def get_gp_current_info(cls, codes, fields=None):
         if not codes:
             return []
         symbols = cls.get_juejin_code_list_with_prefix(codes)
@@ -147,29 +164,43 @@
             data = gmapi.current(symbols=",".join(symbols))
             return data
         else:
-            data = JueJinHttpApi.current(symbols=",".join(symbols), fields='')
+            data = JueJinHttpApi.current(symbols=",".join(symbols), fields=fields)
             return data
         # 杩斿洖鎸囧畾鏃ユ湡鐨勪笂涓氦鏄撴棩
 
     # 鑾峰彇浜ゆ槗鎵�鐨勪唬鐮�
     @classmethod
-    def get_exchanges_codes(cls, exchanges):
+    def get_exchanges_codes(cls, exchanges, skip_suspended=True, skip_st=True, fields=None):
         if constant.JUEJIN_LOCAL_API:
             account_id, s_id, token = cls.getJueJinAccountInfo()
             gmapi.set_token(token)
-            return gmapi.get_instruments(exchanges=exchanges, sec_types=[1], skip_suspended=True, skip_st=True,
+            return gmapi.get_instruments(exchanges=exchanges, sec_types=[1], skip_suspended=skip_suspended,
+                                         skip_st=skip_st,
                                          fields="symbol,sec_type,sec_id,sec_name,listed_date,sec_level,is_suspended,pre_close")
         else:
-            return JueJinHttpApi.get_exchanges_codes(exchanges=exchanges, sec_types=[1], skip_suspended=True,
-                                                     skip_st=True,
-                                                     fields="symbol,sec_type,sec_id,sec_name,listed_date,sec_level,is_suspended,pre_close")
+            if not fields:
+                fields = "symbol,sec_type,sec_id,sec_name,listed_date,sec_level," "is_suspended,pre_close"
+            return JueJinHttpApi.get_exchanges_codes(exchanges=exchanges, sec_types=[1], skip_suspended=skip_suspended,
+                                                     skip_st=skip_st,
+                                                     fields=fields)
+
+    @classmethod
+    def get_history_instruments(cls, symbols, start_date, end_date, fields=None):
+        if constant.JUEJIN_LOCAL_API:
+            account_id, s_id, token = cls.getJueJinAccountInfo()
+            gmapi.set_token(token)
+            return gmapi.get_history_instruments(symbols=symbols, start_date=start_date, end_date=end_date,
+                                                 fields="symbol,sec_type,sec_id,sec_name,listed_date,sec_level,is_suspended,pre_close")
+        else:
+            return JueJinHttpApi.get_history_instruments(symbols, start_date, end_date, fields)
 
     @classmethod
     def get_previous_trading_date(cls, date):
         if constant.JUEJIN_LOCAL_API:
-            account_id, s_id, token = cls.getJueJinAccountInfo()
-            gmapi.set_token(token)
-            return gmapi.get_previous_trading_date("SHSE", date)
+            # account_id, s_id, token = cls.getJueJinAccountInfo()
+            # gmapi.set_token(token)
+            # return gmapi.get_previous_trading_date("SHSE", date)
+            pass
         else:
             return JueJinHttpApi.get_previous_trading_date("SHSE", date)
 
@@ -194,15 +225,23 @@
 
 
 class HistoryKDatasUtils(object):
-    __previous_trading_date_cache={}
+    __previous_trading_date_cache = {}
+    __latest_trading_date_cache = {}
 
     @classmethod
     def get_gp_latest_info(cls, codes, fields=None):
         return JueJinApi.get_gp_latest_info(codes, fields)
 
     @classmethod
-    def get_history_tick_n(cls, code, count, fields=None):
-        return JueJinApi.get_history_tick_n(code, count, fields)
+    def get_history_tick_n(cls, code, count, fields=None, juejin=False):
+        # return JueJinApi.get_history_tick_n(code, count, fields)
+        if constant.is_windows() or juejin:
+            return JueJinApi.get_history_tick_n(code, count, fields)
+        else:
+            try:
+                return hx_qc_value_util.get_history_k_bars(code, count)
+            except Exception as e:
+                logger_debug.exception(e)
 
     @classmethod
     def get_gp_current_info(cls, codes):
@@ -211,7 +250,13 @@
     # 杩斿洖鎸囧畾鏃ユ湡鐨勪笂涓氦鏄撴棩
     @classmethod
     def get_previous_trading_date(cls, date):
-        return JueJinApi.get_previous_trading_date(date)
+        if constant.is_windows():
+            return JueJinApi.get_previous_trading_date(date)
+        else:
+            try:
+                return hx_qc_value_util.get_previous_trading_date(date)
+            except:
+                return JueJinApi.get_previous_trading_date(date)
 
     @classmethod
     def get_previous_trading_date_cache(cls, date):
@@ -222,14 +267,48 @@
             cls.__previous_trading_date_cache[date] = fdata
         return fdata
 
+    # 鑾峰彇鏈�杩戠殑浜ゆ槗鏃�
+    @classmethod
+    def get_latest_trading_date(cls, day_count):
+        """
+       鑾峰彇鏈�杩戝嚑涓氦鏄撴棩锛堜笉鍖呭惈浠婂ぉ锛�
+        @param day_count:
+        @return:
+        """
+        now_day = tool.get_now_date_str()
+        days = []
+        for i in range(day_count):
+            pday = cls.get_previous_trading_date_cache(now_day)
+            days.append(pday)
+            now_day = pday
+        return days
+
+    @classmethod
+    def get_latest_trading_date_cache(cls, day_count):
+        """
+        鑾峰彇鏈�杩戝嚑涓氦鏄撴棩锛堜笉鍖呭惈浠婂ぉ锛�
+        @param day_count:
+        @return:
+        """
+        key = f"{tool.get_now_date_str()}-{day_count}"
+        if key in cls.__latest_trading_date_cache:
+            return cls.__latest_trading_date_cache[key]
+        days = cls.get_latest_trading_date(day_count)
+        cls.__latest_trading_date_cache[key] = days
+        return days
+
     # 杩斿洖鎸囧畾鏃ユ湡鐨勪笅涓氦鏄撴棩
     @classmethod
     def get_next_trading_date(cls, date):
-        return JueJinApi.get_next_trading_date(date)
+        # return JueJinApi.get_next_trading_date(date)
+        if constant.is_windows():
+            return JueJinApi.get_next_trading_date(date)
+        else:
+            return hx_qc_value_util.get_next_trading_date(date)
 
     @classmethod
     def get_trading_dates(cls, start_date, end_date):
-        return JueJinApi.get_trading_dates(start_date, end_date)
+        return hx_qc_value_util.get_trade_calendar(start_date, end_date)
 
     @classmethod
     def get_now_price(cls, codes):
@@ -282,7 +361,33 @@
             results[code] = code_name
         return results
 
+    @classmethod
+    def get_st_codes(cls):
+        """
+        鑾峰彇st浠g爜
+        @return:
+        """
+        results = JueJinApi.get_exchanges_codes("SHSE,SZSE", skip_st=False, fields="sec_id,sec_level")
+        codes = [x["sec_id"] for x in results if x["sec_level"] != 1]
+        return codes
+
+
+def get_k_bar_dead_date():
+    """
+    鑾峰彇K绾跨殑鎴鏃ユ湡
+    @return:
+    """
+    dates = HistoryKDatasUtils.get_latest_trading_date_cache(5)
+    latest_trading_date = None
+    if dates:
+        latest_trading_date = dates[0]
+    if latest_trading_date is None:
+        raise Exception("娌℃湁鑾峰彇鍒颁笂涓�涓氦鏄撴棩鐨勬棩鏈�")
+    # 4鐐逛箣鍚庢敼涓鸿幏鍙栦粖鏃ョ殑鏁版嵁
+    if tool.get_now_time_as_int() > 160000:
+        latest_trading_date = tool.get_now_date_str()
+    return latest_trading_date
+
 
 if __name__ == "__main__":
-    constant.JUEJIN_LOCAL_API = False
-    print(HistoryKDatasUtils.get_lowest_price_rate("000725", 30))
+    pass

--
Gitblit v1.8.0