init
This commit is contained in:
@@ -41,12 +41,8 @@ class HTS_122630 (HTS):
|
|||||||
else:
|
else:
|
||||||
sell_price = (int(final_price) - int(final_price) % 5) + diff
|
sell_price = (int(final_price) - int(final_price) % 5) + diff
|
||||||
if code == "A"+stock_code:
|
if code == "A"+stock_code:
|
||||||
if log_time.strftime('%H%M') < "1430":
|
orderNum = self.requestOrder(OrderType.sell, stock_code, jangoDic[code]['매도가능'], sell_price)
|
||||||
orderNum = self.requestOrder(OrderType.sell, stock_code, jangoDic[code]['매도가능'], sell_price)
|
print("ORDER_SELL", stock_code, log_time.strftime('%Y%m%d %H%M%S'), jangoDic[code]['매도가능'], sell_price)
|
||||||
print("ORDER_SELL", stock_code, log_time.strftime('%Y%m%d %H%M%S'), jangoDic[code]['매도가능'], sell_price)
|
|
||||||
else:
|
|
||||||
orderNum = self.requestOrder(OrderType.sell, stock_code, jangoDic[code]['매도가능'], sell_price)
|
|
||||||
print("ORDER_SELL", stock_code, log_time.strftime('%Y%m%d %H%M%S'), jangoDic[code]['매도가능'], sell_price)
|
|
||||||
return
|
return
|
||||||
|
|
||||||
def buyRealTime(self, today):
|
def buyRealTime(self, today):
|
||||||
@@ -115,7 +111,7 @@ class HTS_122630 (HTS):
|
|||||||
self.cancelOrderList(orderListToCancel)
|
self.cancelOrderList(orderListToCancel)
|
||||||
|
|
||||||
# 매도 한다.
|
# 매도 한다.
|
||||||
self.getSellingPrice(THIS_TIME, self.stock_code, final_price)
|
self.getSellingPrice(THIS_TIME, self.stock_code, final_price, diff=0)
|
||||||
|
|
||||||
|
|
||||||
# 로그 출력
|
# 로그 출력
|
||||||
@@ -152,7 +148,7 @@ class HTS_122630 (HTS):
|
|||||||
result = self.getRealTime(self.stock_code, today, LAST_DATA)
|
result = self.getRealTime(self.stock_code, today, LAST_DATA)
|
||||||
final_price = result["close"][len(result["close"]) - 1]
|
final_price = result["close"][len(result["close"]) - 1]
|
||||||
|
|
||||||
self.getSellingPrice(THIS_TIME, self.stock_code, final_price)
|
self.getSellingPrice(THIS_TIME, self.stock_code, final_price=0)
|
||||||
|
|
||||||
final_sell_check = True
|
final_sell_check = True
|
||||||
|
|
||||||
@@ -179,7 +175,7 @@ if __name__ == "__main__":
|
|||||||
# KODEX 인버스 * 2
|
# KODEX 인버스 * 2
|
||||||
stock_code = "122630"
|
stock_code = "122630"
|
||||||
stock_name = "KODEX 레버리지"
|
stock_name = "KODEX 레버리지"
|
||||||
buy_count = 130
|
buy_count = 120
|
||||||
|
|
||||||
hts = HTS_122630(RESOURCE_PATH, stock_code, buy_count)
|
hts = HTS_122630(RESOURCE_PATH, stock_code, buy_count)
|
||||||
today_str = today.strftime('%Y%m%d')
|
today_str = today.strftime('%Y%m%d')
|
||||||
|
|||||||
@@ -42,12 +42,8 @@ class HTS_252670 (HTS):
|
|||||||
else:
|
else:
|
||||||
sell_price = (int(final_price) - int(final_price) % 5) + diff
|
sell_price = (int(final_price) - int(final_price) % 5) + diff
|
||||||
if code == "A"+stock_code:
|
if code == "A"+stock_code:
|
||||||
if log_time.strftime('%H%M') < "1430":
|
orderNum = self.requestOrder(OrderType.sell, stock_code, jangoDic[code]['매도가능'], sell_price)
|
||||||
orderNum = self.requestOrder(OrderType.sell, stock_code, jangoDic[code]['매도가능'], sell_price)
|
print("ORDER_SELL", stock_code, log_time.strftime('%Y%m%d %H%M%S'), jangoDic[code]['매도가능'], sell_price)
|
||||||
print("ORDER_SELL", stock_code, log_time.strftime('%Y%m%d %H%M%S'), jangoDic[code]['매도가능'], sell_price)
|
|
||||||
else:
|
|
||||||
orderNum = self.requestOrder(OrderType.sell, stock_code, jangoDic[code]['매도가능'], sell_price)
|
|
||||||
print("ORDER_SELL", stock_code, log_time.strftime('%Y%m%d %H%M%S'), jangoDic[code]['매도가능'], sell_price)
|
|
||||||
return
|
return
|
||||||
|
|
||||||
def buyRealTime(self, today):
|
def buyRealTime(self, today):
|
||||||
@@ -101,7 +97,7 @@ class HTS_252670 (HTS):
|
|||||||
ORDER_LIST = self.requestOrderList()
|
ORDER_LIST = self.requestOrderList()
|
||||||
# 매수 주문을 기록한다.
|
# 매수 주문을 기록한다.
|
||||||
orderListToCancel = self.orderChecker.add(self.stock_code, OrderType.buy, orderNum, BUY_COUNT, bs_buy_price, ORDER_LIST)
|
orderListToCancel = self.orderChecker.add(self.stock_code, OrderType.buy, orderNum, BUY_COUNT, bs_buy_price, ORDER_LIST)
|
||||||
# 두 시간 이전 미체결을 모두 취소한다.
|
# 1 시간 이전 미체결을 모두 취소한다.
|
||||||
self.cancelOrderList(orderListToCancel)
|
self.cancelOrderList(orderListToCancel)
|
||||||
# 로그 출력
|
# 로그 출력
|
||||||
print("BUY", THIS_TIME.strftime('%Y%m%d %H%M%S'), BUY_COUNT, bs_buy_price, len(orderListToCancel), len(ORDER_LIST))
|
print("BUY", THIS_TIME.strftime('%Y%m%d %H%M%S'), BUY_COUNT, bs_buy_price, len(orderListToCancel), len(ORDER_LIST))
|
||||||
@@ -116,7 +112,7 @@ class HTS_252670 (HTS):
|
|||||||
self.cancelOrderList(orderListToCancel)
|
self.cancelOrderList(orderListToCancel)
|
||||||
|
|
||||||
# 매도한다.
|
# 매도한다.
|
||||||
self.getSellingPrice(THIS_TIME, self.stock_code, final_price)
|
self.getSellingPrice(THIS_TIME, self.stock_code, final_price, diff=0)
|
||||||
|
|
||||||
# 로그 출력
|
# 로그 출력
|
||||||
"""
|
"""
|
||||||
@@ -151,7 +147,7 @@ class HTS_252670 (HTS):
|
|||||||
result = self.getRealTime(self.stock_code, today, LAST_DATA)
|
result = self.getRealTime(self.stock_code, today, LAST_DATA)
|
||||||
final_price = result["close"][len(result["close"]) - 1]
|
final_price = result["close"][len(result["close"]) - 1]
|
||||||
|
|
||||||
self.getSellingPrice(THIS_TIME, self.stock_code, final_price)
|
self.getSellingPrice(THIS_TIME, self.stock_code, final_price, diff=0)
|
||||||
|
|
||||||
final_sell_check = True
|
final_sell_check = True
|
||||||
|
|
||||||
@@ -179,7 +175,7 @@ if __name__ == "__main__":
|
|||||||
# KODEX 인버스 * 2
|
# KODEX 인버스 * 2
|
||||||
stock_code = "252670"
|
stock_code = "252670"
|
||||||
stock_name = "KODEX 200선물인버스2X"
|
stock_name = "KODEX 200선물인버스2X"
|
||||||
buy_count = 1000
|
buy_count = 600
|
||||||
|
|
||||||
hts = HTS_252670(RESOURCE_PATH, stock_code, buy_count)
|
hts = HTS_252670(RESOURCE_PATH, stock_code, buy_count)
|
||||||
today_str = today.strftime('%Y%m%d')
|
today_str = today.strftime('%Y%m%d')
|
||||||
|
|||||||
@@ -175,8 +175,8 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
# to check bying
|
# to check bying
|
||||||
stock_codes = {
|
stock_codes = {
|
||||||
"122630": ['20220809'],
|
"122630": ['20220801', '20220802', '20220803', '20220804', '20220805'],
|
||||||
"252670": ['20220809'],
|
"252670": ['20220801', '20220802', '20220803', '20220804', '20220805'],
|
||||||
}
|
}
|
||||||
|
|
||||||
method = "rule" # "rule", "ml", "answer"
|
method = "rule" # "rule", "ml", "answer"
|
||||||
|
|||||||
@@ -192,19 +192,48 @@ class BuySellChecker:
|
|||||||
START_TIME_INDEX = c
|
START_TIME_INDEX = c
|
||||||
break
|
break
|
||||||
|
|
||||||
if i >= START_TIME_INDEX:
|
if i > START_TIME_INDEX:
|
||||||
# 매수 분석
|
# 매수 분석
|
||||||
|
|
||||||
if i > 740:
|
if i > 740:
|
||||||
# "15:00" 까지만 매수
|
# "15:00" 까지만 매수
|
||||||
return buy, weight
|
return buy, weight
|
||||||
|
|
||||||
# 20분과 30분 아래에서, 3분선이 5분선 위로 올라오면 매수,
|
if data["macd"][i] < -25:
|
||||||
# 20분과 30분 위에서, 3분선이 5분선 아래로 내려오면 매도,
|
if data["avg3"][i] > min(data["avg5"][i], data["avg10"][i], data["avg20"][i]):
|
||||||
if data["avg3"][i - 1] <= data["avg5"][i - 1] and data["avg3"][i] > data["avg5"][i]:
|
buy = data["high"][i]
|
||||||
if max(data["avg3"][i], data["avg5"][i]) < min(data["avg20"][i], data["avg30"][i]):
|
if i < 381 + 30:
|
||||||
if min(data["avg3"][i], data["avg5"][i]) > data["avg60"][i]:
|
weight = 1
|
||||||
buy = int((data["high"][i] + data["low"][i]) / 2)
|
else:
|
||||||
|
weight = 5
|
||||||
|
return buy, weight
|
||||||
|
|
||||||
|
if data["macd"][i] < -5 and data["rsi"][i] < 30:
|
||||||
|
if data["avg3"][i] > min(data["avg5"][i], data["avg10"][i], data["avg20"][i]):
|
||||||
|
buy = int((data["open"][i] + data["close"][i]) / 2)
|
||||||
|
weight = 2
|
||||||
|
return buy, weight
|
||||||
|
|
||||||
|
if data["slow_k"][i] < 10 and data["rsi"][i] < 30:
|
||||||
|
if data["slow_k"][i - 1] < min(data["slow_k"][i - 2], data["slow_k"][i]):
|
||||||
|
if data["avg3"][i] > min(data["avg5"][i], data["avg10"][i], data["avg20"][i]):
|
||||||
|
buy = int((data["open"][i] + data["close"][i]) / 2)
|
||||||
|
weight = 2
|
||||||
|
return buy, weight
|
||||||
|
|
||||||
|
# 3분선이 5분선이 돌파가 이전보다 높은 경우 매수
|
||||||
|
if data["avg3"][i - 1] < data["avg5"][i - 1] and data["avg3"][i] > data["avg5"][i]:
|
||||||
|
p_avg3 = 999999
|
||||||
|
for c in range(1, 50):
|
||||||
|
if data["avg3"][i-c-1] < data["avg5"][i-c-1] and data["avg3"][i-c] > data["avg5"][i-c]:
|
||||||
|
p_avg3 = data["avg3"][i-c]
|
||||||
|
break
|
||||||
|
if data["avg3"][i] > p_avg3:
|
||||||
|
if i == 382 or i == 383:
|
||||||
|
if data["close"][i] != data["high"][i]:
|
||||||
|
return -1, -1
|
||||||
|
if data["slow_k"][i] < 30 or i < 381 + 10:
|
||||||
|
buy = int((data["open"][i] + data["close"][i]) / 2)
|
||||||
weight = 1
|
weight = 1
|
||||||
return buy, weight
|
return buy, weight
|
||||||
|
|
||||||
@@ -411,13 +440,13 @@ class BuySellChecker:
|
|||||||
if i >= START_TIME_INDEX:
|
if i >= START_TIME_INDEX:
|
||||||
# 매도 분석
|
# 매도 분석
|
||||||
|
|
||||||
# 20분과 30분 아래에서, 3분선이 5분선 위로 올라오면 매수,
|
# 10분선 위에서 3분선이 5분선을 하향 돌파 하는 경우 매도
|
||||||
# 20분과 30분 위에서, 3분선이 5분선 아래로 내려오면 매도,
|
|
||||||
if data["avg3"][i - 1] >= data["avg5"][i - 1] and data["avg3"][i] < data["avg5"][i]:
|
if data["avg3"][i - 1] >= data["avg5"][i - 1] and data["avg3"][i] < data["avg5"][i]:
|
||||||
if min(data["avg3"][i], data["avg5"][i]) > max(data["avg20"][i], data["avg30"][i]):
|
if min(data["avg3"][i], data["avg5"][i]) > data["avg10"][i]:
|
||||||
sell = int((data["high"][i] + data["low"][i]) / 2)
|
if data["slow_k"][i] > 80:
|
||||||
weight = 1
|
sell = int((data["high"][i] + data["low"][i]) / 2)
|
||||||
return sell, weight
|
weight = 1
|
||||||
|
return sell, weight
|
||||||
"""
|
"""
|
||||||
# 3분선이 5분 이상 5분선 위에 있다가 5분선 아래로 내려옴
|
# 3분선이 5분 이상 5분선 위에 있다가 5분선 아래로 내려옴
|
||||||
if i >= 381 + 5:
|
if i >= 381 + 5:
|
||||||
@@ -519,12 +548,38 @@ class BuySellChecker:
|
|||||||
# "15:00" 까지만 매수
|
# "15:00" 까지만 매수
|
||||||
return buy, weight
|
return buy, weight
|
||||||
|
|
||||||
# 20분과 30분 아래에서, 3분선이 5분선 위로 올라오면 매수,
|
if data["macd"][i] < -25:
|
||||||
# 20분과 30분 위에서, 3분선이 5분선 아래로 내려오면 매도,
|
if data["avg3"][i] > min(data["avg5"][i], data["avg10"][i], data["avg20"][i]):
|
||||||
if data["avg3"][i - 1] <= data["avg5"][i - 1] and data["avg3"][i] > data["avg5"][i]:
|
buy = data["high"][i]
|
||||||
if max(data["avg3"][i], data["avg5"][i]) < min(data["avg20"][i], data["avg30"][i]):
|
if i < 381 + 30:
|
||||||
if min(data["avg3"][i], data["avg5"][i]) > data["avg60"][i]:
|
weight = 1
|
||||||
buy = int((data["high"][i] + data["low"][i]) / 2)
|
else:
|
||||||
|
weight = 5
|
||||||
|
return buy, weight
|
||||||
|
|
||||||
|
if data["macd"][i] < -5 and data["rsi"][i] < 30:
|
||||||
|
if data["avg3"][i] > min(data["avg5"][i], data["avg10"][i], data["avg20"][i]):
|
||||||
|
buy = int((data["open"][i] + data["close"][i]) / 2)
|
||||||
|
weight = 2
|
||||||
|
return buy, weight
|
||||||
|
|
||||||
|
if data["slow_k"][i] < 10 and data["rsi"][i] < 30:
|
||||||
|
if data["slow_k"][i - 1] < min(data["slow_k"][i - 2], data["slow_k"][i]):
|
||||||
|
if data["avg3"][i] > min(data["avg5"][i], data["avg10"][i], data["avg20"][i]):
|
||||||
|
buy = int((data["open"][i] + data["close"][i]) / 2)
|
||||||
|
weight = 2
|
||||||
|
return buy, weight
|
||||||
|
|
||||||
|
# 3분선이 5분선이 돌파가 이전보다 높은 경우 매수
|
||||||
|
if data["avg3"][i - 1] < data["avg5"][i - 1] and data["avg3"][i] > data["avg5"][i]:
|
||||||
|
p_avg3 = 999999
|
||||||
|
for c in range(1, 50):
|
||||||
|
if data["avg3"][i-c-1] < data["avg5"][i-c-1] and data["avg3"][i-c] > data["avg5"][i-c]:
|
||||||
|
p_avg3 = data["avg3"][i-c]
|
||||||
|
break
|
||||||
|
if data["avg3"][i] > p_avg3:
|
||||||
|
if data["slow_k"][i] < 30 or i < 381 + 10:
|
||||||
|
buy = int((data["open"][i] + data["close"][i]) / 2)
|
||||||
weight = 1
|
weight = 1
|
||||||
return buy, weight
|
return buy, weight
|
||||||
"""
|
"""
|
||||||
@@ -731,13 +786,13 @@ class BuySellChecker:
|
|||||||
if i >= START_TIME_INDEX:
|
if i >= START_TIME_INDEX:
|
||||||
# 매도 분석
|
# 매도 분석
|
||||||
|
|
||||||
# 20분과 30분 아래에서, 3분선이 5분선 위로 올라오면 매수,
|
# 10분선 위에서 3분선이 5분선을 하향 돌파 하는 경우 매도
|
||||||
# 20분과 30분 위에서, 3분선이 5분선 아래로 내려오면 매도,
|
|
||||||
if data["avg3"][i - 1] >= data["avg5"][i - 1] and data["avg3"][i] < data["avg5"][i]:
|
if data["avg3"][i - 1] >= data["avg5"][i - 1] and data["avg3"][i] < data["avg5"][i]:
|
||||||
if min(data["avg3"][i], data["avg5"][i]) > max(data["avg20"][i], data["avg30"][i]):
|
if min(data["avg3"][i], data["avg5"][i]) > data["avg10"][i]:
|
||||||
sell = int((data["high"][i] + data["low"][i]) / 2)
|
if data["slow_k"][i] > 80:
|
||||||
weight = 1
|
sell = int((data["high"][i] + data["low"][i]) / 2)
|
||||||
return sell, weight
|
weight = 1
|
||||||
|
return sell, weight
|
||||||
"""
|
"""
|
||||||
# 3분선이 5분 이상 5분선 위에 있다가 5분선 아래로 내려옴
|
# 3분선이 5분 이상 5분선 위에 있다가 5분선 아래로 내려옴
|
||||||
if i >= 381 + 5:
|
if i >= 381 + 5:
|
||||||
|
|||||||
@@ -36,16 +36,16 @@ class OrderChecker:
|
|||||||
# 1) 종목 코드를 찾는다.
|
# 1) 종목 코드를 찾는다.
|
||||||
stock_df = order_df.loc[order_df["stock_code"] == stock_code]
|
stock_df = order_df.loc[order_df["stock_code"] == stock_code]
|
||||||
|
|
||||||
# 2) 2 시간 전 계산
|
# 2) 5분 전 계산
|
||||||
before_two_hour = datetime.now() - timedelta(hours=2)
|
before_two_hour = datetime.now() - timedelta(minutes=5)
|
||||||
|
|
||||||
# 3) 만약 2 시간 전 주문을 찾는다.
|
# 3) 만약 5분 전 주문을 찾는다.
|
||||||
stock_twohour_df = stock_df.loc[stock_df["datetime"] <= before_two_hour]
|
stock_twohour_df = stock_df.loc[stock_df["datetime"] <= before_two_hour]
|
||||||
|
|
||||||
# 4) 2 시간 전 주문 중에서 매수 데이터만 찾는다.
|
# 4) 5분 전 주문 중에서 매수 데이터만 찾는다.
|
||||||
orderNum_df = stock_twohour_df.loc[stock_twohour_df["type"] == OrderType.buy.value]
|
orderNum_df = stock_twohour_df.loc[stock_twohour_df["type"] == OrderType.buy.value]
|
||||||
|
|
||||||
# 5) 2시간 전 매수 항목을 별도로 추출한다.
|
# 5) 5분 전 매수 항목을 별도로 추출한다.
|
||||||
orderNumSet = set(list(orderNum_df["orderNum"]))
|
orderNumSet = set(list(orderNum_df["orderNum"]))
|
||||||
for item in orderList:
|
for item in orderList:
|
||||||
if item.orderNum in orderNumSet:
|
if item.orderNum in orderNumSet:
|
||||||
|
|||||||
Reference in New Issue
Block a user