init
This commit is contained in:
@@ -11,17 +11,21 @@ from hts.OrderChecker import OrderChecker
|
|||||||
|
|
||||||
|
|
||||||
class HTS_122630 (HTS):
|
class HTS_122630 (HTS):
|
||||||
|
RESOURCE_PATH = None
|
||||||
buySellChecker = None
|
|
||||||
stock_code = None
|
stock_code = None
|
||||||
buy_count = None
|
buy_count = None
|
||||||
|
orderChecker = None
|
||||||
|
buySellChecker = None
|
||||||
|
|
||||||
def __init__(self, stock_code, buy_count):
|
def __init__(self, RESOURCE_PATH, stock_code, buy_count):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
||||||
self.buySellChecker = BuySellChecker()
|
self.RESOURCE_PATH = RESOURCE_PATH
|
||||||
self.stock_code = stock_code
|
self.stock_code = stock_code
|
||||||
self.buy_count = buy_count
|
self.buy_count = buy_count
|
||||||
|
|
||||||
|
self.orderChecker = OrderChecker(self.RESOURCE_PATH, self.stock_code)
|
||||||
|
self.buySellChecker = BuySellChecker()
|
||||||
return
|
return
|
||||||
|
|
||||||
def checkTransaction(self, data):
|
def checkTransaction(self, data):
|
||||||
@@ -74,9 +78,7 @@ class HTS_122630 (HTS):
|
|||||||
return 0, 0
|
return 0, 0
|
||||||
|
|
||||||
def buyRealTime(self, lastday, today):
|
def buyRealTime(self, lastday, today):
|
||||||
orderChecker = OrderChecker(self.stock_code)
|
timecheckList = pd.read_csv("hts/timecheck.csv").values.tolist()
|
||||||
|
|
||||||
timecheckList = pd.read_csv("timecheck.csv").values.tolist()
|
|
||||||
timecheck = {today + " " + str(second).zfill(6):False for second, check in timecheckList}
|
timecheck = {today + " " + str(second).zfill(6):False for second, check in timecheckList}
|
||||||
|
|
||||||
print("START...")
|
print("START...")
|
||||||
@@ -110,7 +112,7 @@ class HTS_122630 (HTS):
|
|||||||
# 미체결 기록을 가져온다.
|
# 미체결 기록을 가져온다.
|
||||||
ORDER_LIST = self.requestOrderList()
|
ORDER_LIST = self.requestOrderList()
|
||||||
# 매수 주문을 기록한다.
|
# 매수 주문을 기록한다.
|
||||||
orderListToCancel = orderChecker.add(self.stock_code, OrderType.buy, orderNum, BUY_COUNT, bs_buy_price, ORDER_LIST)
|
orderListToCancel = self.orderChecker.add(self.stock_code, OrderType.buy, orderNum, BUY_COUNT, bs_buy_price, ORDER_LIST)
|
||||||
# 두 시간 이전 미체결을 모두 취소한다.
|
# 두 시간 이전 미체결을 모두 취소한다.
|
||||||
self.cancelOrderList(orderListToCancel)
|
self.cancelOrderList(orderListToCancel)
|
||||||
# 로그 출력
|
# 로그 출력
|
||||||
@@ -120,7 +122,7 @@ class HTS_122630 (HTS):
|
|||||||
# 미체결 기록을 가져온다.
|
# 미체결 기록을 가져온다.
|
||||||
ORDER_LIST = self.requestOrderList()
|
ORDER_LIST = self.requestOrderList()
|
||||||
# 매도 주문을 기록을 가져온다.
|
# 매도 주문을 기록을 가져온다.
|
||||||
orderListToCancel = orderChecker.remove(self.stock_code, OrderType.sell, ORDER_LIST)
|
orderListToCancel = self.orderChecker.remove(self.stock_code, OrderType.sell, ORDER_LIST)
|
||||||
# 매도 미체결을 모두 취소한다.
|
# 매도 미체결을 모두 취소한다.
|
||||||
self.cancelOrderList(orderListToCancel)
|
self.cancelOrderList(orderListToCancel)
|
||||||
|
|
||||||
@@ -181,19 +183,20 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
today = datetime.today()
|
today = datetime.today()
|
||||||
|
|
||||||
PROJECT_HOME = os.path.join(os.path.dirname(os.path.join(os.path.dirname(__file__))))
|
PROJECT_HOME = os.path.join(os.path.dirname(__file__))
|
||||||
RESOURCE_DIR = PROJECT_HOME + "/resources/analysis/"+today.strftime("%Y%m%d")
|
RESOURCE_PATH = os.path.join(PROJECT_HOME, "resources")
|
||||||
|
|
||||||
# KODEX 인버스 * 2
|
# KODEX 인버스 * 2
|
||||||
stock_code = "122630"
|
stock_code = "122630"
|
||||||
buy_count = 80
|
buy_count = 80
|
||||||
|
|
||||||
hts = HTS_122630(stock_code, buy_count)
|
hts = HTS_122630(RESOURCE_PATH, stock_code, buy_count)
|
||||||
today_str = today.strftime('%Y%m%d')
|
today_str = today.strftime('%Y%m%d')
|
||||||
lastday_str = ""
|
lastday_str = ""
|
||||||
for i in range(1, 10):
|
for i in range(1, 10):
|
||||||
lastday_str = (today - timedelta(i)).strftime('%Y%m%d')
|
lastday_str = (today - timedelta(i)).strftime('%Y%m%d')
|
||||||
if os.path.isfile("./data/" + stock_code + "_" + lastday_str + ".csv"):
|
last_hts_data_filename = os.path.join(RESOURCE_PATH, "hts", stock_code + "_" + lastday_str + ".csv")
|
||||||
|
if os.path.isfile(last_hts_data_filename):
|
||||||
break
|
break
|
||||||
|
|
||||||
hts.buyRealTime(lastday_str, today_str)
|
hts.buyRealTime(lastday_str, today_str)
|
||||||
@@ -12,16 +12,21 @@ from hts.OrderChecker import OrderChecker
|
|||||||
|
|
||||||
class HTS_252670 (HTS):
|
class HTS_252670 (HTS):
|
||||||
|
|
||||||
buySellChecker = None
|
RESOURCE_PATH = None
|
||||||
stock_code = None
|
stock_code = None
|
||||||
buy_count = None
|
buy_count = None
|
||||||
|
orderChecker = None
|
||||||
|
buySellChecker = None
|
||||||
|
|
||||||
def __init__(self, stock_code, buy_count):
|
def __init__(self, RESOURCE_PATH, stock_code, buy_count):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
||||||
self.buySellChecker = BuySellChecker()
|
self.RESOURCE_PATH = RESOURCE_PATH
|
||||||
self.stock_code = stock_code
|
self.stock_code = stock_code
|
||||||
self.buy_count = buy_count
|
self.buy_count = buy_count
|
||||||
|
|
||||||
|
self.orderChecker = OrderChecker(self.RESOURCE_PATH, self.stock_code)
|
||||||
|
self.buySellChecker = BuySellChecker()
|
||||||
return
|
return
|
||||||
|
|
||||||
def checkTransaction(self, data):
|
def checkTransaction(self, data):
|
||||||
@@ -33,7 +38,7 @@ class HTS_252670 (HTS):
|
|||||||
bsLine['sell'] = [-1 for i in range(size)]
|
bsLine['sell'] = [-1 for i in range(size)]
|
||||||
|
|
||||||
last_index = size - 1
|
last_index = size - 1
|
||||||
#buy, weight, sell = self.buySellChecker.getPriceAndWeight3(data, last_index)
|
#buy, weight, sell = self.buySellChecker.getPriceAndWeight3(hts, last_index)
|
||||||
sell, weight = self.buySellChecker.getSellPriceAndWeight_3000(data, last_index)
|
sell, weight = self.buySellChecker.getSellPriceAndWeight_3000(data, last_index)
|
||||||
buy, weight = self.buySellChecker.getBuyPriceAndWeight_3000(data, last_index)
|
buy, weight = self.buySellChecker.getBuyPriceAndWeight_3000(data, last_index)
|
||||||
return buy, weight, sell
|
return buy, weight, sell
|
||||||
@@ -74,9 +79,8 @@ class HTS_252670 (HTS):
|
|||||||
return 0, 0
|
return 0, 0
|
||||||
|
|
||||||
def buyRealTime(self, lastday, today):
|
def buyRealTime(self, lastday, today):
|
||||||
orderChecker = OrderChecker(self.stock_code)
|
|
||||||
|
|
||||||
timecheckList = pd.read_csv("timecheck.csv").values.tolist()
|
timecheckList = pd.read_csv("hts/timecheck.csv").values.tolist()
|
||||||
timecheck = {today + " " + str(second).zfill(6):False for second, check in timecheckList}
|
timecheck = {today + " " + str(second).zfill(6):False for second, check in timecheckList}
|
||||||
|
|
||||||
print ("START...")
|
print ("START...")
|
||||||
@@ -112,7 +116,7 @@ class HTS_252670 (HTS):
|
|||||||
# 미체결 기록을 가져온다.
|
# 미체결 기록을 가져온다.
|
||||||
ORDER_LIST = self.requestOrderList()
|
ORDER_LIST = self.requestOrderList()
|
||||||
# 매수 주문을 기록한다.
|
# 매수 주문을 기록한다.
|
||||||
orderListToCancel = orderChecker.add(self.stock_code, OrderType.buy, orderNum, BUY_COUNT, bs_buy_price, ORDER_LIST)
|
orderListToCancel = self.orderChecker.add(self.stock_code, OrderType.buy, orderNum, BUY_COUNT, bs_buy_price, ORDER_LIST)
|
||||||
# 두 시간 이전 미체결을 모두 취소한다.
|
# 두 시간 이전 미체결을 모두 취소한다.
|
||||||
self.cancelOrderList(orderListToCancel)
|
self.cancelOrderList(orderListToCancel)
|
||||||
# 로그 출력
|
# 로그 출력
|
||||||
@@ -123,7 +127,7 @@ class HTS_252670 (HTS):
|
|||||||
# 미체결 기록을 가져온다.
|
# 미체결 기록을 가져온다.
|
||||||
ORDER_LIST = self.requestOrderList()
|
ORDER_LIST = self.requestOrderList()
|
||||||
# 매도 주문을 기록을 가져온다.
|
# 매도 주문을 기록을 가져온다.
|
||||||
orderListToCancel = orderChecker.remove(self.stock_code, OrderType.sell, ORDER_LIST)
|
orderListToCancel = self.orderChecker.remove(self.stock_code, OrderType.sell, ORDER_LIST)
|
||||||
# 매도 미체결을 모두 취소한다.
|
# 매도 미체결을 모두 취소한다.
|
||||||
self.cancelOrderList(orderListToCancel)
|
self.cancelOrderList(orderListToCancel)
|
||||||
|
|
||||||
@@ -183,19 +187,19 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
today = datetime.today()
|
today = datetime.today()
|
||||||
|
|
||||||
PROJECT_HOME = os.path.join(os.path.dirname(os.path.join(os.path.dirname(__file__))))
|
PROJECT_HOME = os.path.join(os.path.dirname(__file__))
|
||||||
RESOURCE_DIR = PROJECT_HOME + "/resources/analysis/"+today.strftime("%Y%m%d")
|
RESOURCE_PATH = os.path.join(PROJECT_HOME, "resources")
|
||||||
|
|
||||||
# KODEX 인버스 * 2
|
# KODEX 인버스 * 2
|
||||||
stock_code = "252670"
|
stock_code = "252670"
|
||||||
buy_count = 100
|
buy_count = 100
|
||||||
|
|
||||||
hts = HTS_252670(stock_code, buy_count)
|
hts = HTS_252670(RESOURCE_PATH, stock_code, buy_count)
|
||||||
today_str = today.strftime('%Y%m%d')
|
today_str = today.strftime('%Y%m%d')
|
||||||
lastday_str = ""
|
lastday_str = ""
|
||||||
for i in range(1, 10):
|
for i in range(1, 10):
|
||||||
lastday_str = (today - timedelta(i)).strftime('%Y%m%d')
|
last_hts_data_filename = os.path.join(RESOURCE_PATH, "hts", stock_code + "_" + lastday_str + ".csv")
|
||||||
if os.path.isfile("./data/" + stock_code + "_" + lastday_str + ".csv"):
|
if os.path.isfile(last_hts_data_filename):
|
||||||
break
|
break
|
||||||
|
|
||||||
hts.buyRealTime(lastday_str, today_str)
|
hts.buyRealTime(lastday_str, today_str)
|
||||||
@@ -26,13 +26,13 @@ class Simulation:
|
|||||||
next(reader)
|
next(reader)
|
||||||
|
|
||||||
for rows in reader:
|
for rows in reader:
|
||||||
days = rows[0] # data.날짜
|
days = rows[0] # hts.날짜
|
||||||
time = rows[1] # data.시간
|
time = rows[1] # hts.시간
|
||||||
open_v = rows[2] # data.시가
|
open_v = rows[2] # hts.시가
|
||||||
high = rows[3] # data.고가
|
high = rows[3] # hts.고가
|
||||||
low = rows[4] # data.저가
|
low = rows[4] # hts.저가
|
||||||
close = rows[5] # data.종가
|
close = rows[5] # hts.종가
|
||||||
vol = rows[6] # data.거래량
|
vol = rows[6] # hts.거래량
|
||||||
start_time = datetime.strptime(given_day + " 090000", '%Y%m%d %H%M%S')
|
start_time = datetime.strptime(given_day + " 090000", '%Y%m%d %H%M%S')
|
||||||
|
|
||||||
temp = datetime.strptime(str(days) + " " + str(time).zfill(4)+"00", '%Y%m%d %H%M%S')
|
temp = datetime.strptime(str(days) + " " + str(time).zfill(4)+"00", '%Y%m%d %H%M%S')
|
||||||
@@ -99,11 +99,11 @@ class Simulation:
|
|||||||
avg10 = go.Scatter(x=data['date'], y=data["avg10"], name="avg10", line_color='#ff00ff')
|
avg10 = go.Scatter(x=data['date'], y=data["avg10"], name="avg10", line_color='#ff00ff')
|
||||||
avg20 = go.Scatter(x=data['date'], y=data["avg20"], name="avg20", line_color='#8F8203')
|
avg20 = go.Scatter(x=data['date'], y=data["avg20"], name="avg20", line_color='#8F8203')
|
||||||
avg30 = go.Scatter(x=data['date'], y=data["avg30"], name="avg30", line_color='#000000')
|
avg30 = go.Scatter(x=data['date'], y=data["avg30"], name="avg30", line_color='#000000')
|
||||||
#avg60 = go.Scatter(x=data['date'], y=data["avg60"], name="avg60", line_color='#008000')
|
#avg60 = go.Scatter(x=hts['date'], y=hts["avg60"], name="avg60", line_color='#008000')
|
||||||
|
|
||||||
candle_stick = go.Candlestick(x=data['date'], open=data['open'], high=data['high'], low=data['low'], close=data['close'], increasing_line_color='red', decreasing_line_color='blue')
|
candle_stick = go.Candlestick(x=data['date'], open=data['open'], high=data['high'], low=data['low'], close=data['close'], increasing_line_color='red', decreasing_line_color='blue')
|
||||||
volume_line = go.Scatter(x=data['date'], y=data["volume"], mode='lines', name='volume')
|
volume_line = go.Scatter(x=data['date'], y=data["volume"], mode='lines', name='volume')
|
||||||
#fast_k_line = go.Scatter(x=data['date'], y=data["fast_k"], mode='lines', name='fast_k')
|
#fast_k_line = go.Scatter(x=hts['date'], y=hts["fast_k"], mode='lines', name='fast_k')
|
||||||
|
|
||||||
macd_line = go.Scatter(x=data['date'], y=data["macd"], mode='lines', name='macd')
|
macd_line = go.Scatter(x=data['date'], y=data["macd"], mode='lines', name='macd')
|
||||||
macd_s_line = go.Scatter(x=data['date'], y=data["macds"], mode='lines', name='macds')
|
macd_s_line = go.Scatter(x=data['date'], y=data["macds"], mode='lines', name='macds')
|
||||||
@@ -123,7 +123,7 @@ class Simulation:
|
|||||||
|
|
||||||
# 그래프를 그린다.
|
# 그래프를 그린다.
|
||||||
"""
|
"""
|
||||||
fig = go.Figure(data=candle_data)
|
fig = go.Figure(hts=candle_data)
|
||||||
fig.update_layout(title=stock_code + "_" + given_day)
|
fig.update_layout(title=stock_code + "_" + given_day)
|
||||||
fig.show()
|
fig.show()
|
||||||
"""
|
"""
|
||||||
@@ -165,7 +165,7 @@ class Simulation:
|
|||||||
today = days[1]
|
today = days[1]
|
||||||
|
|
||||||
if path == None:
|
if path == None:
|
||||||
path = "./hts/data"
|
path = "resources/hts"
|
||||||
|
|
||||||
# 데이터를 가지고 온다.
|
# 데이터를 가지고 온다.
|
||||||
self.getCSV(path + "/" + self.stock_code + "_" + last_day + ".csv", last_day, result)
|
self.getCSV(path + "/" + self.stock_code + "_" + last_day + ".csv", last_day, result)
|
||||||
@@ -193,7 +193,7 @@ if __name__ == "__main__":
|
|||||||
('20220722', '20220725')
|
('20220722', '20220725')
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
path = './hts/data'
|
path = 'resources/hts'
|
||||||
|
|
||||||
"""
|
"""
|
||||||
path = './hts/backup'
|
path = './hts/backup'
|
||||||
74
StockCrawler.py
Normal file
74
StockCrawler.py
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
import datetime
|
||||||
|
import time
|
||||||
|
from stock.crawler.FnGuideCrawler import FnGuideCrawler
|
||||||
|
from stock.crawler.MetaCrawler import MetaCrawler
|
||||||
|
from stock.crawler.StockCrawler import StockCrawler
|
||||||
|
from stock.analysis.AnalyzerSqlite import AnalyzerSqlite
|
||||||
|
|
||||||
|
today = datetime.datetime.now().strftime("%Y-%m-%d")
|
||||||
|
|
||||||
|
# DB Browser for SQLite: http://hleecaster.com/python-sqlite3/
|
||||||
|
|
||||||
|
PROJECT_HOME = os.path.join(os.path.dirname(os.path.join(os.path.dirname(os.path.join(os.path.dirname(os.path.join(os.path.dirname(__file__))))))))
|
||||||
|
|
||||||
|
START_DATE = "1900.01.01"
|
||||||
|
start = time.time()
|
||||||
|
stockFileName = PROJECT_HOME + '/resources/stock.db'
|
||||||
|
|
||||||
|
|
||||||
|
# 재무제표는 3개월마다 다운로드를 한다.
|
||||||
|
fnGuideCrawler = FnGuideCrawler(START_DATE)
|
||||||
|
print("[KOSPI 상장기업 재무제표 다운로드]")
|
||||||
|
fnGuideCrawler.crawl_fnguide(stockFileName)
|
||||||
|
|
||||||
|
metaCrawler = MetaCrawler(START_DATE)
|
||||||
|
print("\n[증시자금동향 (신용잔고, 펀드자금 잔고)]")
|
||||||
|
metaCrawler.crawl_money_trend(stockFileName)
|
||||||
|
|
||||||
|
print("\n[국내 시장금리]")
|
||||||
|
metaCrawler.crawl_interest_rates(stockFileName)
|
||||||
|
|
||||||
|
print("\n[투자자별 매매동향(Trading_Trend)]")
|
||||||
|
metaCrawler.crawl_trading_trend(stockFileName)
|
||||||
|
|
||||||
|
print("\n[환율 (USD, JPY, EUR, CNY)]")
|
||||||
|
metaCrawler.crawl_exchange(stockFileName)
|
||||||
|
|
||||||
|
print("\n[원유 (WTI), 국제금, COPPER, NATURALGAS, CORN, SOYBEAN]")
|
||||||
|
metaCrawler.crawl_meterials(stockFileName)
|
||||||
|
|
||||||
|
|
||||||
|
print("\n[종목 다운로드]")
|
||||||
|
stockCrawler = StockCrawler(START_DATE)
|
||||||
|
stockCrawler.crawl_etf_stocks(stockFileName)
|
||||||
|
stockCrawler.crawl_stocks(stockFileName)
|
||||||
|
#stockCrawler.crawl_special_stocks(stockFileName)
|
||||||
|
|
||||||
|
|
||||||
|
print("\n[종목 분석]")
|
||||||
|
# S: 분석까지 진행
|
||||||
|
inFileName = PROJECT_HOME + '/resources/stock.db'
|
||||||
|
analyzerSqlite = AnalyzerSqlite(PROJECT_HOME, stockFileName)
|
||||||
|
|
||||||
|
analyzerSqlite.analyzeDaily()
|
||||||
|
analyzerSqlite.analyzeGrouping("weekly")
|
||||||
|
analyzerSqlite.analyzeGrouping("monthly")
|
||||||
|
|
||||||
|
analyzerSqlite = AnalyzerSqlite(PROJECT_HOME, stockFileName)
|
||||||
|
print("\n[종목 결정]")
|
||||||
|
day = datetime.datetime.today().strftime("%Y%m%d")
|
||||||
|
outPath = PROJECT_HOME + "/resources/analysis/" + day
|
||||||
|
if os.path.isdir(outPath):
|
||||||
|
shutil.rmtree(outPath)
|
||||||
|
os.mkdir(outPath)
|
||||||
|
print("print to Html...")
|
||||||
|
analyzerSqlite.findCandidate(outPath)
|
||||||
|
# E: 분석까지 진행
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print("time : %6.2f 초", (time.time() - start))
|
||||||
|
|
||||||
|
print ("done...")
|
||||||
@@ -37,16 +37,16 @@ class BuySellChecker:
|
|||||||
### sell 분석 ###
|
### sell 분석 ###
|
||||||
################
|
################
|
||||||
# 1. 볼린져밴드 상단이 최고와 종가 사이 아래에 있는 경우 매도한다.
|
# 1. 볼린져밴드 상단이 최고와 종가 사이 아래에 있는 경우 매도한다.
|
||||||
#if (data["high"][i] - data["close"][i]) / 2 + data["close"][i] > data["upper"][i]:
|
#if (hts["high"][i] - hts["close"][i]) / 2 + hts["close"][i] > hts["upper"][i]:
|
||||||
# sell = data["high"][i]
|
# sell = hts["high"][i]
|
||||||
|
|
||||||
# 2. slow_k가 90이 넘으면 매도한다.
|
# 2. slow_k가 90이 넘으면 매도한다.
|
||||||
if data["slow_k"][i] > 90:
|
if data["slow_k"][i] > 90:
|
||||||
sell = data["high"][i]
|
sell = data["high"][i]
|
||||||
|
|
||||||
#if data["slow_k"][i] >= 85:
|
#if hts["slow_k"][i] >= 85:
|
||||||
# if data["slow_d"][i-1] < data["slow_k"][i-1] and data["slow_k"][i] < data["slow_d"][i]:
|
# if hts["slow_d"][i-1] < hts["slow_k"][i-1] and hts["slow_k"][i] < hts["slow_d"][i]:
|
||||||
# sell = data["high"][i]
|
# sell = hts["high"][i]
|
||||||
|
|
||||||
# 3. 2시 이후에는 최고가가 볼린져밴드 상단 위에 있으면 매도한다.
|
# 3. 2시 이후에는 최고가가 볼린져밴드 상단 위에 있으면 매도한다.
|
||||||
if i > 300 and data["high"][i] > data["upper"][i]:
|
if i > 300 and data["high"][i] > data["upper"][i]:
|
||||||
@@ -347,45 +347,45 @@ class BuySellChecker:
|
|||||||
"""
|
"""
|
||||||
# 이동선을 이용한 매매
|
# 이동선을 이용한 매매
|
||||||
# 20분선이 30분선에 돌파 후 지지하는지 확인하고 해당 시점이 양봉이면 매수함
|
# 20분선이 30분선에 돌파 후 지지하는지 확인하고 해당 시점이 양봉이면 매수함
|
||||||
if data['avg20'][i] > data['avg30'][i]:
|
if hts['avg20'][i] > hts['avg30'][i]:
|
||||||
diff1 = data['avg20'][i] - data['avg30'][i]
|
diff1 = hts['avg20'][i] - hts['avg30'][i]
|
||||||
diff2 = data['avg20'][i-1] - data['avg30'][i-1]
|
diff2 = hts['avg20'][i-1] - hts['avg30'][i-1]
|
||||||
diff3 = data['avg20'][i-2] - data['avg30'][i-2]
|
diff3 = hts['avg20'][i-2] - hts['avg30'][i-2]
|
||||||
diff4 = data['avg20'][i-3] - data['avg30'][i-3]
|
diff4 = hts['avg20'][i-3] - hts['avg30'][i-3]
|
||||||
diff5 = data['avg20'][i-4] - data['avg30'][i-4]
|
diff5 = hts['avg20'][i-4] - hts['avg30'][i-4]
|
||||||
if 0 < diff3 < diff2 < diff1:
|
if 0 < diff3 < diff2 < diff1:
|
||||||
if data['high'][i-2] <= data['high'][i-1] <= data['high'][i]:
|
if hts['high'][i-2] <= hts['high'][i-1] <= hts['high'][i]:
|
||||||
if data['open'][i - 2] <= data['close'][i - 2] and data['open'][i-1] <= data['close'][i-1] and data['open'][i] <= data['close'][i]:
|
if hts['open'][i - 2] <= hts['close'][i - 2] and hts['open'][i-1] <= hts['close'][i-1] and hts['open'][i] <= hts['close'][i]:
|
||||||
if diff5 < diff4 < 0:
|
if diff5 < diff4 < 0:
|
||||||
if data["rsi"][i] < 30:
|
if hts["rsi"][i] < 30:
|
||||||
buy = (data["open"][i]+data["close"][i])/2
|
buy = (hts["open"][i]+hts["close"][i])/2
|
||||||
weight = 7
|
weight = 7
|
||||||
return self.getBuyCheck(data, i, buy, weight)
|
return self.getBuyCheck(hts, i, buy, weight)
|
||||||
|
|
||||||
# 이동선을 이용한 매매
|
# 이동선을 이용한 매매
|
||||||
# 3분선과 5분선이 10분 이상 내려오다가 3분선이 5분선을 넘어 서는 순간 매수
|
# 3분선과 5분선이 10분 이상 내려오다가 3분선이 5분선을 넘어 서는 순간 매수
|
||||||
# (2022-07-04 09:22) (2022-07-05 09:38) (2022-07-07 09:35) (2022-07-08 09:06) (2022-07-11 09:25) (2022-07-13 10:12) (2022-07-15 14:48)
|
# (2022-07-04 09:22) (2022-07-05 09:38) (2022-07-07 09:35) (2022-07-08 09:06) (2022-07-11 09:25) (2022-07-13 10:12) (2022-07-15 14:48)
|
||||||
if int(data["avg3"][i]) > int(data["avg5"][i]):
|
if int(hts["avg3"][i]) > int(hts["avg5"][i]):
|
||||||
valid = True
|
valid = True
|
||||||
same_count = 0
|
same_count = 0
|
||||||
for c in range(1, 11):
|
for c in range(1, 11):
|
||||||
if int(data["avg3"][i-c]) == int(data["avg5"][i-c]):
|
if int(hts["avg3"][i-c]) == int(hts["avg5"][i-c]):
|
||||||
same_count += 1
|
same_count += 1
|
||||||
if int(data["avg3"][i-c]) > int(data["avg5"][i-c]):
|
if int(hts["avg3"][i-c]) > int(hts["avg5"][i-c]):
|
||||||
valid = False
|
valid = False
|
||||||
break
|
break
|
||||||
if valid and same_count < 2:
|
if valid and same_count < 2:
|
||||||
if data['macd'][i] < -5:
|
if hts['macd'][i] < -5:
|
||||||
buy = data["close"][i] - 5
|
buy = hts["close"][i] - 5
|
||||||
weight = 1
|
weight = 1
|
||||||
return self.getBuyCheck(data, i, buy, weight)
|
return self.getBuyCheck(hts, i, buy, weight)
|
||||||
|
|
||||||
# 만약 30원 이상 장대 양봉이 나온 경우, 다음이나 다다음 중간 값에서 매수를 한다.
|
# 만약 30원 이상 장대 양봉이 나온 경우, 다음이나 다다음 중간 값에서 매수를 한다.
|
||||||
if (data["close"][i] - data["low"][i]) >= 30:
|
if (hts["close"][i] - hts["low"][i]) >= 30:
|
||||||
middle = int((data["close"][i] + data["low"][i])/2)
|
middle = int((hts["close"][i] + hts["low"][i])/2)
|
||||||
buy = middle
|
buy = middle
|
||||||
weight = 1
|
weight = 1
|
||||||
return self.getBuyCheck(data, i, buy, weight)
|
return self.getBuyCheck(hts, i, buy, weight)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
18
hts/HTS.py
18
hts/HTS.py
@@ -383,7 +383,7 @@ class HTS:
|
|||||||
# 차트 객체 구하기
|
# 차트 객체 구하기
|
||||||
objStockChart = win32com.client.Dispatch("CpSysDib.StockChart")
|
objStockChart = win32com.client.Dispatch("CpSysDib.StockChart")
|
||||||
|
|
||||||
outfp = open("./data/"+stock_code+"_"+today+".csv", mode="w", encoding="utf-8")
|
outfp = open("./hts/"+stock_code+"_"+today+".csv", mode="w", encoding="utf-8")
|
||||||
objStockChart.SetInputValue(0, 'A' + stock_code) # 종목 코드
|
objStockChart.SetInputValue(0, 'A' + stock_code) # 종목 코드
|
||||||
objStockChart.SetInputValue(1, ord('1')) # 1: 기간으로 조회, 2: 개수로 조회
|
objStockChart.SetInputValue(1, ord('1')) # 1: 기간으로 조회, 2: 개수로 조회
|
||||||
objStockChart.SetInputValue(2, today) # 기간 조회 시, 시작일
|
objStockChart.SetInputValue(2, today) # 기간 조회 시, 시작일
|
||||||
@@ -436,13 +436,13 @@ class HTS:
|
|||||||
next(reader)
|
next(reader)
|
||||||
|
|
||||||
for rows in reader:
|
for rows in reader:
|
||||||
days = rows[0] # data.날짜
|
days = rows[0] # hts.날짜
|
||||||
time = rows[1] # data.시간
|
time = rows[1] # hts.시간
|
||||||
open_v = rows[2] # data.시가
|
open_v = rows[2] # hts.시가
|
||||||
high = rows[3] # data.고가
|
high = rows[3] # hts.고가
|
||||||
low = rows[4] # data.저가
|
low = rows[4] # hts.저가
|
||||||
close = rows[5] # data.종가
|
close = rows[5] # hts.종가
|
||||||
vol = rows[6] # data.거래량
|
vol = rows[6] # hts.거래량
|
||||||
|
|
||||||
start_time = datetime.strptime(given_day + " 090000", '%Y%m%d %H%M%S')
|
start_time = datetime.strptime(given_day + " 090000", '%Y%m%d %H%M%S')
|
||||||
|
|
||||||
@@ -468,7 +468,7 @@ class HTS:
|
|||||||
"low": [],
|
"low": [],
|
||||||
"vol": []}
|
"vol": []}
|
||||||
|
|
||||||
self.getCSV("./data/" + stock_code + "_" + lastday + ".csv", today, result)
|
self.getCSV("./hts/" + stock_code + "_" + lastday + ".csv", today, result)
|
||||||
|
|
||||||
int_given_day = int(today)
|
int_given_day = int(today)
|
||||||
objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
|
objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
|
||||||
|
|||||||
@@ -8,7 +8,8 @@ class OrderChecker:
|
|||||||
|
|
||||||
saveFileName = None
|
saveFileName = None
|
||||||
|
|
||||||
def __init__(self, stock_code):
|
def __init__(self, RESOURCE_PATH, stock_code):
|
||||||
|
self.saveFileName = "./order/" + stock_code + "_" + datetime.today().strftime("%Y%m%d") + ".csv"
|
||||||
self.saveFileName = "./order/"+stock_code+"_"+datetime.today().strftime("%Y%m%d")+".csv"
|
self.saveFileName = "./order/"+stock_code+"_"+datetime.today().strftime("%Y%m%d")+".csv"
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ if __name__ == "__main__":
|
|||||||
today = datetime.today()
|
today = datetime.today()
|
||||||
|
|
||||||
PROJECT_HOME = os.path.join(os.path.dirname(os.path.join(os.path.dirname(os.path.join(os.path.dirname(__file__))))))
|
PROJECT_HOME = os.path.join(os.path.dirname(os.path.join(os.path.dirname(os.path.join(os.path.dirname(__file__))))))
|
||||||
RESOURCE_DIR = PROJECT_HOME + "/hits/data"
|
RESOURCE_DIR = PROJECT_HOME + "/hits/hts"
|
||||||
|
|
||||||
stock_codes = ["252670", "122630"]
|
stock_codes = ["252670", "122630"]
|
||||||
dataDownloader = DataDownloader()
|
dataDownloader = DataDownloader()
|
||||||
|
|||||||
@@ -1,155 +0,0 @@
|
|||||||
import os
|
|
||||||
from datetime import datetime, timedelta
|
|
||||||
import pandas as pd
|
|
||||||
import plotly.graph_objects as go
|
|
||||||
import plotly
|
|
||||||
|
|
||||||
from hts.BuySellChecker import BuySellChecker
|
|
||||||
|
|
||||||
class WebViewer:
|
|
||||||
|
|
||||||
buySellChecker = None
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
self.buySellChecker = BuySellChecker()
|
|
||||||
return
|
|
||||||
|
|
||||||
def getCSV(self, type, fileName, given_day, result):
|
|
||||||
data = pd.read_csv(fileName)
|
|
||||||
|
|
||||||
days = data.날짜
|
|
||||||
time = data.시간
|
|
||||||
open = data.시가
|
|
||||||
close = data.종가
|
|
||||||
high = data.고가
|
|
||||||
low = data.저가
|
|
||||||
vol = data.거래량
|
|
||||||
start_time = datetime.strptime(given_day + " 090000", '%Y%m%d %H%M%S')
|
|
||||||
|
|
||||||
for i in range(len(data)):
|
|
||||||
if type == "S":
|
|
||||||
temp = datetime.strptime(str(days[i]) + " " + str(time[i]).zfill(4), '%Y%m%d %H%M%S')
|
|
||||||
else:
|
|
||||||
temp = datetime.strptime(str(days[i]) + " " + str(time[i]).zfill(4) + "00", '%Y%m%d %H%M%S')
|
|
||||||
if temp < start_time:
|
|
||||||
continue
|
|
||||||
|
|
||||||
if temp not in result["check"]:
|
|
||||||
result["check"].add(temp)
|
|
||||||
result["time"].append(temp)
|
|
||||||
result["open"].append(open[i])
|
|
||||||
result["close"].append(close[i])
|
|
||||||
result["high"].append(high[i])
|
|
||||||
result["low"].append(low[i])
|
|
||||||
result["vol"].append(vol[i])
|
|
||||||
return
|
|
||||||
|
|
||||||
def checkTransaction(self, data):
|
|
||||||
size = len(data["close"])
|
|
||||||
|
|
||||||
bsLine = {}
|
|
||||||
bsLine['buy'] = [-1 for i in range(size)]
|
|
||||||
bsLine['weight'] = [-1 for i in range(size)]
|
|
||||||
bsLine['sell'] = [-1 for i in range(size)]
|
|
||||||
|
|
||||||
for i in range(6, size-5):
|
|
||||||
if self.stock_code == "252670":
|
|
||||||
buy, weight, sell = self.buySellChecker.getPriceAndWeight1(data, i)
|
|
||||||
else:
|
|
||||||
buy, weight, sell = self.buySellChecker.getPriceAndWeight2(data, i)
|
|
||||||
bsLine['buy'][i] = buy
|
|
||||||
bsLine['weight'][i] = weight
|
|
||||||
bsLine['sell'][i] = sell
|
|
||||||
|
|
||||||
return bsLine
|
|
||||||
|
|
||||||
def draw(self, stock_code, given_day, data):
|
|
||||||
|
|
||||||
data['open'] = pd.to_numeric(data['open'])
|
|
||||||
data['high'] = pd.to_numeric(data['high'])
|
|
||||||
data['low'] = pd.to_numeric(data['low'])
|
|
||||||
data['close'] = pd.to_numeric(data['close'])
|
|
||||||
|
|
||||||
|
|
||||||
# 그래프를 설정한다.
|
|
||||||
bolinger_upper = go.Scatter(x=data['date'], y=data["upper"], name="upper", line_color='#8B4513')
|
|
||||||
bolinger_lower = go.Scatter(x=data['date'], y=data["lower"], name="lower", line_color='#8B4513')
|
|
||||||
candle_stick = go.Candlestick(x=data['date'], open=data['open'], high=data['high'], low=data['low'], close=data['close'], increasing_line_color='red', decreasing_line_color='blue')
|
|
||||||
buy_check = go.Scatter(x=data['date'], mode='markers', name="buy_check")
|
|
||||||
candle_data = [candle_stick, bolinger_upper, bolinger_lower, buy_check]
|
|
||||||
|
|
||||||
# 그래프를 그린다.
|
|
||||||
# mothod #1
|
|
||||||
fig = go.FigureWidget(data=candle_data)
|
|
||||||
fig.update_layout(height=800, title=stock_code + "_" + given_day)
|
|
||||||
fig.show()
|
|
||||||
#plotly.offline.plot(fig, filename='file.html')
|
|
||||||
""" # mothod #2
|
|
||||||
fig = subplots.make_subplots(rows=1, cols=1, subplot_titles=('캔들'))
|
|
||||||
for trace in candle_data:
|
|
||||||
fig.append_trace(trace, 1, 1)
|
|
||||||
fig.update_layout(height=800, title=stock_code + "_" + given_day)
|
|
||||||
fig.show()
|
|
||||||
"""
|
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
def simulate(self, stock_code, type, GIVEN_DAY, IN_DIR, OUT_DIR, fileName):
|
|
||||||
result = {"check": set(),
|
|
||||||
"time": [],
|
|
||||||
"open": [],
|
|
||||||
"close": [],
|
|
||||||
"high": [],
|
|
||||||
"low": [],
|
|
||||||
"vol": []}
|
|
||||||
|
|
||||||
# 데이터를 가지고 온다.
|
|
||||||
self.getCSV(type, IN_DIR+"/"+fileName, GIVEN_DAY, result)
|
|
||||||
|
|
||||||
# 분석을 통해서 볼린저밴드 상/하단을 계산한다.
|
|
||||||
data = self.buySellChecker.analyze(result)
|
|
||||||
|
|
||||||
# 그래프를 그린다.
|
|
||||||
self.draw(stock_code, GIVEN_DAY, data)
|
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
|
|
||||||
PROJECT_HOME = os.path.join(os.path.dirname(os.path.join(os.path.dirname(os.path.join(os.path.dirname(__file__))))))
|
|
||||||
RSC_DIR = PROJECT_HOME + "/resources"
|
|
||||||
IN_DIR = RSC_DIR + "/raw"
|
|
||||||
OUT_DIR = RSC_DIR + "/tagging"
|
|
||||||
|
|
||||||
stock_code = "252670"
|
|
||||||
#stock_code = "122630"
|
|
||||||
start_date = "20220602"
|
|
||||||
|
|
||||||
webViewer = WebViewer()
|
|
||||||
zero_count_m, zero_count_S = 0, 10
|
|
||||||
for i in range(100000):
|
|
||||||
given_day = datetime.strptime(start_date, '%Y%m%d') - timedelta(i)
|
|
||||||
given_day = given_day.strftime('%Y%m%d')
|
|
||||||
|
|
||||||
"""
|
|
||||||
if zero_count_S < 10:
|
|
||||||
type = "S"
|
|
||||||
fileName = stock_code + "_" + given_day + "_" + type + ".csv"
|
|
||||||
if not os.path.isfile(IN_DIR+"/"+fileName):
|
|
||||||
zero_count_S += 1
|
|
||||||
else:
|
|
||||||
zero_count_S = 0
|
|
||||||
webViewer.simulate(stock_code, type, given_day, IN_DIR, OUT_DIR, fileName)
|
|
||||||
"""
|
|
||||||
if zero_count_m < 10:
|
|
||||||
type = "m"
|
|
||||||
fileName = stock_code + "_" + given_day + "_" + type + ".csv"
|
|
||||||
if not os.path.isfile(IN_DIR + "/" + fileName):
|
|
||||||
zero_count_m += 1
|
|
||||||
else:
|
|
||||||
zero_count_m = 0
|
|
||||||
webViewer.simulate(stock_code, type, given_day, IN_DIR, OUT_DIR, fileName)
|
|
||||||
|
|
||||||
if zero_count_m > 10 and zero_count_S > 10:
|
|
||||||
break
|
|
||||||
print ("done...")
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user