#### 명 세 서 ##################################################################################################
"""
1. 사용전략
가. 위치 : HJ/common_file/strategy/KR/Dual_Momentum/01_dual_momentum_V4.py
나. 마켓타이밍 : 코스닥지수가 5일선 보다 크면 매수
다. 사용버전 : V5
2. 전략 조정 고민해보기
가. 자금의 비중관리 : ADR? ATR? 이평선?
나. 익절기준 : 내 타점
다. 손절기준 : 절대값 7%(어제종가기준)종목당 1ATR을 기준으로 생각중
라. 시간기준을 하나 넣으려고 함. 변동성이 큰 10시까지는 무시, 아니면 손실
마. 물타기 기준 : 내 타점
[변경사항]
(V3)
가. 7%시 매도인데 만약 10프로 수익났다가 -17프로가 되어야 7프로로 인식한다. 어제 종가대비 7%로 & 누적종목수익률 7% 매도
나. 매도해도 뭐때문에 매도했는지를 모름. 센드메시지 추가
(V4, 2023-09-18)
가. 투자비중을 실패시 -20%씩 삭감, 성공하면 +20% → sub_data.json파일 생성
나. init_money 도 sub_Data로 넣고, 나중에 total_amount랑 비교해서 win_cnt에 넣기
다. 15,20,25%에 각각 25%씩 매도
라. 마켓타이밍(divide factor) 3,10,20,55,120일로 변경
(V5, 23.10.13)
가. win_cnt 를 win_rate로 바꾸고 종가에 업데이트가 아니라 3시17분 매매 전 업데이트 해서 바로 적용하도록 수정
(V6, 23.10.16)
가. 중간에 오류로 멈췄다가 다시 실행하면 또 다 팔아퍼린다. 중간중간 저장하고 새로시작하면 오늘날짜로 업데이트 된 파일 사용
나. 10/19 추가수정 최초 파일 만들때 초기화 수정. 멈췄다 다시할때 ini
(V7,23.10.24)
가. 타임슬립도 충분한데 계속 max retry 걸린다.보유종목 없으면 1초마다 동일한걸 반복요청해서 그런듯 보유종목 있을때만 3시17분까지 돌고 보유종목 없으면 안돈다
(V8, 23.11.02)
가. win_rate 수정 : 연속으로 이기거나 지면 증감하고 반전되면(이기다가 지거나, 지다가 이기면) 다시 1부터 시작
(V9, 23.11.03)
가. 종목당 매수금액은 전일거래대금의 1/2000 = 0.05%
(23.11.03)
장마감시 코퍼 매수하고 매수조건에서 돈없음녀 코퍼 매도 후 매수
연속으로 지면 0.1이 아니라 0.2씩 삭감함
15시17분으로 변경
(23.11.03)
장마감시 코퍼 매수하고 매수조건에서 돈없음녀 코퍼 매도 후 매수
연속으로 지면 0.1이 아니라 0.2씩 삭감함
15시17분으로 변경
(23.11.23)
div factor에 키를 하나 놔두고 그 키 이하면 50% 삭감 120일선을 기준으로 한다.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
(23.11.23)
해당 툴 따로 가지고왔따. DM으로 시작하는것들
3일로 바꿨다.
"""
###############################################################################################
# 장이 열리는날이 아니면 프로그램 종료 ###################################################################
import exchange_calendars as ecals
import datetime as dt
from Util_discord_message import send_message
XKRX = ecals.get_calendar("XKRX") # 한국 코드
ismarketopen= XKRX.is_session(dt.date.today().strftime("%Y-%m-%d")) # 오늘은 개장일인지 확인
if ismarketopen == False :
exit(0)
else:
send_message(f'Dual Momentum 시작합니다.')
#####################################################################################################
# 나머지 import ######################################################################################
import sys, atexit, requests, time,json,pymysql,yaml,random
import pandas as pd
import Util_Hankook_KR_V3_devel_231114 as hk
import Util_Analysis_V3_devel_231114 as anal
from Util_get_access_token import get_access_token_daily
import DM_select_list
####################################################################################################
# 사용계좌 선택 / 디스코드 선택 ########################################################
with open('00_config.yaml', encoding='UTF-8') as f:
_cfg = yaml.load(f, Loader=yaml.FullLoader)
app_key = _cfg['APP_KEY']
app_secret = _cfg['APP_SECRET']
acc_no = _cfg['CANO']
acc_flag = _cfg['ACNT_PRDT_CD']
url_base = _cfg['URL_BASE']
discord_url = _cfg['DISCORD_WEBHOOK_URL']
###################################################################################
# 클래스 선언 ###########################################################################
access_token = get_access_token_daily()
# approval_key = get_approval_key(app_key,app_secret,url_base)
sd = hk.Stock_data()
buy = hk.Order_buy()
sell = hk.Order_sell()
acc = hk.Account_Info()
hk_util = hk.Common_util()
sd_db = anal.Stock_data_using_db()
ma = anal.Ma()
bb = anal.Bb()
atr= anal.ATR()
mt = anal.Market_timing()
anal_sd = anal.Stock_data()
anal_id = anal.Index_data()
####################################################################################
### 공통함수 선언 ####################################################################
def get_buy_signal(): #fdr 사용 #나중에 3,5,10으로 할 수도 있다. 지금은 5일선
code = 'KQ11' # 코스닥지수
current_price = anal_id.get_current_price(code)
sma_3_value = ma.get_sma_value(code, 3)
sma_5_value = ma.get_sma_value(code, 5)
sma_10_value = ma.get_sma_value(code, 10)
#보유종목 없을때 5일선 위에서 산다.
if current_price < sma_3_value and current_price < sma_5_value and current_price < sma_10_value:
buy_signal = False
else:
buy_signal = True
return buy_signal
def get_divide_factor(): #FDR 사용
code = 'KQ11' # 코스닥지수
kosdaq_current_value = anal_id.get_current_price(code)
ma_value_1 = ma.get_sma_value(code, 3)
ma_value_2 = ma.get_sma_value(code, 5)
ma_value_3 = ma.get_sma_value(code, 10)
ma_value_4 = ma.get_sma_value(code, 20)
ma_value_5 = ma.get_sma_value(code, 60)
key_ma_value = ma.get_sma_value(code, 120)
temp_factor = 5
if kosdaq_current_value < ma_value_1:
temp_factor = temp_factor - 1
if kosdaq_current_value < ma_value_2:
temp_factor = temp_factor - 1
if kosdaq_current_value < ma_value_3:
temp_factor = temp_factor - 1
if kosdaq_current_value < ma_value_4:
temp_factor = temp_factor - 1
if kosdaq_current_value < ma_value_5:
temp_factor = temp_factor - 1
divide_factor = temp_factor / 5
#키 이동평균보다 낮으면 50% 삭감
if kosdaq_current_value > key_ma_value:
pass
elif kosdaq_current_value < key_ma_value:
divide_factor *= 0.5
#최소값 지정
if divide_factor < 0.2:
divide_factor =0.2
return divide_factor
def get_close_dict():
# 디비 접속 및 전일 ohlc 가져오기
purchase_dict = []
db_name = "stock_analysis"
table_name = "daily_price_1m"
engine = pymysql.connect(host='localhost', user='root', password='njmr0623$$', db=f'{db_name}',
charset='utf8')
purchase_df = pd.read_sql(f"select * from {table_name} where date = (select max(date) from {table_name})",
con=engine)
print(purchase_df)
purchase_df = purchase_df.set_index(keys='code', drop=False)
purchase_dict = purchase_df.T.to_dict()
return purchase_dict
###################################################################################
if __name__ == '__main__':
try:
now = dt.datetime.now()
atexit.register(send_message, f"[{now}]=프로그램 종료됨=")
today_date = dt.datetime.now().strftime('%Y-%m-%d')
print(f'{now}_Gen01')
# 주요변수 설정 #
bought_list = [] # 초기화
send_buy_list = []
send_sell_list = []
total_amount, current_cash, bought_list = acc.update_account_info()
max_amount = total_amount
onetime_001, onetime_002, onetime_003, onetime_004, onetime_005 = True, True, True, True, True
close_dict = get_close_dict()
# sub_data 파일이 있으면 가져오고 없으면 생성
try:
with open("sub_data.json", 'r') as temp_in:
sub_data_dict = json.load(temp_in)
print(sub_data_dict)
except FileNotFoundError: # 파일 없으면 최초로 만듬
with open("sub_data.json", 'w') as temp_out:
sub_data_dict = {'date' : today_date, 'win_rate': 1, 'init_money':total_amount, "total_pct3_check":False}
json.dump(sub_data_dict, temp_out)
if sub_data_dict['date'] == today_date: # 오늘 날짜라면 오늘 처음이거나 중간에 멈추고 다시시작한거다 기존데이터에 카운터가 있으니까 그대로
pass
else: # 다르다면 어제 만들어진거니까. 초기화할꺼 초기화해주고 win_rate는 계속 가져가야함.
sub_data_dict['date'] = today_date # 초기화
sub_data_dict['total_pct3_check'] = False # 초기화
# sub_data_dict['init_money'] = total_amount #이건 어제 15시20분쯤 한걸로 계산핮 왜냐면 동시호가에서 손해본것도 계싼하게
with open("sub_data.json", 'w') as outfile:
json.dump(sub_data_dict, outfile)
# stock_pct25_cnt 파일이 있으면 가져오고 없으면 생성
try:
with open("stock_pct25_cnt.json", 'r') as temp_in:
stock_pct25_cnt_dict = json.load(temp_in)
print(sub_data_dict)
except FileNotFoundError: # 파일 없으면 최초로 만듬
with open("stock_pct25_cnt.json", 'w') as temp_out:
stock_pct25_cnt_dict = {}
stock_pct25_cnt_dict['date'] = today_date
for code in bought_list:
stock_pct25_cnt_dict[code] = 0 # 처음에 모두 0으로 만든다
json.dump(stock_pct25_cnt_dict, temp_out)
if stock_pct25_cnt_dict['date'] == today_date : #오늘 날짜라면 오늘 처음이거나 기존데이터에 카운터가 있으니까 그대로
pass
else : #다르다면 어제 만들어진거니까 초기화, 모두 0으로 만들어줘야 한다.
stock_pct25_cnt_dict = {}
stock_pct25_cnt_dict['date'] = today_date
for code in bought_list:
stock_pct25_cnt_dict[code] = 0 #처음에 모두 0으로 만든다
with open("stock_pct25_cnt.json", 'w') as outfile:
json.dump(stock_pct25_cnt_dict, outfile)
# 데이터 보내기
send_message(sub_data_dict)
send_message(stock_pct25_cnt_dict)
### 자동매매 시작 ###
while True:
try :
t_now = dt.datetime.now()
t_0900 = t_now.replace(hour=9, minute=0, second=0, microsecond=0)
t_1500 = t_now.replace(hour=15, minute=0, second=0, microsecond=0)
t_1515 = t_now.replace(hour=15, minute=15, second=0, microsecond=0)
t_1517 = t_now.replace(hour=15, minute=17, second=0, microsecond=0)
t_1520 = t_now.replace(hour=15, minute=20, second=0, microsecond=0)
t_1530 = t_now.replace(hour=15, minute=30, second=0, microsecond=0)
### 장 중 전략
if t_0900 < t_now < t_1515 and len(bought_list)>0:
total_amount, current_cash, bought_list = acc.update_account_info()
time.sleep(1)
### 오늘 최대잔고 구하기
if total_amount > max_amount:
max_amount = total_amount
for sym in bought_list:
if sym == "423160":
continue
time.sleep(random.uniform(1,2))
hold_qty, hold_amt, yield_rate, yield_amt = acc.get_one_stock_balance(sym)
name = sd.get_stock_name(sym)
current_price = sd.get_current_price(sym)
close_before=close_dict[sym]['close'] #어제 종가
print(sym,close_before)
#개별족목 7% 하락시 매도 : 이거 ATR 로 바꾸자
if current_price < close_before*0.9 or (yield_rate < -7) : # 계속하한가 맞아서 안팔리는 경우가 생긴다. 이걸 atr로 바꾸자
send_message(f'{name}_7% 이하 전량매도')
sell.bid_1(sym, hold_qty)
time.sleep(0.5)
# 개별족목 15% 상승시 25% 매도 :
if (current_price > close_before * 1.15) and stock_pct25_cnt_dict[sym]==0 and (sub_data_dict['total_pct3_check'] == False): # 계속하한가 맞아서 안팔리는 경우가 생긴다. 이걸 atr로 바꾸자
hold_qty, hold_amt, yield_rate, yield_amt = acc.get_one_stock_balance(sym)
send_message(f'{name}_15% 이상 상승 1/4 매도')
매도수량 = int(hold_qty / 4)
sell.bid_1(sym, 매도수량)
time.sleep(0.5)
stock_pct25_cnt_dict[sym] = 1
with open("stock_pct25_cnt.json", 'w') as outfile:
json.dump(stock_pct25_cnt_dict, outfile)
# 개별족목 20% 상승시 절반 매도 : 이거 ATR 로 바꾸자
elif current_price > close_before * 1.20 and stock_pct25_cnt_dict[sym]==1 and (sub_data_dict['total_pct3_check'] == False): # 계속하한가 맞아서 안팔리는 경우가 생긴다. 이걸 atr로 바꾸자
hold_qty, hold_amt, yield_rate, yield_amt = acc.get_one_stock_balance(sym)
send_message(f'{name}_20% 이상 상승 1/3 매도')
매도수량 = int(hold_qty / 3)
sell.bid_1(sym, 매도수량)
time.sleep(0.5)
stock_pct25_cnt_dict[sym] = 2
with open("stock_pct25_cnt.json", 'w') as outfile:
json.dump(stock_pct25_cnt_dict, outfile)
# 개별족목 25% 상승시 절반 매도 : 이거 ATR 로 바꾸자
elif current_price > close_before * 1.25 and stock_pct25_cnt_dict[sym] == 2 and (sub_data_dict['total_pct3_check'] == False): # 계속하한가 맞아서 안팔리는 경우가 생긴다. 이걸 atr로 바꾸자
hold_qty, hold_amt, yield_rate, yield_amt = acc.get_one_stock_balance(sym)
send_message(f'{name}_25% 이상 상승 절반매도')
매도수량 = int(hold_qty / 2)
sell.bid_1(sym, 매도수량)
time.sleep(0.5)
stock_pct25_cnt_dict[sym] = 3
with open("stock_pct25_cnt.json", 'w') as outfile:
json.dump(stock_pct25_cnt_dict, outfile)
# 전체금액 2% 하락시 모두 매도
if total_amount < (sub_data_dict['init_money'] * 0.98): #전체금액 2%이하 하락시 모두 매도
send_message(f'[TOTAL 수익률 -2% 이하 전량매도]')
for sym in bought_list :
if sym == "423160":
continue
hold_qty, hold_amt, yield_rate, yield_amt = acc.get_one_stock_balance(sym)
time.sleep(0.5)
sell.bid_1(sym, hold_qty)
time.sleep(0.5)
# (1회성)전체금액 3% 상승시 절반 매도
if onetime_001 == True and total_amount > (sub_data_dict['init_money'] * 1.03):
send_message(f'[TOTAL 수익률 +3% 이상 절반 매도]')
onetime_001 = False
sub_data_dict['total_pct3_check'] = True
with open("sub_data.json", 'w') as outfile:
json.dump(sub_data_dict, outfile)
for sym in bought_list:
if sym == "423160":
continue
if stock_pct25_cnt_dict[sym] <= 1: # 수익카운터에 의해 75%이상 잔고가 남았다면
hold_qty, hold_amt, yield_rate, yield_amt = acc.get_one_stock_balance(sym)
매도수량 = int(hold_qty / 2)
time.sleep(0.5)
sell.bid_1(sym, 매도수량)
time.sleep(0.5)
# (1회성)(수익보존)전체금액 3% 상승 후 절반매도 했는데 다시 2%하락시 전체매도
if onetime_002==True and sub_data_dict['total_pct3_check']==True and total_amount < (max_amount * 0.98): # 최대수익의 전체금액 2%이하 하락시 모두 매도
send_message(f'[수익보존 위해 전량매도]')
onetime_002=False
for sym in bought_list:
if sym == "423160":
continue
hold_qty, hold_amt, yield_rate, yield_amt = acc.get_one_stock_balance(sym)
time.sleep(0.5)
sell.bid_1(sym, hold_qty)
time.sleep(0.5)
#종가에 듀얼모멘텀 종목으로 리밸런싱
if t_1517 < t_now < t_1520:
total_amount, current_cash, bought_list = acc.update_account_info()
time.sleep(0.5)
# 듀얼모멘텀 data 만들기
while onetime_003 == True:
send_message('[15시17분 이후 듀얼모멘텀 종목 매매 시작합니다]')
bought_list = [] # 초기화
total_amount, current_cash, bought_list = acc.update_account_info()
time.sleep(0.5)
buy_signal = get_buy_signal()
divide_factor = get_divide_factor() #이평기준
# win_rate update
send_message(f'win_rate 확인용')
send_message(f'{total_amount}')
send_message(f'{sub_data_dict["init_money"]}')
if total_amount > sub_data_dict['init_money']:#승리했다면
if sub_data_dict['win_rate'] < 1 :#기존에 지고 있다가 이겼다면
sub_data_dict['win_rate'] = 1
else: # 연속으로 이기면
sub_data_dict['win_rate'] = sub_data_dict['win_rate'] + 0.1
elif total_amount == sub_data_dict['init_money']: #동점이라면
sub_data_dict['win_rate'] = sub_data_dict['win_rate']
elif total_amount < sub_data_dict['init_money']: #패배 했다면
if sub_data_dict['win_rate'] > 1: # 기존에 이기고 있다가 졌다면
sub_data_dict['win_rate'] = 1
else: # 연속으로 졌다면
sub_data_dict['win_rate'] = sub_data_dict['win_rate'] - 0.2
# 오늘 손익금액
gap_moeny = total_amount - sub_data_dict['init_money']
# 최종금액을 init 머니로. 왜냐면 장초에하면 동시호가분이 반영이 안된다. 동시호가에 손해본것도 손해본걸로 해야한다.
sub_data_dict['init_money'] = total_amount
with open("sub_data.json", 'w') as outfile:
json.dump(sub_data_dict, outfile)
# 최신 win_Rate 적용
divide_factor_2 = sub_data_dict['win_rate']
buy_amount = int(total_amount * divide_factor * divide_factor_2 / 10) # 이평에 따르고 거기에 10종목이니까 10%만
if buy_amount > total_amount*0.1: #만약 1회매수금액이 토탈금액의 10%보다 크면 그냥 10%
buy_amount = total_amount*0.1
send_message(f'########################################################')
send_message(f'[오늘의 손익] : {gap_moeny}')
send_message(f'[BUY_Signal] : {buy_signal}')
send_message(f'[이평기준 & Win_rate] : {divide_factor}&{divide_factor_2}')
send_message(f'종목별 주문 금액 : {int(buy_amount):,}원')
send_message(f'########################################################')
# 디비 접속 및 종목가져오기
# purchase_list = []
# db_name = "stock_auto_trading"
# table_name = "select_dm"
# engine = pymysql.connect(host='localhost', user='root', password='njmr0623$$', db=f'{db_name}', charset='utf8')
# purchase_df = pd.read_sql(f"select * from {table_name} where 기준일 = (select max(기준일) from {table_name})", con=engine)
# purchase_df = purchase_df.set_index(keys='종목코드', drop=False)
# purchase_list = purchase_df['종목코드'].tolist() # stock analysis에서 만들어진 듀얼모멘텀 종목, 데이터프레임 → 리스트형으로
# print(purchase_list)
# send_message(f'{purchase_df}')
#디비에서 오늘의 종목 만들기
purchase_df = DM_select_list.get_today_stock(15)
send_message(f'{purchase_df}')
purchase_list = purchase_df['종목코드'].tolist()
onetime_003 = False
### 매도 먼저
for sym in bought_list:
if sym == "423160":
continue
# time.sleep(1)
name = sd.get_stock_name(sym) #이거 필요없을거 같은데....나중에 없애자
current_price = sd.get_current_price(sym)
hold_qty, hold_amt, yield_rate, yield_amt = acc.get_one_stock_balance(sym)
#마켓타이밍으로 전량매도
if buy_signal == False:
# time.sleep(1)
send_message(f'[Buy Signal: 매도 / {name} 매도 로직 합니다]')
sell.bid_1(sym, hold_qty) #보유수량 = 주문가능수량이니까
bought_list = acc.get_holding_stock_list()
elif buy_signal == True:
if sym not in purchase_list and sym not in send_sell_list :
send_message(f'[구매목록에서 제외되어 {name} 매도 수행합니다]')
sell.bid_1(sym, hold_qty)
send_sell_list.append(sym)
bought_list = [] # 초기화
bought_list = acc.get_holding_stock_list()
if sym in purchase_list and hold_amt > buy_amount and sym not in send_sell_list :
send_message(f'[보유종목 중 매수금액 초과되어 {name} 리밸런싱 수행합니다]')
current_price = sd.get_current_price(sym)
qty = int((hold_amt - buy_amount) / current_price)
sell.bid_1(sym, qty)
bought_list = acc.get_holding_stock_list()
send_sell_list.append(sym)
### 매수 로직
total_amount, current_cash, bought_list = acc.update_account_info()
for sym in purchase_list:
# time.sleep(1)
bought_list = acc.get_holding_stock_list()
# 10종목미만이고 매수시그날 나오면 아래 수행한다.
if len(bought_list) < 10 and buy_signal == True:
hold_qty, hold_amt, yield_rate, yield_amt = acc.get_one_stock_balance(sym)
total_amount, current_cash, bought_list = acc.update_account_info()
name = sd.get_stock_name(sym)
current_price = sd.get_current_price(sym)
trans_amount = current_price * sd_db.get_volume_before_ndays(sym,-1)
buy_amount = int(total_amount * divide_factor * divide_factor_2 / 10) # 이평에 따르고 거기에 10종목이니까 10%만
if buy_amount > total_amount * 0.1: # 만약 1회매수금액이 토탈금액의 10%보다 크면 그냥 10%
buy_amount = total_amount * 0.1
time.sleep(1) # 보유금액을 못읽어왔는데 예전종목 데이터로 매수됨
# 매수금액은 전일거래대금 0.05%까지로 제한
if buy_amount > trans_amount * (1/2000) :
send_message(f'거래대금 때문에 매수금액 조정합니다')
buy_amount = trans_amount * (1/2000)
send_message(f'확인용_{name},{current_price},{trans_amount},{buy_amount}' )
# 기구매목록에 없고, 주문 나간적이 없다면 사자
if (sym not in bought_list) and (sym not in send_buy_list) :
send_message(f'[{name} 매수 수행합니다]')
if current_cash > buy_amount:
buy.ask_1(sym, buy_amount)
send_buy_list.append(sym)
bought_list = acc.get_holding_stock_list()
elif current_cash < buy_amount:
hk_util.make_money_using_kofr(buy_amount-current_cash)
buy.ask_1(sym, buy_amount)
send_buy_list.append(sym)
bought_list = acc.get_holding_stock_list()
elif (sym in bought_list) and hold_amt < buy_amount and (sym not in send_buy_list):
send_message(f'[보유종목 중 매수금액 미달되어 {name} 추가매수 수행합니다]')
buy_amount = buy_amount - hold_amt
if current_cash > buy_amount:
buy.ask_1(sym, buy_amount)
send_buy_list.append(sym)
bought_list = acc.get_holding_stock_list()
elif current_cash < buy_amount:
hk_util.make_money_using_kofr(buy_amount-current_cash)
buy.ask_1(sym, buy_amount)
send_buy_list.append(sym)
bought_list = acc.get_holding_stock_list()
#남은 금액은 kofr 매수
while onetime_004 == True:
hk_util.buy_kofr()
onetime_004 = False
if t_1520 < t_now: #종료안되고 계속 돌면서 매수금액이 뭔가 꼬이고 있다. 한번씩만
send_message(f'[장 종료되어 프로그램 종료합니다.]')
acc.account_info_to_msg()
acc.holding_stock_to_msg()
with open("sub_data.json", 'w') as outfile:
json.dump(sub_data_dict, outfile)
send_message(f'{sub_data_dict}')
exit(0)
# if t_now.minute == 0 and t_now.second <= 15:
# send_message(f'[주기적 알림] : 프로그램 정상동작중')
# time.sleep(10)
# acc.account_info_to_msg()
# acc.holding_stock_to_msg()
# maxretry
except requests.packages.urllib3.exceptions.MaxRetryError:
send_message(f'Max Retry Error 60초 대기 후 재실행')
time.sleep(60)
except requests.packages.urllib3.exceptions.ConnectionError:
send_message(f'Connection 에러발생 60초 대기 후 재실행')
time.sleep(60)
# 위에거랑 차이가 뭐지
except requests.exceptions.ConnectionError:
send_message(f'Connection 에러 2번째 발생 60초 대기 후 재실행')
time.sleep(60)
# 최상위 에러는 마지막에 놔둬야한다. 그리고 위 에러말고는 종료하게 만든다.
except Exception as e:
send_message(f"[오류 발생] : {e}")
exit(0)
# maxretry
except requests.packages.urllib3.exceptions.MaxRetryError:
send_message(f'Max Retry Error 60초 대기 후 재실행')
time.sleep(60)
except requests.packages.urllib3.exceptions.ConnectionError:
send_message(f'Connection 에러발생 60초 대기 후 재실행')
time.sleep(60)
# 위에거랑 차이가 뭐지
except requests.exceptions.ConnectionError:
send_message(f'Connection 에러 2번째 발생 60초 대기 후 재실행')
time.sleep(60)
# 최상위 에러는 마지막에 놔둬야한다. 그리고 위 에러말고는 종료하게 만든다.
except Exception as e:
send_message(f"[오류 발생] : {e}")
exit(0)
To embed this project on your website, copy the following code and paste it into your website's HTML: