52 lines
1.4 KiB
Python
52 lines
1.4 KiB
Python
|
|
"""
|
||
|
|
kill_switch/kill.py
|
||
|
|
긴급 전량 청산 스크립트
|
||
|
|
단독 실행: python kill_switch/kill.py
|
||
|
|
"""
|
||
|
|
import os, sys, asyncio
|
||
|
|
from pathlib import Path
|
||
|
|
|
||
|
|
def load_env():
|
||
|
|
for p in [Path(".env"), Path("../.env")]:
|
||
|
|
if p.exists():
|
||
|
|
with open(p) as f:
|
||
|
|
for line in f:
|
||
|
|
line = line.strip()
|
||
|
|
if not line or line.startswith("#") or "=" not in line:
|
||
|
|
continue
|
||
|
|
k, _, v = line.partition("=")
|
||
|
|
k = k.strip(); v = v.strip().strip('"').strip("'")
|
||
|
|
if k and v and k not in os.environ:
|
||
|
|
os.environ[k] = v
|
||
|
|
break
|
||
|
|
|
||
|
|
load_env()
|
||
|
|
sys.path.insert(0, str(Path(__file__).parent.parent))
|
||
|
|
|
||
|
|
from app.execution.kis_client import KISClient
|
||
|
|
|
||
|
|
async def kill_all():
|
||
|
|
print("=" * 40)
|
||
|
|
print(" 긴급 전량 청산 실행")
|
||
|
|
print("=" * 40)
|
||
|
|
|
||
|
|
kis = KISClient()
|
||
|
|
balance = await kis.get_balance()
|
||
|
|
holdings = balance.get("holdings", [])
|
||
|
|
|
||
|
|
if not holdings:
|
||
|
|
print(" 보유 종목 없음")
|
||
|
|
return
|
||
|
|
|
||
|
|
print(f" 보유 종목: {len(holdings)}개")
|
||
|
|
for h in holdings:
|
||
|
|
print(f" 청산 중: {h['name']}({h['ticker']}) {h['qty']}주")
|
||
|
|
await kis.order_sell(h["ticker"], h["qty"])
|
||
|
|
print(f" ✅ 완료")
|
||
|
|
await asyncio.sleep(0.5)
|
||
|
|
|
||
|
|
print(" 전량 청산 완료")
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
asyncio.run(kill_all())
|