Pharos
Account

exchange.GetAccount()

获取账户资产信息。

语法

python
account = exchange.GetAccount()

返回值

返回一个字典,包含以下字段:

字段类型说明现货期货/合约
Balancefloat可用余额(计价货币,如 USDT)
FrozenBalancefloat冻结余额(挂单占用)
Stocksfloat可用币数量(基础货币,如 BTC)0
FrozenStocksfloat冻结币数量0
Equityfloat账户权益(Balance + 未实现盈亏)0
UPnLfloat未实现盈亏0
Infoobject交易所原始响应数据(完整JSON)

字段说明

现货交易

  • Balance: USDT等计价货币的可用余额
  • FrozenBalance: 挂单占用的USDT
  • Stocks: BTC等基础货币的可用数量
  • FrozenStocks: 挂单占用的BTC数量
  • Equity: 始终为 0
  • UPnL: 始终为 0

期货/合约交易

  • Balance: 可用保证金(USDT)
  • FrozenBalance: 挂单占用的保证金
  • Equity: 账户权益 = Balance + 未实现盈亏(包含所有持仓的浮动盈亏)
  • UPnL: 未实现盈亏(所有持仓的浮动盈亏总和)
  • Stocks: 通常为 0(期货不持有实际币)
  • FrozenStocks: 通常为 0

Info 字段

包含交易所返回的完整原始数据(JSON对象),不同交易所格式可能不同。可用于获取更详细的账户信息。

示例

基础用法

python
account = exchange.GetAccount()

# 现货账户
Log("可用余额(USDT):", account['Balance'])
Log("冻结余额(USDT):", account['FrozenBalance'])
Log("可用币量(BTC):", account['Stocks'])
Log("冻结币量(BTC):", account['FrozenStocks'])

# 期货账户
Log("账户权益:", account['Equity'])
Log("未实现盈亏:", account['UPnL'])
Log("可用保证金:", account['Balance'])

# 原始数据
Log("交易所原始数据:", account['Info'])

期货账户 - 计算总资产

python
def get_futures_total_assets():
    """获取期货账户总资产(Equity = Balance + 未实现盈亏)"""
    account = exchange.GetAccount()
    
    equity = account['Equity']           # 账户权益
    balance = account['Balance']         # 可用保证金
    frozen = account['FrozenBalance']    # 冻结保证金
    upnl = account['UPnL']               # 未实现盈亏
    
    Log(f"账户权益: {equity:.2f} USDT")
    Log(f"可用保证金: {balance:.2f} USDT")
    Log(f"冻结保证金: {frozen:.2f} USDT")
    Log(f"未实现盈亏: {upnl:.2f} USDT")
    
    # 验证公式
    assert abs(equity - (balance + upnl)) < 0.01, "权益计算不匹配"
    
    return equity

total = get_futures_total_assets()

现货账户 - 计算总价值

python
def calculate_spot_total_value():
    """计算现货账户总价值(以USDT计)"""
    account = exchange.GetAccount()
    ticker = exchange.GetTicker()
    
    # 计价货币总额
    total_balance = account['Balance'] + account['FrozenBalance']
    
    # 基础货币总额(转换为USDT)
    total_stocks = account['Stocks'] + account['FrozenStocks']
    stocks_value = total_stocks * ticker['Last']
    
    # 总价值
    total_value = total_balance + stocks_value
    
    Log(f"USDT总额: {total_balance:.2f}")
    Log(f"BTC总量: {total_stocks:.6f} (价值: {stocks_value:.2f} USDT)")
    Log(f"账户总价值: {total_value:.2f} USDT")
    
    return total_value

total = calculate_spot_total_value()

检查余额是否充足

python
def check_balance(required_usdt, required_btc=0):
    """检查余额是否充足"""
    account = exchange.GetAccount()
    
    if account['Balance'] < required_usdt:
        Log(f"USDT余额不足: 需要 {required_usdt}, 可用 {account['Balance']}")
        return False
    
    if account['Stocks'] < required_btc:
        Log(f"BTC余额不足: 需要 {required_btc}, 可用 {account['Stocks']}")
        return False
    
    return True

# 下单前检查
if check_balance(required_usdt=1000):
    exchange.Buy(50000, 0.02)
else:
    Log("余额不足,无法下单")

期货 - 监控盈亏和风险

python
def monitor_futures_risk():
    """监控期货账户风险"""
    account = exchange.GetAccount()
    positions = exchange.GetPosition()
    
    equity = account['Equity']
    upnl = account['UPnL']
    margin_used = account['FrozenBalance']
    
    # 计算盈亏率
    if equity > 0:
        pnl_rate = (upnl / equity) * 100
        Log(f"当前盈亏率: {pnl_rate:.2f}%")
        
        # 风险预警
        if pnl_rate < -10:
            Log("⚠️ 警告:浮亏超过10%", "#ff0000")
        elif pnl_rate > 20:
            Log("💰 盈利超过20%,考虑止盈", "#00ff00")
    
    # 计算保证金使用率
    if equity > 0:
        margin_ratio = (margin_used / equity) * 100
        Log(f"保证金使用率: {margin_ratio:.2f}%")
        
        if margin_ratio > 80:
            Log("⚠️ 保证金使用率过高,注意爆仓风险", "#ff0000")
    
    # 显示持仓详情
    for pos in positions:
        Log(f"持仓: {pos['Type']} {pos['Amount']} @ {pos['Price']}, 盈亏: {pos['Profit']}")

monitor_futures_risk()

计算资金使用率

python
def calculate_usage_ratio():
    """计算资金使用率"""
    account = exchange.GetAccount()
    
    # USDT使用率
    total_usdt = account['Balance'] + account['FrozenBalance']
    if total_usdt > 0:
        usdt_usage = (account['FrozenBalance'] / total_usdt) * 100
        Log(f"USDT使用率: {usdt_usage:.2f}%")
    
    # BTC使用率(仅现货)
    total_btc = account['Stocks'] + account['FrozenStocks']
    if total_btc > 0:
        btc_usage = (account['FrozenStocks'] / total_btc) * 100
        Log(f"BTC使用率: {btc_usage:.2f}%")

calculate_usage_ratio()

获取原始交易所数据

python
account = exchange.GetAccount()

# 查看原始数据结构
import json
Log("原始数据:", json.dumps(account['Info'], indent=2))

# 访问特定字段(不同交易所格式可能不同)
if 'totalMarginBalance' in account['Info']:
    Log("币安总保证金余额:", account['Info']['totalMarginBalance'])

注意事项

  1. 数据实时性:账户数据会随订单成交、充提币等操作实时变化
  2. 冻结资金:挂单时资金会被冻结,取消订单后解冻
  3. 网络延迟:账户数据可能有轻微延迟(通常小于1秒)
  4. 精度问题:余额可能包含很多小数位,显示时注意格式化
  5. 期货 vs 现货
    • 期货账户的 Equity 字段最重要,代表真实资产
    • 现货账户需要自行计算总价值(Balance + Stocks × 价格)
python
try:
    account = exchange.GetAccount()
    Log(f"余额: {account['Balance']:.2f}")  # 格式化为2位小数
except Exception as e:
    Log("获取账户失败:", str(e))

相关方法