新增信号日基准收盘字段

This commit is contained in:
boris
2026-07-13 15:51:24 +08:00
parent 5f5f0fcf16
commit e17c5ad3b0
3 changed files with 13 additions and 0 deletions
@@ -400,6 +400,7 @@ struct DayExpressionState {
signal_close: f64, signal_close: f64,
benchmark_open: f64, benchmark_open: f64,
benchmark_close: f64, benchmark_close: f64,
benchmark_signal_close: f64,
benchmark_ma_short: f64, benchmark_ma_short: f64,
benchmark_ma_long: f64, benchmark_ma_long: f64,
benchmark_ma5: f64, benchmark_ma5: f64,
@@ -965,6 +966,7 @@ impl PlatformExprStrategy {
name, name,
"signal_close" "signal_close"
| "benchmark_close" | "benchmark_close"
| "benchmark_signal_close"
| "signal_ma5" | "signal_ma5"
| "signal_ma10" | "signal_ma10"
| "signal_ma20" | "signal_ma20"
@@ -2792,6 +2794,7 @@ impl PlatformExprStrategy {
.benchmark(date) .benchmark(date)
.ok_or(BacktestError::MissingBenchmark { date })?; .ok_or(BacktestError::MissingBenchmark { date })?;
let benchmark_open = benchmark.open; let benchmark_open = benchmark.open;
let benchmark_signal_close = benchmark.close;
let benchmark_close = ctx let benchmark_close = ctx
.data .data
.benchmark_decision_close(date) .benchmark_decision_close(date)
@@ -2874,6 +2877,7 @@ impl PlatformExprStrategy {
signal_close, signal_close,
benchmark_open, benchmark_open,
benchmark_close, benchmark_close,
benchmark_signal_close,
benchmark_ma_short, benchmark_ma_short,
benchmark_ma_long, benchmark_ma_long,
benchmark_ma5, benchmark_ma5,
@@ -3304,6 +3308,7 @@ impl PlatformExprStrategy {
scope.push("signal_close", day.signal_close); scope.push("signal_close", day.signal_close);
scope.push("benchmark_open", day.benchmark_open); scope.push("benchmark_open", day.benchmark_open);
scope.push("benchmark_close", day.benchmark_close); scope.push("benchmark_close", day.benchmark_close);
scope.push("benchmark_signal_close", day.benchmark_signal_close);
for field in [ for field in [
"day_open", "day_open",
"open", "open",
@@ -3467,6 +3472,10 @@ impl PlatformExprStrategy {
day_factors.insert("signal_close".into(), Dynamic::from(day.signal_close)); day_factors.insert("signal_close".into(), Dynamic::from(day.signal_close));
day_factors.insert("benchmark_open".into(), Dynamic::from(day.benchmark_open)); day_factors.insert("benchmark_open".into(), Dynamic::from(day.benchmark_open));
day_factors.insert("benchmark_close".into(), Dynamic::from(day.benchmark_close)); day_factors.insert("benchmark_close".into(), Dynamic::from(day.benchmark_close));
day_factors.insert(
"benchmark_signal_close".into(),
Dynamic::from(day.benchmark_signal_close),
);
day_factors.insert("signal_ma5".into(), Dynamic::from(day.signal_ma5)); day_factors.insert("signal_ma5".into(), Dynamic::from(day.signal_ma5));
day_factors.insert("signal_ma10".into(), Dynamic::from(day.signal_ma10)); day_factors.insert("signal_ma10".into(), Dynamic::from(day.signal_ma10));
day_factors.insert("signal_ma20".into(), Dynamic::from(day.signal_ma20)); day_factors.insert("signal_ma20".into(), Dynamic::from(day.signal_ma20));
@@ -11555,6 +11564,7 @@ mod tests {
assert_eq!(day.signal_close, 10.0); assert_eq!(day.signal_close, 10.0);
assert_eq!(day.benchmark_open, 150.0); assert_eq!(day.benchmark_open, 150.0);
assert_eq!(day.benchmark_close, 100.0); assert_eq!(day.benchmark_close, 100.0);
assert_eq!(day.benchmark_signal_close, 9_999.0);
assert_eq!(day.benchmark_ma_short, 100.0); assert_eq!(day.benchmark_ma_short, 100.0);
assert_eq!(day.benchmark_ma_long, 100.0); assert_eq!(day.benchmark_ma_long, 100.0);
} }
@@ -67,6 +67,7 @@ const RESERVED_SCOPE_NAMES: &[&str] = &[
// day-level // day-level
"signal_close", "signal_close",
"benchmark_close", "benchmark_close",
"benchmark_signal_close",
"signal_ma5", "signal_ma5",
"signal_ma10", "signal_ma10",
"signal_ma20", "signal_ma20",
@@ -326,6 +327,7 @@ mod tests {
for required in [ for required in [
"signal_close", "signal_close",
"benchmark_close", "benchmark_close",
"benchmark_signal_close",
"close", "close",
"avg_cost", "avg_cost",
"current_price", "current_price",
+1
View File
@@ -280,6 +280,7 @@ pub fn built_in_strategy_manual() -> StrategyAiManual {
fields: vec![ fields: vec![
ManualField { name: "signal_open/signal_close".to_string(), field_type: "float".to_string(), detail: "信号指数当日开盘价与前一日收盘价。".to_string() }, ManualField { name: "signal_open/signal_close".to_string(), field_type: "float".to_string(), detail: "信号指数当日开盘价与前一日收盘价。".to_string() },
ManualField { name: "benchmark_open/benchmark_close".to_string(), field_type: "float".to_string(), detail: "基准当日开盘价与前一日收盘价。".to_string() }, ManualField { name: "benchmark_open/benchmark_close".to_string(), field_type: "float".to_string(), detail: "基准当日开盘价与前一日收盘价。".to_string() },
ManualField { name: "benchmark_signal_close".to_string(), field_type: "float".to_string(), detail: "信号日收盘后可见的基准当日收盘价;用于 T 日生成信号、T+1 开盘成交的条件,不能在盘中或 T 日开盘决策中使用。".to_string() },
ManualField { name: "signal_ma5/signal_ma10/signal_ma20/signal_ma30".to_string(), field_type: "float".to_string(), detail: "信号指数滚动均线。".to_string() }, ManualField { name: "signal_ma5/signal_ma10/signal_ma20/signal_ma30".to_string(), field_type: "float".to_string(), detail: "信号指数滚动均线。".to_string() },
ManualField { name: "benchmark_ma5/benchmark_ma10/benchmark_ma20/benchmark_ma30".to_string(), field_type: "float".to_string(), detail: "基准指数滚动均线。".to_string() }, ManualField { name: "benchmark_ma5/benchmark_ma10/benchmark_ma20/benchmark_ma30".to_string(), field_type: "float".to_string(), detail: "基准指数滚动均线。".to_string() },
ManualField { name: "cash/available_cash/frozen_cash/market_value/total_equity".to_string(), field_type: "float".to_string(), detail: "账户可用资金、挂单冻结资金、市值与总权益;available_cash 会扣减当前买入挂单冻结估算。".to_string() }, ManualField { name: "cash/available_cash/frozen_cash/market_value/total_equity".to_string(), field_type: "float".to_string(), detail: "账户可用资金、挂单冻结资金、市值与总权益;available_cash 会扣减当前买入挂单冻结估算。".to_string() },