Loading...
Loading...
Compare original and translation side by side
Skill by ara.so — Daily 2026 Skills collection.
Skill由ara.so开发 — 2026年度技能合集系列。
POSITION_MULTIPLIERSIG_TYPE=0SIG_TYPE=1SIG_TYPE=2POSITION_MULTIPLIERSIG_TYPE=0SIG_TYPE=1SIG_TYPE=2git clone https://github.com/Neron888/Polymarket-copy-trading-bot.git
cd Polymarket-copy-trading-bot
npm installpackage.jsongit clone https://github.com/Neron888/Polymarket-copy-trading-bot.git
cd Polymarket-copy-trading-bot
npm installpackage.jsoncp .env.example .env.envundefinedcp .env.example .env.envundefined
---
---undefinedundefined
---
---index.ts
└── TradeMonitor — REST polls Polymarket Data API for new target trades
└── WebSocketMonitor — Optional low-latency WS subscription (market or user channel)
└── TradeExecutor — Sizes trade, checks balance/allowance, submits CLOB order
└── PositionTracker — In-memory positions updated on fills
└── RiskManager — Session + per-market notional enforcementdetect trade → BUY? → subscribe WS if needed → compute copy size
→ risk check → execute order (FOK/FAK/LIMIT) → record fill → update statsindex.ts
└── TradeMonitor — 调用Polymarket数据API REST轮询获取目标的新交易
└── WebSocketMonitor — 可选低延迟WS订阅(市场或用户通道)
└── TradeExecutor — 计算跟单金额,检查余额/授权,提交CLOB订单
└── PositionTracker — 内存中存储成交后的持仓更新
└── RiskManager — 执行会话+单市场名义金额限制检测交易 → 是买入交易? → 按需订阅WS → 计算跟单金额
→ 风险校验 → 执行订单(FOK/FAK/LIMIT) → 记录成交 → 更新统计数据import { startBot } from './src/index';
// The bot reads all config from process.env / .env
startBot();import { startBot } from './src/index';
// 机器人会从process.env / .env读取所有配置
startBot();import { TradeMonitor } from './src/TradeMonitor';
const monitor = new TradeMonitor({
targetWallet: process.env.TARGET_WALLET!,
pollInterval: Number(process.env.POLL_INTERVAL ?? 2000),
});
monitor.on('trade', (trade) => {
console.log('New trade detected:', trade);
// trade.side: 'BUY' | 'SELL'
// trade.asset: token ID (outcome token address)
// trade.size: USDC size
// trade.price: fill price (0–1)
});
monitor.start();import { TradeMonitor } from './src/TradeMonitor';
const monitor = new TradeMonitor({
targetWallet: process.env.TARGET_WALLET!,
pollInterval: Number(process.env.POLL_INTERVAL ?? 2000),
});
monitor.on('trade', (trade) => {
console.log('检测到新交易:', trade);
// trade.side: 'BUY' | 'SELL'
// trade.asset: 代币ID(结果代币地址)
// trade.size: USDC金额
// trade.price: 成交价格(0–1)
});
monitor.start();import { TradeExecutor } from './src/TradeExecutor';
import { ClobClient } from '@polymarket/clob-client';
import { ethers } from 'ethers';
const provider = new ethers.providers.JsonRpcProvider(process.env.RPC_URL);
const signer = new ethers.Wallet(process.env.WALLET_PRIVATE_KEY!, provider);
const clobClient = new ClobClient(
'https://clob.polymarket.com',
137, // Polygon chainId
signer,
apiCreds, // loaded from .polymarket-api-creds
Number(process.env.SIG_TYPE ?? 0),
process.env.PROXY_WALLET_ADDRESS || undefined,
);
const executor = new TradeExecutor({
client: clobClient,
positionMultiplier: Number(process.env.POSITION_MULTIPLIER ?? 0.1),
maxTradeSize: Number(process.env.MAX_TRADE_SIZE ?? 100),
minTradeSize: Number(process.env.MIN_TRADE_SIZE ?? 1),
orderType: (process.env.ORDER_TYPE ?? 'FOK') as 'FOK' | 'FAK' | 'LIMIT',
slippageTolerance: Number(process.env.SLIPPAGE_TOLERANCE ?? 0.02),
});
// Copy a detected trade
await executor.copyTrade({
side: 'BUY',
tokenId: '0xAssetId...',
originalSize: 12.5, // USDC from target's trade
price: 0.62,
});import { TradeExecutor } from './src/TradeExecutor';
import { ClobClient } from '@polymarket/clob-client';
import { ethers } from 'ethers';
const provider = new ethers.providers.JsonRpcProvider(process.env.RPC_URL);
const signer = new ethers.Wallet(process.env.WALLET_PRIVATE_KEY!, provider);
const clobClient = new ClobClient(
'https://clob.polymarket.com',
137, // Polygon链ID
signer,
apiCreds, // 从.polymarket-api-creds加载
Number(process.env.SIG_TYPE ?? 0),
process.env.PROXY_WALLET_ADDRESS || undefined,
);
const executor = new TradeExecutor({
client: clobClient,
positionMultiplier: Number(process.env.POSITION_MULTIPLIER ?? 0.1),
maxTradeSize: Number(process.env.MAX_TRADE_SIZE ?? 100),
minTradeSize: Number(process.env.MIN_TRADE_SIZE ?? 1),
orderType: (process.env.ORDER_TYPE ?? 'FOK') as 'FOK' | 'FAK' | 'LIMIT',
slippageTolerance: Number(process.env.SLIPPAGE_TOLERANCE ?? 0.02),
});
// 复制检测到的交易
await executor.copyTrade({
side: 'BUY',
tokenId: '0x资产ID...',
originalSize: 12.5, // 目标交易的USDC金额
price: 0.62,
});import { RiskManager } from './src/RiskManager';
const riskManager = new RiskManager({
maxSessionNotional: Number(process.env.MAX_SESSION_NOTIONAL ?? 0),
maxPerMarketNotional: Number(process.env.MAX_PER_MARKET_NOTIONAL ?? 0),
});
const allowed = riskManager.checkTrade({
marketId: '0xConditionId...',
notional: copySize,
});
if (!allowed) {
console.log('Trade blocked by risk limits');
}import { RiskManager } from './src/RiskManager';
const riskManager = new RiskManager({
maxSessionNotional: Number(process.env.MAX_SESSION_NOTIONAL ?? 0),
maxPerMarketNotional: Number(process.env.MAX_PER_MARKET_NOTIONAL ?? 0),
});
const allowed = riskManager.checkTrade({
marketId: '0x条件ID...',
notional: copySize,
});
if (!allowed) {
console.log('交易被风险限制拦截');
}import { WebSocketMonitor } from './src/WebSocketMonitor';
const wsMonitor = new WebSocketMonitor({
useUserChannel: process.env.USE_USER_CHANNEL === 'true',
assetIds: process.env.WS_ASSET_IDS?.split(',').filter(Boolean) ?? [],
marketIds: process.env.WS_MARKET_IDS?.split(',').filter(Boolean) ?? [],
});
wsMonitor.on('orderFilled', (fill) => {
console.log('Fill received via WS:', fill);
});
wsMonitor.connect();import { WebSocketMonitor } from './src/WebSocketMonitor';
const wsMonitor = new WebSocketMonitor({
useUserChannel: process.env.USE_USER_CHANNEL === 'true',
assetIds: process.env.WS_ASSET_IDS?.split(',').filter(Boolean) ?? [],
marketIds: process.env.WS_MARKET_IDS?.split(',').filter(Boolean) ?? [],
});
wsMonitor.on('orderFilled', (fill) => {
console.log('通过WS收到成交通知:', fill);
});
wsMonitor.connect();SIG_TYPE=0SIG_TYPE=0SIG_TYPE=0
WALLET_PRIVATE_KEY=0xYourKeySIG_TYPE=0
WALLET_PRIVATE_KEY=0x你的私钥
On first run, the bot auto-submits USDC.e/CTF approval transactions. Wallet needs POL for gas.
首次运行时,机器人会自动提交USDC.e/CTF授权交易,钱包需要有POL支付gas费。SIG_TYPE=1SIG_TYPE=1SIG_TYPE=1
WALLET_PRIVATE_KEY=0xSignerKey
PROXY_WALLET_ADDRESS=0xYourPolymarketProxyAddressSIG_TYPE=1
WALLET_PRIVATE_KEY=0x签名者私钥
PROXY_WALLET_ADDRESS=0x你的Polymarket代理地址SIG_TYPE=2SIG_TYPE=2SIG_TYPE=2
WALLET_PRIVATE_KEY=0xSignerKey
PROXY_WALLET_ADDRESS=0xYourPolymorphicSafeAddressSIG_TYPE=2
WALLET_PRIVATE_KEY=0x签名者私钥
PROXY_WALLET_ADDRESS=0x你的多签Safe地址npm run generate-api-creds.polymarket-api-credsnpm startnpm run test-api-credsnpm run generate-api-creds.polymarket-api-credsnpm startnpm run test-api-credsPOSITION_MULTIPLIER=0.05
MAX_TRADE_SIZE=5
MIN_TRADE_SIZE=1
MAX_SESSION_NOTIONAL=20
ORDER_TYPE=FOK
USE_WEBSOCKET=falsePOSITION_MULTIPLIER=0.05
MAX_TRADE_SIZE=5
MIN_TRADE_SIZE=1
MAX_SESSION_NOTIONAL=20
ORDER_TYPE=FOK
USE_WEBSOCKET=falseUSE_WEBSOCKET=true
USE_USER_CHANNEL=false
WS_ASSET_IDS=0xTokenId1,0xTokenId2USE_WEBSOCKET=true
USE_USER_CHANNEL=false
WS_ASSET_IDS=0x代币ID1,0x代币ID2ORDER_TYPE=LIMIT
SLIPPAGE_TOLERANCE=0.03ORDER_TYPE=LIMIT
SLIPPAGE_TOLERANCE=0.03TARGET_WALLETPOLL_INTERVALethersnpm ls ethersMIN_PRIORITY_FEE_GWEIMIN_MAX_FEE_GWEIgenerate-api-credsWALLET_PRIVATE_KEYSIG_TYPE=1/2PROXY_WALLET_ADDRESSORDER_TYPE=FAKLIMITSLIPPAGE_TOLERANCEMAX_SESSION_NOTIONALMAX_SESSION_NOTIONAL=0TARGET_WALLETPOLL_INTERVALethersnpm ls ethersMIN_PRIORITY_FEE_GWEIMIN_MAX_FEE_GWEIgenerate-api-credsWALLET_PRIVATE_KEYSIG_TYPE=1/2PROXY_WALLET_ADDRESSORDER_TYPE=FAKLIMITSLIPPAGE_TOLERANCEMAX_SESSION_NOTIONALMAX_SESSION_NOTIONAL=0