336 lines
20 KiB
Bash
336 lines
20 KiB
Bash
# ============================================================
|
||
# 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 |