init
This commit is contained in:
174
stock_monitor.py
174
stock_monitor.py
@@ -74,46 +74,6 @@ def send_coin_telegram_message(message_list, header):
|
||||
|
||||
return
|
||||
|
||||
def buy_ticker(symbol, data):
|
||||
try:
|
||||
# 매수 금지 시간 확인 (20분)
|
||||
current_time = datetime.now()
|
||||
if symbol in buy_cooldown:
|
||||
time_diff = current_time - buy_cooldown[symbol]
|
||||
if time_diff.total_seconds() < 1200: # 20분 = 1200초
|
||||
print(f"{symbol}: 매수 금지 중 (남은 시간: {1200 - time_diff.total_seconds():.0f}초)")
|
||||
return False
|
||||
|
||||
BUY_AMOUNT = 6000
|
||||
|
||||
if data['buy_signal'].iloc[-1] == 'movingaverage':
|
||||
BUY_AMOUNT = 70000
|
||||
elif data['buy_signal'].iloc[-1] == 'deviation40':
|
||||
BUY_AMOUNT = 40000
|
||||
elif data['buy_signal'].iloc[-1] == 'deviation240':
|
||||
BUY_AMOUNT = 6000
|
||||
|
||||
_ = hts.buyCoinMarket(symbol, BUY_AMOUNT)
|
||||
|
||||
# 매수 성공 시 금지 시간 설정 및 파일에 저장
|
||||
buy_cooldown[symbol] = current_time
|
||||
save_buy_cooldown(buy_cooldown)
|
||||
print(f"{KR_COINS[symbol]} ({symbol}): {data['Close'].iloc[-1]:.2f}: 매수 완료, 20분간 매수 금지 시작")
|
||||
|
||||
try:
|
||||
pool = Pool(12)
|
||||
pool.map(send_coin_msg, ["[KRW-COIN]" + "\n" + format_message('COIN', symbol, KR_COINS[symbol], data['Close'].iloc[-1], data['buy_signal'].iloc[-1])])
|
||||
except Exception as e:
|
||||
print(f"Error sending Telegram message: {str(e)}")
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"Error buying {symbol}: {str(e)}")
|
||||
return False
|
||||
return
|
||||
|
||||
|
||||
|
||||
def send_stock_msg(text):
|
||||
stock_client = telegram.Bot(token=STOCK_TELEGRAM_BOT_TOKEN)
|
||||
@@ -196,34 +156,51 @@ def calculate_technical_indicators(data):
|
||||
|
||||
return data
|
||||
|
||||
def check_buy_point(data, simulation=None):
|
||||
|
||||
"""
|
||||
# 매수 포인트 탐지 및 표시
|
||||
if simulation:
|
||||
recent_data = data
|
||||
else:
|
||||
# recent_data의 복사본 생성
|
||||
recent_data = data.tail(10).copy()
|
||||
def buy_ticker(symbol, data):
|
||||
try:
|
||||
# 매수 금지 시간 확인 (20분)
|
||||
current_time = datetime.now()
|
||||
if symbol in buy_cooldown:
|
||||
time_diff = current_time - buy_cooldown[symbol]
|
||||
if time_diff.total_seconds() < 1200: # 20분 = 1200초
|
||||
print(f"{symbol}: 매수 금지 중 (남은 시간: {1200 - time_diff.total_seconds():.0f}초)")
|
||||
return False
|
||||
|
||||
# 'buy_point' 열 초기화
|
||||
recent_data['buy_point'] = 0
|
||||
BUY_AMOUNT = 6000
|
||||
|
||||
# FutureWarning 해결
|
||||
if recent_data['buy_point'].iloc[-1] != 1:
|
||||
# 코드 계속
|
||||
for i in range(1, len(recent_data)):
|
||||
if all(recent_data[f'MA{n}'].iloc[i] < recent_data['MA720'].iloc[i] for n in [5, 20, 40, 120, 200, 240]) and \
|
||||
all(recent_data[f'MA{n}'].iloc[i] > recent_data[f'MA{n}'].iloc[i-1] for n in [5, 20, 40, 120, 200, 240]) and \
|
||||
recent_data['MA720'].iloc[i] < recent_data['MA1440'].iloc[i]:
|
||||
recent_data.at[recent_data.index[i], 'buy_point'] = 1
|
||||
if data['buy_signal'].iloc[-1] == 'movingaverage':
|
||||
BUY_AMOUNT = 10000
|
||||
elif data['buy_signal'].iloc[-1] == 'deviation40':
|
||||
BUY_AMOUNT = 15000
|
||||
elif data['buy_signal'].iloc[-1] == 'deviation240':
|
||||
BUY_AMOUNT = 6000
|
||||
elif data['buy_signal'].iloc[-1] == 'deviation1440':
|
||||
if symbol in ['BONK', 'PEPE', 'TON']:
|
||||
BUY_AMOUNT = 30000
|
||||
else:
|
||||
BUY_AMOUNT = 50000
|
||||
|
||||
if not simulation:
|
||||
if recent_data['buy_point'][-10:-1].sum() > 0:
|
||||
recent_data.at[recent_data.index[-1], 'buy_point'] = 1
|
||||
_ = hts.buyCoinMarket(symbol, BUY_AMOUNT)
|
||||
|
||||
return recent_data
|
||||
"""
|
||||
# 매수 성공 시 금지 시간 설정 및 파일에 저장
|
||||
buy_cooldown[symbol] = current_time
|
||||
save_buy_cooldown(buy_cooldown)
|
||||
print(f"{KR_COINS[symbol]} ({symbol}): {data['Close'].iloc[-1]:.4f}: 매수 완료, 20분간 매수 금지 시작")
|
||||
|
||||
try:
|
||||
pool = Pool(12)
|
||||
pool.map(send_coin_msg, ["[KRW-COIN]" + "\n" + format_message('COIN', symbol, KR_COINS[symbol], data['Close'].iloc[-1], data['buy_signal'].iloc[-1])])
|
||||
except Exception as e:
|
||||
print(f"Error sending Telegram message: {str(e)}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"Error buying {symbol}: {str(e)}")
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def check_buy_point(symbol, data, simulation=None):
|
||||
|
||||
# 매수 포인트 탐지 및 표시
|
||||
# 데이터 복사본 생성하여 SettingWithCopyWarning 방지
|
||||
@@ -256,20 +233,67 @@ def check_buy_point(data, simulation=None):
|
||||
data.at[data.index[-1], 'buy_signal'] = 'deviation40'
|
||||
data.at[data.index[-1], 'buy_point'] = 1
|
||||
|
||||
if symbol not in ['BONK']:
|
||||
# BONK는 240 체크하지 않음
|
||||
|
||||
if symbol in ['TRX']:
|
||||
# Deviation240(이격도 240) 기반 매수 조건: 90 이하에서 상승 전환
|
||||
if data['Deviation240'].iloc[i - 1] < data['Deviation240'].iloc[i] and data['Deviation240'].iloc[i - 1] <= 98:
|
||||
data.at[data.index[i], 'buy_signal'] = 'deviation240'
|
||||
data.at[data.index[i], 'buy_point'] = 1
|
||||
if not simulation:
|
||||
if data['buy_point'][-3:].sum() > 0:
|
||||
data.at[data.index[-1], 'buy_signal'] = 'deviation240'
|
||||
data.at[data.index[-1], 'buy_point'] = 1
|
||||
else:
|
||||
# Deviation240(이격도 240) 기반 매수 조건: 90 이하에서 상승 전환
|
||||
if data['Deviation240'].iloc[i - 1] < data['Deviation240'].iloc[i] and data['Deviation240'].iloc[i - 1] <= 90:
|
||||
data.at[data.index[i], 'buy_signal'] = 'deviation240'
|
||||
data.at[data.index[i], 'buy_point'] = 1
|
||||
if not simulation:
|
||||
if data['buy_point'][-3:].sum() > 0:
|
||||
data.at[data.index[-1], 'buy_signal'] = 'deviation240'
|
||||
data.at[data.index[-1], 'buy_point'] = 1
|
||||
|
||||
# Deviation240(이격도 240) 기반 매수 조건: 90 이하에서 상승 전환
|
||||
if data['Deviation240'].iloc[i - 1] < data['Deviation240'].iloc[i] and data['Deviation240'].iloc[i - 1] <= 90:
|
||||
data.at[data.index[i], 'buy_signal'] = 'deviation240'
|
||||
data.at[data.index[i], 'buy_point'] = 1
|
||||
if not simulation:
|
||||
if data['buy_point'][-3:].sum() > 0:
|
||||
data.at[data.index[-1], 'buy_signal'] = 'deviation240'
|
||||
data.at[data.index[-1], 'buy_point'] = 1
|
||||
if symbol in ['TON']:
|
||||
if data['Deviation1440'].iloc[i - 1] < data['Deviation1440'].iloc[i] and data['Deviation1440'].iloc[i - 1] <= 89:
|
||||
data.at[data.index[i], 'buy_signal'] = 'deviation1440'
|
||||
data.at[data.index[i], 'buy_point'] = 1
|
||||
if not simulation:
|
||||
if data['buy_point'][-3:].sum() > 0:
|
||||
data.at[data.index[-1], 'buy_signal'] = 'deviation1440'
|
||||
data.at[data.index[-1], 'buy_point'] = 1
|
||||
elif symbol in ['XRP']:
|
||||
if data['Deviation1440'].iloc[i - 1] < data['Deviation1440'].iloc[i] and data['Deviation1440'].iloc[i - 1] <= 90:
|
||||
data.at[data.index[i], 'buy_signal'] = 'deviation1440'
|
||||
data.at[data.index[i], 'buy_point'] = 1
|
||||
if not simulation:
|
||||
if data['buy_point'][-3:].sum() > 0:
|
||||
data.at[data.index[-1], 'buy_signal'] = 'deviation1440'
|
||||
data.at[data.index[-1], 'buy_point'] = 1
|
||||
elif symbol in ['BONK']:
|
||||
if data['Deviation1440'].iloc[i - 1] < data['Deviation1440'].iloc[i] and data['Deviation1440'].iloc[i - 1] <= 76:
|
||||
data.at[data.index[i], 'buy_signal'] = 'deviation1440'
|
||||
data.at[data.index[i], 'buy_point'] = 1
|
||||
if not simulation:
|
||||
if data['buy_point'][-3:].sum() > 0:
|
||||
data.at[data.index[-1], 'buy_signal'] = 'deviation1440'
|
||||
data.at[data.index[-1], 'buy_point'] = 1
|
||||
else:
|
||||
if data['Deviation1440'].iloc[i - 1] < data['Deviation1440'].iloc[i] and data['Deviation1440'].iloc[i - 1] <= 80:
|
||||
data.at[data.index[i], 'buy_signal'] = 'deviation1440'
|
||||
data.at[data.index[i], 'buy_point'] = 1
|
||||
if not simulation:
|
||||
if data['buy_point'][-3:].sum() > 0:
|
||||
data.at[data.index[-1], 'buy_signal'] = 'deviation1440'
|
||||
data.at[data.index[-1], 'buy_point'] = 1
|
||||
|
||||
return data
|
||||
|
||||
def format_message(market_type, symbol, symbol_name, close, buy_signal):
|
||||
message = f"매수 [{market_type}] {symbol_name} ({symbol}): {buy_signal} "
|
||||
message += f"현재가: {'$' if market_type == 'US' else '₩'}{close:.2f}, "
|
||||
message += f"현재가: {'$' if market_type == 'US' else '₩'}{close:.4f}, "
|
||||
return message
|
||||
|
||||
|
||||
@@ -277,7 +301,7 @@ def format_ma_message(info, market_type):
|
||||
"""MA 알림 메시지 생성"""
|
||||
prefix = '상승 ' if info.get('alert') else ''
|
||||
message = prefix + f"[{market_type}] {info['name']} ({info['symbol']}) "
|
||||
message += f"현재가: {'$' if market_type == 'US' else '₩'}{info['price']:.2f} \n"
|
||||
message += f"현재가: {'$' if market_type == 'US' else '₩'}{info['price']:.4f} \n"
|
||||
return message
|
||||
|
||||
|
||||
@@ -432,7 +456,7 @@ def monitor_us_stocks():
|
||||
if data is not None and not data.empty:
|
||||
try:
|
||||
data = calculate_technical_indicators(data)
|
||||
recent_data = check_buy_point(data) # Changed to check_buy_point
|
||||
recent_data = check_buy_point(symbol, data) # Changed to check_buy_point
|
||||
if recent_data['buy_point'].iloc[-1] != 1:
|
||||
continue
|
||||
print(f" - {US_STOCKS[symbol]} ({symbol}): {recent_data['Close'].iloc[-1]:.2f}")
|
||||
@@ -463,7 +487,7 @@ def monitor_kr_stocks():
|
||||
if data is not None and not data.empty:
|
||||
try:
|
||||
data = calculate_technical_indicators(data)
|
||||
recent_data = check_buy_point(data) # Changed to check_buy_point
|
||||
recent_data = check_buy_point(symbol, data) # Changed to check_buy_point
|
||||
if recent_data['buy_point'].iloc[-1] != 1:
|
||||
continue
|
||||
print(f" - {KR_ETFS[symbol]} ({symbol}): {recent_data['Close'].iloc[-1]:.2f}")
|
||||
@@ -503,7 +527,7 @@ def monitor_coins():
|
||||
if data is not None and not data.empty:
|
||||
try:
|
||||
data = calculate_technical_indicators(data)
|
||||
recent_data = check_buy_point(data) # Changed to check_buy_point
|
||||
recent_data = check_buy_point(symbol, data) # Changed to check_buy_point
|
||||
if recent_data['buy_point'].iloc[-1] != 1:
|
||||
continue
|
||||
|
||||
|
||||
Reference in New Issue
Block a user