messy work. backtests / mock-data
This commit is contained in:
parent
4e4a048988
commit
fa70ada2bb
51 changed files with 2576 additions and 887 deletions
|
|
@ -224,9 +224,8 @@ impl TradingEngine {
|
|||
}
|
||||
|
||||
#[napi]
|
||||
pub fn set_microstructure(&self, _symbol: String, microstructure_json: String) -> Result<()> {
|
||||
let _microstructure: MarketMicrostructure = serde_json::from_str(µstructure_json)
|
||||
.map_err(|e| Error::from_reason(format!("Failed to parse microstructure: {}", e)))?;
|
||||
pub fn set_microstructure(&self, symbol: String, microstructure_js: JsObject) -> Result<()> {
|
||||
let microstructure = parse_microstructure(microstructure_js)?;
|
||||
|
||||
let _core = self.core.lock();
|
||||
// Store microstructure for use in fill simulation
|
||||
|
|
@ -236,10 +235,43 @@ impl TradingEngine {
|
|||
|
||||
#[napi]
|
||||
pub fn load_historical_data(&self, data_json: String) -> Result<()> {
|
||||
let _data: Vec<MarketUpdate> = serde_json::from_str(&data_json)
|
||||
let data: Vec<MarketUpdate> = serde_json::from_str(&data_json)
|
||||
.map_err(|e| Error::from_reason(format!("Failed to parse data: {}", e)))?;
|
||||
|
||||
// In real implementation, would load into historical data source
|
||||
let core = self.core.lock();
|
||||
|
||||
// Downcast to HistoricalDataSource if in backtest mode
|
||||
if let TradingMode::Backtest { .. } = core.get_mode() {
|
||||
let mut data_source = core.market_data_source.write();
|
||||
if let Some(historical_source) = data_source.as_any_mut().downcast_mut::<crate::core::market_data_sources::HistoricalDataSource>() {
|
||||
historical_source.load_data(data);
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[napi]
|
||||
pub fn generate_mock_data(&self, symbol: String, start_time: i64, end_time: i64, seed: Option<u32>) -> Result<()> {
|
||||
let core = self.core.lock();
|
||||
|
||||
// Only available in backtest mode
|
||||
if let TradingMode::Backtest { .. } = core.get_mode() {
|
||||
let mut data_source = core.market_data_source.write();
|
||||
if let Some(historical_source) = data_source.as_any_mut().downcast_mut::<crate::core::market_data_sources::HistoricalDataSource>() {
|
||||
let start_dt = DateTime::<Utc>::from_timestamp_millis(start_time)
|
||||
.ok_or_else(|| Error::from_reason("Invalid start time"))?;
|
||||
let end_dt = DateTime::<Utc>::from_timestamp_millis(end_time)
|
||||
.ok_or_else(|| Error::from_reason("Invalid end time"))?;
|
||||
|
||||
historical_source.generate_mock_data(symbol, start_dt, end_dt, seed.map(|s| s as u64));
|
||||
} else {
|
||||
return Err(Error::from_reason("Failed to access historical data source"));
|
||||
}
|
||||
} else {
|
||||
return Err(Error::from_reason("Mock data generation only available in backtest mode"));
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
|
@ -323,4 +355,20 @@ fn parse_risk_limits(limits_js: JsObject) -> Result<RiskLimits> {
|
|||
max_gross_exposure: limits_js.get_named_property("maxGrossExposure")?,
|
||||
max_symbol_exposure: limits_js.get_named_property("maxSymbolExposure")?,
|
||||
})
|
||||
}
|
||||
|
||||
fn parse_microstructure(microstructure_js: JsObject) -> Result<MarketMicrostructure> {
|
||||
let intraday_volume_profile: Vec<f64> = microstructure_js.get_named_property("intradayVolumeProfile")
|
||||
.unwrap_or_else(|_| vec![1.0/24.0; 24]);
|
||||
|
||||
Ok(MarketMicrostructure {
|
||||
symbol: microstructure_js.get_named_property("symbol")?,
|
||||
avg_spread_bps: microstructure_js.get_named_property("avgSpreadBps")?,
|
||||
daily_volume: microstructure_js.get_named_property("dailyVolume")?,
|
||||
avg_trade_size: microstructure_js.get_named_property("avgTradeSize")?,
|
||||
volatility: microstructure_js.get_named_property("volatility")?,
|
||||
tick_size: microstructure_js.get_named_property("tickSize")?,
|
||||
lot_size: microstructure_js.get_named_property("lotSize")?,
|
||||
intraday_volume_profile,
|
||||
})
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue