9a89efb071
No cut-loss needed: worst case is losing buy cost (2c/share) which resolves on-chain. If on winning side, payout is $1/share. Removed marketSell, cutLossSells, and makerCutLossTime config. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
197 lines
9.2 KiB
Bash
197 lines
9.2 KiB
Bash
# ─────────────────────────────────────────────
|
||
# WALLET SETUP
|
||
# ─────────────────────────────────────────────
|
||
# EOA private key — used for SIGNING only, does NOT hold USDC
|
||
PRIVATE_KEY=0xYOUR_EOA_PRIVATE_KEY_HERE
|
||
|
||
# Polymarket Proxy Wallet — the address shown when you click "Deposit" on Polymarket
|
||
# This is where you deposit USDC.e, and where trades are funded from
|
||
# How to find: Login to polymarket.com → Profile → Deposit → copy the address
|
||
PROXY_WALLET_ADDRESS=0xYOUR_PROXY_WALLET_ADDRESS_HERE
|
||
|
||
# ─────────────────────────────────────────────
|
||
# POLYGON RPC
|
||
# ─────────────────────────────────────────────
|
||
POLYGON_RPC_URL=https://polygon.lava.build
|
||
|
||
# ─────────────────────────────────────────────
|
||
# POLYMARKET API CREDENTIALS (optional)
|
||
# Leave blank to auto-derive from your private key
|
||
# ─────────────────────────────────────────────
|
||
CLOB_API_KEY=
|
||
CLOB_API_SECRET=
|
||
CLOB_API_PASSPHRASE=
|
||
|
||
# ─────────────────────────────────────────────
|
||
# TRADER TO COPY
|
||
# Use the proxy wallet address of the trader (visible on their Polymarket profile)
|
||
# ─────────────────────────────────────────────
|
||
TRADER_ADDRESS=0xTRADER_PROXY_WALLET_ADDRESS
|
||
|
||
# ─────────────────────────────────────────────
|
||
# TRADE SIZING
|
||
# ─────────────────────────────────────────────
|
||
# SIZE_MODE:
|
||
# "percentage" = SIZE_PERCENT% of MAX_POSITION_SIZE per market entry
|
||
# (e.g. MAX_POSITION_SIZE=$10, SIZE_PERCENT=50 → buy $5 per entry)
|
||
# "balance" = SIZE_PERCENT% of your current USDC.e balance per entry
|
||
# (e.g. balance=$100, SIZE_PERCENT=10 → buy $10 per entry)
|
||
# Note: sizing is independent of the trader's individual fill size.
|
||
# Limit orders can fill in many small chunks — we always use our own sizing.
|
||
SIZE_MODE=balance
|
||
SIZE_PERCENT=10
|
||
|
||
# Minimum trade size in USDC (skip if calculated size is below this)
|
||
MIN_TRADE_SIZE=1
|
||
|
||
# Maximum total position per market in USDC (won't buy more once this is reached)
|
||
MAX_POSITION_SIZE=10
|
||
|
||
# ─────────────────────────────────────────────
|
||
# AUTO SELL
|
||
# ─────────────────────────────────────────────
|
||
AUTO_SELL_ENABLED=true
|
||
AUTO_SELL_PROFIT_PERCENT=10
|
||
|
||
# Sell mode when copying trader's sell
|
||
# "market" = sell at market price immediately
|
||
# "limit" = place limit order at trader's sell price
|
||
SELL_MODE=market
|
||
|
||
# ─────────────────────────────────────────────
|
||
# INTERVALS
|
||
# ─────────────────────────────────────────────
|
||
# How often (seconds) to check for resolved markets to redeem
|
||
REDEEM_INTERVAL=60
|
||
|
||
# Skip BUY if the market closes within this many seconds from now
|
||
# Default 300 = skip if market ends in less than 5 minutes
|
||
MIN_MARKET_TIME_LEFT=300
|
||
|
||
# When FAK finds no liquidity (e.g. copying into "next market" before it opens),
|
||
# fall back to a GTC limit order and wait this many seconds for it to fill.
|
||
# Set to 0 to disable the GTC fallback entirely.
|
||
GTC_FALLBACK_TIMEOUT=60
|
||
|
||
# ─────────────────────────────────────────────
|
||
# DRY RUN (set true to simulate without real trades)
|
||
# ─────────────────────────────────────────────
|
||
DRY_RUN=true
|
||
|
||
# ─────────────────────────────────────────────
|
||
# MARKET MAKER (mm.js / npm run mm-sim)
|
||
# ─────────────────────────────────────────────
|
||
# Comma-separated assets to market-make (same slug format as sniper)
|
||
MM_ASSETS=btc
|
||
|
||
# Market duration: "5m" (5-minute) or "15m" (15-minute)
|
||
MM_DURATION=5m
|
||
|
||
# USDC amount per side (total exposure = 2x this)
|
||
MM_TRADE_SIZE=5
|
||
|
||
# Limit sell price target (e.g. 0.60 = sell at $0.60)
|
||
MM_SELL_PRICE=0.60
|
||
|
||
# Seconds before market close to trigger cut-loss
|
||
MM_CUT_LOSS_TIME=60
|
||
|
||
# Keyword to match market question (case-insensitive)
|
||
MM_MARKET_KEYWORD=Bitcoin Up or Down
|
||
|
||
# Max seconds after market open to enter (0 = at open only)
|
||
MM_ENTRY_WINDOW=45
|
||
|
||
# How often to poll for new markets (seconds)
|
||
MM_POLL_INTERVAL=10
|
||
|
||
# ── Recovery Buy (after cut-loss) ───────────────────────────
|
||
# After cut-loss triggers, monitor prices for 10s and market-buy
|
||
# the dominant side if criteria are met. Does not affect the main
|
||
# MM flow — purely an opt-in add-on.
|
||
#
|
||
# Enable recovery buy
|
||
MM_RECOVERY_BUY=false
|
||
|
||
# Minimum price the dominant side must be at (and rising/stable) to qualify
|
||
MM_RECOVERY_THRESHOLD=0.70
|
||
|
||
# USDC size for the recovery buy (0 = use MM_TRADE_SIZE)
|
||
MM_RECOVERY_SIZE=0
|
||
|
||
# Enable adaptive CL when one leg fills (true = patient limit orders, false = immediate market sell)
|
||
MM_ADAPTIVE_CL=true
|
||
|
||
# Minimum combined sell price (both legs) required to place a limit order.
|
||
# Formula: filledLegPrice + unfilledLegPrice >= MM_ADAPTIVE_MIN_COMBINED
|
||
# Example: filledLeg=0.60, MM_ADAPTIVE_MIN_COMBINED=1.20 → floor=0.60 (won't limit-sell below $0.60)
|
||
# filledLeg=0.55, MM_ADAPTIVE_MIN_COMBINED=1.20 → floor=0.65
|
||
# If price is below floor, bot waits for recovery. Market-sell only at CL time as last resort.
|
||
MM_ADAPTIVE_MIN_COMBINED=1.20
|
||
|
||
# Poll interval (seconds) for the adaptive CL loop after one leg fills.
|
||
# Smaller = more responsive to price changes, more API calls.
|
||
MM_ADAPTIVE_MONITOR_SEC=5
|
||
|
||
# ─────────────────────────────────────────────
|
||
# ORDERBOOK SNIPER (sniper.js / npm run sniper-sim)
|
||
# 3-Tier Strategy: Places GTC BUY orders at 3 prices with weighted sizing
|
||
# Tier 1 (3c): smallest size | Tier 2 (2c): medium | Tier 3 (1c): largest
|
||
# Catches panic dumps at multiple price levels with optimal capital allocation
|
||
# ─────────────────────────────────────────────
|
||
# Comma-separated assets to snipe
|
||
SNIPER_ASSETS=eth,sol,xrp
|
||
|
||
# 3-Tier pricing (high to low)
|
||
SNIPER_TIER1_PRICE=0.03 # Highest price, smallest allocation (20%)
|
||
SNIPER_TIER2_PRICE=0.02 # Mid price, medium allocation (30%)
|
||
SNIPER_TIER3_PRICE=0.01 # Lowest price, largest allocation (50%)
|
||
|
||
# Max total shares per side (min 5 shares per tier)
|
||
# Example: 15 shares → 3@3c + 5@2c + 7@1c
|
||
# Example: 30 shares → 6@3c + 9@2c + 15@1c
|
||
SNIPER_MAX_SHARES=15
|
||
|
||
# ── Sniper Session Schedule (all times UTC+8) ──────────────
|
||
# Format: HH:MM-HH:MM,HH:MM-HH:MM (comma-separated sessions)
|
||
# Assets without a schedule entry are always active.
|
||
SNIPER_SCHEDULE_BTC=19:40-22:40,03:40-06:10
|
||
SNIPER_SCHEDULE_ETH=11:40-15:40,16:40-19:40
|
||
SNIPER_SCHEDULE_SOL=09:40-12:40,21:40-23:40
|
||
SNIPER_SCHEDULE_XRP=18:40-20:40,08:40-09:50
|
||
|
||
# ─────────────────────────────────────────────
|
||
# MARKET MAKER v2 (maker.js / npm run maker-sim)
|
||
# Buy Low, Sell High — no splitPosition.
|
||
# Places limit BUY on UP+DOWN at low price, sells at target when filled.
|
||
# Only one side will fill — the other gets cancelled.
|
||
# ─────────────────────────────────────────────
|
||
# Comma-separated assets
|
||
MAKER_ASSETS=btc
|
||
|
||
# Market duration: "5m" or "15m"
|
||
MAKER_DURATION=5m
|
||
|
||
# Limit BUY price (e.g. 0.02 = 2 cents per share)
|
||
MAKER_BUY_PRICE=0.02
|
||
|
||
# Limit SELL price (e.g. 0.03 = 3 cents per share)
|
||
MAKER_SELL_PRICE=0.03
|
||
|
||
# Shares per side (e.g. 50 shares × 0.02 = $1.00 cost per side)
|
||
MAKER_TRADE_SIZE=50
|
||
|
||
# How often to poll for new markets (seconds)
|
||
MAKER_POLL_INTERVAL=10
|
||
|
||
# How fast to check order fill status (milliseconds)
|
||
MAKER_MONITOR_MS=2000
|
||
|
||
# ─────────────────────────────────────────────
|
||
# PROXY (Polymarket API only, NOT Polygon RPC)
|
||
# Supports HTTP/HTTPS/SOCKS5 proxies
|
||
# Leave empty to connect directly (no proxy)
|
||
# Example: http://user:pass@proxy.example.com:8080
|
||
# ─────────────────────────────────────────────
|
||
PROXY_URL=
|