How to Build Risk Controls for a Polymarket Trading Bot
Description and use
A Polymarket trading bot now employs a centralized risk management engine that checks trade size, portfolio and market exposure, price deviation, liquidity, duplicate orders, open position count, cooldowns, and daily loss limits, while logging rejections.
Problem
Automated trading bots can amplify mistakes, executing the same erroneous trade repeatedly without hesitation.
Outcome
The bot now rejects unsafe trades, limits exposure, avoids duplicates, and logs reasons, reducing risk of large losses and operational errors.
Workflow
- Define maximum trade size and implement check_trade_size.
- Separate strategy sizing logic from risk limits using apply_max_size.
- Set maximum portfolio exposure and implement check_exposure.
- Set per‑market exposure limit and implement check_market_exposure.
- Define maximum price deviation and implement price_is_valid.
- Implement liquidity check with check_liquidity.
- Create unique event IDs and maintain processed_events to prevent duplicates.
- Set maximum open positions and implement can_open_position.
- Implement cooldown logic with cooldown_finished.
- Set daily loss limit and implement daily_limit_reached.
- Encapsulate all checks in a RiskEngine.approve method.
- Log rejection reasons for debugging.
- Use the same risk engine in dry‑run mode to simulate trades.
- Implement fail‑closed behavior for missing market data or API failures.
- Make all limits configurable rather than hard‑coded constants.
Evidence
A trading bot does not become safer because it is automated.
Without a risk layer, the execution system might immediately submit it.
MAX_TRADE_SIZE = 50
MAX_EXPOSURE = 500
MAX_PRICE_DEVIATION = 0.03
MIN_LIQUIDITY = 100
processed_events = set()
MAX_OPEN_POSITIONS = 10
COOLDOWN_SECONDS = 60
MAX_DAILY_LOSS = 50
class RiskEngine: ... def approve(self, trade, portfolio, market): ...
- Record date: 2026-10-04T19:56:02.278Z