refactor: rewire all service build.rs to proto/ root directory

Delete per-service proto/ directories. All 7 services now compile
from the single canonical proto/ at workspace root.

- trading_service: 5 protos + ml_training client -> ../../proto/
- ml_training_service: ml_training server + fxt_trading client -> ../../proto/
- broker_gateway_service: broker_gateway -> ../../proto/
- trading_agent_service: trading_agent + ml client -> ../../proto/
- data_acquisition_service: data_acquisition -> ../../proto/
- api_gateway: 8 proto compilations -> ../../proto/
- monitoring_service: keeps local proto (3 training RPCs only, deleted in Task 5)

Added proto/fxt_trading.proto (fat-client proto, package foxhunt.tli)
separate from proto/trading.proto (backend, package trading) since the
API gateway needs both for protocol translation.

Added unimplemented stubs for merged monitoring.proto RPCs:
- trading_service: 3 training RPCs (served by monitoring_service)
- api_gateway monitoring_proxy: 13 system health RPCs (Task 4)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
jgrusewski
2026-03-03 20:34:09 +01:00
parent ed1ab8ed88
commit b70c6a0bd7
20 changed files with 1166 additions and 3617 deletions

895
proto/fxt_trading.proto Normal file
View File

@@ -0,0 +1,895 @@
syntax = "proto3";
package foxhunt.tli;
// TLI Trading Service provides a unified client interface for all HFT trading operations.
// This service integrates trading, risk management, monitoring, and configuration capabilities
// into a single comprehensive API for the Terminal Line Interface (TLI) client application.
service TradingService {
// Core Trading Operations
// Submit a new trading order with validation
rpc SubmitOrder(SubmitOrderRequest) returns (SubmitOrderResponse);
// Cancel an existing order by ID
rpc CancelOrder(CancelOrderRequest) returns (CancelOrderResponse);
// Get current status of a specific order
rpc GetOrderStatus(GetOrderStatusRequest) returns (GetOrderStatusResponse);
// Get account information and balances
rpc GetAccountInfo(GetAccountInfoRequest) returns (GetAccountInfoResponse);
// Get current portfolio positions
rpc GetPositions(GetPositionsRequest) returns (GetPositionsResponse);
// Subscribe to real-time market data feeds
rpc SubscribeMarketData(SubscribeMarketDataRequest) returns (stream MarketDataEvent);
// Subscribe to real-time order status updates
rpc SubscribeOrderUpdates(SubscribeOrderUpdatesRequest) returns (stream OrderUpdateEvent);
// Integrated Risk Management
// Calculate portfolio Value at Risk (VaR)
rpc GetVaR(GetVaRRequest) returns (GetVaRResponse);
// Analyze position-level risk exposure
rpc GetPositionRisk(GetPositionRiskRequest) returns (GetPositionRiskResponse);
// Validate order against risk limits before submission
rpc ValidateOrder(ValidateOrderRequest) returns (ValidateOrderResponse);
// Get comprehensive portfolio risk metrics
rpc GetRiskMetrics(GetRiskMetricsRequest) returns (GetRiskMetricsResponse);
// Subscribe to real-time risk alerts and violations
rpc SubscribeRiskAlerts(SubscribeRiskAlertsRequest) returns (stream RiskAlertEvent);
// Emergency stop with immediate trading halt
rpc EmergencyStop(EmergencyStopRequest) returns (EmergencyStopResponse);
// Integrated System Monitoring
// Get system performance metrics
rpc GetMetrics(GetMetricsRequest) returns (GetMetricsResponse);
// Get latency performance statistics
rpc GetLatency(GetLatencyRequest) returns (GetLatencyResponse);
// Get throughput and capacity metrics
rpc GetThroughput(GetThroughputRequest) returns (GetThroughputResponse);
// Subscribe to real-time performance metrics
rpc SubscribeMetrics(SubscribeMetricsRequest) returns (stream MetricsEvent);
// Integrated Configuration Management
// Update system parameters and settings
rpc UpdateParameters(UpdateParametersRequest) returns (UpdateParametersResponse);
// Get current configuration values
rpc GetConfig(GetConfigRequest) returns (GetConfigResponse);
// Subscribe to configuration changes
rpc SubscribeConfig(SubscribeConfigRequest) returns (stream ConfigEvent);
// Integrated System Health Monitoring
// Get overall system health and service status
rpc GetSystemStatus(GetSystemStatusRequest) returns (GetSystemStatusResponse);
// Subscribe to system status changes and alerts
rpc SubscribeSystemStatus(SubscribeSystemStatusRequest) returns (stream SystemStatusEvent);
// ML Trading Operations
// Submit ML-powered trading order with ensemble predictions
rpc SubmitMLOrder(SubmitMLOrderRequest) returns (SubmitMLOrderResponse);
// Get ML prediction history with outcomes
rpc GetMLPredictions(GetMLPredictionsRequest) returns (GetMLPredictionsResponse);
// Get ML model performance metrics
rpc GetMLPerformance(GetMLPerformanceRequest) returns (GetMLPerformanceResponse);
// Wave D: Regime Detection Operations
// Get current regime state for a symbol
rpc GetRegimeState(GetRegimeStateRequest) returns (GetRegimeStateResponse);
// Get regime transition history for a symbol
rpc GetRegimeTransitions(GetRegimeTransitionsRequest) returns (GetRegimeTransitionsResponse);
}
// Order submission request
message SubmitOrderRequest {
string symbol = 1;
OrderSide side = 2;
OrderType order_type = 3;
double quantity = 4;
optional double price = 5;
optional double stop_price = 6;
string time_in_force = 7;
string client_order_id = 8;
}
// Order submission response
message SubmitOrderResponse {
bool success = 1;
string order_id = 2;
string message = 3;
int64 timestamp_unix_nanos = 4;
}
// Order cancellation request
message CancelOrderRequest {
string order_id = 1;
string symbol = 2;
}
// Order cancellation response
message CancelOrderResponse {
bool success = 1;
string message = 2;
int64 timestamp_unix_nanos = 3;
}
// Order status request
message GetOrderStatusRequest {
string order_id = 1;
}
// Order status response
message GetOrderStatusResponse {
string order_id = 1;
string symbol = 2;
OrderSide side = 3;
OrderType order_type = 4;
double quantity = 5;
double filled_quantity = 6;
double remaining_quantity = 7;
double average_price = 8;
OrderStatus status = 9;
int64 created_at_unix_nanos = 10;
int64 updated_at_unix_nanos = 11;
}
// Account information request
message GetAccountInfoRequest {
string account_id = 1;
}
// Account information response
message GetAccountInfoResponse {
string account_id = 1;
double total_value = 2;
double cash_balance = 3;
double buying_power = 4;
double maintenance_margin = 5;
double day_trading_buying_power = 6;
}
// Positions request
message GetPositionsRequest {
optional string symbol = 1; // Filter by symbol if provided
}
// Positions response
message GetPositionsResponse {
repeated Position positions = 1;
}
// Position information
message Position {
string symbol = 1;
double quantity = 2;
double market_price = 3;
double market_value = 4;
double average_cost = 5;
double unrealized_pnl = 6;
double realized_pnl = 7;
}
// Market data subscription request
message SubscribeMarketDataRequest {
repeated string symbols = 1;
repeated MarketDataType data_types = 2;
}
// Market data event
message MarketDataEvent {
oneof event {
TickData tick = 1;
QuoteData quote = 2;
TradeData trade = 3;
BarData bar = 4;
}
}
// Tick data
message TickData {
string symbol = 1;
int64 timestamp_unix_nanos = 2;
double price = 3;
uint64 size = 4;
string exchange = 5;
}
// Quote data
message QuoteData {
string symbol = 1;
int64 timestamp_unix_nanos = 2;
double bid_price = 3;
uint64 bid_size = 4;
double ask_price = 5;
uint64 ask_size = 6;
string exchange = 7;
}
// Trade data
message TradeData {
string symbol = 1;
int64 timestamp_unix_nanos = 2;
double price = 3;
uint64 size = 4;
string trade_id = 5;
string exchange = 6;
}
// Bar data
message BarData {
string symbol = 1;
int64 timestamp_unix_nanos = 2;
string timeframe = 3;
double open = 4;
double high = 5;
double low = 6;
double close = 7;
uint64 volume = 8;
optional double vwap = 9;
}
// Order updates subscription request
message SubscribeOrderUpdatesRequest {
optional string account_id = 1;
}
// Order update event
message OrderUpdateEvent {
string order_id = 1;
string symbol = 2;
OrderStatus status = 3;
double filled_quantity = 4;
double remaining_quantity = 5;
double last_fill_price = 6;
uint64 last_fill_quantity = 7;
int64 timestamp_unix_nanos = 8;
string message = 9;
}
// Monitoring messages
message GetMetricsRequest {
repeated string metric_names = 1;
optional int64 start_time_unix_nanos = 2;
optional int64 end_time_unix_nanos = 3;
}
message GetMetricsResponse {
repeated Metric metrics = 1;
int64 timestamp_unix_nanos = 2;
}
message Metric {
string name = 1;
double value = 2;
string unit = 3;
map<string, string> labels = 4;
int64 timestamp_unix_nanos = 5;
}
message GetLatencyRequest {
optional string service_name = 1;
optional string operation = 2;
optional int64 start_time_unix_nanos = 3;
optional int64 end_time_unix_nanos = 4;
}
message GetLatencyResponse {
double p50_micros = 1;
double p95_micros = 2;
double p99_micros = 3;
double p999_micros = 4;
double avg_micros = 5;
double max_micros = 6;
double min_micros = 7;
uint64 sample_count = 8;
}
message GetThroughputRequest {
optional string service_name = 1;
optional string operation = 2;
optional int64 start_time_unix_nanos = 3;
optional int64 end_time_unix_nanos = 4;
}
message GetThroughputResponse {
double requests_per_second = 1;
double bytes_per_second = 2;
uint64 total_requests = 3;
uint64 total_bytes = 4;
uint64 error_count = 5;
double error_rate = 6;
}
message SubscribeMetricsRequest {
repeated string metric_names = 1;
uint32 interval_seconds = 2;
}
message MetricsEvent {
repeated Metric metrics = 1;
int64 timestamp_unix_nanos = 2;
}
// Configuration messages
message UpdateParametersRequest {
map<string, string> parameters = 1;
bool persist = 2;
}
message UpdateParametersResponse {
bool success = 1;
string message = 2;
repeated string updated_keys = 3;
}
message GetConfigRequest {
repeated string keys = 1; // Empty to get all config
}
message GetConfigResponse {
map<string, string> config = 1;
int64 version = 2;
int64 last_updated_unix_nanos = 3;
}
message SubscribeConfigRequest {
repeated string keys = 1; // Empty to watch all config changes
}
message ConfigEvent {
string key = 1;
string value = 2;
string old_value = 3;
int64 timestamp_unix_nanos = 4;
}
// Enums
// Order direction for trading operations
enum OrderSide {
ORDER_SIDE_UNSPECIFIED = 0; // Default/unknown side
ORDER_SIDE_BUY = 1; // Buy order (long position)
ORDER_SIDE_SELL = 2; // Sell order (short position)
}
// Order execution type
enum OrderType {
ORDER_TYPE_UNSPECIFIED = 0; // Default/unknown type
ORDER_TYPE_MARKET = 1; // Execute immediately at market price
ORDER_TYPE_LIMIT = 2; // Execute only at specified price or better
ORDER_TYPE_STOP = 3; // Market order triggered at stop price
ORDER_TYPE_STOP_LIMIT = 4; // Limit order triggered at stop price
}
// Current lifecycle status of orders
enum OrderStatus {
ORDER_STATUS_UNSPECIFIED = 0; // Default/unknown status
ORDER_STATUS_NEW = 1; // Order created and submitted
ORDER_STATUS_PARTIALLY_FILLED = 2; // Order partially executed
ORDER_STATUS_FILLED = 3; // Order completely executed
ORDER_STATUS_CANCELLED = 4; // Order cancelled
ORDER_STATUS_REJECTED = 5; // Order rejected by exchange or system
ORDER_STATUS_PENDING_CANCEL = 6; // Cancellation request pending
}
enum MarketDataType {
MARKET_DATA_TYPE_UNSPECIFIED = 0;
MARKET_DATA_TYPE_TICKS = 1;
MARKET_DATA_TYPE_QUOTES = 2;
MARKET_DATA_TYPE_TRADES = 3;
MARKET_DATA_TYPE_BARS = 4;
}
message GetSystemStatusRequest {
repeated string service_names = 1; // Empty to get all services
}
message GetSystemStatusResponse {
SystemStatus overall_status = 1;
repeated ServiceStatus services = 2;
int64 timestamp_unix_nanos = 3;
}
message ServiceStatus {
string name = 1;
SystemStatus status = 2;
string message = 3;
int64 last_check_unix_nanos = 4;
map<string, string> details = 5;
}
message SubscribeSystemStatusRequest {
repeated string service_names = 1;
}
message SystemStatusEvent {
string service_name = 1;
SystemStatus status = 2;
SystemStatus previous_status = 3;
string message = 4;
int64 timestamp_unix_nanos = 5;
}
enum SystemStatus {
SYSTEM_STATUS_UNKNOWN = 0;
SYSTEM_STATUS_HEALTHY = 1;
SYSTEM_STATUS_DEGRADED = 2;
SYSTEM_STATUS_UNHEALTHY = 3;
SYSTEM_STATUS_CRITICAL = 4;
}
// VaR calculation request
message GetVaRRequest {
repeated string symbols = 1;
double confidence_level = 2; // e.g., 0.95, 0.99
uint32 lookback_days = 3;
VaRMethodology methodology = 4;
}
// VaR calculation response
message GetVaRResponse {
double portfolio_var = 1;
repeated SymbolVaR symbol_vars = 2;
int64 timestamp_unix_nanos = 3;
string methodology_used = 4;
}
message SymbolVaR {
string symbol = 1;
double var_amount = 2;
double contribution_percent = 3;
}
// Position risk analysis
message GetPositionRiskRequest {
optional string symbol = 1; // Empty for all positions
}
message GetPositionRiskResponse {
repeated PositionRisk positions = 1;
double total_exposure = 2;
double concentration_risk = 3;
int64 timestamp_unix_nanos = 4;
}
message PositionRisk {
string symbol = 1;
double position_size = 2;
double market_value = 3;
double var_contribution = 4;
double concentration_percent = 5;
RiskLevel risk_level = 6;
}
// Order validation request
message ValidateOrderRequest {
string symbol = 1;
OrderSide side = 2;
double quantity = 3;
double price = 4;
string account_id = 5;
}
message ValidateOrderResponse {
bool approved = 1;
string reason = 2;
repeated RiskViolation violations = 3;
double projected_exposure = 4;
double margin_impact = 5;
}
message RiskViolation {
ViolationType type = 1;
string description = 2;
double limit_value = 3;
double current_value = 4;
RiskSeverity severity = 5;
}
// Risk metrics request
message GetRiskMetricsRequest {
optional string portfolio_id = 1;
optional int64 start_time_unix_nanos = 2;
optional int64 end_time_unix_nanos = 3;
}
message GetRiskMetricsResponse {
double sharpe_ratio = 1;
double max_drawdown = 2;
double current_drawdown = 3;
double volatility = 4;
double beta = 5;
double alpha = 6;
double value_at_risk = 7;
double expected_shortfall = 8;
int64 timestamp_unix_nanos = 9;
}
// Risk alerts subscription
message SubscribeRiskAlertsRequest {
repeated RiskSeverity min_severity = 1;
repeated string symbols = 2; // Empty for all symbols
}
message RiskAlertEvent {
string alert_id = 1;
RiskSeverity severity = 2;
string symbol = 3;
string message = 4;
double threshold_value = 5;
double current_value = 6;
int64 timestamp_unix_nanos = 7;
bool requires_action = 8;
}
// Emergency stop
message EmergencyStopRequest {
EmergencyStopType stop_type = 1;
string reason = 2;
repeated string symbols = 3; // Empty for all
bool confirm = 4;
}
message EmergencyStopResponse {
bool success = 1;
string message = 2;
uint32 orders_cancelled = 3;
uint32 positions_closed = 4;
int64 timestamp_unix_nanos = 5;
}
// Backtesting Service provides comprehensive strategy backtesting capabilities for the TLI.
// This service allows users to test trading strategies against historical data with detailed
// performance analytics, risk metrics, and trade-by-trade analysis.
service BacktestingService {
// Backtest Execution Management
// Start a new strategy backtest with historical data
rpc StartBacktest(StartBacktestRequest) returns (StartBacktestResponse);
// Get current status of a running backtest
rpc GetBacktestStatus(GetBacktestStatusRequest) returns (GetBacktestStatusResponse);
// Get comprehensive backtest results and analytics
rpc GetBacktestResults(GetBacktestResultsRequest) returns (GetBacktestResultsResponse);
// List historical backtest runs with filtering
rpc ListBacktests(ListBacktestsRequest) returns (ListBacktestsResponse);
// Subscribe to real-time backtest progress updates
rpc SubscribeBacktestProgress(SubscribeBacktestProgressRequest) returns (stream BacktestProgressEvent);
// Stop a running backtest and optionally save partial results
rpc StopBacktest(StopBacktestRequest) returns (StopBacktestResponse);
}
// Start backtest request
message StartBacktestRequest {
string strategy_name = 1;
repeated string symbols = 2;
int64 start_date_unix_nanos = 3;
int64 end_date_unix_nanos = 4;
double initial_capital = 5;
map<string, string> parameters = 6;
bool save_results = 7;
string description = 8;
}
message StartBacktestResponse {
bool success = 1;
string backtest_id = 2;
string message = 3;
int64 estimated_duration_seconds = 4;
}
// Backtest status
message GetBacktestStatusRequest {
string backtest_id = 1;
}
message GetBacktestStatusResponse {
string backtest_id = 1;
BacktestStatus status = 2;
double progress_percentage = 3;
string current_date = 4;
uint64 trades_executed = 5;
double current_pnl = 6;
int64 started_at_unix_nanos = 7;
optional int64 completed_at_unix_nanos = 8;
optional string error_message = 9;
}
// Backtest results
message GetBacktestResultsRequest {
string backtest_id = 1;
bool include_trades = 2;
bool include_metrics = 3;
}
message GetBacktestResultsResponse {
string backtest_id = 1;
BacktestMetrics metrics = 2;
repeated Trade trades = 3;
repeated EquityCurvePoint equity_curve = 4;
repeated DrawdownPeriod drawdown_periods = 5;
}
message BacktestMetrics {
double total_return = 1;
double annualized_return = 2;
double sharpe_ratio = 3;
double sortino_ratio = 4;
double max_drawdown = 5;
double volatility = 6;
double win_rate = 7;
double profit_factor = 8;
uint64 total_trades = 9;
uint64 winning_trades = 10;
uint64 losing_trades = 11;
double avg_win = 12;
double avg_loss = 13;
double largest_win = 14;
double largest_loss = 15;
double calmar_ratio = 16;
int64 backtest_duration_nanos = 17;
}
message Trade {
string trade_id = 1;
string symbol = 2;
OrderSide side = 3;
double quantity = 4;
double entry_price = 5;
double exit_price = 6;
int64 entry_time_unix_nanos = 7;
int64 exit_time_unix_nanos = 8;
double pnl = 9;
double return_percent = 10;
string entry_signal = 11;
string exit_signal = 12;
}
message EquityCurvePoint {
int64 timestamp_unix_nanos = 1;
double equity = 2;
double drawdown = 3;
double benchmark_equity = 4;
}
message DrawdownPeriod {
int64 start_time_unix_nanos = 1;
int64 end_time_unix_nanos = 2;
double peak_value = 3;
double trough_value = 4;
double drawdown_percent = 5;
uint32 duration_days = 6;
}
// List backtests
message ListBacktestsRequest {
uint32 limit = 1;
uint32 offset = 2;
optional string strategy_name = 3;
optional BacktestStatus status_filter = 4;
}
message ListBacktestsResponse {
repeated BacktestSummary backtests = 1;
uint32 total_count = 2;
}
message BacktestSummary {
string backtest_id = 1;
string strategy_name = 2;
repeated string symbols = 3;
BacktestStatus status = 4;
double total_return = 5;
double sharpe_ratio = 6;
double max_drawdown = 7;
int64 created_at_unix_nanos = 8;
int64 start_date_unix_nanos = 9;
int64 end_date_unix_nanos = 10;
string description = 11;
}
// Backtest progress subscription
message SubscribeBacktestProgressRequest {
string backtest_id = 1;
}
message BacktestProgressEvent {
string backtest_id = 1;
double progress_percentage = 2;
string current_date = 3;
uint64 trades_executed = 4;
double current_pnl = 5;
double current_equity = 6;
BacktestStatus status = 7;
int64 timestamp_unix_nanos = 8;
}
// Stop backtest
message StopBacktestRequest {
string backtest_id = 1;
bool save_partial_results = 2;
}
message StopBacktestResponse {
bool success = 1;
string message = 2;
bool results_saved = 3;
}
// Additional enums for risk and backtesting
enum VaRMethodology {
VAR_METHODOLOGY_UNSPECIFIED = 0;
VAR_METHODOLOGY_HISTORICAL = 1;
VAR_METHODOLOGY_MONTE_CARLO = 2;
VAR_METHODOLOGY_PARAMETRIC = 3;
VAR_METHODOLOGY_EXPECTED_SHORTFALL = 4;
}
enum RiskLevel {
RISK_LEVEL_UNSPECIFIED = 0;
RISK_LEVEL_LOW = 1;
RISK_LEVEL_MEDIUM = 2;
RISK_LEVEL_HIGH = 3;
RISK_LEVEL_CRITICAL = 4;
}
enum ViolationType {
VIOLATION_TYPE_UNSPECIFIED = 0;
VIOLATION_TYPE_POSITION_LIMIT = 1;
VIOLATION_TYPE_CONCENTRATION = 2;
VIOLATION_TYPE_VAR_LIMIT = 3;
VIOLATION_TYPE_MARGIN = 4;
VIOLATION_TYPE_DRAWDOWN = 5;
}
enum RiskSeverity {
RISK_SEVERITY_UNSPECIFIED = 0;
RISK_SEVERITY_INFO = 1;
RISK_SEVERITY_WARNING = 2;
RISK_SEVERITY_CRITICAL = 3;
RISK_SEVERITY_EMERGENCY = 4;
}
enum EmergencyStopType {
EMERGENCY_STOP_TYPE_UNSPECIFIED = 0;
EMERGENCY_STOP_TYPE_CANCEL_ORDERS = 1;
EMERGENCY_STOP_TYPE_CLOSE_POSITIONS = 2;
EMERGENCY_STOP_TYPE_FULL_SHUTDOWN = 3;
}
enum BacktestStatus {
BACKTEST_STATUS_UNSPECIFIED = 0;
BACKTEST_STATUS_QUEUED = 1;
BACKTEST_STATUS_RUNNING = 2;
BACKTEST_STATUS_COMPLETED = 3;
BACKTEST_STATUS_FAILED = 4;
BACKTEST_STATUS_CANCELLED = 5;
BACKTEST_STATUS_PAUSED = 6;
}
// ML Trading Messages
// Submit ML-powered order request
message SubmitMLOrderRequest {
string symbol = 1; // Trading symbol (e.g., "ES.FUT")
string account_id = 2; // Trading account identifier
optional string model_filter = 3; // Optional model filter: "DQN", "MAMBA2", "PPO", "TFT", or null for ensemble
}
// Submit ML-powered order response
message SubmitMLOrderResponse {
string order_id = 1; // Order ID if executed
string symbol = 2; // Trading symbol
string model_used = 3; // "Ensemble" or specific model name
string predicted_action = 4; // Action taken: BUY, SELL, HOLD
double confidence = 5; // Prediction confidence (0.0-1.0)
int32 quantity = 6; // Order quantity
bool executed = 7; // True if order was submitted
string message = 8; // Status message
}
// Get ML predictions request
message GetMLPredictionsRequest {
string symbol = 1; // Trading symbol to filter by
optional string model_filter = 2; // Optional model filter
optional int32 limit = 3; // Maximum predictions to return (default: 10)
}
// Get ML predictions response
message GetMLPredictionsResponse {
repeated MLPrediction predictions = 1; // List of predictions with outcomes
}
// Single ML prediction with outcome
message MLPrediction {
string timestamp = 1; // Prediction timestamp (ISO 8601)
string model_id = 2; // Model identifier
string symbol = 3; // Trading symbol
string predicted_action = 4; // Predicted action: BUY, SELL, HOLD
double confidence = 5; // Prediction confidence (0.0-1.0)
optional double actual_return = 6; // Actual return if outcome known
}
// Get ML performance request
message GetMLPerformanceRequest {
optional string model_filter = 1; // Optional model filter
}
// Get ML performance response
message GetMLPerformanceResponse {
repeated ModelPerformance models = 1; // Performance metrics per model
double ensemble_threshold = 2; // Ensemble confidence threshold
int32 active_models = 3; // Number of active models
int32 total_models = 4; // Total number of models
}
// Performance metrics for a single model
message ModelPerformance {
string model_id = 1; // Model identifier
double accuracy = 2; // Accuracy rate (0.0-1.0)
int64 total_predictions = 3; // Total predictions made
double sharpe_ratio = 4; // Risk-adjusted return
double avg_return = 5; // Average return per prediction
double max_drawdown = 6; // Maximum drawdown
}
// Wave D: Regime Detection Messages
// Request to get current regime state
message GetRegimeStateRequest {
string symbol = 1; // Trading symbol to query
}
// Response containing current regime state
message GetRegimeStateResponse {
string symbol = 1; // Trading symbol
string current_regime = 2; // Current regime: TRENDING, RANGING, VOLATILE, CRISIS
double confidence = 3; // Regime confidence (0.0-1.0)
double cusum_s_plus = 4; // CUSUM S+ statistic
double cusum_s_minus = 5; // CUSUM S- statistic
double adx = 6; // Average Directional Index
double stability = 7; // Regime stability score (0.0-1.0)
double entropy = 8; // Transition entropy (0.0-1.0)
int64 updated_at_unix_nanos = 9; // Last update timestamp
}
// Request to get regime transition history
message GetRegimeTransitionsRequest {
string symbol = 1; // Trading symbol to query
int32 limit = 2; // Maximum transitions to return (default: 100)
}
// Response containing regime transition history
message GetRegimeTransitionsResponse {
repeated RegimeTransition transitions = 1; // List of regime transitions
}
// Single regime transition record
message RegimeTransition {
string from_regime = 1; // Previous regime
string to_regime = 2; // New regime
int32 duration_bars = 3; // Duration in previous regime (bars)
double transition_probability = 4; // Transition probability from matrix
int64 timestamp_unix_nanos = 5; // Transition timestamp
}

