This commit is contained in:
dsyoon
2023-01-18 00:38:50 +09:00
parent 8c2152af5d
commit 327e234412
3 changed files with 36 additions and 97 deletions

View File

@@ -26,7 +26,7 @@ class HTS_252670 (HTS):
self.stock_code = stock_code self.stock_code = stock_code
self.buy_count = buy_count self.buy_count = buy_count
self.orderChecker = OrderChecker(self.RESOURCE_PATH, self.stock_code) self.orderChecker = OrderChecker(self.RESOURCE_PATH)
self.buySellChecker = BuySellChecker() self.buySellChecker = BuySellChecker()
self.labelChecker = LabelChecker(RESOURCE_PATH) self.labelChecker = LabelChecker(RESOURCE_PATH)
return return

View File

@@ -29,6 +29,7 @@ class HTS_DAILY (HTS):
self.RESOURCE_PATH = RESOURCE_PATH self.RESOURCE_PATH = RESOURCE_PATH
self.dailyStatus = DailyStatus(RESOURCE_PATH) self.dailyStatus = DailyStatus(RESOURCE_PATH)
self.buySellChecker = BuySellChecker() self.buySellChecker = BuySellChecker()
self.orderChecker = OrderChecker(self.RESOURCE_PATH)
self.analyzed_day = 120 self.analyzed_day = 120
self.MAX_BUY_PRICE = 100000 self.MAX_BUY_PRICE = 100000
@@ -63,6 +64,8 @@ class HTS_DAILY (HTS):
print ("START...") print ("START...")
THIS_TIME = datetime.now() 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'): while datetime.strptime(today + " 070000", '%Y%m%d %H%M%S') < THIS_TIME < datetime.strptime(today + " 153100", '%Y%m%d %H%M%S'):
# 1515 까지만 매수를 시도한다. # 1515 까지만 매수를 시도한다.
@@ -96,7 +99,7 @@ class HTS_DAILY (HTS):
bsLine, data = self.buySellChecker.checkTransactionWithEnvelope(data, stock_code, self.analyzed_day, isRealTime=False) 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 last_index = len(bsLine['buy'])-1
if bsLine['buy'][last_index] > 0: if bsLine['buy'][last_index] > 0:
bs_buy_price = bsLine['buy'][last_index] 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) 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) print("BUY", THIS_TIME.strftime('%Y%m%d %H%M%S'), orderNum, stock_code, stock_name, bs_buy_price, buy_count)

View File

@@ -6,107 +6,42 @@ from hts.OrderType import OrderType
class OrderChecker: class OrderChecker:
saveFileName = None RESOURCE_PATH = None
order_df = None
def __init__(self, RESOURCE_PATH, stock_code): def __init__(self, RESOURCE_PATH):
self.saveFileName = os.path.join(RESOURCE_PATH, "order", stock_code + "_" + datetime.today().strftime("%Y%m%d") + ".csv") self.RESOURCE_PATH = RESOURCE_PATH
self.order_df = None
return return
def read(self): def read(self, ymd):
if os.path.isfile(self.saveFileName): saveFileName = os.path.join(self.RESOURCE_PATH, "order", ymd + ".csv")
order_df = pd.read_csv(self.saveFileName)
if os.path.isfile(saveFileName):
self.order_df = pd.read_csv(saveFileName)
else: 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: if 'Unnamed: 0' in self.order_df.columns:
order_df.drop(['Unnamed: 0'], axis=1, inplace=True) self.order_df.drop(['Unnamed: 0'], axis=1, inplace=True)
order_df = order_df.fillna(0) self.order_df = self.order_df.fillna(0)
order_df = order_df.astype({"stock_code": str, "type": str, "orderNum": int, "count": int, "price": int}) self.order_df = self.order_df.astype({"stock_code": str, "type": str, "orderNum": int, "count": int, "price": int})
order_df['datetime'] = pd.to_datetime(order_df['datetime']) self.order_df['datetime'] = pd.to_datetime(self.order_df['datetime'])
return order_df return
def add(self, stock_code, type, orderNum, count, price, orderList): def exist(self, stock_code):
orderListToCancel = [] 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: saveFileName = os.path.join(self.RESOURCE_PATH, "order", ymd + ".csv")
# 1) 종목 코드를 찾는다. self.order_df.to_csv(saveFileName)
stock_df = order_df.loc[order_df["stock_code"] == stock_code]
# 2) 5분 전 계산 return True
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")