[2026-05-18] 슬래시 커맨드 프로젝트로 이동 (git 관리)
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
# stop-bot — 봇 정산 후 종료
|
||||
|
||||
보유 포지션 현황 확인 → 오늘 결산 Discord 전송 → 봇 프로세스 종료.
|
||||
장 중 수동 종료 시 사용. 다음 `/start-bot`으로 깨끗하게 재시작 가능.
|
||||
|
||||
## 실행 순서
|
||||
|
||||
### 1. 현재 수익 현황 출력
|
||||
```bash
|
||||
python app/ai/status.py
|
||||
```
|
||||
|
||||
### 2. 오늘 결산 Discord 전송
|
||||
```python
|
||||
import asyncio, sys, os
|
||||
sys.path.insert(0, '.')
|
||||
from app.main import load_env; load_env()
|
||||
from app.db.models import get_conn
|
||||
from app.monitor.notifier import send
|
||||
from datetime import datetime
|
||||
|
||||
today = datetime.now().strftime("%Y-%m-%d")
|
||||
now_str = datetime.now().strftime("%H:%M")
|
||||
|
||||
with get_conn() as conn:
|
||||
rows = conn.execute("""
|
||||
SELECT pnl FROM trades
|
||||
WHERE date=? AND exit_time IS NOT NULL
|
||||
""", (today,)).fetchall()
|
||||
open_cnt = conn.execute("SELECT COUNT(*) FROM positions").fetchone()[0]
|
||||
|
||||
pnls = [r[0] for r in rows if r[0] is not None]
|
||||
total = len(pnls)
|
||||
wins = sum(1 for p in pnls if p > 0)
|
||||
losses = total - wins
|
||||
net = sum(pnls)
|
||||
sign = "+" if net >= 0 else ""
|
||||
|
||||
msg = (
|
||||
f"[수동종료] {today} {now_str} 결산\n"
|
||||
f"체결: {total}회 (승{wins} 패{losses}) | 실현손익: {sign}{net:,.0f}원\n"
|
||||
f"미청산 포지션: {open_cnt}개 (청산 없이 종료됨)"
|
||||
)
|
||||
asyncio.run(send(msg))
|
||||
print('Discord 결산 전송 완료')
|
||||
```
|
||||
|
||||
### 3. 봇 프로세스 종료
|
||||
```python
|
||||
import subprocess, os
|
||||
|
||||
pid_file = r'C:\Users\whdwo\OneDrive\바탕 화면\stockbot_v3\logs\bot.pid'
|
||||
|
||||
killed = []
|
||||
|
||||
# PID 파일로 종료
|
||||
if os.path.exists(pid_file):
|
||||
try:
|
||||
pid = int(open(pid_file).read().strip())
|
||||
r = subprocess.run(['taskkill', '/PID', str(pid), '/F'], capture_output=True)
|
||||
if r.returncode == 0:
|
||||
killed.append(pid)
|
||||
except Exception:
|
||||
pass
|
||||
os.remove(pid_file)
|
||||
|
||||
# 잔존 프로세스 스캔
|
||||
r = subprocess.run(
|
||||
['powershell', '-Command',
|
||||
'Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -like "*app/main.py*" -or $_.CommandLine -like "*app\\main.py*" } | Select-Object -ExpandProperty ProcessId'],
|
||||
capture_output=True, text=True
|
||||
)
|
||||
for pid_str in r.stdout.strip().splitlines():
|
||||
if pid_str.strip().isdigit():
|
||||
pid = int(pid_str.strip())
|
||||
subprocess.run(['taskkill', '/PID', str(pid), '/F'], capture_output=True)
|
||||
killed.append(pid)
|
||||
|
||||
if killed:
|
||||
print(f'봇 종료 완료 (PID: {", ".join(str(p) for p in set(killed))})')
|
||||
else:
|
||||
print('실행 중인 봇 없음')
|
||||
```
|
||||
|
||||
### 4. 완료
|
||||
"봇 종료 완료. 재시작하려면 /start-bot 실행" 메시지를 출력하고 종료한다.
|
||||
Reference in New Issue
Block a user