View File

@@ -1,14 +1,15 @@
//! Build script for API Gateway service
//!
//! Compiles protobuf definitions for:
//! - Config service (`foxhunt.config` from `config_service.proto`)
//! - TLI services (`Trading`, `Backtesting`, `MLService` from `trading.proto`) - client-facing interface
//! - Trading Service backend (`trading.proto`) - backend trading service interface
//! - Risk Service backend (`risk.proto`) - backend risk service interface
//! - Monitoring Service backend (`monitoring.proto`) - backend monitoring service interface
//! - Config Service backend (`config.proto`) - backend config service interface
//! - Trading Service backend (`trading.proto`) - backend service interface
//! - ML Training Service (`ml_training.proto`)
//! Compiles protobuf definitions from the canonical proto/ directory at workspace root.
//! Proto packages:
//! - `foxhunt.tli` (fxt_trading.proto) - Fat-client unified interface (server+client)
//! - `trading` (trading.proto) - Backend trading service (client-only)
//! - `foxhunt.config` (config_service.proto) - Config service (server+client)
//! - `risk` (risk.proto) - Risk service (client-only)
//! - `monitoring` (monitoring.proto) - Monitoring service (server+client)
//! - `config` (config.proto) - Config backend (client-only)
//! - `ml_training` (ml_training.proto) - ML Training service (server+client)
//! - `trading_agent` (trading_agent.proto) - Trading Agent service (server+client)
fn main() -> Result<(), Box<dyn std::error::Error>> {
// NOTE: Tonic 0.14+ uses tonic_prost_build instead of tonic_build
@@ -16,7 +17,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
let out_dir = std::path::PathBuf::from(std::env::var("OUT_DIR")?);
// Compile Config Service proto
// Compile Config Service proto (foxhunt.config package)
config
.clone()
.build_server(true)
@@ -27,15 +28,15 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
.type_attribute(".", "#[derive(serde::Serialize, serde::Deserialize)]")
.server_mod_attribute(".", "#[allow(unused_qualifications)]")
.client_mod_attribute(".", "#[allow(unused_qualifications)]")
.compile_protos(&["proto/config_service.proto"], &["proto"])?;
.compile_protos(&["../../proto/config_service.proto"], &["../../proto"])?;
// Compile TLI proto which contains TradingService, BacktestingService, and MLService
// API Gateway acts as server (receives requests from TLI clients)
// Keep client generation for backtesting_proxy compatibility
// Compile fat-client TLI proto (package: foxhunt.tli) — server+client
// Contains TradingService, BacktestingService, and MLService
// API Gateway acts as server for incoming client requests
config
.clone()
.build_server(true) // Act as server for incoming requests
.build_client(true) // Generate client for backtesting service compatibility
.build_server(true)
.build_client(true)
.file_descriptor_set_path(out_dir.join("tli_descriptor.bin"))
.compile_well_known_types(true)
.extern_path(".google.protobuf", "::prost_types")
@@ -43,48 +44,46 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
.server_mod_attribute(".", "#[allow(unused_qualifications)]")
.client_mod_attribute(".", "#[allow(unused_qualifications)]")
.compile_protos(
&["../../bin/fxt/proto/trading.proto"],
&["../../bin/fxt/proto"]
&["../../proto/fxt_trading.proto"],
&["../../proto"],
)?;
// Compile Trading Service backend proto (package: trading)
// API Gateway acts as client (forwards translated requests to Trading Service)
// Compile Trading Service backend proto (package: trading) — client-only
// API Gateway forwards translated requests to Trading Service
config
.clone()
.build_server(false) // API Gateway is only a client to Trading Service
.build_client(true) // Generate client to call backend
.build_server(false)
.build_client(true)
.compile_well_known_types(true)
.extern_path(".google.protobuf", "::prost_types")
.type_attribute(".", "#[derive(serde::Serialize, serde::Deserialize)]")
.server_mod_attribute(".", "#[allow(unused_qualifications)]")
.client_mod_attribute(".", "#[allow(unused_qualifications)]")
.compile_protos(
&["../trading_service/proto/trading.proto"],
&["../trading_service/proto"]
&["../../proto/trading.proto"],
&["../../proto"],
)?;
// Compile Risk Service backend proto (package: risk)
// API Gateway acts as client (forwards translated requests to Risk Service)
// Compile Risk Service proto (package: risk) — client-only
config
.clone()
.build_server(false) // API Gateway is only a client to Risk Service
.build_client(true) // Generate client to call backend
.build_server(false)
.build_client(true)
.compile_well_known_types(true)
.extern_path(".google.protobuf", "::prost_types")
.type_attribute(".", "#[derive(serde::Serialize, serde::Deserialize)]")
.server_mod_attribute(".", "#[allow(unused_qualifications)]")
.client_mod_attribute(".", "#[allow(unused_qualifications)]")
.compile_protos(
&["../trading_service/proto/risk.proto"],
&["../trading_service/proto"]
&["../../proto/risk.proto"],
&["../../proto"],
)?;
// Compile Monitoring Service proto (package: monitoring)
// API Gateway acts as both server (receives proxy requests) and client (forwards to backend)
// Compile Monitoring Service proto (package: monitoring) — server+client
config
.clone()
.build_server(true) // API Gateway serves MonitoringService (proxy)
.build_client(true) // API Gateway forwards to monitoring backend
.build_server(true)
.build_client(true)
.file_descriptor_set_path(out_dir.join("monitoring_descriptor.bin"))
.compile_well_known_types(true)
.extern_path(".google.protobuf", "::prost_types")
@@ -92,31 +91,30 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
.server_mod_attribute(".", "#[allow(unused_qualifications)]")
.client_mod_attribute(".", "#[allow(unused_qualifications)]")
.compile_protos(
&["../monitoring_service/proto/monitoring.proto"],
&["../monitoring_service/proto"]
&["../../proto/monitoring.proto"],
&["../../proto"],
)?;
// Compile Config Service backend proto (package: config)
// API Gateway acts as client (forwards translated requests to Config Service)
// Compile Config backend proto (package: config) — client-only
config
.clone()
.build_server(false) // API Gateway is only a client to Config Service
.build_client(true) // Generate client to call backend
.build_server(false)
.build_client(true)
.compile_well_known_types(true)
.extern_path(".google.protobuf", "::prost_types")
.type_attribute(".", "#[derive(serde::Serialize, serde::Deserialize)]")
.server_mod_attribute(".", "#[allow(unused_qualifications)]")
.client_mod_attribute(".", "#[allow(unused_qualifications)]")
.compile_protos(
&["../trading_service/proto/config.proto"],
&["../trading_service/proto"]
&["../../proto/config.proto"],
&["../../proto"],
)?;
// Compile ML Training Service protobuf (client + server for proxying)
// Compile ML Training Service proto (package: ml_training) — server+client
config
.clone()
.build_server(true) // API Gateway acts as server (receives proxy requests)
.build_client(true) // API Gateway acts as client (forwards to backend)
.build_server(true)
.build_client(true)
.file_descriptor_set_path(out_dir.join("ml_training_descriptor.bin"))
.compile_well_known_types(true)
.extern_path(".google.protobuf", "::prost_types")
@@ -124,15 +122,14 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
.server_mod_attribute(".", "#[allow(unused_qualifications)]")
.client_mod_attribute(".", "#[allow(unused_qualifications)]")
.compile_protos(
&["../ml_training_service/proto/ml_training.proto"],
&["../ml_training_service/proto"]
&["../../proto/ml_training.proto"],
&["../../proto"],
)?;
// Compile Trading Agent Service protobuf (client + server for proxying)
// Compile Trading Agent Service proto (package: trading_agent) — server+client
config
.build_server(true) // API Gateway acts as server (receives proxy requests)
.build_client(true) // API Gateway acts as client (forwards to backend)
.build_server(true)
.build_client(true)
.file_descriptor_set_path(out_dir.join("trading_agent_descriptor.bin"))
.compile_well_known_types(true)
.extern_path(".google.protobuf", "::prost_types")
@@ -140,18 +137,18 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
.server_mod_attribute(".", "#[allow(unused_qualifications)]")
.client_mod_attribute(".", "#[allow(unused_qualifications)]")
.compile_protos(
&["../trading_agent_service/proto/trading_agent.proto"],
&["../trading_agent_service/proto"]
&["../../proto/trading_agent.proto"],
&["../../proto"],
)?;
println!("cargo:rerun-if-changed=proto/config_service.proto");
println!("cargo:rerun-if-changed=../../bin/fxt/proto/trading.proto");
println!("cargo:rerun-if-changed=../trading_service/proto/trading.proto");
println!("cargo:rerun-if-changed=../trading_service/proto/risk.proto");
println!("cargo:rerun-if-changed=../monitoring_service/proto/monitoring.proto");
println!("cargo:rerun-if-changed=../trading_service/proto/config.proto");
println!("cargo:rerun-if-changed=../ml_training_service/proto/ml_training.proto");
println!("cargo:rerun-if-changed=../trading_agent_service/proto/trading_agent.proto");
println!("cargo:rerun-if-changed=../../proto/config_service.proto");
println!("cargo:rerun-if-changed=../../proto/fxt_trading.proto");
println!("cargo:rerun-if-changed=../../proto/trading.proto");
println!("cargo:rerun-if-changed=../../proto/risk.proto");
println!("cargo:rerun-if-changed=../../proto/monitoring.proto");
println!("cargo:rerun-if-changed=../../proto/config.proto");
println!("cargo:rerun-if-changed=../../proto/ml_training.proto");
println!("cargo:rerun-if-changed=../../proto/trading_agent.proto");
Ok(())
}

View File

@@ -1,81 +0,0 @@
syntax = "proto3";
package foxhunt.config;
// Configuration Management Service
service ConfigurationService {
// Get a single configuration value
rpc GetConfig(GetConfigRequest) returns (GetConfigResponse);
// Update a configuration value
rpc UpdateConfig(UpdateConfigRequest) returns (UpdateConfigResponse);
// List all configurations for a service scope
rpc ListConfigs(ListConfigsRequest) returns (ListConfigsResponse);
// Trigger configuration reload
rpc ReloadConfig(ReloadConfigRequest) returns (ReloadConfigResponse);
}
// Get configuration request
message GetConfigRequest {
string service_scope = 1;
string config_key = 2;
}
// Get configuration response
message GetConfigResponse {
string config_value = 1; // JSON-serialized value
string data_type = 2;
string description = 3;
int64 updated_at = 4; // Unix timestamp
string updated_by = 5;
}
// Update configuration request
message UpdateConfigRequest {
string service_scope = 1;
string config_key = 2;
string new_value = 3; // JSON-serialized value
string updated_by = 4;
}
// Update configuration response
message UpdateConfigResponse {
bool success = 1;
string message = 2;
}
// List configurations request
message ListConfigsRequest {
optional string service_scope = 1; // If not provided, lists all scopes
}
// Configuration item
message ConfigItem {
string service_scope = 1;
string config_key = 2;
string config_value = 3; // JSON-serialized value
string data_type = 4;
string description = 5;
int64 created_at = 6;
int64 updated_at = 7;
string updated_by = 8;
}
// List configurations response
message ListConfigsResponse {
repeated ConfigItem configs = 1;
}
// Reload configuration request
message ReloadConfigRequest {
optional string service_scope = 1;
optional string config_key = 2;
}
// Reload configuration response
message ReloadConfigResponse {
bool success = 1;
string message = 2;
}

View File

@@ -2,6 +2,10 @@
//!
//! Forwards `GetLiveTrainingMetrics` and `StreamTrainingMetrics` from FXT clients
//! to the monitoring-service backend. Follows the same pattern as `MlTrainingProxy`.
//!
//! The merged monitoring.proto defines 16 RPCs (system health + training).
//! This proxy currently implements the 3 training RPCs with real forwarding;
//! the 13 system health RPCs return UNIMPLEMENTED until Task 4 absorbs them.
use futures::Stream;
use std::pin::Pin;
@@ -11,8 +15,13 @@ use tracing::{error, info, instrument};
use crate::monitoring::monitoring_service_client::MonitoringServiceClient;
use crate::monitoring::monitoring_service_server::{MonitoringService, MonitoringServiceServer};
use crate::monitoring::{
GetEpochHistoryRequest, GetEpochHistoryResponse, GetLiveTrainingMetricsRequest,
GetLiveTrainingMetricsResponse, StreamTrainingMetricsRequest,
AcknowledgeAlertRequest, AcknowledgeAlertResponse, GetActiveAlertsRequest,
GetActiveAlertsResponse, GetEpochHistoryRequest, GetEpochHistoryResponse,
GetHealthCheckRequest, GetHealthCheckResponse, GetLatencyMetricsRequest,
GetLatencyMetricsResponse, GetLiveTrainingMetricsRequest, GetLiveTrainingMetricsResponse,
GetMetricsRequest, GetMetricsResponse, GetSystemStatusRequest, GetSystemStatusResponse,
GetThroughputMetricsRequest, GetThroughputMetricsResponse, StreamTrainingMetricsRequest,
AlertEvent, MetricsEvent, SystemStatusEvent,
};
/// Monitoring Service Proxy
@@ -35,6 +44,10 @@ impl MonitoringServiceProxy {
#[tonic::async_trait]
impl MonitoringService for MonitoringServiceProxy {
// ========================================================================
// Training metrics streams (implemented -- forward to backend)
// ========================================================================
type StreamTrainingMetricsStream =
Pin<Box<dyn Stream<Item = Result<GetLiveTrainingMetricsResponse, Status>> + Send>>;
@@ -97,6 +110,109 @@ impl MonitoringService for MonitoringServiceProxy {
info!("GetEpochHistory forwarded successfully");
Ok(response)
}
// ========================================================================
// System health RPCs (stubs -- will be implemented in Task 4)
// ========================================================================
type StreamSystemStatusStream =
Pin<Box<dyn Stream<Item = Result<SystemStatusEvent, Status>> + Send>>;
async fn get_system_status(
&self,
_request: Request<GetSystemStatusRequest>,
) -> Result<Response<GetSystemStatusResponse>, Status> {
Err(Status::unimplemented(
"GetSystemStatus not yet implemented in monitoring proxy (Task 4)",
))
}
async fn stream_system_status(
&self,
_request: Request<crate::monitoring::StreamSystemStatusRequest>,
) -> Result<Response<Self::StreamSystemStatusStream>, Status> {
Err(Status::unimplemented(
"StreamSystemStatus not yet implemented in monitoring proxy (Task 4)",
))
}
async fn get_health_check(
&self,
_request: Request<GetHealthCheckRequest>,
) -> Result<Response<GetHealthCheckResponse>, Status> {
Err(Status::unimplemented(
"GetHealthCheck not yet implemented in monitoring proxy (Task 4)",
))
}
type StreamMetricsStream =
Pin<Box<dyn Stream<Item = Result<MetricsEvent, Status>> + Send>>;
async fn get_metrics(
&self,
_request: Request<GetMetricsRequest>,
) -> Result<Response<GetMetricsResponse>, Status> {
Err(Status::unimplemented(
"GetMetrics not yet implemented in monitoring proxy (Task 4)",
))
}
async fn stream_metrics(
&self,
_request: Request<crate::monitoring::StreamMetricsRequest>,
) -> Result<Response<Self::StreamMetricsStream>, Status> {
Err(Status::unimplemented(
"StreamMetrics not yet implemented in monitoring proxy (Task 4)",
))
}
async fn get_latency_metrics(
&self,
_request: Request<GetLatencyMetricsRequest>,
) -> Result<Response<GetLatencyMetricsResponse>, Status> {
Err(Status::unimplemented(
"GetLatencyMetrics not yet implemented in monitoring proxy (Task 4)",
))
}
async fn get_throughput_metrics(
&self,
_request: Request<GetThroughputMetricsRequest>,
) -> Result<Response<GetThroughputMetricsResponse>, Status> {
Err(Status::unimplemented(
"GetThroughputMetrics not yet implemented in monitoring proxy (Task 4)",
))
}
type StreamAlertsStream =
Pin<Box<dyn Stream<Item = Result<AlertEvent, Status>> + Send>>;
async fn stream_alerts(
&self,
_request: Request<crate::monitoring::StreamAlertsRequest>,
) -> Result<Response<Self::StreamAlertsStream>, Status> {
Err(Status::unimplemented(
"StreamAlerts not yet implemented in monitoring proxy (Task 4)",
))
}
async fn acknowledge_alert(
&self,
_request: Request<AcknowledgeAlertRequest>,
) -> Result<Response<AcknowledgeAlertResponse>, Status> {
Err(Status::unimplemented(
"AcknowledgeAlert not yet implemented in monitoring proxy (Task 4)",
))
}
async fn get_active_alerts(
&self,
_request: Request<GetActiveAlertsRequest>,
) -> Result<Response<GetActiveAlertsResponse>, Status> {
Err(Status::unimplemented(
"GetActiveAlerts not yet implemented in monitoring proxy (Task 4)",
))
}
}
#[cfg(test)]

View File

@@ -1,5 +1,12 @@
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Compile proto files for Broker Gateway Service
tonic_prost_build::compile_protos("proto/broker_gateway.proto")?;
tonic_prost_build::configure()
.compile_protos(
&["../../proto/broker_gateway.proto"],
&["../../proto"],
)?;
println!("cargo:rerun-if-changed=../../proto/broker_gateway.proto");
Ok(())
}

