check-positions.ts 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #!/usr/bin/env tsx
  2. import { PacificaAPIService } from '../src/services/PacificaAPIService';
  3. import { readFileSync } from 'fs';
  4. interface AccountConfig {
  5. name: string;
  6. privateKey: string;
  7. publicKey: string;
  8. }
  9. async function checkPositions() {
  10. console.log('📊 检查账户状态和持仓...\n');
  11. // 加载账户配置
  12. const accountsConfig: AccountConfig[] = JSON.parse(
  13. readFileSync('./config/accounts.json', 'utf-8')
  14. );
  15. for (const accountConfig of accountsConfig) {
  16. console.log(`\n${'='.repeat(60)}`);
  17. console.log(`📋 账户: ${accountConfig.name}`);
  18. console.log(`🔑 公钥: ${accountConfig.publicKey}`);
  19. console.log(`${'='.repeat(60)}\n`);
  20. const apiService = new PacificaAPIService(accountConfig.privateKey);
  21. try {
  22. // 获取账户信息
  23. const accountInfo = await apiService.getAccountInfo();
  24. console.log('💰 账户信息:');
  25. console.log(` 余额 (Balance): ${accountInfo.balance} USDC`);
  26. console.log(` 账户权益 (Equity): ${accountInfo.account_equity} USDC`);
  27. console.log(` 已使用保证金: ${accountInfo.total_margin_used} USDC`);
  28. console.log(` 可用余额: ${accountInfo.available_to_spend} USDC`);
  29. console.log(` 待处理余额: ${accountInfo.pending_balance} USDC`);
  30. console.log(` 可提现余额: ${accountInfo.available_to_withdraw} USDC`);
  31. console.log(` 手续费等级: ${accountInfo.fee_level}`);
  32. // 计算保证金使用率
  33. const equity = parseFloat(accountInfo.account_equity);
  34. const marginUsed = parseFloat(accountInfo.total_margin_used);
  35. const marginUsagePercent = equity > 0 ? (marginUsed / equity * 100).toFixed(2) : 'N/A';
  36. console.log(` 保证金使用率: ${marginUsagePercent}%`);
  37. // 获取持仓信息
  38. const positions = await apiService.getPositions();
  39. console.log(`\n📈 持仓数量: ${positions.length}`);
  40. if (positions.length > 0) {
  41. console.log('\n持仓详情:');
  42. for (const pos of positions) {
  43. const pnl = parseFloat(pos.funding);
  44. const pnlSign = pnl >= 0 ? '+' : '';
  45. console.log(`\n ${pos.symbol}:`);
  46. console.log(` 方向: ${pos.side === 'bid' ? '多单 (Long)' : '空单 (Short)'}`);
  47. console.log(` 数量: ${pos.amount}`);
  48. console.log(` 入场价: ${pos.entry_price}`);
  49. console.log(` 保证金: ${pos.margin} USDC`);
  50. console.log(` 未实现盈亏: ${pnlSign}${pnl} USDC`);
  51. console.log(` 隔离保证金: ${pos.isolated ? '是' : '否'}`);
  52. }
  53. }
  54. // 获取开放订单
  55. const openOrders = await apiService.getOpenOrders();
  56. console.log(`\n📋 开放订单数量: ${openOrders.length}`);
  57. if (openOrders.length > 0) {
  58. console.log('\n开放订单详情:');
  59. for (const order of openOrders) {
  60. console.log(`\n 订单 #${order.order_id}:`);
  61. console.log(` 交易对: ${order.symbol}`);
  62. console.log(` 方向: ${order.side === 'bid' ? '买入' : '卖出'}`);
  63. console.log(` 类型: ${order.order_type}`);
  64. console.log(` 数量: ${order.amount}`);
  65. console.log(` 价格: ${order.initial_price || order.average_filled_price}`);
  66. console.log(` 状态: ${order.order_status}`);
  67. console.log(` 已成交: ${order.filled_amount}`);
  68. console.log(` 只减仓: ${order.reduce_only ? '是' : '否'}`);
  69. }
  70. }
  71. } catch (error) {
  72. console.error(`❌ 获取账户信息失败:`, error instanceof Error ? error.message : error);
  73. }
  74. // 延迟避免限流
  75. await new Promise(resolve => setTimeout(resolve, 2000));
  76. }
  77. console.log(`\n${'='.repeat(60)}`);
  78. console.log('✅ 检查完成');
  79. console.log(`${'='.repeat(60)}\n`);
  80. }
  81. checkPositions().catch(console.error);