From e1057fa87cbda64ec7bf88db4d944d1ee515b853 Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期二, 31 十二月 2024 15:51:04 +0800 Subject: [PATCH] 将掘金的交易日历/K线替换为华鑫 --- huaxin_client/l1_api_client.py | 230 ++++++++++++++++++++++++++++++++++++++++----------------- 1 files changed, 162 insertions(+), 68 deletions(-) diff --git a/huaxin_client/l1_api_client.py b/huaxin_client/l1_api_client.py index dab8a67..41899f2 100644 --- a/huaxin_client/l1_api_client.py +++ b/huaxin_client/l1_api_client.py @@ -1,12 +1,15 @@ import logging +import multiprocessing import threading import time import qcvalueaddproapi +from log_module.log import logger_system 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 +29,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: + logging.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,11 +176,13 @@ 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() @@ -166,7 +225,7 @@ if nRequestID not in self.__temp_cache: self.__temp_cache[nRequestID] = [] - print("鏄惁鏈〉鏌ヨ瀹屾瘯锛�", bIsPageLast) + # print("鏄惁鏈〉鏌ヨ瀹屾瘯锛�", bIsPageLast) if not bIsPageLast: self.__temp_cache[nRequestID].append({ @@ -183,12 +242,41 @@ print("OnRspInquiryStockDayQuotation:", len(self.__result_cache[nRequestID])) -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: + 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 @@ -200,11 +288,17 @@ # 鐢ㄦ埛鍙娇鐢ㄥ洖娴媡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(), multiprocessing.Queue() + run(request_queue, response_queue) if __name__ == '__main__': -- Gitblit v1.8.0