This commit is contained in:
dosangyoon
2021-10-05 21:38:22 +09:00
parent e4d12343c9
commit 1dade0afbe
2 changed files with 113 additions and 50 deletions

View File

@@ -1,10 +1,10 @@
import win32com.client #import win32com.client
import time import time
import os import os
from datetime import datetime, timedelta from datetime import datetime, timedelta
import pandas as pd import pandas as pd
from enum import Enum from enum import Enum
#import plotly.graph_objects as go import plotly.graph_objects as go
from stockpredictor.analysis.Common import Common from stockpredictor.analysis.Common import Common
# enum 주문 상태 세팅용 # enum 주문 상태 세팅용
@@ -519,13 +519,13 @@ class HTS:
close_df = pd.DataFrame(close) close_df = pd.DataFrame(close)
avg5_list = close_df.rolling(window=3).mean().fillna(close[0]).values.tolist() avg5_list = close_df.rolling(window=3).mean().fillna(close[0]).values.tolist()
avg5 = [item[0] for item in avg5_list] avg5 = [item[0] for item in avg5_list]
avg20_list = close_df.rolling(window=5).mean().fillna(close[0]).values.tolist() avg20_list = close_df.rolling(window=10).mean().fillna(close[0]).values.tolist()
avg20 = [item[0] for item in avg20_list] avg20 = [item[0] for item in avg20_list]
avg60_list = close_df.rolling(window=10).mean().fillna(close[0]).values.tolist() avg60_list = close_df.rolling(window=20).mean().fillna(close[0]).values.tolist()
avg60 = [item[0] for item in avg60_list] avg60 = [item[0] for item in avg60_list]
avg120_list = close_df.rolling(window=20).mean().fillna(close[0]).values.tolist() avg120_list = close_df.rolling(window=40).mean().fillna(close[0]).values.tolist()
avg120 = [item[0] for item in avg120_list] avg120 = [item[0] for item in avg120_list]
avg240_list = close_df.rolling(window=40).mean().fillna(close[0]).values.tolist() avg240_list = close_df.rolling(window=80).mean().fillna(close[0]).values.tolist()
avg240 = [item[0] for item in avg240_list] avg240 = [item[0] for item in avg240_list]
upper, lower = [], [] upper, lower = [], []
@@ -605,6 +605,38 @@ class HTS:
if temp_status != "": if temp_status != "":
status.add(temp_status) status.add(temp_status)
# 돌파 체크
temp_status = self.common.check_Dolpa(STOCK, last_index, "5", "20")
if temp_status != "":
status.add(temp_status)
temp_status = self.common.check_Dolpa(STOCK, last_index, "5", "60")
if temp_status != "":
status.add(temp_status)
temp_status = self.common.check_Dolpa(STOCK, last_index, "5", "120")
if temp_status != "":
status.add(temp_status)
temp_status = self.common.check_Dolpa(STOCK, last_index, "5", "240")
if temp_status != "":
status.add(temp_status)
temp_status = self.common.check_Dolpa(STOCK, last_index, "20", "60")
if temp_status != "":
status.add(temp_status)
temp_status = self.common.check_Dolpa(STOCK, last_index, "20", "120")
if temp_status != "":
status.add(temp_status)
temp_status = self.common.check_Dolpa(STOCK, last_index, "20", "240")
if temp_status != "":
status.add(temp_status)
temp_status = self.common.check_Dolpa(STOCK, last_index, "60", "120")
if temp_status != "":
status.add(temp_status)
temp_status = self.common.check_Dolpa(STOCK, last_index, "60", "240")
if temp_status != "":
status.add(temp_status)
temp_status = self.common.check_Dolpa(STOCK, last_index, "120", "240")
if temp_status != "":
status.add(temp_status)
# 20일선 돌파 # 20일선 돌파
temp_status = self.common.check_Dolpa_Jiji(STOCK, last_index, '20') temp_status = self.common.check_Dolpa_Jiji(STOCK, last_index, '20')
if temp_status != "": if temp_status != "":
@@ -733,7 +765,7 @@ class HTS:
size = len(data["Close"]) size = len(data["Close"])
STOCK = [] STOCK = []
for i in range(size): for i in range(size):
STOCK.append({'volume': data['Volume'][i], 'close': data["Close"][i], 'open': data["Open"][i], 'high': data["High"][i], 'low': data["Low"][i], 'avg5': data["avg5"][i], 'avg20': data["avg20"][i], 'avg60': data["avg60"][i], 'avg120': data["avg120"][i]}) STOCK.append({'volume': data['Volume'][i], 'close': data["Close"][i], 'open': data["Open"][i], 'high': data["High"][i], 'low': data["Low"][i], 'avg5': data["avg5"][i], 'avg20': data["avg20"][i], 'avg60': data["avg60"][i], 'avg120': data["avg120"][i], 'avg240': data["avg240"][i]})
bsLine = {} bsLine = {}
bsLine['buy'] = [-1 for i in range(size)] bsLine['buy'] = [-1 for i in range(size)]
@@ -742,16 +774,26 @@ class HTS:
i = size - 1 i = size - 1
status = self.checkStatus(STOCK, i) status = self.checkStatus(STOCK, i)
count_1 = 0 count_1 = 0
if "arrange_" in status: count_1 += 1 # if "GOLDEN#2_" in status: count_1 += 1
# if "arrange_" in status: count_1 += 1
# if "UMYANG_" in status: count_1 += 1
# if "5-20_" in status: count_1 += 1
if "5_20_" in status: count_1 += 1
if "5_60_" in status: count_1 += 1
if "5_120_" in status: count_1 += 1
if "5_240_" in status: count_1 += 1
if "20_60_" in status: count_1 += 1
if "20_120_" in status: count_1 += 1
if "20_240_" in status: count_1 += 1
if "60_120_" in status: count_1 += 1
if "60_240_" in status: count_1 += 1
if "120_240_" in status: count_1 += 1
if "arrange_" in status and "HIGHERUMBONG_" in status: count_1 += 1 if "arrange_" in status and "HIGHERUMBONG_" in status: count_1 += 1
if "20_" in status: count_1 += 1 if "20_" in status: count_1 += 1
if "60_" in status: count_1 += 1 if "60_" in status: count_1 += 1
if "120_" in status: count_1 += 1 if "120_" in status: count_1 += 1
if "240_" in status: count_1 += 1 if "240_" in status: count_1 += 1
if "5-20_" in status: count_1 += 1
if "GOLDEN#2_" in status: count_1 += 1
if "GOLDEN#3_" in status: count_1 += 1 if "GOLDEN#3_" in status: count_1 += 1
if "UMYANG_" in status: count_1 += 1
if "DOJI_" in status: count_1 += 1 if "DOJI_" in status: count_1 += 1
if "DRAGONEFLY_" in status: count_1 += 1 if "DRAGONEFLY_" in status: count_1 += 1
if "HAMMER_" in status: count_1 += 1 if "HAMMER_" in status: count_1 += 1
@@ -782,7 +824,7 @@ class HTS:
size = len(data["Close"]) size = len(data["Close"])
STOCK = [] STOCK = []
for i in range(size): for i in range(size):
STOCK.append({'volume': data['Volume'][i], 'close': data["Close"][i], 'open': data["Open"][i], 'high': data["High"][i], 'low': data["Low"][i], 'avg5': data["avg5"][i], 'avg20': data["avg20"][i], 'avg60': data["avg60"][i], 'avg120': data["avg120"][i]}) STOCK.append({'volume': data['Volume'][i], 'close': data["Close"][i], 'open': data["Open"][i], 'high': data["High"][i], 'low': data["Low"][i], 'avg5': data["avg5"][i], 'avg20': data["avg20"][i], 'avg60': data["avg60"][i], 'avg120': data["avg120"][i], 'avg240': data["avg240"][i]})
bsLine = {} bsLine = {}
bsLine['buy'] = [-1 for i in range(len(lower))] bsLine['buy'] = [-1 for i in range(len(lower))]
@@ -791,16 +833,26 @@ class HTS:
for i in range(5, size-5): for i in range(5, size-5):
status = self.checkStatus(STOCK, i) status = self.checkStatus(STOCK, i)
count_1 = 0 count_1 = 0
if "arrange_" in status: count_1 += 1 #if "GOLDEN#2_" in status: count_1 += 1
#if "arrange_" in status: count_1 += 1
#if "UMYANG_" in status: count_1 += 1
#if "5-20_" in status: count_1 += 1
if "5_20_" in status: count_1 += 1
if "5_60_" in status: count_1 += 1
if "5_120_" in status: count_1 += 1
if "5_240_" in status: count_1 += 1
if "20_60_" in status: count_1 += 1
if "20_120_" in status: count_1 += 1
if "20_240_" in status: count_1 += 1
if "60_120_" in status: count_1 += 1
if "60_240_" in status: count_1 += 1
if "120_240_" in status: count_1 += 1
if "arrange_" in status and "HIGHERUMBONG_" in status: count_1 += 1 if "arrange_" in status and "HIGHERUMBONG_" in status: count_1 += 1
if "20_" in status: count_1 += 1 if "20_" in status: count_1 += 1
if "60_" in status: count_1 += 1 if "60_" in status: count_1 += 1
if "120_" in status: count_1 += 1 if "120_" in status: count_1 += 1
if "240_" in status: count_1 += 1 if "240_" in status: count_1 += 1
if "5-20_" in status: count_1 += 1
if "GOLDEN#2_" in status: count_1 += 1
if "GOLDEN#3_" in status: count_1 += 1 if "GOLDEN#3_" in status: count_1 += 1
if "UMYANG_" in status: count_1 += 1
if "DOJI_" in status: count_1 += 1 if "DOJI_" in status: count_1 += 1
if "DRAGONEFLY_" in status: count_1 += 1 if "DRAGONEFLY_" in status: count_1 += 1
if "HAMMER_" in status: count_1 += 1 if "HAMMER_" in status: count_1 += 1
@@ -857,7 +909,7 @@ class HTS:
def buyRealTime(self, stock_code, given_day): def buyRealTime(self, stock_code, given_day):
PREVIOUS_PRICE = 0 PREVIOUS_PRICE = 0
BUY_COUNT = 100 BUY_COUNT = 200
TOTAL_BUY_AMT = 0 TOTAL_BUY_AMT = 0
logFp = open(given_day+".log", "w") logFp = open(given_day+".log", "w")
@@ -894,23 +946,23 @@ class HTS:
if bs_buy_price > 0: if bs_buy_price > 0:
if PREVIOUS_PRICE > 0: if PREVIOUS_PRICE > 0:
if PREVIOUS_PRICE > bs_buy_price: if PREVIOUS_PRICE > bs_buy_price:
if BUY_COUNT > 140: if BUY_COUNT > 240:
BUY_COUNT = 240
if BUY_COUNT <= 140:
BUY_COUNT = 140 BUY_COUNT = 140
if BUY_COUNT <= 40:
BUY_COUNT = 40
BUY_COUNT += 10 BUY_COUNT += 10
elif PREVIOUS_PRICE < bs_buy_price: elif PREVIOUS_PRICE < bs_buy_price:
if BUY_COUNT > 160: if BUY_COUNT > 250:
BUY_COUNT = 260
if BUY_COUNT <= 150:
BUY_COUNT = 160 BUY_COUNT = 160
if BUY_COUNT <= 60:
BUY_COUNT = 60
BUY_COUNT -= 10 BUY_COUNT -= 10
PREVIOUS_PRICE = bs_buy_price PREVIOUS_PRICE = bs_buy_price
# 매수 주문 # 매수 주문
# 현재까지 매입금액이 7백만원 이하일 때만 매수를 한다. # 현재까지 매입금액이 7백만원 이하일 때만 매수를 한다.
if TOTAL_BUY_AMT < 2000000: if TOTAL_BUY_AMT < 5000000:
self.requestOrder("2", stock_code, BUY_COUNT , bs_buy_price) self.requestOrder("2", stock_code, BUY_COUNT , bs_buy_price)
## 매도 주문 (아래 잔고를 체크해서 매도를 호출하는 것으로 시도한다.) ## 매도 주문 (아래 잔고를 체크해서 매도를 호출하는 것으로 시도한다.)
@@ -929,6 +981,10 @@ class HTS:
logFp.write("%s,%s,\n" % ("NONE", second)) logFp.write("%s,%s,\n" % ("NONE", second))
logFp.flush() logFp.flush()
# 60일 선이 꺾여서 하락 중일 경우만 바로 매도를 한다.
size = len(data["avg60"])
if data["avg60"][size-2] > data["avg60"][size-1]:
# 만약 잔고가 있으면 장부가보다 5원 높게 매도한다. # 만약 잔고가 있으면 장부가보다 5원 높게 매도한다.
jangoDic = self.requstJango() jangoDic = self.requstJango()
if jangoDic and len(jangoDic.keys()) > 0: if jangoDic and len(jangoDic.keys()) > 0:
@@ -962,20 +1018,20 @@ if __name__ == "__main__":
RESOURCE_DIR = PROJECT_HOME + "/resources/analysis/"+today.strftime("%Y%m%d") RESOURCE_DIR = PROJECT_HOME + "/resources/analysis/"+today.strftime("%Y%m%d")
stock_codes = ["252670", "122630"] stock_codes = ["252670", "122630"]
given_days = ['20210901','20210902','20210903','20210906','20210907','20210908','20210909','20210910','20210913','20210914','20210915','20210916','20210917','20210923','20210924','20210927','20210928','20210929','20210930','20211001'] stock_codes = ["252670"]
given_days = ['20210901','20210902','20210903','20210906','20210907','20210908','20210909','20210910','20210913','20210914','20210915','20210916','20210917','20210923','20210924','20210927','20210928','20210929','20210930','20211001', '20211005']
hts = HTS() hts = HTS()
#hts.all_stocks() #hts.all_stocks()
#hts.getChartData(stock_codes) #hts.getChartData(stock_codes)
#hts.currentStock(stock_codes) #hts.currentStock(stock_codes)
#for given_day in given_days: for given_day in given_days:
#hts.writeStockData(stock_codes, given_day) #hts.writeStockData(stock_codes, given_day)
#for stock_code in stock_codes: for stock_code in stock_codes:
#hts.simulate(stock_code, given_day) hts.simulate(stock_code, given_day)
given_day = datetime.today().strftime('%Y%m%d') #given_day = datetime.today().strftime('%Y%m%d')
#hts.writeStockData(stock_codes, given_day) #hts.buyRealTime(stock_codes[0], given_day)
hts.buyRealTime(stock_codes[0], given_day)
print ("done...") print ("done...")

View File

@@ -420,6 +420,13 @@ class Common:
return "STOCHASTIC#2_" return "STOCHASTIC#2_"
return "" return ""
def check_Dolpa(self, stock, i, avg1, avg2):
upper_index = 0
if len(stock) > 2:
if stock[i-1]["avg"+avg1] < stock[i-1]["avg"+avg2] and stock[i]["avg"+avg1] > stock[i]["avg"+avg2]:
return avg1+"_"+avg2+"_"
return ""
def check_Dolpa_Jiji(self, stock, i, day='20'): def check_Dolpa_Jiji(self, stock, i, day='20'):
upper_index = 0 upper_index = 0
if len(stock) > 5: if len(stock) > 5: