config_file_account_injection.ts 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. #!/usr/bin/env tsx
  2. /**
  3. * 配置文件账户注入示例
  4. * 演示如何通过JSON配置文件动态加载多个账户
  5. */
  6. import { AccountConfigLoader } from '../src/accounts/AccountConfigLoader.js'
  7. import { UnifiedAccountManager } from '../src/accounts/UnifiedAccountManager.js'
  8. async function configFileAccountInjectionDemo() {
  9. console.log('🏦 配置文件账户注入演示')
  10. console.log('='.repeat(60))
  11. try {
  12. // 1. 创建配置加载器
  13. console.log('\n📁 第一步: 加载配置文件...')
  14. const configLoader = new AccountConfigLoader('./accounts.config.json')
  15. // 检查配置文件是否存在
  16. if (!configLoader.exists()) {
  17. console.error('❌ 配置文件不存在: accounts.config.json')
  18. console.log('💡 请先创建配置文件,参考: accounts.config.json')
  19. return
  20. }
  21. // 2. 加载配置
  22. const config = configLoader.load()
  23. console.log(`✅ 配置文件加载成功`)
  24. console.log(` 📊 总账户数: ${config.accounts.length}`)
  25. console.log(` ✅ 启用账户: ${config.accounts.filter(a => a.enabled).length}`)
  26. console.log(` 🔗 对冲组: ${config.hedgingGroups?.length || 0}`)
  27. console.log(` 📏 交易规则: ${config.tradingRules?.length || 0}`)
  28. // 3. 显示账户配置详情
  29. console.log('\n📋 账户配置详情:')
  30. config.accounts.forEach((account, index) => {
  31. const status = account.enabled ? '✅' : '❌'
  32. const trading = account.tradingEnabled ? '交易' : '只读'
  33. const hedging = account.hedgingEnabled ? '对冲' : '单向'
  34. console.log(` ${index + 1}. ${status} ${account.name} (${account.exchange})`)
  35. console.log(` 别名: ${account.alias}`)
  36. console.log(` 账户: ${account.accountId}`)
  37. console.log(` 优先级: ${account.priority}`)
  38. console.log(` 模式: ${trading} | ${hedging}`)
  39. console.log(
  40. ` 限额: $${account.maxPositionUsd.toLocaleString()} / $${account.maxDailyVolumeUsd.toLocaleString()}`,
  41. )
  42. console.log()
  43. })
  44. // 4. 显示对冲组配置
  45. if (config.hedgingGroups && config.hedgingGroups.length > 0) {
  46. console.log('🔗 对冲组配置:')
  47. config.hedgingGroups.forEach((group, index) => {
  48. const status = group.enabled ? '✅' : '❌'
  49. console.log(` ${index + 1}. ${status} ${group.name} (${group.strategy})`)
  50. console.log(` 账户: ${group.accounts.join(', ')}`)
  51. console.log(` 最大敞口: $${group.maxExposureUsd.toLocaleString()}`)
  52. console.log()
  53. })
  54. }
  55. // 5. 显示交易规则
  56. if (config.tradingRules && config.tradingRules.length > 0) {
  57. console.log('📏 交易规则:')
  58. config.tradingRules.forEach((rule, index) => {
  59. const status = rule.enabled ? '✅' : '❌'
  60. console.log(` ${index + 1}. ${status} ${rule.name}`)
  61. console.log(` 账户: ${rule.accounts.join(', ')}`)
  62. console.log(` 交易对: ${rule.symbols.join(', ')}`)
  63. console.log(` 订单限额: $${rule.minOrderSizeUsd} - $${rule.maxOrderSizeUsd}`)
  64. console.log(` 最大滑点: ${(rule.maxSlippage * 100).toFixed(2)}%`)
  65. console.log(` 冷却时间: ${rule.cooldownMs}ms`)
  66. console.log()
  67. })
  68. }
  69. // 6. 创建统一账户管理器并注入账户
  70. console.log('🚀 第二步: 创建统一账户管理器并注入账户...')
  71. const unifiedManager = new UnifiedAccountManager({
  72. enableFailover: true,
  73. maxRetries: 3,
  74. retryDelayMs: 1000,
  75. })
  76. // 7. 转换配置格式并批量注册
  77. const enabledAccounts = configLoader.getEnabledAccounts()
  78. console.log(`📝 准备注册 ${enabledAccounts.length} 个启用的账户...`)
  79. const accountConfigs = configLoader.convertToAccountConfigs(enabledAccounts)
  80. // 模拟注册过程 (实际环境中会连接真实交易所)
  81. console.log('\n💼 账户注册过程:')
  82. for (const accountConfig of accountConfigs) {
  83. try {
  84. console.log(` 📋 注册账户: ${accountConfig.name || accountConfig.exchange}`)
  85. console.log(` 交易所: ${accountConfig.exchange}`)
  86. console.log(` 账户ID: ${accountConfig.accountId}`)
  87. console.log(` 别名: ${accountConfig.alias}`)
  88. // 检查认证信息是否完整
  89. const authComplete = checkAuthConfig(accountConfig)
  90. if (authComplete) {
  91. console.log(` ✅ 认证信息完整`)
  92. } else {
  93. console.log(` ⚠️ 认证信息不完整 (可能缺少环境变量)`)
  94. }
  95. // 在真实环境中这里会调用:
  96. // await unifiedManager.registerAccount(accountConfig)
  97. console.log(` ✅ 注册成功`)
  98. console.log()
  99. } catch (error) {
  100. console.error(` ❌ 注册失败: ${error}`)
  101. console.log()
  102. }
  103. }
  104. // 8. 监听配置文件变更 (可选)
  105. console.log('👁️ 第三步: 启用配置文件热更新监听...')
  106. configLoader.on('config_changed', (newConfig, oldConfig) => {
  107. console.log('📄 配置文件已更新!')
  108. console.log(` 新配置账户数: ${newConfig.accounts.length}`)
  109. console.log(` 旧配置账户数: ${oldConfig?.accounts.length || 0}`)
  110. // 实际环境中这里会重新加载账户
  111. console.log('🔄 重新加载账户配置...')
  112. })
  113. configLoader.on('config_error', error => {
  114. console.error('❌ 配置文件重载失败:', error)
  115. })
  116. // 启动监听 (演示模式下不启用)
  117. // configLoader.startWatching()
  118. console.log('✅ 配置文件账户注入演示完成!')
  119. console.log('\n💡 使用方法:')
  120. console.log('1. 编辑 accounts.config.json 文件')
  121. console.log('2. 设置对应的环境变量')
  122. console.log('3. 运行系统,账户会自动注入')
  123. console.log('4. 支持配置文件热更新 (生产环境)')
  124. } catch (error) {
  125. console.error('❌ 演示失败:', error)
  126. }
  127. }
  128. /**
  129. * 检查账户认证配置是否完整
  130. */
  131. function checkAuthConfig(accountConfig: any): boolean {
  132. const exchange = accountConfig.exchange
  133. switch (exchange) {
  134. case 'pacifica':
  135. return !!(accountConfig.privateKey && accountConfig.accountId)
  136. case 'aster':
  137. return !!(accountConfig.user && accountConfig.signer && accountConfig.privateKey)
  138. case 'binance':
  139. return !!(accountConfig.apiKey && accountConfig.apiSecret)
  140. default:
  141. return false
  142. }
  143. }
  144. /**
  145. * 显示如何使用的帮助信息
  146. */
  147. function showUsageHelp() {
  148. console.log('\n📚 配置文件格式说明:')
  149. console.log(`
  150. {
  151. "accounts": [
  152. {
  153. "name": "pacifica-main", // 账户名称 (唯一)
  154. "exchange": "pacifica", // 交易所类型
  155. "accountId": "main-account-1", // 账户标识
  156. "alias": "Pacifica主账户", // 显示别名
  157. "enabled": true, // 是否启用
  158. "priority": 1, // 优先级 (数字越小优先级越高)
  159. "tradingEnabled": true, // 是否允许交易
  160. "hedgingEnabled": true, // 是否参与对冲
  161. "maxPositionUsd": 10000, // 最大仓位限额
  162. "maxDailyVolumeUsd": 100000, // 最大日交易量
  163. "auth": {
  164. "privateKeyEnv": "PACIFICA_PRIVATE_KEY_1", // 环境变量引用
  165. "accountIdEnv": "PACIFICA_ACCOUNT_1"
  166. }
  167. }
  168. ]
  169. }`)
  170. console.log('\n🔑 环境变量设置示例:')
  171. console.log(`
  172. # Pacifica 账户
  173. export PACIFICA_PRIVATE_KEY_1="your_base58_private_key_1"
  174. export PACIFICA_ACCOUNT_1="your_account_id_1"
  175. export PACIFICA_PRIVATE_KEY_2="your_base58_private_key_2"
  176. export PACIFICA_ACCOUNT_2="your_account_id_2"
  177. # Aster 账户
  178. export ASTER_ORDER_USER_1="0x..."
  179. export ASTER_ORDER_SIGNER_1="0x..."
  180. export ASTER_PRIVATE_KEY_1="0x..."
  181. # Binance 账户
  182. export BINANCE_API_KEY="your_api_key"
  183. export BINANCE_SECRET_KEY="your_secret_key"
  184. `)
  185. }
  186. // 运行演示
  187. if (import.meta.url === `file://${process.argv[1]}`) {
  188. // 检查是否需要显示帮助
  189. if (process.argv.includes('--help') || process.argv.includes('-h')) {
  190. showUsageHelp()
  191. } else {
  192. configFileAccountInjectionDemo()
  193. }
  194. }