From 5648819608a812a34a6ec757a2cbed5e5141777d Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期一, 01 九月 2025 16:31:38 +0800
Subject: [PATCH] 动态总大单公式修改

---
 huaxin_client/l1_api_client.py |  262 +++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 235 insertions(+), 27 deletions(-)

diff --git a/huaxin_client/l1_api_client.py b/huaxin_client/l1_api_client.py
index 7e190b1..7aab40a 100644
--- a/huaxin_client/l1_api_client.py
+++ b/huaxin_client/l1_api_client.py
@@ -1,12 +1,16 @@
 import logging
+import multiprocessing
 import threading
 import time
 
+import constant
 import qcvalueaddproapi
-import sys
+from log_module.log import logger_system, logger_debug
+from utils import tool
 
 global g_userid, g_passwd, g_address, g_port, g_seqnum
 g_seqnum = 100000
+from datetime import datetime
 
 
 def new_seqnum():
@@ -26,21 +30,130 @@
     def __create_request_id(self):
         return new_seqnum()
 
-    def queryTradeCalendar(self):
+    def __query_trade_calendar(self, start_date, end_date, page_locate=1, page_count=200):
+        """
+        鏌ヨ浜ゆ槗鏃ュ巻
+        @param start_date: 鏍煎紡锛�20241201
+        @param end_date: 鏍煎紡锛�20241201
+        @param page_locate:
+        @param page_count:
+        @return: 杩斿洖鏃ユ湡[椤哄簭]
+        """
         try:
             queryField = qcvalueaddproapi.CQCVDReqQryShareCalendarField()
-            queryField.BegDate = "20240701"
-            queryField.EndDate = "20240801"
-            queryField.PageCount = 100
-            queryField.PageLocate = 1
+            queryField.BegDate = start_date
+            queryField.EndDate = end_date
+            queryField.PageCount = page_count
+            queryField.PageLocate = page_locate
+            queryField.OrderType = qcvalueaddproapi.QCVD_ORDST_ASC
             request_id = self.__create_request_id()
             results = self.m_api.ReqReqQryShareCalendar(queryField, request_id)
             for i in range(0, 1000):
                 if request_id in self.__result_cache:
-                    return self.__result_cache
+                    return self.__result_cache[request_id]
                 time.sleep(0.002)
+        except Exception as e:
+            logging.exception(e)
+        return []
 
-            print("ReqReqQryShareCalendar:", results)
+    def queryTradeCalendar(self, start_date, end_date):
+        """
+        鏌ヨ浜ゆ槗鏃ュ巻
+        @return:
+        """
+        fresults = []
+        try:
+            page_locate = 1
+            for i in range(20):
+                results = self.__query_trade_calendar(start_date.replace("-", ""), end_date.replace("-", ""),
+                                                      page_locate=page_locate)
+                if results:
+                    fresults.extend(results)
+                if len(results) != 200:
+                    break
+                page_locate += 1
+            print("queryTradeCalendar:", len(fresults))
+        except Exception as e:
+            logger_debug.exception(e)
+        return fresults
+
+    def __query_bars(self, code, begin_date, end_date, page_locate=1, page_count=200):
+        queryField = qcvalueaddproapi.CQCVDReqQryStockDayQuotationField()
+
+        queryField.BegDate = begin_date.replace("-", "")
+        queryField.EndDate = end_date.replace("-", "")
+        if tool.is_sh_code(code):
+            queryField.ExchangeID = qcvalueaddproapi.QCVD_EXD_SSE
+        else:
+            queryField.ExchangeID = qcvalueaddproapi.QCVD_EXD_SZSE
+        queryField.SecurityID = code
+        queryField.PageCount = page_count
+        queryField.PageLocate = page_locate
+        queryField.OrderType = qcvalueaddproapi.QCVD_ORDST_DESC
+
+        request_id = self.__create_request_id()
+        results = self.m_api.ReqReqQryStockDayQuotation(queryField, request_id)
+        # 璇诲彇缁撴灉
+        for i in range(0, 1000):
+            # 璇诲彇缁撴灉
+            if request_id in self.__result_cache:
+                results = self.__result_cache[request_id]
+                return results
+            time.sleep(0.002)
+        return []
+
+    def queryBars(self, code, begin_date, end_date):
+        """
+        鑾峰彇鍘嗗彶K绾匡紙鍖呭惈璧锋鏃ユ湡锛�
+        @param code:
+        @param begin_date:  渚嬪锛�2024-10-31
+        @param end_date: 渚嬪锛�2024-11-30
+        @param page_locate: 绗嚑椤碉紙浠庣涓�椤靛紑濮嬶級
+        @return:
+        """
+        try:
+
+            page_locate = 1
+            final_results = []
+            for i in range(20):
+                # 鏈�澶氱炕20椤�
+                results = self.__query_bars(code, begin_date, end_date, page_locate)
+                if results:
+                    final_results.extend(results)
+                if len(results) != 200:
+                    break
+                else:
+                    page_locate += 1
+
+            # 鏈�鏂扮殑澶嶆潈鍥犲瓙
+            start_adjust_factor = None
+            for i in range(0, len(final_results)):
+                d = final_results[i]
+                if not start_adjust_factor:
+                    start_adjust_factor = d["AdjustFactor"]
+                # 澶嶆潈浠锋牸
+                if start_adjust_factor != d["AdjustFactor"]:
+                    # 寮�濮嬪鏉�
+                    d["PreClosePrice"] = round(d["AdjustFactor"] * d["PreClosePrice"] / start_adjust_factor, 4)
+                    d["OpenPrice"] = round(d["AdjustFactor"] * d["OpenPrice"] / start_adjust_factor, 4)
+                    d["HighPrice"] = round(d["AdjustFactor"] * d["HighPrice"] / start_adjust_factor, 4)
+                    d["LowPrice"] = round(d["AdjustFactor"] * d["LowPrice"] / start_adjust_factor, 4)
+                    d["ClosePrice"] = round(d["AdjustFactor"] * d["ClosePrice"] / start_adjust_factor, 4)
+            fresults = []
+            for r in final_results:
+                fresults.append({"sec_id": r["SecurityID"],
+                                 "open": r["OpenPrice"],
+                                 "high": r["HighPrice"],
+                                 "low": r["LowPrice"],
+                                 "close": r["ClosePrice"],
+                                 "volume": r["Volume"],
+                                 "pre_close": r["PreClosePrice"],
+                                 "bob": datetime.strptime(r['TradingDay'], '%Y%m%d'),
+                                 "amount": r["Turnover"]
+                                 })
+            print("ReqReqQryStockDayQuotation:", len(fresults))
+            return fresults
+
         except Exception as e:
             logging.exception(e)
 