View File

@@ -1,212 +0,0 @@
// Broker Gateway Service - FIX Order Routing Protocol
//
// This service handles all broker communication via FIX 4.2/4.4 protocol
// for order routing, execution management, and account state synchronization.
syntax = "proto3";
package broker_gateway;
// ============================================================================
// Broker Gateway Service
// ============================================================================
service BrokerGatewayService {
// Route order to broker via FIX protocol
rpc RouteOrder(RouteOrderRequest) returns (RouteOrderResponse);
// Cancel existing order
rpc CancelOrder(CancelOrderRequest) returns (CancelOrderResponse);
// Get current account state (balance, margin, positions)
rpc GetAccountState(GetAccountStateRequest) returns (GetAccountStateResponse);
// Get all positions for account
rpc GetPositions(GetPositionsRequest) returns (GetPositionsResponse);
// Get FIX session status
rpc GetSessionStatus(GetSessionStatusRequest) returns (GetSessionStatusResponse);
// Stream real-time executions from broker
rpc StreamExecutions(StreamExecutionsRequest) returns (stream ExecutionEvent);
// Health check
rpc HealthCheck(HealthCheckRequest) returns (HealthCheckResponse);
}
// ============================================================================
// Order Routing
// ============================================================================
message RouteOrderRequest {
string symbol = 1; // ES, NQ, etc.
OrderSide side = 2; // BUY, SELL
double quantity = 3; // Number of contracts
OrderType order_type = 4; // MARKET, LIMIT, STOP, STOP_LIMIT
optional double price = 5; // Limit price (required for LIMIT orders)
optional double stop_price = 6; // Stop price (required for STOP orders)
string account_id = 7; // AMP account identifier
map<string, string> metadata = 8; // Strategy, model_name, etc.
}
message RouteOrderResponse {
string broker_order_id = 1; // Broker-assigned OrderID (Tag 37, filled after ack)
string client_order_id = 2; // Our ClOrdID (Tag 11)
OrderStatus status = 3; // PENDING_SUBMIT, SUBMITTED, etc.
int64 submitted_at = 4; // Timestamp (nanoseconds)
string message = 5; // Success/error message
}
message CancelOrderRequest {
string client_order_id = 1; // Order to cancel
string account_id = 2; // Account verification
}
message CancelOrderResponse {
bool success = 1;
string message = 2;
OrderStatus new_status = 3; // CANCEL_PENDING, CANCELLED, etc.
}
// ============================================================================
// Account & Position Management
// ============================================================================
message GetAccountStateRequest {
string account_id = 1;
}
message GetAccountStateResponse {
string account_id = 1;
double cash_balance = 2;
double equity = 3;
double margin_used = 4;
double margin_available = 5;
double buying_power = 6;
double unrealized_pnl = 7;
double realized_pnl = 8;
int64 last_updated = 9; // Timestamp (nanoseconds)
}
message GetPositionsRequest {
string account_id = 1;
optional string symbol = 2; // Filter by symbol (optional)
}
message GetPositionsResponse {
repeated Position positions = 1;
double total_equity = 2;
double total_exposure = 3;
double leverage_ratio = 4;
int64 timestamp = 5;
}
message Position {
string symbol = 1;
double quantity = 2; // Positive = long, negative = short
double average_price = 3;
double market_value = 4;
double unrealized_pnl = 5;
}
// ============================================================================
// Session Management
// ============================================================================
message GetSessionStatusRequest {
optional string session_id = 1; // Optional: default to active session
}
message GetSessionStatusResponse {
string session_id = 1;
SessionState state = 2;
int64 sender_seq_num = 3; // Current outgoing sequence
int64 target_seq_num = 4; // Expected incoming sequence
int64 last_heartbeat_sent = 5; // Timestamp (nanoseconds)
int64 last_heartbeat_received = 6; // Timestamp (nanoseconds)
double heartbeat_rtt_ms = 7; // Round-trip time in milliseconds
int64 connected_at = 8; // Timestamp (nanoseconds)
map<string, string> details = 9; // Additional session info
}
// ============================================================================
// Execution Streaming
// ============================================================================
message StreamExecutionsRequest {
optional string account_id = 1; // Filter by account
optional string symbol = 2; // Filter by symbol
}
message ExecutionEvent {
string execution_id = 1; // ExecID (Tag 17)
string broker_order_id = 2; // OrderID (Tag 37)
string client_order_id = 3; // ClOrdID (Tag 11)
string symbol = 4;
OrderSide side = 5;
ExecutionType exec_type = 6; // NEW, TRADE, CANCELED, REJECTED
OrderStatus order_status = 7; // Order status after this execution
double last_qty = 8; // Quantity filled (Tag 32)
double last_price = 9; // Fill price (Tag 31)
double cum_qty = 10; // Total filled (Tag 14)
double avg_price = 11; // Average fill price (Tag 6)
int64 transact_time = 12; // Execution timestamp
optional string text = 13; // Reject reason (if applicable)
}
// ============================================================================
// Health Check
// ============================================================================
message HealthCheckRequest {}
message HealthCheckResponse {
bool healthy = 1;
string message = 2;
map<string, string> details = 3;
}
// ============================================================================
// Enums
// ============================================================================
enum OrderSide {
ORDER_SIDE_UNSPECIFIED = 0;
ORDER_SIDE_BUY = 1;
ORDER_SIDE_SELL = 2;
}
enum OrderType {
ORDER_TYPE_UNSPECIFIED = 0;
ORDER_TYPE_MARKET = 1;
ORDER_TYPE_LIMIT = 2;
ORDER_TYPE_STOP = 3;
ORDER_TYPE_STOP_LIMIT = 4;
}
enum OrderStatus {
ORDER_STATUS_UNSPECIFIED = 0;
ORDER_STATUS_PENDING_SUBMIT = 1;
ORDER_STATUS_SUBMITTED = 2;
ORDER_STATUS_PARTIALLY_FILLED = 3;
ORDER_STATUS_FILLED = 4;
ORDER_STATUS_CANCEL_PENDING = 5;
ORDER_STATUS_CANCELLED = 6;
ORDER_STATUS_REJECTED = 7;
}
enum ExecutionType {
EXECUTION_TYPE_UNSPECIFIED = 0;
EXECUTION_TYPE_NEW = 1; // Order accepted
EXECUTION_TYPE_TRADE = 2; // Partial or full fill
EXECUTION_TYPE_CANCELED = 3; // Order canceled
EXECUTION_TYPE_REJECTED = 4; // Order rejected
}
enum SessionState {
SESSION_STATE_DISCONNECTED = 0;
SESSION_STATE_CONNECTED = 1;
SESSION_STATE_LOGGING_IN = 2;
SESSION_STATE_ACTIVE = 3;
SESSION_STATE_LOGGING_OUT = 4;
}

View File

@@ -1,5 +1,12 @@
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Compile proto files using tonic-prost-build
tonic_prost_build::compile_protos("proto/data_acquisition.proto")?;
tonic_prost_build::configure()
.compile_protos(
&["../../proto/data_acquisition.proto"],
&["../../proto"],
)?;
println!("cargo:rerun-if-changed=../../proto/data_acquisition.proto");
Ok(())
}

View File

@@ -1,177 +0,0 @@
syntax = "proto3";
package data_acquisition;
// Data Acquisition Service provides automated Databento data downloading and storage.
// This service handles scheduled downloads, cost tracking, quality validation, and automatic MinIO upload.
service DataAcquisitionService {
// Download Management
// Schedule a new data download from Databento
rpc ScheduleDownload(ScheduleDownloadRequest) returns (ScheduleDownloadResponse);
// Get status of a download job
rpc GetDownloadStatus(GetDownloadStatusRequest) returns (GetDownloadStatusResponse);
// Cancel a running or pending download job
rpc CancelDownload(CancelDownloadRequest) returns (CancelDownloadResponse);
// List all download jobs with optional filters
rpc ListDownloadJobs(ListDownloadJobsRequest) returns (ListDownloadJobsResponse);
// Service Health and Status
// Check service health and resource availability
rpc HealthCheck(HealthCheckRequest) returns (HealthCheckResponse);
}
// --- Core Request/Response Messages ---
// Request to schedule a new data download
message ScheduleDownloadRequest {
// Databento dataset (e.g., "GLBX.MDP3" for CME futures)
string dataset = 1;
// List of symbols to download (e.g., ["ES.FUT", "NQ.FUT"])
repeated string symbols = 2;
// Start date in YYYY-MM-DD format
string start_date = 3;
// End date in YYYY-MM-DD format
string end_date = 4;
// Schema type (e.g., "ohlcv-1m", "mbp-10", "trades")
string schema = 5;
// Optional description for this download
string description = 6;
// Optional tags for categorization
map<string, string> tags = 7;
// Priority level (1=low, 5=high)
uint32 priority = 8;
}
message ScheduleDownloadResponse {
// Unique job identifier
string job_id = 1;
// Initial job status
DownloadStatus status = 2;
// Estimated cost in USD
double estimated_cost_usd = 3;
// Human-readable message
string message = 4;
}
message GetDownloadStatusRequest {
string job_id = 1;
}
message GetDownloadStatusResponse {
DownloadJobDetails job_details = 1;
}
message CancelDownloadRequest {
string job_id = 1;
string reason = 2; // Optional cancellation reason
}
message CancelDownloadResponse {
bool success = 1;
string message = 2;
}
message ListDownloadJobsRequest {
uint32 page = 1;
uint32 page_size = 2;
DownloadStatus status_filter = 3;
int64 start_time = 4; // Unix timestamp
int64 end_time = 5; // Unix timestamp
}
message ListDownloadJobsResponse {
repeated DownloadJobSummary jobs = 1;
uint32 total_count = 2;
uint32 page = 3;
uint32 page_size = 4;
}
message HealthCheckRequest {}
message HealthCheckResponse {
bool healthy = 1;
string message = 2;
map<string, string> details = 3;
}
// --- Status and Details Messages ---
enum DownloadStatus {
DOWNLOAD_STATUS_UNKNOWN = 0;
PENDING = 1; // Queued, waiting to start
DOWNLOADING = 2; // Actively downloading from Databento
VALIDATING = 3; // Validating data quality
UPLOADING = 4; // Uploading to MinIO
COMPLETED = 5; // Successfully completed
FAILED = 6; // Failed with errors
CANCELLED = 7; // Cancelled by user
}
message DownloadJobDetails {
string job_id = 1;
DownloadStatus status = 2;
string dataset = 3;
repeated string symbols = 4;
string start_date = 5;
string end_date = 6;
string schema = 7;
string description = 8;
map<string, string> tags = 9;
uint32 priority = 10;
// Progress tracking
float progress_percentage = 11; // 0.0 to 100.0
uint64 bytes_downloaded = 12;
uint64 total_bytes = 13;
// Cost tracking
double estimated_cost_usd = 14;
double actual_cost_usd = 15;
// Quality metrics
uint64 records_count = 16;
uint64 invalid_records = 17;
double data_quality_score = 18; // 0.0 to 1.0
// Storage paths
string local_path = 19;
string minio_path = 20;
// Timestamps
int64 created_at = 21; // Unix timestamp
int64 started_at = 22;
int64 completed_at = 23;
// Error information
string error_message = 24;
uint32 retry_count = 25;
// Metadata
string created_by = 26;
}
message DownloadJobSummary {
string job_id = 1;
DownloadStatus status = 2;
string dataset = 3;
repeated string symbols = 4;
string start_date = 5;
string end_date = 6;
float progress_percentage = 7;
double actual_cost_usd = 8;
int64 created_at = 9;
int64 completed_at = 10;
}

View File

@@ -12,9 +12,9 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
// Suppress warnings in generated code
.server_mod_attribute(".", "#[allow(unused_qualifications)]")
.client_mod_attribute(".", "#[allow(unused_qualifications)]")
.compile_protos(&["proto/ml_training.proto"], &["proto"])?;
.compile_protos(&["../../proto/ml_training.proto"], &["../../proto"])?;
// Compile TLI BacktestingService proto (client only -- for validation pipeline)
// Compile fat-client trading proto for BacktestingService (client only -- for validation pipeline)
config
.build_server(false)
.build_client(true)
@@ -24,12 +24,12 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
.server_mod_attribute(".", "#[allow(unused_qualifications)]")
.client_mod_attribute(".", "#[allow(unused_qualifications)]")
.compile_protos(
&["../../bin/fxt/proto/trading.proto"],
&["../../bin/fxt/proto"],
&["../../proto/fxt_trading.proto"],
&["../../proto"],
)?;
println!("cargo:rerun-if-changed=proto/ml_training.proto");
println!("cargo:rerun-if-changed=../../bin/fxt/proto/trading.proto");
println!("cargo:rerun-if-changed=../../proto/ml_training.proto");
println!("cargo:rerun-if-changed=../../proto/fxt_trading.proto");
Ok(())
}

View File

