This commit is contained in:
dsyoon
2023-10-26 23:03:30 +09:00
parent 9d8f174ec6
commit 1489508d8e
13 changed files with 181 additions and 96 deletions

View File

@@ -2,13 +2,13 @@ import time
import requests import requests
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from datetime import datetime from datetime import datetime
from stock.util.SlackBot import SlackBot from stock.util.TelegramBot import TelegramBot
class HTS_Alert : class HTS_Alert :
slackBot = None bot = None
def __init__(self): def __init__(self):
self.slackBot = SlackBot() self.bot = TelegramBot()
return return
def checkPrice(self, code): def checkPrice(self, code):
@@ -29,7 +29,7 @@ class HTS_Alert :
c_price = int(arr[1].replace(',', '')) c_price = int(arr[1].replace(',', ''))
if c_price < CHECK_PRICE[code_index]: if c_price < CHECK_PRICE[code_index]:
self.slackBot.sendMsg(code + " " + str(CHECK_PRICE[code_index]) + " " + PERCENT[code_index] + "를 파세요...") self.bot.sendMsg(code + " " + str(CHECK_PRICE[code_index]) + " " + PERCENT[code_index] + "를 파세요...")
code_index += 1 code_index += 1
if code_index > len(CHECK_PRICE): if code_index > len(CHECK_PRICE):

View File

@@ -9,7 +9,7 @@ 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.util.TelegramBot import TelegramBot
from stock.analysis.StockStatus import StockStatus from stock.analysis.StockStatus import StockStatus
@@ -22,7 +22,7 @@ class HTS_etf(HTS):
orderChecker = None orderChecker = None
buySellChecker = None buySellChecker = None
labelChecker = None labelChecker = None
slackBot = None bot = None
stockStatus = None stockStatus = None
def __init__(self, RESOURCE_PATH, stock_code, stock_name, SELL_GAP): def __init__(self, RESOURCE_PATH, stock_code, stock_name, SELL_GAP):
@@ -36,7 +36,7 @@ class HTS_etf(HTS):
self.orderChecker = OrderChecker(self.RESOURCE_PATH, self.stock_code) self.orderChecker = OrderChecker(self.RESOURCE_PATH, self.stock_code)
self.buySellChecker = BuySellChecker() self.buySellChecker = BuySellChecker()
self.labelChecker = LabelChecker(RESOURCE_PATH) self.labelChecker = LabelChecker(RESOURCE_PATH)
self.slackBot = SlackBot() self.bot = TelegramBot()
self.stockStatus = StockStatus(RESOURCE_PATH) self.stockStatus = StockStatus(RESOURCE_PATH)
return return
@@ -132,7 +132,7 @@ class HTS_etf(HTS):
def buyRealTime(self, today, analyzed_day=1000, MAX_PRICE=10000, logFp=None): def buyRealTime(self, today, analyzed_day=1000, MAX_PRICE=10000, logFp=None):
rsi = self.getTodayRSI() rsi = self.getTodayRSI()
if rsi > 79: if rsi > 79:
self.slackBot.sendMsg("exit... {} ({}) RSI: {}".format(self.stock_code, self.stock_name, rsi)) self.bot.sendMsg("exit... {} ({}) RSI: {}".format(self.stock_code, self.stock_name, rsi))
return return
print("START...") print("START...")
@@ -142,9 +142,9 @@ class HTS_etf(HTS):
while datetime.strptime(today + " 063000", '%Y%m%d %H%M%S') < THIS_TIME < datetime.strptime(today + " 153100",'%Y%m%d %H%M%S'): while datetime.strptime(today + " 063000", '%Y%m%d %H%M%S') < THIS_TIME < datetime.strptime(today + " 153100",'%Y%m%d %H%M%S'):
if THIS_TIME < datetime.strptime(today + " 085500", '%Y%m%d %H%M%S'): if THIS_TIME < datetime.strptime(today + " 085500", '%Y%m%d %H%M%S'):
self.slackBot.sendMsg("WAIT... {} ({}) RSI: {}".format(self.stock_code, self.stock_name, rsi)) self.bot.sendMsg("WAIT... {} ({}) RSI: {}".format(self.stock_code, self.stock_name, rsi))
if datetime.strptime(today + " 090000", '%Y%m%d %H%M%S') < THIS_TIME < datetime.strptime(today + " 090100", '%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.slackBot.sendMsg("START... {} ({}) RSI: {}".format(self.stock_code, self.stock_name, rsi)) self.bot.sendMsg("START... {} ({}) RSI: {}".format(self.stock_code, self.stock_name, rsi))
logFp.write("START {} ({}) RSI: {}\n".format(self.stock_code, self.stock_name, rsi)) logFp.write("START {} ({}) RSI: {}\n".format(self.stock_code, self.stock_name, rsi))
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'):
@@ -205,7 +205,7 @@ class HTS_etf(HTS):
(str(THIS_TIME), self.stock_code, bs_buy_price, bs_sell_price, data["open"][len(data["open"])-1], data["close"][len(data["close"])-1], data["high"][len(data["high"])-1], data["low"][len(data["low"])-1], data["macd"][len(data["macd"])-1])) (str(THIS_TIME), self.stock_code, bs_buy_price, bs_sell_price, data["open"][len(data["open"])-1], data["close"][len(data["close"])-1], data["high"][len(data["high"])-1], data["low"][len(data["low"])-1], data["macd"][len(data["macd"])-1]))
if (int(THIS_TIME.strftime("%M")) % 50 == 0 or int(THIS_TIME.strftime("%M")) % 20 == 0): if (int(THIS_TIME.strftime("%M")) % 50 == 0 or int(THIS_TIME.strftime("%M")) % 20 == 0):
self.slackBot.post_live_to_slack(self.stock_code, self.stock_name, data["close"][len(data["close"])-1], data["macd"][len(data["macd"])-1]) self.bot.alarm_live(self.stock_code, self.stock_name, data["close"][len(data["close"])-1], data["macd"][len(data["macd"])-1])
logFp.flush() logFp.flush()
time.sleep(60) time.sleep(60)

