@catalyst-team/poly-sdk 0.2.1 ā 0.4.0
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 +665 -807
- package/README.zh-CN.md +645 -342
- package/dist/__tests__/integration/arbitrage-service.integration.test.d.ts +12 -0
- package/dist/__tests__/integration/arbitrage-service.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/arbitrage-service.integration.test.js +267 -0
- package/dist/__tests__/integration/arbitrage-service.integration.test.js.map +1 -0
- package/dist/__tests__/integration/data-api.integration.test.js +6 -3
- package/dist/__tests__/integration/data-api.integration.test.js.map +1 -1
- package/dist/__tests__/integration/market-service.integration.test.d.ts +10 -0
- package/dist/__tests__/integration/market-service.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/market-service.integration.test.js +173 -0
- package/dist/__tests__/integration/market-service.integration.test.js.map +1 -0
- package/dist/__tests__/integration/realtime-service-v2.integration.test.d.ts +10 -0
- package/dist/__tests__/integration/realtime-service-v2.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/realtime-service-v2.integration.test.js +307 -0
- package/dist/__tests__/integration/realtime-service-v2.integration.test.js.map +1 -0
- package/dist/__tests__/integration/trading-service.integration.test.d.ts +10 -0
- package/dist/__tests__/integration/trading-service.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/trading-service.integration.test.js +58 -0
- package/dist/__tests__/integration/trading-service.integration.test.js.map +1 -0
- package/dist/clients/clob-api.d.ts +73 -0
- package/dist/clients/clob-api.d.ts.map +1 -1
- package/dist/clients/clob-api.js +60 -0
- package/dist/clients/clob-api.js.map +1 -1
- package/dist/clients/ctf-client.d.ts +6 -4
- package/dist/clients/ctf-client.d.ts.map +1 -1
- package/dist/clients/ctf-client.js.map +1 -1
- package/dist/clients/data-api.d.ts +333 -15
- package/dist/clients/data-api.d.ts.map +1 -1
- package/dist/clients/data-api.js +398 -26
- package/dist/clients/data-api.js.map +1 -1
- package/dist/clients/gamma-api.d.ts +5 -0
- package/dist/clients/gamma-api.d.ts.map +1 -1
- package/dist/clients/gamma-api.js +2 -0
- package/dist/clients/gamma-api.js.map +1 -1
- package/dist/clients/subgraph.d.ts +196 -0
- package/dist/clients/subgraph.d.ts.map +1 -0
- package/dist/clients/subgraph.js +332 -0
- package/dist/clients/subgraph.js.map +1 -0
- package/dist/clients/websocket-manager.d.ts +3 -0
- package/dist/clients/websocket-manager.d.ts.map +1 -1
- package/dist/clients/websocket-manager.js +10 -3
- package/dist/clients/websocket-manager.js.map +1 -1
- package/dist/core/cache.d.ts +3 -0
- package/dist/core/cache.d.ts.map +1 -1
- package/dist/core/cache.js +5 -0
- package/dist/core/cache.js.map +1 -1
- package/dist/core/errors.d.ts +2 -1
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +2 -0
- package/dist/core/errors.js.map +1 -1
- package/dist/core/rate-limiter.d.ts +3 -1
- package/dist/core/rate-limiter.d.ts.map +1 -1
- package/dist/core/rate-limiter.js +12 -0
- package/dist/core/rate-limiter.js.map +1 -1
- package/dist/core/types.d.ts +205 -13
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +30 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/types.test.d.ts +7 -0
- package/dist/core/types.test.d.ts.map +1 -0
- package/dist/core/types.test.js +122 -0
- package/dist/core/types.test.js.map +1 -0
- package/dist/index.d.ts +84 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +139 -132
- package/dist/index.js.map +1 -1
- 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/services/arbitrage-service.d.ts +3 -2
- package/dist/services/arbitrage-service.d.ts.map +1 -1
- package/dist/services/arbitrage-service.js +71 -43
- package/dist/services/arbitrage-service.js.map +1 -1
- package/dist/services/binance-service.d.ts +154 -0
- package/dist/services/binance-service.d.ts.map +1 -0
- package/dist/services/binance-service.js +266 -0
- package/dist/services/binance-service.js.map +1 -0
- package/dist/services/dip-arb-service.d.ts +209 -0
- package/dist/services/dip-arb-service.d.ts.map +1 -0
- package/dist/services/dip-arb-service.js +1602 -0
- package/dist/services/dip-arb-service.js.map +1 -0
- package/dist/services/dip-arb-types.d.ts +553 -0
- package/dist/services/dip-arb-types.d.ts.map +1 -0
- package/dist/services/dip-arb-types.js +164 -0
- package/dist/services/dip-arb-types.js.map +1 -0
- package/dist/services/market-service.d.ts +267 -8
- package/dist/services/market-service.d.ts.map +1 -1
- package/dist/services/market-service.js +771 -42
- package/dist/services/market-service.js.map +1 -1
- package/dist/services/onchain-service.d.ts +309 -0
- package/dist/services/onchain-service.d.ts.map +1 -0
- package/dist/services/onchain-service.js +417 -0
- package/dist/services/onchain-service.js.map +1 -0
- package/dist/services/realtime-service-v2.d.ts +362 -0
- package/dist/services/realtime-service-v2.d.ts.map +1 -0
- package/dist/services/realtime-service-v2.js +858 -0
- package/dist/services/realtime-service-v2.js.map +1 -0
- package/dist/services/realtime-service.d.ts +17 -17
- package/dist/services/realtime-service.d.ts.map +1 -1
- package/dist/services/realtime-service.js +91 -59
- package/dist/services/realtime-service.js.map +1 -1
- package/dist/services/smart-money-service.d.ts +352 -0
- package/dist/services/smart-money-service.d.ts.map +1 -0
- package/dist/services/smart-money-service.js +582 -0
- package/dist/services/smart-money-service.js.map +1 -0
- package/dist/services/trading-service.d.ts +177 -0
- package/dist/services/trading-service.d.ts.map +1 -0
- package/dist/services/trading-service.js +422 -0
- package/dist/services/trading-service.js.map +1 -0
- package/dist/services/wallet-service.d.ts +225 -3
- package/dist/services/wallet-service.d.ts.map +1 -1
- package/dist/services/wallet-service.js +511 -3
- package/dist/services/wallet-service.js.map +1 -1
- package/dist/src/__tests__/integration/arbitrage-service.integration.test.d.ts +12 -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 +267 -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 +11 -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 +260 -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 +17 -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 +234 -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 +9 -0
- package/dist/src/__tests__/integration/data-api.integration.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/data-api.integration.test.js +164 -0
- package/dist/src/__tests__/integration/data-api.integration.test.js.map +1 -0
- package/dist/src/__tests__/integration/gamma-api.integration.test.d.ts +9 -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 +170 -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 +10 -0
- package/dist/src/__tests__/integration/market-service.integration.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/market-service.integration.test.js +180 -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 +10 -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 +307 -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 +10 -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 +58 -0
- package/dist/src/__tests__/integration/trading-service.integration.test.js.map +1 -0
- package/dist/src/__tests__/test-utils.d.ts +92 -0
- package/dist/src/__tests__/test-utils.d.ts.map +1 -0
- package/dist/src/__tests__/test-utils.js +143 -0
- package/dist/src/__tests__/test-utils.js.map +1 -0
- package/dist/src/clients/bridge-client.d.ts +388 -0
- package/dist/src/clients/bridge-client.d.ts.map +1 -0
- package/dist/src/clients/bridge-client.js +587 -0
- package/dist/src/clients/bridge-client.js.map +1 -0
- package/dist/src/clients/ctf-client.d.ts +475 -0
- package/dist/src/clients/ctf-client.d.ts.map +1 -0
- package/dist/src/clients/ctf-client.js +915 -0
- package/dist/src/clients/ctf-client.js.map +1 -0
- package/dist/src/clients/data-api.d.ts +452 -0
- package/dist/src/clients/data-api.d.ts.map +1 -0
- package/dist/src/clients/data-api.js +637 -0
- package/dist/src/clients/data-api.js.map +1 -0
- package/dist/src/clients/gamma-api.d.ts +421 -0
- package/dist/src/clients/gamma-api.d.ts.map +1 -0
- package/dist/src/clients/gamma-api.js +359 -0
- package/dist/src/clients/gamma-api.js.map +1 -0
- package/dist/src/clients/subgraph.d.ts +196 -0
- package/dist/src/clients/subgraph.d.ts.map +1 -0
- package/dist/src/clients/subgraph.js +332 -0
- package/dist/src/clients/subgraph.js.map +1 -0
- package/dist/src/core/cache-adapter-bridge.d.ts +36 -0
- package/dist/src/core/cache-adapter-bridge.d.ts.map +1 -0
- package/dist/src/core/cache-adapter-bridge.js +81 -0
- package/dist/src/core/cache-adapter-bridge.js.map +1 -0
- package/dist/src/core/cache.d.ts +43 -0
- package/dist/src/core/cache.d.ts.map +1 -0
- package/dist/src/core/cache.js +76 -0
- package/dist/src/core/cache.js.map +1 -0
- package/dist/src/core/errors.d.ts +39 -0
- package/dist/src/core/errors.d.ts.map +1 -0
- package/dist/src/core/errors.js +86 -0
- package/dist/src/core/errors.js.map +1 -0
- package/dist/src/core/rate-limiter.d.ts +33 -0
- package/dist/src/core/rate-limiter.d.ts.map +1 -0
- package/dist/src/core/rate-limiter.js +82 -0
- package/dist/src/core/rate-limiter.js.map +1 -0
- package/dist/src/core/types.d.ts +506 -0
- 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 +7 -0
- package/dist/src/core/types.test.d.ts.map +1 -0
- package/dist/src/core/types.test.js +122 -0
- package/dist/src/core/types.test.js.map +1 -0
- package/dist/src/core/unified-cache.d.ts +63 -0
- package/dist/src/core/unified-cache.d.ts.map +1 -0
- package/dist/src/core/unified-cache.js +114 -0
- package/dist/src/core/unified-cache.js.map +1 -0
- package/dist/src/index.d.ts +159 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +262 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/services/arbitrage-service.d.ts +409 -0
- package/dist/src/services/arbitrage-service.d.ts.map +1 -0
- package/dist/src/services/arbitrage-service.js +1450 -0
- package/dist/src/services/arbitrage-service.js.map +1 -0
- package/dist/src/services/authorization-service.d.ts +97 -0
- package/dist/src/services/authorization-service.d.ts.map +1 -0
- package/dist/src/services/authorization-service.js +279 -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 +370 -0
- package/dist/src/services/market-service.d.ts.map +1 -0
- package/dist/src/services/market-service.js +1200 -0
- package/dist/src/services/market-service.js.map +1 -0
- package/dist/src/services/onchain-service.d.ts +309 -0
- package/dist/src/services/onchain-service.d.ts.map +1 -0
- package/dist/src/services/onchain-service.js +417 -0
- package/dist/src/services/onchain-service.js.map +1 -0
- package/dist/src/services/realtime-service-v2.d.ts +367 -0
- package/dist/src/services/realtime-service-v2.d.ts.map +1 -0
- package/dist/src/services/realtime-service-v2.js +876 -0
- package/dist/src/services/realtime-service-v2.js.map +1 -0
- package/dist/src/services/smart-money-service.d.ts +352 -0
- package/dist/src/services/smart-money-service.d.ts.map +1 -0
- package/dist/src/services/smart-money-service.js +582 -0
- package/dist/src/services/smart-money-service.js.map +1 -0
- package/dist/src/services/swap-service.d.ts +217 -0
- package/dist/src/services/swap-service.d.ts.map +1 -0
- package/dist/src/services/swap-service.js +695 -0
- package/dist/src/services/swap-service.js.map +1 -0
- package/dist/src/services/trading-service.d.ts +177 -0
- package/dist/src/services/trading-service.d.ts.map +1 -0
- package/dist/src/services/trading-service.js +422 -0
- package/dist/src/services/trading-service.js.map +1 -0
- package/dist/src/services/wallet-service.d.ts +316 -0
- package/dist/src/services/wallet-service.d.ts.map +1 -0
- package/dist/src/services/wallet-service.js +681 -0
- package/dist/src/services/wallet-service.js.map +1 -0
- package/dist/src/utils/price-utils.d.ts +153 -0
- package/dist/src/utils/price-utils.d.ts.map +1 -0
- package/dist/src/utils/price-utils.js +236 -0
- package/dist/src/utils/price-utils.js.map +1 -0
- package/dist/src/utils/price-utils.test.d.ts +5 -0
- package/dist/src/utils/price-utils.test.d.ts.map +1 -0
- package/dist/src/utils/price-utils.test.js +192 -0
- package/dist/src/utils/price-utils.test.js.map +1 -0
- package/dist/utils/price-utils.test.d.ts +5 -0
- package/dist/utils/price-utils.test.d.ts.map +1 -0
- package/dist/utils/price-utils.test.js +192 -0
- package/dist/utils/price-utils.test.js.map +1 -0
- package/package.json +6 -5
- package/README.en.md +0 -502
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
#!/usr/bin/env npx tsx
|
|
2
|
+
/**
|
|
3
|
+
* DipArb Auto Trading - 15m Crypto Markets
|
|
4
|
+
*
|
|
5
|
+
* ēē„åēļ¼
|
|
6
|
+
* 1. ę£ęµ 10 ē§å
5% 仄äøēē¬ę¶ę“č·
|
|
7
|
+
* 2. ä¹°å
„ę“č·ä¾§ (Leg1)
|
|
8
|
+
* 3. ēå¾
åÆ¹ä¾§ä»·ę ¼äøéļ¼ę»”č¶³ sumTarget åä¹°å
„ (Leg2)
|
|
9
|
+
* 4. åęä»éå®å©ę¶¦ļ¼UP + DOWN = $1
|
|
10
|
+
*
|
|
11
|
+
* ę„åæļ¼ęÆäøŖåøåŗåē¬äøäøŖę„åæęä»¶ļ¼åę¾åØ /tmp/dip-arb-logs/
|
|
12
|
+
*
|
|
13
|
+
* Run with:
|
|
14
|
+
* npx tsx scripts/dip-arb/auto-trade.ts --eth
|
|
15
|
+
* npx tsx scripts/dip-arb/auto-trade.ts --btc
|
|
16
|
+
* npx tsx scripts/dip-arb/auto-trade.ts --sol
|
|
17
|
+
* npx tsx scripts/dip-arb/auto-trade.ts --xrp
|
|
18
|
+
*/
|
|
19
|
+
import * as fs from 'fs';
|
|
20
|
+
import * as path from 'path';
|
|
21
|
+
import { PolymarketSDK } from '../../src/index.js';
|
|
22
|
+
function parseArgs() {
|
|
23
|
+
const args = process.argv.slice(2);
|
|
24
|
+
// č§£ęåøē§
|
|
25
|
+
let coin = 'ETH';
|
|
26
|
+
if (args.includes('--btc') || args.includes('-b'))
|
|
27
|
+
coin = 'BTC';
|
|
28
|
+
else if (args.includes('--eth') || args.includes('-e'))
|
|
29
|
+
coin = 'ETH';
|
|
30
|
+
else if (args.includes('--sol') || args.includes('-s'))
|
|
31
|
+
coin = 'SOL';
|
|
32
|
+
else if (args.includes('--xrp') || args.includes('-x'))
|
|
33
|
+
coin = 'XRP';
|
|
34
|
+
// č§£ęę°å¼åę°
|
|
35
|
+
const getArgValue = (name, defaultVal) => {
|
|
36
|
+
const arg = args.find(a => a.startsWith(`--${name}=`));
|
|
37
|
+
if (arg) {
|
|
38
|
+
const val = parseFloat(arg.split('=')[1]);
|
|
39
|
+
return isNaN(val) ? defaultVal : val;
|
|
40
|
+
}
|
|
41
|
+
return defaultVal;
|
|
42
|
+
};
|
|
43
|
+
// åøē§é»č®¤åę°
|
|
44
|
+
const coinDefaults = {
|
|
45
|
+
XRP: { dipThreshold: 0.40, slidingWindowMs: 3000, leg2TimeoutSeconds: 60, sumTarget: 0.85 },
|
|
46
|
+
SOL: { dipThreshold: 0.40, slidingWindowMs: 3000, leg2TimeoutSeconds: 60, sumTarget: 0.85 },
|
|
47
|
+
ETH: { dipThreshold: 0.30, slidingWindowMs: 5000, leg2TimeoutSeconds: 60, sumTarget: 0.93 },
|
|
48
|
+
BTC: { dipThreshold: 0.20, slidingWindowMs: 5000, leg2TimeoutSeconds: 60, sumTarget: 0.95 },
|
|
49
|
+
};
|
|
50
|
+
const defaults = coinDefaults[coin];
|
|
51
|
+
return {
|
|
52
|
+
coin,
|
|
53
|
+
dipThreshold: getArgValue('dip', defaults.dipThreshold),
|
|
54
|
+
slidingWindowMs: getArgValue('window', defaults.slidingWindowMs),
|
|
55
|
+
leg2TimeoutSeconds: getArgValue('timeout', defaults.leg2TimeoutSeconds),
|
|
56
|
+
sumTarget: getArgValue('target', defaults.sumTarget),
|
|
57
|
+
shares: getArgValue('shares', 25),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
const CLI_ARGS = parseArgs();
|
|
61
|
+
const SELECTED_COIN = CLI_ARGS.coin;
|
|
62
|
+
// Config
|
|
63
|
+
const PRIVATE_KEY = process.env.PRIVATE_KEY || '';
|
|
64
|
+
const MONITOR_DURATION_MS = 60 * 60 * 1000; // 1 hour
|
|
65
|
+
const LOG_DIR = '/tmp/dip-arb-logs';
|
|
66
|
+
if (!PRIVATE_KEY) {
|
|
67
|
+
console.error('Error: PRIVATE_KEY environment variable is required');
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
// Ensure log directory exists
|
|
71
|
+
if (!fs.existsSync(LOG_DIR)) {
|
|
72
|
+
fs.mkdirSync(LOG_DIR, { recursive: true });
|
|
73
|
+
}
|
|
74
|
+
// ========================================
|
|
75
|
+
// Per-Market Logging
|
|
76
|
+
// ========================================
|
|
77
|
+
let currentMarketSlug = null;
|
|
78
|
+
let currentLogs = [];
|
|
79
|
+
let currentLogPath = null;
|
|
80
|
+
function getLogFilename(marketSlug) {
|
|
81
|
+
const date = new Date().toISOString().slice(0, 10); // YYYY-MM-DD
|
|
82
|
+
const time = new Date().toISOString().slice(11, 19).replace(/:/g, ''); // HHMMSS
|
|
83
|
+
return path.join(LOG_DIR, `${date}_${time}_${marketSlug}.log`);
|
|
84
|
+
}
|
|
85
|
+
function log(msg) {
|
|
86
|
+
const timestamp = new Date().toISOString().slice(11, 19);
|
|
87
|
+
const line = `[${timestamp}] ${msg}`;
|
|
88
|
+
console.log(line);
|
|
89
|
+
currentLogs.push(line);
|
|
90
|
+
}
|
|
91
|
+
function sdkLogHandler(message) {
|
|
92
|
+
const timestamp = new Date().toISOString().slice(11, 19);
|
|
93
|
+
const line = `[${timestamp}] ${message}`;
|
|
94
|
+
console.log(line);
|
|
95
|
+
currentLogs.push(line);
|
|
96
|
+
}
|
|
97
|
+
function saveCurrentLog(suffix) {
|
|
98
|
+
if (currentLogs.length === 0)
|
|
99
|
+
return;
|
|
100
|
+
const logPath = currentLogPath || path.join(LOG_DIR, `unknown_${Date.now()}.log`);
|
|
101
|
+
const finalPath = suffix ? logPath.replace('.log', `_${suffix}.log`) : logPath;
|
|
102
|
+
fs.writeFileSync(finalPath, currentLogs.join('\n'));
|
|
103
|
+
console.log(`š Log saved: ${finalPath} (${currentLogs.length} lines)`);
|
|
104
|
+
}
|
|
105
|
+
function startNewMarketLog(marketSlug) {
|
|
106
|
+
// Save previous market log if exists
|
|
107
|
+
if (currentLogs.length > 0 && currentMarketSlug) {
|
|
108
|
+
saveCurrentLog();
|
|
109
|
+
}
|
|
110
|
+
// Start new log
|
|
111
|
+
currentMarketSlug = marketSlug;
|
|
112
|
+
currentLogs = [];
|
|
113
|
+
currentLogPath = getLogFilename(marketSlug);
|
|
114
|
+
log(`š New log file: ${currentLogPath}`);
|
|
115
|
+
}
|
|
116
|
+
// ========================================
|
|
117
|
+
// Main
|
|
118
|
+
// ========================================
|
|
119
|
+
async function main() {
|
|
120
|
+
// ========================================
|
|
121
|
+
// Configuration
|
|
122
|
+
// ========================================
|
|
123
|
+
const config = {
|
|
124
|
+
// äŗ¤ęåę° (ęÆęå½ä»¤č”č¦ē)
|
|
125
|
+
shares: CLI_ARGS.shares, // --shares=25
|
|
126
|
+
sumTarget: CLI_ARGS.sumTarget, // --target=0.95
|
|
127
|
+
// 订åęååę°
|
|
128
|
+
splitOrders: 1, // åē¬äøåļ¼éæå
份é¢äøå¹é
|
|
129
|
+
orderIntervalMs: 500, // 订åé“é 500ms (ä»
åØ splitOrders > 1 ę¶ä½æēØ)
|
|
130
|
+
// äæ”å·ę£ęµåę° (ęÆęå½ä»¤č”č¦ē)
|
|
131
|
+
slidingWindowMs: CLI_ARGS.slidingWindowMs, // --window=10000 (毫ē§)
|
|
132
|
+
dipThreshold: CLI_ARGS.dipThreshold, // --dip=0.30 (30%)
|
|
133
|
+
windowMinutes: 14, // 轮欔å¼å§å 14 åéå
åÆäŗ¤ę
|
|
134
|
+
// ę§č”åę°
|
|
135
|
+
maxSlippage: 0.02, // 2% ę»ē¹
|
|
136
|
+
autoExecute: true, // čŖåØę§č”
|
|
137
|
+
executionCooldown: 500, // å·å“ę¶é“ 500ms
|
|
138
|
+
// å
¶ä»
|
|
139
|
+
enableSurge: false, // ē¦ēØę“ę¶Øę£ęµ
|
|
140
|
+
autoMerge: true, // čŖåØ merge
|
|
141
|
+
leg2TimeoutSeconds: CLI_ARGS.leg2TimeoutSeconds, // --timeout=60 (ē§)
|
|
142
|
+
debug: true, // č°čÆę„åæ
|
|
143
|
+
// ę„åæå¤ēåØ - å° SDK ę„åæä¹åå
„å½å market ē logs ę°ē»
|
|
144
|
+
logHandler: sdkLogHandler,
|
|
145
|
+
};
|
|
146
|
+
// č®”ē®é¢ęå©ę¶¦ē
|
|
147
|
+
const expectedProfit = ((1 - config.sumTarget) / config.sumTarget * 100).toFixed(1);
|
|
148
|
+
// Start initial log
|
|
149
|
+
startNewMarketLog('init');
|
|
150
|
+
log('');
|
|
151
|
+
log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
|
|
152
|
+
log(`ā DipArb Auto Trading - ${SELECTED_COIN} Markets ā`);
|
|
153
|
+
log('ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā£');
|
|
154
|
+
log(`ā Dip Threshold: ${(config.dipThreshold * 100).toFixed(0)}% in ${config.slidingWindowMs / 1000}s window ā`);
|
|
155
|
+
log(`ā Sum Target: ${config.sumTarget} (profit >= ${expectedProfit}%) ā`);
|
|
156
|
+
log(`ā Stop Loss: ${config.leg2TimeoutSeconds}s after Leg1 ā`);
|
|
157
|
+
log(`ā Shares/Trade: ${config.shares} ā`);
|
|
158
|
+
log(`ā Order Type: Market Order (Leg1 + Leg2 + Exit) ā`);
|
|
159
|
+
log(`ā Log Directory: ${LOG_DIR}`);
|
|
160
|
+
log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
|
|
161
|
+
log('');
|
|
162
|
+
log('Usage: npx tsx auto-trade.ts --xrp [--dip=0.40] [--window=3000] [--timeout=60] [--shares=25] [--target=0.95]');
|
|
163
|
+
log('');
|
|
164
|
+
// Initialize SDK
|
|
165
|
+
log('Initializing SDK...');
|
|
166
|
+
const sdk = new PolymarketSDK({
|
|
167
|
+
privateKey: PRIVATE_KEY,
|
|
168
|
+
});
|
|
169
|
+
sdk.dipArb.updateConfig(config);
|
|
170
|
+
// ========================================
|
|
171
|
+
// Event Listeners
|
|
172
|
+
// ========================================
|
|
173
|
+
sdk.dipArb.on('started', (market) => {
|
|
174
|
+
// Start new log for this market
|
|
175
|
+
startNewMarketLog(market.slug || market.conditionId.slice(0, 20));
|
|
176
|
+
log('');
|
|
177
|
+
log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
|
|
178
|
+
log('ā MARKET STARTED ā');
|
|
179
|
+
log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤');
|
|
180
|
+
log(`ā ${market.name.slice(0, 56)}`);
|
|
181
|
+
log(`ā ${market.underlying} ${market.durationMinutes}m`);
|
|
182
|
+
log(`ā End Time: ${market.endTime.toISOString()}`);
|
|
183
|
+
log(`ā Condition: ${market.conditionId.slice(0, 30)}...`);
|
|
184
|
+
log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
|
|
185
|
+
});
|
|
186
|
+
sdk.dipArb.on('stopped', () => {
|
|
187
|
+
log('>>> SERVICE STOPPED');
|
|
188
|
+
});
|
|
189
|
+
sdk.dipArb.on('newRound', (event) => {
|
|
190
|
+
const sum = event.upOpen + event.downOpen;
|
|
191
|
+
log(`>>> NEW ROUND | UP: ${event.upOpen.toFixed(3)} | DOWN: ${event.downOpen.toFixed(3)} | Sum: ${sum.toFixed(3)}`);
|
|
192
|
+
});
|
|
193
|
+
sdk.dipArb.on('signal', (signal) => {
|
|
194
|
+
log('');
|
|
195
|
+
log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
|
|
196
|
+
if (signal.type === 'leg1') {
|
|
197
|
+
log(`ā LEG1 SIGNAL: Buy ${signal.dipSide} @ ${signal.currentPrice.toFixed(4)}`);
|
|
198
|
+
log(`ā Drop: ${(signal.dropPercent * 100).toFixed(1)}% | Opposite: ${signal.oppositeAsk.toFixed(4)}`);
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
log(`ā LEG2 SIGNAL: Buy ${signal.hedgeSide} @ ${signal.currentPrice.toFixed(4)}`);
|
|
202
|
+
log(`ā Total Cost: ${signal.totalCost.toFixed(4)} | Profit: ${(signal.expectedProfitRate * 100).toFixed(2)}%`);
|
|
203
|
+
}
|
|
204
|
+
log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
|
|
205
|
+
});
|
|
206
|
+
sdk.dipArb.on('execution', (result) => {
|
|
207
|
+
if (result.success) {
|
|
208
|
+
log(`ā
${result.leg.toUpperCase()} FILLED: ${result.side} @ ${result.price?.toFixed(4)} x${result.shares}`);
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
log(`ā ${result.leg.toUpperCase()} FAILED: ${result.error}`);
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
sdk.dipArb.on('roundComplete', (result) => {
|
|
215
|
+
log('');
|
|
216
|
+
log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
|
|
217
|
+
log(`ā ROUND ${result.status.toUpperCase()}`);
|
|
218
|
+
if (result.profit !== undefined) {
|
|
219
|
+
log(`ā Profit: $${result.profit.toFixed(4)} (${(result.profitRate * 100).toFixed(2)}%)`);
|
|
220
|
+
}
|
|
221
|
+
log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
|
|
222
|
+
});
|
|
223
|
+
sdk.dipArb.on('rotate', (event) => {
|
|
224
|
+
// Save current market log before rotation
|
|
225
|
+
log('');
|
|
226
|
+
log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
|
|
227
|
+
log(`ā š MARKET ROTATION ā`);
|
|
228
|
+
log(`ā Reason: ${event.reason}`);
|
|
229
|
+
log(`ā Previous: ${event.previousMarket?.slice(0, 40) || 'none'}...`);
|
|
230
|
+
log(`ā New: ${event.newMarket.slice(0, 40)}...`);
|
|
231
|
+
log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
|
|
232
|
+
// Save old log and start new one
|
|
233
|
+
// Note: 'started' event will be triggered after rotate, which will start new log
|
|
234
|
+
});
|
|
235
|
+
sdk.dipArb.on('settled', (result) => {
|
|
236
|
+
log(`>>> SETTLED: ${result.strategy} | Success: ${result.success}`);
|
|
237
|
+
if (result.amountReceived) {
|
|
238
|
+
log(` Amount: $${result.amountReceived.toFixed(2)}`);
|
|
239
|
+
}
|
|
240
|
+
if (result.error) {
|
|
241
|
+
log(` Error: ${result.error}`);
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
sdk.dipArb.on('error', (error) => {
|
|
245
|
+
log(`[ERROR] ${error.message}`);
|
|
246
|
+
});
|
|
247
|
+
// ========================================
|
|
248
|
+
// Scan and Start
|
|
249
|
+
// ========================================
|
|
250
|
+
log(`Scanning for ${SELECTED_COIN} 15m markets...`);
|
|
251
|
+
const markets = await sdk.dipArb.scanUpcomingMarkets({
|
|
252
|
+
coin: SELECTED_COIN,
|
|
253
|
+
duration: '15m',
|
|
254
|
+
limit: 5,
|
|
255
|
+
});
|
|
256
|
+
log(`Found ${markets.length} markets:`);
|
|
257
|
+
for (const m of markets) {
|
|
258
|
+
const endIn = Math.round((m.endTime.getTime() - Date.now()) / 60000);
|
|
259
|
+
const status = endIn <= 0 ? '(ENDED)' : `(ends in ${endIn}m)`;
|
|
260
|
+
log(` - ${m.name.slice(0, 50)} ${status}`);
|
|
261
|
+
log(` Condition: ${m.conditionId.slice(0, 30)}...`);
|
|
262
|
+
log(` End: ${m.endTime.toISOString()}`);
|
|
263
|
+
}
|
|
264
|
+
if (markets.length === 0) {
|
|
265
|
+
log('No markets found. Exiting.');
|
|
266
|
+
saveCurrentLog('no-markets');
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
// Filter out already ended markets
|
|
270
|
+
const activeMarkets = markets.filter(m => m.endTime.getTime() > Date.now());
|
|
271
|
+
if (activeMarkets.length === 0) {
|
|
272
|
+
log('All markets have ended. Waiting for new markets...');
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
log(`Active markets: ${activeMarkets.length}`);
|
|
276
|
+
}
|
|
277
|
+
// Start
|
|
278
|
+
const market = await sdk.dipArb.findAndStart({
|
|
279
|
+
coin: SELECTED_COIN,
|
|
280
|
+
preferDuration: '15m',
|
|
281
|
+
});
|
|
282
|
+
if (!market) {
|
|
283
|
+
log('Failed to start. Exiting.');
|
|
284
|
+
saveCurrentLog('failed');
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
log(`Selected market ends at: ${market.endTime.toISOString()}`);
|
|
288
|
+
const timeUntilEnd = Math.round((market.endTime.getTime() - Date.now()) / 1000);
|
|
289
|
+
log(`Time until market end: ${timeUntilEnd}s (${Math.round(timeUntilEnd / 60)}m)`);
|
|
290
|
+
// Enable auto-rotate with redeem strategy
|
|
291
|
+
sdk.dipArb.enableAutoRotate({
|
|
292
|
+
enabled: true,
|
|
293
|
+
underlyings: [SELECTED_COIN],
|
|
294
|
+
duration: '15m',
|
|
295
|
+
settleStrategy: 'redeem', // ēå¾
åøåŗē»ē®åčµå (5åéå)
|
|
296
|
+
autoSettle: true,
|
|
297
|
+
preloadMinutes: 2,
|
|
298
|
+
redeemWaitMinutes: 5, // åøåŗē»ęåēå¾
5 åéåčµå
|
|
299
|
+
redeemRetryIntervalSeconds: 30, // ęÆ 30 ē§ę£ę„äøę¬”
|
|
300
|
+
});
|
|
301
|
+
log(`Auto-rotate enabled for ${SELECTED_COIN} (with background redemption)`);
|
|
302
|
+
log('');
|
|
303
|
+
log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
|
|
304
|
+
log(' AUTO TRADING ACTIVE - Press Ctrl+C to stop');
|
|
305
|
+
log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
|
|
306
|
+
log('');
|
|
307
|
+
// Status update every 30 seconds (more frequent to catch rotation)
|
|
308
|
+
let statusCount = 0;
|
|
309
|
+
const statusInterval = setInterval(() => {
|
|
310
|
+
const stats = sdk.dipArb.getStats();
|
|
311
|
+
const round = sdk.dipArb.getCurrentRound();
|
|
312
|
+
const currentMarket = sdk.dipArb.getMarket();
|
|
313
|
+
statusCount++;
|
|
314
|
+
// Check if market has ended
|
|
315
|
+
if (currentMarket) {
|
|
316
|
+
const timeLeft = Math.round((currentMarket.endTime.getTime() - Date.now()) / 1000);
|
|
317
|
+
const timeLeftStr = timeLeft > 0 ? `${timeLeft}s left` : `ENDED ${-timeLeft}s ago`;
|
|
318
|
+
log(`[Status #${statusCount}] Market: ${currentMarket.underlying} | ${timeLeftStr} | Signals: ${stats.signalsDetected} | L1: ${stats.leg1Filled} | L2: ${stats.leg2Filled}`);
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
log(`[Status #${statusCount}] No market active | Signals: ${stats.signalsDetected}`);
|
|
322
|
+
}
|
|
323
|
+
// Show current position
|
|
324
|
+
if (round) {
|
|
325
|
+
if (round.phase === 'leg1_filled' && round.leg1) {
|
|
326
|
+
log(` š Position: ${round.leg1.shares}x ${round.leg1.side} @ ${round.leg1.price.toFixed(4)} | Waiting for Leg2...`);
|
|
327
|
+
}
|
|
328
|
+
else if (round.phase === 'completed' && round.leg1 && round.leg2) {
|
|
329
|
+
const totalCost = round.leg1.price + round.leg2.price;
|
|
330
|
+
const profit = (1 - totalCost) * round.leg1.shares;
|
|
331
|
+
log(` š Position: ${round.leg1.shares}x UP + ${round.leg2.shares}x DOWN | Cost: ${totalCost.toFixed(4)} | Profit: $${profit.toFixed(2)}`);
|
|
332
|
+
}
|
|
333
|
+
else if (round.phase === 'waiting') {
|
|
334
|
+
log(` š Position: None (waiting for signal)`);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}, 30000);
|
|
338
|
+
// Wait
|
|
339
|
+
await new Promise(resolve => setTimeout(resolve, MONITOR_DURATION_MS));
|
|
340
|
+
// Cleanup
|
|
341
|
+
clearInterval(statusInterval);
|
|
342
|
+
// Final stats
|
|
343
|
+
const stats = sdk.dipArb.getStats();
|
|
344
|
+
log('');
|
|
345
|
+
log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
|
|
346
|
+
log('ā FINAL STATS ā');
|
|
347
|
+
log('ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā£');
|
|
348
|
+
log(`ā Running Time: ${Math.round(stats.runningTimeMs / 1000)}s`);
|
|
349
|
+
log(`ā Rounds Monitored: ${stats.roundsMonitored}`);
|
|
350
|
+
log(`ā Signals Detected: ${stats.signalsDetected}`);
|
|
351
|
+
log(`ā Leg1 Filled: ${stats.leg1Filled}`);
|
|
352
|
+
log(`ā Leg2 Filled: ${stats.leg2Filled}`);
|
|
353
|
+
log(`ā Total Profit: $${stats.totalProfit.toFixed(2)}`);
|
|
354
|
+
log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
|
|
355
|
+
await sdk.dipArb.stop();
|
|
356
|
+
sdk.stop();
|
|
357
|
+
// Save final log
|
|
358
|
+
saveCurrentLog('final');
|
|
359
|
+
}
|
|
360
|
+
// Handle Ctrl+C
|
|
361
|
+
process.on('SIGINT', async () => {
|
|
362
|
+
log('');
|
|
363
|
+
log('Interrupted. Saving logs...');
|
|
364
|
+
saveCurrentLog('interrupted');
|
|
365
|
+
process.exit(0);
|
|
366
|
+
});
|
|
367
|
+
main().catch((err) => {
|
|
368
|
+
log(`Fatal error: ${err.message}`);
|
|
369
|
+
console.error(err);
|
|
370
|
+
saveCurrentLog('error');
|
|
371
|
+
process.exit(1);
|
|
372
|
+
});
|
|
373
|
+
//# sourceMappingURL=auto-trade.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-trade.js","sourceRoot":"","sources":["../../../scripts/dip-arb/auto-trade.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env npx tsx
|
|
2
|
+
/**
|
|
3
|
+
* Example 14: DipArbService - Dip Arbitrage for 15m/5m UP/DOWN Markets
|
|
4
|
+
*
|
|
5
|
+
* Demonstrates the dip arbitrage workflow for Polymarket's short-term crypto markets:
|
|
6
|
+
* 1. Scan for upcoming BTC/ETH/SOL/XRP UP/DOWN markets
|
|
7
|
+
* 2. Auto-select and start monitoring a market
|
|
8
|
+
* 3. Detect dip signals (price drops > threshold)
|
|
9
|
+
* 4. Execute Leg1 + Leg2 trades for risk-free profit
|
|
10
|
+
* 5. Auto-rotate to next market when current ends
|
|
11
|
+
*
|
|
12
|
+
* Strategy Overview:
|
|
13
|
+
* - Leg1: Buy the dipped side when price drops >= dipThreshold (default 15%)
|
|
14
|
+
* - Leg2: Buy the opposite side when combined cost < sumTarget (default 0.95)
|
|
15
|
+
* - Profit: Total cost < $1 means guaranteed profit at settlement
|
|
16
|
+
*
|
|
17
|
+
* Environment variables:
|
|
18
|
+
* POLY_PRIVKEY - Private key for trading (required for execution)
|
|
19
|
+
*
|
|
20
|
+
* Run with:
|
|
21
|
+
* pnpm example:dip-arb
|
|
22
|
+
*
|
|
23
|
+
* Or monitor-only (no trading):
|
|
24
|
+
* npx tsx examples/14-dip-arb-service.ts --monitor-only
|
|
25
|
+
*
|
|
26
|
+
* With auto-rotate:
|
|
27
|
+
* npx tsx examples/14-dip-arb-service.ts --auto-rotate
|
|
28
|
+
*/
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=example-basic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"example-basic.d.ts","sourceRoot":"","sources":["../../../scripts/dip-arb/example-basic.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
#!/usr/bin/env npx tsx
|
|
2
|
+
/**
|
|
3
|
+
* Example 14: DipArbService - Dip Arbitrage for 15m/5m UP/DOWN Markets
|
|
4
|
+
*
|
|
5
|
+
* Demonstrates the dip arbitrage workflow for Polymarket's short-term crypto markets:
|
|
6
|
+
* 1. Scan for upcoming BTC/ETH/SOL/XRP UP/DOWN markets
|
|
7
|
+
* 2. Auto-select and start monitoring a market
|
|
8
|
+
* 3. Detect dip signals (price drops > threshold)
|
|
9
|
+
* 4. Execute Leg1 + Leg2 trades for risk-free profit
|
|
10
|
+
* 5. Auto-rotate to next market when current ends
|
|
11
|
+
*
|
|
12
|
+
* Strategy Overview:
|
|
13
|
+
* - Leg1: Buy the dipped side when price drops >= dipThreshold (default 15%)
|
|
14
|
+
* - Leg2: Buy the opposite side when combined cost < sumTarget (default 0.95)
|
|
15
|
+
* - Profit: Total cost < $1 means guaranteed profit at settlement
|
|
16
|
+
*
|
|
17
|
+
* Environment variables:
|
|
18
|
+
* POLY_PRIVKEY - Private key for trading (required for execution)
|
|
19
|
+
*
|
|
20
|
+
* Run with:
|
|
21
|
+
* pnpm example:dip-arb
|
|
22
|
+
*
|
|
23
|
+
* Or monitor-only (no trading):
|
|
24
|
+
* npx tsx examples/14-dip-arb-service.ts --monitor-only
|
|
25
|
+
*
|
|
26
|
+
* With auto-rotate:
|
|
27
|
+
* npx tsx examples/14-dip-arb-service.ts --auto-rotate
|
|
28
|
+
*/
|
|
29
|
+
import { PolymarketSDK } from '../../src/index.js';
|
|
30
|
+
// Parse arguments
|
|
31
|
+
const args = process.argv.slice(2);
|
|
32
|
+
const MONITOR_ONLY = args.includes('--monitor-only');
|
|
33
|
+
const AUTO_ROTATE = args.includes('--auto-rotate');
|
|
34
|
+
const COIN = args.find(a => a.startsWith('--coin='))?.split('=')[1];
|
|
35
|
+
const RUN_DURATION = parseInt(args.find(a => a.startsWith('--duration='))?.split('=')[1] || '300') * 1000; // default 5 minutes
|
|
36
|
+
async function main() {
|
|
37
|
+
console.log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
|
|
38
|
+
console.log('ā DipArbService - Dip Arbitrage Demo ā');
|
|
39
|
+
console.log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
|
|
40
|
+
console.log();
|
|
41
|
+
const privateKey = process.env.POLY_PRIVKEY;
|
|
42
|
+
if (!privateKey && !MONITOR_ONLY) {
|
|
43
|
+
console.log('No POLY_PRIVKEY provided. Running in monitor-only mode.\n');
|
|
44
|
+
}
|
|
45
|
+
// ========== Initialize SDK ==========
|
|
46
|
+
console.log('Initializing SDK...');
|
|
47
|
+
const sdk = await PolymarketSDK.create({
|
|
48
|
+
privateKey: MONITOR_ONLY ? undefined : privateKey,
|
|
49
|
+
});
|
|
50
|
+
console.log('SDK initialized\n');
|
|
51
|
+
// ========== Configure DipArbService ==========
|
|
52
|
+
sdk.dipArb.updateConfig({
|
|
53
|
+
shares: 20, // Buy 20 shares per leg
|
|
54
|
+
sumTarget: 0.95, // Target total cost <= $0.95 (5% profit)
|
|
55
|
+
dipThreshold: 0.15, // Trigger when price drops 15%
|
|
56
|
+
windowMinutes: 2, // Trade window after round starts
|
|
57
|
+
maxSlippage: 0.02, // Max 2% slippage
|
|
58
|
+
minProfitRate: 0.03, // Min 3% profit rate
|
|
59
|
+
leg2TimeoutSeconds: 300, // 5 min timeout for leg2
|
|
60
|
+
enableSurge: true, // Also detect surges
|
|
61
|
+
autoMerge: true, // Auto merge after both legs
|
|
62
|
+
autoExecute: !MONITOR_ONLY && !!privateKey,
|
|
63
|
+
debug: true,
|
|
64
|
+
});
|
|
65
|
+
console.log('Configuration:');
|
|
66
|
+
console.log(JSON.stringify(sdk.dipArb.getConfig(), null, 2));
|
|
67
|
+
console.log();
|
|
68
|
+
// ========== Set up event listeners ==========
|
|
69
|
+
sdk.dipArb.on('started', (market) => {
|
|
70
|
+
console.log('\nāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
|
|
71
|
+
console.log(`š Started monitoring: ${market.name}`);
|
|
72
|
+
console.log(` Condition ID: ${market.conditionId.slice(0, 20)}...`);
|
|
73
|
+
console.log(` Underlying: ${market.underlying} | Duration: ${market.durationMinutes}m`);
|
|
74
|
+
console.log(` End Time: ${market.endTime.toLocaleString()}`);
|
|
75
|
+
console.log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n');
|
|
76
|
+
});
|
|
77
|
+
sdk.dipArb.on('stopped', () => {
|
|
78
|
+
console.log('\nš Service stopped');
|
|
79
|
+
});
|
|
80
|
+
sdk.dipArb.on('newRound', (event) => {
|
|
81
|
+
console.log(`\nš New Round: ${event.roundId}`);
|
|
82
|
+
console.log(` Price to Beat: $${event.priceToBeat.toFixed(2)}`);
|
|
83
|
+
console.log(` UP Open: ${event.upOpen.toFixed(4)} | DOWN Open: ${event.downOpen.toFixed(4)}`);
|
|
84
|
+
});
|
|
85
|
+
sdk.dipArb.on('signal', (signal) => {
|
|
86
|
+
if (signal.type === 'leg1') {
|
|
87
|
+
console.log(`\nšÆ LEG1 SIGNAL [${signal.source.toUpperCase()}]`);
|
|
88
|
+
console.log(` Buy ${signal.dipSide} @ ${signal.currentPrice.toFixed(4)}`);
|
|
89
|
+
console.log(` Drop: ${(signal.dropPercent * 100).toFixed(1)}%`);
|
|
90
|
+
console.log(` Opposite Ask: ${signal.oppositeAsk.toFixed(4)}`);
|
|
91
|
+
console.log(` Est Total Cost: ${signal.estimatedTotalCost.toFixed(4)}`);
|
|
92
|
+
console.log(` Est Profit Rate: ${(signal.estimatedProfitRate * 100).toFixed(2)}%`);
|
|
93
|
+
if (signal.btcInfo) {
|
|
94
|
+
console.log(` ${signal.btcInfo.btcPrice > 0 ? 'BTC' : 'Underlying'}: $${signal.btcInfo.btcPrice.toFixed(2)} (${signal.btcInfo.btcChangePercent >= 0 ? '+' : ''}${signal.btcInfo.btcChangePercent.toFixed(2)}%)`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
console.log(`\nšÆ LEG2 SIGNAL`);
|
|
99
|
+
console.log(` Buy ${signal.hedgeSide} @ ${signal.currentPrice.toFixed(4)}`);
|
|
100
|
+
console.log(` Leg1 was: ${signal.leg1.side} @ ${signal.leg1.price.toFixed(4)}`);
|
|
101
|
+
console.log(` Total Cost: ${signal.totalCost.toFixed(4)}`);
|
|
102
|
+
console.log(` Expected Profit Rate: ${(signal.expectedProfitRate * 100).toFixed(2)}%`);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
sdk.dipArb.on('execution', (result) => {
|
|
106
|
+
if (result.success) {
|
|
107
|
+
console.log(`\nā
${result.leg.toUpperCase()} Executed!`);
|
|
108
|
+
if (result.side)
|
|
109
|
+
console.log(` Side: ${result.side}`);
|
|
110
|
+
if (result.price)
|
|
111
|
+
console.log(` Price: ${result.price.toFixed(4)}`);
|
|
112
|
+
if (result.shares)
|
|
113
|
+
console.log(` Shares: ${result.shares}`);
|
|
114
|
+
if (result.orderId)
|
|
115
|
+
console.log(` Order ID: ${result.orderId}`);
|
|
116
|
+
console.log(` Time: ${result.executionTimeMs}ms`);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
console.log(`\nā ${result.leg.toUpperCase()} Failed: ${result.error}`);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
sdk.dipArb.on('roundComplete', (result) => {
|
|
123
|
+
console.log(`\nš Round ${result.roundId} Complete`);
|
|
124
|
+
console.log(` Status: ${result.status}`);
|
|
125
|
+
if (result.totalCost !== undefined) {
|
|
126
|
+
console.log(` Total Cost: ${result.totalCost.toFixed(4)}`);
|
|
127
|
+
console.log(` Profit: $${result.profit?.toFixed(4)}`);
|
|
128
|
+
console.log(` Profit Rate: ${((result.profitRate || 0) * 100).toFixed(2)}%`);
|
|
129
|
+
}
|
|
130
|
+
console.log(` Merged: ${result.merged ? 'Yes' : 'No'}`);
|
|
131
|
+
});
|
|
132
|
+
sdk.dipArb.on('priceUpdate', (event) => {
|
|
133
|
+
// Only log significant price changes
|
|
134
|
+
if (Math.abs(event.changePercent) >= 0.5) {
|
|
135
|
+
console.log(` ${event.underlying}: $${event.value.toFixed(2)} (${event.changePercent >= 0 ? '+' : ''}${event.changePercent.toFixed(2)}% vs PTB)`);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
sdk.dipArb.on('rotate', (event) => {
|
|
139
|
+
console.log(`\nš Market Rotation`);
|
|
140
|
+
console.log(` Reason: ${event.reason}`);
|
|
141
|
+
console.log(` Previous: ${event.previousMarket?.slice(0, 20) || 'none'}...`);
|
|
142
|
+
console.log(` New: ${event.newMarket.slice(0, 20)}...`);
|
|
143
|
+
});
|
|
144
|
+
sdk.dipArb.on('settled', (result) => {
|
|
145
|
+
console.log(`\nš° Position Settled`);
|
|
146
|
+
console.log(` Strategy: ${result.strategy}`);
|
|
147
|
+
console.log(` Success: ${result.success}`);
|
|
148
|
+
if (result.amountReceived) {
|
|
149
|
+
console.log(` Amount: $${result.amountReceived.toFixed(2)}`);
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
sdk.dipArb.on('error', (error) => {
|
|
153
|
+
console.error(`\nā Error: ${error.message}`);
|
|
154
|
+
});
|
|
155
|
+
// ========== Enable auto-rotate if requested ==========
|
|
156
|
+
if (AUTO_ROTATE) {
|
|
157
|
+
sdk.dipArb.enableAutoRotate({
|
|
158
|
+
underlyings: COIN ? [COIN] : ['BTC', 'ETH'],
|
|
159
|
+
duration: '15m',
|
|
160
|
+
autoSettle: true,
|
|
161
|
+
settleStrategy: 'sell', // 'sell' is faster, 'redeem' waits for resolution
|
|
162
|
+
preloadMinutes: 2,
|
|
163
|
+
});
|
|
164
|
+
console.log('Auto-rotate enabled\n');
|
|
165
|
+
}
|
|
166
|
+
// ========== Scan for markets ==========
|
|
167
|
+
console.log('Scanning for upcoming markets...\n');
|
|
168
|
+
const markets = await sdk.dipArb.scanUpcomingMarkets({
|
|
169
|
+
coin: COIN || 'all',
|
|
170
|
+
duration: '15m',
|
|
171
|
+
minMinutesUntilEnd: 10,
|
|
172
|
+
maxMinutesUntilEnd: 60,
|
|
173
|
+
limit: 10,
|
|
174
|
+
});
|
|
175
|
+
if (markets.length === 0) {
|
|
176
|
+
console.log('No suitable markets found. Try again later.\n');
|
|
177
|
+
sdk.stop();
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
console.log(`Found ${markets.length} markets:\n`);
|
|
181
|
+
markets.forEach((m, i) => {
|
|
182
|
+
const minutesLeft = Math.round((m.endTime.getTime() - Date.now()) / 60000);
|
|
183
|
+
console.log(` ${i + 1}. [${m.underlying}] ${m.slug}`);
|
|
184
|
+
console.log(` Ends in ${minutesLeft} minutes`);
|
|
185
|
+
});
|
|
186
|
+
console.log();
|
|
187
|
+
// ========== Start monitoring ==========
|
|
188
|
+
const market = await sdk.dipArb.findAndStart({
|
|
189
|
+
coin: COIN,
|
|
190
|
+
preferDuration: '15m',
|
|
191
|
+
});
|
|
192
|
+
if (!market) {
|
|
193
|
+
console.log('Could not start monitoring. Exiting.\n');
|
|
194
|
+
sdk.stop();
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
// ========== Run for specified duration ==========
|
|
198
|
+
console.log(`Running for ${RUN_DURATION / 1000} seconds...`);
|
|
199
|
+
console.log('Press Ctrl+C to stop early.\n');
|
|
200
|
+
await new Promise(resolve => setTimeout(resolve, RUN_DURATION));
|
|
201
|
+
// ========== Print final stats ==========
|
|
202
|
+
const stats = sdk.dipArb.getStats();
|
|
203
|
+
console.log('\nāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
|
|
204
|
+
console.log('š Final Statistics');
|
|
205
|
+
console.log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
|
|
206
|
+
console.log(`Rounds Monitored: ${stats.roundsMonitored}`);
|
|
207
|
+
console.log(`Rounds Completed: ${stats.roundsCompleted}`);
|
|
208
|
+
console.log(`Rounds Successful: ${stats.roundsSuccessful}`);
|
|
209
|
+
console.log(`Rounds Expired: ${stats.roundsExpired}`);
|
|
210
|
+
console.log(`Signals Detected: ${stats.signalsDetected}`);
|
|
211
|
+
console.log(`Leg1 Filled: ${stats.leg1Filled}`);
|
|
212
|
+
console.log(`Leg2 Filled: ${stats.leg2Filled}`);
|
|
213
|
+
console.log(`Total Spent: $${stats.totalSpent.toFixed(2)}`);
|
|
214
|
+
console.log(`Total Profit: $${stats.totalProfit.toFixed(2)}`);
|
|
215
|
+
console.log(`Running Time: ${(stats.runningTimeMs / 1000).toFixed(1)}s`);
|
|
216
|
+
console.log();
|
|
217
|
+
// ========== Clean up ==========
|
|
218
|
+
sdk.stop();
|
|
219
|
+
console.log('Done!\n');
|
|
220
|
+
}
|
|
221
|
+
main().catch(console.error);
|
|
222
|
+
//# sourceMappingURL=example-basic.js.map
|