From 7cf8b775806984091c7c692a8bacd3dd2a87846b Mon Sep 17 00:00:00 2001 From: dosangyoon Date: Sun, 17 Oct 2021 00:36:44 +0900 Subject: [PATCH] init --- hts/HTS.py | 23 +++++++++++++++-------- hts/OrderChecker.py | 17 ++++++++++++++++- stockpredictor/analysis/Analyzer.py | 4 ++-- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/hts/HTS.py b/hts/HTS.py index 8474230..4da96ed 100644 --- a/hts/HTS.py +++ b/hts/HTS.py @@ -548,6 +548,7 @@ class HTS: def buyRealTime(self, stock_code, GIVEN_DAY): orderChecker = OrderChecker() BASE_COUNT = 100 + ORDER_LIST = None timecheckList = pd.read_csv("timecheck.csv").values.tolist() timecheck = {GIVEN_DAY + " " + str(second).zfill(6):False for second, check in timecheckList} @@ -578,31 +579,37 @@ class HTS: data_size = len(data["Close"]) final_price = data["Close"][data_size-1] + if bs_buy_price > 0 or bs_sell_price > 0: + # 미체결 기록을 가져온다. + ORDER_LIST = self.requestOrderList() + if bs_buy_price > 0: # 기본 100 주에 가중치를 추가해서 매수한다. BUY_COUNT = int(BASE_COUNT * bs_weight) - # 매수를 주문한다. + # 매수를 요청한다. orderNum = self.requestOrder(OrderType.buy, stock_code, BUY_COUNT , bs_buy_price) - # 미체결 기록을 가져온다. - orderList = self.requestOrderList() # 매수 주문을 기록한다. - orderListToCancel = orderChecker.add(OrderType.buy, orderNum, BUY_COUNT, bs_buy_price, orderList) - # 두 시간 이전 미체결을 취소한다. + orderListToCancel = orderChecker.add(OrderType.buy, orderNum, BUY_COUNT, bs_buy_price, ORDER_LIST) + # 두 시간 이전 미체결을 모두 취소한다. self.cancelOrderList(orderListToCancel) # 로그 출력 print("BUY", THIS_TIME, BUY_COUNT, bs_buy_price) if bs_sell_price > 0: + # 매도 주문을 기록한다. + orderListToCancel = orderChecker.remove(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, stock_code, selling_count, selling_price) - # 미체결 기록을 가져온다. - orderList = self.requestOrderList() # 매도 주문을 기록한다. - orderListToCancel = orderChecker.add(OrderType.sell, orderNum, selling_count, selling_price, orderList) + orderListToCancel = orderChecker.add(OrderType.sell, orderNum, selling_count, selling_price, ORDER_LIST) # 두 시간 이전 미체결을 취소한다. self.cancelOrderList(orderListToCancel) # 로그 출력 diff --git a/hts/OrderChecker.py b/hts/OrderChecker.py index c86fe75..09e15c5 100644 --- a/hts/OrderChecker.py +++ b/hts/OrderChecker.py @@ -31,7 +31,7 @@ class OrderChecker: before_two_hour = datetime.now() - timedelta(hours=2) # 두 시간 전 주문을 찾는다. - if len(orderList) > 0: + if orderList is not None and len(orderList) > 0: # 만약 두시간 전 주문을 찾는다. orderNum_df = self.order_df.loc[self.order_df["datetime"] <= before_two_hour] orderNum_df = orderNum_df.loc[orderNum_df["type"] == OrderType.buy.value] @@ -47,6 +47,21 @@ class OrderChecker: return orderListToCancel + def remove(self, type, orderList): + orderListToCancel = [] + + if orderList is not None and len(orderList) > 0: + orderNum_df = self.order_df.loc[self.order_df["type"] == type.value] + orderNumSet = set(list(orderNum_df["orderNum"])) + for item in orderList: + if item.orderNum in orderNumSet: + orderListToCancel.append(item) + # 해당 orderNum 제외하기 + self.order_df = self.order_df.loc[self.order_df["orderNum"] != item.orderNum] + self.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}) diff --git a/stockpredictor/analysis/Analyzer.py b/stockpredictor/analysis/Analyzer.py index d540ef2..3438174 100644 --- a/stockpredictor/analysis/Analyzer.py +++ b/stockpredictor/analysis/Analyzer.py @@ -411,7 +411,7 @@ class Analyzer: fileName = "%s/%d__s(%.2f)__b(%.2f)__p(%.2f)__%s__%d__%s_%s.html" % (fileName, isbuy, stochastic_score, bolingerband_score, positionalEnergy, state, buy_price, item_name.replace(" ", ""), item_code) po.write_html(fig, file=fileName, auto_open=False) - if positionalEnergy < 0.15: + if positionalEnergy < 0.5: fileName = self.positionalEnergy_path fileName = "%s/%d__p(%.2f)__b(%.2f)__s(%.2f)__%s__%d__%s_%s.html" % (fileName, isbuy, positionalEnergy, bolingerband_score, stochastic_score, state, buy_price, item_name.replace(" ", ""), item_code) po.write_html(fig, file=fileName, auto_open=False) @@ -518,7 +518,7 @@ class Analyzer: isbuy = 0 # 스토케스틱이 20이하이어야 하며, 볼린저밴드 0.3 보다 작으며, 위치에너지도 0.2보다 낮다면, - if stochastic_score < 30 and bolingerband_score < 0.3 and positionalEnergy < 0.6: + if stochastic_score < 30 and bolingerband_score < 0.3 and positionalEnergy < 0.5: isbuy = 1 # 위치에너지가 낮거나 240일선 아래에 있는 상태에서 상태값을 갖는 경우 매수한다.