Files
foxhunt/data/examples/order_submission.rs
jgrusewski c0be3ca530 🔧 Major compilation fixes across entire workspace - Significant progress achieved
## Summary of Compilation Fixes

### Core Infrastructure Improvements
- **Fixed import system**: Established canonical type imports from common::types
- **Resolved syntax errors**: Fixed malformed use statements with embedded comments
- **Import consolidation**: Eliminated duplicate and conflicting type imports
- **Type visibility**: Improved public/private type access patterns

### Major Areas Fixed

#### Trading Engine (trading_engine/)
-  Fixed syntax errors in types/basic.rs with clean re-exports
-  Resolved OrderSide/Side naming conflicts
-  Fixed type_registry.rs malformed imports
-  Consolidated canonical type imports from common::types
-  Fixed broker_client.rs duplicate OrderStatus imports
- 🔄 Remaining: 41 type visibility errors (down from 286+ errors)

#### Common Types (common/)
-  Established as single source of truth for all types
-  Clean type definitions with proper visibility
-  Consistent error handling patterns

#### Data Pipeline (data/)
-  Updated imports to use canonical common::types
-  Fixed provider trait implementations
-  Resolved database integration issues

#### ML Components (ml/)
-  Fixed model interface imports
-  Updated feature extraction systems
-  Resolved training pipeline dependencies

#### Risk Management (risk/)
-  Fixed safety module imports
-  Updated VaR calculator dependencies
-  Consolidated compliance types

#### Services
-  Trading Service: Fixed repository implementations
-  Backtesting Service: Updated strategy engines
-  TLI: Fixed dashboard and UI components

#### Test Infrastructure
-  Updated integration test imports
-  Fixed performance benchmark dependencies
-  Resolved mock implementations

### Technical Achievements

#### Import System Overhaul
- Established common::types as canonical source
- Eliminated circular dependencies
- Fixed visibility modifiers (pub use vs use)
- Resolved naming conflicts (Side → OrderSide)

#### Type System Cleanup
- Consolidated duplicate type definitions
- Fixed malformed syntax (comments in use statements)
- Standardized error handling patterns
- Improved module structure

#### Configuration Management
- Enhanced config crate integration
- Fixed database configuration patterns
- Improved hot-reload mechanisms

### Error Reduction Progress
- **Before**: 371+ compilation errors across workspace
- **After**: ~202 errors remaining (46% reduction achieved)
- **Major**: Fixed critical syntax errors preventing any compilation
- **Infrastructure**: Resolved fundamental import and type system issues

### Files Modified: 347
- Core types and infrastructure
- Service implementations
- Test suites and benchmarks
- Configuration systems
- Database integrations

### Next Steps
- Complete remaining type visibility fixes in trading_engine
- Finalize import resolution in remaining modules
- Validate cross-crate dependencies
- Run comprehensive test suite

This represents a major milestone in achieving zero compilation errors across
the entire Foxhunt HFT trading system workspace. The foundational type system
and import structure has been successfully established and standardized.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-27 20:56:22 +02:00

262 lines
8.2 KiB
Rust

