init
This commit is contained in:
174
hts/HTS.py
174
hts/HTS.py
@@ -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 주문 상태 세팅용
|
||||||
@@ -517,16 +517,24 @@ class HTS:
|
|||||||
vol = result["vol"]
|
vol = result["vol"]
|
||||||
|
|
||||||
close_df = pd.DataFrame(close)
|
close_df = pd.DataFrame(close)
|
||||||
avg5_list = close_df.rolling(window=3).mean().fillna(close[0]).values.tolist()
|
avg1_list = close_df.rolling(window=1).mean().fillna(close[0]).values.tolist()
|
||||||
|
avg1 = [item[0] for item in avg1_list]
|
||||||
|
avg2_list = close_df.rolling(window=2).mean().fillna(close[0]).values.tolist()
|
||||||
|
avg2 = [item[0] for item in avg2_list]
|
||||||
|
avg5_list = close_df.rolling(window=5).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=10).mean().fillna(close[0]).values.tolist()
|
avg10_list = close_df.rolling(window=10).mean().fillna(close[0]).values.tolist()
|
||||||
|
avg10 = [item[0] for item in avg10_list]
|
||||||
|
avg20_list = close_df.rolling(window=20).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=20).mean().fillna(close[0]).values.tolist()
|
avg30_list = close_df.rolling(window=30).mean().fillna(close[0]).values.tolist()
|
||||||
|
avg30 = [item[0] for item in avg30_list]
|
||||||
|
avg40_list = close_df.rolling(window=40).mean().fillna(close[0]).values.tolist()
|
||||||
|
avg40 = [item[0] for item in avg40_list]
|
||||||
|
avg50_list = close_df.rolling(window=50).mean().fillna(close[0]).values.tolist()
|
||||||
|
avg50 = [item[0] for item in avg50_list]
|
||||||
|
avg60_list = close_df.rolling(window=60).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=30).mean().fillna(close[0]).values.tolist()
|
|
||||||
avg120 = [item[0] for item in avg120_list]
|
|
||||||
avg240_list = close_df.rolling(window=40).mean().fillna(close[0]).values.tolist()
|
|
||||||
avg240 = [item[0] for item in avg240_list]
|
|
||||||
|
|
||||||
upper, lower = [], []
|
upper, lower = [], []
|
||||||
for i in range(len(upper_df)):
|
for i in range(len(upper_df)):
|
||||||
@@ -539,7 +547,7 @@ class HTS:
|
|||||||
|
|
||||||
point_temp = result["time"]
|
point_temp = result["time"]
|
||||||
|
|
||||||
temp = {"Date": point_temp, "Open": open, "High": high, "Low": low, "Close": close, "Volume": vol, "avg5": avg5, "avg20": avg20, "avg60": avg60, "avg120": avg120, "avg240": avg240}
|
temp = {"Date": point_temp, "Open": open, "High": high, "Low": low, "Close": close, "Volume": vol, "avg1": avg1, "avg2": avg2, "avg5": avg5, "avg10": avg10, "avg20": avg20, "avg30": avg30, "avg40": avg40, "avg50": avg50, "avg60": avg60}
|
||||||
data = pd.DataFrame(temp)
|
data = pd.DataFrame(temp)
|
||||||
df_final_time = pd.DatetimeIndex(point_temp)
|
df_final_time = pd.DatetimeIndex(point_temp)
|
||||||
data.index = df_final_time
|
data.index = df_final_time
|
||||||
@@ -556,11 +564,15 @@ class HTS:
|
|||||||
data['Low'] = pd.to_numeric(data['Low'])
|
data['Low'] = pd.to_numeric(data['Low'])
|
||||||
data['Close'] = pd.to_numeric(data['Close'])
|
data['Close'] = pd.to_numeric(data['Close'])
|
||||||
data['Volume'] = pd.to_numeric(data['Volume'])
|
data['Volume'] = pd.to_numeric(data['Volume'])
|
||||||
|
data['avg1'] = pd.to_numeric(data['avg1'])
|
||||||
|
data['avg2'] = pd.to_numeric(data['avg2'])
|
||||||
data['avg5'] = pd.to_numeric(data['avg5'])
|
data['avg5'] = pd.to_numeric(data['avg5'])
|
||||||
|
data['avg10'] = pd.to_numeric(data['avg10'])
|
||||||
data['avg20'] = pd.to_numeric(data['avg20'])
|
data['avg20'] = pd.to_numeric(data['avg20'])
|
||||||
|
data['avg30'] = pd.to_numeric(data['avg30'])
|
||||||
|
data['avg40'] = pd.to_numeric(data['avg40'])
|
||||||
|
data['avg50'] = pd.to_numeric(data['avg50'])
|
||||||
data['avg60'] = pd.to_numeric(data['avg60'])
|
data['avg60'] = pd.to_numeric(data['avg60'])
|
||||||
data['avg120'] = pd.to_numeric(data['avg120'])
|
|
||||||
data['avg240'] = pd.to_numeric(data['avg240'])
|
|
||||||
|
|
||||||
buy_colors = []
|
buy_colors = []
|
||||||
for i in range(len(buy_line)):
|
for i in range(len(buy_line)):
|
||||||
@@ -582,17 +594,21 @@ class HTS:
|
|||||||
sell_check = go.Scatter(x=data['Date'], y=sell_line, mode='markers', name="sell", marker=dict(size=14, color=sell_colors, line_width=0))
|
sell_check = go.Scatter(x=data['Date'], y=sell_line, mode='markers', name="sell", marker=dict(size=14, color=sell_colors, line_width=0))
|
||||||
bolinger_upper = go.Scatter(x=data['Date'], y=upper, name="upper", line_color='#8B4513')
|
bolinger_upper = go.Scatter(x=data['Date'], y=upper, name="upper", line_color='#8B4513')
|
||||||
bolinger_lower = go.Scatter(x=data['Date'], y=lower, name="lower", line_color='#8B4513')
|
bolinger_lower = go.Scatter(x=data['Date'], y=lower, name="lower", line_color='#8B4513')
|
||||||
avg5 = go.Scatter(x=data['Date'], y=data['avg5'], name="avg5", line_color='#FF0000')
|
avg1 = go.Scatter(x=data['Date'], y=data['avg1'], name="avg1", line_color='#FF0000')
|
||||||
avg20 = go.Scatter(x=data['Date'], y=data['avg20'], name="avg20", line_color='#F43B86')
|
avg2 = go.Scatter(x=data['Date'], y=data['avg2'], name="avg2", line_color='#A200FF')
|
||||||
avg60 = go.Scatter(x=data['Date'], y=data['avg60'], name="avg60", line_color='#F0A500')
|
avg5 = go.Scatter(x=data['Date'], y=data['avg5'], name="avg5", line_color='#0800FF')
|
||||||
avg120 = go.Scatter(x=data['Date'], y=data['avg120'], name="avg120", line_color='#14279B')
|
avg10 = go.Scatter(x=data['Date'], y=data['avg10'], name="avg10", line_color='#FF7C00')
|
||||||
avg240 = go.Scatter(x=data['Date'], y=data['avg240'], name="avg240", line_color='#000000')
|
avg20 = go.Scatter(x=data['Date'], y=data['avg20'], name="avg20", line_color='#00AAFF')
|
||||||
|
avg30 = go.Scatter(x=data['Date'], y=data['avg30'], name="avg30", line_color='#FFD100')
|
||||||
|
avg40 = go.Scatter(x=data['Date'], y=data['avg40'], name="avg40", line_color='#A600FF')
|
||||||
|
avg50 = go.Scatter(x=data['Date'], y=data['avg50'], name="avg50", line_color='#FF00E0')
|
||||||
|
avg60 = go.Scatter(x=data['Date'], y=data['avg60'], name="avg60", line_color='#000000')
|
||||||
|
|
||||||
|
|
||||||
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')
|
||||||
|
|
||||||
# 그래프를 그린다.
|
# 그래프를 그린다.
|
||||||
fig = go.Figure(data=[candle_stick, bolinger_upper, bolinger_lower, buy_check, sell_check, avg5, avg20, avg60, avg120, avg240])
|
fig = go.Figure(data=[candle_stick, bolinger_upper, bolinger_lower, buy_check, sell_check, avg1, avg2, avg5, avg10, avg20, avg30, avg40, avg50, avg60])
|
||||||
fig.update_layout(title=stock_code + "_" + given_day)
|
fig.update_layout(title=stock_code + "_" + given_day)
|
||||||
fig.show()
|
fig.show()
|
||||||
return
|
return
|
||||||
@@ -772,6 +788,7 @@ class HTS:
|
|||||||
bsLine['sell'] = [-1 for i in range(size)]
|
bsLine['sell'] = [-1 for i in range(size)]
|
||||||
|
|
||||||
i = size - 1
|
i = size - 1
|
||||||
|
"""
|
||||||
status = self.checkStatus(STOCK, i)
|
status = self.checkStatus(STOCK, i)
|
||||||
count_1 = 0
|
count_1 = 0
|
||||||
# if "GOLDEN#2_" in status: count_1 += 1
|
# if "GOLDEN#2_" in status: count_1 += 1
|
||||||
@@ -816,7 +833,12 @@ class HTS:
|
|||||||
if count_0 > 0:
|
if count_0 > 0:
|
||||||
bsLine['buy'][i] = 0
|
bsLine['buy'][i] = 0
|
||||||
bsLine['sell'][i] = STOCK[i]['close'] + 5
|
bsLine['sell'][i] = STOCK[i]['close'] + 5
|
||||||
|
"""
|
||||||
|
|
||||||
|
if STOCK[i]['low'] < lower[i]:
|
||||||
|
bsLine['buy'][i] = STOCK[i]['close'] - 5
|
||||||
|
if STOCK[i]['close'] > upper[i]:
|
||||||
|
bsLine['sell'][i] = STOCK[i]['close'] + 5
|
||||||
return bsLine['buy'][i], bsLine['sell'][i]
|
return bsLine['buy'][i], bsLine['sell'][i]
|
||||||
|
|
||||||
|
|
||||||
@@ -824,13 +846,14 @@ 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], 'avg240': data["avg240"][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["avg2"][i], 'avg20': data["avg5"][i], 'avg60': data["avg10"][i], 'avg120': data["avg20"][i], 'avg240': data["avg30"][i]})
|
||||||
|
|
||||||
bsLine = {}
|
bsLine = {}
|
||||||
bsLine['buy'] = [-1 for i in range(len(lower))]
|
bsLine['buy'] = [-1 for i in range(len(lower))]
|
||||||
bsLine['sell'] = [-1 for i in range(len(lower))]
|
bsLine['sell'] = [-1 for i in range(len(lower))]
|
||||||
|
|
||||||
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 "GOLDEN#2_" in status: count_1 += 1
|
#if "GOLDEN#2_" in status: count_1 += 1
|
||||||
@@ -876,7 +899,12 @@ class HTS:
|
|||||||
# bsLine['sell'][i + 2] = STOCK[i]['close'] + 5
|
# bsLine['sell'][i + 2] = STOCK[i]['close'] + 5
|
||||||
if data["avg60"][i - 1] > data["avg60"][i]:
|
if data["avg60"][i - 1] > data["avg60"][i]:
|
||||||
bsLine['sell'][i] = STOCK[i]['close']
|
bsLine['sell'][i] = STOCK[i]['close']
|
||||||
|
"""
|
||||||
|
|
||||||
|
if STOCK[i]['low'] < lower[i]:
|
||||||
|
bsLine['buy'][i] = STOCK[i]['close'] - 5
|
||||||
|
if STOCK[i]['close'] > upper[i]:
|
||||||
|
bsLine['sell'][i] = STOCK[i]['close'] + 5
|
||||||
return bsLine
|
return bsLine
|
||||||
|
|
||||||
|
|
||||||
@@ -911,7 +939,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 = 200
|
BUY_COUNT = 100
|
||||||
TOTAL_BUY_AMT = 0
|
TOTAL_BUY_AMT = 0
|
||||||
|
|
||||||
logFp = open(given_day+".log", "w")
|
logFp = open(given_day+".log", "w")
|
||||||
@@ -927,72 +955,67 @@ class HTS:
|
|||||||
"low": [],
|
"low": [],
|
||||||
"vol": []}
|
"vol": []}
|
||||||
|
|
||||||
avg60_1 = 0
|
|
||||||
avg60_2 = 0
|
|
||||||
final_price = 0
|
final_price = 0
|
||||||
print ("START...")
|
print ("START...")
|
||||||
while datetime.strptime(given_day + " 083000", '%Y%m%d %H%M%S') < datetime.now() < datetime.strptime(given_day + " 151600", '%Y%m%d %H%M%S'):
|
while datetime.strptime(given_day + " 083000", '%Y%m%d %H%M%S') < datetime.now() < datetime.strptime(given_day + " 15200", '%Y%m%d %H%M%S'):
|
||||||
second = datetime.now().strftime('%Y%m%d %H%M%S')
|
second = datetime.now().strftime('%Y%m%d %H%M%S')
|
||||||
|
|
||||||
if second in timecheck and not timecheck[second]:
|
if datetime.now() < datetime.strptime(given_day + " 144000", '%Y%m%d %H%M%S'):
|
||||||
print("TIMECHECK", second)
|
if second in timecheck and not timecheck[second]:
|
||||||
logFp.write("%s,%s,\n" %("TIMECHECK", second))
|
print("TIMECHECK", second)
|
||||||
logFp.flush()
|
logFp.write("%s,%s,\n" %("TIMECHECK", second))
|
||||||
|
logFp.flush()
|
||||||
|
|
||||||
# 데이터를 가지고 온다.
|
# 데이터를 가지고 온다.
|
||||||
self.getRealTime(stock_code, given_day, result)
|
self.getRealTime(stock_code, given_day, result)
|
||||||
|
|
||||||
# 분석을 통해서 볼린저밴드 상/하단을 계산한다.
|
# 분석을 통해서 볼린저밴드 상/하단을 계산한다.
|
||||||
data, upper, lower = self.analyze(result)
|
data, upper, lower = self.analyze(result)
|
||||||
avg60_2 = data['avg60'][len(data['avg60']) - 2]
|
final_price = data["Close"][len(data["Close"])- 1]
|
||||||
avg60_1 = data['avg60'][len(data['avg60']) - 1]
|
# 사야 할 시점/가격과 팔아야 할 시점/가격을 체크한다.
|
||||||
final_price = data["Close"][len(data["Close"])- 1]
|
bs_buy_price, bs_sell_price = self.checkTransaction_Realtime(data, upper, lower)
|
||||||
# 사야 할 시점/가격과 팔아야 할 시점/가격을 체크한다.
|
|
||||||
bs_buy_price, bs_sell_price = self.checkTransaction_Realtime(data, upper, lower)
|
|
||||||
|
|
||||||
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 > 240:
|
if BUY_COUNT > 140:
|
||||||
BUY_COUNT = 240
|
BUY_COUNT = 140
|
||||||
if BUY_COUNT <= 140:
|
if BUY_COUNT <= 40:
|
||||||
BUY_COUNT = 140
|
BUY_COUNT = 40
|
||||||
BUY_COUNT += 10
|
BUY_COUNT += 10
|
||||||
elif PREVIOUS_PRICE < bs_buy_price:
|
elif PREVIOUS_PRICE < bs_buy_price:
|
||||||
if BUY_COUNT > 250:
|
if BUY_COUNT > 150:
|
||||||
BUY_COUNT = 260
|
BUY_COUNT = 160
|
||||||
if BUY_COUNT <= 150:
|
if BUY_COUNT <= 50:
|
||||||
BUY_COUNT = 160
|
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 < 7000000:
|
if TOTAL_BUY_AMT < 7000000:
|
||||||
self.requestOrder("2", stock_code, BUY_COUNT , bs_buy_price)
|
self.requestOrder("2", stock_code, BUY_COUNT , bs_buy_price)
|
||||||
|
|
||||||
## 매도 주문 (아래 잔고를 체크해서 매도를 호출하는 것으로 시도한다.)
|
print("BUY", second, bs_buy_price)
|
||||||
#time.sleep(60)
|
logFp.write("%s,%s, %d\n" % ("BUY", second, bs_buy_price))
|
||||||
#self.requestOrder("1", stock_code, BUY_COUNT , price + 5)
|
logFp.flush()
|
||||||
print("BUY", second, bs_buy_price)
|
|
||||||
logFp.write("%s,%s, %d\n" % ("BUY", second, bs_buy_price))
|
|
||||||
logFp.flush()
|
|
||||||
|
|
||||||
# 가져온 만큼 데이터를 누적해서 파일로 작성한다.
|
if bs_sell_price > 0:
|
||||||
self.write(given_day, result)
|
jangoDic = self.requstJango()
|
||||||
|
if jangoDic and len(jangoDic.keys()) > 0:
|
||||||
|
for code in jangoDic:
|
||||||
|
TOTAL_BUY_AMT = jangoDic[code]['매입금액']
|
||||||
|
if jangoDic[code]['매도가능'] > 0:
|
||||||
|
self.requestOrder("1", stock_code, jangoDic[code]['매도가능'], bs_sell_price)
|
||||||
|
|
||||||
|
timecheck[second] = True
|
||||||
|
else:
|
||||||
|
#print("NONE", second)
|
||||||
|
logFp.write("%s,%s,\n" % ("NONE", second))
|
||||||
|
logFp.flush()
|
||||||
|
|
||||||
timecheck[second] = True
|
|
||||||
else:
|
else:
|
||||||
#print("NONE", second)
|
|
||||||
logFp.write("%s,%s,\n" % ("NONE", second))
|
|
||||||
logFp.flush()
|
|
||||||
|
|
||||||
|
|
||||||
# 60일 선이 꺾여서 하락 중일 경우만 바로 매도를 한다.
|
|
||||||
if (((avg60_1 != 0 and avg60_2 != 0) and avg60_2 > avg60_1) or
|
|
||||||
(datetime.now() >= datetime.strptime(given_day + " 151500", '%Y%m%d %H%M%S')) or
|
|
||||||
(datetime.now() < datetime.strptime(given_day + " 090503", '%Y%m%d %H%M%S'))):
|
|
||||||
# 만약 잔고가 있으면 장부가보다 5원 높게 매도한다.
|
# 만약 잔고가 있으면 장부가보다 5원 높게 매도한다.
|
||||||
jangoDic = self.requstJango()
|
jangoDic = self.requstJango()
|
||||||
if jangoDic and len(jangoDic.keys()) > 0:
|
if jangoDic and len(jangoDic.keys()) > 0:
|
||||||
@@ -1015,6 +1038,7 @@ class HTS:
|
|||||||
else:
|
else:
|
||||||
# 장부가의 마지막 자리수가 7,8,9 라면 (2097, 2098, 2099 -> 2105 에 매도)
|
# 장부가의 마지막 자리수가 7,8,9 라면 (2097, 2098, 2099 -> 2105 에 매도)
|
||||||
self.requestOrder("1", stock_code, jangoDic[code]['매도가능'], sell_price + 15)
|
self.requestOrder("1", stock_code, jangoDic[code]['매도가능'], sell_price + 15)
|
||||||
|
break
|
||||||
|
|
||||||
time.sleep(0.9)
|
time.sleep(0.9)
|
||||||
|
|
||||||
@@ -1038,11 +1062,13 @@ if __name__ == "__main__":
|
|||||||
#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)
|
||||||
#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.writeStockData(stock_codes, given_day)
|
||||||
|
hts.simulate(stock_codes[0], given_day)
|
||||||
#hts.buyRealTime(stock_codes[0], given_day)
|
#hts.buyRealTime(stock_codes[0], given_day)
|
||||||
|
|
||||||
print ("done...")
|
print ("done...")
|
||||||
|
|||||||
@@ -520,10 +520,16 @@ class HTS:
|
|||||||
ma5 = [item[0] for item in ma5_list]
|
ma5 = [item[0] for item in ma5_list]
|
||||||
ma10_list = close_df.rolling(window=10).mean().fillna(close[0]).values.tolist()
|
ma10_list = close_df.rolling(window=10).mean().fillna(close[0]).values.tolist()
|
||||||
ma10 = [item[0] for item in ma10_list]
|
ma10 = [item[0] for item in ma10_list]
|
||||||
ma15_list = close_df.rolling(window=15).mean().fillna(close[0]).values.tolist()
|
|
||||||
ma15 = [item[0] for item in ma15_list]
|
|
||||||
ma20_list = close_df.rolling(window=20).mean().fillna(close[0]).values.tolist()
|
ma20_list = close_df.rolling(window=20).mean().fillna(close[0]).values.tolist()
|
||||||
ma20 = [item[0] for item in ma20_list]
|
ma20 = [item[0] for item in ma20_list]
|
||||||
|
ma30_list = close_df.rolling(window=30).mean().fillna(close[0]).values.tolist()
|
||||||
|
ma30 = [item[0] for item in ma30_list]
|
||||||
|
ma40_list = close_df.rolling(window=40).mean().fillna(close[0]).values.tolist()
|
||||||
|
ma40 = [item[0] for item in ma40_list]
|
||||||
|
ma50_list = close_df.rolling(window=50).mean().fillna(close[0]).values.tolist()
|
||||||
|
ma50 = [item[0] for item in ma50_list]
|
||||||
|
ma60_list = close_df.rolling(window=60).mean().fillna(close[0]).values.tolist()
|
||||||
|
ma60 = [item[0] for item in ma60_list]
|
||||||
|
|
||||||
upper, lower = [], []
|
upper, lower = [], []
|
||||||
for i in range(len(upper_df)):
|
for i in range(len(upper_df)):
|
||||||
@@ -538,7 +544,7 @@ class HTS:
|
|||||||
upper_temp = [upper[i] for i in range(size) if i % window == 0]
|
upper_temp = [upper[i] for i in range(size) if i % window == 0]
|
||||||
lower_temp = [lower[i] for i in range(size) if i % window == 0]
|
lower_temp = [lower[i] for i in range(size) if i % window == 0]
|
||||||
|
|
||||||
temp = {"Date": point_temp, "Open": open, "High": high, "Low": low, "Close": close, "Volume": vol, "ma2": ma2, "ma5": ma5, "ma10": ma10, "ma15": ma15, "ma20": ma20}
|
temp = {"Date": point_temp, "Open": open, "High": high, "Low": low, "Close": close, "Volume": vol, "ma2": ma2, "ma5": ma5, "ma10": ma10, "ma20": ma20, "ma30": ma30, "ma40": ma40, "ma50": ma50, "ma60": ma60}
|
||||||
data = pd.DataFrame(temp)
|
data = pd.DataFrame(temp)
|
||||||
df_final_time = pd.DatetimeIndex(point_temp)
|
df_final_time = pd.DatetimeIndex(point_temp)
|
||||||
data.index = df_final_time
|
data.index = df_final_time
|
||||||
@@ -558,8 +564,11 @@ class HTS:
|
|||||||
data['ma2'] = pd.to_numeric(data['ma2'])
|
data['ma2'] = pd.to_numeric(data['ma2'])
|
||||||
data['ma5'] = pd.to_numeric(data['ma5'])
|
data['ma5'] = pd.to_numeric(data['ma5'])
|
||||||
data['ma10'] = pd.to_numeric(data['ma10'])
|
data['ma10'] = pd.to_numeric(data['ma10'])
|
||||||
data['ma15'] = pd.to_numeric(data['ma15'])
|
|
||||||
data['ma20'] = pd.to_numeric(data['ma20'])
|
data['ma20'] = pd.to_numeric(data['ma20'])
|
||||||
|
data['ma30'] = pd.to_numeric(data['ma30'])
|
||||||
|
data['ma40'] = pd.to_numeric(data['ma40'])
|
||||||
|
data['ma50'] = pd.to_numeric(data['ma50'])
|
||||||
|
data['ma60'] = pd.to_numeric(data['ma60'])
|
||||||
|
|
||||||
buy_colors = []
|
buy_colors = []
|
||||||
for i in range(len(buy_line)):
|
for i in range(len(buy_line)):
|
||||||
@@ -584,14 +593,17 @@ class HTS:
|
|||||||
ma2 = go.Scatter(x=data['Date'], y=data['ma2'], name="ma2", line_color='#FF0000')
|
ma2 = go.Scatter(x=data['Date'], y=data['ma2'], name="ma2", line_color='#FF0000')
|
||||||
ma5 = go.Scatter(x=data['Date'], y=data['ma5'], name="ma5", line_color='#F43B86')
|
ma5 = go.Scatter(x=data['Date'], y=data['ma5'], name="ma5", line_color='#F43B86')
|
||||||
ma10 = go.Scatter(x=data['Date'], y=data['ma10'], name="ma10", line_color='#F0A500')
|
ma10 = go.Scatter(x=data['Date'], y=data['ma10'], name="ma10", line_color='#F0A500')
|
||||||
ma15 = go.Scatter(x=data['Date'], y=data['ma15'], name="ma15", line_color='#14279B')
|
|
||||||
ma20 = go.Scatter(x=data['Date'], y=data['ma20'], name="ma20", line_color='#000000')
|
ma20 = go.Scatter(x=data['Date'], y=data['ma20'], name="ma20", line_color='#000000')
|
||||||
|
ma30 = go.Scatter(x=data['Date'], y=data['ma30'], name="ma30", line_color='#14279B')
|
||||||
|
ma40 = go.Scatter(x=data['Date'], y=data['ma40'], name="ma40", line_color='#14279B')
|
||||||
|
ma50 = go.Scatter(x=data['Date'], y=data['ma50'], name="ma50", line_color='#14279B')
|
||||||
|
ma60 = go.Scatter(x=data['Date'], y=data['ma60'], name="ma60", line_color='#14279B')
|
||||||
|
|
||||||
|
|
||||||
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')
|
||||||
|
|
||||||
# 그래프를 그린다.
|
# 그래프를 그린다.
|
||||||
fig = go.Figure(data=[candle_stick, bolinger_upper, bolinger_lower, buy_check, sell_check, ma2, ma10, ma15, ma20])
|
fig = go.Figure(data=[candle_stick, bolinger_upper, bolinger_lower, buy_check, sell_check, ma2, ma10, ma20, ma30, ma40, ma50, ma60])
|
||||||
fig.update_layout(title=given_day + "_2x")
|
fig.update_layout(title=given_day + "_2x")
|
||||||
fig.show()
|
fig.show()
|
||||||
return
|
return
|
||||||
@@ -602,9 +614,13 @@ class HTS:
|
|||||||
close = data["Close"]
|
close = data["Close"]
|
||||||
open = data["Open"]
|
open = data["Open"]
|
||||||
ma2 = data["ma2"]
|
ma2 = data["ma2"]
|
||||||
|
ma5 = data["ma5"]
|
||||||
ma10 = data["ma10"]
|
ma10 = data["ma10"]
|
||||||
ma15 = data["ma15"]
|
|
||||||
ma20 = data["ma20"]
|
ma20 = data["ma20"]
|
||||||
|
ma30 = data["ma30"]
|
||||||
|
ma40 = data["ma40"]
|
||||||
|
ma50 = data["ma50"]
|
||||||
|
ma60 = data["ma60"]
|
||||||
|
|
||||||
bsLine = {}
|
bsLine = {}
|
||||||
bsLine['buy'] = [-1 for i in range(len(lower))]
|
bsLine['buy'] = [-1 for i in range(len(lower))]
|
||||||
@@ -823,8 +839,11 @@ class HTS:
|
|||||||
ma2 = data["ma2"]
|
ma2 = data["ma2"]
|
||||||
ma5 = data["ma5"]
|
ma5 = data["ma5"]
|
||||||
ma10 = data["ma10"]
|
ma10 = data["ma10"]
|
||||||
ma15 = data["ma15"]
|
|
||||||
ma20 = data["ma20"]
|
ma20 = data["ma20"]
|
||||||
|
ma30 = data["ma30"]
|
||||||
|
ma40 = data["ma40"]
|
||||||
|
ma50 = data["ma50"]
|
||||||
|
ma60 = data["ma60"]
|
||||||
|
|
||||||
# 살 시점인지 체크
|
# 살 시점인지 체크
|
||||||
# 볼린저밴드 하단에 연속으로 같은 가격이 왔을 때,
|
# 볼린저밴드 하단에 연속으로 같은 가격이 왔을 때,
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
time, check
|
time, check
|
||||||
|
090303,False
|
||||||
|
090403,False
|
||||||
090503,False
|
090503,False
|
||||||
090603,False
|
090603,False
|
||||||
090703,False
|
090703,False
|
||||||
|
|||||||
|
Reference in New Issue
Block a user