View File

@@ -27,5 +27,5 @@ if __name__ == "__main__":
hts.insertStockData(today, stock_code, stock_name) hts.insertStockData(today, stock_code, stock_name)
hts.disconnect() hts.disconnect()
hts.slackBot.sendMsg("done... {} ({})".format(stock_code, stock_name)) hts.bot.sendMsg("done... {} ({})".format(stock_code, stock_name))
print("done...") print("done...")

View File

@@ -27,5 +27,5 @@ if __name__ == "__main__":
hts.insertStockData(today, stock_code, stock_name) hts.insertStockData(today, stock_code, stock_name)
hts.disconnect() hts.disconnect()
hts.slackBot.sendMsg("done... {} ({})".format(stock_code, stock_name)) hts.bot.sendMsg("done... {} ({})".format(stock_code, stock_name))
print("done...") print("done...")

View File

@@ -27,5 +27,5 @@ if __name__ == "__main__":
hts.insertStockData(today, stock_code, stock_name) hts.insertStockData(today, stock_code, stock_name)
hts.disconnect() hts.disconnect()
hts.slackBot.sendMsg("done... {} ({})".format(stock_code, stock_name)) hts.bot.sendMsg("done... {} ({})".format(stock_code, stock_name))
print("done...") print("done...")

View File

@@ -27,5 +27,5 @@ if __name__ == "__main__":
hts.insertStockData(today, stock_code, stock_name) hts.insertStockData(today, stock_code, stock_name)
hts.disconnect() hts.disconnect()
hts.slackBot.sendMsg("done... {} ({})".format(stock_code, stock_name)) hts.bot.sendMsg("done... {} ({})".format(stock_code, stock_name))
print("done...") print("done...")

View File

@@ -10,7 +10,7 @@ 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.util.TelegramBot import TelegramBot
from stock.analysis.StockStatus import StockStatus from stock.analysis.StockStatus import StockStatus
class HTS_etf (HTS): class HTS_etf (HTS):
@@ -21,7 +21,7 @@ class HTS_etf (HTS):
orderChecker = None orderChecker = None
buySellChecker = None buySellChecker = None
labelChecker = None labelChecker = None
slackBot = None bot = None
stockStatus = None stockStatus = None
def __init__(self, RESOURCE_PATH): def __init__(self, RESOURCE_PATH):
@@ -32,7 +32,7 @@ class HTS_etf (HTS):
self.orderChecker = OrderChecker(self.RESOURCE_PATH, "ETF") self.orderChecker = OrderChecker(self.RESOURCE_PATH, "ETF")
self.buySellChecker = BuySellChecker() self.buySellChecker = BuySellChecker()
self.labelChecker = LabelChecker(RESOURCE_PATH) self.labelChecker = LabelChecker(RESOURCE_PATH)
self.slackBot = SlackBot() self.bot = TelegramBot()
self.stockStatus = StockStatus(RESOURCE_PATH) self.stockStatus = StockStatus(RESOURCE_PATH)
return return
@@ -60,7 +60,7 @@ class HTS_etf (HTS):
if jangoDic[code]['매도가능'] > 0: if jangoDic[code]['매도가능'] > 0:
if 2 < jangoDic[code]['평가손익']: if 2 < jangoDic[code]['평가손익']:
self.requestOrder(OrderType.sell, code[1:], jangoDic[code]['매도가능'], bs_sell_price) self.requestOrder(OrderType.sell, code[1:], jangoDic[code]['매도가능'], bs_sell_price)
self.slackBot.post_to_slack(code, jangoDic[code]['종목명'], "SELL", bs_sell_price, jangoDic[code]['매도가능']) self.bot.post(code, jangoDic[code]['종목명'], "SELL", bs_sell_price, jangoDic[code]['매도가능'])
check = True check = True
else: else:
continue continue
@@ -70,7 +70,7 @@ class HTS_etf (HTS):
# 3% 이상 시 수익 매도 # 3% 이상 시 수익 매도
currentStock = self.currentStock(code[1:]) currentStock = self.currentStock(code[1:])
self.requestOrder(OrderType.sell, code[1:], jangoDic[code]['매도가능'], currentStock['close']) self.requestOrder(OrderType.sell, code[1:], jangoDic[code]['매도가능'], currentStock['close'])
self.slackBot.post_to_slack(code, jangoDic[code]['종목명'], "SELL", currentStock['close'], jangoDic[code]['매도가능']) self.bot.post(code, jangoDic[code]['종목명'], "SELL", currentStock['close'], jangoDic[code]['매도가능'])
check = True check = True
return check return check
@@ -281,8 +281,8 @@ class HTS_etf (HTS):
orderNum = self.requestOrder(OrderType.buy, stock['stock_code'], buy_count , bs_buy_price) orderNum = self.requestOrder(OrderType.buy, stock['stock_code'], buy_count , bs_buy_price)
self.orderChecker.buy(today, "A" + stock['stock_code'], buy_count, bs_buy_price, orderNum) self.orderChecker.buy(today, "A" + stock['stock_code'], buy_count, bs_buy_price, orderNum)
# slackbot에 메시지를 보냄 # bot에 메시지를 보냄
self.slackBot.post_to_slack(stock['stock_code'], stock['stock_name'], "BUY", bs_buy_price, buy_count) self.bot.post(stock['stock_code'], stock['stock_name'], "BUY", bs_buy_price, buy_count)
# 로그 출력 # 로그 출력
print("BUY", THIS_TIME.strftime('%Y%m%d %H%M%S'), orderNum, stock['stock_code'], stock['stock_name'], bs_buy_price, buy_count) print("BUY", THIS_TIME.strftime('%Y%m%d %H%M%S'), orderNum, stock['stock_code'], stock['stock_name'], bs_buy_price, buy_count)

View File

