| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277 |
- #!/usr/bin/env tsx
- /**
- * 同一平台对冲演示
- * 展示如何在同一交易所内使用多个账户进行对冲操作
- * 支持代理配置,实现网络层面的账户隔离
- */
- import { Config } from '../src/config/simpleEnv.js'
- import { SamePlatformHedgingManager } from '../src/core/hedging/SamePlatformHedgingManager.js'
- import { logger } from '../src/utils/logger.js'
- async function samePlatformHedgingDemo() {
- console.log('🔄 同一平台对冲演示')
- console.log('='.repeat(50))
- try {
- // 1. 演示配置检查
- console.log('\\n📋 第一步: 检查代理和账户配置...')
- console.log('\\n🌐 代理配置状态:')
- console.log(` 全局代理: ${Config.proxy.isConfigured() ? '✅ 已配置' : '❌ 未配置'}`)
- console.log(` Aster代理: ${Config.proxy.isConfigured('aster') ? '✅ 已配置' : '❌ 未配置'}`)
- console.log(` Pacifica代理: ${Config.proxy.isConfigured('pacifica') ? '✅ 已配置' : '❌ 未配置'}`)
- console.log(` Binance代理: ${Config.proxy.isConfigured('binance') ? '✅ 已配置' : '❌ 未配置'}`)
- // 2. 创建Aster对冲管理器演示
- console.log('\\n🎯 第二步: 创建Aster同平台对冲管理器...')
- const asterHedgeManager = new SamePlatformHedgingManager('aster')
- // 添加多个Aster账户(模拟配置)
- console.log('\\n➕ 添加对冲账户...')
- // 主账户
- if (Config.aster.orderUser()) {
- asterHedgeManager.addAccount('aster-main', {
- orderUser: Config.aster.orderUser(),
- apiKey: Config.aster.apiKey(),
- apiSecret: Config.aster.apiSecret(),
- })
- console.log(' ✅ Aster主账户已添加')
- }
- // 第二账户
- if (Config.aster.orderUser2()) {
- asterHedgeManager.addAccount('aster-hedge', {
- orderUser: Config.aster.orderUser2(),
- orderSigner: Config.aster.orderSigner2(),
- privateKey: Config.aster.privateKey2(),
- })
- console.log(' ✅ Aster对冲账户已添加')
- }
- // 如果两个账户都可用,创建对冲对
- if (Config.aster.orderUser() && Config.aster.orderUser2()) {
- console.log('\\n🔗 创建BTCUSDT对冲对...')
- asterHedgeManager.createHedgePair(
- 'btc-hedge-1',
- 'aster-main', // 多头账户
- 'aster-hedge', // 空头账户
- 'BTCUSDT',
- 1.0, // 1:1对冲比例
- )
- console.log(' ✅ BTCUSDT对冲对已创建')
- console.log(' 📊 对冲配置: 1:1比例,aster-main做多,aster-hedge做空')
- // 演示对冲状态查询
- console.log('\\n📈 第三步: 查询对冲状态...')
- const hedgeStatuses = asterHedgeManager.getHedgePairStatuses()
- hedgeStatuses.forEach(status => {
- console.log(` 对冲对: ${status.pairId}`)
- console.log(` 交易对: ${status.symbol}`)
- console.log(` 多头账户: ${status.longAccount}`)
- console.log(` 空头账户: ${status.shortAccount}`)
- console.log(` 目标比例: ${status.targetRatio}:1`)
- console.log(` 状态: ${status.isActive ? '激活' : '停用'}`)
- console.log(` 净敞口: ${status.netExposure}`)
- })
- // 演示再平衡检查(不执行实际交易)
- console.log('\\n⚖️ 第四步: 模拟再平衡检查...')
- try {
- // 注意:这会尝试真实的API调用,在demo中可能会失败
- const rebalanceNeeded = await asterHedgeManager.rebalanceHedgePair('btc-hedge-1', 0.01)
- console.log(` 再平衡结果: ${rebalanceNeeded ? '已执行' : '无需调整'}`)
- } catch (error: any) {
- console.log(` ⚠️ 再平衡检查失败(预期,因为是演示): ${error.message}`)
- }
- } else {
- console.log(' ⚠️ 缺少Aster账户配置,跳过对冲对创建')
- }
- // 3. 创建Pacifica对冲管理器演示
- console.log('\\n🌊 第五步: Pacifica同平台对冲演示...')
- const pacificaHedgeManager = new SamePlatformHedgingManager('pacifica')
- // 检查Pacifica账户配置
- if (Config.pacifica.account()) {
- pacificaHedgeManager.addAccount('pacifica-main', {
- account: Config.pacifica.account(),
- privateKey: Config.pacifica.accountPrivateKey(),
- })
- console.log(' ✅ Pacifica主账户已添加')
- // 在实际使用中,你会有多个Pacifica账户
- // 这里演示如何添加第二个账户(需要额外的环境变量)
- console.log(' 💡 提示: 配置多个Pacifica账户需要设置:')
- console.log(' PACIFICA_ACCOUNT_2=your_second_account')
- console.log(' PACIFICA_PRIVATE_KEY_2=your_second_private_key')
- } else {
- console.log(' ⚠️ 未配置Pacifica账户')
- }
- // 4. 展示代理配置对对冲的重要性
- console.log('\\n🔐 第六步: 代理配置对同平台对冲的重要性...')
- console.log('\\n💡 代理配置的作用:')
- console.log(' 🔹 网络层面隔离不同账户的API请求')
- console.log(' 🔹 降低被识别为同一用户的风险')
- console.log(' 🔹 提高对冲操作的隐蔽性')
- console.log(' 🔹 支持会话管理,为不同账户使用不同IP')
- if (Config.proxy.isAnyConfigured()) {
- console.log('\\n✅ 当前代理配置状态良好,支持同平台对冲')
- // 展示不同交易所的代理URL(脱敏)
- const asterProxy = Config.proxy.getUrl('aster')
- const pacificaProxy = Config.proxy.getUrl('pacifica')
- if (asterProxy) {
- const maskedAster = maskProxyUrl(asterProxy)
- console.log(` Aster代理: ${maskedAster}`)
- }
- if (pacificaProxy) {
- const maskedPacifica = maskProxyUrl(pacificaProxy)
- console.log(` Pacifica代理: ${maskedPacifica}`)
- }
- } else {
- console.log('\\n⚠️ 未配置代理,同平台对冲风险较高')
- console.log('\\n📝 推荐的代理配置示例:')
- console.log(`
- # 全局代理
- PROXY_ENABLED=true
- PROXY_HOST=your-proxy-server.com
- PROXY_PORT=8080
- PROXY_USERNAME=username
- PROXY_PASSWORD=password
- # Aster专用代理(可选,优先级更高)
- ASTER_PROXY_HOST=aster-proxy.com
- ASTER_PROXY_PORT=12321
- ASTER_PROXY_USER=aster_user
- ASTER_PROXY_PASS=aster_pass
- # 或使用会话管理
- ASTER_PROXY_SESSION_PREFIX=prefix_
- ASTER_PROXY_SESSION_SUFFIX=_suffix
- `)
- }
- console.log('\\n🎉 同平台对冲演示完成!')
- console.log('\\n📊 主要功能特性:')
- console.log(' 🔹 支持同一交易所多账户对冲')
- console.log(' 🔹 自动净敞口计算和监控')
- console.log(' 🔹 智能再平衡机制')
- console.log(' 🔹 代理网络隔离')
- console.log(' 🔹 灵活的对冲比例设置')
- console.log(' 🔹 实时仓位跟踪')
- console.log('\\n🚀 下一步建议:')
- console.log(' 1. 配置多个交易所账户')
- console.log(' 2. 设置专用代理服务器')
- console.log(' 3. 测试小额对冲交易')
- console.log(' 4. 监控对冲效果和成本')
- console.log(' 5. 根据市场情况调整对冲策略')
- } catch (error: any) {
- console.error('❌ 同平台对冲演示失败:', error)
- logger.error('同平台对冲演示失败', { error: error.message })
- }
- }
- /**
- * 脱敏显示代理URL
- */
- function maskProxyUrl(url: string): string {
- try {
- const urlObj = new URL(url)
- if (urlObj.username && urlObj.password) {
- const maskedUsername = urlObj.username.substring(0, 4) + '***'
- const maskedPassword = '***' + urlObj.password.substring(urlObj.password.length - 4)
- return `${urlObj.protocol}//${maskedUsername}:${maskedPassword}@${urlObj.host}`
- }
- return url
- } catch {
- return url
- }
- }
- /**
- * 显示同平台对冲配置帮助
- */
- function showSamePlatformHedgingHelp() {
- console.log('\\n💡 同平台对冲配置说明:')
- console.log(`
- # 1. 多账户配置示例
- ## Aster DEX多账户
- ASTER_ORDER_USER=0x... # 主账户
- ASTER_API_KEY=0x...
- ASTER_API_SECRET=0x...
- ASTER2_ORDER_USER=0x... # 对冲账户
- ASTER2_ORDER_SIGNER=0x...
- PRIVATE_KEY2=0x...
- ## Pacifica多账户
- PACIFICA_ACCOUNT=main_account_id
- PACIFICA_ACCOUNT_PRIVATE_KEY=main_private_key
- PACIFICA_ACCOUNT_2=hedge_account_id
- PACIFICA_PRIVATE_KEY_2=hedge_private_key
- # 2. 代理隔离配置
- ## 全局代理
- PROXY_ENABLED=true
- PROXY_HOST=proxy.example.com
- PROXY_PORT=8080
- PROXY_USERNAME=user
- PROXY_PASSWORD=pass
- ## 交易所专用代理(实现更好的隔离)
- ASTER_PROXY_HOST=aster-proxy.com
- ASTER_PROXY_USER=aster_user
- ASTER_PROXY_PASS=aster_pass
- PACIFICA_PROXY_HOST=pacifica-proxy.com
- PACIFICA_PROXY_USER=pacifica_user
- PACIFICA_PROXY_PASS=pacifica_pass
- # 3. 会话管理(高级功能)
- ASTER_PROXY_SESSION_PREFIX=country-us_session-
- ASTER_PROXY_SESSION_SUFFIX=_lifetime-60m
- # 4. 代码中使用示例
- import { SamePlatformHedgingManager } from '../src/core/hedging/SamePlatformHedgingManager.js'
- const manager = new SamePlatformHedgingManager('aster')
- // 添加账户
- manager.addAccount('main', { orderUser: '0x...', apiKey: '0x...', apiSecret: '0x...' })
- manager.addAccount('hedge', { orderUser: '0x...', privateKey: '0x...' })
- // 创建对冲对
- manager.createHedgePair('btc-hedge', 'main', 'hedge', 'BTCUSDT', 1.0)
- // 监控和再平衡
- const statuses = manager.getHedgePairStatuses()
- await manager.rebalanceHedgePair('btc-hedge', 0.01)
- `)
- }
- // 运行演示
- if (import.meta.url === `file://${process.argv[1]}`) {
- if (process.argv.includes('--help') || process.argv.includes('-h')) {
- showSamePlatformHedgingHelp()
- } else {
- samePlatformHedgingDemo()
- }
- }
|