This commit is contained in:
dsyoon
2023-12-19 23:31:09 +09:00
parent 308a01fc13
commit 6906703261
5 changed files with 256 additions and 236 deletions

View File

@@ -1,6 +1,7 @@
import os
import time
import pandas as pd
import psutil
import sqlite3
from datetime import datetime
from hts.HTS import HTS
@@ -389,100 +390,104 @@ class HTS_etf(HTS):
return result
def buyRealTime(self, today, MAX_PRICE=30000):
BUY_LIST = {'buy_count': 0, 'buy_avg': 0, 'buy_list': []}
def getDisparityLimit(self, ticker, RESOURCE_PATH):
conn = sqlite3.connect(os.path.join(RESOURCE_PATH, 'coins.db'))
cursor = conn.cursor()
print("START...")
THIS_TIME = datetime.now()
cursor.execute('SELECT disparity_avg5, disparity_avg20, disparity_avg60, disparity_avg120, disparity_avg240, disparity_avg480, disparity_avg1500 FROM minutely WHERE (CODE=? or CODE=?) order by ymd, hms', (ticker['stock_code'], ticker['stock_code'].replace('KRW-', ''),))
LAST_DATA = self.getLastData(self.stock_code, today)
disparity = {
'avg': {},
"limit_top_1": {"avg5": None, "avg20": None, "avg60": None, "avg120": None, "avg240": None, "avg480": None, "avg1500": None},
"limit_bottom_1": {"avg5": None, "avg20": None, "avg60": None, "avg120": None, "avg240": None, "avg480": None, "avg1500": None},
"limit_top_3": {"avg5": None, "avg20": None, "avg60": None, "avg120": None, "avg240": None, "avg480": None, "avg1500": None},
"limit_bottom_3": {"avg5": None, "avg20": None, "avg60": None, "avg120": None, "avg240": None, "avg480": None, "avg1500": None}
}
avg = {"avg5": [], "avg20": [], "avg60": [], "avg120": [], "avg240": [], "avg480": [], "avg1500": []}
db_result = cursor.fetchall()
for rows in db_result:
avg["avg5"].append(float(rows[0]))
avg["avg20"].append(float(rows[1]))
avg["avg60"].append(float(rows[2]))
avg["avg120"].append(float(rows[3]))
avg["avg240"].append(float(rows[4]))
avg["avg480"].append(float(rows[5]))
avg["avg1500"].append(float(rows[6]))
while datetime.strptime(today + " 060000", '%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 + " 090100", '%Y%m%d %H%M%S'):
self.bot.sendMsg("START... {} ({}) SLOW_K: {}".format(self.stock_code, self.stock_name, MAX_PRICE))
cursor.close()
conn.close()
if datetime.strptime(today + " 090000", '%Y%m%d %H%M%S') < THIS_TIME < datetime.strptime(today + " 151500", '%Y%m%d %H%M%S'):
disparity['avg'] = avg
disparity_1500 = sorted(list(set(avg['avg1500'])), reverse=True)
disparity_480 = sorted(list(set(avg['avg480'])), reverse=True)
disparity_240 = sorted(list(set(avg['avg240'])), reverse=True)
disparity_120 = sorted(list(set(avg['avg120'])), reverse=True)
disparity_60 = sorted(list(set(avg['avg60'])), reverse=True)
disparity_20 = sorted(list(set(avg['avg20'])), reverse=True)
disparity_5 = sorted(list(set(avg['avg5'])), reverse=True)
# 매도를 체크한다.
check = self.sellStocks(self.stock_code, self.stock_name)
poses = [1, 3]
for pos in poses:
disparity['limit_top_'+str(pos)]['avg1500'] = disparity_1500[pos]
disparity['limit_bottom_'+str(pos)]['avg1500'] = disparity_1500[len(disparity_1500)-pos]
disparity['limit_top_'+str(pos)]['avg480'] = disparity_480[pos]
disparity['limit_bottom_'+str(pos)]['avg480'] = disparity_480[len(disparity_480)-pos]
disparity['limit_top_'+str(pos)]['avg240'] = disparity_240[pos]
disparity['limit_bottom_'+str(pos)]['avg240'] = disparity_240[len(disparity_240)-pos]
disparity['limit_top_'+str(pos)]['avg120'] = disparity_120[pos]
disparity['limit_bottom_'+str(pos)]['avg120'] = disparity_120[len(disparity_120)-pos]
disparity['limit_top_'+str(pos)]['avg60'] = disparity_60[pos]
disparity['limit_bottom_'+str(pos)]['avg60'] = disparity_60[len(disparity_60)-pos]
disparity['limit_top_'+str(pos)]['avg20'] = disparity_20[pos]
disparity['limit_bottom_'+str(pos)]['avg20'] = disparity_20[len(disparity_20)-pos]
disparity['limit_top_'+str(pos)]['avg5'] = disparity_5[pos]
disparity['limit_bottom_'+str(pos)]['avg5'] = disparity_5[len(disparity_5)-pos]
# jangoDic[code]['장부가'], jangoDic[code]['평가금액'], jangoDic[code]['평가손익'],
buy_avg, amount, profit = self.getBallance(self.stock_code)
if check or buy_avg == 0:
return disparity
def buyRealTime(self, stock, data, data_signal, MAX_BUY_PRICE, BUY_LIST):
# 매도를 체크한다.
check = self.sellStocks(stock_code=self.stock_code)
# jangoDic[code]['장부가'], jangoDic[code]['평가금액'], jangoDic[code]['평가손익'],
buy_avg, amount, profit = self.getBallance(self.stock_code)
if check or buy_avg == 0:
BUY_LIST['buy_avg'] = 0
BUY_LIST['buy_count'] = 0
BUY_LIST['buy_list'].clear()
time.sleep(0.1)
# 사야 할 시점과 팔아야 할 시점을 체크한다.
bsLine1 = self.buySellChecker.checkTransaction1(self.stock_code, MAX_BUY_PRICE, data, data_signal, BUY_LIST, isRealTime=True)
if 'sell_price' in bsLine1:
sell_price = bsLine1['sell_price'][-1]
sell_count = bsLine1['sell_count'][-1]
sell_type = bsLine1['sell_type'][-1]
if 0 < sell_price:
check = self.sellStocks(stock_code=self.stock_code, bs_sell_price=sell_price)
if check:
self.orderChecker.sell(datetime.today().strftime('%Y%m%d'), self.stock_code)
BUY_LIST['buy_avg'] = 0
BUY_LIST['buy_count'] = 0
BUY_LIST['buy_list'].clear()
self.bot.sendMsg("Profit {:.2f}, {} ({})".format(profit, self.stock_code, self.stock_name))
time.sleep(0.1)
if 'buy_price' in bsLine1:
buy_price = bsLine1['buy_price'][-1]
buy_count = int(bsLine1['buy_count'][-1])
if buy_price > 0:
# 매수를 요청 한다.
orderNum = self.requestOrder(OrderType.buy, self.stock_code, buy_count, buy_price)
self.orderChecker.buy(datetime.today().strftime('%Y%m%d'), "A" + self.stock_code, buy_count, buy_price, orderNum)
self.bot.post(self.stock_code, self.stock_name, "[BUY] ", buy_price, buy_count, data['rsi'][-1], -1)
try:
# 데이터를 가지고 온다.
result_m1 = self.getRealTime(self.stock_code, today, LAST_DATA)
except:
print("#ERROR:", self.stock_code)
continue
result_tic_m1 = self.makeTickData1(result_m1, mins=1)
data = self.analyze(result_tic_m1)
result_tic_m30 = self.makeTickData2(result_tic_m1, mins=30)
data_signal = self.analyze(result_tic_m30)
#data.drop(data.index[:len(data) - analyzed_day], inplace=True)
# 사야 할 시점과 팔아야 할 시점을 체크한다.
bsLine1 = self.buySellChecker.checkTransaction1(self.stock_code, MAX_PRICE, data, data_signal, BUY_LIST, isRealTime=True)
if 'sell_price' in bsLine1:
sell_price = bsLine1['sell_price'][-1]
sell_count = bsLine1['sell_count'][-1]
sell_type = bsLine1['sell_type'][-1]
if 0 < sell_price:
profit_rate = 1.002
if buy_avg * profit_rate < data['close'][-1]:
if sell_type == 'slow_k' and 0 < sell_count:
check = self.sellStocks(self.stock_code, sell_price, sell_count)
if check:
self.orderChecker.sell(datetime.today().strftime('%Y%m%d'), self.stock_code)
BUY_LIST['buy_avg'] = 0
BUY_LIST['buy_count'] = 0
BUY_LIST['buy_list'].clear()
self.bot.sendMsg("Profit {:.2f}, {} ({})".format(profit, self.stock_code, self.stock_name))
else:
check = self.sellStocks(self.stock_code, sell_price)
if check:
self.orderChecker.sell(datetime.today().strftime('%Y%m%d'), self.stock_code)
BUY_LIST['buy_avg'] = 0
BUY_LIST['buy_count'] = 0
BUY_LIST['buy_list'].clear()
self.bot.sendMsg("Profit {:.2f}, {} ({})".format(profit, self.stock_code, self.stock_name))
if 'buy_price' in bsLine1:
buy_price = bsLine1['buy_price'][-1]
buy_count = int(bsLine1['buy_count'][-1])
if buy_price > 0:
# 매수를 요청 한다.
orderNum = self.requestOrder(OrderType.buy, self.stock_code, buy_count, buy_price)
self.orderChecker.buy(today, "A" + self.stock_code, buy_count, buy_price, orderNum)
self.orderChecker.buy(datetime.today().strftime('%Y%m%d'), self.stock_code, buy_count, buy_price)
self.bot.post(self.stock_code, self.stock_name, "[BUY] ", buy_price, buy_count, data['rsi'][-1], -1)
# 미체결 기록을 가져와서 10분 이상 된 매수 주문을 취소 한다.
ORDER_LIST = self.requestOrderList()
orderListToCancel = self.orderChecker.cancel(today, "A" + self.stock_code, ORDER_LIST, mins=3)
if len(orderListToCancel) > 0:
self.cancelOrderList(orderListToCancel)
if (int(THIS_TIME.strftime("%M")) % 50 == 0 or int(THIS_TIME.strftime("%M")) % 20 == 0):
#self.bot.alarm_live(self.stock_code, self.stock_name)
vm = psutil.virtual_memory()
vm_item = dict()
vm_item['free'] = vm.available // (1024 * 1024)
vm_item['idle'] = vm.available / vm.total * 100
self.bot.sendMsg("Alive... {} ({}) avg: {:.2f}, close: {:.2f}, mem: {:.1f}".format(self.stock_code, self.stock_name, buy_avg, data['close'][-1], vm_item['idle']))
time.sleep(60)
THIS_TIME = datetime.now()
# 미체결 기록을 가져와서 10분 이상 된 매수 주문을 취소 한다.
ORDER_LIST = self.requestOrderList()
orderListToCancel = self.orderChecker.cancel(datetime.today().strftime('%Y%m%d'), "A" + self.stock_code, ORDER_LIST, mins=3)
if len(orderListToCancel) > 0:
self.cancelOrderList(orderListToCancel)
return True