init
This commit is contained in:
@@ -267,52 +267,11 @@ class Analyzer:
|
||||
|
||||
def analyzeFinalScore(self, last_index, STOCK, MACD, STOCHASTIC, ICHIMOKU, RSI):
|
||||
"""
|
||||
[매도]
|
||||
1. MACD
|
||||
1) MACD가 시그널설을 하향 돌파하면 매도한다.
|
||||
2) MACD가 기준선 (0) 아래에 있는 한 주가는 하향추세이거나 또는 상승하지 않는다.
|
||||
3) 시그널 추세가 하향인 한 매수 신호가 나올 때까지 주식을 보유하지 않는다.
|
||||
4) 하락형 다이버전스가 발생하면 적극 매도를 검토한다.
|
||||
|
||||
2. Stochasic: %K선이 %D선을 하향 돌파하면 매도 신호로 보되 다음 사항들이 일치하면 매도한다.
|
||||
1) 스토캐스틱 지표가 하락추세를 보이고, 50 이하에 있어야 한다.
|
||||
2) 스토캐스틱 지표가 고점이 낮아지는 하락파동에 있어야 한다.
|
||||
3) 주가가 5일 또는 20일 이동 평균선 아래에 있어야 한다.
|
||||
4) MACD 지표가 하락으로 전환하거나 또는 최소한 상승을 멈추어야 한다.
|
||||
5) 하락형 다이버전스가 발생하면 매도를 검토한다.
|
||||
|
||||
3. rsi
|
||||
1) rsi가 하향이고 70이하로 떨어지면 매도,
|
||||
2) rsi가 하향이고 50이하로 떨어지면 매도,
|
||||
3) rsi가 하향이고 30이하로 떨어지면 단기매도,
|
||||
|
||||
[매수]
|
||||
1. MACD
|
||||
1) MACD가 시그널설을 상향 돌파하면 매수한다.
|
||||
2) MACD가 기준선 (0) 위에 있는 한 주가는 상승추세이거나 또는 하락하지 않는다.
|
||||
3) 시그널 추세가 상승하는 한 매도 신호가 나올 때까지 주식을 보유한다.
|
||||
4) 상승형 다이버전스가 발생하면 적극 매수를 검토한다.
|
||||
|
||||
2. Stochasic: %K선이 %D선을 상향 돌파하면 매수 신호로 보되 다음 사항들이 일치하면 매수한다.
|
||||
1) 스토캐스틱 지표가 상승추세를 보이고, 50 이상에 있어야 한다.
|
||||
2) 스토캐스틱 지표가 저점을 높이는 상승파동에 있어야 한다.
|
||||
3) 주가가 5일 또는 20일 이동 평균선 위에 있어야 한다.
|
||||
4) MACD 지표가 상승으로 전환하거나 또는 최소한 하락을 멈추어야 한다.
|
||||
5) 상승형 다이버전스가 발생하면 매수를 검토한다.
|
||||
|
||||
3. rsi
|
||||
1) 상향이고 30을 돌파하면 매수,
|
||||
2) rsi가 상향이고 40을 돌파하면 매수,
|
||||
3) rsi가 상향이고 70을 돌파하면 단기매수,
|
||||
|
||||
시장 보다 강한 종목이란 (https://biz.sbs.co.kr/article/10000976754)
|
||||
매수 조건
|
||||
#0. 최소 매수 조건은 거래량은 20만건, 종가는 2천원 이상인 종목이어야 한다.
|
||||
#1. 골든크로스: 5일선, 20일선, 60일선, 120일선이 순서대로 나열되는 순간
|
||||
"""
|
||||
|
||||
i = last_index
|
||||
|
||||
# 매수금액을 구
|
||||
# 이전 3일 동안의 어제종가-오늘저가의 평균을 구함 --> (종가-시가)/3
|
||||
# 그래서 오늘 종가에 구한 평균값을 더해서 내일 종목을 매수함
|
||||
buy_price = 0
|
||||
count = 0
|
||||
for idx in range(i, i-5, -1):
|
||||
@@ -323,79 +282,57 @@ class Analyzer:
|
||||
if count == 0:
|
||||
buy_price = STOCK[i]['close']
|
||||
else:
|
||||
# 종가 - 최저가의 최근 3일 평균 가격을 산정한다.
|
||||
buy_price = round(STOCK[i]['close'] - (buy_price/count))
|
||||
|
||||
stochastic_score = self.common.getStochasticScore(STOCHASTIC, i)
|
||||
"""
|
||||
if STOCK[i]['volume'] > 10000:
|
||||
if MACD[i - 1]['macd'] < MACD[i]['macd']:
|
||||
if MACD[i - 1]['macd'] < MACD[i - 1]['macds'] and MACD[i]['macd'] > MACD[i]['macds']:
|
||||
return True,buy_price, stochastic_score
|
||||
|
||||
if stochastic_score > 0:
|
||||
return True, buy_price, stochastic_score
|
||||
"""
|
||||
|
||||
status = ""
|
||||
if STOCK[i]['volume'] > 100000 and STOCK[i]['close'] > 1000:
|
||||
# 거래량이 10만 이상이고, 종가가 1천원 이상인지 체크 (https://happpy-rich.tistory.com/94)
|
||||
if STOCK[i]['volume'] > 100000 and STOCK[i]['close'] > 2000:
|
||||
# 거래량이 100만 이상이고, 종가가 1천원 이상인지 체크 (https://happpy-rich.tistory.com/94)
|
||||
|
||||
if self.common.check_on_120_daysLine(STOCK, i):
|
||||
# 특히 종목이 120일선을 뚫은 후 60일선이 상승세인지를 확인한다. (https://biz.sbs.co.kr/article/10000976754)
|
||||
if STOCHASTIC[i]['slow_k'] < 70:
|
||||
status += '120_'
|
||||
if self.common.check_on_60_daysLine(STOCK, i):
|
||||
if STOCHASTIC[i]['slow_k'] < 70:
|
||||
status += '60_'
|
||||
if self.common.check_on_20_daysLine(STOCK, i):
|
||||
if STOCHASTIC[i]['slow_k'] < 70:
|
||||
all_upper_cross_status = self.common.checkAllUpperCross(STOCK, i)
|
||||
if all_upper_cross_status != "":
|
||||
status += all_upper_cross_status
|
||||
|
||||
# GOLDENCROSS#1은 바로 매수하지 않고, 이 시점 이후로 5일선이 20일선을 하방으로 뚫었다가 다시 20일선을 상방으로 뚫는 순간 매수를 시도한다.
|
||||
# GOLDENCROSS#2은 바로 매수 가능
|
||||
# GOLDENCROSS#3은 바로 매수 가능
|
||||
golden_cross_status = self.common.check_golded_cross(STOCK, i)
|
||||
if golden_cross_status != "":
|
||||
status += golden_cross_status
|
||||
|
||||
# BUYINGBEARMARKET#1은 바로 매수 가능
|
||||
# BUYINGBEARMARKET#2은 바로 매수 가능
|
||||
bearmarket_buying_status = self.common.check_bearmarket_buying(STOCK, STOCHASTIC, i)
|
||||
if bearmarket_buying_status != "":
|
||||
status += bearmarket_buying_status
|
||||
|
||||
# BUYINGSTOCHASTIC#1은 바로 매수 가능
|
||||
stochastic_buying_status = self.common.check_stochastic_buying(STOCK, STOCHASTIC, ICHIMOKU, i)
|
||||
if stochastic_buying_status != "":
|
||||
status += stochastic_buying_status
|
||||
|
||||
# 20
|
||||
if self.common.check_20days_line_buying(STOCK, i):
|
||||
if STOCHASTIC[i]['slow_k'] < 40:
|
||||
status += '20_'
|
||||
|
||||
if STOCHASTIC[i]['slow_k'] < 10:
|
||||
# 스토캐스틱이 10 이하였다면,
|
||||
status += 'STOCHASTIC_'
|
||||
# 60
|
||||
if self.common.check_60days_line_buying(STOCK, i):
|
||||
if STOCHASTIC[i]['slow_k'] < 40:
|
||||
status += '60_'
|
||||
|
||||
# STOCHASTIC
|
||||
stochastic_status = self.common.check_stochastic(STOCK, STOCHASTIC, i)
|
||||
if stochastic_status != "":
|
||||
status += stochastic_status
|
||||
|
||||
# YANGBONG
|
||||
if self.common.checkLongYangBongAfterUmBong(STOCK, i):
|
||||
# 어제 음봉 이후 장대양봉이었다면,
|
||||
status += 'YANGBONG_'
|
||||
|
||||
return status, buy_price
|
||||
|
||||
def analyzeToFile(self, outFileName):
|
||||
conn = sqlite3.connect(self.inFileName)
|
||||
cursor = conn.cursor()
|
||||
|
||||
outfp = open(outFileName, "w", encoding="utf-8")
|
||||
rowid = 1
|
||||
cursor.execute('SELECT * FROM ' + self.tableName + ' WHERE rowid=?', (rowid,))
|
||||
result = cursor.fetchone()
|
||||
while result != None:
|
||||
stock = {"CODE": result[0], "NAME": result[1], "PRICE": json.loads(result[2])}
|
||||
macd = json.loads(result[3])
|
||||
stochastic = json.loads(result[4])
|
||||
ichimokuCloud = json.loads(result[5])
|
||||
rsi = json.loads(result[6])
|
||||
|
||||
last_index = self.get_last_index(stock)
|
||||
lastStock = stock['PRICE']
|
||||
|
||||
state, buy_price = self.analyzeFinalScore(last_index, lastStock, macd, stochastic, ichimokuCloud, rsi)
|
||||
if state != "":
|
||||
# self.macd.draw(stock)
|
||||
print(stock['CODE'], stock['NAME'], str(buy_price), stochastic[last_index]['slow_k'], macd[last_index]['macd'], rsi[last_index]['rsi_buy'], ichimokuCloud[last_index]['ichimoku_buy'])
|
||||
outfp.write("%s\t%s\t%s\t%d\t%s\t%s\t%s\n"%(stock['CODE'], stock['NAME'], str(buy_price), stochastic[last_index]['slow_k'], rsi[last_index]['rsi_buy'], macd[last_index]['macd'], ichimokuCloud[last_index]['ichimoku_buy']))
|
||||
|
||||
print("#file", rowid, stock['NAME'])
|
||||
|
||||
rowid += 1
|
||||
cursor.execute('SELECT * FROM ' + self.tableName + ' WHERE rowid=?', (rowid,))
|
||||
result = cursor.fetchone()
|
||||
|
||||
cursor.close()
|
||||
conn.close()
|
||||
outfp.close()
|
||||
|
||||
return
|
||||
|
||||
# 그래프 출력
|
||||
def analyzeToHtml(self, outPath):
|
||||
tmp_path = outPath + "/tmp"
|
||||
@@ -430,8 +367,6 @@ class Analyzer:
|
||||
if result[5] != result[5]: result_5 = result[5].replace("NaN", "0")
|
||||
if result[6] != result[6]: result_6 = result[6].replace("NaN", "0")
|
||||
|
||||
if rowid == 2435:
|
||||
print (1)
|
||||
stock = {"CODE": result[0], "NAME": result[1], "PRICE": json.loads(result[2]), "MACD": json.loads(result_3), "STOCHASTIC": json.loads(result_4), "ICHIMOKU": json.loads(result_5), "RSI": json.loads(result_6)}
|
||||
|
||||
last_index = self.get_last_index(stock)
|
||||
@@ -441,7 +376,9 @@ class Analyzer:
|
||||
ICHIMOKU = stock['ICHIMOKU']
|
||||
RSI = stock['RSI']
|
||||
|
||||
# 종목 상태 체크 분석
|
||||
state, buy_price = self.analyzeFinalScore(last_index, STOCK, MACD, STOCHASTIC, ICHIMOKU, RSI)
|
||||
|
||||
stochastic_score = STOCHASTIC[last_index]['slow_k']
|
||||
macd_score = MACD[last_index]['macd']
|
||||
rsi_score = RSI[last_index]['rsi']
|
||||
@@ -451,14 +388,14 @@ class Analyzer:
|
||||
fig = self.draw(stock)
|
||||
title = "%s (%s), %s, buy_price (%d), stochastic(%.3f), rsi(%.3f), macd(%.3f), ichimoku(%d)) 차트" % (item_name, item_code, state, buy_price, stochastic_score, rsi_score, macd_score, ichimoku_score)
|
||||
fig['layout'].update(title=title)
|
||||
fileName = "%s/%s__%.3f__%.3f__%s.html" % (outPath, state, stochastic_score, rsi_score, item_name.replace(" ", ""))
|
||||
fileName = "%s/%s__%.3f__%.3f__%s_%s.html" % (outPath, state, stochastic_score, rsi_score, item_name.replace(" ", ""), item_code)
|
||||
po.write_html(fig, file=fileName, auto_open=False)
|
||||
else:
|
||||
if RSI[last_index]['rsi_buy'] == 1 and STOCK[last_index]['volume'] > 100000:
|
||||
if (RSI[last_index]['rsi_buy'] == 1) and STOCK[last_index]['volume'] > 1000000:
|
||||
fig = self.draw(stock)
|
||||
title = "%s (%s) buy_price (%d), stochastic(%.3f), rsi(%.3f), macd(%.3f), ichimoku(%d)) 차트"%(item_name, item_code, buy_price, stochastic_score, rsi_score, macd_score, ichimoku_score)
|
||||
fig['layout'].update(title=title)
|
||||
fileName = "%s/%.3f__%.3f__%s.html"%(tmp_path, stochastic_score, rsi_score, item_name.replace(" ", ""))
|
||||
fileName = "%s/%.3f__%.3f__%s_%s.html"%(tmp_path, stochastic_score, rsi_score, item_name.replace(" ", ""), item_code)
|
||||
po.write_html(fig, file=fileName, auto_open=False)
|
||||
|
||||
print ("#html", rowid, stock['NAME'])
|
||||
|
||||
Reference in New Issue
Block a user