From 365491c1fcf523994035e4bd28d8b5872dd6ec98 Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期四, 31 七月 2025 14:47:48 +0800 Subject: [PATCH] 除权采用掘金更新K线 --- huaxin_client/l1_api_client.py | 298 +++++++++++++++++++++++++++++++++++++++++------------------ 1 files changed, 206 insertions(+), 92 deletions(-) diff --git a/huaxin_client/l1_api_client.py b/huaxin_client/l1_api_client.py index dab8a67..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 +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,76 +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 = "20240704" - queryField.EndDate = "20240904" - queryField.PageCount = 10 - queryField.PageLocate = 1 - if queryField.BegDate: - queryField.OrderType = qcvalueaddproapi.QCVD_ORDST_ASC - if queryField.EndDate: - queryField.OrderType = qcvalueaddproapi.QCVD_ORDST_DESC - + 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) - print("ReqReqQryShareCalendar:", results) except Exception as e: logging.exception(e) + return [] + + 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: - 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 = 10 - queryField.PageLocate = 1 - 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] - # 鏈�鏂扮殑澶嶆潈鍥犲瓙 - start_adjust_factor = None - for i in range(0, len(results)): - d = 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 results: - fresults.append({"sec_id": r["SecurityID"], - "open": r["TradingDay"], - "high": r["HighPrice"], - "low": r["LowPrice"], - "close": r["ClosePrice"], - "volume": r["Volume"], - "pre_close": r["PreClosePrice"], - "bob": f"{r['TradingDay'][:4]}-{r['TradingDay'][4:6]}-{r['TradingDay'][6:]} 00:00:00", - "amount": r["Turnover"] - }) - return fresults - time.sleep(0.002) - print("ReqReqQryStockDayQuotation:", results) + 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) @@ -119,19 +177,27 @@ 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.queryBars())).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): """ @@ -145,13 +211,15 @@ """ 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]) + 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): """ @@ -166,45 +234,91 @@ if nRequestID not in self.__temp_cache: self.__temp_cache[nRequestID] = [] - print("鏄惁鏈〉鏌ヨ瀹屾瘯锛�", bIsPageLast) + # 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])) + 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