init
This commit is contained in:
@@ -60,6 +60,7 @@ class HTS_122630 (HTS):
|
||||
if datetime.strptime(today + " 090000", '%Y%m%d %H%M%S') < THIS_TIME < datetime.strptime(today + " 151500", '%Y%m%d %H%M%S'):
|
||||
# 3시 까지만 매수를 시도한다.
|
||||
|
||||
"""
|
||||
if THIS_TIME.strftime('%S') in ("09", "19", "29", "39", "49", "59"):
|
||||
if THIS_TIME.strftime('%S') in ("06", "16", "26", "36", "46", "56"):
|
||||
# 데이터를 가지고 온다.
|
||||
@@ -68,7 +69,7 @@ class HTS_122630 (HTS):
|
||||
|
||||
# 10초마다 체크하여 체결된 내역이 있으면 50원 높게 매도를 주문한다.
|
||||
self.getSellingPrice(THIS_TIME, self.stock_code, final_price)
|
||||
|
||||
"""
|
||||
if THIS_TIME.strftime('%S') == "05":
|
||||
# 매분 5초마다 실행한다.
|
||||
|
||||
|
||||
@@ -62,6 +62,7 @@ class HTS_252670 (HTS):
|
||||
if datetime.strptime(today + " 090000", '%Y%m%d %H%M%S') < THIS_TIME < datetime.strptime(today + " 151500", '%Y%m%d %H%M%S'):
|
||||
# 3시 까지만 매수를 시도한다.
|
||||
|
||||
"""
|
||||
if THIS_TIME < datetime.strptime(today + " 145000", '%Y%m%d %H%M%S'):
|
||||
if THIS_TIME.strftime('%S') in ("06", "16", "26", "36", "46", "56"):
|
||||
# 데이터를 가지고 온다.
|
||||
@@ -70,7 +71,7 @@ class HTS_252670 (HTS):
|
||||
|
||||
# 10초마다 체크하여 체결된 내역이 있으면 50원 높게 매도를 주문한다.
|
||||
self.getSellingPrice(THIS_TIME, self.stock_code, final_price)
|
||||
|
||||
"""
|
||||
|
||||
if THIS_TIME.strftime('%S') == "03":
|
||||
# 매분 3초마다 실행한다.
|
||||
@@ -178,7 +179,7 @@ if __name__ == "__main__":
|
||||
# KODEX 인버스 * 2
|
||||
stock_code = "252670"
|
||||
stock_name = "KODEX 200선물인버스2X"
|
||||
buy_count = 900
|
||||
buy_count = 300
|
||||
|
||||
hts = HTS_252670(RESOURCE_PATH, stock_code, buy_count)
|
||||
today_str = today.strftime('%Y%m%d')
|
||||
|
||||
@@ -89,6 +89,9 @@ class Simulation (HTS):
|
||||
avg9 = go.Scatter(x=data['date'], y=data["avg9"], name="avg9", line_color='#ff00ff')
|
||||
avg12 = go.Scatter(x=data['date'], y=data["avg12"], name="avg12", line_color='#1469F4')
|
||||
avg20 = go.Scatter(x=data['date'], y=data["avg20"], name="avg20", line_color='#000000')
|
||||
laggingSpan = go.Scatter(x=data['date'], y=data["laggingSpan"], name='laggingSpan', line_color='#B50ABB')
|
||||
changeLine = go.Scatter(x=data['date'], y=data["changeLine"], name='changeLine', line_color='#14A200')
|
||||
baseLine = go.Scatter(x=data['date'], y=data["baseLine"], name='baseLine', line_color='#CF6E0D')
|
||||
|
||||
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')
|
||||
volume_line = go.Scatter(x=data['date'], y=data["volume"], mode='lines', name='volume')
|
||||
@@ -104,7 +107,7 @@ class Simulation (HTS):
|
||||
rsi_line = go.Scatter(x=data['date'], y=data["rsi"], mode='lines', name='rsi')
|
||||
rsis_line = go.Scatter(x=data['date'], y=data["rsis"], mode='lines', name='rsis')
|
||||
|
||||
candle_data = [candle_stick, upper, lower, avg3, avg6, avg9, avg12, avg20, buy_check, sell_check]
|
||||
candle_data = [candle_stick, upper, lower, avg3, avg6, avg9, avg12, avg20, buy_check, sell_check, laggingSpan, changeLine, baseLine]
|
||||
volume_data = [volume_line]
|
||||
macd_data = [macd_line, macd_s_line, macd_o_line]
|
||||
stochastic_data = [slow_k_line, slow_d_line]
|
||||
@@ -186,7 +189,10 @@ if __name__ == "__main__":
|
||||
'20220808', '20220809', '20220810', '20220811', '20220812',
|
||||
'20220816', '20220817', '20220818', '20220819',
|
||||
'20220822', '20220823', '20220824', '20220825', '20220826', '20220829'],
|
||||
#"122630": ['20220822', '20220823', '20220824', '20220825', '20220826', '20220829']
|
||||
"122630": ['20220801', '20220802', '20220803', '20220804', '20220805',
|
||||
'20220808', '20220809', '20220810', '20220811', '20220812',
|
||||
'20220816', '20220817', '20220818', '20220819',
|
||||
'20220822', '20220823', '20220824', '20220825', '20220826', '20220829']
|
||||
}
|
||||
|
||||
method = "rule" # "rule", "ml", "answer"
|
||||
|
||||
@@ -14,7 +14,7 @@ class BuySellChecker:
|
||||
macd = None
|
||||
ichimokuCloud = None
|
||||
|
||||
buy_type = -1
|
||||
BUY_COUNT = None
|
||||
|
||||
def __init__(self):
|
||||
self.common = Common()
|
||||
@@ -23,8 +23,7 @@ class BuySellChecker:
|
||||
self.macd = MACD()
|
||||
self.ichimokuCloud = IchimokuCloud()
|
||||
|
||||
self.buy_type = -1
|
||||
|
||||
self.BUY_COUNT = 0
|
||||
return
|
||||
|
||||
|
||||
@@ -90,10 +89,23 @@ class BuySellChecker:
|
||||
break
|
||||
return inverse_arrangement
|
||||
|
||||
def checkUpDirection(self, data, i):
|
||||
# 0: 무추세, -1: 하락 추세, 1: 상승 추세
|
||||
close = data['close'][i]
|
||||
#up_count = sum([1 if data['high'][c] < close else 0 for c in range(i-20, i)])
|
||||
#down_count = sum([1 if close < data['low'][c] else 0 for c in range(i - 20, i)])
|
||||
|
||||
lagging_change = sum([1 if data['laggingSpan'][c] < data['changeLine'][c] else 0 for c in range(i-20, i)])
|
||||
change_lagging = sum([1 if data['laggingSpan'][c] > data['changeLine'][c] else 0 for c in range(i-20, i)])
|
||||
|
||||
if lagging_change>10:
|
||||
return 1
|
||||
if change_lagging==20:
|
||||
return -1
|
||||
return 0
|
||||
|
||||
def getBuyPriceAndWeight(self, data, i):
|
||||
type = -1
|
||||
buy, weight = min(data["open"][i], data["close"][i]), 1
|
||||
SLOW_K = 60
|
||||
buy, weight, type = -1, -1, -1
|
||||
|
||||
START_TIME_INDEX = 0
|
||||
for c in range(370, len(data.index)):
|
||||
@@ -104,81 +116,44 @@ class BuySellChecker:
|
||||
if i > START_TIME_INDEX:
|
||||
# 매수 분석
|
||||
|
||||
# 이전에 30분 동안 5분내 역배열이 있었던 경우, avg3이 avg20위로 올라온 경우 매수한다.
|
||||
if data['avg3'][i-1] <= data['avg20'][i-1] and data['avg3'][i] > data['avg20'][i]:
|
||||
if self.check_inverse_arrangement_before(data, i, 30, 5):
|
||||
if i > 381 + 70:
|
||||
if data['macdo'][i-1] < data['macdo'][i] and data['macdo'][i] < -10:
|
||||
buy = max(data["open"][i], data["close"][i])
|
||||
weight = 1
|
||||
type = 1
|
||||
return buy, weight, type
|
||||
else:
|
||||
if data['macdo'][i - 1] < data['macdo'][i] and data['macdo'][i] < -10:
|
||||
if -2 < data['macds'][381]:
|
||||
buy = max(data["open"][i], data["close"][i])
|
||||
weight = 1
|
||||
type = 1
|
||||
return buy, weight, type
|
||||
|
||||
if data['changeLine'][i - 1] <= data['baseLine'][i - 1] and data['baseLine'][i] < data['changeLine'][i]:
|
||||
changeLine_count = sum([1 if data['changeLine'][c] <= data['baseLine'][c] else 0 for c in range(i-30, i)])
|
||||
if changeLine_count >= 19 and data['slow_k'][i] < 70:
|
||||
buy = min(data["open"][i], data["close"][i])
|
||||
weight = 1
|
||||
type = 1
|
||||
return buy, weight, type
|
||||
|
||||
# 10시 이후
|
||||
if i > START_TIME_INDEX + 60:
|
||||
if data["macd"][i] < -10 and data["macd"][i - 1] < data["macd"][i]:
|
||||
if data["slow_k"][i] < 5 and data["slow_k"][i-1] < data["slow_k"][i]:
|
||||
if data["slow_k"][i] < 5 and data["slow_k"][i - 1] < data["slow_k"][i]:
|
||||
if data["rsi"][i] < 30 and data["rsi"][i - 1] < data["rsi"][i]:
|
||||
"""
|
||||
if i > 381 + 26:
|
||||
if data['laggingSpan'][i-1] < data['avg3'][i-1] and data['avg3'][i] < data['laggingSpan'][i]:
|
||||
if self.checkUpDirection(data, i) == 1:
|
||||
avg20_line = sum([1 if data['avg20'][c] < data['avg20'][c-1] else 0 for c in range(i - 10, i)])
|
||||
if avg20_line < 10:
|
||||
if data["macd"][i] < 0:
|
||||
buy = min(data["open"][i], data["close"][i])
|
||||
weight = 1
|
||||
type = 1
|
||||
return buy, weight, type
|
||||
|
||||
|
||||
# avg20이 10분동안 상승하고,현재 avg20이 open/close 사이에 있고, slow_k가 60보다 작으면 매수
|
||||
valid = True
|
||||
for c in range(i-9, i+1):
|
||||
if data["avg20"][c-1] > data["avg20"][c]:
|
||||
valid = False
|
||||
if valid:
|
||||
min_value = data["close"][i]
|
||||
max_value = data["open"][i]
|
||||
if data["open"][i] < data["close"][i]:
|
||||
min_value = data["open"][i]
|
||||
max_value = data["close"][i]
|
||||
|
||||
if min_value < data["avg20"][i] < max_value:
|
||||
if data["slow_k"][i] < SLOW_K:
|
||||
if not self.check_12_over_20_for_30(data, i):
|
||||
buy = min_value
|
||||
weight = 1
|
||||
type = 1
|
||||
return buy, weight, type
|
||||
|
||||
# 현재 slow_k가 60보다 작고, 최근 5분 동안 avg20이 다른 avg[3,6,9,12]의 최저값보다 큰 적이 없을 때,
|
||||
if data["slow_k"][i] < SLOW_K:
|
||||
valid = True
|
||||
for c in range(i-4, i+1):
|
||||
if min(data["avg3"][c], data["avg6"][c], data["avg9"][c], data["avg12"][c]) <= data["avg20"][c]:
|
||||
valid = False
|
||||
break
|
||||
if valid:
|
||||
valid = False
|
||||
# 최근 20분 동안 avg20이 다른 avg[3,6,9,12]의 최대값보다 큰 적이 있을 때,
|
||||
for c in range(i-19, i+1):
|
||||
if max(data["avg3"][c], data["avg6"][c], data["avg9"][c], data["avg12"][c]) < data["avg20"][c]:
|
||||
valid = True
|
||||
break
|
||||
if valid:
|
||||
if not self.check_12_over_20_for_30(data, i):
|
||||
buy = min(data["open"][i], data["close"][i])
|
||||
weight = 1
|
||||
type = 1
|
||||
return buy, weight, type
|
||||
|
||||
if (data['macdo'][i] >= 0 or
|
||||
data['avg3'][i-1] > data['avg3'][i] or
|
||||
data['avg3'][i] < max(data['avg6'][i], data['avg9'][i], data['avg12'][i], data['avg20'][i])):
|
||||
buy = -1
|
||||
weight = -1
|
||||
type = 0
|
||||
return buy, weight, type
|
||||
|
||||
|
||||
"""
|
||||
return buy, weight, type
|
||||
|
||||
def getSellPriceAndWeight(self, data, i):
|
||||
sell, weight, type = -1, -1, -1
|
||||
slow_k = 60
|
||||
|
||||
START_TIME_INDEX = 0
|
||||
for c in range(370, len(data.index)):
|
||||
@@ -189,300 +164,14 @@ class BuySellChecker:
|
||||
if i > START_TIME_INDEX:
|
||||
# 매도 분석
|
||||
|
||||
# 3분선이 10분 이상 6분선 위에 있다가 6분선 아래로 내려옴
|
||||
if i >= 381 + 10:
|
||||
vaild = True
|
||||
count = 0
|
||||
for c in range(i-10, i+1):
|
||||
if data["avg3"][c-1] == data["avg20"][c]:
|
||||
count += 1
|
||||
if data["avg3"][c-1] < data["avg20"][c]:
|
||||
vaild = False
|
||||
break
|
||||
if vaild and count < 3:
|
||||
if data["avg3"][i] < data["avg20"][i]:
|
||||
if data["slow_k"][i] > slow_k:
|
||||
sell = int(data["avg3"][i] - data["avg3"][i] % 5)
|
||||
if data['changeLine'][i - 1] >= data['laggingSpan'][i - 1] and data['laggingSpan'][i] < data['changeLine'][i]:
|
||||
changeLine_count = sum([1 if data['changeLine'][c] <= data['laggingSpan'][c] else 0 for c in range(i - 20, i)])
|
||||
if changeLine_count >= 17:
|
||||
sell = min(data["open"][i], data["close"][i])
|
||||
weight = 1
|
||||
type = 1
|
||||
return sell, weight, type
|
||||
|
||||
# 12분선이 5분 이상 20분선 위에 있다가 20분선 아래로 내려옴
|
||||
if i >= 381 + 5:
|
||||
vaild = True
|
||||
for c in range(1, 6):
|
||||
if data["avg12"][i - c] < data["avg20"][i - c]:
|
||||
vaild = False
|
||||
break
|
||||
if vaild:
|
||||
if data["avg12"][i] < data["avg20"][i] and data["avg20"][i-1] < data["avg20"][i]:
|
||||
if data["slow_k"][i] > slow_k:
|
||||
sell = data["close"][i]
|
||||
weight = 1
|
||||
type = 1
|
||||
return sell, weight, type
|
||||
|
||||
if (not (data["avg20"][i-1] > max(data["avg3"][i-1], data["avg6"][i-1], data["avg9"][i-1], data["avg12"][i-1])) and
|
||||
(data["avg20"][i] > max(data["avg3"][i], data["avg6"][i], data["avg9"][i], data["avg12"][i]))):
|
||||
if data["slow_k"][i] > slow_k:
|
||||
sell = data["close"][i]
|
||||
weight = 1
|
||||
type = 1
|
||||
return sell, weight, type
|
||||
|
||||
return sell, weight, type
|
||||
|
||||
|
||||
# 곱버스에 해당함
|
||||
def getBuyPriceAndWeight_252670(self, data, i):
|
||||
buy, weight, type = -1, -1, -1
|
||||
|
||||
START_TIME_INDEX = 0
|
||||
for c in range(370, len(data.index)):
|
||||
if data.index[c].strftime("%H:%M:%S") == "09:01:00":
|
||||
START_TIME_INDEX = c
|
||||
break
|
||||
|
||||
if i > START_TIME_INDEX:
|
||||
# 매수 분석
|
||||
|
||||
param = 1
|
||||
if (data["macd"][i] < -3.110935149 and data["macds"][i] < -2.370579802 and
|
||||
data["diff_avg27"][i] < -0.51457476*param and
|
||||
data["diff_avg3_avg54"][i] < -11.04578189 * param and
|
||||
|
||||
data["diff_avg6_avg27"][i] < -6.53755144 * param and
|
||||
data["diff_avg6_avg54"][i] < -9.518004115*param and
|
||||
|
||||
data["diff_avg9_avg27"][i] < -5.21244856 * param and
|
||||
data["diff_avg9_avg54"][i] < -8.192901235*param and
|
||||
|
||||
data["diff_open_lead1"][i] < -13.26157407*param and
|
||||
data["diff_close_lead1"][i] < -13.71064815*param and
|
||||
data["diff_high_lead1"][i] < -10.08564815*param and
|
||||
data["diff_low_lead1"][i] < -17.8912037*param and
|
||||
|
||||
data["abs_avg_1"][i] > 15.72655178 * param and
|
||||
29.0499289 - 22.02727828/3 < data["diff_upper_lower"][i] < 29.0499289*param + 22.02727828
|
||||
):
|
||||
|
||||
buy = int((data["open"][i] + data["close"][i]) / 2)
|
||||
weight = 1
|
||||
return buy, weight, type
|
||||
|
||||
return buy, weight, type
|
||||
|
||||
def getSellPriceAndWeight_252670(self, data, i):
|
||||
sell, weight, type = -1, -1, -1
|
||||
|
||||
START_TIME_INDEX = 0
|
||||
for c in range(370, len(data.index)):
|
||||
if data.index[c].strftime("%H:%M:%S") == "09:01:00":
|
||||
START_TIME_INDEX = c
|
||||
break
|
||||
|
||||
if i > START_TIME_INDEX:
|
||||
# 매도 분석
|
||||
|
||||
# 3분선이 10분 이상 6분선 위에 있다가 5분선 아래로 내려옴
|
||||
if i >= 381 + 10:
|
||||
vaild = True
|
||||
count = 0
|
||||
for c in range(1, 11):
|
||||
if data["avg3"][i - c] == data["avg6"][i - c]:
|
||||
count += 1
|
||||
if data["avg3"][i - c] < data["avg6"][i - c]:
|
||||
vaild = False
|
||||
break
|
||||
if vaild and count < 3:
|
||||
if data["avg3"][i] < data["avg6"][i]:
|
||||
sell = int(data["avg3"][i] - data["avg3"][i] % 5)
|
||||
weight = 1
|
||||
return sell, weight, type
|
||||
|
||||
# 3분선이 5분 이상 12분선 위에 있다가 12분선 아래로 내려옴
|
||||
if i >= 381 + 5:
|
||||
vaild = True
|
||||
for c in range(1, 6):
|
||||
if not (data["avg3"][i - c] >= data["avg6"][i - c] >= data["avg9"][i - c] >= data["avg12"][i - c]):
|
||||
vaild = False
|
||||
break
|
||||
if vaild:
|
||||
if data["avg3"][i] < data["avg12"][i]:
|
||||
sell = data["close"][i]
|
||||
weight = 1
|
||||
return sell, weight, type
|
||||
|
||||
return sell, weight, type
|
||||
|
||||
def getBuyPriceAndWeight_122630(self, data, i):
|
||||
buy, weight, type = -1, -1, -1
|
||||
|
||||
START_TIME_INDEX = 0
|
||||
for c in range(370, len(data.index)):
|
||||
if data.index[c].strftime("%H:%M:%S") == "09:01:00":
|
||||
START_TIME_INDEX = c
|
||||
break
|
||||
|
||||
if i > START_TIME_INDEX:
|
||||
# 매수 분석
|
||||
|
||||
param = 1
|
||||
if (data["macd"][i] < -8.532976905 and data["macds"][i] < -5.679850674 and data["abs_avg_1"][i] > 70.48701299 * param ):
|
||||
"""
|
||||
if (data["diff_avg27"][i] < -1.637205387 * param and
|
||||
|
||||
data["diff_avg3_avg27"][i] < -25.4455267 * param and
|
||||
data["diff_avg3_avg54"][i] < -31.55964406 * param and
|
||||
|
||||
data["diff_avg6_avg27"][i] < -17.45039683 * param and
|
||||
data["diff_avg6_avg54"][i] < -23.56451419 * param and
|
||||
|
||||
data["diff_avg9_avg27"][i] < -13.27020202 * param and
|
||||
data["diff_avg9_avg54"][i] < -19.38431938 * param and
|
||||
|
||||
data["diff_avg12_avg27"][i] < -10.42388167 * param and
|
||||
data["diff_avg12_avg54"][i] < -16.53799904 * param and
|
||||
|
||||
data["diff_change_lead1"][i] < -25.68993506 * param and
|
||||
data["diff_open_lead1"][i] < -37.53246753 * param and
|
||||
data["diff_close_lead1"][i] < -45.1461039 * param and
|
||||
data["diff_high_lead1"][i] < -30.03246753 * param and
|
||||
data["diff_low_lead1"][i] < -53.08441558 * param
|
||||
):
|
||||
|
||||
buy = int((data["open"][i] + data["close"][i]) / 2)
|
||||
weight = 1
|
||||
return buy, weight, type
|
||||
"""
|
||||
|
||||
if -30 < data["macd"][i] < -25:
|
||||
valid = True
|
||||
for c in range(1, 20):
|
||||
if data["macd"][i-c] < -30:
|
||||
valid = False
|
||||
break
|
||||
if valid:
|
||||
buy = int((data["open"][i] + data["close"][i]) / 2)
|
||||
weight = 1
|
||||
return buy, weight, type
|
||||
|
||||
previous_lowest_close = 99999999
|
||||
for c in range(10, 30):
|
||||
if data["close"][i-c] < previous_lowest_close:
|
||||
previous_lowest_close = data["close"][i-c]
|
||||
|
||||
if data["close"][i] > previous_lowest_close:
|
||||
valid = True
|
||||
for c in range(1, 20):
|
||||
if data["macd"][i-c] < -30:
|
||||
valid = False
|
||||
break
|
||||
if valid:
|
||||
buy = int((data["open"][i] + data["close"][i]) / 2)
|
||||
weight = 1
|
||||
return buy, weight, type
|
||||
|
||||
|
||||
if (data["avg54"][i-4] < data["avg54"][i-3] < data["avg54"][i-2] < data["avg54"][i-1] < data["avg54"][i] and
|
||||
data["avg54"][i] < min(data["avg3"][i], data["avg6"][i], data["avg9"][i], data["avg12"][i], data["avg27"][i]) and
|
||||
data["avg54"][i] < data["avg27"][i] < data["avg12"][i] < data["avg9"][i] < data["avg6"][i] < data["avg3"][i] and
|
||||
max(data["avg3"][i], data["avg6"][i], data["avg9"][i], data["avg12"][i], data["avg27"][i]) - min(data["avg3"][i], data["avg6"][i], data["avg9"][i], data["avg12"][i], data["avg27"][i]) < 5
|
||||
):
|
||||
buy = data["close"][i]
|
||||
weight = 1
|
||||
return buy, weight, type
|
||||
|
||||
|
||||
|
||||
if (data["avg54"][i-4] < data["avg54"][i-3] < data["avg54"][i-2] < data["avg54"][i-1] < data["avg54"][i] and
|
||||
data["avg54"][i-7] < data["avg3"][i-7] < data["avg6"][i-7] < data["avg9"][i-7] < data["avg12"][i-7] and
|
||||
data["avg54"][i] < data["avg12"][i] < data["avg9"][i] < data["avg6"][i] < data["avg3"][i]
|
||||
):
|
||||
if data['macd'][i] < -5:
|
||||
buy = data["close"][i]
|
||||
weight = 1
|
||||
return buy, weight, type
|
||||
|
||||
return buy, weight, type
|
||||
|
||||
|
||||
def getSellPriceAndWeight_122630(self, data, i):
|
||||
sell, weight, type = -1, -1, -1
|
||||
|
||||
START_TIME_INDEX = 0
|
||||
for c in range(370, len(data.index)):
|
||||
if data.index[c].strftime("%H:%M:%S") == "09:01:00":
|
||||
START_TIME_INDEX = c
|
||||
break
|
||||
|
||||
if i > START_TIME_INDEX:
|
||||
# 매수 분석
|
||||
|
||||
# 3분선이 10분 이상 6분선 위에 있다가 5분선 아래로 내려옴
|
||||
if i >= 381 + 10:
|
||||
vaild = True
|
||||
count = 0
|
||||
for c in range(1, 11):
|
||||
if data["avg3"][i - c] == data["avg6"][i - c]:
|
||||
count += 1
|
||||
if data["avg3"][i - c] < data["avg6"][i - c]:
|
||||
vaild = False
|
||||
break
|
||||
if vaild and count < 3:
|
||||
if data["avg3"][i] < data["avg6"][i]:
|
||||
sell = int(data["avg3"][i] - data["avg3"][i]%5)
|
||||
weight = 1
|
||||
return sell, weight, type
|
||||
|
||||
# 3분선이 5분 이상 12분선 위에 있다가 12분선 아래로 내려옴
|
||||
if i >= 381 + 5:
|
||||
vaild = True
|
||||
for c in range(1, 6):
|
||||
if not (data["avg3"][i - c] >= data["avg6"][i - c] >= data["avg9"][i - c] >= data["avg12"][i - c]):
|
||||
vaild = False
|
||||
break
|
||||
if vaild:
|
||||
if data["avg3"][i] < data["avg12"][i]:
|
||||
sell = data["close"][i]
|
||||
weight = 1
|
||||
return sell, weight, type
|
||||
|
||||
param = 2
|
||||
if (data["macd"][i] > 11.4590339 and
|
||||
data["diff_avg27"][i] > 2.261904762 * param and
|
||||
data["diff_avg3_avg27"][i] > 28.83730159 * param and
|
||||
data["diff_avg3_avg54"][i] > 40.84391534 * param and
|
||||
|
||||
data["diff_avg6_avg27"][i] > 22.49801587 * param and
|
||||
data["diff_avg6_avg54"][i] > 34.50462963 * param and
|
||||
|
||||
data["diff_avg9_avg27"][i] > 17.6984127 * param and
|
||||
data["diff_avg9_avg54"][i] > 29.70502646 * param and
|
||||
|
||||
data["diff_avg12_avg27"][i] > 13.59920635 * param and
|
||||
data["diff_avg12_avg54"][i] > 25.60582011 * param and
|
||||
|
||||
data["diff_change_lead1"][i] > 40.82142857 * param and
|
||||
data["diff_open_lead1"][i] > 53.48214286 * param and
|
||||
data["diff_close_lead1"][i] > 58.23214286 * param and
|
||||
data["diff_high_lead1"][i] > 63.125 * param and
|
||||
data["diff_low_lead1"][i] > 49.41071429 * param and
|
||||
|
||||
data["diff_upper_lower"][i] < 70.63330362 * param + 124.7189534 / 3 and
|
||||
data["diff_change_base"][i] > 16.73214286 * param and
|
||||
|
||||
data["diff_avg3"][i] > 4.714285714 * param and
|
||||
data["diff_avg6"][i] > 3.857142857 * param and
|
||||
data["diff_avg9"][i] > 3.373015873 * param and
|
||||
data["diff_avg12"][i] > 3.026785714 * param and
|
||||
data["diff_avg27"][i] > 2.261904762 * param and
|
||||
data["diff_avg54"][i] > 1.18452381 * param
|
||||
):
|
||||
sell = int((data["open"][i] + data["close"][i]) / 2)
|
||||
weight = 1
|
||||
return sell, weight, type
|
||||
|
||||
return sell, weight, type
|
||||
|
||||
def analyze(self, result):
|
||||
@@ -551,6 +240,7 @@ class BuySellChecker:
|
||||
ichimokuCloud_df = ichimokuCloud_df[:len(ichimokuCloud_df) - 51]
|
||||
changeLine = ichimokuCloud_df['changeLine'].values.tolist()
|
||||
baseLine = ichimokuCloud_df['baseLine'].values.tolist()
|
||||
laggingSpan = ichimokuCloud_df['laggingSpan'].values.tolist()
|
||||
leadingSpan1 = ichimokuCloud_df['leadingSpan1'].values.tolist()
|
||||
leadingSpan2 = ichimokuCloud_df['leadingSpan2'].values.tolist()
|
||||
|
||||
@@ -563,7 +253,7 @@ class BuySellChecker:
|
||||
"macd": macd, "macds": macds, "macdo": macdo,
|
||||
"fast_k": fast_k, "slow_k": slow_k, "slow_d": slow_d,
|
||||
"rsi": rsi, "rsis": rsis,
|
||||
"changeLine": changeLine, "baseLine": baseLine, "leadingSpan1": leadingSpan1, "leadingSpan2": leadingSpan2,
|
||||
"changeLine": changeLine, "baseLine": baseLine, "laggingSpan": laggingSpan, "leadingSpan1": leadingSpan1, "leadingSpan2": leadingSpan2,
|
||||
|
||||
"label": label
|
||||
}
|
||||
@@ -982,20 +672,19 @@ class BuySellChecker:
|
||||
buy, buy_weight, buy_type = self.getBuyPriceAndWeight(data, last_index)
|
||||
sell, sell_weight, sell_type = self.getSellPriceAndWeight(data, last_index)
|
||||
|
||||
if buy_type == 1:
|
||||
self.buy_type = 1
|
||||
if buy_type == 0 or sell_type == 1:
|
||||
self.buy_type = -1
|
||||
if buy > -1 or self.BUY_COUNT == 1:
|
||||
if buy == -1 or self.BUY_COUNT == 1:
|
||||
buy = min(data['open'][last_index], data['close'][last_index])
|
||||
buy_weight = 1
|
||||
self.BUY_COUNT += 1
|
||||
|
||||
if self.buy_type == 1:
|
||||
bsLine['buy'] = [buy]
|
||||
bsLine['buy_weight'] = [buy_weight]
|
||||
else:
|
||||
bsLine['buy'] = [-1]
|
||||
bsLine['buy_weight'] = [-1]
|
||||
|
||||
bsLine['sell'] = [sell]
|
||||
bsLine['sell_weight'] = [sell_weight]
|
||||
|
||||
if self.BUY_COUNT > 1:
|
||||
self.BUY_COUNT = 0
|
||||
else:
|
||||
# Type=False, 시뮬레이션 적용
|
||||
bsLine['buy'] = [-1 for i in range(size)]
|
||||
@@ -1007,21 +696,20 @@ class BuySellChecker:
|
||||
buy, buy_weight, buy_type = self.getBuyPriceAndWeight(data, i)
|
||||
sell, sell_weight, sell_type = self.getSellPriceAndWeight(data, i)
|
||||
|
||||
if buy_type == 1:
|
||||
self.buy_type = 1
|
||||
if buy_type == 0 or sell_type == 1:
|
||||
self.buy_type = -1
|
||||
if buy > -1 or self.BUY_COUNT == 1:
|
||||
if buy == -1 or self.BUY_COUNT == 1:
|
||||
buy = data['low'][i]
|
||||
buy_weight = 1
|
||||
self.BUY_COUNT += 1
|
||||
|
||||
if self.buy_type == 1:
|
||||
bsLine['buy'][i] = buy
|
||||
bsLine['buy_weight'][i] = buy_weight
|
||||
else:
|
||||
bsLine['buy'][i] = -1
|
||||
bsLine['buy_weight'][i] = -1
|
||||
|
||||
bsLine['sell'][i] = sell
|
||||
bsLine['sell_weight'][i] = sell_weight
|
||||
|
||||
if self.BUY_COUNT > 1:
|
||||
self.BUY_COUNT = 0
|
||||
|
||||
return bsLine, data
|
||||
|
||||
|
||||
|
||||
@@ -26,14 +26,18 @@ class IchimokuCloud:
|
||||
# 당일을 포함한 26일 동안의 최고가와 최저가의 중간 값을 평균으로 나타낸다.
|
||||
baseLine = (df.high.rolling(b).max() + df.low.rolling(b).min()) / 2
|
||||
|
||||
# 3. 선행스팬 1 = ((기준선 + 전환선) / 2)를 26일 선행하여 배치
|
||||
# 3. 후행스팬 = 현재 close가격의 26일전 반영
|
||||
laggingSpan = [df.close.values[i+26] for i in range(len(df.close)-26)]
|
||||
laggingSpan += [df.close.values[len(df.close)-1] for i in range(26)]
|
||||
|
||||
# 4. 선행스팬 1 = ((기준선 + 전환선) / 2)를 26일 선행하여 배치
|
||||
# 전환선과 기준선의 평균값을 구해 당일 포함 26일 앞으로 이동시킨 선 (중-단기 구간의 힘을 보여줌)
|
||||
leadingSpan1 = (changeLine + baseLine) / 2
|
||||
move_LeadingSpan1 = list(leadingSpan1.values)
|
||||
for i in range(b - 1):
|
||||
move_LeadingSpan1.insert(0, None)
|
||||
|
||||
# 4. 선행스팬 2 = ((최근 52일 동안 최고가 + 최저가) / 2)를 26일 선행하여 배치
|
||||
# 5. 선행스팬 2 = ((최근 52일 동안 최고가 + 최저가) / 2)를 26일 선행하여 배치
|
||||
# 당일을 포함한 52일 동안의 최고가와 최저가의 평균을 26일 앞으로 이동시킨 선 (장기으로 형성된 선이기 때문에 가장 느리게 변함)
|
||||
leadingSpan2 = (df.high.rolling(l).max() + df.low.rolling(l).min()) / 2
|
||||
move_LeadingSpan2 = list(leadingSpan2.values)
|
||||
@@ -70,7 +74,7 @@ class IchimokuCloud:
|
||||
move_LeadingSpan1.append(None)
|
||||
|
||||
# dataframe에 컬럼 추가
|
||||
df = df.assign(changeLine=pd.Series(move_changeLine), baseLine=pd.Series(move_baseLine), leadingSpan1=pd.Series(move_LeadingSpan1), leadingSpan2=pd.Series(move_LeadingSpan2))
|
||||
df = df.assign(changeLine=pd.Series(move_changeLine), baseLine=pd.Series(move_baseLine), laggingSpan=pd.Series(laggingSpan), leadingSpan1=pd.Series(move_LeadingSpan1), leadingSpan2=pd.Series(move_LeadingSpan2))
|
||||
|
||||
return df
|
||||
|
||||
@@ -98,7 +102,11 @@ class IchimokuCloud:
|
||||
stock['PRICE'][i]['ichimokucloud_baseLine'] = df.baseLine.values[i]
|
||||
stock['PRICE'][i]['ichimokucloud_leadingSpan1'] = df.leadingSpan1.values[i]
|
||||
stock['PRICE'][i]['ichimokucloud_leadingSpan2'] = df.leadingSpan2.values[i]
|
||||
|
||||
for i in range(len(df.changeLine)-diff):
|
||||
if i < len(df.changeLine)-diff-26:
|
||||
stock['PRICE'][i]['ichimokucloud_laggingSpan'] = stock['PRICE']['close'][i + 26]
|
||||
else:
|
||||
stock['PRICE'][i]['ichimokucloud_laggingSpan'] = -1
|
||||
return
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user