| Coin | TTL | Method | Dir | W/L | Win% | EV/$1 | Policy | Status |
|---|---|---|---|---|---|---|---|---|
| Loading analytics... | ||||||||
This is a crypto prediction market trading system that trades on Polymarket's 15-minute Up/Down markets.
The Edge: We predict whether BTC, ETH, SOL, or XRP will be higher or lower in 15 minutes using volume-weighted momentum analysis from Binance real-time data.
How It Works:
Architecture:
Polymarket runs continuous 15-minute prediction markets for 4 cryptocurrencies:
Market Timing:
How Betting Works:
Our primary trading signal uses volume-weighted momentum calculated from real-time Binance data.
vw_momentum = ฮฃ(price_change ร volume) / total_volume
How It's Calculated:
change = close - prev_closeweighted = change ร volumeWhy Volume-Weighted?
A price move on high volume is more significant than one on low volume. If BTC drops $50 on 1000 BTC volume vs $50 on 10 BTC volume, the high-volume move is more meaningful.
Signal Generation:
The system runs two parallel trading modes:
Trading Flow:
Settings:
trading_paused = true โ Only paper tradestrading_paused = false โ Real trades (if coins available)Lucky Coins are a risk management mechanism that gates real-money trading.
How Coins Work:
Why This System?
Harm reduction: losses deplete coins, forcing you to pause and evaluate. Wins maintain your coin balance, allowing continued trading. Losing streaks naturally slow down trading to protect capital.
Managing Coins:
The header contains three toggle switches that modify trading behavior:
Database Settings:
Main trading view. Shows momentum signals for all 4 cryptos, current markets, and trading activity.
Weather markets and special opportunities. Shows high-edge situations across all market categories.
Real trade history. Shows all executed trades, their outcomes, P/L, and redemption status.
Wallet balances, USDC holdings, and funding information for the trading wallet.
You are here! Complete system documentation.
Paper trading results. Shows hypothetical trades, win rate, and strategy validation stats.
Strategy notes, experiments, hypotheses, and learnings from trading.
Server Access:
Service Management:
API Endpoints:
Database Operations:
The system uses 5 different analysis methods to predict price direction. Each trade records all predictions for backtesting.
Combines all signals into a single recommendation. Uses EMA crossovers, momentum strength, range detection, and multi-timeframe confirmation. Returns direction, confidence (0-1), and signal_type.
Volume-weighted price momentum over last 15 candles. Positive = bullish, negative = bearish. Higher absolute value = stronger signal.
Exponential Moving Average crossover. EMA-9 crossing above EMA-21 = bullish, below = bearish. Classic trend-following indicator.
Short-term momentum over the last 1 minute. Captures immediate price action and micro-trends.
Medium-term momentum over the last 5 minutes. More stable than 1-min, captures sustained moves.
The Full Analyzer categorizes signals into 5 types based on how the direction was determined:
Confidence Scores:
weak_signal showed 71% win rate while vw_momentum alone was 37%. The full analyzer consistently outperforms single indicators.
Every trade goes through a 6-stage lifecycle from signal to settlement:
Binance WebSocket โ Calculate VW momentum โ Generate UP/DOWN signal
Query Polymarket API โ Find active 15-min market โ Match signal to market
Check Lucky Coins โ Build CLOB order โ Sign with wallet โ Submit to Polymarket
CLOB matches order โ USDC deducted โ CTF tokens (YES/NO) received
Market ends โ Oracle reports price โ Outcome determined โ Trade marked won/lost
Winning tokens โ Redeem on CTF contract โ USDC returned to wallet
On-Chain Components:
Common issues and their solutions:
Cause: Market discovery failing due to API timeout or Cloudflare blocking.
Fix: Check polymarket.py uses httpx with browser headers. Test with:
Cause: API returning oldest trades instead of newest.
Fix: Check /api/polymarket/ledger returns trades[:20] not trades[-20:].
Cause: Dashboard's auto-trade function not checking pause flag.
Fix: Verify _check_momentum_auto_trade() checks trading_paused at top. Set lucky_coins=0 as emergency stop.
Cause: Market ID stored instead of bytes32 conditionId.
Fix: Fetch real conditionId from Gamma API:
Cause: Old process holding port 8080.
Fix: Kill the zombie process:
Cause: Scanner using simplified VW direction instead of full analyzer.
Fix: Check scanner_worker.py Market Worker reads signal_* settings from DB instead of calculating its own.
Emergency Commands:
journalctl -u polymarket -f and journalctl -u polymarket-scanner -f
Loading...