@catalyst-team/poly-sdk 0.3.0 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +133 -1
- package/README.zh-CN.md +2 -0
- package/dist/scripts/dip-arb/auto-trade.d.ts +20 -0
- package/dist/scripts/dip-arb/auto-trade.d.ts.map +1 -0
- package/dist/scripts/dip-arb/auto-trade.js +373 -0
- package/dist/scripts/dip-arb/auto-trade.js.map +1 -0
- package/dist/scripts/dip-arb/example-basic.d.ts +30 -0
- package/dist/scripts/dip-arb/example-basic.d.ts.map +1 -0
- package/dist/scripts/dip-arb/example-basic.js +222 -0
- package/dist/scripts/dip-arb/example-basic.js.map +1 -0
- package/dist/scripts/dip-arb/redeem-positions.d.ts +11 -0
- package/dist/scripts/dip-arb/redeem-positions.d.ts.map +1 -0
- package/dist/scripts/dip-arb/redeem-positions.js +201 -0
- package/dist/scripts/dip-arb/redeem-positions.js.map +1 -0
- package/dist/scripts/dip-arb/scan-markets.d.ts +6 -0
- package/dist/scripts/dip-arb/scan-markets.d.ts.map +1 -0
- package/dist/scripts/dip-arb/scan-markets.js +73 -0
- package/dist/scripts/dip-arb/scan-markets.js.map +1 -0
- package/dist/src/__tests__/integration/arbitrage-service.integration.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/arbitrage-service.integration.test.js.map +1 -0
- package/dist/src/__tests__/integration/bridge-client.integration.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/bridge-client.integration.test.js.map +1 -0
- package/dist/src/__tests__/integration/ctf-client.integration.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/ctf-client.integration.test.js.map +1 -0
- package/dist/src/__tests__/integration/data-api.integration.test.d.ts.map +1 -0
- package/dist/{__tests__ → src/__tests__}/integration/data-api.integration.test.js +21 -18
- package/dist/src/__tests__/integration/data-api.integration.test.js.map +1 -0
- package/dist/src/__tests__/integration/gamma-api.integration.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/gamma-api.integration.test.js.map +1 -0
- package/dist/src/__tests__/integration/market-service.integration.test.d.ts.map +1 -0
- package/dist/{__tests__ → src/__tests__}/integration/market-service.integration.test.js +7 -0
- package/dist/src/__tests__/integration/market-service.integration.test.js.map +1 -0
- package/dist/src/__tests__/integration/realtime-service-v2.integration.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/realtime-service-v2.integration.test.js.map +1 -0
- package/dist/src/__tests__/integration/trading-service.integration.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/trading-service.integration.test.js.map +1 -0
- package/dist/src/__tests__/test-utils.d.ts.map +1 -0
- package/dist/src/__tests__/test-utils.js.map +1 -0
- package/dist/src/catalyst/catalyst-query-service.d.ts +109 -0
- package/dist/src/catalyst/catalyst-query-service.d.ts.map +1 -0
- package/dist/src/catalyst/catalyst-query-service.js +141 -0
- package/dist/src/catalyst/catalyst-query-service.js.map +1 -0
- package/dist/src/catalyst/catalyst-realtime-service.d.ts +40 -0
- package/dist/src/catalyst/catalyst-realtime-service.d.ts.map +1 -0
- package/dist/src/catalyst/catalyst-realtime-service.js +125 -0
- package/dist/src/catalyst/catalyst-realtime-service.js.map +1 -0
- package/dist/src/catalyst/index.d.ts +4 -0
- package/dist/src/catalyst/index.d.ts.map +1 -0
- package/dist/src/catalyst/index.js +4 -0
- package/dist/src/catalyst/index.js.map +1 -0
- package/dist/src/catalyst/types.d.ts +178 -0
- package/dist/src/catalyst/types.d.ts.map +1 -0
- package/dist/src/catalyst/types.js +2 -0
- package/dist/src/catalyst/types.js.map +1 -0
- package/dist/src/clients/bridge-client.d.ts.map +1 -0
- package/dist/src/clients/bridge-client.js.map +1 -0
- package/dist/{clients → src/clients}/ctf-client.d.ts +6 -4
- package/dist/src/clients/ctf-client.d.ts.map +1 -0
- package/dist/src/clients/ctf-client.js.map +1 -0
- package/dist/{clients → src/clients}/data-api.d.ts +94 -20
- package/dist/src/clients/data-api.d.ts.map +1 -0
- package/dist/{clients → src/clients}/data-api.js +119 -52
- package/dist/src/clients/data-api.js.map +1 -0
- package/dist/{clients → src/clients}/gamma-api.d.ts +74 -0
- package/dist/src/clients/gamma-api.d.ts.map +1 -0
- package/dist/{clients → src/clients}/gamma-api.js +7 -0
- package/dist/src/clients/gamma-api.js.map +1 -0
- package/dist/src/clients/subgraph.d.ts.map +1 -0
- package/dist/src/clients/subgraph.js.map +1 -0
- package/dist/src/core/cache-adapter-bridge.d.ts.map +1 -0
- package/dist/src/core/cache-adapter-bridge.js.map +1 -0
- package/dist/{core → src/core}/cache.d.ts +2 -0
- package/dist/src/core/cache.d.ts.map +1 -0
- package/dist/{core → src/core}/cache.js +4 -0
- package/dist/src/core/cache.js.map +1 -0
- package/dist/src/core/errors.d.ts.map +1 -0
- package/dist/src/core/errors.js.map +1 -0
- package/dist/{core → src/core}/rate-limiter.d.ts +2 -1
- package/dist/src/core/rate-limiter.d.ts.map +1 -0
- package/dist/{core → src/core}/rate-limiter.js +7 -0
- package/dist/src/core/rate-limiter.js.map +1 -0
- package/dist/{core → src/core}/types.d.ts +105 -1
- package/dist/src/core/types.d.ts.map +1 -0
- package/dist/src/core/types.js +49 -0
- package/dist/src/core/types.js.map +1 -0
- package/dist/src/core/types.test.d.ts.map +1 -0
- package/dist/src/core/types.test.js.map +1 -0
- package/dist/src/core/unified-cache.d.ts.map +1 -0
- package/dist/src/core/unified-cache.js.map +1 -0
- package/dist/{index.d.ts → src/index.d.ts} +24 -5
- package/dist/src/index.d.ts.map +1 -0
- package/dist/{index.js → src/index.js} +38 -4
- package/dist/src/index.js.map +1 -0
- package/dist/src/insider-scan/index.d.ts +3 -0
- package/dist/src/insider-scan/index.d.ts.map +1 -0
- package/dist/src/insider-scan/index.js +3 -0
- package/dist/src/insider-scan/index.js.map +1 -0
- package/dist/src/insider-scan/insider-scan-service.d.ts +63 -0
- package/dist/src/insider-scan/insider-scan-service.d.ts.map +1 -0
- package/dist/src/insider-scan/insider-scan-service.js +153 -0
- package/dist/src/insider-scan/insider-scan-service.js.map +1 -0
- package/dist/src/insider-scan/types.d.ts +205 -0
- package/dist/src/insider-scan/types.d.ts.map +1 -0
- package/dist/src/insider-scan/types.js +7 -0
- package/dist/src/insider-scan/types.js.map +1 -0
- package/dist/src/services/arbitrage-service.d.ts.map +1 -0
- package/dist/{services → src/services}/arbitrage-service.js +14 -4
- package/dist/src/services/arbitrage-service.js.map +1 -0
- package/dist/src/services/authorization-service.d.ts.map +1 -0
- package/dist/src/services/authorization-service.js.map +1 -0
- package/dist/src/services/binance-service.d.ts +154 -0
- package/dist/src/services/binance-service.d.ts.map +1 -0
- package/dist/src/services/binance-service.js +266 -0
- package/dist/src/services/binance-service.js.map +1 -0
- package/dist/src/services/dip-arb-service.d.ts +245 -0
- package/dist/src/services/dip-arb-service.d.ts.map +1 -0
- package/dist/src/services/dip-arb-service.js +1865 -0
- package/dist/src/services/dip-arb-service.js.map +1 -0
- package/dist/src/services/dip-arb-types.d.ts +553 -0
- package/dist/src/services/dip-arb-types.d.ts.map +1 -0
- package/dist/src/services/dip-arb-types.js +164 -0
- package/dist/src/services/dip-arb-types.js.map +1 -0
- package/dist/src/services/market-service.d.ts +431 -0
- package/dist/src/services/market-service.d.ts.map +1 -0
- package/dist/{services → src/services}/market-service.js +501 -17
- package/dist/src/services/market-service.js.map +1 -0
- package/dist/{services → src/services}/onchain-service.d.ts +10 -2
- package/dist/src/services/onchain-service.d.ts.map +1 -0
- package/dist/{services → src/services}/onchain-service.js +8 -0
- package/dist/src/services/onchain-service.js.map +1 -0
- package/dist/{services → src/services}/realtime-service-v2.d.ts +6 -0
- package/dist/src/services/realtime-service-v2.d.ts.map +1 -0
- package/dist/{services → src/services}/realtime-service-v2.js +44 -8
- package/dist/src/services/realtime-service-v2.js.map +1 -0
- package/dist/src/services/smart-money-service.d.ts +769 -0
- package/dist/src/services/smart-money-service.d.ts.map +1 -0
- package/dist/src/services/smart-money-service.js +1448 -0
- package/dist/src/services/smart-money-service.js.map +1 -0
- package/dist/src/services/swap-service.d.ts.map +1 -0
- package/dist/src/services/swap-service.js.map +1 -0
- package/dist/{services → src/services}/trading-service.d.ts +26 -0
- package/dist/src/services/trading-service.d.ts.map +1 -0
- package/dist/{services → src/services}/trading-service.js +72 -1
- package/dist/src/services/trading-service.js.map +1 -0
- package/dist/{services → src/services}/wallet-service.d.ts +81 -4
- package/dist/src/services/wallet-service.d.ts.map +1 -0
- package/dist/{services → src/services}/wallet-service.js +126 -8
- package/dist/src/services/wallet-service.js.map +1 -0
- package/dist/src/signal/index.d.ts +8 -0
- package/dist/src/signal/index.d.ts.map +1 -0
- package/dist/src/signal/index.js +7 -0
- package/dist/src/signal/index.js.map +1 -0
- package/dist/src/signal/signal-service.d.ts +89 -0
- package/dist/src/signal/signal-service.d.ts.map +1 -0
- package/dist/src/signal/signal-service.js +226 -0
- package/dist/src/signal/signal-service.js.map +1 -0
- package/dist/src/signal/types.d.ts +280 -0
- package/dist/src/signal/types.d.ts.map +1 -0
- package/dist/src/signal/types.js +7 -0
- package/dist/src/signal/types.js.map +1 -0
- package/dist/src/utils/price-utils.d.ts.map +1 -0
- package/dist/src/utils/price-utils.js.map +1 -0
- package/dist/src/utils/price-utils.test.d.ts.map +1 -0
- package/dist/src/utils/price-utils.test.js.map +1 -0
- package/dist/src/wallet-report/index.d.ts +3 -0
- package/dist/src/wallet-report/index.d.ts.map +1 -0
- package/dist/src/wallet-report/index.js +3 -0
- package/dist/src/wallet-report/index.js.map +1 -0
- package/dist/src/wallet-report/types.d.ts +187 -0
- package/dist/src/wallet-report/types.d.ts.map +1 -0
- package/dist/src/wallet-report/types.js +7 -0
- package/dist/src/wallet-report/types.js.map +1 -0
- package/dist/src/wallet-report/wallet-report-service.d.ts +91 -0
- package/dist/src/wallet-report/wallet-report-service.d.ts.map +1 -0
- package/dist/src/wallet-report/wallet-report-service.js +208 -0
- package/dist/src/wallet-report/wallet-report-service.js.map +1 -0
- package/dist/src/wallets/hot-wallet-service.d.ts +162 -0
- package/dist/src/wallets/hot-wallet-service.d.ts.map +1 -0
- package/dist/src/wallets/hot-wallet-service.js +251 -0
- package/dist/src/wallets/hot-wallet-service.js.map +1 -0
- package/dist/src/wallets/index.d.ts +15 -0
- package/dist/src/wallets/index.d.ts.map +1 -0
- package/dist/src/wallets/index.js +26 -0
- package/dist/src/wallets/index.js.map +1 -0
- package/package.json +7 -7
- package/dist/__tests__/clob-api.test.d.ts +0 -5
- package/dist/__tests__/clob-api.test.d.ts.map +0 -1
- package/dist/__tests__/clob-api.test.js +0 -240
- package/dist/__tests__/clob-api.test.js.map +0 -1
- package/dist/__tests__/integration/arbitrage-service.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/arbitrage-service.integration.test.js.map +0 -1
- package/dist/__tests__/integration/bridge-client.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/bridge-client.integration.test.js.map +0 -1
- package/dist/__tests__/integration/clob-api.integration.test.d.ts +0 -13
- package/dist/__tests__/integration/clob-api.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/clob-api.integration.test.js +0 -170
- package/dist/__tests__/integration/clob-api.integration.test.js.map +0 -1
- package/dist/__tests__/integration/ctf-client.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/ctf-client.integration.test.js.map +0 -1
- package/dist/__tests__/integration/data-api.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/data-api.integration.test.js.map +0 -1
- package/dist/__tests__/integration/gamma-api.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/gamma-api.integration.test.js.map +0 -1
- package/dist/__tests__/integration/market-service.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/market-service.integration.test.js.map +0 -1
- package/dist/__tests__/integration/realtime-service-v2.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/realtime-service-v2.integration.test.js.map +0 -1
- package/dist/__tests__/integration/trading-service.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/trading-service.integration.test.js.map +0 -1
- package/dist/__tests__/test-utils.d.ts.map +0 -1
- package/dist/__tests__/test-utils.js.map +0 -1
- package/dist/clients/bridge-client.d.ts.map +0 -1
- package/dist/clients/bridge-client.js.map +0 -1
- package/dist/clients/clob-api.d.ts +0 -391
- package/dist/clients/clob-api.d.ts.map +0 -1
- package/dist/clients/clob-api.js +0 -448
- package/dist/clients/clob-api.js.map +0 -1
- package/dist/clients/ctf-client.d.ts.map +0 -1
- package/dist/clients/ctf-client.js.map +0 -1
- package/dist/clients/data-api.d.ts.map +0 -1
- package/dist/clients/data-api.js.map +0 -1
- package/dist/clients/gamma-api.d.ts.map +0 -1
- package/dist/clients/gamma-api.js.map +0 -1
- package/dist/clients/subgraph.d.ts.map +0 -1
- package/dist/clients/subgraph.js.map +0 -1
- package/dist/clients/trading-client.d.ts +0 -252
- package/dist/clients/trading-client.d.ts.map +0 -1
- package/dist/clients/trading-client.js +0 -543
- package/dist/clients/trading-client.js.map +0 -1
- package/dist/clients/websocket-manager.d.ts +0 -103
- package/dist/clients/websocket-manager.d.ts.map +0 -1
- package/dist/clients/websocket-manager.js +0 -200
- package/dist/clients/websocket-manager.js.map +0 -1
- package/dist/core/cache-adapter-bridge.d.ts.map +0 -1
- package/dist/core/cache-adapter-bridge.js.map +0 -1
- package/dist/core/cache.d.ts.map +0 -1
- package/dist/core/cache.js.map +0 -1
- package/dist/core/errors.d.ts.map +0 -1
- package/dist/core/errors.js.map +0 -1
- package/dist/core/rate-limiter.d.ts.map +0 -1
- package/dist/core/rate-limiter.js.map +0 -1
- package/dist/core/types.d.ts.map +0 -1
- package/dist/core/types.js +0 -19
- package/dist/core/types.js.map +0 -1
- package/dist/core/types.test.d.ts.map +0 -1
- package/dist/core/types.test.js.map +0 -1
- package/dist/core/unified-cache.d.ts.map +0 -1
- package/dist/core/unified-cache.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/services/arbitrage-service.d.ts.map +0 -1
- package/dist/services/arbitrage-service.js.map +0 -1
- package/dist/services/authorization-service.d.ts.map +0 -1
- package/dist/services/authorization-service.js.map +0 -1
- package/dist/services/market-service.d.ts +0 -208
- package/dist/services/market-service.d.ts.map +0 -1
- package/dist/services/market-service.js.map +0 -1
- package/dist/services/onchain-service.d.ts.map +0 -1
- package/dist/services/onchain-service.js.map +0 -1
- package/dist/services/realtime-service-v2.d.ts.map +0 -1
- package/dist/services/realtime-service-v2.js.map +0 -1
- package/dist/services/realtime-service.d.ts +0 -82
- package/dist/services/realtime-service.d.ts.map +0 -1
- package/dist/services/realtime-service.js +0 -182
- package/dist/services/realtime-service.js.map +0 -1
- package/dist/services/smart-money-service.d.ts +0 -196
- package/dist/services/smart-money-service.d.ts.map +0 -1
- package/dist/services/smart-money-service.js +0 -358
- package/dist/services/smart-money-service.js.map +0 -1
- package/dist/services/swap-service.d.ts.map +0 -1
- package/dist/services/swap-service.js.map +0 -1
- package/dist/services/trading-service.d.ts.map +0 -1
- package/dist/services/trading-service.js.map +0 -1
- package/dist/services/wallet-service.d.ts.map +0 -1
- package/dist/services/wallet-service.js.map +0 -1
- package/dist/utils/price-utils.d.ts.map +0 -1
- package/dist/utils/price-utils.js.map +0 -1
- package/dist/utils/price-utils.test.d.ts.map +0 -1
- package/dist/utils/price-utils.test.js.map +0 -1
- /package/dist/{__tests__ → src/__tests__}/integration/arbitrage-service.integration.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/integration/arbitrage-service.integration.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/integration/bridge-client.integration.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/integration/bridge-client.integration.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/integration/ctf-client.integration.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/integration/ctf-client.integration.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/integration/data-api.integration.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/integration/gamma-api.integration.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/integration/gamma-api.integration.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/integration/market-service.integration.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/integration/realtime-service-v2.integration.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/integration/realtime-service-v2.integration.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/integration/trading-service.integration.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/integration/trading-service.integration.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/test-utils.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/test-utils.js +0 -0
- /package/dist/{clients → src/clients}/bridge-client.d.ts +0 -0
- /package/dist/{clients → src/clients}/bridge-client.js +0 -0
- /package/dist/{clients → src/clients}/ctf-client.js +0 -0
- /package/dist/{clients → src/clients}/subgraph.d.ts +0 -0
- /package/dist/{clients → src/clients}/subgraph.js +0 -0
- /package/dist/{core → src/core}/cache-adapter-bridge.d.ts +0 -0
- /package/dist/{core → src/core}/cache-adapter-bridge.js +0 -0
- /package/dist/{core → src/core}/errors.d.ts +0 -0
- /package/dist/{core → src/core}/errors.js +0 -0
- /package/dist/{core → src/core}/types.test.d.ts +0 -0
- /package/dist/{core → src/core}/types.test.js +0 -0
- /package/dist/{core → src/core}/unified-cache.d.ts +0 -0
- /package/dist/{core → src/core}/unified-cache.js +0 -0
- /package/dist/{services → src/services}/arbitrage-service.d.ts +0 -0
- /package/dist/{services → src/services}/authorization-service.d.ts +0 -0
- /package/dist/{services → src/services}/authorization-service.js +0 -0
- /package/dist/{services → src/services}/swap-service.d.ts +0 -0
- /package/dist/{services → src/services}/swap-service.js +0 -0
- /package/dist/{utils → src/utils}/price-utils.d.ts +0 -0
- /package/dist/{utils → src/utils}/price-utils.js +0 -0
- /package/dist/{utils → src/utils}/price-utils.test.d.ts +0 -0
- /package/dist/{utils → src/utils}/price-utils.test.js +0 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dip Arbitrage Service Types
|
|
3
|
+
*
|
|
4
|
+
* 暴跌套利服务类型定义
|
|
5
|
+
*
|
|
6
|
+
* 策略原理:
|
|
7
|
+
* 在 Polymarket 的 BTC/ETH/SOL/XRP UP/DOWN 短期市场中:
|
|
8
|
+
*
|
|
9
|
+
* 1. 每个市场有一个 "price to beat"(开盘时的 Chainlink 价格)
|
|
10
|
+
* 2. 结算规则:
|
|
11
|
+
* - UP 赢:结束时价格 >= price to beat
|
|
12
|
+
* - DOWN 赢:结束时价格 < price to beat
|
|
13
|
+
*
|
|
14
|
+
* 3. 套利流程:
|
|
15
|
+
* - Leg1:检测暴跌 → 买入暴跌侧
|
|
16
|
+
* - Leg2:等待对冲条件 → 买入另一侧
|
|
17
|
+
* - 利润:总成本 < $1 时获得无风险利润
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* 默认配置
|
|
21
|
+
*/
|
|
22
|
+
export const DEFAULT_DIP_ARB_CONFIG = {
|
|
23
|
+
shares: 20,
|
|
24
|
+
sumTarget: 0.92, // ✅ 放宽到 0.92 提高 Leg2 成交率 (8%+ 利润)
|
|
25
|
+
dipThreshold: 0.15,
|
|
26
|
+
windowMinutes: 2,
|
|
27
|
+
slidingWindowMs: 3000, // 3秒滑动窗口 - 核心参数!
|
|
28
|
+
maxSlippage: 0.02,
|
|
29
|
+
minProfitRate: 0.03,
|
|
30
|
+
leg2TimeoutSeconds: 180, // ✅ 缩短到 3 分钟,更快退出未对冲仓位
|
|
31
|
+
enableSurge: true,
|
|
32
|
+
surgeThreshold: 0.15,
|
|
33
|
+
autoMerge: true,
|
|
34
|
+
autoExecute: false,
|
|
35
|
+
executionCooldown: 3000,
|
|
36
|
+
splitOrders: 1, // ✅ 默认不拆分,避免份额误差
|
|
37
|
+
orderIntervalMs: 500, // 拆分订单间隔 500ms
|
|
38
|
+
debug: false,
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* 默认自动轮换配置
|
|
42
|
+
*/
|
|
43
|
+
export const DEFAULT_AUTO_ROTATE_CONFIG = {
|
|
44
|
+
enabled: false,
|
|
45
|
+
underlyings: ['BTC'],
|
|
46
|
+
duration: '15m',
|
|
47
|
+
preloadMinutes: 2,
|
|
48
|
+
autoSettle: true,
|
|
49
|
+
settleStrategy: 'redeem',
|
|
50
|
+
redeemWaitMinutes: 5,
|
|
51
|
+
redeemRetryIntervalSeconds: 30,
|
|
52
|
+
};
|
|
53
|
+
// ============= Helper Functions =============
|
|
54
|
+
/**
|
|
55
|
+
* 创建初始统计
|
|
56
|
+
*/
|
|
57
|
+
export function createDipArbInitialStats() {
|
|
58
|
+
return {
|
|
59
|
+
startTime: Date.now(),
|
|
60
|
+
runningTimeMs: 0,
|
|
61
|
+
roundsMonitored: 0,
|
|
62
|
+
roundsCompleted: 0,
|
|
63
|
+
roundsSuccessful: 0,
|
|
64
|
+
roundsExpired: 0,
|
|
65
|
+
signalsDetected: 0,
|
|
66
|
+
leg1Filled: 0,
|
|
67
|
+
leg2Filled: 0,
|
|
68
|
+
totalSpent: 0,
|
|
69
|
+
totalProfit: 0,
|
|
70
|
+
avgProfitRate: 0,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 创建新轮次状态
|
|
75
|
+
*/
|
|
76
|
+
export function createDipArbRoundState(roundId, priceToBeat, upPrice, downPrice, durationMinutes = 15) {
|
|
77
|
+
const now = Date.now();
|
|
78
|
+
return {
|
|
79
|
+
roundId,
|
|
80
|
+
startTime: now,
|
|
81
|
+
endTime: now + durationMinutes * 60 * 1000,
|
|
82
|
+
priceToBeat,
|
|
83
|
+
openPrices: {
|
|
84
|
+
up: upPrice,
|
|
85
|
+
down: downPrice,
|
|
86
|
+
},
|
|
87
|
+
phase: 'waiting',
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* 计算利润率
|
|
92
|
+
*/
|
|
93
|
+
export function calculateDipArbProfitRate(totalCost) {
|
|
94
|
+
if (totalCost >= 1 || totalCost <= 0)
|
|
95
|
+
return 0;
|
|
96
|
+
return (1 - totalCost) / totalCost;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* 计算基于底层资产价格变化的"真实"胜率
|
|
100
|
+
*
|
|
101
|
+
* @param currentPrice - 当前价格
|
|
102
|
+
* @param priceToBeat - 开盘价格
|
|
103
|
+
* @returns UP 的真实胜率估计 (0-1)
|
|
104
|
+
*/
|
|
105
|
+
export function estimateUpWinRate(currentPrice, priceToBeat) {
|
|
106
|
+
if (priceToBeat <= 0)
|
|
107
|
+
return 0.5;
|
|
108
|
+
const priceChange = (currentPrice - priceToBeat) / priceToBeat;
|
|
109
|
+
// 简单模型:价格变化 1% 对应胜率变化约 10%
|
|
110
|
+
const sensitivity = 10;
|
|
111
|
+
const winRateShift = priceChange * sensitivity;
|
|
112
|
+
// 限制在 [0.05, 0.95] 范围内
|
|
113
|
+
return Math.max(0.05, Math.min(0.95, 0.5 + winRateShift));
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* 检测定价偏差
|
|
117
|
+
*
|
|
118
|
+
* @param tokenPrice - token 当前价格(隐含胜率)
|
|
119
|
+
* @param estimatedWinRate - 基于价格估计的真实胜率
|
|
120
|
+
* @returns 偏差程度(正数 = 被低估,负数 = 被高估)
|
|
121
|
+
*/
|
|
122
|
+
export function detectMispricing(tokenPrice, estimatedWinRate) {
|
|
123
|
+
return estimatedWinRate - tokenPrice;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* 从 slug 解析底层资产
|
|
127
|
+
* e.g., 'btc-updown-15m-1767165300' → 'BTC'
|
|
128
|
+
*/
|
|
129
|
+
export function parseUnderlyingFromSlug(slug) {
|
|
130
|
+
const lower = slug.toLowerCase();
|
|
131
|
+
if (lower.startsWith('btc'))
|
|
132
|
+
return 'BTC';
|
|
133
|
+
if (lower.startsWith('eth'))
|
|
134
|
+
return 'ETH';
|
|
135
|
+
if (lower.startsWith('sol'))
|
|
136
|
+
return 'SOL';
|
|
137
|
+
if (lower.startsWith('xrp'))
|
|
138
|
+
return 'XRP';
|
|
139
|
+
return 'BTC'; // default
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* 从 slug 解析时长
|
|
143
|
+
* e.g., 'btc-updown-15m-1767165300' → 15
|
|
144
|
+
*/
|
|
145
|
+
export function parseDurationFromSlug(slug) {
|
|
146
|
+
if (slug.includes('-5m-'))
|
|
147
|
+
return 5;
|
|
148
|
+
if (slug.includes('-15m-'))
|
|
149
|
+
return 15;
|
|
150
|
+
return 15; // default
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* 类型守卫:检查是否为 Leg1 信号
|
|
154
|
+
*/
|
|
155
|
+
export function isDipArbLeg1Signal(signal) {
|
|
156
|
+
return signal.type === 'leg1';
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* 类型守卫:检查是否为 Leg2 信号
|
|
160
|
+
*/
|
|
161
|
+
export function isDipArbLeg2Signal(signal) {
|
|
162
|
+
return signal.type === 'leg2';
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=dip-arb-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dip-arb-types.js","sourceRoot":"","sources":["../../../src/services/dip-arb-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Market Service
|
|
3
|
+
*
|
|
4
|
+
* Provides market data and analysis:
|
|
5
|
+
* - Market info and discovery
|
|
6
|
+
* - Orderbook data and analysis
|
|
7
|
+
* - K-Line aggregation from trade data
|
|
8
|
+
* - Spread analysis
|
|
9
|
+
* - Arbitrage detection
|
|
10
|
+
*/
|
|
11
|
+
import { DataApiClient } from '../clients/data-api.js';
|
|
12
|
+
import { GammaApiClient, GammaMarket } from '../clients/gamma-api.js';
|
|
13
|
+
import type { UnifiedCache } from '../core/unified-cache.js';
|
|
14
|
+
import { RateLimiter } from '../core/rate-limiter.js';
|
|
15
|
+
import type { UnifiedMarket, ProcessedOrderbook, ArbitrageOpportunity, KLineInterval, KLineCandle, DualKLineData, RealtimeSpreadAnalysis, Side, Orderbook, UnderlyingAsset, TokenUnderlyingCorrelation } from '../core/types.js';
|
|
16
|
+
import type { BinanceService } from './binance-service.js';
|
|
17
|
+
export declare const POLYGON_MAINNET = 137;
|
|
18
|
+
export type { Side, Orderbook } from '../core/types.js';
|
|
19
|
+
export type PriceHistoryIntervalString = '1h' | '6h' | '1d' | '1w' | 'max';
|
|
20
|
+
export interface PriceHistoryParams {
|
|
21
|
+
tokenId: string;
|
|
22
|
+
interval?: PriceHistoryIntervalString;
|
|
23
|
+
startTs?: number;
|
|
24
|
+
endTs?: number;
|
|
25
|
+
fidelity?: number;
|
|
26
|
+
}
|
|
27
|
+
export interface PricePoint {
|
|
28
|
+
timestamp: number;
|
|
29
|
+
price: number;
|
|
30
|
+
}
|
|
31
|
+
export interface MarketServiceConfig {
|
|
32
|
+
/** Private key for CLOB client auth (optional, for authenticated endpoints) */
|
|
33
|
+
privateKey?: string;
|
|
34
|
+
/** Chain ID (default: Polygon mainnet 137) */
|
|
35
|
+
chainId?: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* CLOB Market type (from CLOB API)
|
|
39
|
+
*
|
|
40
|
+
* This represents the raw market data from the CLOB API.
|
|
41
|
+
* For merged market data with volume/liquidity, use UnifiedMarket from core/types.ts.
|
|
42
|
+
*/
|
|
43
|
+
export interface Market {
|
|
44
|
+
conditionId: string;
|
|
45
|
+
questionId?: string;
|
|
46
|
+
marketSlug: string;
|
|
47
|
+
question: string;
|
|
48
|
+
description?: string;
|
|
49
|
+
tokens: MarketToken[];
|
|
50
|
+
active: boolean;
|
|
51
|
+
closed: boolean;
|
|
52
|
+
acceptingOrders: boolean;
|
|
53
|
+
endDateIso?: string | null;
|
|
54
|
+
negRisk?: boolean;
|
|
55
|
+
minimumOrderSize?: number;
|
|
56
|
+
minimumTickSize?: number;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Token in a CLOB market
|
|
60
|
+
* Same structure as MarketToken in core/types.ts
|
|
61
|
+
*/
|
|
62
|
+
export interface MarketToken {
|
|
63
|
+
tokenId: string;
|
|
64
|
+
outcome: string;
|
|
65
|
+
price: number;
|
|
66
|
+
winner?: boolean;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Resolved market tokens with outcome names
|
|
70
|
+
*
|
|
71
|
+
* Uses `primary`/`secondary` naming to be market-agnostic:
|
|
72
|
+
* - Yes/No markets: primary=Yes, secondary=No
|
|
73
|
+
* - Up/Down markets: primary=Up, secondary=Down
|
|
74
|
+
* - Team markets: primary=Team1, secondary=Team2
|
|
75
|
+
*
|
|
76
|
+
* This follows the BinaryTokens pattern in core/types.ts
|
|
77
|
+
*/
|
|
78
|
+
export interface ResolvedMarketTokens {
|
|
79
|
+
/** Primary outcome token ID (index 0: Yes/Up/Team1) */
|
|
80
|
+
primaryTokenId: string;
|
|
81
|
+
/** Secondary outcome token ID (index 1: No/Down/Team2) */
|
|
82
|
+
secondaryTokenId: string;
|
|
83
|
+
/** Outcome names for display [primary, secondary] */
|
|
84
|
+
outcomes: [string, string];
|
|
85
|
+
/** Primary outcome name (e.g., "Yes", "Up") */
|
|
86
|
+
primaryOutcome: string;
|
|
87
|
+
/** Secondary outcome name (e.g., "No", "Down") */
|
|
88
|
+
secondaryOutcome: string;
|
|
89
|
+
}
|
|
90
|
+
export declare class MarketService {
|
|
91
|
+
private gammaApi;
|
|
92
|
+
private dataApi;
|
|
93
|
+
private rateLimiter;
|
|
94
|
+
private cache;
|
|
95
|
+
private config?;
|
|
96
|
+
private binanceService?;
|
|
97
|
+
private clobClient;
|
|
98
|
+
private initialized;
|
|
99
|
+
constructor(gammaApi: GammaApiClient | undefined, dataApi: DataApiClient | undefined, rateLimiter: RateLimiter, cache: UnifiedCache, config?: MarketServiceConfig | undefined, binanceService?: BinanceService | undefined);
|
|
100
|
+
private ensureInitialized;
|
|
101
|
+
/**
|
|
102
|
+
* Get market from CLOB by condition ID
|
|
103
|
+
*/
|
|
104
|
+
getClobMarket(conditionId: string): Promise<Market | null>;
|
|
105
|
+
/**
|
|
106
|
+
* Resolve market tokens from CLOB API
|
|
107
|
+
*
|
|
108
|
+
* This method fetches the actual token IDs from the CLOB API,
|
|
109
|
+
* which are different from the calculated positionIds in standard CTF.
|
|
110
|
+
*
|
|
111
|
+
* ## Why This Method Exists
|
|
112
|
+
*
|
|
113
|
+
* Polymarket CLOB markets use custom ERC-1155 token IDs that are different
|
|
114
|
+
* from the standard CTF calculated positionIds:
|
|
115
|
+
*
|
|
116
|
+
* ```
|
|
117
|
+
* Standard CTF: positionId = keccak256(USDC + keccak256(0x0 + conditionId + indexSet))
|
|
118
|
+
* Polymarket: tokenId = custom value from CLOB API (e.g., "25064375110792...")
|
|
119
|
+
* ```
|
|
120
|
+
*
|
|
121
|
+
* This method provides the actual tokenIds needed for CTF operations
|
|
122
|
+
* (split, merge, redeem) on Polymarket markets.
|
|
123
|
+
*
|
|
124
|
+
* ## Usage with CTFClient
|
|
125
|
+
*
|
|
126
|
+
* Since CTFClient uses legacy `yesTokenId`/`noTokenId` naming,
|
|
127
|
+
* you need to convert when calling CTF methods:
|
|
128
|
+
*
|
|
129
|
+
* ```typescript
|
|
130
|
+
* const resolved = await sdk.markets.resolveMarketTokens(conditionId);
|
|
131
|
+
* if (resolved) {
|
|
132
|
+
* const tokenIds = {
|
|
133
|
+
* yesTokenId: resolved.primaryTokenId,
|
|
134
|
+
* noTokenId: resolved.secondaryTokenId,
|
|
135
|
+
* };
|
|
136
|
+
* await ctfClient.redeemByTokenIds(conditionId, tokenIds);
|
|
137
|
+
* }
|
|
138
|
+
* ```
|
|
139
|
+
*
|
|
140
|
+
* @param conditionId - Market condition ID (0x...)
|
|
141
|
+
* @returns Resolved token IDs with outcome names, or null if not found
|
|
142
|
+
*/
|
|
143
|
+
resolveMarketTokens(conditionId: string): Promise<ResolvedMarketTokens | null>;
|
|
144
|
+
/**
|
|
145
|
+
* Get multiple markets from CLOB
|
|
146
|
+
*/
|
|
147
|
+
getClobMarkets(nextCursor?: string): Promise<{
|
|
148
|
+
markets: Market[];
|
|
149
|
+
nextCursor: string;
|
|
150
|
+
}>;
|
|
151
|
+
/**
|
|
152
|
+
* Get orderbook for a single token
|
|
153
|
+
*/
|
|
154
|
+
getTokenOrderbook(tokenId: string): Promise<Orderbook>;
|
|
155
|
+
/**
|
|
156
|
+
* Get orderbooks for multiple tokens
|
|
157
|
+
*/
|
|
158
|
+
getTokenOrderbooks(params: Array<{
|
|
159
|
+
tokenId: string;
|
|
160
|
+
side: Side;
|
|
161
|
+
}>): Promise<Map<string, Orderbook>>;
|
|
162
|
+
/**
|
|
163
|
+
* Get processed orderbook with arbitrage analysis for a market
|
|
164
|
+
*/
|
|
165
|
+
getProcessedOrderbook(conditionId: string): Promise<ProcessedOrderbook>;
|
|
166
|
+
/**
|
|
167
|
+
* Get price history for a token
|
|
168
|
+
*/
|
|
169
|
+
getPricesHistory(params: PriceHistoryParams): Promise<PricePoint[]>;
|
|
170
|
+
/**
|
|
171
|
+
* Get midpoint price for a token
|
|
172
|
+
*/
|
|
173
|
+
getMidpoint(tokenId: string): Promise<number>;
|
|
174
|
+
/**
|
|
175
|
+
* Get spread for a token
|
|
176
|
+
*/
|
|
177
|
+
getSpread(tokenId: string): Promise<number>;
|
|
178
|
+
/**
|
|
179
|
+
* Get last trade price for a token
|
|
180
|
+
*/
|
|
181
|
+
getLastTradePrice(tokenId: string): Promise<number>;
|
|
182
|
+
/**
|
|
183
|
+
* Get market by slug or condition ID
|
|
184
|
+
*/
|
|
185
|
+
getMarket(identifier: string): Promise<UnifiedMarket>;
|
|
186
|
+
private getMarketBySlug;
|
|
187
|
+
private getMarketByConditionId;
|
|
188
|
+
/**
|
|
189
|
+
* Get K-Line candles for a market (single token)
|
|
190
|
+
*
|
|
191
|
+
* @param conditionId - Market condition ID
|
|
192
|
+
* @param interval - K-line interval (1s, 5s, 15s, 30s, 1m, 5m, 15m, 30m, 1h, 4h, 12h, 1d)
|
|
193
|
+
* @param options - Query options
|
|
194
|
+
* @param options.limit - Maximum number of trades to fetch for aggregation (default: 1000)
|
|
195
|
+
* @param options.tokenId - Filter by specific token ID
|
|
196
|
+
* @param options.outcomeIndex - Filter by outcome index (0 = primary, 1 = secondary)
|
|
197
|
+
* @param options.startTimestamp - Start timestamp (Unix ms) - filter trades after this time
|
|
198
|
+
* @param options.endTimestamp - End timestamp (Unix ms) - filter trades before this time
|
|
199
|
+
*
|
|
200
|
+
* @example
|
|
201
|
+
* ```typescript
|
|
202
|
+
* // Get 5s candles for the last 15 minutes
|
|
203
|
+
* const now = Date.now();
|
|
204
|
+
* const candles = await sdk.markets.getKLines(conditionId, '5s', {
|
|
205
|
+
* startTimestamp: now - 15 * 60 * 1000,
|
|
206
|
+
* endTimestamp: now,
|
|
207
|
+
* });
|
|
208
|
+
* ```
|
|
209
|
+
*/
|
|
210
|
+
getKLines(conditionId: string, interval: KLineInterval, options?: {
|
|
211
|
+
limit?: number;
|
|
212
|
+
tokenId?: string;
|
|
213
|
+
outcomeIndex?: number;
|
|
214
|
+
startTimestamp?: number;
|
|
215
|
+
endTimestamp?: number;
|
|
216
|
+
}): Promise<KLineCandle[]>;
|
|
217
|
+
/**
|
|
218
|
+
* Get dual K-Lines (YES + NO tokens)
|
|
219
|
+
*
|
|
220
|
+
* @param conditionId - Market condition ID
|
|
221
|
+
* @param interval - K-line interval (1s, 5s, 15s, 30s, 1m, 5m, 15m, 30m, 1h, 4h, 12h, 1d)
|
|
222
|
+
* @param options - Query options
|
|
223
|
+
* @param options.limit - Maximum number of trades to fetch for aggregation (default: 1000)
|
|
224
|
+
* @param options.startTimestamp - Start timestamp (Unix ms) - filter trades after this time
|
|
225
|
+
* @param options.endTimestamp - End timestamp (Unix ms) - filter trades before this time
|
|
226
|
+
*
|
|
227
|
+
* @example
|
|
228
|
+
* ```typescript
|
|
229
|
+
* // Get 15s dual K-lines for a 15-minute market
|
|
230
|
+
* const now = Date.now();
|
|
231
|
+
* const data = await sdk.markets.getDualKLines(conditionId, '15s', {
|
|
232
|
+
* startTimestamp: now - 15 * 60 * 1000,
|
|
233
|
+
* endTimestamp: now,
|
|
234
|
+
* });
|
|
235
|
+
* console.log(`Up candles: ${data.yes.length}, Down candles: ${data.no.length}`);
|
|
236
|
+
* ```
|
|
237
|
+
*/
|
|
238
|
+
getDualKLines(conditionId: string, interval: KLineInterval, options?: {
|
|
239
|
+
limit?: number;
|
|
240
|
+
startTimestamp?: number;
|
|
241
|
+
endTimestamp?: number;
|
|
242
|
+
}): Promise<DualKLineData>;
|
|
243
|
+
/**
|
|
244
|
+
* Get aligned K-line data for token and underlying asset
|
|
245
|
+
*
|
|
246
|
+
* This method fetches K-line data from both Polymarket (token prices)
|
|
247
|
+
* and Binance (underlying asset prices), aligns them by timestamp,
|
|
248
|
+
* and optionally calculates Pearson correlation coefficients.
|
|
249
|
+
*
|
|
250
|
+
* @param conditionId - Market condition ID
|
|
251
|
+
* @param underlying - Underlying asset (BTC, ETH, SOL)
|
|
252
|
+
* @param interval - K-line interval (must be supported by both Poly and Binance)
|
|
253
|
+
* @param options - Optional parameters
|
|
254
|
+
* @returns Aligned data with optional correlation coefficients
|
|
255
|
+
*
|
|
256
|
+
* @example
|
|
257
|
+
* ```typescript
|
|
258
|
+
* const data = await marketService.getTokenUnderlyingData(
|
|
259
|
+
* '0x123...',
|
|
260
|
+
* 'BTC',
|
|
261
|
+
* '1h',
|
|
262
|
+
* { limit: 100, calculateCorrelation: true }
|
|
263
|
+
* );
|
|
264
|
+
*
|
|
265
|
+
* // Access aligned data
|
|
266
|
+
* for (const point of data.data) {
|
|
267
|
+
* console.log(`${point.timestamp}: Up=${point.upPrice}, BTC=${point.underlyingPrice}`);
|
|
268
|
+
* }
|
|
269
|
+
*
|
|
270
|
+
* // Check correlation
|
|
271
|
+
* if (data.correlation) {
|
|
272
|
+
* console.log(`Correlation: ${data.correlation.upVsUnderlying}`);
|
|
273
|
+
* }
|
|
274
|
+
* ```
|
|
275
|
+
*/
|
|
276
|
+
getTokenUnderlyingData(conditionId: string, underlying: UnderlyingAsset, interval: KLineInterval, options?: {
|
|
277
|
+
limit?: number;
|
|
278
|
+
calculateCorrelation?: boolean;
|
|
279
|
+
}): Promise<TokenUnderlyingCorrelation>;
|
|
280
|
+
/**
|
|
281
|
+
* Find the nearest available price for a timestamp
|
|
282
|
+
*/
|
|
283
|
+
private findNearestPrice;
|
|
284
|
+
/**
|
|
285
|
+
* Calculate Pearson correlation coefficients
|
|
286
|
+
*/
|
|
287
|
+
private calculatePearsonCorrelation;
|
|
288
|
+
/**
|
|
289
|
+
* Calculate Pearson correlation coefficient between two arrays
|
|
290
|
+
* Returns a value between -1 and 1
|
|
291
|
+
*/
|
|
292
|
+
private pearson;
|
|
293
|
+
/**
|
|
294
|
+
* Aggregate trades into K-Line candles
|
|
295
|
+
*
|
|
296
|
+
* Note: Polymarket API may return timestamps in seconds or milliseconds.
|
|
297
|
+
* This function normalizes all timestamps to milliseconds for consistent handling.
|
|
298
|
+
*/
|
|
299
|
+
private aggregateToKLines;
|
|
300
|
+
/**
|
|
301
|
+
* Analyze historical spread from trade close prices (for backtesting)
|
|
302
|
+
*
|
|
303
|
+
* This uses trade close prices, not orderbook bid/ask.
|
|
304
|
+
* Useful for:
|
|
305
|
+
* - Historical analysis / backtesting
|
|
306
|
+
* - Understanding past price movements
|
|
307
|
+
* - Identifying patterns when orderbook data unavailable
|
|
308
|
+
*/
|
|
309
|
+
private analyzeHistoricalSpread;
|
|
310
|
+
/**
|
|
311
|
+
* Calculate real-time spread from orderbook (for live trading)
|
|
312
|
+
*
|
|
313
|
+
* This uses orderbook bid/ask prices for accurate arbitrage detection.
|
|
314
|
+
* Useful for:
|
|
315
|
+
* - Real-time arbitrage execution
|
|
316
|
+
* - Live trading decisions
|
|
317
|
+
* - Accurate profit calculations
|
|
318
|
+
*/
|
|
319
|
+
private calculateRealtimeSpread;
|
|
320
|
+
/**
|
|
321
|
+
* Get real-time spread analysis only (without K-lines)
|
|
322
|
+
* Use this for quick arbitrage checks
|
|
323
|
+
*/
|
|
324
|
+
getRealtimeSpread(conditionId: string): Promise<RealtimeSpreadAnalysis>;
|
|
325
|
+
/**
|
|
326
|
+
* Get processed orderbook with analytics (alias for getProcessedOrderbook)
|
|
327
|
+
*/
|
|
328
|
+
getOrderbook(conditionId: string): Promise<ProcessedOrderbook>;
|
|
329
|
+
/**
|
|
330
|
+
* Detect arbitrage opportunity
|
|
331
|
+
*
|
|
332
|
+
* 使用有效价格(考虑镜像订单)计算套利机会
|
|
333
|
+
* 详细原理见: docs/01-polymarket-orderbook-arbitrage.md
|
|
334
|
+
*/
|
|
335
|
+
detectArbitrage(conditionId: string, threshold?: number): Promise<ArbitrageOpportunity | null>;
|
|
336
|
+
/**
|
|
337
|
+
* Get trending markets
|
|
338
|
+
*/
|
|
339
|
+
getTrendingMarkets(limit?: number): Promise<GammaMarket[]>;
|
|
340
|
+
/**
|
|
341
|
+
* Search markets
|
|
342
|
+
*/
|
|
343
|
+
searchMarkets(params: {
|
|
344
|
+
active?: boolean;
|
|
345
|
+
closed?: boolean;
|
|
346
|
+
limit?: number;
|
|
347
|
+
offset?: number;
|
|
348
|
+
order?: string;
|
|
349
|
+
}): Promise<GammaMarket[]>;
|
|
350
|
+
/**
|
|
351
|
+
* Scan for short-term crypto markets (Up/Down markets ending soon)
|
|
352
|
+
*
|
|
353
|
+
* ## Market Types
|
|
354
|
+
* Polymarket has short-term crypto markets in two durations:
|
|
355
|
+
* - **5-minute markets**: slug pattern `{coin}-updown-5m-{timestamp}`
|
|
356
|
+
* - **15-minute markets**: slug pattern `{coin}-updown-15m-{timestamp}`
|
|
357
|
+
*
|
|
358
|
+
* ## Slug Pattern
|
|
359
|
+
* The timestamp in the slug is the START time of the time window:
|
|
360
|
+
* - 15-minute markets: `{coin}-updown-15m-{Math.floor(startTime / 900) * 900}`
|
|
361
|
+
* - 5-minute markets: `{coin}-updown-5m-{Math.floor(startTime / 300) * 300}`
|
|
362
|
+
*
|
|
363
|
+
* Example: `btc-updown-15m-1767456000` starts at 1767456000 (16:00:00 UTC)
|
|
364
|
+
* and ends 15 minutes later at 1767456900 (16:15:00 UTC)
|
|
365
|
+
*
|
|
366
|
+
* ## Supported Coins
|
|
367
|
+
* - BTC (Bitcoin)
|
|
368
|
+
* - ETH (Ethereum)
|
|
369
|
+
* - SOL (Solana)
|
|
370
|
+
* - XRP (Ripple)
|
|
371
|
+
*
|
|
372
|
+
* ## Market Lifecycle Rules
|
|
373
|
+
* 1. Markets are created ahead of time (before they become tradeable)
|
|
374
|
+
* 2. New markets may not have prices yet (show 0.5/0.5)
|
|
375
|
+
* 3. When one market ends, the next one is already open for trading
|
|
376
|
+
* 4. A market ending doesn't mean no price - it means resolution is pending
|
|
377
|
+
*
|
|
378
|
+
* ## Outcomes
|
|
379
|
+
* All crypto short-term markets have:
|
|
380
|
+
* - outcomes: ["Up", "Down"]
|
|
381
|
+
* - Resolution based on price movement during the time window
|
|
382
|
+
*
|
|
383
|
+
* @param options - Scan options
|
|
384
|
+
* @param options.minMinutesUntilEnd - Minimum minutes until market ends (default: 5)
|
|
385
|
+
* @param options.maxMinutesUntilEnd - Maximum minutes until market ends (default: 60)
|
|
386
|
+
* @param options.limit - Maximum number of markets to return (default: 20)
|
|
387
|
+
* @param options.sortBy - Sort field: 'endDate' | 'volume' | 'liquidity' (default: 'endDate')
|
|
388
|
+
* @param options.duration - Filter by duration: '5m' | '15m' | 'all' (default: 'all')
|
|
389
|
+
* @param options.coin - Filter by coin: 'BTC' | 'ETH' | 'SOL' | 'XRP' | 'all' (default: 'all')
|
|
390
|
+
* @returns Array of crypto short-term markets
|
|
391
|
+
*
|
|
392
|
+
* @example
|
|
393
|
+
* ```typescript
|
|
394
|
+
* // Find all 15-minute markets ending in 5-30 minutes
|
|
395
|
+
* const markets = await sdk.markets.scanCryptoShortTermMarkets({
|
|
396
|
+
* minMinutesUntilEnd: 5,
|
|
397
|
+
* maxMinutesUntilEnd: 30,
|
|
398
|
+
* duration: '15m',
|
|
399
|
+
* });
|
|
400
|
+
*
|
|
401
|
+
* // Find BTC 5-minute markets only
|
|
402
|
+
* const btcMarkets = await sdk.markets.scanCryptoShortTermMarkets({
|
|
403
|
+
* coin: 'BTC',
|
|
404
|
+
* duration: '5m',
|
|
405
|
+
* });
|
|
406
|
+
* ```
|
|
407
|
+
*/
|
|
408
|
+
scanCryptoShortTermMarkets(options?: {
|
|
409
|
+
minMinutesUntilEnd?: number;
|
|
410
|
+
maxMinutesUntilEnd?: number;
|
|
411
|
+
limit?: number;
|
|
412
|
+
sortBy?: 'endDate' | 'volume' | 'liquidity';
|
|
413
|
+
duration?: '5m' | '15m' | 'all';
|
|
414
|
+
coin?: 'BTC' | 'ETH' | 'SOL' | 'XRP' | 'all';
|
|
415
|
+
}): Promise<GammaMarket[]>;
|
|
416
|
+
/**
|
|
417
|
+
* Detect market signals (volume surge, depth imbalance, whale trades)
|
|
418
|
+
*/
|
|
419
|
+
detectMarketSignals(conditionId: string): Promise<Array<{
|
|
420
|
+
type: 'volume_surge' | 'depth_imbalance' | 'whale_trade' | 'momentum';
|
|
421
|
+
severity: 'low' | 'medium' | 'high';
|
|
422
|
+
details: Record<string, unknown>;
|
|
423
|
+
}>>;
|
|
424
|
+
private normalizeClobMarket;
|
|
425
|
+
private processOrderbooks;
|
|
426
|
+
private mergeMarkets;
|
|
427
|
+
private fromGammaMarket;
|
|
428
|
+
private fromClobMarket;
|
|
429
|
+
}
|
|
430
|
+
export declare function getIntervalMs(interval: KLineInterval): number;
|
|
431
|
+
//# sourceMappingURL=market-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"market-service.d.ts","sourceRoot":"","sources":["../../../src/services/market-service.ts"],"names":[],"mappings":"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"}
|