This commit is contained in:
dsyoon
2023-01-29 21:16:10 +09:00
parent 8e7f548f3a
commit 763fd79acd
3 changed files with 62 additions and 44 deletions

View File

@@ -1,7 +1,6 @@
import time import time
import os import os
from datetime import datetime, timedelta from datetime import datetime, timedelta
import pandas as pd
from hts.HTS import HTS from hts.HTS import HTS
from hts.OrderType import OrderType from hts.OrderType import OrderType
@@ -9,6 +8,8 @@ from hts.OrderType import OrderType
from hts.BuySellChecker import BuySellChecker from hts.BuySellChecker import BuySellChecker
from hts.OrderChecker import OrderChecker from hts.OrderChecker import OrderChecker
from stock.util.LabelChecker import LabelChecker from stock.util.LabelChecker import LabelChecker
from stock.util.SlackBot import SlackBot
from stock.analysis.StockStatus import StockStatus
class HTS_252670 (HTS): class HTS_252670 (HTS):
@@ -18,6 +19,8 @@ class HTS_252670 (HTS):
orderChecker = None orderChecker = None
buySellChecker = None buySellChecker = None
labelChecker = None labelChecker = None
slackBot = None
stockStatus = None
def __init__(self, RESOURCE_PATH, stock_code, buy_count): def __init__(self, RESOURCE_PATH, stock_code, buy_count):
super().__init__(RESOURCE_PATH) super().__init__(RESOURCE_PATH)
@@ -29,6 +32,9 @@ class HTS_252670 (HTS):
self.orderChecker = OrderChecker(self.RESOURCE_PATH) self.orderChecker = OrderChecker(self.RESOURCE_PATH)
self.buySellChecker = BuySellChecker() self.buySellChecker = BuySellChecker()
self.labelChecker = LabelChecker(RESOURCE_PATH) self.labelChecker = LabelChecker(RESOURCE_PATH)
self.slackBot = SlackBot()
self.stockStatus = StockStatus(RESOURCE_PATH)
return return
def getSellingPrice(self, log_time, stock_code, final_price, check=False): def getSellingPrice(self, log_time, stock_code, final_price, check=False):
@@ -55,7 +61,29 @@ class HTS_252670 (HTS):
print("ORDER_SELL", stock_code, log_time.strftime('%Y%m%d %H%M%S'), jangoDic[code]['매도가능'], sell_price) print("ORDER_SELL", stock_code, log_time.strftime('%Y%m%d %H%M%S'), jangoDic[code]['매도가능'], sell_price)
return return
def buyRealTime(self, today): def makeTickData(self, data, mins=30):
result = {"check": set(),
"time": [],
"open": [],
"close": [],
"high": [],
"low": [],
"vol": [],
"label": []}
for i in range(mins, len(data['time'])+1):
result["check"].add(data['time'][i-1])
result["time"].append(data['time'][i-1])
result["open"].append(data['open'][i-mins])
result["close"].append(data['close'][i-1])
result["high"].append(max(data['high'][i - mins: i]))
result["low"].append(min(data['low'][i - mins: i]))
result["vol"].append(sum(data['vol'][i - mins: i]))
return result
def buyRealTime(self, today, analyzed_day=1000):
print ("START...") print ("START...")
THIS_TIME = datetime.now() THIS_TIME = datetime.now()
@@ -65,38 +93,31 @@ class HTS_252670 (HTS):
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'):
if datetime.strptime(today + " 090000", '%Y%m%d %H%M%S') < THIS_TIME < datetime.strptime(today + " 151500", '%Y%m%d %H%M%S'): if datetime.strptime(today + " 090000", '%Y%m%d %H%M%S') < THIS_TIME < datetime.strptime(today + " 151500", '%Y%m%d %H%M%S'):
# 3시 까지만 매수를 시도한다. # 3시 까지만 매수를 시도한다.
if THIS_TIME < datetime.strptime(today + " 145000", '%Y%m%d %H%M%S'):
if THIS_TIME.strftime('%S') in ("06", "16", "26", "36", "46", "56"):
# 데이터를 가지고 온다.
result = self.getRealTime(self.stock_code, today, LAST_DATA)
final_price = result["close"][len(result["close"])-1]
# 10초마다 체크하여 체결된 내역이 있으면 50원 높게 매도를 주문한다.
self.getSellingPrice(THIS_TIME, self.stock_code, final_price, check=True)
if THIS_TIME.strftime('%S') == "03": if THIS_TIME.strftime('%S') == "03":
# 매분 3초마다 실행한다. # 매분 3초마다 실행한다.
# 데이터를 가지고 온다. # 데이터를 가지고 온다.
result = self.getRealTime(self.stock_code, today, LAST_DATA) result = self.getRealTime(self.stock_code, today, LAST_DATA)
# 규칙 기반의 분석을 통해서 볼린저밴드 상/하단을 계산한다. result_5 = self.makeTickData(result, mins=5)
result_30 = self.makeTickData(result, mins=30)
data = self.buySellChecker.analyze(result) data = self.buySellChecker.analyze(result)
data.drop(data.index[:len(data) - analyzed_day], inplace=True)
# 만약 미체결 내역이 있는데, 지표가 꺽여 내려온다면, 매수 주문을 취소 시킨다. # 이동평균, RSI, MACD, 일목균형, 볼린저밴드 상/하단을 계산한다.
last_index = len(data['close']) - 1 data_5 = self.buySellChecker.analyze(result_5)
if data['slow_k'][last_index-1]>=80 and data['slow_k'][last_index-1] > data['slow_k'][last_index]: # 분석일 데이터만 활용한다 (이전 데이터는 제거)
# 미체결 기록을 가져온다. data_5.drop(data_5.index[:len(data_5) - analyzed_day], inplace=True)
ORDER_LIST = self.requestOrderList()
orderListToCancel = self.orderChecker.remove(self.stock_code, OrderType.sell, ORDER_LIST)
self.cancelOrderList(orderListToCancel)
print("CANCEL", THIS_TIME.strftime('%Y%m%d %H%M%S'), len(orderListToCancel), len(ORDER_LIST))
data_30 = self.buySellChecker.analyze(result_30)
# 분석일 데이터만 활용한다 (이전 데이터는 제거)
data_30.drop(data_30.index[:len(data_30) - analyzed_day], inplace=True)
# 사야 할 시점/가격과 팔아야 할 시점/가격을 체크한다. # 사야 할 시점과 팔아야 할 시점을 체크한다.
bsLine, data = self.buySellChecker.checkTransaction(data, self.stock_code, isRealTime=True) bsLine = self.buySellChecker.checkTransaction(stock_code, data, data_5, data_30, isRealTime=True)
bs_buy_price = bsLine['buy'][0] bs_buy_price = bsLine['buy'][0]
bs_buy_weight = bsLine['buy_weight'][0] bs_buy_weight = bsLine['buy_weight'][0]
bs_sell_price = bsLine['sell'][0] bs_sell_price = bsLine['sell'][0]
@@ -110,33 +131,30 @@ class HTS_252670 (HTS):
# 매수를 주문한다. # 매수를 주문한다.
orderNum = self.requestOrder(OrderType.buy, self.stock_code, BUY_COUNT , bs_buy_price) orderNum = self.requestOrder(OrderType.buy, self.stock_code, BUY_COUNT , bs_buy_price)
# slackbot에 메시지를 보냄
self.slackBot.post_to_slack(stock_code, stock_name, "BUY", bsLine['buy'][len(bsLine['buy']) - 1], buy_count)
self.orderChecker.add(today, stock_code, 1, buy_count, bs_buy_price, orderNum)
# 미체결 기록을 가져온다.
ORDER_LIST = self.requestOrderList()
# 매수 주문을 기록한다.
orderListToCancel = self.orderChecker.add(self.stock_code, OrderType.buy, orderNum, BUY_COUNT, bs_buy_price, ORDER_LIST)
# 1 시간 이전 미체결을 모두 취소한다.
self.cancelOrderList(orderListToCancel)
# 로그 출력 # 로그 출력
print("BUY", THIS_TIME.strftime('%Y%m%d %H%M%S'), BUY_COUNT, bs_buy_price, len(orderListToCancel), len(ORDER_LIST)) print("BUY", THIS_TIME.strftime('%Y%m%d %H%M%S'), orderNum, stock_code, stock_name, bs_buy_price, buy_count)
if bs_sell_price > 0: if bs_sell_price > 0:
# 미체결 기록을 가져온다.
ORDER_LIST = self.requestOrderList()
# 매도 주문을 기록을 가져온다.
orderListToCancel = self.orderChecker.delete(self.stock_code, OrderType.sell, ORDER_LIST)
# 매도 미체결을 모두 취소한다.
self.cancelOrderList(orderListToCancel)
# 매도한다. # 매도한다.
self.getSellingPrice(THIS_TIME, self.stock_code, final_price) orderNum = self.getSellingPrice(THIS_TIME, self.stock_code, final_price)
# slackbot에 메시지를 보냄
self.slackBot.post_to_slack(stock_code, stock_name, "SELL", bsLine['sell'][len(bsLine['sell']) - 1], -1)
self.orderChecker.delete(today, stock_code)
# 로그 출력
print("SELL", THIS_TIME.strftime('%Y%m%d %H%M%S'), str(orderNum), stock_code, stock_name, bs_sell_price)
# 로그 출력 # 로그 출력
print("TIMECHECK: %s, price: %d, avg3: %.2f, avg5: %.2f, avg10: %.2f, slow_k: %.2f, open: %d, high: %d, low: %d" % print("TIMECHECK: %s, price: %d, avg5: %.2f, avg30: %.2f, slow_k: %.2f, open: %d, high: %d, low: %d" %
(str(THIS_TIME), final_price, (str(THIS_TIME), final_price, data["avg5"][data_size - 1], data["avg30"][data_size - 1],
data["avg3"][data_size - 1], data["avg6"][data_size - 1], data["avg9"][data_size - 1], data["slow_k"][data_size - 2], data["slow_k"][data_size - 2], data["open"][data_size - 1], data["high"][data_size - 1], data["low"][data_size - 1],))
data["open"][data_size - 1], data["high"][data_size - 1], data["low"][data_size - 1],))
elif datetime.strptime(today + " 151530", '%Y%m%d %H%M%S') < THIS_TIME < datetime.strptime(today + " 151600", '%Y%m%d %H%M%S'): elif datetime.strptime(today + " 151530", '%Y%m%d %H%M%S') < THIS_TIME < datetime.strptime(today + " 151600", '%Y%m%d %H%M%S'):
# 3시 15분 30초부터 3시 16분 사이는 잔량을 매도한다. # 3시 15분 30초부터 3시 16분 사이는 잔량을 매도한다.

View File

@@ -20,8 +20,8 @@ if __name__ == "__main__":
# KODEX 인버스 * 2 # KODEX 인버스 * 2
stocks = [ stocks = [
{"stock_code": "252670", "stock_name": "KODEX 200선물인버스2X", "start_date": datetime.strptime("20221121",'%Y%m%d'), "end_date": datetime.today()}, {"stock_code": "252670", "stock_name": "KODEX 200선물인버스2X", "start_date": datetime.strptime("20230120",'%Y%m%d'), "end_date": datetime.today()},
{"stock_code": "122630", "stock_name": "KODEX 레버리지", "start_date": datetime.strptime("20220916",'%Y%m%d'), "end_date": datetime.today()} {"stock_code": "122630", "stock_name": "KODEX 레버리지", "start_date": datetime.strptime("20230120",'%Y%m%d'), "end_date": datetime.today()}
] ]
hts = HTS_Downloader(RESOURCE_PATH) hts = HTS_Downloader(RESOURCE_PATH)

Binary file not shown.