Add suspended and ST data helpers
This commit is contained in:
@@ -947,6 +947,18 @@ impl DataSet {
|
||||
self.calendar.next_trading_date(date, n)
|
||||
}
|
||||
|
||||
pub fn is_suspended_flags(&self, date: NaiveDate, symbol: &str, count: usize) -> Vec<bool> {
|
||||
self.historical_daily_flags(date, symbol, count, |candidate, market| {
|
||||
candidate.is_some_and(|row| row.is_paused) || market.is_some_and(|row| row.paused)
|
||||
})
|
||||
}
|
||||
|
||||
pub fn is_st_stock_flags(&self, date: NaiveDate, symbol: &str, count: usize) -> Vec<bool> {
|
||||
self.historical_daily_flags(date, symbol, count, |candidate, _| {
|
||||
candidate.is_some_and(|row| row.is_st)
|
||||
})
|
||||
}
|
||||
|
||||
pub fn price(&self, date: NaiveDate, symbol: &str, field: PriceField) -> Option<f64> {
|
||||
let snapshot = self.market(date, symbol)?;
|
||||
Some(snapshot.price(field))
|
||||
@@ -1047,6 +1059,36 @@ impl DataSet {
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn historical_daily_flags<F>(
|
||||
&self,
|
||||
date: NaiveDate,
|
||||
symbol: &str,
|
||||
count: usize,
|
||||
evaluator: F,
|
||||
) -> Vec<bool>
|
||||
where
|
||||
F: Fn(Option<&CandidateEligibility>, Option<&DailyMarketSnapshot>) -> bool,
|
||||
{
|
||||
if count == 0 {
|
||||
return Vec::new();
|
||||
}
|
||||
let days = self
|
||||
.calendar
|
||||
.iter()
|
||||
.filter(|day| *day <= date)
|
||||
.collect::<Vec<_>>();
|
||||
let start = days.len().saturating_sub(count);
|
||||
days[start..]
|
||||
.iter()
|
||||
.map(|day| {
|
||||
evaluator(
|
||||
self.candidate_index.get(&(*day, symbol.to_string())),
|
||||
self.market_index.get(&(*day, symbol.to_string())),
|
||||
)
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
pub fn market_decision_close(&self, date: NaiveDate, symbol: &str) -> Option<f64> {
|
||||
self.market_series_by_symbol
|
||||
.get(symbol)
|
||||
|
||||
@@ -285,6 +285,16 @@ impl StrategyContext<'_> {
|
||||
self.data.next_trading_date(date, n)
|
||||
}
|
||||
|
||||
pub fn is_suspended(&self, symbol: &str, count: usize) -> Vec<bool> {
|
||||
self.data
|
||||
.is_suspended_flags(self.execution_date, symbol, count)
|
||||
}
|
||||
|
||||
pub fn is_st_stock(&self, symbol: &str, count: usize) -> Vec<bool> {
|
||||
self.data
|
||||
.is_st_stock_flags(self.execution_date, symbol, count)
|
||||
}
|
||||
|
||||
pub fn has_subscriptions(&self) -> bool {
|
||||
!self.subscriptions.is_empty()
|
||||
}
|
||||
|
||||
@@ -199,6 +199,7 @@ pub fn built_in_strategy_manual() -> StrategyAiManual {
|
||||
ManualFunction { name: "current_snapshot".to_string(), signature: "ctx.current_snapshot(symbol)".to_string(), detail: "读取当前交易日指定证券的日级快照,可用于获得当日 open/close/last/upper_limit/lower_limit 等字段。".to_string() },
|
||||
ManualFunction { name: "instrument/instruments/all_instruments".to_string(), signature: "ctx.instrument(symbol)".to_string(), detail: "读取证券元数据,包括名称、板块、上市日期、退市日期、最小下单量、整手、最小价位等;all_instruments 按证券代码稳定排序返回全量证券。".to_string() },
|
||||
ManualFunction { name: "get_trading_dates/get_previous_trading_date/get_next_trading_date".to_string(), signature: "ctx.get_previous_trading_date(date, n)".to_string(), detail: "交易日历 API。get_trading_dates 返回闭区间交易日;previous/next 返回相对某日向前或向后的第 n 个交易日,当前日自身不计入。".to_string() },
|
||||
ManualFunction { name: "is_suspended/is_st_stock".to_string(), signature: "ctx.is_suspended(symbol, count)".to_string(), detail: "读取指定证券截至当前交易日最近 count 个交易日的停牌或 ST 标记,返回 bool 序列,顺序从旧到新;对应 RQAlpha 的 is_suspended/is_st_stock 数据源能力。".to_string() },
|
||||
ManualFunction { name: "rolling_mean".to_string(), signature: "rolling_mean(\"field\", lookback)".to_string(), detail: "任意字段滚动均值,支持 volume/amount/turnover_ratio、signal_open/signal_close、benchmark_open/benchmark_close 等。任意成交量窗口推荐用它,比如 rolling_mean(\"volume\", 15)。".to_string() },
|
||||
ManualFunction { name: "sma".to_string(), signature: "sma(\"field\", lookback)".to_string(), detail: "rolling_mean 的别名。任意价格均线窗口推荐用它,比如 sma(\"close\", 15)。".to_string() },
|
||||
ManualFunction { name: "round/floor/ceil/abs/min/max/clamp".to_string(), signature: "round(x)".to_string(), detail: "常用数值函数。".to_string() },
|
||||
|
||||
Reference in New Issue
Block a user