@@ -64,53 +177,148 @@
                  nRequestID,
                  pRspInfo.ErrorID,
                  pRspInfo.ErrorMsg))
-        if (pRspInfo.ErrorID == 0):
+        if pRspInfo.ErrorID == 0:
+            logger_system.info("鍗庨懌澧炲�兼湇鍔PI鐧诲綍鎴愬姛")
             # 鐧诲綍鎴愬姛鍚庣洿鎺ユ煡璇�
             # self.ReqInquiryHistoryDelivery()
-            threading.Thread(target=lambda : print("浜ゆ槗鏃ュ巻锛�", self.queryTradeCalendar())).start()
+            # threading.Thread(target=lambda: print("浜ゆ槗鏃ュ巻锛�", self.queryTradeCalendar("2024-03-08", "2024-12-31"))).start()
+            # threading.Thread(
+            #     target=lambda: print("鏃锛�", self.queryBars("601298", "2024-12-15", "2024-12-31"))).start()
 
     def ReqQryGGTEODPrices(self):
-        QryField = qcvalueaddproapi.CQCVDQryGGTEODPricesField()
-        self.m_api.ReqQryGGTEODPrices(QryField, new_seqnum())
+        try:
+            QryField = qcvalueaddproapi.CQCVDQryGGTEODPricesField()
+            self.m_api.ReqQryGGTEODPrices(QryField, new_seqnum())
+        except:
+            pass
 
     def ReqQryInvestor(self):
-        QryField = qcvalueaddproapi.CQCVDQryInvestorField()
-        self.m_api.ReqQryInvestor(QryField, new_seqnum())
+        try:
+            QryField = qcvalueaddproapi.CQCVDQryInvestorField()
+            self.m_api.ReqQryInvestor(QryField, new_seqnum())
+        except:
+            pass
 
     def OnRspInquiryShareCalendar(self, pShareCalendar, pRspInfo, nRequestID, bIsPageLast, bIsTotalLast):
+        """
+        浜ゆ槗鏃ュ巻鍝嶅簲
+        @param pShareCalendar:
+        @param pRspInfo:
+        @param nRequestID:
+        @param bIsPageLast:
+        @param bIsTotalLast:
+        @return:
+        """
+        if nRequestID not in self.__temp_cache:
+            self.__temp_cache[nRequestID] = []
+        try:
+            if pShareCalendar:
+                self.__temp_cache[nRequestID].append(pShareCalendar.TradingDay)
+            else:
+                self.__result_cache[nRequestID] = self.__temp_cache[nRequestID]
+                self.__temp_cache.pop(nRequestID)
+                print("OnRspInquiryShareCalendar:", self.__result_cache[nRequestID])
+        except:
+            pass
+
+    def OnRspInquiryStockDayQuotation(self, pStockDayQuotation, pRspInfo, nRequestID, bIsPageLast, bIsTotalLast):
+        """
+       鏃鍝嶅簲
+       @param pStockDayQuotation:
+       @param pRspInfo:
+       @param nRequestID:
+       @param bIsPageLast:
+       @param bIsTotalLast:
+       @return:
+       """
         if nRequestID not in self.__temp_cache:
             self.__temp_cache[nRequestID] = []
 
