缓存调度执行quote查询

This commit is contained in:
boris
2026-06-21 01:29:15 +08:00
parent 581d4e32d0
commit 192ac3f843
+34 -10
View File
@@ -558,6 +558,10 @@ pub struct PlatformExprStrategy {
stock_state_cache_date: RefCell<Option<NaiveDate>>, stock_state_cache_date: RefCell<Option<NaiveDate>>,
stock_state_cache: stock_state_cache:
RefCell<HashMap<(NaiveDate, NaiveDate, String, Option<NaiveTime>), StockExpressionState>>, RefCell<HashMap<(NaiveDate, NaiveDate, String, Option<NaiveTime>), StockExpressionState>>,
scheduled_quote_cache_date: RefCell<Option<NaiveDate>>,
scheduled_quote_cache: RefCell<
HashMap<(NaiveDate, String, NaiveDateTime), Option<crate::data::IntradayExecutionQuote>>,
>,
} }
#[derive(Debug, Clone, PartialEq)] #[derive(Debug, Clone, PartialEq)]
@@ -672,6 +676,8 @@ impl PlatformExprStrategy {
stock_extra_factors_required, stock_extra_factors_required,
stock_state_cache_date: RefCell::new(None), stock_state_cache_date: RefCell::new(None),
stock_state_cache: RefCell::new(HashMap::new()), stock_state_cache: RefCell::new(HashMap::new()),
scheduled_quote_cache_date: RefCell::new(None),
scheduled_quote_cache: RefCell::new(HashMap::new()),
} }
} }
@@ -1192,22 +1198,22 @@ impl PlatformExprStrategy {
) )
} }
fn aiquant_scheduled_quote<'a>( fn aiquant_scheduled_quote(
&self, &self,
ctx: &'a StrategyContext<'_>, ctx: &StrategyContext<'_>,
date: NaiveDate, date: NaiveDate,
symbol: &str, symbol: &str,
) -> Option<&'a crate::data::IntradayExecutionQuote> { ) -> Option<crate::data::IntradayExecutionQuote> {
self.aiquant_scheduled_quote_at_time(ctx, date, symbol, None) self.aiquant_scheduled_quote_at_time(ctx, date, symbol, None)
} }
fn aiquant_scheduled_quote_at_time<'a>( fn aiquant_scheduled_quote_at_time(
&self, &self,
ctx: &'a StrategyContext<'_>, ctx: &StrategyContext<'_>,
date: NaiveDate, date: NaiveDate,
symbol: &str, symbol: &str,
execution_time: Option<NaiveTime>, execution_time: Option<NaiveTime>,
) -> Option<&'a crate::data::IntradayExecutionQuote> { ) -> Option<crate::data::IntradayExecutionQuote> {
if !self.config.aiquant_transaction_cost { if !self.config.aiquant_transaction_cost {
return None; return None;
} }
@@ -1218,11 +1224,28 @@ impl PlatformExprStrategy {
&ProjectedExecutionState::default(), &ProjectedExecutionState::default(),
execution_time, execution_time,
); );
ctx.data {
let mut cache_date = self.scheduled_quote_cache_date.borrow_mut();
if *cache_date != Some(date) {
self.scheduled_quote_cache.borrow_mut().clear();
*cache_date = Some(date);
}
}
let cache_key = (date, symbol.to_string(), start_cursor);
if let Some(cached) = self.scheduled_quote_cache.borrow().get(&cache_key) {
return cached.clone();
}
let quote = ctx
.data
.execution_quotes_on(date, symbol) .execution_quotes_on(date, symbol)
.iter() .iter()
.filter(|quote| quote.timestamp <= start_cursor) .filter(|quote| quote.timestamp <= start_cursor)
.max_by_key(|quote| quote.timestamp) .max_by_key(|quote| quote.timestamp)
.cloned();
self.scheduled_quote_cache
.borrow_mut()
.insert(cache_key, quote.clone());
quote
} }
fn aiquant_scheduled_buy_price( fn aiquant_scheduled_buy_price(
@@ -1232,7 +1255,7 @@ impl PlatformExprStrategy {
symbol: &str, symbol: &str,
) -> Option<f64> { ) -> Option<f64> {
self.aiquant_scheduled_quote(ctx, date, symbol) self.aiquant_scheduled_quote(ctx, date, symbol)
.and_then(|quote| self.projected_quote_raw_price(quote, OrderSide::Buy)) .and_then(|quote| self.projected_quote_raw_price(&quote, OrderSide::Buy))
} }
fn aiquant_scheduled_sell_price_at_time( fn aiquant_scheduled_sell_price_at_time(
@@ -1243,7 +1266,7 @@ impl PlatformExprStrategy {
execution_time: Option<NaiveTime>, execution_time: Option<NaiveTime>,
) -> Option<f64> { ) -> Option<f64> {
self.aiquant_scheduled_quote_at_time(ctx, date, symbol, execution_time) self.aiquant_scheduled_quote_at_time(ctx, date, symbol, execution_time)
.and_then(|quote| self.projected_quote_raw_price(quote, OrderSide::Sell)) .and_then(|quote| self.projected_quote_raw_price(&quote, OrderSide::Sell))
} }
fn aiquant_scheduled_last_price( fn aiquant_scheduled_last_price(
@@ -2428,11 +2451,12 @@ impl PlatformExprStrategy {
low: expression_low, low: expression_low,
close: expression_close, close: expression_close,
last: decision_quote last: decision_quote
.as_ref()
.and_then(|quote| { .and_then(|quote| {
(quote.last_price.is_finite() && quote.last_price > 0.0) (quote.last_price.is_finite() && quote.last_price > 0.0)
.then_some(quote.last_price) .then_some(quote.last_price)
}) })
.or_else(|| decision_quote.and_then(|quote| quote.buy_price())) .or_else(|| decision_quote.as_ref().and_then(|quote| quote.buy_price()))
.unwrap_or(market.last_price), .unwrap_or(market.last_price),
prev_close: feature_market.prev_close, prev_close: feature_market.prev_close,
amount, amount,