From 02c7ae73e9336ebaff6705d27b2e51a5fbe777e1 Mon Sep 17 00:00:00 2001 From: dsyoon Date: Sun, 23 Jan 2022 13:30:55 +0900 Subject: [PATCH] init --- hts/DataCollector_252670.py | 661 ----------------------------------- hts/HTS_122630.py | 8 +- hts/HTS_252670.py | 13 +- hts/OrderChecker.py | 2 +- hts/OrderItem.py | 2 +- hts/Simulation.py | 2 +- hts/data/252670_20220121.csv | 382 ++++++++++++++++++++ 7 files changed, 395 insertions(+), 675 deletions(-) delete mode 100644 hts/DataCollector_252670.py create mode 100644 hts/data/252670_20220121.csv diff --git a/hts/DataCollector_252670.py b/hts/DataCollector_252670.py deleted file mode 100644 index f7a4140..0000000 --- a/hts/DataCollector_252670.py +++ /dev/null @@ -1,661 +0,0 @@ -import win32com.client -import time -import os -from datetime import datetime -import pandas as pd - -from OrderType import OrderType -from OrderItem import OrderItem - -from BuySellChecker import BuySellChecker -from OrderChecker import OrderChecker - - -class DataCollector_252670: - - objCpCybos = None - objCpCodeMgr = None - - buySellChecker = None - stock_code = None - - def __init__(self, stock_code): - self.buySellChecker = BuySellChecker() - self.stock_code = stock_code - - #self.connect() - return - - def connect(self): - # 연결 여부 체크 - self.objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos") - bConnect = self.objCpCybos.IsConnect - if (bConnect == 0): - print("PLUS가 정상적으로 연결되지 않음. ") - exit() - return - - def all_stocks(self): - # 종목코드 리스트 구하기 - self.objCpCodeMgr = win32com.client.Dispatch("CpUtil.CpCodeMgr") - codeList = self.objCpCodeMgr.GetStockListByMarket(1) # 거래소 - codeList2 = self.objCpCodeMgr.GetStockListByMarket(2) # 코스닥 - - print("거래소 종목코드", len(codeList)) - for i, code in enumerate(codeList): - secondCode = self.objCpCodeMgr.GetStockSectionKind(code) - name = self.objCpCodeMgr.CodeToName(code) - stdPrice = self.objCpCodeMgr.GetStockStdPrice(code) - print(i, code, secondCode, stdPrice, name) - - print("코스닥 종목코드", len(codeList2)) - for i, code in enumerate(codeList2): - secondCode = self.objCpCodeMgr.GetStockSectionKind(code) - name = self.objCpCodeMgr.CodeToName(code) - stdPrice = self.objCpCodeMgr.GetStockStdPrice(code) - print(i, code, secondCode, stdPrice, name) - - print("거래소 + 코스닥 종목코드 ", len(codeList) + len(codeList2)) - return - - # 차트 데이터 구하기 - def getChartData(self, stock_code): - # 차트 객체 구하기 - objStockChart = win32com.client.Dispatch("CpSysDib.StockChart") - - objStockChart.SetInputValue(0, 'A'+stock_code) # 종목 코드 - 삼성전자 - objStockChart.SetInputValue(1, ord('2')) # 개수로 조회 - objStockChart.SetInputValue(4, 100) # 최근 100일 치 - objStockChart.SetInputValue(5, [0, 2, 3, 4, 5, 8]) # 날짜,시가,고가,저가,종가,거래량 - objStockChart.SetInputValue(6, ord('D')) # '차트 주가 - 일간 차트 요청 - objStockChart.SetInputValue(9, ord('1')) # 수정주가 사용 - objStockChart.BlockRequest() - - len = objStockChart.GetHeaderValue(3) - - print("날짜", "시가", "고가", "저가", "종가", "거래량") - print("==============================================-") - - for i in range(len): - day = objStockChart.GetDataValue(0, i) - open = objStockChart.GetDataValue(1, i) - high = objStockChart.GetDataValue(2, i) - low = objStockChart.GetDataValue(3, i) - close = objStockChart.GetDataValue(4, i) - vol = objStockChart.GetDataValue(5, i) - print(day, open, high, low, close, vol) - - return - - # 주식 현재가 조회 - def currentStock(self, stock_code): - # 현재가 객체 구하기 - self.objStockMst = win32com.client.Dispatch("DsCbo1.StockMst") - self.objStockMst.SetInputValue(0, 'A'+stock_code) # 종목 코드 - 삼성전자 - self.objStockMst.BlockRequest() - - # 현재가 통신 및 통신 에러 처리 - rqStatus = self.objStockMst.GetDibStatus() - rqRet = self.objStockMst.GetDibMsg1() - print("통신상태", rqStatus, rqRet) - if rqStatus != 0: - exit() - - # 현재가 정보 조회 - code = self.objStockMst.GetHeaderValue(0) # 종목코드 - name = self.objStockMst.GetHeaderValue(1) # 종목명 - time = self.objStockMst.GetHeaderValue(4) # 시간 - cprice = self.objStockMst.GetHeaderValue(11) # 종가 - diff = self.objStockMst.GetHeaderValue(12) # 대비 - open = self.objStockMst.GetHeaderValue(13) # 시가 - high = self.objStockMst.GetHeaderValue(14) # 고가 - low = self.objStockMst.GetHeaderValue(15) # 저가 - offer = self.objStockMst.GetHeaderValue(16) # 매도호가 - bid = self.objStockMst.GetHeaderValue(17) # 매수호가 - vol = self.objStockMst.GetHeaderValue(18) # 거래량 - vol_value = self.objStockMst.GetHeaderValue(19) # 거래대금 - - # 예상 체결관련 정보 - exFlag = self.objStockMst.GetHeaderValue(58) # 예상체결가 구분 플래그 - exPrice = self.objStockMst.GetHeaderValue(55) # 예상체결가 - exDiff = self.objStockMst.GetHeaderValue(56) # 예상체결가 전일대비 - exVol = self.objStockMst.GetHeaderValue(57) # 예상체결수량 - - print("코드", code) - print("이름", name) - print("시간", time) - print("종가", cprice) - print("대비", diff) - print("시가", open) - print("고가", high) - print("저가", low) - print("매도호가", offer) - print("매수호가", bid) - print("거래량", vol) - print("거래대금", vol_value) - - if (exFlag == ord('0')): - print("장 구분값: 동시호가와 장중 이외의 시간") - elif (exFlag == ord('1')): - print("장 구분값: 동시호가 시간") - elif (exFlag == ord('2')): - print("장 구분값: 장중 또는 장종료") - - print("예상체결가 대비 수량") - print("예상체결가", exPrice) - print("예상체결가 대비", exDiff) - print("예상체결수량", exVol) - - return - - # 주식 현금 매수주문 - def requestOrder(self, type, stock_code, count, price): - # type = 2: buy, type=1: sell - # 주문 초기화 - objTrade = win32com.client.Dispatch("CpTrade.CpTdUtil") - initCheck = objTrade.TradeInit(0) - if (initCheck != 0): - print("주문 초기화 실패") - exit() - - # 주식 매수 주문 - acc = objTrade.AccountNumber[0] # 계좌번호 - accFlag = objTrade.GoodsList(acc, 1) # 주식상품 구분 - # acc = "782446178" - # accFlag[0] = "01" - objStockOrder = win32com.client.Dispatch("CpTrade.CpTd0311") - objStockOrder.SetInputValue(0, type.value) # 1: 매도, 2: 매수 - objStockOrder.SetInputValue(1, acc) # 계좌번호 - objStockOrder.SetInputValue(2, accFlag[0]) # 상품구분 - 주식 상품 중 첫번째 - objStockOrder.SetInputValue(3, "A"+stock_code) # 종목코드 - objStockOrder.SetInputValue(4, count) # 매수수량 count주 - objStockOrder.SetInputValue(5, price) # 주문단가 - price 원 - objStockOrder.SetInputValue(7, "0") # 주문 조건 구분 코드, 0: 기본 1: IOC 2:FOK - objStockOrder.SetInputValue(8, "01") # 주문호가 구분코드 - 01: 보통 - - # 매수 주문 요청 - nRet = objStockOrder.BlockRequest() - if (nRet != 0): - print("order error", nRet) - return None - - rqStatus = objStockOrder.GetDibStatus() - rqRet = objStockOrder.GetDibMsg1() - print("통신상태", rqStatus, rqRet) - if rqStatus != 0: - return None - - orderNum = objStockOrder.GetHeaderValue(0) - - if (type == "1"): - print ("(SELL", count, price, ")") - else: - print ("(BUY", count, price, ")") - return orderNum - - # 계좌 잔고 확인 - def requstJango(self): - jangoDic = {} - - objTrade = win32com.client.Dispatch("CpTrade.CpTdUtil") - initCheck = objTrade.TradeInit(0) - if (initCheck != 0): - print("주문 초기화 실패") - exit() - - # 주식 매수 주문 - acc = objTrade.AccountNumber[0] # 계좌번호 - accFlag = objTrade.GoodsList(acc, 1) # 주식상품 구분 - - objRq = win32com.client.Dispatch("CpTrade.CpTd6033") - - objRq.SetInputValue(0, acc) # 계좌번호 - objRq.SetInputValue(1, accFlag[0]) # 상품구분 - 주식 상품 중 첫번째 - objRq.SetInputValue(2, 50) # 요청 건수(최대 50) - dicflag1 = {ord(' '): '현금', - ord('Y'): '융자', - ord('D'): '대주', - ord('B'): '담보', - ord('M'): '매입담보', - ord('P'): '플러스론', - ord('I'): '자기융자', - } - while True: - objRq.BlockRequest() - # 통신 및 통신 에러 처리 - rqStatus = objRq.GetDibStatus() - rqRet = objRq.GetDibMsg1() - #print("통신상태", rqStatus, rqRet) - if rqStatus != 0: - return False - - cnt = objRq.GetHeaderValue(7) - if cnt > 3: - return jangoDic - - for i in range(cnt): - item = {} - code = objRq.GetDataValue(12, i) # 종목코드 - item['종목코드'] = code - item['종목명'] = objRq.GetDataValue(0, i) # 종목명 - item['대출일'] = objRq.GetDataValue(2, i) # 대출일 - item['잔고수량'] = objRq.GetDataValue(7, i) # 체결잔고수량 - item['매도가능'] = objRq.GetDataValue(15, i) - item['장부가'] = objRq.GetDataValue(17, i) # 체결장부단가 - # item['평가금액'] = self.objRq.GetDataValue(9, i) # 평가금액(천원미만은 절사 됨) - # item['평가손익'] = self.objRq.GetDataValue(11, i) # 평가손익(천원미만은 절사 됨) - # 매입금액 = 장부가 * 잔고수량 - item['매입금액'] = item['장부가'] * item['잔고수량'] - item['현재가'] = 0 - item['대비'] = 0 - item['거래량'] = 0 - - # 잔고 추가 - # key = (code, item['현금신용'],item['대출일'] ) - key = code - jangoDic[key] = item - - if len(jangoDic) >= 3: # 최대 3 종목만, - break - - if len(jangoDic) >= 3: - break - - if (objRq.Continue == False): - break - - check = False - for item in jangoDic: - if item: - check = True - break - if not check: - return None - return jangoDic - - # 예약 주문 내역 조회 및 미체결 리스트 구하기 - def requestOrderList(self): - # type = 2: buy, type=1: sell - orderList = [] - # 주문 초기화 - objTrade = win32com.client.Dispatch("CpTrade.CpTdUtil") - initCheck = objTrade.TradeInit(0) - if (initCheck != 0): - print("주문 초기화 실패") - exit() - - # 주식 매수 주문 - acc = objTrade.AccountNumber[0] # 계좌번호 - accFlag = objTrade.GoodsList(acc, 1) # 주식상품 구분 - - objResult = win32com.client.Dispatch("CpTrade.CpTd5339") - objResult.SetInputValue(0, acc) # 계좌번호 - objResult.SetInputValue(1, accFlag[0]) # 상품구분 - 주식 상품 중 첫번째 - objResult.SetInputValue(4, "0") # 전체 - objResult.SetInputValue(5, "1") # 정렬 기준 - 역순 - objResult.SetInputValue(6, "0") # 전체 - objResult.SetInputValue(7, 20) # 요청개수 - 최대 20개 - - while True: - ret = objResult.BlockRequest() - if objResult.GetDibStatus() != 0: - print("통신상태", objResult.GetDibStatus(), objResult.GetDibMsg1()) - return False - - if (ret == 2 or ret == 3): - print("통신 오류", ret) - return False; - - # 통신 초과 요청 방지에 의한 요류 인 경우 - while (ret == 4): # 연속 주문 오류 임. 이 경우는 남은 시간동안 반드시 대기해야 함. - time.sleep(1) - ret = objResult.BlockRequest() - - # 수신 개수 - cnt = objResult.GetHeaderValue(5) - print("[Cp5339] 수신 개수 ", cnt) - if cnt == 0: - break - - for i in range(cnt): - item = OrderItem() - item.orderNum = objResult.GetDataValue(1, i) - item.orderPrev = objResult.GetDataValue(2, i) - item.code = objResult.GetDataValue(3, i) # 종목코드 - item.name = objResult.GetDataValue(4, i) # 종목명 - item.orderDesc = objResult.GetDataValue(5, i) # 주문구분내용 - item.amount = objResult.GetDataValue(6, i) # 주문수량 - item.price = objResult.GetDataValue(7, i) # 주문단가 - item.ContAmount = objResult.GetDataValue(8, i) # 체결수량 - item.credit = objResult.GetDataValue(9, i) # 신용구분 - item.modAvali = objResult.GetDataValue(11, i) # 정정취소 가능수량 - item.buysell = objResult.GetDataValue(13, i) # 매매구분코드 - item.creditdate = objResult.GetDataValue(17, i) # 대출일 - item.orderFlagDesc = objResult.GetDataValue(19, i) # 주문호가구분코드내용 - item.orderFlag = objResult.GetDataValue(21, i) # 주문호가구분코드 - - orderList.append(item) - - # 연속 처리 체크 - 다음 데이터가 없으면 중지 - if objResult.Continue == False: - print("[Cp5339] 연속 조회 여부: 다음 데이터가 없음") - break - - return orderList - - # 미체결 취소하기 - def cancelOrderList(self, orderList): - - if len(orderList) < 1: - return - - objTrade = win32com.client.Dispatch("CpTrade.CpTdUtil") - initCheck = objTrade.TradeInit(0) - if (initCheck != 0): - print("주문 초기화 실패") - exit() - acc = objTrade.AccountNumber[0] # 계좌번호 - accFlag = objTrade.GoodsList(acc, 1) # 주식상품 구분 - - objCancelOrder = win32com.client.Dispatch("CpTrade.CpTd0314") # 취소 - - onums = [] - codes = [] - amounts = [] - for item in orderList: - onums.append(item.orderNum) - codes.append(item.code) - amounts.append(item.amount) - - for i in range(len(onums)): - ordernum = onums[i] - code = codes[i] - amount = amounts[i] - objCancelOrder.SetInputValue(1, ordernum) # 원주문 번호 - 정정을 하려는 주문 번호 - objCancelOrder.SetInputValue(2, acc) # 상품구분 - 주식 상품 중 첫번째 - objCancelOrder.SetInputValue(3, accFlag[0]) # 상품구분 - 주식 상품 중 첫번째 - objCancelOrder.SetInputValue(4, code) # 종목코드 - objCancelOrder.SetInputValue(5, amount) # 정정 수량, 0 이면 잔량 취소임 - - # 취소주문 요청 - ret = objCancelOrder.BlockRequest() - print("[CpRPOrder/BlockRequestCancel] 주문결과", objCancelOrder.GetDibStatus(), objCancelOrder.GetDibMsg1()) - if objCancelOrder.GetDibStatus() != 0: - break - - return - - # 주식 현재가 조회 - def writeStockData(self, stock_codes, given_day): - objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos") - bConnect = objCpCybos.IsConnect - if (bConnect == 0): - print("PLUS가 정상적으로 연결되지 않음. ") - exit() - - # 차트 객체 구하기 - objStockChart = win32com.client.Dispatch("CpSysDib.StockChart") - - for stock_code in stock_codes: - outfp = open("./data/"+stock_code+"_"+given_day+".csv", mode="w", encoding="utf-8") - objStockChart.SetInputValue(0, 'A' + stock_code) # 종목 코드 - objStockChart.SetInputValue(1, ord('1')) # 1: 기간으로 조회, 2: 개수로 조회 - objStockChart.SetInputValue(2, given_day) # 기간 조회 시, 시작일 - objStockChart.SetInputValue(3, given_day) # 기간 조회 시, 종료일 - objStockChart.SetInputValue(4, 400) # 조회 시 가져오는 Line 개수 - objStockChart.SetInputValue(5, [0, 1, 2, 3, 4, 5, 8]) # 날짜,시간,시가,고가,저가,종가,거래량 - objStockChart.SetInputValue(6, ord('m')) # '차트 주가 - 월(M), 주(W), 일(D), 시(H), 분(m), 초(S) 차트 요청 - objStockChart.SetInputValue(7, 1) - objStockChart.SetInputValue(9, ord('1')) # 수정주가 사용 - objStockChart.BlockRequest() - - size = objStockChart.GetHeaderValue(3) - - outfp.write("%s,%s,%s,%s,%s,%s,%s\n" % ("날짜", "시간", "시가", "고가", "저가", "종가", "거래량")) - for i in range(size - 1, -1, -1): - day = objStockChart.GetDataValue(0, i) - time = objStockChart.GetDataValue(1, i) - start = objStockChart.GetDataValue(2, i) - high = objStockChart.GetDataValue(3, i) - low = objStockChart.GetDataValue(4, i) - close = objStockChart.GetDataValue(5, i) - vol = objStockChart.GetDataValue(6, i) - outfp.write("%d,%s,%d,%d,%d,%d,%d\n" % (day, str(time).zfill(4), start, high, low, close, vol)) - outfp.close() - - return - - - def write(self, day, result): - #날짜,시간,시가,고가,저가,종가,거래량 - #20210909,900,2070,2070,2070,2070,0 - - outFp = open(day+".csv", mode="w", encoding="UTF-8") - outFp.write("날짜,시간,시가,고가,저가,종가,거래량\n") - for i in range(len(result["time"])): - outFp.write("%s,%s,%s,%s,%s,%s,%s\n"%( - result["time"][i].strftime('%Y%m%d'), - result["time"][i].strftime('%H%M'), - result["open"][i], - result["high"][i], - result["low"][i], - result["close"][i], - result["vol"][i])) - outFp.close() - return - - # 주식 현재가 조회 - def getRealTime(self, stock_code, given_day, result): - int_given_day = int(given_day) - objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos") - bConnect = objCpCybos.IsConnect - if (bConnect == 0): - print("PLUS가 정상적으로 연결되지 않음. ") - exit() - - # 차트 객체 구하기 - objStockChart = win32com.client.Dispatch("CpSysDib.StockChart") - - objStockChart.SetInputValue(0, 'A'+stock_code) # 종목 코드 - objStockChart.SetInputValue(1, ord('1')) # 1: 기간으로 조회, 2: 개수로 조회 - objStockChart.SetInputValue(2, given_day) # 기간 조회 시, 시작일 - objStockChart.SetInputValue(3, given_day) # 기간 조회 시, 종료일 - objStockChart.SetInputValue(4, 400) # 조회 시 가져오는 Line 개수 - objStockChart.SetInputValue(5, [0, 1, 2, 3, 4, 5, 8]) # 날짜,시간,시가,고가,저가,종가,거래량 - objStockChart.SetInputValue(6, ord('m')) # '차트 주가 - 월(M), 주(W), 일(D), 시(H), 분(m), 초(S) 차트 요청 - objStockChart.SetInputValue(7, 1) - objStockChart.SetInputValue(9, ord('1')) # 수정주가 사용 - objStockChart.BlockRequest() - - size = objStockChart.GetHeaderValue(3) - - #print("날짜", "시간", "시가", "고가", "저가", "종가", "거래량") - start_time = datetime.strptime(given_day + " 090000", '%Y%m%d %H%M%S') - for i in range(size-1, -1, -1): - int_day = objStockChart.GetDataValue(0, i) - int_time = objStockChart.GetDataValue(1, i) - - if int_day < int_given_day: - continue - time = datetime.strptime(str(int_day)+" "+str(int_time).zfill(4)+"00", '%Y%m%d %H%M%S') - if time < start_time: - continue - - open = objStockChart.GetDataValue(2, i) - close = objStockChart.GetDataValue(5, i) - high = objStockChart.GetDataValue(3, i) - low = objStockChart.GetDataValue(4, i) - vol = objStockChart.GetDataValue(6, i) - - if len(result["check"]) == 0: - result["check"].add(start_time) - result["time"].append(start_time) - result["open"].append(open) - result["close"].append(open) - result["high"].append(open) - result["low"].append(open) - result["vol"].append(0) - - if time not in result["check"]: - result["check"].add(time) - result["time"].append(time) - - result["open"].append(open) - result["close"].append(close) - result["high"].append(high) - result["low"].append(low) - result["vol"].append(vol) - - return - - def checkTransaction(self, data): - size = len(data["close"]) - - bsLine = {} - bsLine['buy'] = [-1 for i in range(size)] - bsLine['weight'] = [-1 for i in range(size)] - bsLine['sell'] = [-1 for i in range(size)] - - i = size - 1 - if i < 5: - return -1, -1, -1 - - buy, weight, sell = self.buySellChecker.getPriceAndWeight1(data, i) - return buy, weight, sell - - def getSellingPrice(self, final_price): - # 만약 잔고가 있으면 장부가보다 5원 높게 매도한다. - jangoDic = self.requstJango() - if jangoDic and len(jangoDic.keys()) > 0: - for code in jangoDic: - if jangoDic[code]['매도가능'] > 0: - if final_price >= jangoDic[code]['장부가'] + 5: - return jangoDic[code]['매도가능'], final_price - else: - # 장부가 가격의 마지막 자리를 0으로 만든다. (2090 -> 2090, 2092 -> 2090, 2098 -> 2090) - sell_price = int(jangoDic[code]['장부가'] / 10) * 10 - # 장부가의 마지막 자리수를 가져온다. - last_number = int(jangoDic[code]['장부가']) % 10 - if last_number in [0, 1, 2, 3]: - # 장부가의 마지막 자리수가 0,1,2,3 이라면 (2090, 2091, 2092 -> 2095 에 매도) - return jangoDic[code]['매도가능'], sell_price + 5 - elif last_number in [4, 5, 6, 7]: - # 장부가의 마지막 자리수가 4,5,6,7 이라면 (2093, 2094, 2095, 2096 -> 2100 에 매도) - return jangoDic[code]['매도가능'], sell_price + 10 - else: - # 장부가의 마지막 자리수가 8,9 라면 (2098, 2099 -> 2105 에 매도) - return jangoDic[code]['매도가능'], sell_price + 15 - - return 0, 0 - - def buyRealTime(self, GIVEN_DAY): - orderChecker = OrderChecker(self.stock_code) - BASE_COUNT = 100 - - timecheckList = pd.read_csv("timecheck.csv").values.tolist() - timecheck = {GIVEN_DAY + " " + str(second).zfill(6):False for second, check in timecheckList} - - result = {"check": set(), - "time": [], - "open": [], - "close": [], - "high": [], - "low": [], - "vol": []} - - final_price = 0 - print ("START...") - THIS_TIME = datetime.now() - while datetime.strptime(GIVEN_DAY + " 070000", '%Y%m%d %H%M%S') < THIS_TIME < datetime.strptime(GIVEN_DAY + " 15200", '%Y%m%d %H%M%S'): - - if datetime.strptime(GIVEN_DAY + " 090100", '%Y%m%d %H%M%S') < THIS_TIME < datetime.strptime(GIVEN_DAY + " 151500", '%Y%m%d %H%M%S'): - if THIS_TIME.strftime('%Y%m%d %H%M%S') in timecheck and not timecheck[THIS_TIME.strftime('%Y%m%d %H%M%S')]: - - # 데이터를 가지고 온다. - self.getRealTime(self.stock_code, GIVEN_DAY, result) - - # 분석을 통해서 볼린저밴드 상/하단을 계산한다. - data = self.buySellChecker.analyze(result) - # 사야 할 시점/가격과 팔아야 할 시점/가격을 체크한다. - bs_buy_price, bs_weight, bs_sell_price = self.checkTransaction(data) - data_size = len(data["close"]) - final_price = data["close"][data_size-1] - - if bs_buy_price > 0: - # 기본 100 주에 가중치를 추가해서 매수한다. - #BUY_COUNT = int(BASE_COUNT * bs_weight) - BUY_COUNT = int(BASE_COUNT * 1) - - # 매수를 주문한다. - orderNum = self.requestOrder(OrderType.buy, self.stock_code, BUY_COUNT , bs_buy_price) - - # 미체결 기록을 가져온다. - ORDER_LIST = self.requestOrderList() - # 매수 주문을 기록한다. - orderListToCancel = orderChecker.add(self.stock_code, OrderType.buy, orderNum, BUY_COUNT, bs_buy_price, ORDER_LIST) - # 두 시간 이전 미체결을 모두 취소한다. - self.cancelOrderList(orderListToCancel) - # 로그 출력 - print("BUY", THIS_TIME.strftime('%Y%m%d %H%M%S'), BUY_COUNT, bs_buy_price, len(orderListToCancel), len(ORDER_LIST)) - - if bs_sell_price > 0: - # 미체결 기록을 가져온다. - ORDER_LIST = self.requestOrderList() - # 매도 주문을 기록을 가져온다. - orderListToCancel = orderChecker.remove(self.stock_code, OrderType.sell, ORDER_LIST) - # 매도 미체결을 모두 취소한다. - self.cancelOrderList(orderListToCancel) - - # 매도 가격을 가져온다. - selling_count, selling_price = self.getSellingPrice(final_price) - # 분석되 가격으로 매도 요청한다. - if selling_count != 0 and selling_price != 0: - # 매도를 요청한다. - orderNum = self.requestOrder(OrderType.sell, self.stock_code, selling_count, selling_price) - - # 로그 출력 - print("SELL", THIS_TIME.strftime('%Y%m%d %H%M%S'), selling_count, selling_price, len(orderListToCancel), len(ORDER_LIST)) - - # 로그 출력 - print("TIMECHECK", THIS_TIME, final_price, data["low"][data_size-1], data["slow_k"][data_size-1], data["slow_d"][data_size-1]) - timecheck[THIS_TIME] = True - - if datetime.strptime(GIVEN_DAY + " 151530", '%Y%m%d %H%M%S') < THIS_TIME: - #### - # 손해 보지 않는 가격에 매도한다. - #### - - # 주문 리스트를 가져온다. - orderList = self.requestOrderList() - # 15:10:00 이후라면 모든 미체결 취소한다. - self.cancelOrderList(orderList) - - # 매도 가격을 가져온다. - selling_count, selling_price = self.getSellingPrice(final_price) - # 분석되 가격으로 매도 요청한다. - if selling_count != 0 and selling_price != 0: - orderNum = self.requestOrder(OrderType.sell, self.stock_code, selling_count, selling_price) - # 로그 출력 - print("SELL", THIS_TIME, selling_count, selling_price) - - break - time.sleep(0.9) - THIS_TIME = datetime.now() - - return - -if __name__ == "__main__": - - today = datetime.today() - - PROJECT_HOME = os.path.join(os.path.dirname(os.path.join(os.path.dirname(__file__)))) - RESOURCE_DIR = PROJECT_HOME + "/resources/analysis/"+today.strftime("%Y%m%d") - - # KODEX 인버스 * 2 - stock_code = "252670" - hts = DataCollector_252670(stock_code) - given_day = datetime.today().strftime('%Y%m%d') - - hts.writeStockData(stock_codes, "20211025") - - print ("done...") diff --git a/hts/HTS_122630.py b/hts/HTS_122630.py index 3c5cfb7..2806144 100644 --- a/hts/HTS_122630.py +++ b/hts/HTS_122630.py @@ -4,11 +4,11 @@ import os from datetime import datetime import pandas as pd -from OrderType import OrderType -from OrderItem import OrderItem +from hts.OrderType import OrderType +from hts.OrderItem import OrderItem -from BuySellChecker import BuySellChecker -from OrderChecker import OrderChecker +from hts.BuySellChecker import BuySellChecker +from hts.OrderChecker import OrderChecker class HTS_122630: diff --git a/hts/HTS_252670.py b/hts/HTS_252670.py index 464ae12..082a024 100644 --- a/hts/HTS_252670.py +++ b/hts/HTS_252670.py @@ -4,11 +4,11 @@ import os from datetime import datetime import pandas as pd -from OrderType import OrderType -from OrderItem import OrderItem +from hts.OrderType import OrderType +from hts.OrderItem import OrderItem -from BuySellChecker import BuySellChecker -from OrderChecker import OrderChecker +from hts.BuySellChecker import BuySellChecker +from hts.OrderChecker import OrderChecker class HTS_252670: @@ -549,7 +549,7 @@ class HTS_252670: def buyRealTime(self, GIVEN_DAY): orderChecker = OrderChecker(self.stock_code) - BASE_COUNT = 200 + BASE_COUNT = 150 timecheckList = pd.read_csv("timecheck.csv").values.tolist() timecheck = {GIVEN_DAY + " " + str(second).zfill(6):False for second, check in timecheckList} @@ -562,7 +562,6 @@ class HTS_252670: "low": [], "vol": []} - final_price = 0 print ("START...") THIS_TIME = datetime.now() while datetime.strptime(GIVEN_DAY + " 070000", '%Y%m%d %H%M%S') < THIS_TIME < datetime.strptime(GIVEN_DAY + " 15200", '%Y%m%d %H%M%S'): @@ -657,7 +656,7 @@ if __name__ == "__main__": hts = HTS_252670(stock_code) given_day = datetime.today().strftime('%Y%m%d') - #hts.writeStockData(stock_code, "20211026") + #hts.writeStockData(stock_code, "20220121") hts.buyRealTime(given_day) print ("done...") diff --git a/hts/OrderChecker.py b/hts/OrderChecker.py index 5810d69..9af9645 100644 --- a/hts/OrderChecker.py +++ b/hts/OrderChecker.py @@ -2,7 +2,7 @@ import os import pandas as pd from datetime import datetime, timedelta -from OrderType import OrderType +from hts.OrderType import OrderType class OrderChecker: diff --git a/hts/OrderItem.py b/hts/OrderItem.py index b6f0f6d..943e776 100644 --- a/hts/OrderItem.py +++ b/hts/OrderItem.py @@ -1,4 +1,4 @@ -from OrderType import OrderType +from hts.OrderType import OrderType class OrderItem: diff --git a/hts/Simulation.py b/hts/Simulation.py index 4c1aa53..86dbb3e 100644 --- a/hts/Simulation.py +++ b/hts/Simulation.py @@ -4,7 +4,7 @@ import pandas as pd import plotly.graph_objects as go from plotly import subplots -from BuySellChecker import BuySellChecker +from hts.BuySellChecker import BuySellChecker class Simulation: diff --git a/hts/data/252670_20220121.csv b/hts/data/252670_20220121.csv new file mode 100644 index 0000000..3973c38 --- /dev/null +++ b/hts/data/252670_20220121.csv @@ -0,0 +1,382 @@ +날짜,시간,시가,고가,저가,종가,거래량 +20220121,0901,2365,2365,2350,2355,7157839 +20220121,0902,2355,2355,2345,2355,10657768 +20220121,0903,2355,2365,2350,2365,3223803 +20220121,0904,2365,2370,2360,2365,1698290 +20220121,0905,2370,2370,2355,2360,3088063 +20220121,0906,2355,2365,2350,2350,1559585 +20220121,0907,2350,2365,2350,2360,1839441 +20220121,0908,2355,2365,2350,2360,1949487 +20220121,0909,2360,2365,2355,2360,610466 +20220121,0910,2360,2365,2355,2365,762152 +20220121,0911,2365,2365,2360,2360,177972 +20220121,0912,2360,2365,2355,2360,515454 +20220121,0913,2355,2360,2350,2360,2065562 +20220121,0914,2355,2360,2350,2355,1255635 +20220121,0915,2360,2365,2355,2360,2023785 +20220121,0916,2360,2365,2355,2355,421890 +20220121,0917,2355,2360,2350,2355,2750720 +20220121,0918,2355,2360,2350,2355,164549 +20220121,0919,2360,2360,2350,2355,527099 +20220121,0920,2350,2355,2350,2350,188212 +20220121,0921,2355,2365,2350,2360,3110284 +20220121,0922,2360,2365,2360,2365,938483 +20220121,0923,2365,2370,2360,2365,2157049 +20220121,0924,2365,2365,2355,2355,675990 +20220121,0925,2355,2360,2355,2355,60609 +20220121,0926,2355,2360,2350,2355,1448847 +20220121,0927,2355,2360,2350,2355,200716 +20220121,0928,2350,2360,2350,2355,2474704 +20220121,0929,2355,2360,2350,2355,451892 +20220121,0930,2355,2355,2350,2350,891460 +20220121,0931,2355,2355,2350,2355,44351 +20220121,0932,2350,2360,2350,2360,1373961 +20220121,0933,2360,2360,2350,2355,233723 +20220121,0934,2355,2360,2350,2360,366552 +20220121,0935,2360,2365,2355,2360,1773251 +20220121,0936,2355,2365,2355,2360,513007 +20220121,0937,2360,2365,2355,2360,211536 +20220121,0938,2360,2360,2355,2360,11456 +20220121,0939,2360,2360,2350,2350,2382134 +20220121,0940,2355,2360,2350,2350,288958 +20220121,0941,2355,2360,2350,2355,426044 +20220121,0942,2355,2360,2350,2360,786245 +20220121,0943,2360,2365,2355,2360,1526142 +20220121,0944,2360,2365,2355,2365,283098 +20220121,0945,2365,2365,2360,2360,328830 +20220121,0946,2360,2365,2355,2360,355630 +20220121,0947,2360,2365,2355,2360,314608 +20220121,0948,2355,2365,2355,2360,204002 +20220121,0949,2365,2365,2355,2360,41109 +20220121,0950,2360,2360,2350,2355,1557085 +20220121,0951,2355,2360,2350,2355,136003 +20220121,0952,2355,2360,2350,2360,795947 +20220121,0953,2355,2360,2350,2350,122806 +20220121,0954,2355,2355,2350,2355,52477 +20220121,0955,2355,2360,2350,2360,345500 +20220121,0956,2355,2360,2355,2355,25882 +20220121,0957,2355,2360,2355,2360,1663 +20220121,0958,2360,2360,2355,2360,1757 +20220121,0959,2355,2360,2355,2355,8406 +20220121,1000,2355,2365,2355,2365,2002693 +20220121,1001,2360,2365,2355,2365,256831 +20220121,1002,2360,2365,2360,2360,19041 +20220121,1003,2365,2370,2360,2370,2498364 +20220121,1004,2370,2375,2365,2370,3957018 +20220121,1005,2370,2380,2370,2380,2092465 +20220121,1006,2380,2380,2375,2380,650433 +20220121,1007,2380,2385,2375,2380,5221012 +20220121,1008,2380,2385,2375,2380,1802208 +20220121,1009,2375,2385,2375,2385,994582 +20220121,1010,2385,2390,2380,2385,2740849 +20220121,1011,2385,2390,2385,2390,1730674 +20220121,1012,2390,2395,2385,2395,1615503 +20220121,1013,2390,2395,2390,2390,1202272 +20220121,1014,2395,2395,2380,2385,3719629 +20220121,1015,2385,2390,2380,2380,1433682 +20220121,1016,2380,2385,2380,2385,100749 +20220121,1017,2380,2385,2380,2380,295964 +20220121,1018,2385,2390,2380,2385,1620377 +20220121,1019,2385,2390,2380,2390,206977 +20220121,1020,2390,2395,2385,2390,1675550 +20220121,1021,2390,2395,2385,2390,1630500 +20220121,1022,2385,2390,2385,2390,1186940 +20220121,1023,2385,2390,2385,2385,38757 +20220121,1024,2385,2390,2380,2380,670327 +20220121,1025,2385,2390,2380,2380,429444 +20220121,1026,2385,2385,2380,2380,127395 +20220121,1027,2385,2385,2380,2380,503319 +20220121,1028,2380,2385,2375,2375,1545364 +20220121,1029,2375,2380,2370,2375,1035922 +20220121,1030,2375,2375,2365,2365,1410029 +20220121,1031,2370,2370,2365,2370,835099 +20220121,1032,2370,2370,2365,2365,440953 +20220121,1033,2365,2375,2365,2370,415844 +20220121,1034,2375,2375,2365,2365,1049876 +20220121,1035,2370,2370,2365,2365,65071 +20220121,1036,2365,2375,2365,2370,106146 +20220121,1037,2375,2375,2365,2375,899564 +20220121,1038,2375,2375,2365,2370,166405 +20220121,1039,2370,2375,2365,2370,57188 +20220121,1040,2365,2375,2365,2375,488728 +20220121,1041,2375,2375,2365,2370,122123 +20220121,1042,2370,2375,2365,2370,803400 +20220121,1043,2370,2375,2365,2370,961053 +20220121,1044,2375,2380,2365,2375,1612242 +20220121,1045,2370,2380,2370,2375,694307 +20220121,1046,2375,2380,2370,2380,348308 +20220121,1047,2375,2385,2375,2380,664803 +20220121,1048,2380,2385,2375,2380,359407 +20220121,1049,2375,2385,2375,2380,1390013 +20220121,1050,2375,2385,2375,2385,215188 +20220121,1051,2385,2385,2375,2380,540065 +20220121,1052,2380,2385,2375,2380,123729 +20220121,1053,2380,2385,2375,2380,42904 +20220121,1054,2375,2380,2370,2370,345759 +20220121,1055,2370,2375,2370,2370,427463 +20220121,1056,2370,2375,2370,2375,369879 +20220121,1057,2375,2375,2365,2370,242289 +20220121,1058,2375,2375,2365,2365,268240 +20220121,1059,2365,2375,2365,2370,179176 +20220121,1100,2375,2375,2365,2370,312061 +20220121,1101,2370,2370,2365,2365,111281 +20220121,1102,2365,2370,2365,2370,72445 +20220121,1103,2365,2370,2355,2355,3151172 +20220121,1104,2355,2360,2355,2360,134216 +20220121,1105,2360,2360,2355,2360,71744 +20220121,1106,2355,2360,2350,2355,1520582 +20220121,1107,2355,2355,2350,2355,429860 +20220121,1108,2355,2360,2350,2355,1134237 +20220121,1109,2355,2360,2350,2350,384784 +20220121,1110,2350,2355,2350,2355,37812 +20220121,1111,2355,2360,2350,2360,208739 +20220121,1112,2355,2360,2355,2360,441857 +20220121,1113,2355,2360,2350,2355,1596520 +20220121,1114,2360,2360,2355,2360,148380 +20220121,1115,2360,2360,2350,2350,310488 +20220121,1116,2355,2360,2350,2360,437544 +20220121,1117,2360,2360,2355,2360,15803 +20220121,1118,2360,2360,2350,2355,480696 +20220121,1119,2360,2360,2355,2355,21710 +20220121,1120,2355,2360,2355,2360,874342 +20220121,1121,2355,2365,2355,2360,208257 +20220121,1122,2355,2365,2355,2360,130425 +20220121,1123,2360,2365,2355,2360,516610 +20220121,1124,2360,2365,2355,2365,69391 +20220121,1125,2360,2365,2360,2360,40611 +20220121,1126,2360,2365,2360,2360,83671 +20220121,1127,2360,2365,2360,2360,12001 +20220121,1128,2365,2365,2360,2365,1249523 +20220121,1129,2365,2365,2360,2365,16462 +20220121,1130,2360,2365,2360,2360,544 +20220121,1131,2365,2370,2360,2365,1031897 +20220121,1132,2370,2370,2365,2370,7978 +20220121,1133,2370,2370,2360,2365,212054 +20220121,1134,2370,2370,2365,2370,76212 +20220121,1135,2365,2370,2365,2370,162061 +20220121,1136,2370,2375,2365,2370,926385 +20220121,1137,2370,2375,2370,2375,1256257 +20220121,1138,2375,2375,2370,2370,20153 +20220121,1139,2375,2375,2370,2375,25826 +20220121,1140,2370,2375,2370,2370,107191 +20220121,1141,2375,2375,2370,2375,41955 +20220121,1142,2370,2375,2370,2370,62047 +20220121,1143,2370,2375,2370,2370,158096 +20220121,1144,2370,2380,2370,2375,1286713 +20220121,1145,2370,2380,2370,2380,355053 +20220121,1146,2380,2380,2375,2380,36042 +20220121,1147,2380,2380,2375,2375,10308 +20220121,1148,2380,2385,2375,2375,1094705 +20220121,1149,2375,2380,2375,2380,195631 +20220121,1150,2375,2380,2375,2375,71081 +20220121,1151,2375,2380,2375,2375,17410 +20220121,1152,2380,2380,2375,2375,64853 +20220121,1153,2380,2380,2375,2380,104434 +20220121,1154,2375,2380,2375,2375,277311 +20220121,1155,2380,2385,2375,2385,274802 +20220121,1156,2380,2385,2375,2385,1808892 +20220121,1157,2380,2385,2380,2380,45911 +20220121,1158,2385,2385,2375,2380,623025 +20220121,1159,2380,2385,2375,2380,339410 +20220121,1200,2380,2385,2375,2380,145008 +20220121,1201,2380,2380,2375,2380,14744 +20220121,1202,2380,2385,2375,2380,314513 +20220121,1203,2380,2385,2375,2380,92963 +20220121,1204,2380,2380,2375,2375,3254 +20220121,1205,2375,2385,2375,2380,282381 +20220121,1206,2380,2385,2375,2380,25568 +20220121,1207,2380,2385,2380,2385,23642 +20220121,1208,2380,2390,2380,2380,2227480 +20220121,1209,2385,2385,2380,2380,36872 +20220121,1210,2380,2385,2380,2385,17749 +20220121,1211,2385,2390,2380,2380,421747 +20220121,1212,2385,2390,2380,2390,144658 +20220121,1213,2390,2390,2385,2385,124305 +20220121,1214,2390,2390,2385,2390,41550 +20220121,1215,2390,2390,2385,2385,172826 +20220121,1216,2385,2390,2380,2380,449399 +20220121,1217,2385,2390,2380,2385,345149 +20220121,1218,2390,2390,2380,2385,269746 +20220121,1219,2380,2390,2380,2385,1059049 +20220121,1220,2385,2385,2380,2380,57734 +20220121,1221,2385,2385,2380,2380,12403 +20220121,1222,2385,2390,2380,2390,256247 +20220121,1223,2385,2390,2380,2390,159346 +20220121,1224,2385,2385,2380,2380,27338 +20220121,1225,2380,2390,2380,2385,160049 +20220121,1226,2390,2390,2380,2385,880841 +20220121,1227,2385,2390,2385,2385,309461 +20220121,1228,2385,2390,2385,2390,13723 +20220121,1229,2385,2390,2385,2385,123544 +20220121,1230,2385,2390,2385,2385,17546 +20220121,1231,2390,2390,2385,2390,1295634 +20220121,1232,2390,2390,2385,2385,56504 +20220121,1233,2390,2390,2385,2390,17061 +20220121,1234,2390,2395,2390,2395,3819376 +20220121,1235,2395,2395,2385,2390,763103 +20220121,1236,2390,2395,2385,2390,724181 +20220121,1237,2395,2395,2390,2395,3154021 +20220121,1238,2390,2395,2390,2395,64164 +20220121,1239,2395,2395,2390,2395,17342 +20220121,1240,2395,2395,2390,2395,75331 +20220121,1241,2395,2395,2390,2390,202563 +20220121,1242,2390,2395,2390,2390,220022 +20220121,1243,2390,2395,2385,2385,380501 +20220121,1244,2390,2395,2385,2390,603386 +20220121,1245,2395,2395,2390,2390,42357 +20220121,1246,2395,2395,2390,2390,62343 +20220121,1247,2395,2395,2390,2390,62181 +20220121,1248,2390,2395,2390,2390,610345 +20220121,1249,2395,2395,2385,2385,435422 +20220121,1250,2390,2395,2385,2395,406738 +20220121,1251,2395,2395,2390,2395,29526 +20220121,1252,2395,2395,2390,2390,38839 +20220121,1253,2390,2395,2390,2395,24052 +20220121,1254,2395,2395,2385,2390,194498 +20220121,1255,2390,2390,2385,2390,84107 +20220121,1256,2390,2395,2385,2385,347785 +20220121,1257,2390,2395,2385,2390,185322 +20220121,1258,2395,2395,2385,2385,66218 +20220121,1259,2390,2390,2385,2390,26794 +20220121,1300,2390,2390,2385,2385,25487 +20220121,1301,2390,2390,2380,2385,695108 +20220121,1302,2380,2385,2380,2380,72691 +20220121,1303,2380,2385,2380,2385,300514 +20220121,1304,2380,2385,2380,2380,902616 +20220121,1305,2380,2385,2375,2380,539185 +20220121,1306,2380,2385,2375,2380,858942 +20220121,1307,2375,2380,2375,2375,220046 +20220121,1308,2375,2385,2375,2380,351146 +20220121,1309,2380,2380,2375,2380,128489 +20220121,1310,2375,2385,2375,2385,425823 +20220121,1311,2380,2385,2380,2380,10523 +20220121,1312,2380,2385,2380,2380,59089 +20220121,1313,2385,2385,2380,2385,11610 +20220121,1314,2385,2385,2380,2385,746698 +20220121,1315,2380,2385,2380,2385,870353 +20220121,1316,2385,2390,2380,2385,207963 +20220121,1317,2385,2390,2385,2390,323494 +20220121,1318,2390,2390,2385,2390,145113 +20220121,1319,2390,2395,2390,2390,1512357 +20220121,1320,2395,2395,2385,2395,1261661 +20220121,1321,2390,2395,2385,2390,111484 +20220121,1322,2390,2390,2385,2390,5341 +20220121,1323,2390,2395,2385,2395,197360 +20220121,1324,2395,2395,2390,2390,11343 +20220121,1325,2390,2395,2385,2390,152734 +20220121,1326,2390,2390,2385,2390,23967 +20220121,1327,2385,2390,2385,2385,2309783 +20220121,1328,2390,2390,2385,2390,400403 +20220121,1329,2390,2390,2380,2385,416036 +20220121,1330,2385,2385,2380,2385,70969 +20220121,1331,2385,2385,2380,2385,44583 +20220121,1332,2385,2385,2380,2380,17304 +20220121,1333,2380,2385,2380,2385,334981 +20220121,1334,2385,2390,2380,2385,1140788 +20220121,1335,2385,2390,2380,2390,223370 +20220121,1336,2385,2390,2385,2385,11839 +20220121,1337,2390,2390,2380,2385,334000 +20220121,1338,2380,2390,2380,2390,373272 +20220121,1339,2390,2390,2385,2385,15684 +20220121,1340,2385,2390,2385,2390,19288 +20220121,1341,2390,2395,2385,2390,1097760 +20220121,1342,2390,2395,2385,2390,697334 +20220121,1343,2390,2390,2385,2385,148363 +20220121,1344,2385,2395,2385,2395,339929 +20220121,1345,2395,2395,2385,2390,58884 +20220121,1346,2390,2395,2385,2395,316896 +20220121,1347,2390,2395,2390,2395,547456 +20220121,1348,2390,2395,2390,2390,104761 +20220121,1349,2395,2395,2390,2390,29270 +20220121,1350,2390,2395,2390,2395,57897 +20220121,1351,2395,2395,2390,2390,171802 +20220121,1352,2390,2395,2390,2395,28321 +20220121,1353,2395,2395,2390,2395,16864 +20220121,1354,2390,2395,2390,2390,16835 +20220121,1355,2395,2395,2390,2390,31265 +20220121,1356,2390,2395,2390,2390,478233 +20220121,1357,2390,2395,2385,2390,226619 +20220121,1358,2390,2390,2385,2390,18333 +20220121,1359,2390,2390,2385,2385,8519 +20220121,1400,2390,2390,2385,2390,30098 +20220121,1401,2385,2395,2385,2390,507494 +20220121,1402,2385,2390,2380,2390,1295912 +20220121,1403,2385,2395,2385,2390,540150 +20220121,1404,2395,2395,2390,2390,18540 +20220121,1405,2390,2395,2385,2390,25096 +20220121,1406,2395,2395,2390,2395,10948 +20220121,1407,2390,2395,2390,2390,82559 +20220121,1408,2390,2395,2385,2390,196428 +20220121,1409,2390,2390,2385,2385,8297 +20220121,1410,2385,2390,2385,2385,2694 +20220121,1411,2385,2390,2385,2385,15258 +20220121,1412,2385,2390,2385,2385,348444 +20220121,1413,2390,2395,2385,2390,24340 +20220121,1414,2390,2395,2390,2390,27961 +20220121,1415,2395,2395,2390,2395,41545 +20220121,1416,2395,2395,2390,2390,79146 +20220121,1417,2390,2395,2390,2390,98930 +20220121,1418,2390,2395,2390,2390,150319 +20220121,1419,2395,2395,2390,2390,1035863 +20220121,1420,2390,2395,2385,2390,185995 +20220121,1421,2390,2395,2390,2395,163629 +20220121,1422,2390,2395,2390,2390,25992 +20220121,1423,2390,2395,2390,2390,106457 +20220121,1424,2390,2395,2390,2395,25777 +20220121,1425,2395,2395,2390,2390,65561 +20220121,1426,2390,2395,2390,2395,21357 +20220121,1427,2390,2395,2385,2390,307347 +20220121,1428,2390,2395,2385,2390,1895678 +20220121,1429,2390,2395,2390,2395,472335 +20220121,1430,2390,2395,2385,2390,136845 +20220121,1431,2390,2390,2385,2390,12707 +20220121,1432,2385,2390,2380,2385,2737318 +20220121,1433,2385,2385,2380,2385,159294 +20220121,1434,2385,2385,2375,2380,847299 +20220121,1435,2380,2385,2375,2380,485574 +20220121,1436,2380,2385,2375,2380,168541 +20220121,1437,2380,2380,2375,2375,414413 +20220121,1438,2375,2380,2375,2375,511392 +20220121,1439,2380,2385,2375,2380,293913 +20220121,1440,2385,2385,2375,2380,333951 +20220121,1441,2380,2385,2375,2380,813856 +20220121,1442,2380,2380,2375,2380,66465 +20220121,1443,2380,2380,2375,2375,129163 +20220121,1444,2375,2380,2375,2380,15185 +20220121,1445,2380,2380,2375,2375,173167 +20220121,1446,2375,2375,2370,2370,1070997 +20220121,1447,2370,2370,2365,2370,2485802 +20220121,1448,2370,2375,2365,2375,292919 +20220121,1449,2370,2375,2370,2375,128744 +20220121,1450,2370,2375,2370,2375,22377 +20220121,1451,2375,2375,2370,2370,63677 +20220121,1452,2370,2375,2370,2370,18849 +20220121,1453,2370,2375,2365,2370,2782580 +20220121,1454,2370,2375,2365,2370,127250 +20220121,1455,2375,2375,2370,2370,120095 +20220121,1456,2370,2375,2365,2375,1303874 +20220121,1457,2375,2375,2370,2370,40645 +20220121,1458,2370,2375,2370,2370,133655 +20220121,1459,2370,2375,2370,2375,11396 +20220121,1500,2375,2375,2365,2375,574365 +20220121,1501,2375,2375,2370,2375,45364 +20220121,1502,2375,2375,2365,2370,295096 +20220121,1503,2375,2375,2365,2370,111198 +20220121,1504,2370,2375,2365,2370,255965 +20220121,1505,2365,2370,2365,2370,10394 +20220121,1506,2365,2370,2365,2370,9485 +20220121,1507,2365,2375,2365,2370,366863 +20220121,1508,2370,2375,2365,2370,256790 +20220121,1509,2375,2375,2370,2375,9871 +20220121,1510,2375,2375,2370,2375,38640 +20220121,1511,2370,2375,2370,2370,57466 +20220121,1512,2375,2375,2370,2370,51717 +20220121,1513,2370,2375,2370,2370,10168 +20220121,1514,2370,2375,2370,2370,38025 +20220121,1515,2370,2375,2370,2370,30398 +20220121,1516,2370,2375,2370,2370,267434 +20220121,1517,2370,2375,2365,2365,1114700 +20220121,1518,2365,2370,2365,2370,69535 +20220121,1519,2370,2375,2365,2370,1059871 +20220121,1520,2365,2375,2365,2375,206612 +20220121,1530,2365,2365,2365,2365,2444741