91 lines
3.0 KiB
Bash
91 lines
3.0 KiB
Bash
#!/bin/bash
|
|
# TQQQ 손익 자동 계산기
|
|
# 현재가 기준 실시간 손익 계산
|
|
|
|
set -euo pipefail
|
|
|
|
# ============================================================================
|
|
# 포지션 설정 (MEMORY.md 기준)
|
|
# ============================================================================
|
|
SHARES=142
|
|
AVG_COST=48.50
|
|
STOP_LOSS=47.00
|
|
USD_KRW=1465.09
|
|
|
|
# ============================================================================
|
|
# 현재가 조회 (캐시 우선)
|
|
# ============================================================================
|
|
CACHE_FILE="$HOME/openclaw/memory/tqqq-cache.json"
|
|
CURRENT_PRICE=""
|
|
|
|
if [[ -f "$CACHE_FILE" ]]; then
|
|
AGE=$(( $(date +%s) - $(stat -f%m "$CACHE_FILE" 2>/dev/null || stat -c%Y "$CACHE_FILE") ))
|
|
if (( AGE <= 300 )); then
|
|
# 캐시에서 "현재가 (USD)" 라인의 숫자 추출
|
|
CURRENT_PRICE=$(jq -r '.data' "$CACHE_FILE" | grep "현재가 (USD)" | grep -oE '[0-9]+\.[0-9]+')
|
|
fi
|
|
fi
|
|
|
|
# 캐시 없으면 실시간 조회
|
|
if [[ -z "$CURRENT_PRICE" ]]; then
|
|
CURRENT_PRICE=$(python3 -c "
|
|
import yfinance as yf
|
|
ticker = yf.Ticker('TQQQ')
|
|
print(f'{ticker.info.get(\"regularMarketPrice\", ticker.info.get(\"previousClose\", 0)):.2f}')
|
|
" 2>/dev/null || echo "0")
|
|
fi
|
|
|
|
# ============================================================================
|
|
# 손익 계산
|
|
# ============================================================================
|
|
if [[ "$CURRENT_PRICE" == "0" || -z "$CURRENT_PRICE" ]]; then
|
|
echo "❌ 가격 조회 실패"
|
|
exit 1
|
|
fi
|
|
|
|
# 계산 (bc 사용)
|
|
TOTAL_COST=$(echo "$SHARES * $AVG_COST" | bc)
|
|
CURRENT_VALUE=$(echo "$SHARES * $CURRENT_PRICE" | bc)
|
|
PNL_USD=$(echo "$CURRENT_VALUE - $TOTAL_COST" | bc)
|
|
PNL_PCT=$(echo "scale=2; ($CURRENT_PRICE - $AVG_COST) / $AVG_COST * 100" | bc)
|
|
PNL_KRW=$(echo "scale=0; $PNL_USD * $USD_KRW" | bc)
|
|
STOP_LOSS_DIST=$(echo "scale=2; ($CURRENT_PRICE - $STOP_LOSS) / $STOP_LOSS * 100" | bc)
|
|
|
|
# 부호 처리
|
|
if (( $(echo "$PNL_USD >= 0" | bc -l) )); then
|
|
SIGN="+"
|
|
EMOJI="📈"
|
|
else
|
|
SIGN=""
|
|
EMOJI="📉"
|
|
fi
|
|
|
|
# ============================================================================
|
|
# 출력
|
|
# ============================================================================
|
|
cat << EOF
|
|
$EMOJI **TQQQ 손익 현황**
|
|
|
|
| 항목 | 값 |
|
|
|------|-----|
|
|
| 현재가 | \$$CURRENT_PRICE |
|
|
| 평단가 | \$$AVG_COST |
|
|
| 보유 주수 | ${SHARES}주 |
|
|
| 투자금 | \$$(printf "%.2f" $TOTAL_COST) |
|
|
| 평가금 | \$$(printf "%.2f" $CURRENT_VALUE) |
|
|
| **손익 (USD)** | **${SIGN}\$$(printf "%.2f" $PNL_USD)** |
|
|
| **손익 (KRW)** | **${SIGN}₩$(printf "%'.0f" $PNL_KRW)** |
|
|
| **수익률** | **${SIGN}${PNL_PCT}%** |
|
|
| Stop-Loss 거리 | ${STOP_LOSS_DIST}% |
|
|
|
|
EOF
|
|
|
|
# 경고 메시지
|
|
if (( $(echo "$CURRENT_PRICE <= $STOP_LOSS" | bc -l) )); then
|
|
echo "🚨 **STOP-LOSS 도달! 즉시 매도 필요!**"
|
|
elif (( $(echo "$STOP_LOSS_DIST < 3" | bc -l) )); then
|
|
echo "⚠️ Stop-Loss 근접 주의 ($STOP_LOSS_DIST%)"
|
|
elif (( $(echo "$PNL_PCT >= 10" | bc -l) )); then
|
|
echo "🎯 **익절 검토 구간 (+$PNL_PCT%)**"
|
|
fi
|