use nano_core::traits::Strategy;
use nano_core::types::{Order, Fill, OrderId};
use nano_lob::OrderBook;
struct MyStrategy {
position: i64,
// ... strategy state
}
impl Strategy for MyStrategy {
fn on_market_data(&mut self, book: &OrderBook) -> Vec<Order> {
// Analyze market data
let (bid, _) = book.best_bid()?;
let (ask, _) = book.best_ask()?;
let spread = ask.raw() - bid.raw();
// Generate orders
if spread > self.min_spread {
vec![
self.create_bid_order(book),
self.create_ask_order(book),
]
} else {
vec![]
}
}
fn on_fill(&mut self, fill: &Fill) {
// Update position
match fill.side {
Side::Buy => self.position += fill.quantity.value() as i64,
Side::Sell => self.position -= fill.quantity.value() as i64,
}
// Update P&L
self.realized_pnl += self.calculate_fill_pnl(fill);
}
fn on_order_ack(&mut self, order_id: OrderId) {
// Order confirmed by exchange
self.active_orders.insert(order_id);
}
fn on_order_reject(&mut self, order_id: OrderId, reason: &str) {
// Handle rejection
tracing::warn!("Order {} rejected: {}", order_id, reason);
}
fn position(&self) -> i64 {
self.position
}
}