@@ -1,612 +0,0 @@
syntax = "proto3";
package ml_training;
// ML Training Service provides comprehensive machine learning model training capabilities for HFT systems.
// This service manages training jobs for MAMBA-2, TLOB transformers, DQN, PPO, Liquid Networks, and TFT models
// with real-time progress monitoring, resource management, and performance tracking.
service MLTrainingService {
// Training Job Management
// Initiates a new training job and returns job ID immediately
rpc StartTraining(StartTrainingRequest) returns (StartTrainingResponse);
// Subscribe to real-time training progress and status updates
rpc SubscribeToTrainingStatus(SubscribeToTrainingStatusRequest) returns (stream TrainingStatusUpdate);
// Stop a running training job (idempotent operation)
rpc StopTraining(StopTrainingRequest) returns (StopTrainingResponse);
// Model and Job Discovery
// List available ML models with their training parameters
rpc ListAvailableModels(ListAvailableModelsRequest) returns (ListAvailableModelsResponse);
// Get paginated list of training job history
rpc ListTrainingJobs(ListTrainingJobsRequest) returns (ListTrainingJobsResponse);
// Get comprehensive details for a specific training job
rpc GetTrainingJobDetails(GetTrainingJobDetailsRequest) returns (GetTrainingJobDetailsResponse);
// Service Health and Status
// Check service health and resource availability
rpc HealthCheck(HealthCheckRequest) returns (HealthCheckResponse);
// Hyperparameter Tuning Management
// Start a new hyperparameter tuning job using Optuna
rpc StartTuningJob(StartTuningJobRequest) returns (StartTuningJobResponse);
// Get current status and best parameters from a tuning job
rpc GetTuningJobStatus(GetTuningJobStatusRequest) returns (GetTuningJobStatusResponse);
// Stop a running hyperparameter tuning job
rpc StopTuningJob(StopTuningJobRequest) returns (StopTuningJobResponse);
// INTERNAL: Train a single model instance with specific hyperparameters (called by Optuna subprocess)
rpc TrainModel(TrainModelRequest) returns (TrainModelResponse);
// Stream real-time tuning progress updates (trial completion events)
rpc StreamTuningProgress(StreamProgressRequest) returns (stream ProgressUpdate);
// Batch Tuning Management
// Start batch tuning job for multiple models with automatic dependency resolution
rpc BatchStartTuningJobs(BatchStartTuningJobsRequest) returns (BatchStartTuningJobsResponse);
// Get batch tuning job status with per-model results
rpc GetBatchTuningStatus(GetBatchTuningStatusRequest) returns (GetBatchTuningStatusResponse);
// Stop a running batch tuning job
rpc StopBatchTuningJob(StopBatchTuningJobRequest) returns (StopBatchTuningJobResponse);
// Job Completion Callback (called by training-uploader sidecar)
rpc ReportJobCompletion(JobCompletionReport) returns (JobCompletionAck);
// Model Promotion Management
rpc ListPendingPromotions(ListPendingPromotionsRequest) returns (ListPendingPromotionsResponse);
rpc ApprovePromotion(ApprovePromotionRequest) returns (ApprovePromotionResponse);
rpc RejectPromotion(RejectPromotionRequest) returns (RejectPromotionResponse);
// Model approval / rejection (dashboard-facing, delegates to promotion pipeline)
rpc ApproveModel(ApproveModelRequest) returns (ApproveModelResponse);
rpc RejectModel(RejectModelRequest) returns (RejectModelResponse);
}
// --- Core Request/Response Messages ---
// Training mode selection
enum TrainingMode {
TRAINING_MODE_FULL = 0; // Full training from scratch (default, backward-compatible)
TRAINING_MODE_FINE_TUNE = 1; // Fine-tune from existing checkpoint
}
// Request to start a new model training job
message StartTrainingRequest {
string model_type = 1; // Model type ("TLOB", "MAMBA_2", "DQN", "PPO", "LIQUID", "TFT")
DataSource data_source = 2; // Training data source configuration
Hyperparameters hyperparameters = 3; // Model-specific training parameters
bool use_gpu = 4; // Whether to use GPU acceleration
string description = 5; // Optional job description
map<string, string> tags = 6; // Optional categorization tags
TrainingMode mode = 7; // FULL (default) or FINE_TUNE
string resume_checkpoint_path = 8; // Path to checkpoint for fine-tune
uint32 max_epochs = 9; // Override epoch count (0 = use default)
}
message StartTrainingResponse {
string job_id = 1;
TrainingStatus status = 2;
string message = 3;
}
message SubscribeToTrainingStatusRequest {
string job_id = 1;
}
// Real-time training progress update streamed from server
message TrainingStatusUpdate {
string job_id = 1; // Training job identifier
TrainingStatus status = 2; // Current job status
float progress_percentage = 3; // Training progress (0.0 to 100.0)
uint32 current_epoch = 4; // Current training epoch
uint32 total_epochs = 5; // Total epochs planned
map<string, float> metrics = 6; // Training metrics (loss, accuracy, sharpe_ratio, etc.)
string message = 7; // Human-readable status message
int64 timestamp = 8; // Update timestamp (Unix seconds)
FinancialMetrics financial_metrics = 9; // Financial performance metrics
ResourceUsage resource_usage = 10; // Current resource utilization
}
message StopTrainingRequest {
string job_id = 1;
string reason = 2; // Optional reason for stopping
}
message StopTrainingResponse {
bool success = 1;
string message = 2;
}
message ListAvailableModelsRequest {}
message ListAvailableModelsResponse {
repeated ModelDefinition models = 1;
}
message ListTrainingJobsRequest {
uint32 page = 1;
uint32 page_size = 2;
TrainingStatus status_filter = 3;
string model_type_filter = 4;
int64 start_time = 5; // Unix timestamp in seconds
int64 end_time = 6; // Unix timestamp in seconds
}
message ListTrainingJobsResponse {
repeated TrainingJobSummary jobs = 1;
uint32 total_count = 2;
uint32 page = 3;
uint32 page_size = 4;
}
message GetTrainingJobDetailsRequest {
string job_id = 1;
}
message GetTrainingJobDetailsResponse {
TrainingJobDetails job_details = 1;
}
message HealthCheckRequest {}
message HealthCheckResponse {
bool healthy = 1;
string message = 2;
map<string, string> details = 3;
}
// Request to start hyperparameter tuning job
message StartTuningJobRequest {
string model_type = 1; // Model type to tune ("TLOB", "MAMBA_2", "DQN", "PPO", "LIQUID", "TFT")
uint32 num_trials = 2; // Number of tuning trials to run
string config_path = 3; // Path to tuning configuration file (search space, objectives)
DataSource data_source = 4; // Training data source for all trials
bool use_gpu = 5; // Whether to use GPU acceleration
string description = 6; // Optional job description
map<string, string> tags = 7; // Optional categorization tags
}
message StartTuningJobResponse {
string job_id = 1; // Unique tuning job identifier
TuningJobStatus status = 2; // Initial job status
string message = 3; // Human-readable status message
}
// Request to query tuning job status
message GetTuningJobStatusRequest {
string job_id = 1; // Tuning job identifier
}
message GetTuningJobStatusResponse {
string job_id = 1; // Tuning job identifier
TuningJobStatus status = 2; // Current job status
uint32 current_trial = 3; // Current trial number (0-indexed)
uint32 total_trials = 4; // Total number of trials
map<string, float> best_params = 5; // Best hyperparameters found so far
map<string, float> best_metrics = 6; // Metrics for best parameters (sharpe_ratio, training_loss, etc.)
repeated TrialResult trial_history = 7; // Complete trial history
string message = 8; // Human-readable status message
int64 started_at = 9; // Job start time (Unix timestamp in seconds)
int64 updated_at = 10; // Last update time (Unix timestamp in seconds)
}
// Request to stop a tuning job
message StopTuningJobRequest {
string job_id = 1; // Tuning job identifier
string reason = 2; // Optional reason for stopping
}
message StopTuningJobResponse {
bool success = 1; // Whether stop was successful
string message = 2; // Human-readable status message
TuningJobStatus final_status = 3; // Final job status after stopping
}
// INTERNAL: Request to train a model with specific hyperparameters (called by Optuna)
message TrainModelRequest {
string model_type = 1; // Model type ("TLOB", "MAMBA_2", "DQN", "PPO", "LIQUID", "TFT")
map<string, float> hyperparameters = 2; // Hyperparameters to use for this trial
DataSource data_source = 3; // Training data source
bool use_gpu = 4; // Whether to use GPU acceleration
string trial_id = 5; // Optuna trial identifier for tracking
}
message TrainModelResponse {
bool success = 1; // Whether training succeeded
float sharpe_ratio = 2; // Primary optimization objective (Sharpe ratio)
float training_loss = 3; // Final training loss
map<string, float> validation_metrics = 4; // Additional validation metrics
string error_message = 5; // Error message if training failed
int64 training_duration_seconds = 6; // Total training time
}
// Individual trial result for tuning job history
message TrialResult {
uint32 trial_number = 1; // Trial index
map<string, float> params = 2; // Hyperparameters tested
float objective_value = 3; // Objective metric (e.g., Sharpe ratio)
map<string, float> metrics = 4; // Additional metrics
TrialState state = 5; // Trial outcome state
int64 started_at = 6; // Trial start time (Unix timestamp in seconds)
int64 completed_at = 7; // Trial completion time (Unix timestamp in seconds)
}
// Request to stream tuning progress updates
message StreamProgressRequest {
string job_id = 1; // Tuning job identifier to subscribe to
}
// Real-time progress update streamed after each trial completes
message ProgressUpdate {
string job_id = 1; // Tuning job identifier
uint32 current_trial = 2; // Current trial number (0-indexed)
uint32 total_trials = 3; // Total number of trials
map<string, string> trial_params = 4; // Current trial hyperparameters (as strings for display)
float trial_sharpe = 5; // Current trial's Sharpe ratio (objective value)
float best_sharpe_so_far = 6; // Best Sharpe ratio achieved so far
uint32 estimated_time_remaining = 7; // Estimated seconds until completion
TuningJobStatus status = 8; // Current job status
string message = 9; // Human-readable status message
int64 timestamp = 10; // Update timestamp (Unix seconds)
UpdateType update_type = 11; // Type of update (trial completion, heartbeat, job complete)
}
// Type of progress update
enum UpdateType {
UPDATE_UNKNOWN = 0; // Unknown/unspecified
UPDATE_TRIAL_COMPLETE = 1; // Trial completed
UPDATE_HEARTBEAT = 2; // Keepalive heartbeat (no trial change)
UPDATE_JOB_COMPLETE = 3; // Job completed/stopped/failed
}
// --- Enums ---
// Current status of a training job
enum TrainingStatus {
UNKNOWN = 0; // Default/unknown status
PENDING = 1; // Job queued, waiting to start
RUNNING = 2; // Job currently executing
COMPLETED = 3; // Job finished successfully
FAILED = 4; // Job failed with error
STOPPED = 5; // Job manually stopped
PAUSED = 6; // Job temporarily paused
}
// Status of a hyperparameter tuning job
enum TuningJobStatus {
TUNING_UNKNOWN = 0; // Default/unknown status
TUNING_PENDING = 1; // Job queued, waiting to start
TUNING_RUNNING = 2; // Job currently executing trials
TUNING_COMPLETED = 3; // Job finished all trials successfully
TUNING_FAILED = 4; // Job failed with error
TUNING_STOPPED = 5; // Job manually stopped before completion
}
// Outcome state of an individual trial
enum TrialState {
TRIAL_UNKNOWN = 0; // Default/unknown state
TRIAL_RUNNING = 1; // Trial currently executing
TRIAL_COMPLETE = 2; // Trial completed successfully
TRIAL_PRUNED = 3; // Trial pruned by Optuna (early stopping)
TRIAL_FAILED = 4; // Trial failed with error
}
// --- Data Structures ---
message DataSource {
oneof source {
string historical_db_query = 1;
string real_time_stream_topic = 2;
string file_path = 3;
}
int64 start_time = 4; // Unix timestamp in seconds
int64 end_time = 5; // Unix timestamp in seconds
}
// Provides type-safe hyperparameter configuration.
message Hyperparameters {
oneof model_params {
TlobParams tlob_params = 1;
MambaParams mamba_params = 2;
DqnParams dqn_params = 3;
PpoParams ppo_params = 4;
LiquidParams liquid_params = 5;
TftParams tft_params = 6;
}
}
// TLOB (Time-Limit Order Book) Transformer parameters
message TlobParams {
uint32 epochs = 1;
float learning_rate = 2;
uint32 batch_size = 3;
uint32 sequence_length = 4;
uint32 hidden_dim = 5;
uint32 num_heads = 6;
uint32 num_layers = 7;
float dropout_rate = 8;
bool use_positional_encoding = 9;
}
// MAMBA-2 State Space Model parameters
message MambaParams {
uint32 epochs = 1;
float learning_rate = 2;
uint32 batch_size = 3;
uint32 state_dim = 4;
uint32 hidden_dim = 5;
uint32 num_layers = 6;
float dt_min = 7;
float dt_max = 8;
bool use_cuda_kernels = 9;
}
// DQN (Deep Q-Network) parameters
message DqnParams {
uint32 epochs = 1;
float learning_rate = 2;
uint32 batch_size = 3;
uint32 replay_buffer_size = 4;
float epsilon_start = 5;
float epsilon_end = 6;
uint32 epsilon_decay_steps = 7;
float gamma = 8;
uint32 target_update_frequency = 9;
bool use_double_dqn = 10;
bool use_dueling = 11;
bool use_prioritized_replay = 12;
}
// PPO (Proximal Policy Optimization) parameters
message PpoParams {
uint32 epochs = 1;
float learning_rate = 2;
uint32 batch_size = 3;
float clip_ratio = 4;
float value_loss_coef = 5;
float entropy_coef = 6;
uint32 rollout_steps = 7;
uint32 minibatch_size = 8;
float gae_lambda = 9;
}
// Liquid Network parameters
message LiquidParams {
uint32 epochs = 1;
float learning_rate = 2;
uint32 batch_size = 3;
uint32 num_neurons = 4;
float tau = 5;
float sigma = 6;
bool use_adaptive_tau = 7;
}
// Temporal Fusion Transformer parameters
message TftParams {
uint32 epochs = 1;
float learning_rate = 2;
uint32 batch_size = 3;
uint32 hidden_dim = 4;
uint32 num_heads = 5;
uint32 num_layers = 6;
uint32 lookback_window = 7;
uint32 forecast_horizon = 8;
float dropout_rate = 9;
}
message ModelDefinition {
string model_type = 1;
string description = 2;
Hyperparameters default_hyperparameters = 3;
repeated string required_features = 4;
uint32 estimated_training_time_minutes = 5;
bool requires_gpu = 6;
}
message TrainingJobSummary {
string job_id = 1;
string model_type = 2;
TrainingStatus status = 3;
int64 created_at = 4; // Unix timestamp in seconds
int64 started_at = 5; // Unix timestamp in seconds
int64 completed_at = 6; // Unix timestamp in seconds
string description = 7;
float final_loss = 8;
float best_validation_score = 9;
map<string, string> tags = 10;
}
message TrainingJobDetails {
string job_id = 1;
string model_type = 2;
TrainingStatus status = 3;
int64 created_at = 4; // Unix timestamp in seconds
int64 started_at = 5; // Unix timestamp in seconds
int64 completed_at = 6; // Unix timestamp in seconds
string description = 7;
Hyperparameters hyperparameters = 8;
DataSource data_source = 9;
repeated TrainingStatusUpdate status_history = 10;
FinancialMetrics final_financial_metrics = 11;
string model_artifact_path = 12;
map<string, string> tags = 13;
string error_message = 14;
}
message FinancialMetrics {
float simulated_return = 1;
float sharpe_ratio = 2;
float max_drawdown = 3;
float hit_rate = 4;
float avg_prediction_error_bps = 5;
float risk_adjusted_return = 6;
float var_5pct = 7;
float expected_shortfall = 8;
}
message ResourceUsage {
float cpu_usage_percent = 1;
float memory_usage_gb = 2;
float gpu_usage_percent = 3;
float gpu_memory_usage_gb = 4;
uint32 active_workers = 5;
}
// --- Batch Tuning Messages ---
// Request to start batch tuning for multiple models
message BatchStartTuningJobsRequest {
repeated string model_types = 1; // List of models to tune (DQN, PPO, MAMBA_2, TFT, etc.)
uint32 trials_per_model = 2; // Number of trials for each model
string config_path = 3; // Path to tuning configuration file
DataSource data_source = 4; // Training data source for all models
bool use_gpu = 5; // Whether to use GPU acceleration
bool auto_export_yaml = 6; // Automatically export best params to YAML (default: true)
string yaml_export_path = 7; // Custom YAML export path (default: ml/config/best_hyperparameters.yaml)
string description = 8; // Optional batch job description
map<string, string> tags = 9; // Optional categorization tags
}
message BatchStartTuningJobsResponse {
string batch_id = 1; // Unique batch job identifier
repeated string execution_order = 2; // Model execution order (after dependency resolution)
string message = 3; // Human-readable status message
BatchTuningStatus status = 4; // Initial batch status
}
// Request to get batch tuning job status
message GetBatchTuningStatusRequest {
string batch_id = 1; // Batch job identifier
}
message GetBatchTuningStatusResponse {
string batch_id = 1; // Batch job identifier
BatchTuningStatus status = 2; // Current batch status
uint32 current_model_index = 3; // Index of currently executing model (0-based)
uint32 total_models = 4; // Total number of models in batch
repeated ModelTuningResult results = 5; // Results for completed models
string current_model = 6; // Currently tuning model type
int64 started_at = 7; // Batch start time (Unix timestamp)
int64 updated_at = 8; // Last update time (Unix timestamp)
int64 estimated_completion_time = 9; // Estimated completion time (Unix timestamp)
string yaml_export_path = 10; // Path where YAML will be exported
}
// Individual model tuning result within batch
message ModelTuningResult {
string model_type = 1; // Model type (DQN, PPO, etc.)
string job_id = 2; // Individual tuning job ID
TuningJobStatus status = 3; // Model tuning status
map<string, float> best_params = 4; // Best hyperparameters found
map<string, float> best_metrics = 5; // Best metrics achieved
uint32 trials_completed = 6; // Number of trials completed
int64 started_at = 7; // Model tuning start time
int64 completed_at = 8; // Model tuning completion time
string error_message = 9; // Error message if failed
}
// Request to stop batch tuning job
message StopBatchTuningJobRequest {
string batch_id = 1; // Batch job identifier
string reason = 2; // Optional reason for stopping
}
message StopBatchTuningJobResponse {
bool success = 1; // Whether stop was successful
string message = 2; // Human-readable status message
BatchTuningStatus final_status = 3; // Final batch status
repeated ModelTuningResult completed_results = 4; // Results for completed models
}
// Batch tuning job status
enum BatchTuningStatus {
BATCH_UNKNOWN = 0; // Default/unknown status
BATCH_PENDING = 1; // Batch queued, waiting to start
BATCH_RUNNING = 2; // Batch currently executing models
BATCH_COMPLETED = 3; // All models completed successfully
BATCH_PARTIALLY_COMPLETED = 4; // Some models succeeded, some failed
BATCH_FAILED = 5; // Batch failed (all models failed or critical error)
BATCH_STOPPED = 6; // Batch manually stopped
}
// --- Job Completion Callback (from training-uploader sidecar) ---
message JobCompletionReport {
string job_id = 1;
string s3_path = 2;
bool success = 3;
string error_message = 4;
map<string, double> metrics = 5;
}
message JobCompletionAck {
bool accepted = 1;
string promotion_status = 2;
}
// --- Model Promotion ---
message ListPendingPromotionsRequest {}
message ListPendingPromotionsResponse {
repeated PendingPromotion promotions = 1;
}
message PendingPromotion {
string model_id = 1;
string model_type = 2;
string symbol = 3;
string s3_path = 4;
map<string, double> new_metrics = 5;
map<string, double> current_metrics = 6;
int64 trained_at = 7;
string job_id = 8;
}
message ApprovePromotionRequest {
string model_id = 1;
}
message ApprovePromotionResponse {
bool success = 1;
string message = 2;
}
message RejectPromotionRequest {
string model_id = 1;
string reason = 2;
}
message RejectPromotionResponse {
bool success = 1;
string message = 2;
}
// --- Model Approval / Rejection (dashboard-facing) ---
message ApproveModelRequest {
string model_id = 1;
string promoted_to = 2; // e.g. "production", "staging", "canary"
}
message ApproveModelResponse {
bool success = 1;
string message = 2;
}
message RejectModelRequest {
string model_id = 1;
string reason = 2;
}
message RejectModelResponse {
bool success = 1;
string message = 2;
}

View File

@@ -1,4 +1,8 @@
fn main() -> Result<(), Box<dyn std::error::Error>> {
// NOTE: monitoring_service still uses its own local proto with only 3 training RPCs.
// The canonical proto/monitoring.proto has the full merged set (system health + training).
// This service will be deleted in Task 5 (absorbed into api_gateway), so we keep
// the local proto to avoid implementing 13 unneeded system health RPCs.
tonic_prost_build::configure()
.build_server(true)
.build_client(false)

View File

@@ -1,6 +1,10 @@
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Compile proto files for Trading Agent Service
tonic_prost_build::compile_protos("proto/trading_agent.proto")?;
tonic_prost_build::configure()
.compile_protos(
&["../../proto/trading_agent.proto"],
&["../../proto"],
)?;
// ML service client for GetEnsembleVote (ensemble confidence)
tonic_prost_build::configure()
@@ -8,11 +12,12 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
.build_client(true)
.client_mod_attribute(".", "#[allow(unused_qualifications)]")
.compile_protos(
&["../trading_service/proto/ml.proto"],
&["../trading_service/proto"],
&["../../proto/ml.proto"],
&["../../proto"],
)?;
println!("cargo:rerun-if-changed=../trading_service/proto/ml.proto");
println!("cargo:rerun-if-changed=../../proto/trading_agent.proto");
println!("cargo:rerun-if-changed=../../proto/ml.proto");
Ok(())
}

View File