//! Order Submission Example
//!
//! This example demonstrates how to submit different types of orders
//! to Interactive Brokers TWS.
//!
//! Usage:
//! cargo run --example order_submission
//!
//! Prerequisites:
//! - TWS or IB Gateway running with API enabled
//! - Paper trading account recommended for testing
use data::{init, paper_trading_config, InteractiveBrokersAdapter};
use std::collections::HashMap;
use std::time::Duration;
use tokio::time::sleep;
use tracing::{error, info, warn};
use trading_engine::prelude::*;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
// Initialize logging
init()?;
info!("=== Interactive Brokers Order Submission Example ===");
// Create adapter and connect
let config = paper_trading_config();
let mut adapter = InteractiveBrokersAdapter::new(config);
info!("Connecting to TWS...");
adapter.connect().await?;
if !adapter.is_connected() {
error!("Failed to establish connection");
return Err("Connection failed".into());
}
info!("✅ Connected to TWS");
// Start message processing to handle order responses
let adapter_arc = std::sync::Arc::new(adapter);
let process_handle = {
let adapter = adapter_arc.clone();
tokio::spawn(async move {
if let Err(e) = adapter.process_messages().await {
error!("Message processing error: {}", e);
}
})
};
// Wait for connection to stabilize
sleep(Duration::from_secs(2)).await;
// Example 1: Market Order
info!("\n--- Example 1: Market Order ---");
let market_order = Order {
id: OrderId::new(),
symbol: Symbol::from("AAPL"),
side: OrderSide::Buy,
quantity: Quantity::new(10.0)?,
order_type: OrderType::Market,
price: None,
stop_price: None,
time_in_force: TimeInForce::Day,
created_at: chrono::Utc::now(),
updated_at: chrono::Utc::now(),
filled_quantity: Quantity::ZERO,
status: OrderStatus::New,
metadata: HashMap::new(),
};
info!("Submitting market order: Buy 10 AAPL at market");
match adapter_arc.submit_order(&market_order).await {
Ok(tws_order_id) => {
info!("✅ Market order submitted, TWS ID: {}", tws_order_id);
// Wait for order processing
sleep(Duration::from_secs(3)).await;
// Cancel the order (for demo purposes)
info!("Cancelling market order");
adapter_arc.cancel_order(&tws_order_id).await?;
info!("✅ Market order cancelled");
}
Err(e) => {
error!("❌ Failed to submit market order: {}", e);
}
}
sleep(Duration::from_secs(2)).await;
// Example 2: Limit Order
info!("\n--- Example 2: Limit Order ---");
let limit_order = Order {
id: OrderId::new(),
symbol: Symbol::from("GOOGL"),
side: OrderSide::Sell,
quantity: Quantity::new(5.0)?,
order_type: OrderType::Limit,
price: Some(Price::new(2500.00)?), // Limit price
stop_price: None,
time_in_force: TimeInForce::GoodTillCancel,
created_at: chrono::Utc::now(),
updated_at: chrono::Utc::now(),
filled_quantity: Quantity::ZERO,
status: OrderStatus::New,
metadata: HashMap::new(),
};
info!("Submitting limit order: Sell 5 GOOGL at $2500.00");
match adapter_arc.submit_order(&limit_order).await {
Ok(tws_order_id) => {
info!("✅ Limit order submitted, TWS ID: {}", tws_order_id);
// Wait for order processing
sleep(Duration::from_secs(3)).await;
// Cancel the order
info!("Cancelling limit order");
adapter_arc.cancel_order(&tws_order_id).await?;
info!("✅ Limit order cancelled");
}
Err(e) => {
error!("❌ Failed to submit limit order: {}", e);
}
}
sleep(Duration::from_secs(2)).await;
// Example 3: Stop Order
info!("\n--- Example 3: Stop Order ---");
let stop_order = Order {
id: OrderId::new(),
symbol: Symbol::from("MSFT"),
side: OrderSide::Buy,
quantity: Quantity::new(20.0)?,
order_type: OrderType::Stop,
price: Some(Price::new(350.00)?), // Stop price
stop_price: Some(Price::new(350.00)?),
time_in_force: TimeInForce::Day,
created_at: chrono::Utc::now(),
updated_at: chrono::Utc::now(),
filled_quantity: Quantity::ZERO,
status: OrderStatus::New,
metadata: HashMap::new(),
};
info!("Submitting stop order: Buy 20 MSFT stop at $350.00");
match adapter_arc.submit_order(&stop_order).await {
Ok(tws_order_id) => {
info!("✅ Stop order submitted, TWS ID: {}", tws_order_id);
// Wait for order processing
sleep(Duration::from_secs(3)).await;
// Cancel the order
info!("Cancelling stop order");
adapter_arc.cancel_order(&tws_order_id).await?;
info!("✅ Stop order cancelled");
}
Err(e) => {
error!("❌ Failed to submit stop order: {}", e);
}
}
sleep(Duration::from_secs(2)).await;
// Example 4: Multiple Orders
info!("\n--- Example 4: Multiple Orders ---");
let orders = vec![
Order {
id: OrderId::new(),
symbol: Symbol::from("TSLA"),
side: OrderSide::Buy,
quantity: Quantity::new(1.0)?,
order_type: OrderType::Limit,
price: Some(Price::new(200.00)?),
stop_price: None,
time_in_force: TimeInForce::Day,
created_at: chrono::Utc::now(),
updated_at: chrono::Utc::now(),
filled_quantity: Quantity::ZERO,
status: OrderStatus::New,
metadata: HashMap::new(),
},
Order {
id: OrderId::new(),
symbol: Symbol::from("NVDA"),
side: OrderSide::Sell,
quantity: Quantity::new(2.0)?,
order_type: OrderType::Limit,
price: Some(Price::new(800.00)?),
stop_price: None,
time_in_force: TimeInForce::Day,
created_at: chrono::Utc::now(),
updated_at: chrono::Utc::now(),
filled_quantity: Quantity::ZERO,
status: OrderStatus::New,
metadata: HashMap::new(),
},
];
let mut submitted_orders = Vec::new();
for (i, order) in orders.iter().enumerate() {
info!(
"Submitting order {}: {} {} {} @ ${:.2}",
i + 1,
match order.side {
OrderSide::Buy => "Buy",
OrderSide::Sell => "Sell",
},
order.quantity.to_f64(),
order.symbol.to_string(),
order.price.as_ref().unwrap().to_f64()
);
match adapter_arc.submit_order(order).await {
Ok(tws_order_id) => {
info!("✅ Order {} submitted, TWS ID: {}", i + 1, tws_order_id);
submitted_orders.push(tws_order_id);
}
Err(e) => {
error!("❌ Failed to submit order {}: {}", i + 1, e);
}
}
// Small delay between orders
sleep(Duration::from_millis(500)).await;
}
// Wait for order processing
info!("Waiting for order processing...");
sleep(Duration::from_secs(5)).await;
// Cancel all submitted orders
info!("Cancelling all submitted orders...");
for (i, tws_order_id) in submitted_orders.iter().enumerate() {
match adapter_arc.cancel_order(tws_order_id).await {
Ok(()) => {
info!("✅ Cancelled order {}", i + 1);
}
Err(e) => {
warn!("⚠️ Failed to cancel order {}: {}", i + 1, e);
}
}
}
// Stop message processing
info!("Stopping message processing...");
process_handle.abort();
// Disconnect
let mut adapter_mut =
std::sync::Arc::try_unwrap(adapter_arc).map_err(|_| "Failed to unwrap adapter")?;
adapter_mut.disconnect().await?;
info!("=== Order submission example completed ===");
Ok(())
}