@@ -10,7 +10,7 @@ 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.util.TelegramBot import TelegramBot
from stock.analysis.StockStatus import StockStatus from stock.analysis.StockStatus import StockStatus
class HTS_etf (HTS): class HTS_etf (HTS):
@@ -21,7 +21,7 @@ class HTS_etf (HTS):
orderChecker = None orderChecker = None
buySellChecker = None buySellChecker = None
labelChecker = None labelChecker = None
slackBot = None bot = None
stockStatus = None stockStatus = None
def __init__(self, RESOURCE_PATH): def __init__(self, RESOURCE_PATH):
@@ -32,7 +32,7 @@ class HTS_etf (HTS):
self.orderChecker = OrderChecker(self.RESOURCE_PATH, "ETF") self.orderChecker = OrderChecker(self.RESOURCE_PATH, "ETF")
self.buySellChecker = BuySellChecker() self.buySellChecker = BuySellChecker()
self.labelChecker = LabelChecker(RESOURCE_PATH) self.labelChecker = LabelChecker(RESOURCE_PATH)
self.slackBot = SlackBot() self.bot = TelegramBot()
self.stockStatus = StockStatus(RESOURCE_PATH) self.stockStatus = StockStatus(RESOURCE_PATH)
return return
@@ -60,7 +60,7 @@ class HTS_etf (HTS):
if jangoDic[code]['매도가능'] > 0: if jangoDic[code]['매도가능'] > 0:
if 2 < jangoDic[code]['평가손익']: if 2 < jangoDic[code]['평가손익']:
self.requestOrder(OrderType.sell, code[1:], jangoDic[code]['매도가능'], bs_sell_price) self.requestOrder(OrderType.sell, code[1:], jangoDic[code]['매도가능'], bs_sell_price)
self.slackBot.post_to_slack(code, jangoDic[code]['종목명'], "SELL", bs_sell_price, jangoDic[code]['매도가능']) self.bot.post(code, jangoDic[code]['종목명'], "SELL", bs_sell_price, jangoDic[code]['매도가능'])
check = True check = True
else: else:
continue continue
@@ -70,7 +70,7 @@ class HTS_etf (HTS):
# 3% 이상 시 수익 매도 # 3% 이상 시 수익 매도
currentStock = self.currentStock(code[1:]) currentStock = self.currentStock(code[1:])
self.requestOrder(OrderType.sell, code[1:], jangoDic[code]['매도가능'], currentStock['close']) self.requestOrder(OrderType.sell, code[1:], jangoDic[code]['매도가능'], currentStock['close'])
self.slackBot.post_to_slack(code, jangoDic[code]['종목명'], "SELL", currentStock['close'], jangoDic[code]['매도가능']) self.bot.post(code, jangoDic[code]['종목명'], "SELL", currentStock['close'], jangoDic[code]['매도가능'])
check = True check = True
return check return check
@@ -283,8 +283,8 @@ class HTS_etf (HTS):
orderNum = self.requestOrder(OrderType.buy, stock['stock_code'], buy_count , bs_buy_price) orderNum = self.requestOrder(OrderType.buy, stock['stock_code'], buy_count , bs_buy_price)
self.orderChecker.buy(today, "A" + stock['stock_code'], buy_count, bs_buy_price, orderNum) self.orderChecker.buy(today, "A" + stock['stock_code'], buy_count, bs_buy_price, orderNum)
# slackbot에 메시지를 보냄 # bot에 메시지를 보냄
self.slackBot.post_to_slack(stock['stock_code'], stock['stock_name'], "BUY", bs_buy_price, buy_count) self.bot.post(stock['stock_code'], stock['stock_name'], "BUY", bs_buy_price, buy_count)
# 로그 출력 # 로그 출력
print("BUY", THIS_TIME.strftime('%Y%m%d %H%M%S'), orderNum, stock['stock_code'], stock['stock_name'], bs_buy_price, buy_count) print("BUY", THIS_TIME.strftime('%Y%m%d %H%M%S'), orderNum, stock['stock_code'], stock['stock_name'], bs_buy_price, buy_count)

View File

