# ============================================================ # Polymarket Copy Trader - 配置文件 # ============================================================ # 复制: cp .env.example .env # 必填项: TELEGRAM_BOT_TOKEN + TELEGRAM_CHAT_ID # 修改后需重启机器人才能生效 # ============================================================ # ╔══════════════════════════════════════════════════════════════╗ # ║ 资金与仓位 ║ # ╚══════════════════════════════════════════════════════════════╝ # 初始本金(美元),用于 Kelly 公式计算建议仓位 # 调大 → 建议仓位更大;调小 → 建议仓位更保守 INITIAL_CAPITAL_USD=10000 # 单笔最大仓位比例(占本金百分比) # 0.05 = 5%,即单笔最多 $500(本金 $10000 时) # 调大 → 允许更重的单笔仓位;调小 → 更分散 MAX_POSITION_PCT=0.05 # Kelly 分数系数(0~1),用于降低 Kelly 公式的激进程度 # 0.5 = 半凯利(推荐),1.0 = 全凯利(激进),0.25 = 四分之一凯利(保守) # 调大 → 仓位更大但风险更高;调小 → 更保守 KELLY_FRACTION=0.5 # ╔══════════════════════════════════════════════════════════════╗ # ║ 价格防护 ║ # ╚══════════════════════════════════════════════════════════════╝ # 允许跟单的最低 / 最高价格 # 极端价格(<0.10 或 >0.90)通常是噪音或信息已充分定价,赔率极差 # 调大范围 → 接收更多信号但质量可能下降;收窄范围 → 只跟踪中等赔率市场 MIN_PRICE=0.10 MAX_PRICE=0.90 # ╔══════════════════════════════════════════════════════════════╗ # ║ 交易规则 ║ # ╚══════════════════════════════════════════════════════════════╝ # 被监控钱包的单笔最低交易金额(美元),低于此值被忽略 # 调大 → 过滤小额噪音,信号更少但更可靠;调小 → 更多信号但可能包含噪音 MIN_TRADE_SIZE_USD=500 # 信号产生后的模拟执行延迟(秒),实盘时有用 EXECUTION_DELAY_SECONDS=5 # 是否启用实盘交易(true=实盘下单,false=仅记录信号不执行) # 设为 true 前必须填写下方的 POLY_API_KEY 等 CLOB 凭证 ENABLE_EXECUTION=false # ╔══════════════════════════════════════════════════════════════╗ # ║ 钱包池(目标钱包筛选) ║ # ╚══════════════════════════════════════════════════════════════╝ # 钱包池上限(最多跟踪多少个钱包) # 实际数量取决于多少钱包通过下方三道过滤门槛,不足则全取 # 调大 → 池子更大,共识信号可能更多;调小 → 更聚焦 WALLET_POOL_SIZE=100 # ═══════════════════════════════════════════════════════════════ # 以下三个过滤条件共用一个时间窗口:WALLET_PNL_WINDOW_DAYS # ═══════════════════════════════════════════════════════════════ # 钱包最低总盈亏(美元)— 窗口内的现金盈亏 + 已平仓盈亏 # 现金盈亏 = 当前持仓 cashPnl;已平仓盈亏 = /closed-positions 按 timestamp 过滤 # 调大 → 只要高盈利钱包;调小 → 扩大池子,可能混入不稳定钱包 WALLET_PNL_MIN_USD=5000 # 钱包最少交易笔数 — /trades 接口,按 transactionHash 去重,仅统计窗口内 # 调大 → 只要经验丰富的钱包;调小 → 扩大池子,包含新手钱包 WALLET_MIN_TRADES=30 # 钱包最少覆盖品类数 — /trades + /positions 的 eventSlug 合并去重,仅统计窗口内 # 调大 → 只要多元化钱包;调小 → 扩大池子,包含专注单一品类的钱包 WALLET_MIN_CATEGORIES=3 # 时间窗口(天),以上三个过滤条件共用此窗口 # 默认 90 天(从 30 天改为 90 天以降低幸存者偏差 — 只看 30 天会过度偏向 # 近期运气好的钱包,而 90 天能过滤掉短期波动,识别真正稳定的盈利者) # 调大 → 数据量更大,门槛变低,更多钱包通过;调小 → 只看近期,更严格 WALLET_PNL_WINDOW_DAYS=90 # /closed-positions 分页上限(每页 50 条,20 页 = 1000 条) # 超活跃钱包在 90 天窗口内可能产生 500+ 平仓记录,上限太低会截断 PnL # 贝叶斯更新阶段自动用 3 倍此值(只处理池内 ~100 钱包,可承受更多 API 调用) # 调大 → PnL 更准确但 API 调用更多;调小 → 更快但可能低估活跃钱包的 PnL CLOSED_POSITIONS_MAX_PAGES=20 # 钱包池刷新间隔(小时),到期后重新扫描市场 + 重新评估钱包 # 调小 → 更频繁刷新,钱包池更新更快但 API 调用更多 # 调大 → 减少 API 压力,但可能错过新晋优质钱包 WALLET_REFRESH_HOURS=24 # ╔══════════════════════════════════════════════════════════════╗ # ║ 贝叶斯信誉分先验参数 ║ # ╚══════════════════════════════════════════════════════════════╝ # 新钱包的初始信誉分(0~1),0.5 表示"不确定其能力" # 调大 → 对新钱包更信任,信号更容易触发;调小 → 对新钱包更谨慎 BAYESIAN_PRIOR_SKILL=0.5 # 历史表现衰减窗口(天),通过 /closed-positions 的 timestamp 字段过滤 # 只统计此窗口内的平仓盈亏来更新信誉分,超出窗口的平仓记录被忽略 # 调大 → 历史数据保留更久;调小 → 更看重近期表现 BAYESIAN_DECAY_DAYS=14 # 贝叶斯更新步长(0~1),控制单次信誉分变化幅度 # 0.05 = 每次最多调整 5%,比较保守;0.1 = 更激进 # 调大 → 信誉分变化更快但可能过度反应;调小 → 更平稳但适应慢 BAYESIAN_STEP=0.05 # ╔══════════════════════════════════════════════════════════════╗ # ║ Telegram 通知 ║ # ╚══════════════════════════════════════════════════════════════╝ # 是否开启 Telegram 信号推送 TELEGRAM_ENABLED=false # Telegram Bot Token(从 @BotFather 获取) TELEGRAM_BOT_TOKEN= # Telegram 接收消息的 Chat ID(用户或群组 ID) TELEGRAM_CHAT_ID= # ╔══════════════════════════════════════════════════════════════╗ # ║ Polymarket CLOB 实盘凭证(启用实盘时必填) ║ # ╚══════════════════════════════════════════════════════════════╝ # Polymarket API Key(从 polymarket.com/settings/api 获取) POLY_API_KEY= # Polymarket API Secret POLY_API_SECRET= # Polymarket API Passphrase POLY_API_PASSPHRASE= # 钱包私钥(用于链上签名下单) POLY_WALLET_PRIVATE_KEY= # ╔══════════════════════════════════════════════════════════════╗ # ║ HTTP / 代理(按需配置) ║ # ╚══════════════════════════════════════════════════════════════╝ # HTTP 代理地址,用于访问 Polymarket API(国内网络可能需要) # 格式: http://127.0.0.1:7890(Clash/V2Ray 等代理) # 留空则直连,不经过代理 HTTP_PROXY= # ╔══════════════════════════════════════════════════════════════╗ # ║ 数据源轮询参数 ║ # ╚══════════════════════════════════════════════════════════════╝ # 轮询间隔(秒),每隔多久拉取一次所有钱包的最新交易 # 调小 → 更及时但 API 调用更多(注意频率限制);调大 → 省 API 但可能延迟 USER_POLL_INTERVAL_SECONDS=30 # 预热时长(秒),启动后跳过历史交易的时间窗口 # 避免机器人把启动前的旧交易当作"新交易"来跟单 # 调大 → 更安全地跳过热启动历史;调小 → 更快开始工作 STREAM_WARMUP_SECONDS=30 # 每个钱包每次拉取的最大交易记录数 # 预热期间会用这笔数建立"已见过"的基准线 # 调大 → 基准线更长,预热更慢;调小 → 更快但可能漏掉部分历史 STREAM_MAX_TRADES_PER_WALLET=20 # 是否开启详细轮询日志(每轮都打印 poll 信息) # true → 每 30s 输出一次 poll 统计;false → 每 10 轮才输出一次 STREAM_VERBOSE_LOGGING=false # 单个钱包 /activity 轮询超时(秒) # /activity 比 /positions 更重(返回完整交易历史),需要更长超时 # 如果太短,活跃钱包会全部超时 → _last_seen 永远为空 → 无信号 STREAM_POLL_TIMEOUT=15 # ╔══════════════════════════════════════════════════════════════╗ # ║ 共识信号参数 ║ # ╚══════════════════════════════════════════════════════════════╝ # 共识时间窗口(秒),在此窗口内多个钱包的同方向交易才算"共识" # 调大 → 更容易形成共识但信号可能滞后;调小 → 信号更及时但共识更难达成 CONSENSUS_WINDOW_SECONDS=600 # 最少共识钱包数,至少 N 个钱包同方向交易才触发信号 # 调大 → 信号更可靠但数量更少;调小 → 信号更多但可能包含噪音 CONSENSUS_MIN_WALLETS=2 # 共识强度阈值,买入强度 - 卖出强度 必须 ≥ 此值才触发 # 强度 = 各钱包信誉分之和,0.4 约等于 1 个 0.4 分钱包或 2 个 0.2 分钱包 # 调大 → 信号更确定但更难触发;调小 → 更容易触发信号 CONSENSUS_STRENGTH_THRESHOLD=0.4 # 钱包防抖(秒),同一钱包在同一市场 N 秒内只处理一次交易 # 防止同一钱包短时间内多次交易产生重复信号 # 调大 → 防抖更严格;调小 → 更敏感但可能重复 WALLET_DEBOUNCE_SECONDS=600 # 最低信誉分,信誉分低于此值的钱包被忽略 # 0~1,0.3 是比较宽松的阈值 # 调大 → 只跟高信誉钱包;调小 → 更包容但可能跟踪表现差的钱包 MIN_CREDIBILITY=0.3 # 信誉分更新间隔(分钟),贝叶斯算法根据最新表现重新计算钱包信誉 # 调小 → 信誉分变化更频繁;调大 → 更新更平稳 CREDIBILITY_UPDATE_MINUTES=60 # ╔══════════════════════════════════════════════════════════════╗ # ║ 信号过滤(策略修复) ║ # ╚══════════════════════════════════════════════════════════════╝ # 仅发 BUY 信号。SELL 在 Polymarket = 卖出已持有的 token(非做空), # 无持仓跟踪无法跟单 SELL,仅记录为反向指标 # true → 只跟 BUY(推荐);false → 也跟 SELL 信号 BUY_ONLY_SIGNALS=true # 同市场信号冷却(秒)— 同一 condition_id 发出信号后 N 秒内不再重复 # 86400 = 1 天,防止同一市场短时间内反复发信号 # 调大 → 更保守,一天最多一个信号/市场;调小 → 更频繁 SIGNAL_COOLDOWN_SECONDS=86400 # 跳过距结算不足 N 小时的市场(流动性薄 + 结算风险高) # 24 = 跳过 24 小时内结算的市场 # 调大 → 更安全但可跟的市场更少;调小 → 接受更高结算风险 MIN_HOURS_TO_RESOLUTION=24 # ╔══════════════════════════════════════════════════════════════╗ # ║ 钱包池过滤(策略修复) ║ # ╚══════════════════════════════════════════════════════════════╝ # 排除做市商(同一 conditionId 持有 Yes+No 双边持仓的钱包) # 做市商的交易不是方向性的,跟单无意义 # true → 排除双边持仓 >10% 的钱包;false → 不排除 EXCLUDE_MARKET_MAKERS=true # 未实现 cashPnl 折扣(0.0~1.0) # Polymarket 中间价常高估实际可成交价(薄流动性 + bid-ask spread) # 0.5 = 只计一半未实现盈亏;1.0 = 全额计入;0.0 = 完全忽略未实现盈亏 CASH_PNL_DISCOUNT=0.5 # ╔══════════════════════════════════════════════════════════════╗ # ║ Kelly 仓位管理(策略修复) ║ # ╚══════════════════════════════════════════════════════════════╝ # 历史已 resolve 的信号不足 N 条时,不用 Kelly 公式,改用保守固定仓位 # 防止数据不足时 Kelly 公式产生不可靠的仓位建议 # 调大 → Kelly 更晚启用,前期更保守;调小 → Kelly 更早启用但可能不准 KELLY_MIN_SAMPLES=50 # Kelly 数据不足时的保守固定仓位比例(占本金百分比) # 0.01 = 1%,即 $100 本金时每次下 $1 # 调大 → 前期仓位更大;调小 → 更保守 KELLY_FALLBACK_FRACTION=0.01 # ╔══════════════════════════════════════════════════════════════╗ # ║ 风控熔断(策略修复) ║ # ╚══════════════════════════════════════════════════════════════╝ # 信号发出前会检查三道风控闸门:日亏损 / 连续亏损 / 最大持仓 # 任一闸门触发都会阻止新信号产生 # 日亏损上限(美元)— 24h 内已实现亏损超过此值则暂停发信号 # 调大 → 容忍更大日内亏损;调小 → 更快止损 MAX_DAILY_LOSS_USD=500 # 连续亏损次数上限 — 连续 N 次信号亏损则暂停 # 调大 → 容忍更长连亏;调小 → 更快暂停 MAX_CONSECUTIVE_LOSSES=5 # 熔断暂停时长(分钟)— 闸门触发后暂停 N 分钟 # 调大 → 暂停更久,给市场更多时间恢复;调小 → 更快恢复 RISK_PAUSE_MINUTES=60 # 最大同时持仓数 — 未 resolve 的信号数超过此值则不发新信号 # 调大 → 允许更多并行持仓;调小 → 更集中 MAX_OPEN_POSITIONS=10 # ╔══════════════════════════════════════════════════════════════╗ # ║ 信号结果回填(策略分析) ║ # ╚══════════════════════════════════════════════════════════════╝ # 信号发出后,市场结算的结果会被自动回填到 copy_signals 表 # 数据用于 /analytics 看板的命中率与 PnL 聚合统计 # 回填循环间隔(分钟),每 N 分钟扫描一次未回填的信号 # 调小 → 更及时回填新结果但 API 调用更多;调大 → 更省 API OUTCOME_RESOLVE_MINUTES=15 # 每批扫描的最大信号数(防止一次性打太多 API) # 调大 → 单次回填更快但可能集中触发限流;调小 → 更温和 OUTCOME_RESOLVE_BATCH_SIZE=50 # 单次 /markets 请求超时(秒) OUTCOME_RESOLVE_TIMEOUT=5.0 # ╔══════════════════════════════════════════════════════════════╗ # ║ 调试日志 ║ # ╚══════════════════════════════════════════════════════════════╝ # 是否打印 API 返回的原始交易数据(true=会输出大量日志,仅调试时用) DEBUG_LOG_API_PAYLOADS=false # ╔══════════════════════════════════════════════════════════════╗ # ║ 数据库 ║ # ╚══════════════════════════════════════════════════════════════╝ # SQLite 数据库文件路径(相对项目根目录) # 删除此文件即可清空所有数据,重新冷启动 DB_PATH=data/copytrader.db # ╔══════════════════════════════════════════════════════════════╗ # ║ 日志级别 ║ # ╚══════════════════════════════════════════════════════════════╝ # 日志级别: DEBUG / INFO / WARNING / ERROR # DEBUG → 输出所有调试信息(包括每笔交易过滤详情) # INFO → 正常运行时推荐(信号、轮询统计、心跳等) # WARNING → 仅警告和错误 LOG_LEVEL=INFO