-        if pShareCalendar:
-            self.__temp_cache[nRequestID].append(pShareCalendar.TradingDay)
-        else:
-            self.__result_cache[nRequestID] = self.__temp_cache[nRequestID]
-            self.__temp_cache.pop(nRequestID)
-            print("OnRspInquiryShareCalendar:", self.__result_cache[nRequestID])
+        # print("鏄惁鏈〉鏌ヨ瀹屾瘯锛�", bIsPageLast)
+        try:
+
+            if not bIsPageLast:
+                self.__temp_cache[nRequestID].append({
+                    "SecurityID": pStockDayQuotation.SecurityID, "TradingDay": pStockDayQuotation.TradingDay,
+                    "AdjustFactor": pStockDayQuotation.AdjustFactor, "PreClosePrice": pStockDayQuotation.PreClosePrice,
+                    "OpenPrice": pStockDayQuotation.OpenPrice, "HighPrice": pStockDayQuotation.HighPrice,
+                    "LowPrice": pStockDayQuotation.LowPrice,
+                    "ClosePrice": pStockDayQuotation.ClosePrice, "Volume": int(pStockDayQuotation.Volume * 100),
+                    "Turnover": int(pStockDayQuotation.Turnover * 1000)
+                })
+            else:
+                self.__result_cache[nRequestID] = self.__temp_cache[nRequestID]
+                self.__temp_cache.pop(nRequestID)
+                print("OnRspInquiryStockDayQuotation:", len(self.__result_cache[nRequestID]))
+        except:
+            pass
 
 
-def main():
-    # if (len(sys.argv)< 5):
-    #     ######杩愯鍛戒护琛�:
-    #     ###### ip鍦板潃  绔彛鍙� 鐢ㄦ埛鍚� 瀵嗙爜
-    #     print("usage: ipaddress port userid passwd")
-    #     return
+def __read_request(request_queue: multiprocessing.Queue, response_queue: multiprocessing.Queue):
+
+    def __set_response_data(request_id, response_data):
+        response_queue.put_nowait({"request_id": request_id, "data": response_data})
+
+    while True:
+        try:
+            val = request_queue.get()
+            type_ = val['type']
+            request_id = val['request_id']
+            data = val.get('data')
+            if type_ == 'get_trade_calendar':
+                # 鑾峰彇浜ゆ槗鏃ュ巻
+                start_date = data['start_date']
+                end_date = data['end_date']
+                results = thespi.queryTradeCalendar(start_date, end_date)
+                __set_response_data(request_id, results)
+            elif type_ == 'get_history_k_bars':
+                # 鑾峰彇鍘嗗彶K绾�
+                start_date = data['start_date']
+                end_date = data['end_date']
+                code = data['code']
+                results = thespi.queryBars(code, start_date, end_date)
+                __set_response_data(request_id, results)
+        except Exception as e:
+            pass
+
+
+def run(request_queue: multiprocessing.Queue, response_queue: multiprocessing.Queue):
+    """
+    杩愯
+    @param request_queue: 璇锋眰闃熷垪
+    @param response_queue: 鍝嶅簲闃熷垪
+    @return:
+    """
     global g_userid, g_passwd, g_address, g_port
     g_address = "101.230.90.99"
     g_port = 25556
     g_userid = "388000013942"
     g_passwd = "110808"
+    if not constant.is_windows():
+        # 鍐呯綉
+        g_address = "192.168.84.61"
+        g_port = 25557
+
+    #IP锛�192.168.84.61锛夈�佺鍙o紙25557
+
+
 
     # 鍥炴祴浜ゆ槗鏄敱鍘嗗彶琛屾儏鏉ラ┍鍔ㄦ挳鍚堟垚浜�:
     # 鍥犳蹇呴』鍚屾椂浣跨敤traderapi鍜宮dapi锛屼笉鑳藉崟鐙娇鐢╰raderapi锛屽苟涓攎dapi鑷冲皯闇�瑕佽闃呬竴涓互涓婅鎯呫��
     # 鐢ㄦ埛鍙娇鐢ㄥ洖娴媡raderapi鐨凴egisterFront鍑芥暟鏉ユ敞鍐屾鍦板潃鍘昏繛鎺ヤ笂鍥炴祴鏈嶅姟鍣�
     print("GetApiVersion():", qcvalueaddproapi.CQCValueAddProApi_GetApiVersion())
     theapi = qcvalueaddproapi.CQCValueAddProApi_CreateInfoQryApi()
+    global  thespi
     thespi = sampleSpi(theapi)
     theapi.RegisterSpi(thespi)
     theapi.RegisterFront(g_address, g_port)
+    threading.Thread(target=__read_request, args=(request_queue, response_queue, ), daemon=True).start()
     theapi.Run()
-    return
+
+
+def main():
+    request_queue, response_queue = multiprocessing.Queue(maxsize=1024), multiprocessing.Queue(maxsize=1024)
+    run(request_queue, response_queue)
 
 
 if __name__ == '__main__':

--
Gitblit v1.8.0