import os import pandas as pd from datetime import datetime, timedelta class OrderChecker: RESOURCE_PATH = None order_df = None TYPE = None def __init__(self, RESOURCE_PATH, type=""): self.RESOURCE_PATH = RESOURCE_PATH self.TYPE = type return def read(self, ymd): saveFileName = os.path.join(self.RESOURCE_PATH, "order", self.TYPE+"_"+ymd + ".csv") if os.path.isfile(saveFileName): order_df = pd.read_csv(saveFileName) else: # (type) buy=0, sell=1 order_df = pd.DataFrame(columns=["datetime", "stock_code", "type", "orderNum", "canceled", "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": int, "orderNum": str, "canceled": int, "count": int, "price": int}) order_df['datetime'] = pd.to_datetime(order_df['datetime']) return order_df def exist(self, ymd, stock_code, mins=30): order_df = self.read(ymd) if order_df != None and len(order_df)>0: tmp = order_df.loc[order_df["stock_code"] == stock_code] now = datetime.now() - timedelta(minutes=mins) tmp = tmp.loc[now < tmp["datetime"]] if tmp is not None and len(tmp) > 0: return True return False def buy(self, ymd, stock_code: str, count: int, price: int, orderNum=""): order_df = self.read(ymd) # 새로운 주문을 추가한다. order_df = order_df.append({"stock_code": stock_code, "type": 0, "orderNum": str(orderNum), "canceled": 0, "count": count, "price": price, "datetime": datetime.now()}, ignore_index=True) order_df = order_df.astype({"stock_code": str, "type": int, "orderNum": str, "canceled": int, "count": int, "price": int}) # 파일로 기록한다. saveFileName = os.path.join(self.RESOURCE_PATH, "order", self.TYPE+"_"+ymd + ".csv") order_df.to_csv(saveFileName) return True def sell(self, ymd, stock_code: str): order_df = self.read(ymd) # 기존 매수 주문을 매도로 변경 한다. order_df.loc[(order_df["stock_code"] == stock_code, 'type')] = 1 # 파일로 기록 한다. saveFileName = os.path.join(self.RESOURCE_PATH, "order", self.TYPE+"_"+ymd + ".csv") order_df.to_csv(saveFileName) return True def cancel(self, ymd, stock_code, ORDER_LIST, mins=10): orderListToCancel = [] order_df = self.read(ymd) if len(order_df) > 0: now = datetime.now() - timedelta(minutes=mins) # min 분 이상 된 시간인 내용을 가지고 옴 df = order_df.loc[(order_df["datetime"] <= now)] # 취소가 되지 않은 것만 가지고 옴 (0: 취소 되지 않음, 1: 취소함) df = df.loc[(order_df["canceled"] == 0)] for i in range(len(df)): order_df.loc[(order_df['stock_code']==stock_code) & (order_df.index == df.index[i]), 'canceled'] = 1 saveFileName = os.path.join(self.RESOURCE_PATH, "order", self.TYPE+"_"+ymd + ".csv") order_df.to_csv(saveFileName, index=False) if ORDER_LIST is not None and len(ORDER_LIST) > 0: orderNumSet = set(list(df["orderNum"])) for item in ORDER_LIST: if item.orderNum in orderNumSet: orderListToCancel.append(item) return orderListToCancel