ClientRisk

Implements IRisk

ClientRisk implementation for portfolio-level risk management.

Provides risk checking logic to prevent signals that violate configured limits:

  • Maximum concurrent positions (tracks across all strategies)
  • Custom validations with access to all active positions

Multiple ClientStrategy instances share the same ClientRisk instance, allowing cross-strategy risk analysis.

Used internally by strategy execution to validate signals before opening positions.

constructor(params: IRiskParams);
params: IRiskParams
_activePositions: RiskMap | unique symbol

Map of active positions tracked across all strategies. Key: ${strategyName}:${exchangeName}:${symbol} Starts as POSITION_NEED_FETCH symbol, gets initialized on first use.

waitForInit: any

Initializes active positions by loading from persistence. Uses singleshot pattern to ensure initialization happens exactly once. Skips persistence in backtest mode.

_updatePositions: any

Persists current active positions to disk.

checkSignal: (params: IRiskCheckArgs) => Promise<boolean>

Checks if a signal should be allowed based on risk limits.

Executes custom validations with access to:

  • Passthrough params from ClientStrategy (symbol, strategyName, exchangeName, currentPrice, timestamp)
  • Active positions via this.activePositions getter

Returns false immediately if any validation throws error. Triggers callbacks (onRejected, onAllowed) based on result.

addSignal(symbol: string, context: {
strategyName: string;
riskName: string;
}): Promise<void>;

Registers a new opened signal. Called by StrategyConnectionService after signal is opened.

removeSignal(symbol: string, context: {
strategyName: string;
riskName: string;
}): Promise<void>;

Removes a closed signal. Called by StrategyConnectionService when signal is closed.