#!/usr/bin/env tsx /** * 配置文件账户注入示例 * 演示如何通过JSON配置文件动态加载多个账户 */ import { AccountConfigLoader } from '../src/accounts/AccountConfigLoader.js' import { UnifiedAccountManager } from '../src/accounts/UnifiedAccountManager.js' async function configFileAccountInjectionDemo() { console.log('🏦 配置文件账户注入演示') console.log('='.repeat(60)) try { // 1. 创建配置加载器 console.log('\n📁 第一步: 加载配置文件...') const configLoader = new AccountConfigLoader('./accounts.config.json') // 检查配置文件是否存在 if (!configLoader.exists()) { console.error('❌ 配置文件不存在: accounts.config.json') console.log('💡 请先创建配置文件,参考: accounts.config.json') return } // 2. 加载配置 const config = configLoader.load() console.log(`✅ 配置文件加载成功`) console.log(` 📊 总账户数: ${config.accounts.length}`) console.log(` ✅ 启用账户: ${config.accounts.filter(a => a.enabled).length}`) console.log(` 🔗 对冲组: ${config.hedgingGroups?.length || 0}`) console.log(` 📏 交易规则: ${config.tradingRules?.length || 0}`) // 3. 显示账户配置详情 console.log('\n📋 账户配置详情:') config.accounts.forEach((account, index) => { const status = account.enabled ? '✅' : '❌' const trading = account.tradingEnabled ? '交易' : '只读' const hedging = account.hedgingEnabled ? '对冲' : '单向' console.log(` ${index + 1}. ${status} ${account.name} (${account.exchange})`) console.log(` 别名: ${account.alias}`) console.log(` 账户: ${account.accountId}`) console.log(` 优先级: ${account.priority}`) console.log(` 模式: ${trading} | ${hedging}`) console.log( ` 限额: $${account.maxPositionUsd.toLocaleString()} / $${account.maxDailyVolumeUsd.toLocaleString()}`, ) console.log() }) // 4. 显示对冲组配置 if (config.hedgingGroups && config.hedgingGroups.length > 0) { console.log('🔗 对冲组配置:') config.hedgingGroups.forEach((group, index) => { const status = group.enabled ? '✅' : '❌' console.log(` ${index + 1}. ${status} ${group.name} (${group.strategy})`) console.log(` 账户: ${group.accounts.join(', ')}`) console.log(` 最大敞口: $${group.maxExposureUsd.toLocaleString()}`) console.log() }) } // 5. 显示交易规则 if (config.tradingRules && config.tradingRules.length > 0) { console.log('📏 交易规则:') config.tradingRules.forEach((rule, index) => { const status = rule.enabled ? '✅' : '❌' console.log(` ${index + 1}. ${status} ${rule.name}`) console.log(` 账户: ${rule.accounts.join(', ')}`) console.log(` 交易对: ${rule.symbols.join(', ')}`) console.log(` 订单限额: $${rule.minOrderSizeUsd} - $${rule.maxOrderSizeUsd}`) console.log(` 最大滑点: ${(rule.maxSlippage * 100).toFixed(2)}%`) console.log(` 冷却时间: ${rule.cooldownMs}ms`) console.log() }) } // 6. 创建统一账户管理器并注入账户 console.log('🚀 第二步: 创建统一账户管理器并注入账户...') const unifiedManager = new UnifiedAccountManager({ enableFailover: true, maxRetries: 3, retryDelayMs: 1000, }) // 7. 转换配置格式并批量注册 const enabledAccounts = configLoader.getEnabledAccounts() console.log(`📝 准备注册 ${enabledAccounts.length} 个启用的账户...`) const accountConfigs = configLoader.convertToAccountConfigs(enabledAccounts) // 模拟注册过程 (实际环境中会连接真实交易所) console.log('\n💼 账户注册过程:') for (const accountConfig of accountConfigs) { try { console.log(` 📋 注册账户: ${accountConfig.name || accountConfig.exchange}`) console.log(` 交易所: ${accountConfig.exchange}`) console.log(` 账户ID: ${accountConfig.accountId}`) console.log(` 别名: ${accountConfig.alias}`) // 检查认证信息是否完整 const authComplete = checkAuthConfig(accountConfig) if (authComplete) { console.log(` ✅ 认证信息完整`) } else { console.log(` ⚠️ 认证信息不完整 (可能缺少环境变量)`) } // 在真实环境中这里会调用: // await unifiedManager.registerAccount(accountConfig) console.log(` ✅ 注册成功`) console.log() } catch (error) { console.error(` ❌ 注册失败: ${error}`) console.log() } } // 8. 监听配置文件变更 (可选) console.log('👁️ 第三步: 启用配置文件热更新监听...') configLoader.on('config_changed', (newConfig, oldConfig) => { console.log('📄 配置文件已更新!') console.log(` 新配置账户数: ${newConfig.accounts.length}`) console.log(` 旧配置账户数: ${oldConfig?.accounts.length || 0}`) // 实际环境中这里会重新加载账户 console.log('🔄 重新加载账户配置...') }) configLoader.on('config_error', error => { console.error('❌ 配置文件重载失败:', error) }) // 启动监听 (演示模式下不启用) // configLoader.startWatching() console.log('✅ 配置文件账户注入演示完成!') console.log('\n💡 使用方法:') console.log('1. 编辑 accounts.config.json 文件') console.log('2. 设置对应的环境变量') console.log('3. 运行系统,账户会自动注入') console.log('4. 支持配置文件热更新 (生产环境)') } catch (error) { console.error('❌ 演示失败:', error) } } /** * 检查账户认证配置是否完整 */ function checkAuthConfig(accountConfig: any): boolean { const exchange = accountConfig.exchange switch (exchange) { case 'pacifica': return !!(accountConfig.privateKey && accountConfig.accountId) case 'aster': return !!(accountConfig.user && accountConfig.signer && accountConfig.privateKey) case 'binance': return !!(accountConfig.apiKey && accountConfig.apiSecret) default: return false } } /** * 显示如何使用的帮助信息 */ function showUsageHelp() { console.log('\n📚 配置文件格式说明:') console.log(` { "accounts": [ { "name": "pacifica-main", // 账户名称 (唯一) "exchange": "pacifica", // 交易所类型 "accountId": "main-account-1", // 账户标识 "alias": "Pacifica主账户", // 显示别名 "enabled": true, // 是否启用 "priority": 1, // 优先级 (数字越小优先级越高) "tradingEnabled": true, // 是否允许交易 "hedgingEnabled": true, // 是否参与对冲 "maxPositionUsd": 10000, // 最大仓位限额 "maxDailyVolumeUsd": 100000, // 最大日交易量 "auth": { "privateKeyEnv": "PACIFICA_PRIVATE_KEY_1", // 环境变量引用 "accountIdEnv": "PACIFICA_ACCOUNT_1" } } ] }`) console.log('\n🔑 环境变量设置示例:') console.log(` # Pacifica 账户 export PACIFICA_PRIVATE_KEY_1="your_base58_private_key_1" export PACIFICA_ACCOUNT_1="your_account_id_1" export PACIFICA_PRIVATE_KEY_2="your_base58_private_key_2" export PACIFICA_ACCOUNT_2="your_account_id_2" # Aster 账户 export ASTER_ORDER_USER_1="0x..." export ASTER_ORDER_SIGNER_1="0x..." export ASTER_PRIVATE_KEY_1="0x..." # Binance 账户 export BINANCE_API_KEY="your_api_key" export BINANCE_SECRET_KEY="your_secret_key" `) } // 运行演示 if (import.meta.url === `file://${process.argv[1]}`) { // 检查是否需要显示帮助 if (process.argv.includes('--help') || process.argv.includes('-h')) { showUsageHelp() } else { configFileAccountInjectionDemo() } }