@@ -1,615 +0,0 @@
syntax = "proto3";
package trading_agent;
// Trading Agent Service orchestrates trading decisions across universe selection,
// asset selection, portfolio allocation, and strategy coordination.
service TradingAgentService {
// Universe Management
// Select tradable universe based on liquidity, volatility, and ML signals
rpc SelectUniverse(SelectUniverseRequest) returns (SelectUniverseResponse);
// Get current trading universe configuration
rpc GetUniverse(GetUniverseRequest) returns (GetUniverseResponse);
// Update universe selection criteria
rpc UpdateUniverseCriteria(UpdateUniverseCriteriaRequest) returns (UpdateUniverseCriteriaResponse);
// Asset Selection
// Select specific assets to trade within universe
rpc SelectAssets(SelectAssetsRequest) returns (SelectAssetsResponse);
// Get current asset selection with scores
rpc GetSelectedAssets(GetSelectedAssetsRequest) returns (GetSelectedAssetsResponse);
// Portfolio Allocation
// Allocate capital across selected assets
rpc AllocatePortfolio(AllocatePortfolioRequest) returns (AllocatePortfolioResponse);
// Get current portfolio allocation
rpc GetAllocation(GetAllocationRequest) returns (GetAllocationResponse);
// Rebalance portfolio based on target allocation
rpc RebalancePortfolio(RebalancePortfolioRequest) returns (RebalancePortfolioResponse);
// Order Generation
// Generate orders based on allocation and ML signals
rpc GenerateOrders(GenerateOrdersRequest) returns (GenerateOrdersResponse);
// Submit generated orders to Trading Service
rpc SubmitAgentOrders(SubmitAgentOrdersRequest) returns (SubmitAgentOrdersResponse);
// Strategy Coordination
// Register a trading strategy with the agent
rpc RegisterStrategy(RegisterStrategyRequest) returns (RegisterStrategyResponse);
// Get list of active strategies
rpc ListStrategies(ListStrategiesRequest) returns (ListStrategiesResponse);
// Enable/disable a strategy
rpc UpdateStrategyStatus(UpdateStrategyStatusRequest) returns (UpdateStrategyStatusResponse);
// Agent Monitoring
// Get comprehensive agent status and performance
rpc GetAgentStatus(GetAgentStatusRequest) returns (GetAgentStatusResponse);
// Stream real-time agent decisions and actions
rpc StreamAgentActivity(StreamAgentActivityRequest) returns (stream AgentActivityEvent);
// Get agent performance metrics
rpc GetAgentPerformance(GetAgentPerformanceRequest) returns (GetAgentPerformanceResponse);
// Service Health
rpc HealthCheck(HealthCheckRequest) returns (HealthCheckResponse);
}
// Universe Selection Messages
message SelectUniverseRequest {
UniverseCriteria criteria = 1; // Selection criteria
optional uint32 max_instruments = 2; // Maximum instruments in universe
bool force_refresh = 3; // Force recalculation
}
message SelectUniverseResponse {
repeated Instrument instruments = 1; // Selected instruments
UniverseMetrics metrics = 2; // Universe quality metrics
int64 timestamp = 3; // Selection timestamp (nanoseconds)
string universe_id = 4; // Unique universe identifier
}
message GetUniverseRequest {
optional string universe_id = 1; // Get specific universe, or current if not specified
}
message GetUniverseResponse {
string universe_id = 1;
repeated Instrument instruments = 2;
UniverseCriteria criteria = 3;
UniverseMetrics metrics = 4;
int64 created_at = 5; // Unix timestamp (nanoseconds)
int64 updated_at = 6;
}
message UpdateUniverseCriteriaRequest {
UniverseCriteria criteria = 1;
}
message UpdateUniverseCriteriaResponse {
bool success = 1;
string message = 2;
string universe_id = 3; // New universe ID after update
}
// Asset Selection Messages
message SelectAssetsRequest {
string universe_id = 1; // Universe to select from
AssetSelectionCriteria criteria = 2; // Selection criteria
uint32 max_assets = 3; // Maximum assets to select
}
message SelectAssetsResponse {
repeated AssetScore assets = 1; // Selected assets with scores
SelectionMetrics metrics = 2; // Selection quality metrics
int64 timestamp = 3;
}
message GetSelectedAssetsRequest {
optional string universe_id = 1;
}
message GetSelectedAssetsResponse {
repeated AssetScore assets = 1;
SelectionMetrics metrics = 2;
int64 timestamp = 3;
}
// Portfolio Allocation Messages
message AllocatePortfolioRequest {
repeated AssetScore assets = 1; // Assets to allocate across
AllocationStrategy strategy = 2; // Allocation algorithm
RiskConstraints risk_constraints = 3; // Risk limits
double total_capital = 4; // Total capital to allocate
}
message AllocatePortfolioResponse {
repeated AssetAllocation allocations = 1; // Allocation per asset
AllocationMetrics metrics = 2; // Allocation quality metrics
int64 timestamp = 3;
string allocation_id = 4;
}
message GetAllocationRequest {
optional string allocation_id = 1; // Get specific allocation, or current if not specified
}
message GetAllocationResponse {
string allocation_id = 1;
repeated AssetAllocation allocations = 2;
AllocationMetrics metrics = 3;
int64 created_at = 4;
double total_capital = 5;
}
message RebalancePortfolioRequest {
string allocation_id = 1; // Target allocation
double rebalance_threshold = 2; // Min deviation to trigger rebalance (%)
bool force_rebalance = 3; // Force rebalance regardless of threshold
}
message RebalancePortfolioResponse {
repeated RebalanceAction actions = 1; // Required rebalancing actions
RebalanceMetrics metrics = 2;
bool rebalance_required = 3;
int64 timestamp = 4;
}
// Order Generation Messages
message GenerateOrdersRequest {
string allocation_id = 1; // Target allocation
repeated MLSignal ml_signals = 2; // ML predictions for timing
OrderGenerationStrategy strategy = 3; // Order generation algorithm
}
message GenerateOrdersResponse {
repeated GeneratedOrder orders = 1; // Generated order instructions
OrderGenerationMetrics metrics = 2;
int64 timestamp = 3;
string order_batch_id = 4;
}
message SubmitAgentOrdersRequest {
string order_batch_id = 1; // Batch ID from GenerateOrders
repeated GeneratedOrder orders = 2; // Orders to submit
bool dry_run = 3; // Test without actual submission
}
message SubmitAgentOrdersResponse {
repeated OrderSubmissionResult results = 1; // Submission results per order
OrderSubmissionMetrics metrics = 2;
int64 timestamp = 3;
}
// Strategy Coordination Messages
message RegisterStrategyRequest {
string strategy_name = 1; // Unique strategy name
StrategyType strategy_type = 2; // Strategy category
StrategyConfig config = 3; // Strategy configuration
bool auto_enable = 4; // Enable immediately after registration
}
message RegisterStrategyResponse {
bool success = 1;
string strategy_id = 2;
string message = 3;
}
message ListStrategiesRequest {
optional StrategyStatus status_filter = 1; // Filter by status
}
message ListStrategiesResponse {
repeated Strategy strategies = 1;
}
message UpdateStrategyStatusRequest {
string strategy_id = 1;
StrategyStatus new_status = 2;
optional string reason = 3;
}
message UpdateStrategyStatusResponse {
bool success = 1;
string message = 2;
Strategy updated_strategy = 3;
}
// Agent Monitoring Messages
message GetAgentStatusRequest {
bool include_performance = 1; // Include performance metrics
bool include_positions = 2; // Include current positions
}
message GetAgentStatusResponse {
AgentStatus status = 1;
optional AgentPerformanceMetrics performance = 2;
optional PositionSummary positions = 3;
int64 timestamp = 4;
}
message StreamAgentActivityRequest {
repeated ActivityType activity_types = 1; // Filter by activity type
}
message AgentActivityEvent {
ActivityType activity_type = 1;
oneof event {
UniverseSelectionEvent universe_event = 2;
AssetSelectionEvent asset_event = 3;
AllocationEvent allocation_event = 4;
OrderGenerationEvent order_event = 5;
StrategyEvent strategy_event = 6;
}
int64 timestamp = 7;
}
message GetAgentPerformanceRequest {
optional int64 start_time = 1; // Performance window start (nanoseconds)
optional int64 end_time = 2; // Performance window end (nanoseconds)
bool include_strategy_breakdown = 3; // Include per-strategy performance
}
message GetAgentPerformanceResponse {
AgentPerformanceMetrics metrics = 1;
repeated StrategyPerformance strategy_performance = 2;
int64 timestamp = 3;
}
message HealthCheckRequest {}
message HealthCheckResponse {
bool healthy = 1;
string message = 2;
map<string, string> details = 3;
}
// Data Structures
message Instrument {
string symbol = 1; // Trading symbol (ES.FUT, NQ.FUT)
string exchange = 2; // Exchange identifier
InstrumentType instrument_type = 3; // Futures, equity, FX, etc.
double liquidity_score = 4; // Liquidity rating (0.0-1.0)
double volatility = 5; // Annualized volatility
double ml_signal_strength = 6; // ML prediction confidence
map<string, string> metadata = 7;
}
message UniverseCriteria {
double min_liquidity_score = 1; // Minimum liquidity threshold
double min_volatility = 2; // Minimum volatility
double max_volatility = 3; // Maximum volatility
repeated InstrumentType allowed_types = 4;
repeated string exchanges = 5; // Allowed exchanges
double min_ml_confidence = 6; // Minimum ML signal confidence
}
message UniverseMetrics {
uint32 total_instruments = 1;
double avg_liquidity_score = 2;
double avg_volatility = 3;
double portfolio_diversification = 4; // 0.0-1.0
}
message AssetSelectionCriteria {
double min_ml_signal_strength = 1; // Minimum ML confidence
double min_sharpe_ratio = 2; // Minimum risk-adjusted return
SelectionMode mode = 3; // Top-N, threshold-based, etc.
}
message AssetScore {
string symbol = 1;
double ml_score = 2; // ML model prediction score
double momentum_score = 3; // Momentum factor score
double value_score = 4; // Value factor score
double quality_score = 5; // Quality factor score
double composite_score = 6; // Final weighted score
map<string, double> model_scores = 7; // Per-model scores (DQN, MAMBA2, etc.)
}
message SelectionMetrics {
uint32 assets_evaluated = 1;
uint32 assets_selected = 2;
double avg_composite_score = 3;
double min_score = 4;
double max_score = 5;
}
message AllocationStrategy {
AllocationType allocation_type = 1; // Equal-weight, risk-parity, etc.
map<string, double> parameters = 2; // Strategy-specific parameters
}
message RiskConstraints {
double max_position_size_pct = 1; // Max % of portfolio per position
double max_sector_exposure_pct = 2; // Max % per sector
double max_volatility = 3; // Portfolio volatility limit
double max_var_95 = 4; // Value at Risk (95%)
double max_leverage = 5; // Maximum leverage ratio
}
message AssetAllocation {
string symbol = 1;
double target_weight = 2; // Target allocation weight (0.0-1.0)
double target_capital = 3; // Target capital in USD
double target_quantity = 4; // Target position size
double current_weight = 5; // Current allocation weight
double current_quantity = 6; // Current position size
double rebalance_delta = 7; // Required change
}
message AllocationMetrics {
double total_weight = 1; // Should be ~1.0
double portfolio_volatility = 2; // Expected portfolio volatility
double portfolio_sharpe = 3; // Expected Sharpe ratio
double var_95 = 4; // Portfolio VaR (95%)
double max_drawdown_estimate = 5; // Expected max drawdown
}
message RebalanceAction {
string symbol = 1;
double current_quantity = 2;
double target_quantity = 3;
double delta_quantity = 4; // Positive = buy, negative = sell
RebalanceReason reason = 5;
}
message RebalanceMetrics {
uint32 total_rebalance_actions = 1;
double total_turnover = 2; // Total capital moved (USD)
double estimated_cost = 3; // Estimated transaction costs
}
message MLSignal {
string symbol = 1;
string model_name = 2; // DQN, MAMBA2, PPO, TFT
double signal_strength = 3; // -1.0 to 1.0 (short to long)
double confidence = 4; // 0.0 to 1.0
string predicted_action = 5; // BUY, SELL, HOLD
int64 timestamp = 6;
}
message OrderGenerationStrategy {
OrderGenerationMode mode = 1;
double slippage_tolerance = 2; // Max acceptable slippage (%)
bool use_limit_orders = 3; // Use limit orders vs market
double limit_price_offset = 4; // Offset from mid price (%)
}
message GeneratedOrder {
string symbol = 1;
OrderSide side = 2; // BUY or SELL
double quantity = 3;
OrderType order_type = 4; // MARKET, LIMIT, etc.
optional double price = 5; // Limit price if applicable
string rationale = 6; // Why this order was generated
map<string, string> metadata = 7;
}
message OrderGenerationMetrics {
uint32 orders_generated = 1;
double total_notional = 2; // Total order value (USD)
double avg_order_size = 3;
}
message OrderSubmissionResult {
string symbol = 1;
bool success = 2;
optional string order_id = 3; // From Trading Service
optional string error_message = 4;
}
message OrderSubmissionMetrics {
uint32 orders_submitted = 1;
uint32 orders_accepted = 2;
uint32 orders_rejected = 3;
double acceptance_rate = 4;
}
message Strategy {
string strategy_id = 1;
string strategy_name = 2;
StrategyType strategy_type = 3;
StrategyStatus status = 4;
StrategyConfig config = 5;
StrategyPerformance performance = 6;
int64 created_at = 7;
int64 updated_at = 8;
}
message StrategyConfig {
map<string, string> parameters = 1; // Strategy-specific parameters
repeated string target_symbols = 2; // Symbols this strategy trades
double max_capital_pct = 3; // Max % of portfolio for this strategy
}
message StrategyPerformance {
string strategy_id = 1;
double total_pnl = 2;
double sharpe_ratio = 3;
double win_rate = 4;
uint32 total_trades = 5;
int64 period_start = 6;
int64 period_end = 7;
}
message AgentStatus {
AgentState state = 1;
string current_universe_id = 2;
uint32 active_strategies = 3;
uint32 selected_assets = 4;
double portfolio_utilization = 5; // % of capital deployed
int64 last_action_timestamp = 6;
}
message AgentPerformanceMetrics {
double total_pnl = 1;
double sharpe_ratio = 2;
double max_drawdown = 3;
double win_rate = 4;
uint32 total_trades = 5;
double avg_trade_pnl = 6;
double portfolio_turnover = 7; // Annualized
int64 period_start = 8;
int64 period_end = 9;
}
message PositionSummary {
repeated Position positions = 1;
double total_equity = 2;
double total_exposure = 3;
double leverage_ratio = 4;
}
message Position {
string symbol = 1;
double quantity = 2;
double average_price = 3;
double market_value = 4;
double unrealized_pnl = 5;
double weight = 6; // % of portfolio
}
message UniverseSelectionEvent {
string universe_id = 1;
repeated string added_symbols = 2;
repeated string removed_symbols = 3;
UniverseMetrics metrics = 4;
}
message AssetSelectionEvent {
repeated AssetScore selected_assets = 1;
SelectionMetrics metrics = 2;
}
message AllocationEvent {
string allocation_id = 1;
repeated AssetAllocation allocations = 2;
AllocationMetrics metrics = 3;
}
message OrderGenerationEvent {
string order_batch_id = 1;
repeated GeneratedOrder orders = 2;
OrderGenerationMetrics metrics = 3;
}
message StrategyEvent {
string strategy_id = 1;
StrategyEventType event_type = 2;
string message = 3;
}
// Enums
enum InstrumentType {
INSTRUMENT_TYPE_UNSPECIFIED = 0;
INSTRUMENT_TYPE_EQUITY = 1;
INSTRUMENT_TYPE_FUTURES = 2;
INSTRUMENT_TYPE_FX = 3;
INSTRUMENT_TYPE_OPTIONS = 4;
INSTRUMENT_TYPE_CRYPTO = 5;
}
enum SelectionMode {
SELECTION_MODE_UNSPECIFIED = 0;
SELECTION_MODE_TOP_N = 1; // Select top N by score
SELECTION_MODE_THRESHOLD = 2; // Select all above threshold
SELECTION_MODE_QUANTILE = 3; // Select top quantile (e.g., top 20%)
}
enum AllocationType {
ALLOCATION_TYPE_UNSPECIFIED = 0;
ALLOCATION_TYPE_EQUAL_WEIGHT = 1; // 1/N allocation
ALLOCATION_TYPE_RISK_PARITY = 2; // Equal risk contribution
ALLOCATION_TYPE_ML_OPTIMIZED = 3; // ML-based optimization
ALLOCATION_TYPE_KELLY = 4; // Kelly criterion
ALLOCATION_TYPE_MEAN_VARIANCE = 5; // Mean-variance optimization
}
enum RebalanceReason {
REBALANCE_REASON_UNSPECIFIED = 0;
REBALANCE_REASON_DRIFT = 1; // Allocation drifted from target
REBALANCE_REASON_UNIVERSE_CHANGE = 2; // Universe updated
REBALANCE_REASON_RISK_LIMIT = 3; // Risk limit violation
REBALANCE_REASON_MANUAL = 4; // Manual rebalance request
}
enum OrderGenerationMode {
ORDER_GENERATION_MODE_UNSPECIFIED = 0;
ORDER_GENERATION_MODE_AGGRESSIVE = 1; // Market orders, immediate execution
ORDER_GENERATION_MODE_PASSIVE = 2; // Limit orders, minimize slippage
ORDER_GENERATION_MODE_ADAPTIVE = 3; // Adapt based on market conditions
}
enum OrderSide {
ORDER_SIDE_UNSPECIFIED = 0;
ORDER_SIDE_BUY = 1;
ORDER_SIDE_SELL = 2;
}
enum OrderType {
ORDER_TYPE_UNSPECIFIED = 0;
ORDER_TYPE_MARKET = 1;
ORDER_TYPE_LIMIT = 2;
ORDER_TYPE_STOP = 3;
ORDER_TYPE_STOP_LIMIT = 4;
}
enum StrategyType {
STRATEGY_TYPE_UNSPECIFIED = 0;
STRATEGY_TYPE_ML_ENSEMBLE = 1; // Ensemble ML predictions
STRATEGY_TYPE_MEAN_REVERSION = 2; // Mean reversion
STRATEGY_TYPE_MOMENTUM = 3; // Momentum/trend following
STRATEGY_TYPE_ARBITRAGE = 4; // Statistical arbitrage
STRATEGY_TYPE_MARKET_MAKING = 5; // Market making
}
enum StrategyStatus {
STRATEGY_STATUS_UNSPECIFIED = 0;
STRATEGY_STATUS_ENABLED = 1;
STRATEGY_STATUS_DISABLED = 2;
STRATEGY_STATUS_PAUSED = 3;
STRATEGY_STATUS_ERROR = 4;
}
enum AgentState {
AGENT_STATE_UNSPECIFIED = 0;
AGENT_STATE_INITIALIZING = 1;
AGENT_STATE_ACTIVE = 2;
AGENT_STATE_PAUSED = 3;
AGENT_STATE_ERROR = 4;
AGENT_STATE_SHUTDOWN = 5;
}
enum ActivityType {
ACTIVITY_TYPE_UNSPECIFIED = 0;
ACTIVITY_TYPE_UNIVERSE_SELECTION = 1;
ACTIVITY_TYPE_ASSET_SELECTION = 2;
ACTIVITY_TYPE_ALLOCATION = 3;
ACTIVITY_TYPE_ORDER_GENERATION = 4;
ACTIVITY_TYPE_STRATEGY = 5;
}
enum StrategyEventType {
STRATEGY_EVENT_TYPE_UNSPECIFIED = 0;
STRATEGY_EVENT_TYPE_REGISTERED = 1;
STRATEGY_EVENT_TYPE_ENABLED = 2;
STRATEGY_EVENT_TYPE_DISABLED = 3;
STRATEGY_EVENT_TYPE_ERROR = 4;
}

View File

@@ -8,13 +8,13 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
.client_mod_attribute(".", "#[allow(unused_qualifications)]")
.compile_protos(
&[
"proto/trading.proto",
"proto/risk.proto",
"proto/ml.proto",
"proto/config.proto",
"proto/monitoring.proto",
"../../proto/trading.proto",
"../../proto/risk.proto",
"../../proto/ml.proto",
"../../proto/config.proto",
"../../proto/monitoring.proto",
],
&["proto"],
&["../../proto"],
)?;
// Compile ml_training.proto (client-only, for retrain_model forwarding)
@@ -23,11 +23,16 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
.build_client(true)
.client_mod_attribute(".", "#[allow(unused_qualifications)]")
.compile_protos(
&["../ml_training_service/proto/ml_training.proto"],
&["../ml_training_service/proto"],
&["../../proto/ml_training.proto"],
&["../../proto"],
)?;
println!("cargo:rerun-if-changed=../ml_training_service/proto/ml_training.proto");
println!("cargo:rerun-if-changed=../../proto/trading.proto");
println!("cargo:rerun-if-changed=../../proto/risk.proto");
println!("cargo:rerun-if-changed=../../proto/ml.proto");
println!("cargo:rerun-if-changed=../../proto/config.proto");
println!("cargo:rerun-if-changed=../../proto/monitoring.proto");
println!("cargo:rerun-if-changed=../../proto/ml_training.proto");
Ok(())
}

View File

