Layers that preserve identity, even when markets change.
Dovest separates signal, filtration, risk, and execution into independent layers so the engine behaves predictably as markets, liquidity, and scale change. Each layer has a narrow mandate, clear constraints, and explicit hooks for governance and monitoring.
System Stack Overview
Encodes how the engine reads orderflow, volatility identities, and market structure. Signals never size or execute — they only label opportunity and regime.
Gating logic that decides whether the engine is allowed to trade at all, based on environment, liquidity, and stress conditions.
Position sizing, portfolio constraints, and drawdown guards. This layer encodes allocator rules, not trader intuition.
Order routing, slicing, and intraday exits. Keeps implementation risk bounded across venues and liquidity regimes.
Signals are designed to describe what the market is doing — not to forecast exact outcomes. They label structure (trend, mean-reversion, flush), volatility regimes, and liquidity conditions, so other layers can make constrained decisions.
Structure & regime labels
Classifies sessions into stable, trending, reversal, or hostile states, using auction and volatility features rather than raw price moves.
Safe universes
Pre-filtered baskets of symbols that pass long-horizon quality, liquidity, and gap-risk requirements before any intraday decision is made.
Shock detectors
Metrics tracking intraday deviation, wide-day behaviour, and depth changes so downstream layers know when assumptions are breaking.
Filtration takes the output of the signal layer and decides whether the engine is even allowed to open risk. It encodes hard environmental constraints so that entries are only considered inside safe regimes.
Safe vs hostile sessions
Blocks participation when spreads, depth, or volatility push the engine outside its validated profile.
Liquidity floors
Minimum depth, turnover, and stability requirements per venue before any order is permitted.
Assumption checks
Forces re-validation when behaviour drifts from the training environment, rather than silently extrapolating.
The risk layer converts approved opportunities into position sizes, portfolio weights, and drawdown responses. It is where allocator-specific rules and capital budgets are implemented.
SafeEntry position sizing
Entry size derived from worst-case intraday behaviour, depth, and stop-distance — not from conviction.
Portfolio constraints
Limits per symbol, sector, and regime so capital is never concentrated in a single failure mode.
Drawdown bands & halts
Pre-defined responses when system or book-level drawdown passes agreed thresholds.
Execution handles how orders are placed, routed, and exited across venues. It is optimised for robustness, traceability, and stable behaviour, not for clever micro-alpha.
Order templates
Standardised order types and routing rules per venue, tuned to the engine’s holding period and depth assumptions.
Kill-switches & throttles
Rate limits, venue-level halts, and sanity checks to prevent runaway execution during feed or broker incidents.
Execution logs
Full audit trail of intent vs fill, including slippage attribution and latency metrics.
SafeEntry engine across the stack
SafeEntry is the way the system turns falling prices and wide-day behaviour into controlled entries, without ever violating the risk envelope.
- Signal: detects deep flush patterns and wide-day behaviour within safe universes.
- Filtration: blocks entries when depth, gaps, or volatility exceed validated bands.
- Risk: sizes positions from worst-case intraday behaviour, not recent returns.
- Execution: stages entries so fills remain inside the validated spread and depth profile.
Allocator control points
Allocators can attach their own constraints without rewriting the engine:
- Capital budgets and max gross/net exposure per mandate.
- Additional exclusion lists (sectors, tickers, venues).
- Custom drawdown bands and recovery rules.
- Reporting hooks into existing risk and compliance systems.