43 lines
1.8 KiB
Python
43 lines
1.8 KiB
Python
"""Fix: HK stock currency=CYN, recalc portfolio_summary"""
|
|
import sqlite3, sys
|
|
sys.path.insert(0, '/home/hmo/MoFin')
|
|
from mo_models import is_hk_stock
|
|
from datetime import datetime
|
|
|
|
db = sqlite3.connect('/home/hmo/web-dashboard/data/mofin.db')
|
|
|
|
# 1. Fix all HK stock currency to CNY
|
|
fixed = 0
|
|
for r in db.execute("SELECT code, name, cost, price, shares, currency FROM holdings WHERE is_active=1"):
|
|
code, name, cost, price, shares, curr = r
|
|
if is_hk_stock(str(code)):
|
|
db.execute("UPDATE holdings SET currency='CNY' WHERE code=?", (code,))
|
|
print(f" FIXED HK currency: {code} {name}: {curr} -> CNY")
|
|
fixed += 1
|
|
print(f"Fixed {fixed} HK stock currencies\n")
|
|
|
|
# 2. Recalc portfolio_summary
|
|
rows = db.execute("SELECT code, shares, cost, price FROM holdings WHERE is_active=1").fetchall()
|
|
total_mv = sum((r[3] or 0) * (r[1] or 0) for r in rows)
|
|
total_cost = sum((r[2] or 0) * (r[1] or 0) for r in rows)
|
|
total_pnl = total_mv - total_cost
|
|
|
|
sr = db.execute("SELECT cash, frozen_cash FROM portfolio_summary WHERE id=1").fetchone()
|
|
cash = sr[0] or 0
|
|
frozen = sr[1] or 0
|
|
total_assets = total_mv + cash + frozen
|
|
position_pct = round(total_mv / total_assets * 100, 2) if total_assets > 0 else 0
|
|
|
|
db.execute("UPDATE portfolio_summary SET total_mv=?, total_assets=?, total_pnl=?, position_pct=?, updated_at=? WHERE id=1",
|
|
(round(total_mv,2), round(total_assets,2), round(total_pnl,2), position_pct, datetime.now().strftime('%Y-%m-%d %H:%M:%S')))
|
|
print(f"portfolio_summary: mv={total_mv:.2f} ta={total_assets:.2f} pnl={total_pnl:.2f} pos={position_pct}%")
|
|
|
|
# 3. Check 00700 cost
|
|
r = db.execute("SELECT cost FROM holdings WHERE code='00700'").fetchone()
|
|
if r and (r[0] is None or r[0] == 0):
|
|
print("\n⚠️ 00700 腾讯 cost=0 — 需要从 holding.xls 重新导入")
|
|
|
|
db.commit()
|
|
db.close()
|
|
print("\nDone.")
|