@@ -1,326 +0,0 @@
syntax = "proto3";
package config;
// Configuration Service provides centralized, PostgreSQL-based configuration management with hot-reload capabilities.
// This service supports real-time configuration updates, validation, history tracking, and import/export functionality
// for all trading system components with comprehensive audit trails and rollback capabilities.
service ConfigService {
// Configuration CRUD Operations
// Get configuration settings by category, key, or environment
rpc GetConfiguration(GetConfigurationRequest) returns (GetConfigurationResponse);
// Update configuration value with validation and audit logging
rpc UpdateConfiguration(UpdateConfigurationRequest) returns (UpdateConfigurationResponse);
// Delete configuration setting with audit trail
rpc DeleteConfiguration(DeleteConfigurationRequest) returns (DeleteConfigurationResponse);
// List available configuration categories
rpc ListCategories(ListCategoriesRequest) returns (ListCategoriesResponse);
// Real-time Configuration Streaming
// Stream real-time configuration changes with hot-reload support
rpc StreamConfigChanges(StreamConfigChangesRequest) returns (stream ConfigChangeEvent);
// Configuration Management Operations
// Validate configuration value against schema and rules
rpc ValidateConfiguration(ValidateConfigurationRequest) returns (ValidateConfigurationResponse);
// Get configuration change history with audit details
rpc GetConfigurationHistory(GetConfigurationHistoryRequest) returns (GetConfigurationHistoryResponse);
// Rollback configuration to previous value
rpc RollbackConfiguration(RollbackConfigurationRequest) returns (RollbackConfigurationResponse);
// Export configuration data in various formats
rpc ExportConfiguration(ExportConfigurationRequest) returns (ExportConfigurationResponse);
// Import configuration data with validation
rpc ImportConfiguration(ImportConfigurationRequest) returns (ImportConfigurationResponse);
// Schema Management Operations
// Get configuration schema definitions
rpc GetConfigSchema(GetConfigSchemaRequest) returns (GetConfigSchemaResponse);
// Update configuration schema with validation rules
rpc UpdateConfigSchema(UpdateConfigSchemaRequest) returns (UpdateConfigSchemaResponse);
}
// Configuration CRUD Messages
message GetConfigurationRequest {
optional string category = 1;
optional string key = 2;
optional string environment = 3;
}
message GetConfigurationResponse {
repeated ConfigurationSetting settings = 1;
}
message UpdateConfigurationRequest {
string category = 1;
string key = 2;
string value = 3;
string changed_by = 4;
optional string change_reason = 5;
optional string environment = 6;
}
message UpdateConfigurationResponse {
bool success = 1;
string message = 2;
optional ValidationResult validation_result = 3;
int64 timestamp = 4;
}
message DeleteConfigurationRequest {
string category = 1;
string key = 2;
string deleted_by = 3;
optional string delete_reason = 4;
}
message DeleteConfigurationResponse {
bool success = 1;
string message = 2;
int64 timestamp = 3;
}
message ListCategoriesRequest {
optional string parent_category = 1;
}
message ListCategoriesResponse {
repeated ConfigurationCategory categories = 1;
}
// Streaming Messages
message StreamConfigChangesRequest {
repeated string categories = 1;
repeated string keys = 2;
}
// Validation Messages
message ValidateConfigurationRequest {
string category = 1;
string key = 2;
string value = 3;
}
message ValidateConfigurationResponse {
bool is_valid = 1;
ValidationResult validation_result = 2;
}
// History Messages
message GetConfigurationHistoryRequest {
optional string category = 1;
optional string key = 2;
optional int64 start_time = 3;
optional int64 end_time = 4;
optional int32 limit = 5;
}
message GetConfigurationHistoryResponse {
repeated ConfigurationHistoryEntry history = 1;
}
message RollbackConfigurationRequest {
string category = 1;
string key = 2;
int64 rollback_to_timestamp = 3;
string rolled_back_by = 4;
optional string rollback_reason = 5;
}
message RollbackConfigurationResponse {
bool success = 1;
string message = 2;
ConfigurationSetting restored_setting = 3;
int64 timestamp = 4;
}
// Import/Export Messages
message ExportConfigurationRequest {
repeated string categories = 1;
optional string environment = 2;
ExportFormat format = 3;
}
message ExportConfigurationResponse {
string exported_data = 1;
ExportFormat format = 2;
int32 settings_count = 3;
int64 exported_at = 4;
}
message ImportConfigurationRequest {
string imported_data = 1;
ExportFormat format = 2;
string imported_by = 3;
bool dry_run = 4;
bool overwrite_existing = 5;
}
message ImportConfigurationResponse {
bool success = 1;
string message = 2;
repeated ImportResult import_results = 3;
int32 imported_count = 4;
int32 skipped_count = 5;
int32 error_count = 6;
}
// Schema Messages
message GetConfigSchemaRequest {
optional string category = 1;
}
message GetConfigSchemaResponse {
repeated ConfigurationSchema schemas = 1;
}
message UpdateConfigSchemaRequest {
string schema_name = 1;
string schema_definition = 2;
string updated_by = 3;
}
message UpdateConfigSchemaResponse {
bool success = 1;
string message = 2;
int64 timestamp = 3;
}
// Core Data Types
// Complete configuration setting with metadata and validation rules
message ConfigurationSetting {
int64 id = 1; // Unique setting identifier
string category = 2; // Configuration category (e.g., "trading.limits")
string key = 3; // Configuration key (e.g., "max_position_size")
string value = 4; // Current configuration value
ConfigDataType data_type = 5; // Data type (string, number, boolean, etc.)
bool hot_reload = 6; // Whether changes trigger hot-reload
string description = 7; // Human-readable description
optional string default_value = 8; // Default value if not set
bool required = 9; // Whether this setting is required
bool sensitive = 10; // Whether value contains sensitive data
optional string validation_rule = 11; // Validation rule expression
optional string environment_override = 12; // Environment-specific override
optional double min_value = 13; // Minimum numeric value
optional double max_value = 14; // Maximum numeric value
optional string enum_values = 15; // Allowed enum values (comma-separated)
repeated string depends_on = 16; // Dependencies on other settings
repeated string tags = 17; // Tags for categorization
int32 display_order = 18; // Display order in UI
int64 created_at = 19; // Creation timestamp
int64 modified_at = 20; // Last modification timestamp
}
message ConfigurationCategory {
int64 id = 1;
string name = 2;
string description = 3;
optional int64 parent_id = 4;
int32 display_order = 5;
optional string icon = 6;
int64 created_at = 7;
repeated ConfigurationCategory children = 8;
}
message ConfigurationHistoryEntry {
int64 id = 1;
int64 setting_id = 2;
optional string old_value = 3;
string new_value = 4;
optional string change_reason = 5;
string changed_by = 6;
int64 changed_at = 7;
string change_source = 8;
optional ValidationResult validation_result = 9;
optional int64 rollback_id = 10;
}
message ConfigurationSchema {
int64 id = 1;
string name = 2;
string schema_definition = 3;
string description = 4;
int64 created_at = 5;
}
message ValidationResult {
bool is_valid = 1;
repeated ValidationError errors = 2;
repeated ValidationWarning warnings = 3;
}
message ValidationError {
string field = 1;
string message = 2;
string error_code = 3;
}
message ValidationWarning {
string field = 1;
string message = 2;
string warning_code = 3;
}
message ImportResult {
string category = 1;
string key = 2;
ImportStatus status = 3;
optional string error_message = 4;
}
// Event Messages
message ConfigChangeEvent {
int64 setting_id = 1;
string category = 2;
string key = 3;
string old_value = 4;
string new_value = 5;
string changed_by = 6;
int64 timestamp = 7;
ConfigChangeType change_type = 8;
bool hot_reload = 9;
}
// Enums
// Data types for configuration values
enum ConfigDataType {
CONFIG_DATA_TYPE_UNSPECIFIED = 0; // Default/unknown type
CONFIG_DATA_TYPE_STRING = 1; // Text string value
CONFIG_DATA_TYPE_NUMBER = 2; // Numeric value (int or float)
CONFIG_DATA_TYPE_BOOLEAN = 3; // Boolean true/false value
CONFIG_DATA_TYPE_JSON = 4; // JSON object or array
CONFIG_DATA_TYPE_ENCRYPTED = 5; // Encrypted sensitive value
}
enum ExportFormat {
EXPORT_FORMAT_UNSPECIFIED = 0;
EXPORT_FORMAT_JSON = 1;
EXPORT_FORMAT_YAML = 2;
EXPORT_FORMAT_TOML = 3;
EXPORT_FORMAT_ENV = 4;
}
enum ImportStatus {
IMPORT_STATUS_UNSPECIFIED = 0;
IMPORT_STATUS_SUCCESS = 1;
IMPORT_STATUS_SKIPPED = 2;
IMPORT_STATUS_ERROR = 3;
IMPORT_STATUS_VALIDATION_FAILED = 4;
}
enum ConfigChangeType {
CONFIG_CHANGE_TYPE_UNSPECIFIED = 0;
CONFIG_CHANGE_TYPE_CREATED = 1;
CONFIG_CHANGE_TYPE_UPDATED = 2;
CONFIG_CHANGE_TYPE_DELETED = 3;
CONFIG_CHANGE_TYPE_ROLLBACK = 4;
}

View File

@@ -1,344 +0,0 @@
syntax = "proto3";
package ml;
// ML Service provides machine learning model management, predictions, and insights for trading decisions.
// This service integrates multiple ML models including MAMBA-2, TLOB transformers, DQN, and PPO models
// to provide real-time predictions, ensemble voting, and model performance monitoring.
service MLService {
// Model Predictions and Inference
// Get single prediction from a specific model
rpc GetPrediction(GetPredictionRequest) returns (GetPredictionResponse);
// Stream real-time predictions from multiple models
rpc StreamPredictions(StreamPredictionsRequest) returns (stream PredictionEvent);
// Get ensemble voting results from multiple models
rpc GetEnsembleVote(GetEnsembleVoteRequest) returns (GetEnsembleVoteResponse);
// Model Lifecycle Management
// Get current status of ML models (health, performance, etc.)
rpc GetModelStatus(GetModelStatusRequest) returns (GetModelStatusResponse);
// List all available models and their capabilities
rpc GetAvailableModels(GetAvailableModelsRequest) returns (GetAvailableModelsResponse);
// Trigger model retraining with new data
rpc RetrainModel(RetrainModelRequest) returns (RetrainModelResponse);
// Model Performance and Analytics
// Get comprehensive performance metrics for a model
rpc GetModelPerformance(GetModelPerformanceRequest) returns (GetModelPerformanceResponse);
// Stream real-time model performance metrics
rpc StreamModelMetrics(StreamModelMetricsRequest) returns (stream ModelMetricsEvent);
// Feature Analysis and Signal Intelligence
// Get feature importance analysis for model interpretation
rpc GetFeatureImportance(GetFeatureImportanceRequest) returns (GetFeatureImportanceResponse);
// Stream real-time signal strength indicators across models
rpc StreamSignalStrength(StreamSignalStrengthRequest) returns (stream SignalStrengthEvent);
}
// Prediction Messages
// Request for model prediction
message GetPredictionRequest {
string model_name = 1; // Model to use (e.g., "mamba2", "tlob-transformer")
string symbol = 2; // Trading symbol to predict
optional int32 horizon_minutes = 3; // Prediction horizon in minutes
map<string, double> features = 4; // Input features for prediction
}
// Response containing model prediction
message GetPredictionResponse {
Prediction prediction = 1; // Model prediction with details
double confidence = 2; // Prediction confidence (0.0 to 1.0)
int64 timestamp = 3; // Prediction timestamp (nanoseconds)
}
message StreamPredictionsRequest {
repeated string model_names = 1;
repeated string symbols = 2;
optional int32 update_frequency_seconds = 3;
}
message GetEnsembleVoteRequest {
string symbol = 1;
optional int32 horizon_minutes = 2;
repeated string model_names = 3;
}
message GetEnsembleVoteResponse {
EnsembleVote ensemble_vote = 1;
repeated ModelVote individual_votes = 2;
double overall_confidence = 3;
int64 timestamp = 4;
}
// Model Management Messages
message GetModelStatusRequest {
optional string model_name = 1;
}
message GetModelStatusResponse {
repeated ModelStatus model_statuses = 1;
}
message GetAvailableModelsRequest {}
message GetAvailableModelsResponse {
repeated ModelInfo available_models = 1;
}
message RetrainModelRequest {
string model_name = 1;
optional int64 start_time = 2;
optional int64 end_time = 3;
map<string, string> parameters = 4;
}
message RetrainModelResponse {
bool success = 1;
string message = 2;
optional string job_id = 3;
int64 started_at = 4;
}
// Performance Messages
message GetModelPerformanceRequest {
string model_name = 1;
optional int64 start_time = 2;
optional int64 end_time = 3;
}
message GetModelPerformanceResponse {
ModelPerformance performance = 1;
}
message StreamModelMetricsRequest {
repeated string model_names = 1;
optional int32 update_frequency_seconds = 2;
}
// Feature Analysis Messages
message GetFeatureImportanceRequest {
string model_name = 1;
optional string symbol = 2;
}
message GetFeatureImportanceResponse {
repeated FeatureImportance feature_importances = 1;
string model_name = 2;
int64 calculated_at = 3;
}
message StreamSignalStrengthRequest {
repeated string symbols = 1;
optional int32 update_frequency_seconds = 2;
}
// Core ML Data Types
// Complete prediction information from a model
message Prediction {
string model_name = 1; // Model that generated prediction
string symbol = 2; // Trading symbol
PredictionType prediction_type = 3; // Type of prediction (buy/sell/hold/price direction)
double value = 4; // Predicted value (price change, probability, etc.)
double confidence = 5; // Model confidence in prediction (0.0 to 1.0)
int32 horizon_minutes = 6; // Prediction time horizon
repeated Feature features = 7; // Input features used for prediction
int64 timestamp = 8; // Prediction generation timestamp (nanoseconds)
}
message EnsembleVote {
string symbol = 1;
PredictionType consensus_prediction = 2;
double consensus_confidence = 3;
int32 votes_buy = 4;
int32 votes_sell = 5;
int32 votes_hold = 6;
int32 total_models = 7;
SignalStrength signal_strength = 8;
}
message ModelVote {
string model_name = 1;
PredictionType prediction = 2;
double confidence = 3;
double weight = 4;
}
message ModelStatus {
string model_name = 1;
ModelState state = 2;
optional string error_message = 3;
int64 last_updated = 4;
int64 last_prediction = 5;
ModelHealth health = 6;
map<string, string> metadata = 7;
}
message ModelInfo {
string model_name = 1;
string model_type = 2;
string description = 3;
repeated string supported_symbols = 4;
repeated int32 supported_horizons = 5;
ModelCapabilities capabilities = 6;
map<string, string> parameters = 7;
}
message ModelPerformance {
string model_name = 1;
double accuracy = 2;
double precision = 3;
double recall = 4;
double f1_score = 5;
double sharpe_ratio = 6;
double win_rate = 7;
double avg_return = 8;
double max_drawdown = 9;
int32 total_predictions = 10;
int64 performance_period_start = 11;
int64 performance_period_end = 12;
repeated DailyPerformance daily_performance = 13;
}
message DailyPerformance {
string date = 1;
double accuracy = 2;
double return_pct = 3;
int32 predictions_count = 4;
double sharpe_ratio = 5;
}
message FeatureImportance {
string feature_name = 1;
double importance_score = 2;
FeatureType feature_type = 3;
double contribution_pct = 4;
}
message Feature {
string name = 1;
double value = 2;
FeatureType feature_type = 3;
double normalized_value = 4;
}
message ModelCapabilities {
bool supports_streaming = 1;
bool supports_retraining = 2;
bool supports_feature_importance = 3;
bool supports_confidence_intervals = 4;
repeated string supported_asset_classes = 5;
}
// Event Messages
message PredictionEvent {
string model_name = 1;
string symbol = 2;
Prediction prediction = 3;
PredictionEventType event_type = 4;
int64 timestamp = 5;
}
message ModelMetricsEvent {
string model_name = 1;
ModelMetrics metrics = 2;
int64 timestamp = 3;
}
message SignalStrengthEvent {
string symbol = 1;
SignalStrength signal_strength = 2;
repeated ModelSignal model_signals = 3;
int64 timestamp = 4;
}
message ModelMetrics {
string model_name = 1;
double cpu_usage = 2;
double memory_usage_mb = 3;
double gpu_usage = 4;
double predictions_per_second = 5;
double avg_inference_time_ms = 6;
int32 queue_size = 7;
ModelHealth health = 8;
}
message ModelSignal {
string model_name = 1;
double signal_strength = 2;
PredictionType direction = 3;
double confidence = 4;
}
// Enums
// Types of predictions that ML models can generate
enum PredictionType {
PREDICTION_TYPE_UNSPECIFIED = 0; // Default/unknown prediction type
PREDICTION_TYPE_BUY = 1; // Recommendation to buy (go long)
PREDICTION_TYPE_SELL = 2; // Recommendation to sell (go short)
PREDICTION_TYPE_HOLD = 3; // Recommendation to hold position
PREDICTION_TYPE_PRICE_UP = 4; // Price expected to increase
PREDICTION_TYPE_PRICE_DOWN = 5; // Price expected to decrease
PREDICTION_TYPE_VOLATILITY_HIGH = 6; // High volatility expected
PREDICTION_TYPE_VOLATILITY_LOW = 7; // Low volatility expected
}
// Current operational state of ML models
enum ModelState {
MODEL_STATE_UNSPECIFIED = 0; // Default/unknown state
MODEL_STATE_LOADING = 1; // Model is loading from storage
MODEL_STATE_READY = 2; // Model loaded and ready for predictions
MODEL_STATE_PREDICTING = 3; // Model actively making predictions
MODEL_STATE_TRAINING = 4; // Model is being retrained
MODEL_STATE_ERROR = 5; // Model encountered an error
MODEL_STATE_OFFLINE = 6; // Model is offline/disabled
}
// Health status of ML models
enum ModelHealth {
MODEL_HEALTH_UNSPECIFIED = 0; // Default/unknown health
MODEL_HEALTH_HEALTHY = 1; // Model operating normally
MODEL_HEALTH_DEGRADED = 2; // Model performance degraded
MODEL_HEALTH_UNHEALTHY = 3; // Model not performing well
MODEL_HEALTH_CRITICAL = 4; // Model in critical state
}
// Types of features used in ML models
enum FeatureType {
FEATURE_TYPE_UNSPECIFIED = 0; // Default/unknown feature type
FEATURE_TYPE_PRICE = 1; // Price-based features (OHLC, etc.)
FEATURE_TYPE_VOLUME = 2; // Volume-based features
FEATURE_TYPE_TECHNICAL = 3; // Technical indicators (RSI, MACD, etc.)
FEATURE_TYPE_FUNDAMENTAL = 4; // Fundamental analysis features
FEATURE_TYPE_SENTIMENT = 5; // Market sentiment features
FEATURE_TYPE_MACRO = 6; // Macroeconomic features
FEATURE_TYPE_TIME = 7; // Time-based features
FEATURE_TYPE_ORDERBOOK = 8; // Order book depth and microstructure features
FEATURE_TYPE_MICROSTRUCTURE = 9; // Market microstructure and flow features
}
// Signal strength levels for predictions
enum SignalStrength {
SIGNAL_STRENGTH_UNSPECIFIED = 0; // Default/unknown strength
SIGNAL_STRENGTH_VERY_WEAK = 1; // Very weak signal confidence
SIGNAL_STRENGTH_WEAK = 2; // Weak signal confidence
SIGNAL_STRENGTH_MODERATE = 3; // Moderate signal confidence
SIGNAL_STRENGTH_STRONG = 4; // Strong signal confidence
SIGNAL_STRENGTH_VERY_STRONG = 5; // Very strong signal confidence
}
enum PredictionEventType {
PREDICTION_EVENT_TYPE_UNSPECIFIED = 0;
PREDICTION_EVENT_TYPE_NEW = 1;
PREDICTION_EVENT_TYPE_UPDATED = 2;
PREDICTION_EVENT_TYPE_EXPIRED = 3;
PREDICTION_EVENT_TYPE_CONFIRMED = 4;
}

View File

