This commit is contained in:
dosangyoon
2021-09-30 23:19:56 +09:00
parent 5dbfb3e68e
commit 90aa601a18
2 changed files with 250 additions and 26 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
# enum 주문 상태 세팅용 # enum 주문 상태 세팅용
@@ -545,7 +545,10 @@ class HTS:
return data, upper_temp, lower_temp return data, upper_temp, lower_temp
def draw(self, given_day, data, upper, lower, buy_line, sell_line): def draw(self, given_day, data, upper, lower, bsLine):
buy_line = bsLine['buy']
sell_line = bsLine['sell']
# 그래프 설정을 위한 변수를 생성한다. # 그래프 설정을 위한 변수를 생성한다.
data['Open'] = pd.to_numeric(data['Open']) data['Open'] = pd.to_numeric(data['Open'])
data['High'] = pd.to_numeric(data['High']) data['High'] = pd.to_numeric(data['High'])
@@ -588,11 +591,229 @@ class HTS:
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, ma5, ma10, ma15, ma20]) fig = go.Figure(data=[candle_stick, bolinger_upper, bolinger_lower, buy_check, sell_check, ma2, ma10, ma15, ma20])
fig.update_layout(title=given_day + "_2x") fig.update_layout(title=given_day + "_2x")
fig.show() fig.show()
return return
def checkTransaction(self, data, upper, lower):
low = data["Low"]
high = data["High"]
close = data["Close"]
open = data["Open"]
ma2 = data["ma2"]
ma10 = data["ma10"]
ma15 = data["ma15"]
ma20 = data["ma20"]
bsLine = {}
bsLine['buy'] = [-1 for i in range(len(lower))]
bsLine['sell'] = [-1 for i in range(len(lower))]
# buy 체크
for i in range(3, len(lower)):
#1
if close[i] < ma2[i] < lower[i]:
if low[i-2] == open[i-2] < close[i-2] < high[i-2]:
if low[i-1] == close[i-1] < open[i-1] < high[i-1]:
if low[i] == close[i] < open[i] < high[i]:
bsLine['buy'][i+1] = close[i] + 5
bsLine['sell'][i + 1] = close[i] + 15
continue
#2
if lower[i-2] > lower[i-1] and lower[i-1] < lower[i]:
if lower[i-2] > low[i-2]:
if open[i-2] < close[i-2] and open[i-1] < close[i-1] and open[i] < close[i]:
bsLine['buy'][i + 1] = open[i]
bsLine['sell'][i + 1] = open[i] + 10
continue
if lower[i-2] > lower[i-1] > lower[i]:
# 3
if high[i-2] == open[i-2] > close[i-2] > low[i-2] and close[i-2] < ma2[i-2]:
if high[i-1] > open[i-1] > close[i-1] == low[i-1] and close[i-1] < ma2[i-1]:
if ma2[i-1] == ma2[i] and low[i] == open[i] < close[i] < high[i]:
bsLine['buy'][i + 1] = close[i]
bsLine['sell'][i + 1] = close[i] + 10
continue
#4
if upper[i] < upper[i-2] < upper[i-1]:
if ma10[i-2] > ma10[i-1] > ma2[i-2] > ma2[i-1] == ma2[i]:
if high[i-2] == open[i-2] > close[i-2] == low[i-2]:
if high[i-1] == open[i-1] > close[i-1] == low[i-1]:
if high[i] > close[i] > open[i] == low[i]:
bsLine['buy'][i + 1] = close[i]
bsLine['sell'][i + 1] = close[i] + 5
continue
#5
if upper[i-2] > upper[i-1] and upper[i-1] < upper[i]:
if lower[i - 2] > lower[i - 1] and lower[i - 1] < lower[i]:
if open[i-1] < ma2[i-1] and open[i-1]==low[i-1] < close[i-1]==high[i-1]:
if open[i]==low[i] < close[i] == high[i]:
if close[i] > ma2[i] and close[i] > ma10[i] and close[i] > ma15[i] and close[i] > ma20[i]:
bsLine['buy'][i+1] = close[i] + 5
bsLine['sell'][i + 1] = close[i] + 25
continue
#6
if lower[i] < lower[i-2] < lower[i-1]:
if lower[i-2] < low[i-2] < close[i-2] < open[i-2] == high[i-2]:
if low[i-1] < lower[i-1] < close[i-1]==open[i-1] < high[i-1]:
if low[i] < lower[i] < close[i] == open[i] < high[i]:
bsLine['buy'][i + 1] = close[i]
bsLine['sell'][i + 1] = close[i] + 5
continue
#7
if low[i-2] < open[i-2] == close[i-2] == high[i-2]:
if low[i - 1] < open[i - 1] == close[i - 1] == high[i - 1]:
if low[i] < open[i] < close[i] == high[i]:
if ma2[i] < close[i] and ma10[i] < close[i] and ma15[i] < close[i] and ma20[i] < close[i]:
if lower[i-2] < lower[i-1] < lower[i]:
if upper[i-2] > upper[i-1] > upper[i]:
bsLine['buy'][i + 1] = close[i]
bsLine['sell'][i + 1] = close[i] + 10
continue
#8
if low[i-2] < close[i-2] < open[i-2] == high[i-2]:
if low[i-1] < open[i-1] < close[i-1] == high[i-1]:
if low[i] < open[i] < close[i] == high[i]:
if lower[i-1] < lower[i] < lower[i-2]:
if upper[i] < upper[i-2] < upper[i-1]:
bsLine['buy'][i + 1] = open[i]
bsLine['sell'][i + 1] = open[i] + 5
continue
#9
if low[i-2] == open[i-2] < close[i-2] < high[i-2]:
if low[i-1] == close[i-1] < open[i-1] < high[i-1]:
if low[i] < open[i] == close[i] < high[i] and close[i-1] < close[i]:
if low[i-2] == low[i-1] and open[i-2] == close[i-1] and close[i-2] == open[i-1] and high[i-2] == high[i-1]:
bsLine['buy'][i + 1] = open[i]
bsLine['sell'][i + 1] = open[i] + 15
continue
#10
if low[i-2] == close[i-2] < open[i-2] == high[i-2]:
if low[i-1] == open[i-1] < close[i-1] == high[i-1]:
if low[i] == close[i] < open[i] == high[i]:
if high[i-2] == high[i-1] == high[i]:
if low[i-2] == low[i] < low[i-1]:
bsLine['buy'][i + 1] = open[i-1]
bsLine['sell'][i + 1] = open[i-1] + 5
continue
# 11
if low[i-2] < close[i-2] == open[i-2] < high[i-2]:
if low[i-1] < close[i - 1] < open[i - 1] == high[i - 1]:
if low[i] < close[i] == open[i] < high[i]:
if low[i-2] == low[i] and high[i-2] == high[i] and low[i-1] < low[i-2] and high[i-1] < high[i-2]:
if ma2[i - 2] > ma2[i - 1] > ma2[i]:
bsLine['buy'][i + 1] = close[i]
bsLine['sell'][i + 1] = close[i] + 15
continue
# 12
if low[i - 2] < close[i - 2] < open[i - 2] < high[i - 2]:
if low[i - 1] == open[i - 1] < close[i - 1] < high[i - 1]:
if low[i] == open[i] < close[i] == high[i]:
if lower[i-2] > lower[i-1] and ma2[i-2] > ma2[i-1] and ma2[i-1] < ma2[i]:
bsLine['buy'][i + 1] = close[i-1]
bsLine['sell'][i + 1] = close[i-1] + 5
continue
# 13
if low[i-2] == open[i-2] < close[i-2] < high[i-2]:
if low[i-1] == close[i-1] < open[i-1] == high[i-1]:
if low[i] == open[i] < close[i] < high[i]:
if low[i-2] == low[i] > low[i-1]:
bsLine['buy'][i + 1] = close[i]
bsLine['sell'][i + 1] = close[i] + 5
continue
# 14
if low[i-2] < open[i-2] == close[i-2] < high[i-2]:
if low[i-1] < open[i-1] == close[i-1] < high[i-1]:
if low[i] < open[i] == close[i] < high[i]:
if low[i-2] < ma2[i-2] < high[i-2] and low[i-1] < ma2[i-1] < high[i-1] and low[i] < ma2[i] < high[i]:
if high[i - 2] < ma10[i - 2] and high[i - 1] < ma10[i - 1] and high[i] < ma10[i]:
bsLine['buy'][i + 1] = close[i]
bsLine['sell'][i + 1] = close[i] + 5
continue
# 15
if low[i - 2] < close[i - 2] < open[i - 2] == high[i - 2]:
if low[i-2] < lower[i-2] and high[i-2] < upper[i-2]:
if low[i - 1] == open[i - 1] < close[i - 1] <= high[i - 1]:
if low[i - 1] > lower[i - 1] and high[i - 1] < upper[i - 1]:
if low[i] <= open[i] < close[i] == high[i]:
if low[i] > lower[i] and high[i] > upper[i]:
bsLine['buy'][i + 1] = close[i] - 5
bsLine['sell'][i + 1] = close[i] + 5
continue
# 16
if low[i - 3] < close[i - 3] < open[i - 3] == high[i - 3]:
if low[i-3] > lower[i-3] and high[i-3] < upper[i-3]:
if low[i - 2] < close[i - 2] < open[i - 2] == high[i - 2]:
if low[i - 2] < lower[i - 2] and high[i - 2] < upper[i - 2]:
if low[i - 1] <= open[i - 1] < close[i - 1] == high[i - 1]:
if low[i - 1] < lower[i - 1] and high[i - 1] > upper[i - 1]:
if low[i] < open[i] == close[i] < high[i]:
if low[i] < lower[i]:
bsLine['buy'][i + 1] = close[i] - 5
bsLine['sell'][i + 1] = close[i] + 5
continue
# 16
if low[i - 2] == close[i - 2] == open[i - 2] < high[i - 2]:
if low[i - 2] < lower[i - 2]:
if low[i - 1] == close[i - 1] == open[i - 1] < high[i - 1]:
if low[i] == open[i] < close[i] == high[i]:
bsLine['buy'][i + 1] = close[i]
bsLine['sell'][i + 1] = close[i] + 20
continue
# 17
if low[i - 3] == open[i - 3] == close[i - 3] < high[i - 3]:
if high[i - 3] > upper[i - 3]:
if low[i - 2] < open[i - 2] == close[i - 2] < high[i - 2]:
if high[i - 2] > upper[i - 2] and low[i - 2] < lower[i - 2]:
if low[i - 1] < open[i - 1] == close[i - 1] < high[i - 1]:
if low[i - 1] < lower[i - 1]:
if low[i] == open[i] < close[i] <= high[i]:
bsLine['buy'][i + 1] = close[i] + 5
bsLine['sell'][i + 1] = close[i] + 20
continue
# 18
if open[i - 3] > close[i - 3]:
if low[i - 3] < lower[i - 3] and low[i - 3] < ma2[i - 3]:
if low[i - 2] == close[i - 2] < open[i - 2] <= high[i - 2]:
if low[i - 2] < lower[i - 2] and low[i - 2] < ma2[i - 2]:
if low[i - 1] < open[i - 1] == close[i - 1] <= high[i - 1]:
if close[i - 2] < close[i - 1]:
if low[i] < open[i] == close[i] <= high[i]:
if close[i - 1] < close[i]:
bsLine['buy'][i + 1] = close[i]+5
bsLine['sell'][i + 1] = close[i] + 20
continue
# 19
if low[i-3] < open[i - 3] < close[i - 3] == high[i-3] < ma20[i-3]:
if low[i - 2] < close[i - 2] == open[i - 2] <= high[i - 2] < ma20[i-2]:
if low[i - 1] < open[i - 1] <= close[i - 1] == high[i - 1] < ma20[i-1]:
if low[i] <= open[i] < close[i] == high[i]:
if open[i-3] <= open[i-2] <= open[i-1] or close[i-2] <= close[i-1] <= close[i]:
bsLine['buy'][i + 1] = close[i]+5
bsLine['sell'][i + 1] = close[i] + 15
continue
return bsLine
"""
def checkTransaction(self, data, upper, lower): def checkTransaction(self, data, upper, lower):
low = data["Low"] low = data["Low"]
high = data["High"] high = data["High"]
@@ -623,7 +844,6 @@ class HTS:
buy_line[i+1] = low[i] + 5 buy_line[i+1] = low[i] + 5
check = False check = False
if low[i-2] < lower[i-2] and low[i-1] < lower[i-1] and low[i] < open[i] == close[i] < high[i] and open[i] - low[i] == high [i] - open[i]: if low[i-2] < lower[i-2] and low[i-1] < lower[i-1] and low[i] < open[i] == close[i] < high[i] and open[i] - low[i] == high [i] - open[i]:
if not (open[i-2] < close[i-2] and open[i-1] < close[i-1]) and not (open[i-2] == close[i-2] or open[i-1] == close[i-1]): if not (open[i-2] < close[i-2] and open[i-1] < close[i-1]) and not (open[i-2] == close[i-2] or open[i-1] == close[i-1]):
buy_line[i+1] = high[i] buy_line[i+1] = high[i]
@@ -644,6 +864,7 @@ class HTS:
break break
return buy_line, sell_line return buy_line, sell_line
"""
def simulate(self, stock_code, given_day): def simulate(self, stock_code, given_day):
#timecheckList = pd.read_csv("timecheck.csv").values.tolist() #timecheckList = pd.read_csv("timecheck.csv").values.tolist()
@@ -664,10 +885,10 @@ class HTS:
data, upper, lower = self.analyze(result) data, upper, lower = self.analyze(result)
# 사야 할 시점과 팔아야 할 시점을 체크한다. # 사야 할 시점과 팔아야 할 시점을 체크한다.
buy_line, sell_line = self.checkTransaction(data, upper, lower) bsLine = self.checkTransaction(data, upper, lower)
# 그래프를 그린다. # 그래프를 그린다.
self.draw(given_day, data, upper, lower, buy_line, sell_line) self.draw(given_day, data, upper, lower, bsLine)
# 가져온 만큼 데이터를 누적해서 파일로 작성한다. # 가져온 만큼 데이터를 누적해서 파일로 작성한다.
self.write(given_day, result) self.write(given_day, result)
@@ -678,7 +899,7 @@ class HTS:
data, upper, lower = None, None, None data, upper, lower = None, None, None
previous_price = 0 previous_price = 0
buy_count = 700 buy_count = 260
total_byu_amt = 0 total_byu_amt = 0
logFp = open(given_day+".log", "w") logFp = open(given_day+".log", "w")
@@ -709,26 +930,28 @@ class HTS:
data, upper, lower = self.analyze(result) data, upper, lower = self.analyze(result)
# 사야 할 시점과 팔아야 할 시점을 체크한다. # 사야 할 시점과 팔아야 할 시점을 체크한다.
buy_line, sell_line = self.checkTransaction(data, upper, lower) bsLine = self.checkTransaction(data, upper, lower)
buy_line = bsLine['buy']
# 주문 및 매도 처리 # 주문 및 매도 처리
price = buy_line[len(buy_line)-1] price = bsLine['buy'][len(buy_line)-1]
# 매수신청과 5원 높여서 매도신청 # 매수신청과 5원 높여서 매도신청
if price > 0: if price > 0:
if previous_price > 0: if previous_price > 0:
if previous_price > price: if previous_price > price:
if buy_count < 600: if buy_count < 200:
buy_count = 600 buy_count = 200
buy_count += 100 buy_count += 40
if buy_count > 1000: if buy_count > 500:
buy_count = 1000
elif previous_price < price:
if buy_count > 800:
buy_count = 800
buy_count -= 100
if buy_count < 500:
buy_count = 500 buy_count = 500
elif previous_price < price:
if buy_count > 400:
buy_count = 400
buy_count -= 40
if buy_count < 100:
buy_count = 100
previous_price = price previous_price = price
# 매수 주문 # 매수 주문
@@ -810,12 +1033,13 @@ if __name__ == "__main__":
#hts.all_stocks() #hts.all_stocks()
#hts.getChartData(stock_code) #hts.getChartData(stock_code)
#hts.currentStock(stock_code) #hts.currentStock(stock_code)
hts.printStockData(stock_code, given_day) #hts.printStockData(stock_code, given_day)
#given_days = ['20210909','20210910','20210913','20210914','20210915','20210916','20210917','20210923','20210924','20210927','20210928','20210929'] given_days = ['20210909','20210910','20210913','20210914','20210915','20210916','20210917','20210923','20210924','20210927','20210928','20210929','20210930']
#given_days = ['20210929'] given_days = ['20210909','20210913','20210914','20210915','20210916']
#for given_day in given_days: given_days = ['20210913']
# hts.simulate(stock_code, given_day) for given_day in given_days:
hts.simulate(stock_code, given_day)
#hts.buyRealTime(stock_code, given_day) #hts.buyRealTime(stock_code, given_day)