same_platform_hedging_demo.ts 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. #!/usr/bin/env tsx
  2. /**
  3. * 同一平台对冲演示
  4. * 展示如何在同一交易所内使用多个账户进行对冲操作
  5. * 支持代理配置,实现网络层面的账户隔离
  6. */
  7. import { Config } from '../src/config/simpleEnv.js'
  8. import { SamePlatformHedgingManager } from '../src/core/hedging/SamePlatformHedgingManager.js'
  9. import { logger } from '../src/utils/logger.js'
  10. async function samePlatformHedgingDemo() {
  11. console.log('🔄 同一平台对冲演示')
  12. console.log('='.repeat(50))
  13. try {
  14. // 1. 演示配置检查
  15. console.log('\\n📋 第一步: 检查代理和账户配置...')
  16. console.log('\\n🌐 代理配置状态:')
  17. console.log(` 全局代理: ${Config.proxy.isConfigured() ? '✅ 已配置' : '❌ 未配置'}`)
  18. console.log(` Aster代理: ${Config.proxy.isConfigured('aster') ? '✅ 已配置' : '❌ 未配置'}`)
  19. console.log(` Pacifica代理: ${Config.proxy.isConfigured('pacifica') ? '✅ 已配置' : '❌ 未配置'}`)
  20. console.log(` Binance代理: ${Config.proxy.isConfigured('binance') ? '✅ 已配置' : '❌ 未配置'}`)
  21. // 2. 创建Aster对冲管理器演示
  22. console.log('\\n🎯 第二步: 创建Aster同平台对冲管理器...')
  23. const asterHedgeManager = new SamePlatformHedgingManager('aster')
  24. // 添加多个Aster账户(模拟配置)
  25. console.log('\\n➕ 添加对冲账户...')
  26. // 主账户
  27. if (Config.aster.orderUser()) {
  28. asterHedgeManager.addAccount('aster-main', {
  29. orderUser: Config.aster.orderUser(),
  30. apiKey: Config.aster.apiKey(),
  31. apiSecret: Config.aster.apiSecret(),
  32. })
  33. console.log(' ✅ Aster主账户已添加')
  34. }
  35. // 第二账户
  36. if (Config.aster.orderUser2()) {
  37. asterHedgeManager.addAccount('aster-hedge', {
  38. orderUser: Config.aster.orderUser2(),
  39. orderSigner: Config.aster.orderSigner2(),
  40. privateKey: Config.aster.privateKey2(),
  41. })
  42. console.log(' ✅ Aster对冲账户已添加')
  43. }
  44. // 如果两个账户都可用,创建对冲对
  45. if (Config.aster.orderUser() && Config.aster.orderUser2()) {
  46. console.log('\\n🔗 创建BTCUSDT对冲对...')
  47. asterHedgeManager.createHedgePair(
  48. 'btc-hedge-1',
  49. 'aster-main', // 多头账户
  50. 'aster-hedge', // 空头账户
  51. 'BTCUSDT',
  52. 1.0, // 1:1对冲比例
  53. )
  54. console.log(' ✅ BTCUSDT对冲对已创建')
  55. console.log(' 📊 对冲配置: 1:1比例,aster-main做多,aster-hedge做空')
  56. // 演示对冲状态查询
  57. console.log('\\n📈 第三步: 查询对冲状态...')
  58. const hedgeStatuses = asterHedgeManager.getHedgePairStatuses()
  59. hedgeStatuses.forEach(status => {
  60. console.log(` 对冲对: ${status.pairId}`)
  61. console.log(` 交易对: ${status.symbol}`)
  62. console.log(` 多头账户: ${status.longAccount}`)
  63. console.log(` 空头账户: ${status.shortAccount}`)
  64. console.log(` 目标比例: ${status.targetRatio}:1`)
  65. console.log(` 状态: ${status.isActive ? '激活' : '停用'}`)
  66. console.log(` 净敞口: ${status.netExposure}`)
  67. })
  68. // 演示再平衡检查(不执行实际交易)
  69. console.log('\\n⚖️ 第四步: 模拟再平衡检查...')
  70. try {
  71. // 注意:这会尝试真实的API调用,在demo中可能会失败
  72. const rebalanceNeeded = await asterHedgeManager.rebalanceHedgePair('btc-hedge-1', 0.01)
  73. console.log(` 再平衡结果: ${rebalanceNeeded ? '已执行' : '无需调整'}`)
  74. } catch (error: any) {
  75. console.log(` ⚠️ 再平衡检查失败(预期,因为是演示): ${error.message}`)
  76. }
  77. } else {
  78. console.log(' ⚠️ 缺少Aster账户配置,跳过对冲对创建')
  79. }
  80. // 3. 创建Pacifica对冲管理器演示
  81. console.log('\\n🌊 第五步: Pacifica同平台对冲演示...')
  82. const pacificaHedgeManager = new SamePlatformHedgingManager('pacifica')
  83. // 检查Pacifica账户配置
  84. if (Config.pacifica.account()) {
  85. pacificaHedgeManager.addAccount('pacifica-main', {
  86. account: Config.pacifica.account(),
  87. privateKey: Config.pacifica.accountPrivateKey(),
  88. })
  89. console.log(' ✅ Pacifica主账户已添加')
  90. // 在实际使用中,你会有多个Pacifica账户
  91. // 这里演示如何添加第二个账户(需要额外的环境变量)
  92. console.log(' 💡 提示: 配置多个Pacifica账户需要设置:')
  93. console.log(' PACIFICA_ACCOUNT_2=your_second_account')
  94. console.log(' PACIFICA_PRIVATE_KEY_2=your_second_private_key')
  95. } else {
  96. console.log(' ⚠️ 未配置Pacifica账户')
  97. }
  98. // 4. 展示代理配置对对冲的重要性
  99. console.log('\\n🔐 第六步: 代理配置对同平台对冲的重要性...')
  100. console.log('\\n💡 代理配置的作用:')
  101. console.log(' 🔹 网络层面隔离不同账户的API请求')
  102. console.log(' 🔹 降低被识别为同一用户的风险')
  103. console.log(' 🔹 提高对冲操作的隐蔽性')
  104. console.log(' 🔹 支持会话管理,为不同账户使用不同IP')
  105. if (Config.proxy.isAnyConfigured()) {
  106. console.log('\\n✅ 当前代理配置状态良好,支持同平台对冲')
  107. // 展示不同交易所的代理URL(脱敏)
  108. const asterProxy = Config.proxy.getUrl('aster')
  109. const pacificaProxy = Config.proxy.getUrl('pacifica')
  110. if (asterProxy) {
  111. const maskedAster = maskProxyUrl(asterProxy)
  112. console.log(` Aster代理: ${maskedAster}`)
  113. }
  114. if (pacificaProxy) {
  115. const maskedPacifica = maskProxyUrl(pacificaProxy)
  116. console.log(` Pacifica代理: ${maskedPacifica}`)
  117. }
  118. } else {
  119. console.log('\\n⚠️ 未配置代理,同平台对冲风险较高')
  120. console.log('\\n📝 推荐的代理配置示例:')
  121. console.log(`
  122. # 全局代理
  123. PROXY_ENABLED=true
  124. PROXY_HOST=your-proxy-server.com
  125. PROXY_PORT=8080
  126. PROXY_USERNAME=username
  127. PROXY_PASSWORD=password
  128. # Aster专用代理(可选,优先级更高)
  129. ASTER_PROXY_HOST=aster-proxy.com
  130. ASTER_PROXY_PORT=12321
  131. ASTER_PROXY_USER=aster_user
  132. ASTER_PROXY_PASS=aster_pass
  133. # 或使用会话管理
  134. ASTER_PROXY_SESSION_PREFIX=prefix_
  135. ASTER_PROXY_SESSION_SUFFIX=_suffix
  136. `)
  137. }
  138. console.log('\\n🎉 同平台对冲演示完成!')
  139. console.log('\\n📊 主要功能特性:')
  140. console.log(' 🔹 支持同一交易所多账户对冲')
  141. console.log(' 🔹 自动净敞口计算和监控')
  142. console.log(' 🔹 智能再平衡机制')
  143. console.log(' 🔹 代理网络隔离')
  144. console.log(' 🔹 灵活的对冲比例设置')
  145. console.log(' 🔹 实时仓位跟踪')
  146. console.log('\\n🚀 下一步建议:')
  147. console.log(' 1. 配置多个交易所账户')
  148. console.log(' 2. 设置专用代理服务器')
  149. console.log(' 3. 测试小额对冲交易')
  150. console.log(' 4. 监控对冲效果和成本')
  151. console.log(' 5. 根据市场情况调整对冲策略')
  152. } catch (error: any) {
  153. console.error('❌ 同平台对冲演示失败:', error)
  154. logger.error('同平台对冲演示失败', { error: error.message })
  155. }
  156. }
  157. /**
  158. * 脱敏显示代理URL
  159. */
  160. function maskProxyUrl(url: string): string {
  161. try {
  162. const urlObj = new URL(url)
  163. if (urlObj.username && urlObj.password) {
  164. const maskedUsername = urlObj.username.substring(0, 4) + '***'
  165. const maskedPassword = '***' + urlObj.password.substring(urlObj.password.length - 4)
  166. return `${urlObj.protocol}//${maskedUsername}:${maskedPassword}@${urlObj.host}`
  167. }
  168. return url
  169. } catch {
  170. return url
  171. }
  172. }
  173. /**
  174. * 显示同平台对冲配置帮助
  175. */
  176. function showSamePlatformHedgingHelp() {
  177. console.log('\\n💡 同平台对冲配置说明:')
  178. console.log(`
  179. # 1. 多账户配置示例
  180. ## Aster DEX多账户
  181. ASTER_ORDER_USER=0x... # 主账户
  182. ASTER_API_KEY=0x...
  183. ASTER_API_SECRET=0x...
  184. ASTER2_ORDER_USER=0x... # 对冲账户
  185. ASTER2_ORDER_SIGNER=0x...
  186. PRIVATE_KEY2=0x...
  187. ## Pacifica多账户
  188. PACIFICA_ACCOUNT=main_account_id
  189. PACIFICA_ACCOUNT_PRIVATE_KEY=main_private_key
  190. PACIFICA_ACCOUNT_2=hedge_account_id
  191. PACIFICA_PRIVATE_KEY_2=hedge_private_key
  192. # 2. 代理隔离配置
  193. ## 全局代理
  194. PROXY_ENABLED=true
  195. PROXY_HOST=proxy.example.com
  196. PROXY_PORT=8080
  197. PROXY_USERNAME=user
  198. PROXY_PASSWORD=pass
  199. ## 交易所专用代理(实现更好的隔离)
  200. ASTER_PROXY_HOST=aster-proxy.com
  201. ASTER_PROXY_USER=aster_user
  202. ASTER_PROXY_PASS=aster_pass
  203. PACIFICA_PROXY_HOST=pacifica-proxy.com
  204. PACIFICA_PROXY_USER=pacifica_user
  205. PACIFICA_PROXY_PASS=pacifica_pass
  206. # 3. 会话管理(高级功能)
  207. ASTER_PROXY_SESSION_PREFIX=country-us_session-
  208. ASTER_PROXY_SESSION_SUFFIX=_lifetime-60m
  209. # 4. 代码中使用示例
  210. import { SamePlatformHedgingManager } from '../src/core/hedging/SamePlatformHedgingManager.js'
  211. const manager = new SamePlatformHedgingManager('aster')
  212. // 添加账户
  213. manager.addAccount('main', { orderUser: '0x...', apiKey: '0x...', apiSecret: '0x...' })
  214. manager.addAccount('hedge', { orderUser: '0x...', privateKey: '0x...' })
  215. // 创建对冲对
  216. manager.createHedgePair('btc-hedge', 'main', 'hedge', 'BTCUSDT', 1.0)
  217. // 监控和再平衡
  218. const statuses = manager.getHedgePairStatuses()
  219. await manager.rebalanceHedgePair('btc-hedge', 0.01)
  220. `)
  221. }
  222. // 运行演示
  223. if (import.meta.url === `file://${process.argv[1]}`) {
  224. if (process.argv.includes('--help') || process.argv.includes('-h')) {
  225. showSamePlatformHedgingHelp()
  226. } else {
  227. samePlatformHedgingDemo()
  228. }
  229. }