@@ -1,376 +0,0 @@
syntax = "proto3";
package monitoring;
// Monitoring Service provides comprehensive system health monitoring, performance metrics collection,
// and alerting capabilities for the HFT trading system. This service tracks latency, throughput,
// resource utilization, and service health across all trading components with real-time alerting.
service MonitoringService {
// Health and Status Monitoring
// Get overall system status and individual service health
rpc GetSystemStatus(GetSystemStatusRequest) returns (GetSystemStatusResponse);
// Stream real-time system status changes
rpc StreamSystemStatus(StreamSystemStatusRequest) returns (stream SystemStatusEvent);
// Perform detailed health checks on services
rpc GetHealthCheck(GetHealthCheckRequest) returns (GetHealthCheckResponse);
// Performance Metrics Collection
// Get system and application metrics
rpc GetMetrics(GetMetricsRequest) returns (GetMetricsResponse);
// Stream real-time performance metrics
rpc StreamMetrics(StreamMetricsRequest) returns (stream MetricsEvent);
// Get detailed latency performance metrics
rpc GetLatencyMetrics(GetLatencyMetricsRequest) returns (GetLatencyMetricsResponse);
// Get throughput and capacity metrics
rpc GetThroughputMetrics(GetThroughputMetricsRequest) returns (GetThroughputMetricsResponse);
// Alerting and Notification System
// Stream real-time system alerts and notifications
rpc StreamAlerts(StreamAlertsRequest) returns (stream AlertEvent);
// Acknowledge an active alert
rpc AcknowledgeAlert(AcknowledgeAlertRequest) returns (AcknowledgeAlertResponse);
// Get all currently active alerts
rpc GetActiveAlerts(GetActiveAlertsRequest) returns (GetActiveAlertsResponse);
}
// Health and Status Messages
message GetSystemStatusRequest {
repeated string service_names = 1;
}
message GetSystemStatusResponse {
SystemStatus overall_status = 1;
repeated ServiceStatus service_statuses = 2;
int64 timestamp = 3;
}
message StreamSystemStatusRequest {
repeated string service_names = 1;
optional int32 update_frequency_seconds = 2;
}
message GetHealthCheckRequest {
optional string service_name = 1;
}
message GetHealthCheckResponse {
HealthStatus health_status = 1;
repeated HealthCheck health_checks = 2;
int64 timestamp = 3;
}
// Performance Metrics Messages
message GetMetricsRequest {
repeated string metric_names = 1;
optional int64 start_time = 2;
optional int64 end_time = 3;
optional MetricAggregation aggregation = 4;
}
message GetMetricsResponse {
repeated Metric metrics = 1;
int64 timestamp = 2;
}
message StreamMetricsRequest {
repeated string metric_names = 1;
optional int32 update_frequency_seconds = 2;
}
message GetLatencyMetricsRequest {
optional string service_name = 1;
optional string operation_name = 2;
optional int64 start_time = 3;
optional int64 end_time = 4;
}
message GetLatencyMetricsResponse {
repeated LatencyMetric latency_metrics = 1;
}
message GetThroughputMetricsRequest {
optional string service_name = 1;
optional string operation_name = 2;
optional int64 start_time = 3;
optional int64 end_time = 4;
}
message GetThroughputMetricsResponse {
repeated ThroughputMetric throughput_metrics = 1;
}
// Alert Messages
message StreamAlertsRequest {
optional AlertSeverity min_severity = 1;
repeated string service_names = 2;
repeated AlertType alert_types = 3;
}
message AcknowledgeAlertRequest {
string alert_id = 1;
string acknowledged_by = 2;
optional string note = 3;
}
message AcknowledgeAlertResponse {
bool success = 1;
string message = 2;
int64 timestamp = 3;
}
message GetActiveAlertsRequest {
optional AlertSeverity min_severity = 1;
repeated string service_names = 2;
}
message GetActiveAlertsResponse {
repeated Alert active_alerts = 1;
int32 total_count = 2;
}
// Core Data Types
message ServiceStatus {
string service_name = 1;
ServiceHealth health = 2;
ServiceState state = 3;
optional string version = 4;
optional string error_message = 5;
int64 uptime_seconds = 6;
int64 last_health_check = 7;
map<string, string> metadata = 8;
repeated Dependency dependencies = 9;
}
message SystemStatus {
SystemHealth overall_health = 1;
int32 healthy_services = 2;
int32 total_services = 3;
repeated string critical_issues = 4;
int64 system_uptime_seconds = 5;
SystemMetrics system_metrics = 6;
}
message HealthCheck {
string check_name = 1;
HealthStatus status = 2;
optional string message = 3;
optional double response_time_ms = 4;
int64 last_checked = 5;
map<string, string> details = 6;
}
message Dependency {
string name = 1;
DependencyType dependency_type = 2;
HealthStatus status = 3;
optional string endpoint = 4;
optional double response_time_ms = 5;
int64 last_checked = 6;
}
message SystemMetrics {
double cpu_usage_percent = 1;
double memory_usage_percent = 2;
double disk_usage_percent = 3;
double network_io_mbps = 4;
int32 active_connections = 5;
int32 total_requests = 6;
double avg_response_time_ms = 7;
double error_rate_percent = 8;
}
message Metric {
string name = 1;
MetricType metric_type = 2;
double value = 3;
string unit = 4;
map<string, string> labels = 5;
int64 timestamp = 6;
optional MetricStatistics statistics = 7;
}
message MetricStatistics {
double min = 1;
double max = 2;
double avg = 3;
double percentile_95 = 4;
double percentile_99 = 5;
double std_dev = 6;
int32 sample_count = 7;
}
message LatencyMetric {
string service_name = 1;
string operation_name = 2;
double avg_latency_ms = 3;
double p50_latency_ms = 4;
double p95_latency_ms = 5;
double p99_latency_ms = 6;
double max_latency_ms = 7;
int32 request_count = 8;
int64 time_window_start = 9;
int64 time_window_end = 10;
}
message ThroughputMetric {
string service_name = 1;
string operation_name = 2;
double requests_per_second = 3;
double bytes_per_second = 4;
int32 total_requests = 5;
int64 total_bytes = 6;
int64 time_window_start = 7;
int64 time_window_end = 8;
}
message Alert {
string alert_id = 1;
AlertType alert_type = 2;
AlertSeverity severity = 3;
string title = 4;
string description = 5;
string service_name = 6;
map<string, string> labels = 7;
int64 triggered_at = 8;
optional int64 acknowledged_at = 9;
optional string acknowledged_by = 10;
optional int64 resolved_at = 11;
AlertStatus status = 12;
optional string resolution_note = 13;
}
// Event Messages
message SystemStatusEvent {
SystemStatus system_status = 1;
SystemStatusChangeType change_type = 2;
int64 timestamp = 3;
}
message MetricsEvent {
repeated Metric metrics = 1;
int64 timestamp = 2;
}
message AlertEvent {
Alert alert = 1;
AlertEventType event_type = 2;
int64 timestamp = 3;
}
// Enums
// Health status levels for services
enum ServiceHealth {
SERVICE_HEALTH_UNSPECIFIED = 0; // Default/unknown health
SERVICE_HEALTH_HEALTHY = 1; // Service operating normally
SERVICE_HEALTH_DEGRADED = 2; // Service performance degraded
SERVICE_HEALTH_UNHEALTHY = 3; // Service not functioning properly
SERVICE_HEALTH_CRITICAL = 4; // Service in critical failure state
}
// Operational states of services
enum ServiceState {
SERVICE_STATE_UNSPECIFIED = 0; // Default/unknown state
SERVICE_STATE_STARTING = 1; // Service is starting up
SERVICE_STATE_RUNNING = 2; // Service is running normally
SERVICE_STATE_STOPPING = 3; // Service is shutting down
SERVICE_STATE_STOPPED = 4; // Service is stopped
SERVICE_STATE_ERROR = 5; // Service encountered an error
}
enum SystemHealth {
SYSTEM_HEALTH_UNSPECIFIED = 0;
SYSTEM_HEALTH_HEALTHY = 1;
SYSTEM_HEALTH_DEGRADED = 2;
SYSTEM_HEALTH_UNHEALTHY = 3;
SYSTEM_HEALTH_CRITICAL = 4;
}
enum HealthStatus {
HEALTH_STATUS_UNSPECIFIED = 0;
HEALTH_STATUS_HEALTHY = 1;
HEALTH_STATUS_DEGRADED = 2;
HEALTH_STATUS_UNHEALTHY = 3;
HEALTH_STATUS_CRITICAL = 4;
}
enum DependencyType {
DEPENDENCY_TYPE_UNSPECIFIED = 0;
DEPENDENCY_TYPE_DATABASE = 1;
DEPENDENCY_TYPE_MESSAGE_QUEUE = 2;
DEPENDENCY_TYPE_CACHE = 3;
DEPENDENCY_TYPE_EXTERNAL_API = 4;
DEPENDENCY_TYPE_FILE_SYSTEM = 5;
DEPENDENCY_TYPE_NETWORK = 6;
}
enum MetricType {
METRIC_TYPE_UNSPECIFIED = 0;
METRIC_TYPE_COUNTER = 1;
METRIC_TYPE_GAUGE = 2;
METRIC_TYPE_HISTOGRAM = 3;
METRIC_TYPE_TIMER = 4;
}
enum MetricAggregation {
METRIC_AGGREGATION_UNSPECIFIED = 0;
METRIC_AGGREGATION_SUM = 1;
METRIC_AGGREGATION_AVG = 2;
METRIC_AGGREGATION_MIN = 3;
METRIC_AGGREGATION_MAX = 4;
METRIC_AGGREGATION_COUNT = 5;
}
enum AlertType {
ALERT_TYPE_UNSPECIFIED = 0;
ALERT_TYPE_HEALTH_CHECK = 1;
ALERT_TYPE_PERFORMANCE = 2;
ALERT_TYPE_ERROR_RATE = 3;
ALERT_TYPE_LATENCY = 4;
ALERT_TYPE_THROUGHPUT = 5;
ALERT_TYPE_RESOURCE_USAGE = 6;
ALERT_TYPE_DEPENDENCY = 7;
ALERT_TYPE_SECURITY = 8;
}
// Alert severity levels
enum AlertSeverity {
ALERT_SEVERITY_UNSPECIFIED = 0; // Default/unknown severity
ALERT_SEVERITY_INFO = 1; // Informational alert
ALERT_SEVERITY_WARNING = 2; // Warning requiring attention
ALERT_SEVERITY_CRITICAL = 3; // Critical issue requiring immediate action
ALERT_SEVERITY_EMERGENCY = 4; // Emergency requiring immediate response
}
// Current status of alerts
enum AlertStatus {
ALERT_STATUS_UNSPECIFIED = 0; // Default/unknown status
ALERT_STATUS_ACTIVE = 1; // Alert is currently active
ALERT_STATUS_ACKNOWLEDGED = 2; // Alert has been acknowledged
ALERT_STATUS_RESOLVED = 3; // Alert has been resolved
ALERT_STATUS_SUPPRESSED = 4; // Alert is temporarily suppressed
}
enum SystemStatusChangeType {
SYSTEM_STATUS_CHANGE_TYPE_UNSPECIFIED = 0;
SYSTEM_STATUS_CHANGE_TYPE_HEALTH_IMPROVED = 1;
SYSTEM_STATUS_CHANGE_TYPE_HEALTH_DEGRADED = 2;
SYSTEM_STATUS_CHANGE_TYPE_SERVICE_STARTED = 3;
SYSTEM_STATUS_CHANGE_TYPE_SERVICE_STOPPED = 4;
SYSTEM_STATUS_CHANGE_TYPE_SERVICE_ERROR = 5;
}
enum AlertEventType {
ALERT_EVENT_TYPE_UNSPECIFIED = 0;
ALERT_EVENT_TYPE_TRIGGERED = 1;
ALERT_EVENT_TYPE_ACKNOWLEDGED = 2;
ALERT_EVENT_TYPE_RESOLVED = 3;
ALERT_EVENT_TYPE_ESCALATED = 4;
}

View File

@@ -1,301 +0,0 @@
syntax = "proto3";
package risk;
// Risk Management Service provides comprehensive risk assessment, monitoring, and control capabilities
// for high-frequency trading operations. This service integrates real-time VaR calculations,
// position risk analysis, compliance monitoring, and emergency controls.
service RiskService {
// Value at Risk (VaR) Calculations
// Calculate current portfolio VaR using specified method and parameters
rpc GetVaR(GetVaRRequest) returns (GetVaRResponse);
// Stream real-time VaR updates as market conditions change
rpc StreamVaRUpdates(StreamVaRRequest) returns (stream VaREvent);
// Position Risk Analysis
// Get comprehensive risk analysis for current positions
rpc GetPositionRisk(GetPositionRiskRequest) returns (GetPositionRiskResponse);
// Validate order against risk limits before execution
rpc ValidateOrder(ValidateOrderRequest) returns (ValidateOrderResponse);
// Risk Metrics and Monitoring
// Get comprehensive portfolio risk metrics and statistics
rpc GetRiskMetrics(GetRiskMetricsRequest) returns (GetRiskMetricsResponse);
// Stream real-time risk alerts and violations
rpc StreamRiskAlerts(StreamRiskAlertsRequest) returns (stream RiskAlertEvent);
// Emergency Controls and Circuit Breakers
// Trigger emergency stop to halt trading activities
rpc EmergencyStop(EmergencyStopRequest) returns (EmergencyStopResponse);
// Get status of all circuit breakers and safety mechanisms
rpc GetCircuitBreakerStatus(GetCircuitBreakerStatusRequest) returns (GetCircuitBreakerStatusResponse);
}
// VaR (Value at Risk) Messages
// Request to calculate portfolio VaR
message GetVaRRequest {
repeated string symbols = 1; // Symbols to include in VaR calculation (empty = all positions)
double confidence_level = 2; // Confidence level (e.g., 0.95 for 95% VaR)
int32 lookback_days = 3; // Historical data period for calculation
VaRMethod method = 4; // VaR calculation method (historical, parametric, Monte Carlo)
}
// Response containing VaR calculation results
message GetVaRResponse {
double portfolio_var = 1; // Total portfolio VaR value
repeated SymbolVaR symbol_vars = 2; // Individual symbol VaR contributions
double confidence_level = 3; // Confidence level used in calculation
int32 lookback_days = 4; // Historical period used
VaRMethod method = 5; // Calculation method used
int64 calculated_at = 6; // Calculation timestamp (nanoseconds)
}
// Request to stream real-time VaR updates
message StreamVaRRequest {
double confidence_level = 1; // Confidence level for VaR calculation
int32 update_frequency_seconds = 2; // How often to send updates
}
// VaR contribution for a specific symbol
message SymbolVaR {
string symbol = 1; // Trading symbol
double var_value = 2; // VaR value for this symbol
double position_size = 3; // Current position size
double contribution_pct = 4; // Percentage contribution to total portfolio VaR
}
// Position Risk Analysis Messages
// Request for position risk analysis
message GetPositionRiskRequest {
optional string symbol = 1; // Filter by symbol (all symbols if not specified)
optional string account_id = 2; // Filter by account (all accounts if not specified)
}
// Response containing position risk analysis
message GetPositionRiskResponse {
repeated PositionRisk position_risks = 1; // Risk analysis for each position
double portfolio_risk_score = 2; // Overall portfolio risk score (0-100)
}
// Request to validate order against risk limits
message ValidateOrderRequest {
string symbol = 1; // Trading symbol
double quantity = 2; // Order quantity
double price = 3; // Order price
string side = 4; // Buy or sell
string account_id = 5; // Trading account
}
// Response containing order validation results
message ValidateOrderResponse {
bool is_valid = 1; // True if order passes all risk checks
repeated RiskViolation violations = 2; // List of risk violations (if any)
RiskScore risk_score = 3; // Risk assessment for this order
string message = 4; // Human-readable validation message
}
// Risk Metrics and Monitoring Messages
// Request for comprehensive risk metrics
message GetRiskMetricsRequest {
optional string portfolio_id = 1; // Portfolio identifier (default portfolio if not specified)
}
// Response containing comprehensive risk metrics
message GetRiskMetricsResponse {
RiskMetrics metrics = 1; // Complete risk metrics and statistics
int64 calculated_at = 2; // Metrics calculation timestamp (nanoseconds)
}
// Request to stream real-time risk alerts
message StreamRiskAlertsRequest {
RiskAlertSeverity min_severity = 1; // Minimum alert severity to receive
repeated RiskAlertType alert_types = 2; // Types of alerts to receive (empty = all types)
}
// Emergency Control Messages
// Request to trigger emergency stop
message EmergencyStopRequest {
EmergencyStopType stop_type = 1; // Type of emergency stop (all trading, symbol, account, etc.)
string reason = 2; // Reason for emergency stop
optional string symbol = 3; // Symbol to stop (for symbol-specific stops)
optional string account_id = 4; // Account to stop (for account-specific stops)
}
// Response after emergency stop execution
message EmergencyStopResponse {
bool success = 1; // True if emergency stop was successful
string message = 2; // Status message or error description
int64 timestamp = 3; // Emergency stop timestamp (nanoseconds)
repeated string affected_orders = 4; // List of order IDs affected by the stop
}
// Request for circuit breaker status
message GetCircuitBreakerStatusRequest {
optional string symbol = 1; // Filter by symbol (all symbols if not specified)
}
// Response containing circuit breaker status
message GetCircuitBreakerStatusResponse {
repeated CircuitBreakerStatus circuit_breakers = 1; // Status of all circuit breakers
}
// Core Risk Data Types
// Risk analysis for a specific position
message PositionRisk {
string symbol = 1; // Trading symbol
double position_size = 2; // Current position size
double market_value = 3; // Market value of position
double var_contribution = 4; // Contribution to portfolio VaR
double concentration_risk = 5; // Position concentration risk (0-100)
double liquidity_risk = 6; // Liquidity risk score (0-100)
RiskScore overall_score = 7; // Overall risk assessment
repeated RiskMetric metrics = 8; // Additional risk metrics
}
message RiskViolation {
RiskViolationType violation_type = 1;
string description = 2;
double current_value = 3;
double limit_value = 4;
RiskAlertSeverity severity = 5;
}
message RiskScore {
double overall_score = 1;
double concentration_score = 2;
double liquidity_score = 3;
double volatility_score = 4;
double correlation_score = 5;
RiskLevel risk_level = 6;
}
message RiskMetrics {
double portfolio_var_1d = 1;
double portfolio_var_5d = 2;
double portfolio_var_30d = 3;
double max_drawdown = 4;
double current_drawdown = 5;
double sharpe_ratio = 6;
double sortino_ratio = 7;
double beta = 8;
double alpha = 9;
double volatility = 10;
repeated PositionRisk position_risks = 11;
}
message RiskMetric {
string name = 1;
double value = 2;
string unit = 3;
RiskLevel risk_level = 4;
}
message CircuitBreakerStatus {
string name = 1;
bool is_triggered = 2;
optional string trigger_reason = 3;
optional int64 triggered_at = 4;
optional int64 reset_at = 5;
CircuitBreakerType breaker_type = 6;
}
// Event Messages
message VaREvent {
double portfolio_var = 1;
repeated SymbolVaR symbol_vars = 2;
VaRChangeType change_type = 3;
int64 timestamp = 4;
}
message RiskAlertEvent {
string alert_id = 1;
RiskAlertType alert_type = 2;
RiskAlertSeverity severity = 3;
string message = 4;
optional string symbol = 5;
optional string account_id = 6;
map<string, string> metadata = 7;
int64 timestamp = 8;
}
// Enums
// VaR calculation methodology
enum VaRMethod {
VAR_METHOD_UNSPECIFIED = 0; // Default/unknown method
VAR_METHOD_HISTORICAL = 1; // Historical simulation method
VAR_METHOD_PARAMETRIC = 2; // Parametric (variance-covariance) method
VAR_METHOD_MONTE_CARLO = 3; // Monte Carlo simulation method
}
enum RiskViolationType {
RISK_VIOLATION_TYPE_UNSPECIFIED = 0;
RISK_VIOLATION_TYPE_POSITION_LIMIT = 1;
RISK_VIOLATION_TYPE_CONCENTRATION = 2;
RISK_VIOLATION_TYPE_VAR_LIMIT = 3;
RISK_VIOLATION_TYPE_DRAWDOWN = 4;
RISK_VIOLATION_TYPE_LIQUIDITY = 5;
RISK_VIOLATION_TYPE_CORRELATION = 6;
}
// Risk assessment levels
enum RiskLevel {
RISK_LEVEL_UNSPECIFIED = 0; // Default/unknown level
RISK_LEVEL_LOW = 1; // Low risk (green)
RISK_LEVEL_MEDIUM = 2; // Medium risk (yellow)
RISK_LEVEL_HIGH = 3; // High risk (orange)
RISK_LEVEL_CRITICAL = 4; // Critical risk (red)
}
// Severity levels for risk alerts
enum RiskAlertSeverity {
RISK_ALERT_SEVERITY_UNSPECIFIED = 0; // Default/unknown severity
RISK_ALERT_SEVERITY_INFO = 1; // Informational alert
RISK_ALERT_SEVERITY_WARNING = 2; // Warning alert
RISK_ALERT_SEVERITY_CRITICAL = 3; // Critical alert requiring attention
RISK_ALERT_SEVERITY_EMERGENCY = 4; // Emergency alert requiring immediate action
}
// Types of risk alerts
enum RiskAlertType {
RISK_ALERT_TYPE_UNSPECIFIED = 0; // Default/unknown type
RISK_ALERT_TYPE_VAR_BREACH = 1; // VaR limit breach
RISK_ALERT_TYPE_POSITION_LIMIT = 2; // Position size limit breach
RISK_ALERT_TYPE_DRAWDOWN = 3; // Drawdown limit breach
RISK_ALERT_TYPE_CONCENTRATION = 4; // Portfolio concentration risk
RISK_ALERT_TYPE_LIQUIDITY = 5; // Liquidity risk alert
RISK_ALERT_TYPE_CORRELATION = 6; // Correlation risk alert
}
// Types of emergency stops
enum EmergencyStopType {
EMERGENCY_STOP_TYPE_UNSPECIFIED = 0; // Default/unknown type
EMERGENCY_STOP_TYPE_ALL_TRADING = 1; // Stop all trading activity
EMERGENCY_STOP_TYPE_SYMBOL = 2; // Stop trading for specific symbol
EMERGENCY_STOP_TYPE_ACCOUNT = 3; // Stop trading for specific account
EMERGENCY_STOP_TYPE_STRATEGY = 4; // Stop specific trading strategy
}
enum CircuitBreakerType {
CIRCUIT_BREAKER_TYPE_UNSPECIFIED = 0;
CIRCUIT_BREAKER_TYPE_PORTFOLIO_LOSS = 1;
CIRCUIT_BREAKER_TYPE_SYMBOL_VOLATILITY = 2;
CIRCUIT_BREAKER_TYPE_POSITION_SIZE = 3;
CIRCUIT_BREAKER_TYPE_DRAWDOWN = 4;
}
enum VaRChangeType {
VAR_CHANGE_TYPE_UNSPECIFIED = 0;
VAR_CHANGE_TYPE_INCREASED = 1;
VAR_CHANGE_TYPE_DECREASED = 2;
VAR_CHANGE_TYPE_BREACH = 3;
}

View File

