From 327e234412d3b71aaed3feda8a936dcc616935a7 Mon Sep 17 00:00:00 2001 From: dsyoon Date: Wed, 18 Jan 2023 00:38:50 +0900 Subject: [PATCH] init --- HTS_252670.py | 2 +- HTS_daily.py | 6 ++- hts/OrderChecker.py | 125 +++++++++++--------------------------------- 3 files changed, 36 insertions(+), 97 deletions(-) diff --git a/HTS_252670.py b/HTS_252670.py index 88b38c3..ac7eab1 100644 --- a/HTS_252670.py +++ b/HTS_252670.py @@ -26,7 +26,7 @@ class HTS_252670 (HTS): self.stock_code = stock_code self.buy_count = buy_count - self.orderChecker = OrderChecker(self.RESOURCE_PATH, self.stock_code) + self.orderChecker = OrderChecker(self.RESOURCE_PATH) self.buySellChecker = BuySellChecker() self.labelChecker = LabelChecker(RESOURCE_PATH) return diff --git a/HTS_daily.py b/HTS_daily.py index 9b1eb68..1aac939 100644 --- a/HTS_daily.py +++ b/HTS_daily.py @@ -29,6 +29,7 @@ class HTS_DAILY (HTS): self.RESOURCE_PATH = RESOURCE_PATH self.dailyStatus = DailyStatus(RESOURCE_PATH) self.buySellChecker = BuySellChecker() + self.orderChecker = OrderChecker(self.RESOURCE_PATH) self.analyzed_day = 120 self.MAX_BUY_PRICE = 100000 @@ -63,6 +64,8 @@ class HTS_DAILY (HTS): print ("START...") THIS_TIME = datetime.now() + self.orderChecker.read(today) + while datetime.strptime(today + " 070000", '%Y%m%d %H%M%S') < THIS_TIME < datetime.strptime(today + " 153100", '%Y%m%d %H%M%S'): # 1515 까지만 매수를 시도한다. @@ -96,7 +99,7 @@ class HTS_DAILY (HTS): bsLine, data = self.buySellChecker.checkTransactionWithEnvelope(data, stock_code, self.analyzed_day, isRealTime=False) - if len(data.index) > 10 and max(bsLine['buy'][len(bsLine['buy']) - 2:]) > 0: + if len(data.index) > 10 and max(bsLine['buy'][len(bsLine['buy']) - 2:]) > 0 and not self.orderChecker.exist(stock_code): last_index = len(bsLine['buy'])-1 if bsLine['buy'][last_index] > 0: bs_buy_price = bsLine['buy'][last_index] @@ -105,6 +108,7 @@ class HTS_DAILY (HTS): # 매수를 주문한다. orderNum = self.requestOrder(OrderType.buy, stock_code, buy_count, bs_buy_price) + self.orderChecker.add(today, stock_code, 1, orderNum, buy_count, bs_buy_price) # 로그 출력 print("BUY", THIS_TIME.strftime('%Y%m%d %H%M%S'), orderNum, stock_code, stock_name, bs_buy_price, buy_count) diff --git a/hts/OrderChecker.py b/hts/OrderChecker.py index ca8d039..3d1bced 100644 --- a/hts/OrderChecker.py +++ b/hts/OrderChecker.py @@ -6,107 +6,42 @@ from hts.OrderType import OrderType class OrderChecker: - saveFileName = None + RESOURCE_PATH = None + order_df = None - def __init__(self, RESOURCE_PATH, stock_code): - self.saveFileName = os.path.join(RESOURCE_PATH, "order", stock_code + "_" + datetime.today().strftime("%Y%m%d") + ".csv") + def __init__(self, RESOURCE_PATH): + self.RESOURCE_PATH = RESOURCE_PATH + self.order_df = None return - def read(self): - if os.path.isfile(self.saveFileName): - order_df = pd.read_csv(self.saveFileName) + def read(self, ymd): + saveFileName = os.path.join(self.RESOURCE_PATH, "order", ymd + ".csv") + + if os.path.isfile(saveFileName): + self.order_df = pd.read_csv(saveFileName) else: - order_df = pd.DataFrame(columns=["stock_code", "type", "orderNum", "count", "price", "datetime"]) + self.order_df = pd.DataFrame(columns=["datetime", "stock_code", "type", "orderNum", "count", "price"]) - if 'Unnamed: 0' in order_df.columns: - order_df.drop(['Unnamed: 0'], axis=1, inplace=True) - order_df = order_df.fillna(0) - order_df = order_df.astype({"stock_code": str, "type": str, "orderNum": int, "count": int, "price": int}) - order_df['datetime'] = pd.to_datetime(order_df['datetime']) - return order_df + if 'Unnamed: 0' in self.order_df.columns: + self.order_df.drop(['Unnamed: 0'], axis=1, inplace=True) + self.order_df = self.order_df.fillna(0) + self.order_df = self.order_df.astype({"stock_code": str, "type": str, "orderNum": int, "count": int, "price": int}) + self.order_df['datetime'] = pd.to_datetime(self.order_df['datetime']) + return - def add(self, stock_code, type, orderNum, count, price, orderList): - orderListToCancel = [] - # 매수 요청인 경우만 두 시간 전 주문을 찾아서 제외한다. + def exist(self, stock_code): + if self.order_df.loc[self.order_df["stock_code"] == stock_code] is None: + return False + return True - order_df = self.read() + def add(self, ymd, stock_code, type, orderNum, count, price): + if self.exist(stock_code): + return False + # 새로운 주문을 추가한다. + self.order_df = self.order_df.append({"stock_code": stock_code, "type": type, "orderNum": orderNum, "count": count, "price": price, "datetime": datetime.now()}, ignore_index=True) - # 두 시간 전 주문을 찾는다. - if orderList is not None and len(orderList) > 0: - # 1) 종목 코드를 찾는다. - stock_df = order_df.loc[order_df["stock_code"] == stock_code] + # 파일로 기록한다. + saveFileName = os.path.join(self.RESOURCE_PATH, "order", ymd + ".csv") + self.order_df.to_csv(saveFileName) - # 2) 5분 전 계산 - before_two_hour = datetime.now() - timedelta(minutes=5) - - # 3) 만약 5분 전 주문을 찾는다. - stock_twohour_df = stock_df.loc[stock_df["datetime"] <= before_two_hour] - - # 4) 5분 전 주문 중에서 매수 데이터만 찾는다. - orderNum_df = stock_twohour_df.loc[stock_twohour_df["type"] == OrderType.buy.value] - - # 5) 5분 전 매수 항목을 별도로 추출한다. - orderNumSet = set(list(orderNum_df["orderNum"])) - for item in orderList: - if item.orderNum in orderNumSet: - orderListToCancel.append(item) - - # 6) 추출된 항목을 제외시킨다. - order_df = order_df.loc[order_df["orderNum"] != item.orderNum] - - # 7) 새로운 주문을 추가한다. - order_df = order_df.append({"stock_code": stock_code, "type": type.value, "orderNum": orderNum, "count": count, "price": price, "datetime": datetime.now()}, ignore_index=True) - - # 8) 파일로 기록한다. - order_df.to_csv(self.saveFileName) - - return orderListToCancel - - def remove(self, stock_code, type, orderList): - order_df = self.read() - orderListToCancel = [] - - if orderList is not None and len(orderList) > 0: - # 1) 종목 코드를 찾는다. - stock_df = order_df.loc[order_df["stock_code"] == stock_code] - - # 2) 매도 주문을 찾는다. - orderNum_df = stock_df.loc[stock_df["type"] == type.value] - - # 3) 매도 주문 중에서 항목을 별도로 추출한다. - orderNumSet = set(list(orderNum_df["orderNum"])) - for item in orderList: - if item.orderNum in orderNumSet: - orderListToCancel.append(item) - - # 4) 해당 orderNum 제외하기 - order_df = order_df.loc[order_df["orderNum"] != item.orderNum] - order_df.to_csv(self.saveFileName) - - return orderListToCancel - -if __name__ == "__main__": - a = pd.DataFrame(columns=["type", "orderNum", "count", "price", "datetime"]) - a = a.astype({"type": str, "orderNum": int, "count": int, "price": int}) - a['datetime'] = pd.to_datetime(a['datetime']) - - this_time = datetime.now() - a = a.append({"stock_code": "a", "type": "0", "orderNum": 1, "count": 3, "price": 7, "datetime": this_time}, ignore_index=True) - a = a.append({"stock_code": "a", "type": "1", "orderNum": 3, "count": 0, "price": 6, "datetime": this_time - timedelta(hours=2)}, ignore_index=True) - a = a.append({"stock_code": "a", "type": "2", "orderNum": 3, "count": 0, "price": 3, "datetime": this_time + timedelta(hours=1)}, ignore_index=True) - a = a.append({"stock_code": "a", "type": "1", "orderNum": 9, "count": 9, "price": 8, "datetime": this_time}, ignore_index=True) - - b = a.loc[a["orderNum"] != 3] - print(b.tail()) - print() - - b = a.loc[a["datetime"] < this_time] - print(b.tail()) - - a.to_csv("test.csv") - a = pd.read_csv("test.csv") - a.drop(['Unnamed: 0'], axis=1, inplace=True) - a = a.astype({"stock_code": str, "type": str, "orderNum": int, "count": int, "price": int}) - a['datetime'] = pd.to_datetime(a['datetime']) - - print("done") \ No newline at end of file + return True