What Is a Signal Engine?
A signal engine is the component of an automated trading system responsible for converting raw market data into actionable trade signals. It sits between the data layer (exchange feeds) and the execution layer (order placement) — the analytical brain of the system.
At a high level, a signal engine continuously: 1. Receives real-time price and volume data from exchange feeds 2. Maintains updated technical indicators for every tracked symbol 3. Evaluates each trading strategy against current indicator states 4. Emits a signal when a strategy's entry conditions are satisfied 5. Applies cooldown and deduplication filters to prevent excessive signalling
FerroQuant runs six independent signal engines — one each for crypto futures, crypto spot, forex, commodities, stocks, and exotic instruments — each processing its respective market's data stream.
Stage 1: Market Data Ingestion
The data pipeline starts at the exchange. FerroQuant maintains persistent WebSocket connections to Binance (for crypto) and OANDA (for forex and commodities).
For Binance, the system uses 16 WebSocket shards per market — each shard subscribing to approximately 30 symbols. This sharding is necessary because a single WebSocket connection can subscribe to at most ~200 streams, and high-frequency kline (candlestick) data across 500+ symbols would exceed that limit.
Each shard receives real-time kline updates: every 1-minute candle is streamed continuously, with updates arriving as each new trade occurs. The system buffers these updates into Parquet files (partitioned by symbol, date, and timeframe) and simultaneously forwards them to the indicator calculation layer.
For forex and commodities, OANDA's streaming API provides bid/ask tick data which is aggregated into OHLCV (open/high/low/close/volume) candles on the server side.
This dual-persistence design (Parquet for history, live stream for real-time) ensures the signal engine can backtest against the same data format it uses in live trading — eliminating a common source of backtest-to-live discrepancy.
Stage 2: Indicator Calculation
Raw OHLCV data is not directly tradeable. Signal engines transform it into technical indicators that summarise market state in actionable dimensions.
FerroQuant calculates the following indicators per symbol per timeframe:
- RSI (Relative Strength Index): 16 periods (RSI-6 through RSI-21) across 4 timeframes (15m, 1h, 4h, 1d) - MACD: standard 12/26/9 configuration - Bollinger Bands: 20-period, 2 standard deviations - EMA: multiple periods (20, 50, 100, 200) - ATR (Average True Range): 14-period, used for stop-loss calculation - VWAP (Volume-Weighted Average Price): session-based - Volume: absolute and relative (vs 20-period average)
All indicators are calculated incrementally: when a new candle closes, only the new value is computed by extending the existing series, not recalculating from scratch. This keeps latency in the single-digit millisecond range even across 500+ symbols.
Higher timeframe candles (1h, 4h, daily) are resampled from the 1-minute base data. This ensures all timeframes are always in sync and eliminates look-ahead bias from timeframe misalignment.
Stage 3: Strategy Evaluation
With fresh indicators available, the signal engine evaluates all registered strategies against current market state. Each strategy is an independent function that receives the indicator snapshot and returns either a signal or no action.
A simple example — the RSI Crossback strategy: 1. Read RSI-14 from the previous bar and the current bar for the symbol 2. Check if RSI crossed from below 30 to above 30 (bullish crossback) 3. If yes: check EMA-200 trend filter (current price must be above EMA-200) 4. If both conditions met: calculate ATR-based stop-loss (entry - 1.5 × ATR-14) 5. Calculate take-profit (entry + 2.25 × ATR-14, giving 1.5:1 reward-to-risk) 6. Emit a LONG signal with entry, stop-loss, and take-profit prices
More complex strategies like Triple Indicator Confluence require simultaneous agreement from RSI, MACD, and Bollinger Bands. The strategy evaluator runs all conditions in parallel and only emits if all pass.
FerroQuant's 165+ strategies are evaluated concurrently across all symbols using Tokio's async runtime. The total evaluation time for all strategies across 500+ symbols is under 50 milliseconds.
Stage 4: Filtering and Signal Emission
Raw strategy evaluations are passed through several filters before becoming actionable signals:
- Cooldown filter: a 30-minute cooldown per (symbol, direction) pair prevents the same signal from re-firing repeatedly during sustained conditions. Once a LONG signal fires on BTCUSDT, no further LONG signals on BTCUSDT will be emitted for 30 minutes. - Regime filter: if the macro market regime is detected as strongly bearish (e.g., Bitcoin down 15% in 24 hours with high VIX), the system suppresses long signals on correlated assets. - Kill switch: if the portfolio drawdown has exceeded the configured threshold, no new signals are emitted from any engine until the kill switch is manually cleared. - Tier filter: signals are tagged by the user tier required to receive them (some strategies are available on higher subscription tiers only).
Passing all filters, a signal is written to Redis (for real-time API delivery) and broadcast via Server-Sent Events to connected dashboard clients. High-tier users also receive Telegram notifications.
The entire pipeline — from exchange WebSocket message to dashboard signal delivery — completes in under 150 milliseconds. This latency is sufficient for the hourly-timeframe strategies FerroQuant targets; sub-millisecond latency is only required for high-frequency strategies, which operate on a fundamentally different infrastructure.