@@ -1,481 +0,0 @@
syntax = "proto3";
package trading;
// Trading Service provides comprehensive real-time trading operations for high-frequency trading.
// This service handles order management, position tracking, market data streaming, and execution monitoring.
// All operations are designed for ultra-low latency with microsecond precision timing.
service TradingService {
// Order Management Operations
// Submit a new trading order with validation and risk checks
rpc SubmitOrder(SubmitOrderRequest) returns (SubmitOrderResponse);
// Cancel an existing order by order ID
rpc CancelOrder(CancelOrderRequest) returns (CancelOrderResponse);
// Get current status of a specific order
rpc GetOrderStatus(GetOrderStatusRequest) returns (GetOrderStatusResponse);
// Stream real-time order events for monitoring order lifecycle
rpc StreamOrders(StreamOrdersRequest) returns (stream OrderEvent);
// Position Management Operations
// Get current positions for account and/or symbol
rpc GetPositions(GetPositionsRequest) returns (GetPositionsResponse);
// Stream real-time position updates as trades execute
rpc StreamPositions(StreamPositionsRequest) returns (stream PositionEvent);
// Get comprehensive portfolio summary with P&L and risk metrics
rpc GetPortfolioSummary(GetPortfolioSummaryRequest) returns (GetPortfolioSummaryResponse);
// Market Data Operations
// Stream real-time market data (trades, quotes, order book)
rpc StreamMarketData(StreamMarketDataRequest) returns (stream MarketDataEvent);
// Get current order book snapshot for a symbol
rpc GetOrderBook(GetOrderBookRequest) returns (GetOrderBookResponse);
// Execution Operations
// Stream real-time trade executions as they occur
rpc StreamExecutions(StreamExecutionsRequest) returns (stream ExecutionEvent);
// Get historical execution data with filtering options
rpc GetExecutionHistory(GetExecutionHistoryRequest) returns (GetExecutionHistoryResponse);
// ML-specific Trading Operations
// Submit ML-generated trading order with ensemble predictions
rpc SubmitMLOrder(MLOrderRequest) returns (MLOrderResponse);
// Get ML prediction history with outcomes
rpc GetMLPredictions(MLPredictionsRequest) returns (MLPredictionsResponse);
// Get ML model performance metrics
rpc GetMLPerformance(MLPerformanceRequest) returns (MLPerformanceResponse);
// Wave D: Regime Detection Operations
// Get current regime state for a symbol
rpc GetRegimeState(GetRegimeStateRequest) returns (GetRegimeStateResponse);
// Get regime transition history for a symbol
rpc GetRegimeTransitions(GetRegimeTransitionsRequest) returns (GetRegimeTransitionsResponse);
}
// Order Management Messages
// Request to submit a new trading order
message SubmitOrderRequest {
string symbol = 1; // Trading symbol (e.g., "AAPL", "BTC-USD")
OrderSide side = 2; // Buy or sell direction
double quantity = 3; // Number of shares/units to trade
OrderType order_type = 4; // Market, limit, stop, or stop-limit
optional double price = 5; // Limit price (required for limit orders)
optional double stop_price = 6; // Stop price (required for stop orders)
string account_id = 7; // Trading account identifier
map<string, string> metadata = 8; // Additional order metadata (strategy, tags, etc.)
}
// Response after submitting an order
message SubmitOrderResponse {
string order_id = 1; // Unique order identifier assigned by system
OrderStatus status = 2; // Current order status (pending, submitted, etc.)
string message = 3; // Status message or error description
int64 timestamp = 4; // Order submission timestamp (nanoseconds)
}
// Request to cancel an existing order
message CancelOrderRequest {
string order_id = 1; // Order ID to cancel
string account_id = 2; // Account ID for verification
}
// Response after attempting to cancel an order
message CancelOrderResponse {
bool success = 1; // True if cancellation was successful
string message = 2; // Success confirmation or error message
int64 timestamp = 3; // Cancellation timestamp (nanoseconds)
}
// Request to get current status of an order
message GetOrderStatusRequest {
string order_id = 1; // Order ID to query
}
// Response containing order status information
message GetOrderStatusResponse {
Order order = 1; // Complete order details with current status
}
// Request to stream real-time order events
message StreamOrdersRequest {
optional string account_id = 1; // Filter by account (all accounts if not specified)
optional string symbol = 2; // Filter by symbol (all symbols if not specified)
}
// Position Management Messages
// Request to get current positions
message GetPositionsRequest {
optional string account_id = 1; // Filter by account (all accounts if not specified)
optional string symbol = 2; // Filter by symbol (all symbols if not specified)
}
// Response containing position information
message GetPositionsResponse {
repeated Position positions = 1; // List of current positions
}
// Request to stream real-time position updates
message StreamPositionsRequest {
optional string account_id = 1; // Filter by account (all accounts if not specified)
}
// Request for portfolio summary
message GetPortfolioSummaryRequest {
string account_id = 1; // Account ID for portfolio summary
}
// Response containing comprehensive portfolio information
message GetPortfolioSummaryResponse {
double total_value = 1; // Total portfolio value in USD
double unrealized_pnl = 2; // Unrealized profit/loss
double realized_pnl = 3; // Realized profit/loss for the day
double day_pnl = 4; // Total P&L for the current trading day
double buying_power = 5; // Available buying power
double margin_used = 6; // Amount of margin currently used
repeated Position positions = 7; // Detailed position information
}
// Market Data Messages
// Request to stream real-time market data
message StreamMarketDataRequest {
repeated string symbols = 1; // List of symbols to subscribe to
repeated MarketDataType data_types = 2; // Types of data to stream (trades, quotes, order book)
}
// Request for order book snapshot
message GetOrderBookRequest {
string symbol = 1; // Symbol to get order book for
optional int32 depth = 2; // Number of price levels (default: full book)
}
// Response containing order book data
message GetOrderBookResponse {
OrderBook order_book = 1; // Current order book snapshot
}
// Execution Messages
// Request to stream real-time executions
message StreamExecutionsRequest {
optional string account_id = 1; // Filter by account (all accounts if not specified)
optional string symbol = 2; // Filter by symbol (all symbols if not specified)
}
// Request for historical execution data
message GetExecutionHistoryRequest {
optional string account_id = 1; // Filter by account (all accounts if not specified)
optional string symbol = 2; // Filter by symbol (all symbols if not specified)
optional int64 start_time = 3; // Start time for query (nanoseconds)
optional int64 end_time = 4; // End time for query (nanoseconds)
optional int32 limit = 5; // Maximum number of executions to return
}
// Response containing execution history
message GetExecutionHistoryResponse {
repeated Execution executions = 1; // List of historical executions
}
// ML Trading Messages
// Request to submit ML-generated order
message MLOrderRequest {
string symbol = 1; // Trading symbol (e.g., "ES.FUT")
string account_id = 2; // Trading account identifier
bool use_ensemble = 3; // Use ensemble voting or specific model
optional string model_name = 4; // Specific model name if not using ensemble
repeated double features = 5; // Feature vector for ML prediction (26 features: OHLCV + technicals)
}
// Response after submitting ML order
message MLOrderResponse {
string order_id = 1; // Order ID if executed
string prediction_id = 2; // Prediction ID from ensemble_predictions table
string action = 3; // Action taken: BUY, SELL, HOLD
double confidence = 4; // Prediction confidence (0.0-1.0)
string message = 5; // Status message
bool executed = 6; // True if order was executed
}
// Request to get ML prediction history
message MLPredictionsRequest {
string symbol = 1; // Trading symbol to filter by
optional string model_name = 2; // Filter by specific model
int32 limit = 3; // Maximum predictions to return (default: 100)
optional int64 start_time = 4; // Start time filter (nanoseconds)
optional int64 end_time = 5; // End time filter (nanoseconds)
}
// Response containing ML prediction history
message MLPredictionsResponse {
repeated MLPrediction predictions = 1; // List of predictions with outcomes
}
// Single ML prediction with outcome
message MLPrediction {
string id = 1; // Prediction ID (UUID)
string symbol = 2; // Trading symbol
string ensemble_action = 3; // Predicted action: BUY, SELL, HOLD
double ensemble_signal = 4; // Signal strength (-1.0 to 1.0)
double ensemble_confidence = 5; // Confidence level (0.0-1.0)
int64 timestamp = 6; // Prediction timestamp (nanoseconds)
optional string order_id = 7; // Order ID if executed
optional double actual_pnl = 8; // Actual P&L if order filled
repeated ModelPrediction model_predictions = 9; // Individual model predictions
}
// Individual model prediction within ensemble
message ModelPrediction {
string model_name = 1; // Model name (DQN, MAMBA2, PPO, TFT)
double signal = 2; // Model signal strength
double confidence = 3; // Model confidence
}
// Request to get ML model performance metrics
message MLPerformanceRequest {
optional string model_name = 1; // Filter by specific model (or all if not specified)
optional int64 start_time = 2; // Start time for metrics (nanoseconds)
optional int64 end_time = 3; // End time for metrics (nanoseconds)
}
// Response containing ML model performance
message MLPerformanceResponse {
repeated ModelPerformance models = 1; // Performance metrics per model
}
// Performance metrics for a single model
message ModelPerformance {
string model_name = 1; // Model name
int64 total_predictions = 2; // Total predictions made
int64 correct_predictions = 3; // Correct predictions (profitable)
double accuracy = 4; // Accuracy rate (0.0-1.0)
double sharpe_ratio = 5; // Risk-adjusted return
double avg_pnl = 6; // Average P&L per prediction
}
// Wave D: Regime Detection Messages
// Request to get current regime state
message GetRegimeStateRequest {
string symbol = 1; // Trading symbol to query
}
// Response containing current regime state
message GetRegimeStateResponse {
string symbol = 1; // Trading symbol
string current_regime = 2; // Current regime: TRENDING, RANGING, VOLATILE, CRISIS
double confidence = 3; // Regime confidence (0.0-1.0)
double cusum_s_plus = 4; // CUSUM S+ statistic
double cusum_s_minus = 5; // CUSUM S- statistic
double adx = 6; // Average Directional Index
double stability = 7; // Regime stability score (0.0-1.0)
double entropy = 8; // Transition entropy (0.0-1.0)
int64 updated_at = 9; // Last update timestamp (nanoseconds)
}
// Request to get regime transition history
message GetRegimeTransitionsRequest {
string symbol = 1; // Trading symbol to query
int32 limit = 2; // Maximum transitions to return (default: 100)
}
// Response containing regime transition history
message GetRegimeTransitionsResponse {
repeated RegimeTransition transitions = 1; // List of regime transitions
}
// Single regime transition record
message RegimeTransition {
string from_regime = 1; // Previous regime
string to_regime = 2; // New regime
int32 duration_bars = 3; // Duration in previous regime (bars)
double transition_probability = 4; // Transition probability from matrix
int64 timestamp = 5; // Transition timestamp (nanoseconds)
}
// Core Data Types
// Complete order information with all lifecycle details
message Order {
string order_id = 1; // Unique order identifier
string symbol = 2; // Trading symbol (e.g., "AAPL", "BTC-USD")
OrderSide side = 3; // Buy or sell direction
double quantity = 4; // Total quantity ordered
double filled_quantity = 5; // Quantity already filled
OrderType order_type = 6; // Market, limit, stop, or stop-limit
optional double price = 7; // Limit price (for limit orders)
optional double stop_price = 8; // Stop price (for stop orders)
OrderStatus status = 9; // Current order status
int64 created_at = 10; // Order creation timestamp (nanoseconds)
optional int64 updated_at = 11; // Last update timestamp (nanoseconds)
string account_id = 12; // Associated trading account
map<string, string> metadata = 13; // Additional order metadata
}
// Current position information for a symbol
message Position {
string symbol = 1; // Trading symbol
double quantity = 2; // Current position size (positive for long, negative for short)
double average_price = 3; // Average cost basis per share
double market_value = 4; // Current market value of position
double unrealized_pnl = 5; // Unrealized profit/loss
double realized_pnl = 6; // Realized profit/loss for the day
string account_id = 7; // Associated trading account
int64 updated_at = 8; // Last update timestamp (nanoseconds)
}
// Trade execution details
message Execution {
string execution_id = 1; // Unique execution identifier
string order_id = 2; // Associated order ID
string symbol = 3; // Trading symbol
OrderSide side = 4; // Buy or sell direction
double quantity = 5; // Quantity executed
double price = 6; // Execution price
int64 timestamp = 7; // Execution timestamp (nanoseconds)
string account_id = 8; // Associated trading account
map<string, string> metadata = 9; // Additional execution metadata
}
// Order book snapshot for a symbol
message OrderBook {
string symbol = 1; // Trading symbol
repeated OrderBookLevel bids = 2; // Bid levels (buyers) sorted by price descending
repeated OrderBookLevel asks = 3; // Ask levels (sellers) sorted by price ascending
int64 timestamp = 4; // Order book timestamp (nanoseconds)
}
// Single price level in the order book
message OrderBookLevel {
double price = 1; // Price level
double quantity = 2; // Total quantity at this price level
int32 order_count = 3; // Number of orders at this price level
}
// Event Messages
// Real-time order event notification
message OrderEvent {
string order_id = 1; // Order identifier
Order order = 2; // Complete order details
OrderEventType event_type = 3; // Type of event (created, updated, filled, etc.)
int64 timestamp = 4; // Event timestamp (nanoseconds)
string message = 5; // Event message or additional details
}
// Real-time position change notification
message PositionEvent {
string symbol = 1; // Trading symbol
Position position = 2; // Updated position details
PositionEventType event_type = 3; // Type of event (opened, updated, closed)
int64 timestamp = 4; // Event timestamp (nanoseconds)
double quantity = 5; // Position quantity (quick access)
double average_price = 6; // Average entry price (quick access)
double unrealized_pnl = 7; // Unrealized P&L (quick access)
}
// Real-time execution notification
message ExecutionEvent {
string execution_id = 1; // Execution identifier
Execution execution = 2; // Execution details
int64 timestamp = 3; // Event timestamp (nanoseconds)
string order_id = 4; // Associated order ID (quick access)
string symbol = 5; // Trading symbol (quick access)
double quantity = 6; // Executed quantity (quick access)
double price = 7; // Execution price (quick access)
}
// Real-time market data update
message MarketDataEvent {
string symbol = 1; // Trading symbol
MarketDataType data_type = 2; // Type of market data
oneof data {
Trade trade = 3; // Trade data (when data_type = TRADE)
Quote quote = 4; // Quote data (when data_type = QUOTE)
OrderBook order_book = 5; // Order book data (when data_type = ORDER_BOOK)
}
int64 timestamp = 6; // Market data timestamp (nanoseconds)
}
// Market trade information
message Trade {
double price = 1; // Trade price
double volume = 2; // Trade volume
int64 timestamp = 3; // Trade timestamp (nanoseconds)
}
// Market quote (bid/ask) information
message Quote {
double bid_price = 1; // Best bid price
double bid_size = 2; // Size at best bid
double ask_price = 3; // Best ask price
double ask_size = 4; // Size at best ask
int64 timestamp = 5; // Quote timestamp (nanoseconds)
}
// Enums
// Order direction (buy or sell)
enum OrderSide {
ORDER_SIDE_UNSPECIFIED = 0; // Default/unknown side
ORDER_SIDE_BUY = 1; // Buy order (long position)
ORDER_SIDE_SELL = 2; // Sell order (short position)
}
// Order type determining execution behavior
enum OrderType {
ORDER_TYPE_UNSPECIFIED = 0; // Default/unknown type
ORDER_TYPE_MARKET = 1; // Execute immediately at market price
ORDER_TYPE_LIMIT = 2; // Execute only at specified price or better
ORDER_TYPE_STOP = 3; // Market order triggered at stop price
ORDER_TYPE_STOP_LIMIT = 4; // Limit order triggered at stop price
}
// Current status of an order in its lifecycle
enum OrderStatus {
ORDER_STATUS_UNSPECIFIED = 0; // Default/unknown status
ORDER_STATUS_PENDING = 1; // Order created but not yet submitted
ORDER_STATUS_SUBMITTED = 2; // Order submitted to exchange
ORDER_STATUS_PARTIALLY_FILLED = 3; // Order partially executed
ORDER_STATUS_FILLED = 4; // Order completely executed
ORDER_STATUS_CANCELLED = 5; // Order cancelled by user or system
ORDER_STATUS_REJECTED = 6; // Order rejected by exchange or risk system
}
// Type of order event notification
enum OrderEventType {
ORDER_EVENT_TYPE_UNSPECIFIED = 0; // Default/unknown event
ORDER_EVENT_TYPE_CREATED = 1; // Order was created
ORDER_EVENT_TYPE_UPDATED = 2; // Order details were updated
ORDER_EVENT_TYPE_FILLED = 3; // Order was executed (full or partial)
ORDER_EVENT_TYPE_CANCELLED = 4; // Order was cancelled
ORDER_EVENT_TYPE_PARTIALLY_FILLED = 5; // Order was partially filled
ORDER_EVENT_TYPE_REJECTED = 6; // Order was rejected
}
// Type of position change event
enum PositionEventType {
POSITION_EVENT_TYPE_UNSPECIFIED = 0; // Default/unknown event
POSITION_EVENT_TYPE_OPENED = 1; // New position was opened
POSITION_EVENT_TYPE_UPDATED = 2; // Existing position was modified
POSITION_EVENT_TYPE_CLOSED = 3; // Position was closed
}
// Type of market data being streamed
enum MarketDataType {
MARKET_DATA_TYPE_UNSPECIFIED = 0; // Default/unknown type
MARKET_DATA_TYPE_TRADE = 1; // Trade/transaction data
MARKET_DATA_TYPE_QUOTE = 2; // Best bid/ask quotes
MARKET_DATA_TYPE_ORDER_BOOK = 3; // Full order book depth
}

View File

@@ -3,14 +3,16 @@
use crate::proto::monitoring::{
monitoring_service_server::MonitoringService, AcknowledgeAlertRequest,
AcknowledgeAlertResponse, Alert, AlertEvent, AlertEventType, AlertSeverity, AlertStatus,
AlertType, GetActiveAlertsRequest, GetActiveAlertsResponse, GetHealthCheckRequest,
GetHealthCheckResponse, GetLatencyMetricsRequest, GetLatencyMetricsResponse,
GetMetricsRequest, GetMetricsResponse, GetSystemStatusRequest, GetSystemStatusResponse,
GetThroughputMetricsRequest, GetThroughputMetricsResponse, HealthCheck,
HealthStatus as ProtoHealthStatus, LatencyMetric, Metric, MetricType, MetricsEvent,
ServiceHealth, ServiceState, ServiceStatus, StreamAlertsRequest, StreamMetricsRequest,
StreamSystemStatusRequest, SystemHealth, SystemMetrics, SystemStatus, SystemStatusChangeType,
SystemStatusEvent, ThroughputMetric,
AlertType, GetActiveAlertsRequest, GetActiveAlertsResponse, GetEpochHistoryRequest,
GetEpochHistoryResponse, GetHealthCheckRequest, GetHealthCheckResponse,
GetLatencyMetricsRequest, GetLatencyMetricsResponse, GetLiveTrainingMetricsRequest,
GetLiveTrainingMetricsResponse, GetMetricsRequest, GetMetricsResponse,
GetSystemStatusRequest, GetSystemStatusResponse, GetThroughputMetricsRequest,
GetThroughputMetricsResponse, HealthCheck, HealthStatus as ProtoHealthStatus, LatencyMetric,
Metric, MetricType, MetricsEvent, ServiceHealth, ServiceState, ServiceStatus,
StreamAlertsRequest, StreamMetricsRequest, StreamSystemStatusRequest,
StreamTrainingMetricsRequest, SystemHealth, SystemMetrics, SystemStatus,
SystemStatusChangeType, SystemStatusEvent, ThroughputMetric,
};
use crate::state::{HealthStatus, TradingServiceState};
use std::sync::Arc;
@@ -836,4 +838,40 @@ impl MonitoringService for MonitoringServiceImpl {
tokio_stream::wrappers::ReceiverStream::new(rx),
)))
}
// ========================================================================
// Training metrics RPCs (not applicable to trading_service; forward to
// monitoring_service via api_gateway). Return UNIMPLEMENTED.
// ========================================================================
type StreamTrainingMetricsStream = std::pin::Pin<
Box<dyn tokio_stream::Stream<Item = Result<GetLiveTrainingMetricsResponse, Status>> + Send>,
>;
async fn get_live_training_metrics(
&self,
_request: Request<GetLiveTrainingMetricsRequest>,
) -> Result<Response<GetLiveTrainingMetricsResponse>, Status> {
Err(Status::unimplemented(
"Training metrics are served by monitoring_service, not trading_service",
))
}
async fn stream_training_metrics(
&self,
_request: Request<StreamTrainingMetricsRequest>,
) -> Result<Response<Self::StreamTrainingMetricsStream>, Status> {
Err(Status::unimplemented(
"Training metrics are served by monitoring_service, not trading_service",
))
}
async fn get_epoch_history(
&self,
_request: Request<GetEpochHistoryRequest>,
) -> Result<Response<GetEpochHistoryResponse>, Status> {
Err(Status::unimplemented(
"Epoch history is served by monitoring_service, not trading_service",
))
}
}