init
This commit is contained in:
215
HTS_etf.py
215
HTS_etf.py
@@ -37,11 +37,15 @@ class HTS_etf(HTS):
|
||||
ichimokuCloud = None
|
||||
|
||||
|
||||
def __init__(self, RESOURCE_PATH):
|
||||
def __init__(self, RESOURCE_PATH, stock_code, stock_name, SELL_GAP):
|
||||
super().__init__(RESOURCE_PATH)
|
||||
|
||||
self.RESOURCE_PATH = RESOURCE_PATH
|
||||
|
||||
self.SELL_GAP = SELL_GAP
|
||||
self.stock_code = stock_code
|
||||
self.stock_name = stock_name
|
||||
self.orderChecker = OrderChecker(self.RESOURCE_PATH, self.stock_code)
|
||||
self.bot = TelegramBot()
|
||||
self.stockStatus = StockStatus(RESOURCE_PATH)
|
||||
|
||||
@@ -51,7 +55,7 @@ class HTS_etf(HTS):
|
||||
self.macd = MACD()
|
||||
self.ichimokuCloud = IchimokuCloud()
|
||||
|
||||
self.buySellChecker = BuySellChecker(self.RESOURCE_PATH)
|
||||
self.buySellChecker = BuySellChecker(self.RESOURCE_PATH, self.stock_code)
|
||||
|
||||
return
|
||||
|
||||
@@ -64,7 +68,7 @@ class HTS_etf(HTS):
|
||||
return jangoDic[code]['장부가'], jangoDic[code]['평가금액'], jangoDic[code]['평가손익']
|
||||
return 0, 0, 0
|
||||
|
||||
def sellStocks(self, stock_code=None, stock_name=None, bs_sell_price=None):
|
||||
def sellStocks(self, stock_code=None, stock_name=None, bs_sell_price=None, sell_count=0):
|
||||
check = False
|
||||
jangoDic = self.requstJango()
|
||||
if jangoDic and len(jangoDic.keys()) > 0:
|
||||
@@ -73,62 +77,36 @@ class HTS_etf(HTS):
|
||||
if code == "A" + stock_code:
|
||||
if bs_sell_price is not None:
|
||||
if jangoDic[code]['매도가능'] > 0:
|
||||
#if jangoDic[code]['평가손익'] < -1.0 or jangoDic[code]['장부가'] + 10 <= jangoDic[code]['현재가']:
|
||||
if jangoDic[code]['장부가'] + 10 <= jangoDic[code]['현재가']:
|
||||
if jangoDic[code]['평가손익'] < -0.6 or 1.0 < jangoDic[code]['평가손익'] or self.SELL_GAP < jangoDic[code]['평가금액']-jangoDic[code]['매입금액']:
|
||||
# 1.5% 손해 혹은 2% 이상 시 수익 매도
|
||||
self.requestOrder(OrderType.sell, code[1:], jangoDic[code]['매도가능'], bs_sell_price)
|
||||
if sell_count == 0:
|
||||
self.requestOrder(OrderType.sell, code[1:], jangoDic[code]['매도가능'], bs_sell_price)
|
||||
else:
|
||||
self.requestOrder(OrderType.sell, code[1:], sell_count, bs_sell_price)
|
||||
self.bot.sendMsg("Profit {:.2f}, {} ({})".format(jangoDic[code]['평가손익'], stock_code, stock_name))
|
||||
check = True
|
||||
else:
|
||||
if jangoDic[code]['매도가능'] > 0:
|
||||
#if jangoDic[code]['평가손익'] < -1.0 or jangoDic[code]['장부가'] + 10 <= jangoDic[code]['현재가']:
|
||||
if jangoDic[code]['장부가'] + 10 <= jangoDic[code]['현재가']:
|
||||
if jangoDic[code]['평가손익'] < -0.6 or 1.0 < jangoDic[code]['평가손익'] or self.SELL_GAP < jangoDic[code]['평가금액']-jangoDic[code]['매입금액']:
|
||||
# 1.5% 손해 혹은 2% 이상 시 수익 매도
|
||||
self.requestOrder(OrderType.sell, code[1:], jangoDic[code]['매도가능'], jangoDic[code]['현재가'])
|
||||
if sell_count == 0:
|
||||
self.requestOrder(OrderType.sell, code[1:], jangoDic[code]['매도가능'], jangoDic[code]['현재가'])
|
||||
else:
|
||||
self.requestOrder(OrderType.sell, code[1:], sell_count, jangoDic[code]['현재가'])
|
||||
self.bot.sendMsg("Profit {:.2f}, {} ({})".format(jangoDic[code]['평가손익'], stock_code, stock_name))
|
||||
check = True
|
||||
else:
|
||||
if jangoDic[code]['매도가능'] > 0:
|
||||
#if jangoDic[code]['평가손익'] < -1.0 or jangoDic[code]['장부가'] + 10 <= jangoDic[code]['현재가']:
|
||||
if jangoDic[code]['장부가'] + 10 <= jangoDic[code]['현재가']:
|
||||
if jangoDic[code]['평가손익'] < -0.6 or 1.0 < jangoDic[code]['평가손익'] or self.SELL_GAP < jangoDic[code]['평가금액']-jangoDic[code]['매입금액']:
|
||||
# 1.5% 손해 혹은 2% 이상 시 수익 매도
|
||||
self.requestOrder(OrderType.sell, code[1:], jangoDic[code]['매도가능'], jangoDic[code]['현재가'])
|
||||
if sell_count == 0:
|
||||
self.requestOrder(OrderType.sell, code[1:], jangoDic[code]['매도가능'], jangoDic[code]['현재가'])
|
||||
else:
|
||||
self.requestOrder(OrderType.sell, code[1:], sell_count, jangoDic[code]['현재가'])
|
||||
self.bot.sendMsg("Profit {:.2f}, {} ({})".format(jangoDic[code]['평가손익'], stock_code, stock_name))
|
||||
check = True
|
||||
return check
|
||||
|
||||
"""
|
||||
def sellStocks(self, stock_code=None, stock_name=None, bs_sell_price=None):
|
||||
check = False
|
||||
jangoDic = self.requstJango()
|
||||
if jangoDic and len(jangoDic.keys()) > 0:
|
||||
for code in jangoDic:
|
||||
if stock_code is not None:
|
||||
if code == "A" + stock_code:
|
||||
if bs_sell_price is not None:
|
||||
if jangoDic[code]['매도가능'] > 0:
|
||||
if jangoDic[code]['평가손익'] < -1.0 or 1.5 < jangoDic[code]['평가손익'] or self.SELL_GAP < jangoDic[code]['평가금액']-jangoDic[code]['매입금액']:
|
||||
# 1.5% 손해 혹은 2% 이상 시 수익 매도
|
||||
self.requestOrder(OrderType.sell, code[1:], jangoDic[code]['매도가능'], bs_sell_price)
|
||||
self.bot.sendMsg("Profit {:.2f}, {} ({})".format(jangoDic[code]['평가손익'], stock_code, stock_name))
|
||||
check = True
|
||||
else:
|
||||
if jangoDic[code]['매도가능'] > 0:
|
||||
if jangoDic[code]['평가손익'] < -1.0 or 1.5 < jangoDic[code]['평가손익'] or self.SELL_GAP < jangoDic[code]['평가금액']-jangoDic[code]['매입금액']:
|
||||
# 1.5% 손해 혹은 2% 이상 시 수익 매도
|
||||
self.requestOrder(OrderType.sell, code[1:], jangoDic[code]['매도가능'], jangoDic[code]['현재가'])
|
||||
self.bot.sendMsg("Profit {:.2f}, {} ({})".format(jangoDic[code]['평가손익'], stock_code, stock_name))
|
||||
check = True
|
||||
else:
|
||||
if jangoDic[code]['매도가능'] > 0:
|
||||
if jangoDic[code]['평가손익'] < -1.0 or 1.5 < jangoDic[code]['평가손익'] or self.SELL_GAP < jangoDic[code]['평가금액']-jangoDic[code]['매입금액']:
|
||||
# 1.5% 손해 혹은 2% 이상 시 수익 매도
|
||||
self.requestOrder(OrderType.sell, code[1:], jangoDic[code]['매도가능'], jangoDic[code]['현재가'])
|
||||
self.bot.sendMsg("Profit {:.2f}, {} ({})".format(jangoDic[code]['평가손익'], stock_code, stock_name))
|
||||
check = True
|
||||
return check
|
||||
"""
|
||||
|
||||
def getSellingPrice(self, log_time, stock_code, final_price, without_loss=False):
|
||||
# final_price와 diff를 받으면, 해당 가격으로 그냥 매도한다는 의미
|
||||
# final_price와 diff가 None이면 장부가와 final 중 max로 팔겠다는 의미
|
||||
@@ -411,101 +389,98 @@ class HTS_etf(HTS):
|
||||
|
||||
return result
|
||||
|
||||
def buyRealTime(self, stocks, today, MAX_PRICE=30000):
|
||||
#self.orderChecker = OrderChecker(self.RESOURCE_PATH, stock_code)
|
||||
|
||||
BUY_LIST = {
|
||||
'122630': {'buy_count': 0, 'buy_avg': 0, 'buy_list': []},
|
||||
'233740': {'buy_count': 0, 'buy_avg': 0, 'buy_list': []},
|
||||
'251340': {'buy_count': 0, 'buy_avg': 0, 'buy_list': []},
|
||||
'252670': {'buy_count': 0, 'buy_avg': 0, 'buy_list': []}
|
||||
}
|
||||
def buyRealTime(self, today, MAX_PRICE=30000):
|
||||
BUY_LIST = {'buy_count': 0, 'buy_avg': 0, 'buy_list': []}
|
||||
|
||||
print("START...")
|
||||
THIS_TIME = datetime.now()
|
||||
|
||||
#LAST_DATA = self.getLastData(stock_code, today)
|
||||
isFirst = 0
|
||||
LAST_DATA = self.getLastData(self.stock_code, today)
|
||||
|
||||
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))
|
||||
|
||||
if datetime.strptime(today + " 090100", '%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'):
|
||||
|
||||
for stock in stocks:
|
||||
stock_code = stock['stock_code']
|
||||
stock_name = stock['stock_name']
|
||||
# 매도를 체크한다.
|
||||
check = self.sellStocks(self.stock_code, self.stock_name)
|
||||
|
||||
# 매도를 체크한다.
|
||||
check = self.sellStocks(stock_code, stock_name)
|
||||
# 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()
|
||||
|
||||
# jangoDic[code]['장부가'], jangoDic[code]['평가금액'], jangoDic[code]['평가손익'],
|
||||
buy_avg, amount, profit = self.getBallance(stock_code)
|
||||
if check or buy_avg == 0:
|
||||
BUY_LIST[stock_code]['buy_avg'] = 0
|
||||
BUY_LIST[stock_code]['buy_count'] = 0
|
||||
BUY_LIST[stock_code]['buy_list'].clear()
|
||||
time.sleep(0.1)
|
||||
|
||||
if isFirst < 4:
|
||||
if 0 < buy_avg:
|
||||
BUY_LIST[stock_code]['buy_avg'] = buy_avg
|
||||
if BUY_LIST is not None and len(BUY_LIST[stock_code]['buy_list']) == 0:
|
||||
BUY_LIST[stock_code]['buy_list'].append({'buy_ymd': datetime.now(), 'buy_price': buy_avg, 'buy_count': 0, 'buy_cut': 0, 'buy_type': ''})
|
||||
try:
|
||||
# 데이터를 가지고 온다.
|
||||
result_m1 = self.getRealTime(self.stock_code, today, LAST_DATA)
|
||||
except:
|
||||
print("#ERROR:", self.stock_code)
|
||||
continue
|
||||
|
||||
self.bot.sendMsg("START... {} ({}) MAX_PRICE: {}".format(stock_code, stock_name, MAX_PRICE))
|
||||
isFirst += 1
|
||||
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)
|
||||
|
||||
time.sleep(0.1)
|
||||
#data.drop(data.index[:len(data) - analyzed_day], inplace=True)
|
||||
|
||||
#result_m1 = self.getRealTime(stock_code, today, LAST_DATA)
|
||||
result_m1 =self.getRealTime(stock_code, today)
|
||||
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)
|
||||
|
||||
# 사야 할 시점과 팔아야 할 시점을 체크한다.
|
||||
bsLine1 = self.buySellChecker.checkTransaction1(stock_code, MAX_PRICE, data, data_signal, BUY_LIST[stock_code], isRealTime=True)
|
||||
|
||||
if 'sell_price' in bsLine1:
|
||||
sell_price = bsLine1['sell_price'][-1]
|
||||
if 0 < sell_price:
|
||||
profit_rate = 1.002
|
||||
if buy_avg * profit_rate < data['close'][-1]:
|
||||
check = self.sellStocks(stock_code, sell_price)
|
||||
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'), stock_code)
|
||||
BUY_LIST[stock_code]['buy_avg'] = 0
|
||||
BUY_LIST[stock_code]['buy_count'] = 0
|
||||
BUY_LIST[stock_code]['buy_list'].clear()
|
||||
self.bot.sendMsg( "[SELL] Profit {:.2f}, {} ({})".format(profit, stock_code, stock_name))
|
||||
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, stock_code, buy_count, buy_price)
|
||||
#self.orderChecker.buy(today, "A" + stock_code, buy_count, buy_price, orderNum)
|
||||
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'), stock_code, buy_count, buy_price)
|
||||
self.bot.post(stock_code, stock_name, "[BUY] ", buy_price, buy_count, data['rsi'][-1], -1)
|
||||
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)
|
||||
|
||||
|
||||
"""
|
||||
# 미체결 기록을 가져와서 10분 이상 된 매수 주문을 취소 한다.
|
||||
ORDER_LIST = self.requestOrderList()
|
||||
orderListToCancel = self.orderChecker.cancel(today, "A" + stock_code, ORDER_LIST, mins=3)
|
||||
if len(orderListToCancel) > 0:
|
||||
self.cancelOrderList(orderListToCancel)
|
||||
"""
|
||||
|
||||
if ((int(THIS_TIME.strftime("%M")) == 4) and 0 <= int(THIS_TIME.strftime("%S")) <= 59):
|
||||
#self.bot.alarm_live(stock_code, 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(stock_code, stock_name, buy_avg, data['close'][-1], vm_item['idle']))
|
||||
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()
|
||||
|
||||
Reference in New Issue
Block a user