Files
MoFin/scripts/rollback_currency.py
T

69 lines
3.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""回滚:港股 holdings/decisions cost 从 CNY 转回 HKDcurrency=HKD"""
import sqlite3, sys
sys.path.insert(0, '/home/hmo/MoFin')
from mo_models import is_hk_stock, get_hk_rate, calc_total_assets, calc_total_mv, calc_position_pct
from datetime import datetime
rate = get_hk_rate()
print(f"HK_RATE: {rate}")
db = sqlite3.connect('/home/hmo/web-dashboard/data/mofin.db')
# ── 1. holdings: 港股 currency=HKD, cost 转回 HKD ──
rows = db.execute("SELECT code, name, cost, price, shares, currency FROM holdings WHERE is_active=1").fetchall()
fixed_cost = 0
for r in rows:
code, name, cost, price, shares, curr = r
if is_hk_stock(str(code)):
# 成本从 CNY 转回 HKD: cost_cny / rate
cost_hkd = round(((cost or 0)) / rate, 2) if (cost or 0) else 0
db.execute("UPDATE holdings SET cost=?, currency='HKD' WHERE code=?", (cost_hkd, code))
print(f" HOLD {code} {name}: cost {cost or 0:.2f}CNY → {cost_hkd:.2f}HKD, curr={curr}→HKD")
fixed_cost += 1
# ── 2. holding_strategies: currency=HKD, cost/price/stop_loss/take_profit 转 HKD ──
rows = db.execute("SELECT code, name, cost, price, stop_loss, take_profit, currency FROM holding_strategies WHERE status IN ('active','updated')").fetchall()
fixed_strat = 0
for r in rows:
code, name, cost, price, sl, tp, curr = r
if is_hk_stock(str(code)):
cost_hkd = round(((cost or 0)) / rate, 2) if (cost or 0) else 0
price_hkd = round(((price or 0)) / rate, 2) if (price or 0) else 0
sl_hkd = round(((sl or 0)) / rate, 2) if (sl or 0) else 0
tp_hkd = round(((tp or 0)) / rate, 2) if (tp or 0) else 0
db.execute("UPDATE holding_strategies SET cost=?, price=?, stop_loss=?, take_profit=?, currency='HKD' WHERE code=?",
(cost_hkd, price_hkd, sl_hkd, tp_hkd, code))
print(f" STRAT {code} {name}: c {cost or 0}{cost_hkd} p {price or 0}{price_hkd} curr={curr}→HKD")
fixed_strat += 1
db.commit()
# ── 3. portfolio_summary: 用 calc_total_assets 重算(已处理 HKD→CNY)──
rows = db.execute("SELECT code, name, shares, cost, price, currency FROM holdings WHERE is_active=1").fetchall()
holdings = [dict(zip(['code','name','shares','cost','price','currency'], r)) for r in rows]
sr = db.execute("SELECT cash, frozen_cash FROM portfolio_summary WHERE id=1").fetchone()
pf = {'holdings': holdings, 'cash': sr[0] or 0, 'frozen_cash': sr[1] or 0}
mv_cny = calc_total_mv(holdings)
ta_cny = calc_total_assets(pf)
pp = calc_position_pct(pf)
# P&L: 港股按 HKD 算个股 P&L,汇总时转 CNY
total_pnl = 0
for h in holdings:
p = h['price'] or 0
c = h['cost'] or 0
s = h['shares'] or 0
if is_hk_stock(str(h['code'])):
total_pnl += (p - c) * s * rate # HKD P&L → CNY
else:
total_pnl += (p - c) * s
db.execute("UPDATE portfolio_summary SET total_mv=?, total_assets=?, total_pnl=?, position_pct=?, updated_at=? WHERE id=1",
(round(mv_cny,2), round(ta_cny,2), round(total_pnl,2), pp, datetime.now().strftime('%Y-%m-%d %H:%M:%S')))
print(f"\nportfolio_summary: mv_cny={mv_cny:.2f} ta_cny={ta_cny:.2f} pnl_cny={total_pnl:.2f} pos={pp}%")
print(f"\nDone. Fixed {fixed_cost} holdings + {fixed_strat} strategies.")
db.commit()
db.close()