@@ -10,7 +10,7 @@ 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.SlackBot import SlackBot from stock.util.TelegramBot import TelegramBot
from stock.analysis.StockStatus import StockStatus from stock.analysis.StockStatus import StockStatus
class HTS_Stocks (HTS): class HTS_Stocks (HTS):
@@ -19,7 +19,7 @@ class HTS_Stocks (HTS):
orderChecker = None orderChecker = None
buySellChecker = None buySellChecker = None
labelChecker = None labelChecker = None
slackBot = None bot = None
stockStatus = None stockStatus = None
analyzed_day = None analyzed_day = None
MAX_BUY_PRICE = None MAX_BUY_PRICE = None
@@ -29,7 +29,7 @@ class HTS_Stocks (HTS):
def __init__(self, RESOURCE_PATH): def __init__(self, RESOURCE_PATH):
super().__init__(RESOURCE_PATH) super().__init__(RESOURCE_PATH)
self.slackBot = SlackBot() self.bot = TelegramBot()
self.RESOURCE_PATH = RESOURCE_PATH self.RESOURCE_PATH = RESOURCE_PATH
self.stockStatus = StockStatus(RESOURCE_PATH) self.stockStatus = StockStatus(RESOURCE_PATH)
@@ -128,8 +128,8 @@ class HTS_Stocks (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.buy(today, "A" + stock_code, buy_count, bs_buy_price, orderNum) self.orderChecker.buy(today, "A" + stock_code, buy_count, bs_buy_price, orderNum)
# slackbot에 메시지를 보냄 # bot에 메시지를 보냄
self.slackBot.post_to_slack(stock_code, stock_name, "BUY", bs_buy_price, buy_count) self.bot.post(stock_code, stock_name, "BUY", 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) print("BUY", THIS_TIME.strftime('%Y%m%d %H%M%S'), orderNum, stock_code, stock_name, bs_buy_price, buy_count)

View File

@@ -11,7 +11,7 @@ from stock.crawler.MetaCrawler import MetaCrawler
from stock.crawler.StockCrawler import StockCrawler from stock.crawler.StockCrawler import StockCrawler
from stock.analysis.AnalyzerSqlite import AnalyzerSqlite from stock.analysis.AnalyzerSqlite import AnalyzerSqlite
from stock.analysis.StockStatus import StockStatus from stock.analysis.StockStatus import StockStatus
from stock.util.SlackBot import SlackBot from stock.util.TelegramBot import TelegramBot
today = datetime.now().strftime("%Y-%m-%d") today = datetime.now().strftime("%Y-%m-%d")
@@ -30,11 +30,11 @@ stockFileName = os.path.join(RESOURCE_PATH, 'stock.db')
week = datetime.today().weekday() week = datetime.today().weekday()
slackBot = SlackBot() bot = TelegramBot()
if week in (0, 1, 2, 3, 4): # 0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일 if week in (0, 1, 2, 3, 4): # 0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일
slackBot.sendMsg("1. start to crawl...") bot.sendMsg("1. start to crawl...")
@@ -63,7 +63,7 @@ if week in (0, 1, 2, 3, 4): # 0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일
try: try:
print("\n[증시자금동향 (신용잔고, 펀드자금 잔고)]") print("\n[증시자금동향 (신용잔고, 펀드자금 잔고)]")
metaCrawler.crawl_money_trend(stockFileName) metaCrawler.crawl_money_trend(stockFileName)
slackBot.sendMsg("2. done meta data...") bot.sendMsg("2. done meta data...")
break break
except: except:
ERROR_COUNT += 1 ERROR_COUNT += 1
@@ -78,7 +78,7 @@ if week in (0, 1, 2, 3, 4): # 0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일
try: try:
print("\n[국내 시장금리]") print("\n[국내 시장금리]")
metaCrawler.crawl_interest_rates(stockFileName) metaCrawler.crawl_interest_rates(stockFileName)
slackBot.sendMsg("3. done interest rates...") bot.sendMsg("3. done interest rates...")
break break
except: except:
ERROR_COUNT += 1 ERROR_COUNT += 1
@@ -93,7 +93,7 @@ if week in (0, 1, 2, 3, 4): # 0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일
try: try:
print("\n[투자자별 매매동향(Trading_Trend)]") print("\n[투자자별 매매동향(Trading_Trend)]")
metaCrawler.crawl_trading_trend(stockFileName) metaCrawler.crawl_trading_trend(stockFileName)
slackBot.sendMsg("4. done trade trend...") bot.sendMsg("4. done trade trend...")
break break
except: except:
ERROR_COUNT += 1 ERROR_COUNT += 1
@@ -108,7 +108,7 @@ if week in (0, 1, 2, 3, 4): # 0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일
try: try:
print("\n[환율 (USD, JPY, EUR, CNY, HKD, GBP, CAD, CHF, AUD, THB, INR, PHP, BRL, VND, RUB, TWD')]") print("\n[환율 (USD, JPY, EUR, CNY, HKD, GBP, CAD, CHF, AUD, THB, INR, PHP, BRL, VND, RUB, TWD')]")
metaCrawler.crawl_exchange(stockFileName) metaCrawler.crawl_exchange(stockFileName)
slackBot.sendMsg("5. done exchange data...") bot.sendMsg("5. done exchange data...")
break break
except: except:
ERROR_COUNT += 1 ERROR_COUNT += 1
@@ -123,7 +123,7 @@ if week in (0, 1, 2, 3, 4): # 0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일
try: try:
print("\n[원유 (WTI), 국제금, COPPER, NATURALGAS, CORN, SOYBEAN 등]") print("\n[원유 (WTI), 국제금, COPPER, NATURALGAS, CORN, SOYBEAN 등]")
metaCrawler.crawl_meterials(stockFileName) metaCrawler.crawl_meterials(stockFileName)
slackBot.sendMsg("6. done additional data...") bot.sendMsg("6. done additional data...")
break break
except: except:
ERROR_COUNT += 1 ERROR_COUNT += 1
@@ -140,19 +140,19 @@ if week in (0, 1, 2, 3, 4): # 0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일
print("\n[국내 ETF 수집]") print("\n[국내 ETF 수집]")
stockCrawler.crawl_etf_stocks(stockFileName) stockCrawler.crawl_etf_stocks(stockFileName)
slackBot.sendMsg("7. done etf stocks...") bot.sendMsg("7. done etf stocks...")
print("\n[국내 종목 수집]") print("\n[국내 종목 수집]")
stockCrawler.crawl_stocks(stockFileName) stockCrawler.crawl_stocks(stockFileName)
slackBot.sendMsg("8. done stocks...") bot.sendMsg("8. done stocks...")
print("\n[US 종목 수집]") print("\n[US 종목 수집]")
stockCrawler.crawl_special_stocks(stockFileName) stockCrawler.crawl_special_stocks(stockFileName)
slackBot.sendMsg("9. done US stocks...") bot.sendMsg("9. done US stocks...")
@@ -164,7 +164,7 @@ if week in (0, 1, 2, 3, 4): # 0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일
analyzerSqlite.analyzeDaily() analyzerSqlite.analyzeDaily()
analyzerSqlite.analyzeGrouping("weekly") analyzerSqlite.analyzeGrouping("weekly")
analyzerSqlite.analyzeGrouping("monthly") analyzerSqlite.analyzeGrouping("monthly")
slackBot.sendMsg("10. analyze...") bot.sendMsg("10. analyze...")
@@ -186,11 +186,7 @@ if week in (0, 1, 2, 3, 4): # 0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일
os.mkdir(outPath) os.mkdir(outPath)
analyzerSqlite.findCandidates(outPath) analyzerSqlite.findCandidates(outPath)
slackBot.sendMsg("11. done decision...") bot.sendMsg("11. done decision...")
print("time : %6.2f", (time.time() - start)) print("time : %6.2f", (time.time() - start))

View File

@@ -8,7 +8,7 @@ import time
import sqlite3 import sqlite3
from datetime import datetime, timedelta from datetime import datetime, timedelta
from hts.OrderItem import OrderItem from hts.OrderItem import OrderItem
from stock.util.SlackBot import SlackBot from stock.util.TelegramBot import TelegramBot
class HTS: class HTS:
@@ -21,7 +21,7 @@ class HTS:
def __init__(self, RESOURCE_PATH): def __init__(self, RESOURCE_PATH):
self.RESOURCE_PATH = RESOURCE_PATH self.RESOURCE_PATH = RESOURCE_PATH
self.slackBot = SlackBot() self.bot = TelegramBot()
self.connect2DB(os.path.join( RESOURCE_PATH, "hts.db")) self.connect2DB(os.path.join( RESOURCE_PATH, "hts.db"))
return return
@@ -164,14 +164,14 @@ class HTS:
objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos") objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
bConnect = objCpCybos.IsConnect bConnect = objCpCybos.IsConnect
if (bConnect == 0): if (bConnect == 0):
self.slackBot.sendMsg("PLUS가 정상적으로 연결되지 않음. ") self.bot.sendMsg("PLUS가 정상적으로 연결되지 않음. ")
print("PLUS가 정상적으로 연결되지 않음. ") print("PLUS가 정상적으로 연결되지 않음. ")
exit() exit()
objTrade = win32com.client.Dispatch("CpTrade.CpTdUtil") objTrade = win32com.client.Dispatch("CpTrade.CpTdUtil")
initCheck = objTrade.TradeInit(0) initCheck = objTrade.TradeInit(0)
if (initCheck != 0): if (initCheck != 0):
self.slackBot.sendMsg("주문 초기화 실패") self.bot.sendMsg("주문 초기화 실패")
print("주문 초기화 실패") print("주문 초기화 실패")
exit() exit()
@@ -203,16 +203,16 @@ class HTS:
rqRet = objStockOrder.GetDibMsg1() rqRet = objStockOrder.GetDibMsg1()
print("통신상태", rqStatus, rqRet) print("통신상태", rqStatus, rqRet)
if rqStatus != 0: if rqStatus != 0:
self.slackBot.sendMsg("통신상태: "+ str(rqStatus)+" ("+str(rqRet)+")") self.bot.sendMsg("통신상태: "+ str(rqStatus)+" ("+str(rqRet)+")")
return None return None
orderNum = objStockOrder.GetHeaderValue(0) orderNum = objStockOrder.GetHeaderValue(0)
if (type == "1"): if (type == "1"):
self.slackBot.post_to_slack(stock_code, stock_code, "SELL", price, count) self.bot.post(stock_code, stock_code, "SELL", price, count)
print ("(SELL", count, price, ")") print ("(SELL", count, price, ")")
else: else:
self.slackBot.post_to_slack(stock_code, stock_code, "BUY", price, count) self.bot.post_to_slack(stock_code, stock_code, "BUY", price, count)
print ("(BUY", count, price, ")") print ("(BUY", count, price, ")")
return orderNum return orderNum

View File

@@ -1,70 +1,80 @@
from slack_sdk import WebClient from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError from slack_sdk.errors import SlackApiError
from datetime import datetime from datetime import datetime
from slack_cleaner2 import *
class SlackBot: class SlackBot:
enable = None
BOT_TOKEN = None BOT_TOKEN = None
CHANNEL_ID = None CHANNEL_ID = None
client = None client = None
def __init__(self): def __init__(self, enable=True):
# family # family
# self.BOT_TOKEN = "xoxb-1214605084611-4694289701799-1lCW10baLrihe60DvW1oZ32V" # self.BOT_TOKEN = "xoxb-1214605084611-4694289701799-1lCW10baLrihe60DvW1oZ32V"
# self.CHANNEL_ID = "C021KN0GG94" # self.CHANNEL_ID = "C021KN0GG94"
# ncue # ncue
self.BOT_TOKEN = "xoxb-305350122625-5129491733572-JsBui5wmj7bBoSibRvtz1trj" #self.BOT_TOKEN = "xoxb-305350122625-5129491733572-JsBui5wmj7bBoSibRvtz1trj"
self.CHANNEL_ID = "C03TNCAHQHE" #self.CHANNEL_ID = "C062UAHQWLC"
#self.client = WebClient(token=self.BOT_TOKEN)
# ncue
self.BOT_TOKEN = "xoxp-305350122625-305798290339-6093851456290-295074ffaa9688dbe97d008bc53bbe11"
self.CHANNEL_ID = "C062UAHQWLC"
self.client = WebClient(token=self.BOT_TOKEN) self.client = WebClient(token=self.BOT_TOKEN)
self.enable = enable
return return
def post_live_to_slack(self, stock_code, stock_name, close, macd): def alarm_live(self, stock_code, stock_name):
try: if self.enable:
this_time = datetime.now() try:
text = "ALIVE ({}, {}, {}, close: {}, macd: {:.2f}".format(this_time.strftime('%Y-%m-%d %H:%M:%S'), stock_code, stock_name, close, macd) this_time = datetime.now()
result = self.client.chat_postMessage( text = "ALIVE (" + this_time.strftime('%Y-%m-%d %H:%M:%S') + ") " + stock_code + "(" + stock_name +")"
channel=self.CHANNEL_ID, result = self.client.chat_postMessage(
text=text channel=self.CHANNEL_ID,
) text=text
)
print(text)
except SlackApiError as e: except SlackApiError as e:
print(f"Error posting message: {e}") print(f"Error posting message: {e}")
return return
def post_to_slack(self, stock_code, stock_name, type, price, count): def post(self, stock_code, stock_name, type, price, count):
try: if self.enable:
this_time = datetime.now() try:
text = "DATE TIME:" + this_time.strftime('%Y-%m-%d %H:%M:%S') + ", " + "stock_code:" + stock_code + ", " + "stock_name:" + stock_name + ", " + "type:" + type + ", " + "price:" + str(price) + ", " + "count:" + str(count) this_time = datetime.now()
result = self.client.chat_postMessage( text = "DATE TIME:" + this_time.strftime('%Y-%m-%d %H:%M:%S') + ", " + "stock_code:" + stock_code + ", " + "stock_name:" + stock_name + ", " + "type:" + type + ", " + "price:" + str(price) + ", " + "count:" + str(count)
channel=self.CHANNEL_ID, result = self.client.chat_postMessage(
text=text channel=self.CHANNEL_ID,
) text=text
print(text) )
print(text)
except SlackApiError as e: except SlackApiError as e:
print(f"Error posting message: {e}") print(f"Error posting message: {e}")
return return
def sendMsg(self, msg): def sendMsg(self, msg):
try: if self.enable:
this_time = datetime.now() try:
text = "DATE TIME:" + this_time.strftime('%Y-%m-%d %H:%M:%S') + ", " + "msg:" + msg this_time = datetime.now()
result = self.client.chat_postMessage( text = "DATE TIME:" + this_time.strftime('%Y-%m-%d %H:%M:%S') + ", " + "msg:" + msg
channel=self.CHANNEL_ID, result = self.client.chat_postMessage(
text=text channel=self.CHANNEL_ID,
) text=text
print(text) )
print(text)
except SlackApiError as e: except SlackApiError as e:
print(f"Error posting message: {e}") print(f"Error posting message: {e}")
return return
if __name__ == "__main__": if __name__ == "__main__":
this_time = datetime.now() this_time = datetime.now()
stock_code = "252670" stock_code = "252670"
@@ -73,5 +83,7 @@ if __name__ == "__main__":
price = 2000 price = 2000
count = 2 count = 2
slackBot = SlackBot() slackBot = SlackBot(False)
slackBot.post_to_slack(stock_code, stock_name, type, price, count) slackBot.post(stock_code, stock_name, type, price, count)

77
stock/util/TelegramBot.py Normal file
View File

@@ -0,0 +1,77 @@
from datetime import datetime
import telegram
import asyncio
class TelegramBot:
enable = None
BOT_TOKEN = None
CHANNEL_ID = None
client = None
def __init__(self, enable=True):
"""
botname: coinbot
username for the bot: ncue_coin_bot
token to access the HTTP API: 6435061393:AAHOh9wB5yGNGUdb3SfCYJrrWTBe7wgConM
botname: lottobot
username for the bot: ncue_lotto_bot
token to access the HTTP API:6791293398:AAFi1zrQTs6UmuHycAuNdsBgHDHaHcOJcYA
botname: stockbot
username for the bot: ncue_stock_bot
token to access the HTTP API: 6874078562:AAEHxGDavfc0ssAXPQIaW8JGYmTR7LNUJOw
"""
self.botname = "coinbot"
self.username = "ncue_coin_bot"
self.token = "6435061393:AAHOh9wB5yGNGUdb3SfCYJrrWTBe7wgConM"
self.chat_id = '574661323'
self.client = telegram.Bot(token=self.token)
self.enable = enable
return
def alarm_live(self, stock_code, stock_name):
if self.enable:
this_time = datetime.now()
text = "ALIVE (" + this_time.strftime('%Y-%m-%d %H:%M:%S') + ") " + stock_code + "(" + stock_name +")"
asyncio.run(
self.client.sendMessage(chat_id=self.chat_id, text=text)
)
print(text)
return
def post(self, stock_code, stock_name, type, price, count):
if self.enable:
this_time = datetime.now()
text = "DATE TIME:" + this_time.strftime('%Y-%m-%d %H:%M:%S') + ", " + "stock_code:" + stock_code + ", " + "stock_name:" + stock_name + ", " + "type:" + type + ", " + "price:" + str(price) + ", " + "count:" + str(count)
asyncio.run(
self.client.sendMessage(chat_id=self.chat_id, text=text)
)
print(text)
return
def sendMsg(self, msg):
if self.enable:
this_time = datetime.now()
text = "DATE TIME:" + this_time.strftime('%Y-%m-%d %H:%M:%S') + ", " + "msg:" + msg
asyncio.run(
self.client.sendMessage(chat_id=self.chat_id, text=text)
)
print(text)
return
if __name__ == "__main__":
this_time = datetime.now()
stock_code = "252670"
stock_name = "x2"
type = "BUY"
price = 2000
count = 2
telegramBot = TelegramBot(True)
telegramBot.post(stock_code, stock_name, type, price, count)