This commit is contained in:
dosangyoon
2021-09-23 02:45:22 +09:00
parent 77c1fb98b9
commit 76a15587a3
2 changed files with 157 additions and 65 deletions

View File

@@ -3,7 +3,6 @@ import time
import os import os
from datetime import datetime, timedelta from datetime import datetime, timedelta
import pandas as pd import pandas as pd
import schedule
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
import plotly.graph_objects as go import plotly.graph_objects as go
@@ -141,7 +140,7 @@ class HTS:
return return
# 주식 현금 매수주문 # 주식 현금 매수주문
def orderToBuy(self, stock_code): def orderToBuy(self, stock_code, count, price):
# 주문 초기화 # 주문 초기화
objTrade = win32com.client.Dispatch("CpTrade.CpTdUtil") objTrade = win32com.client.Dispatch("CpTrade.CpTdUtil")
initCheck = objTrade.TradeInit(0) initCheck = objTrade.TradeInit(0)
@@ -158,8 +157,8 @@ class HTS:
objStockOrder.SetInputValue(1, acc) # 계좌번호 objStockOrder.SetInputValue(1, acc) # 계좌번호
objStockOrder.SetInputValue(2, accFlag[0]) # 상품구분 - 주식 상품 중 첫번째 objStockOrder.SetInputValue(2, accFlag[0]) # 상품구분 - 주식 상품 중 첫번째
objStockOrder.SetInputValue(3, "A"+stock_code) # 종목코드 objStockOrder.SetInputValue(3, "A"+stock_code) # 종목코드
objStockOrder.SetInputValue(4, 10) # 매수수량 10 objStockOrder.SetInputValue(4, count) # 매수수량 count
objStockOrder.SetInputValue(5, 14100) # 주문단가 - 14,100 objStockOrder.SetInputValue(5, price) # 주문단가 - price
objStockOrder.SetInputValue(7, "0") # 주문 조건 구분 코드, 0: 기본 1: IOC 2:FOK objStockOrder.SetInputValue(7, "0") # 주문 조건 구분 코드, 0: 기본 1: IOC 2:FOK
objStockOrder.SetInputValue(8, "01") # 주문호가 구분코드 - 01: 보통 objStockOrder.SetInputValue(8, "01") # 주문호가 구분코드 - 01: 보통
@@ -175,7 +174,7 @@ class HTS:
return return
# 주식 현금 매도주문 # 주식 현금 매도주문
def orderToSell(self, stock_code): def orderToSell(self, stock_code, count, price):
# 주문 초기화 # 주문 초기화
objTrade = win32com.client.Dispatch("CpTrade.CpTdUtil") objTrade = win32com.client.Dispatch("CpTrade.CpTdUtil")
initCheck = objTrade.TradeInit(0) initCheck = objTrade.TradeInit(0)
@@ -192,8 +191,8 @@ class HTS:
objStockOrder.SetInputValue(1, acc) # 계좌번호 objStockOrder.SetInputValue(1, acc) # 계좌번호
objStockOrder.SetInputValue(2, accFlag[0]) # 상품구분 - 주식 상품 중 첫번째 objStockOrder.SetInputValue(2, accFlag[0]) # 상품구분 - 주식 상품 중 첫번째
objStockOrder.SetInputValue(3, "A"+stock_code) # 종목코드 - A003540 - 대신증권 종목 objStockOrder.SetInputValue(3, "A"+stock_code) # 종목코드 - A003540 - 대신증권 종목
objStockOrder.SetInputValue(4, 10) # 매도수량 10 objStockOrder.SetInputValue(4, count) # 매도수량 count
objStockOrder.SetInputValue(5, 14100) # 주문단가 - 14,100 objStockOrder.SetInputValue(5, price) # 주문단가 - price
objStockOrder.SetInputValue(7, "0") # 주문 조건 구분 코드, 0: 기본 1: IOC 2:FOK objStockOrder.SetInputValue(7, "0") # 주문 조건 구분 코드, 0: 기본 1: IOC 2:FOK
objStockOrder.SetInputValue(8, "01") # 주문호가 구분코드 - 01: 보통 objStockOrder.SetInputValue(8, "01") # 주문호가 구분코드 - 01: 보통
@@ -391,33 +390,7 @@ class HTS:
df_final_time = pd.DatetimeIndex(point_temp) df_final_time = pd.DatetimeIndex(point_temp)
data.index = df_final_time data.index = df_final_time
# 살 시점인지 체크 return data, upper_temp, lower_temp
# 볼린저밴드 하단에 연속으로 같은 가격이 왔을 때,
# 해당 하단 가격 + 5원에 매수를 시도함
check = False
buy_line = [-1 for i in range(len(lower_temp))]
for i in range(3, len(lower_temp)):
for j in range(i-3, i):
if (low[j] < lower_temp[j]) and (low[i] < lower_temp[i] and low[j] == low[i]):
#buy_line[i] = low[i]
check = True
break
if check and i < len(lower_temp) - 1:
buy_line[i+1] = low[i] + 5
check = False
# 팔 시점 체크
# 산 가격에 5원 위로 매도를 건다.
sell_line = [-1 for i in range(len(lower_temp))]
for i in range(len(buy_line)):
if buy_line[i] > 0:
for j in range(i+1, len(buy_line)):
# 5원 이득을 보고 판다.
if close[j] >= buy_line[i] + 5:
sell_line[j] = buy_line[i] + 5
break
return data, upper_temp, lower_temp, buy_line, sell_line
def draw(self, given_day, data, upper, lower, buy_line, sell_line): def draw(self, given_day, data, upper, lower, buy_line, sell_line):
# 그래프 설정을 위한 변수를 생성한다. # 그래프 설정을 위한 변수를 생성한다.
@@ -455,7 +428,42 @@ class HTS:
fig.show() fig.show()
return return
def checkTransaction(self, data, lower):
low = data["Low"]
close = data["Close"]
# 살 시점인지 체크
# 볼린저밴드 하단에 연속으로 같은 가격이 왔을 때,
# 해당 하단 가격 + 5원에 매수를 시도함
check = False
buy_line = [-1 for i in range(len(lower))]
for i in range(3, len(lower)):
for j in range(i-3, i):
if (low[j] < lower[j]) and (low[i] < lower[i] and low[j] == low[i]):
#buy_line[i] = low[i]
check = True
break
if check and i < len(lower) - 1:
buy_line[i+1] = low[i] + 5
check = False
# 팔 시점 체크
# 산 가격에 5원 위로 매도를 건다.
sell_line = [-1 for i in range(len(lower))]
for i in range(len(buy_line)):
if buy_line[i] > 0:
for j in range(i+1, len(buy_line)):
# 5원 이득을 보고 판다.
if close[j] >= buy_line[i] + 5:
sell_line[j] = buy_line[i] + 5
break
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()
timecheck = {datetime.strptime(given_day + " " + str(second).zfill(6), '%Y%m%d %H%M%S'): False for second, check in timecheckList}
result = {"check": set(), result = {"check": set(),
"time": [], "time": [],
"open": [], "open": [],
@@ -471,29 +479,20 @@ class HTS:
self.write(given_day, result) self.write(given_day, result)
# 분석을 통해서 볼린저밴드 상/하단을 계산한다. # 분석을 통해서 볼린저밴드 상/하단을 계산한다.
data, upper, lower, buy_line, sell_line = self.analyze(result) data, upper, lower = self.analyze(result)
# 사야 할 시점과 팔아야 할 시점을 체크한다.
buy_line, sell_line = self.checkTransaction(data, lower)
# 그래프를 그린다. # 그래프를 그린다.
self.draw(given_day, data, upper, lower, buy_line, sell_line) self.draw(given_day, data, upper, lower, buy_line, sell_line)
return return
def checkRealTime(self, stock_code, given_day, result):
# 데이터를 가지고 온다.
self.getRealTime(stock_code, given_day, result)
# 가져온 만큼 데이터를 누적해서 파일로 작성한다.
self.write(given_day, result)
# 분석을 통해서 볼린저밴드 상/하단을 계산한다.
data, upper, lower, buy_line, sell_line = self.analyze(result)
# 주문 및 매도 처리
# self.draw(given_day, data, upper, lower, buy_line, sell_line)
return
def buyRealTime(self, stock_code, given_day): def buyRealTime(self, stock_code, given_day):
timecheckList = pd.read_csv("timecheck.csv").values.tolist()
timecheck = {datetime.strptime(given_day + " " + str(second).zfill(6), '%Y%m%d %H%M%S'):False for second, check in timecheckList}
result = {"check": set(), result = {"check": set(),
"time": [], "time": [],
"open": [], "open": [],
@@ -502,22 +501,38 @@ class HTS:
"low": [], "low": [],
"vol": []} "vol": []}
schedule.every().hour.at(":0:5").do(self.checkRealTime(stock_code, given_day, result)) # 매시간 0분 5초에 작업 실행 while datetime.strptime(given_day + " 085900", '%Y%m%d %H%M%S') < datetime.now() < datetime.strptime(given_day + " 151500", '%Y%m%d %H%M%S'):
schedule.every().hour.at(":5:5").do(self.checkRealTime(stock_code, given_day, result)) # 매시간 5분 5초에 작업 실행 second = datetime.now().strftime('%Y%m%d %H%M%S')
schedule.every().hour.at(":10:5").do(self.checkRealTime(stock_code, given_day, result)) # 매시간 10분 5초에 작업 실행 if second in timecheck and timecheck[second] == False:
schedule.every().hour.at(":15:5").do(self.checkRealTime(stock_code, given_day, result)) # 매시간 15분 5초에 작업 실행
schedule.every().hour.at(":20:5").do(self.checkRealTime(stock_code, given_day, result)) # 매시간 20분 5초에 작업 실행
schedule.every().hour.at(":25:5").do(self.checkRealTime(stock_code, given_day, result)) # 매시간 25분 5초에 작업 실행
schedule.every().hour.at(":30:5").do(self.checkRealTime(stock_code, given_day, result)) # 매시간 30분 5초에 작업 실행
schedule.every().hour.at(":35:5").do(self.checkRealTime(stock_code, given_day, result)) # 매시간 35분 5초에 작업 실행
schedule.every().hour.at(":40:5").do(self.checkRealTime(stock_code, given_day, result)) # 매시간 40분 5초에 작업 실행
schedule.every().hour.at(":45:5").do(self.checkRealTime(stock_code, given_day, result)) # 매시간 45분 5초에 작업 실행
schedule.every().hour.at(":50:5").do(self.checkRealTime(stock_code, given_day, result)) # 매시간 50분 5초에 작업 실행
schedule.every().hour.at(":55:5").do(self.checkRealTime(stock_code, given_day, result)) # 매시간 55분 5초에 작업 실행
while datetime.now() < datetime.strptime(given_day + " 151500", '%Y%m%d %H%M%S'): # 데이터를 가지고 온다.
schedule.run_pending() self.getRealTime(stock_code, given_day, result)
time.sleep(1)
# 가져온 만큼 데이터를 누적해서 파일로 작성한다.
self.write(given_day, result)
# 분석을 통해서 볼린저밴드 상/하단을 계산한다.
data, upper, lower = self.analyze(result)
# 사야 할 시점과 팔아야 할 시점을 체크한다.
buy_line, sell_line = self.checkTransaction(data, lower)
# 주문 및 매도 처리
price = buy_line[len(buy_line)-1]
# 매수신청과 5원 높여서 매도신청
if price > 0:
print(second, price)
count = 1
self.orderToBuy(stock_code, count, price)
self.orderToSell(stock_code, count, price + 5)
timecheck[second] = True
# self.draw(given_day, data, upper, lower, buy_line, sell_line)
time.sleep(0.5)
return return

77
hts/timecheck.csv Normal file
View File

@@ -0,0 +1,77 @@
time, check
090403,False
090903,False
091403,False
091903,False
092403,False
092903,False
093403,False
093903,False
094403,False
094903,False
095403,False
095903,False
100403,False
100903,False
101403,False
101903,False
102403,False
102903,False
103403,False
103903,False
104403,False
104903,False
105403,False
105903,False
110403,False
110903,False
111403,False
111903,False
112403,False
112903,False
113403,False
113903,False
114403,False
114903,False
115403,False
115903,False
120403,False
120903,False
121403,False
121903,False
122403,False
122903,False
123403,False
123903,False
124403,False
124903,False
125403,False
125903,False
130403,False
130903,False
131403,False
131903,False
132403,False
132903,False
133403,False
133903,False
134403,False
134903,False
135403,False
135903,False
140403,False
140903,False
141403,False
141903,False
142403,False
142903,False
143403,False
143903,False
144403,False
144903,False
145403,False
145903,False
150403,False
150903,False
151403,False
151903,False
1 time check
2 090403 False
3 090903 False
4 091403 False
5 091903 False
6 092403 False
7 092903 False
8 093403 False
9 093903 False
10 094403 False
11 094903 False
12 095403 False
13 095903 False
14 100403 False
15 100903 False
16 101403 False
17 101903 False
18 102403 False
19 102903 False
20 103403 False
21 103903 False
22 104403 False
23 104903 False
24 105403 False
25 105903 False
26 110403 False
27 110903 False
28 111403 False
29 111903 False
30 112403 False
31 112903 False
32 113403 False
33 113903 False
34 114403 False
35 114903 False
36 115403 False
37 115903 False
38 120403 False
39 120903 False
40 121403 False
41 121903 False
42 122403 False
43 122903 False
44 123403 False
45 123903 False
46 124403 False
47 124903 False
48 125403 False
49 125903 False
50 130403 False
51 130903 False
52 131403 False
53 131903 False
54 132403 False
55 132903 False
56 133403 False
57 133903 False
58 134403 False
59 134903 False
60 135403 False
61 135903 False
62 140403 False
63 140903 False
64 141403 False
65 141903 False
66 142403 False
67 142903 False
68 143403 False
69 143903 False
70 144403 False
71 144903 False
72 145403 False
73 145903 False
74 150403 False
75 150903 False
76 151403 False
77 151903 False