From 7f54309d538d06bd988e4de4b390fc297789e90d Mon Sep 17 00:00:00 2001 From: boris Date: Wed, 22 Apr 2026 03:03:23 -0700 Subject: [PATCH] Parameterize 000852 band range helpers --- .../000852量价微盘平台策略.engine-script.txt | 22 ++++++++++++------- .../000852量价微盘平台策略.strategy_spec.json | 6 ++--- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/data/demo/000852量价微盘平台策略.engine-script.txt b/data/demo/000852量价微盘平台策略.engine-script.txt index 71d3bf5..308e89b 100644 --- a/data/demo/000852量价微盘平台策略.engine-script.txt +++ b/data/demo/000852量价微盘平台策略.engine-script.txt @@ -4,17 +4,23 @@ let close_rate = 1.07; let loss_rate = 0.93; let rsi_rate = 1.0001; let trade_rate = 0.5; +let xs = 4 / 500; +let base_index_level = 2000; +let base_cap_floor = 7; +let cap_span = 10; -fn band_start(current_price) { - if abs(current_price - 2000) < 0.000001 { - 7 +fn band_start(current_price, base_index_level, xs, base_cap_floor) { + if current_price == base_index_level { + base_cap_floor + } else if current_price > 0 { + (current_price - base_index_level) * xs + base_cap_floor } else { - (current_price - 2000) * (4.0 / 500.0) + 7 + base_cap_floor } } -fn band_end(current_price) { - band_start(current_price) + 10 +fn band_end(current_price, base_index_level, xs, base_cap_floor, cap_span) { + band_start(current_price, base_index_level, xs, base_cap_floor) + cap_span } strategy("microcap_volume_trend_000852") { @@ -29,8 +35,8 @@ strategy("microcap_volume_trend_000852") { selection.limit(stocknum) selection.market_cap_band( field="market_cap", - lower=band_start(signal_close), - upper=band_end(signal_close) + lower=band_start(signal_close, base_index_level, xs, base_cap_floor), + upper=band_end(signal_close, base_index_level, xs, base_cap_floor, cap_span) ) risk.index_exposure( diff --git a/data/demo/000852量价微盘平台策略.strategy_spec.json b/data/demo/000852量价微盘平台策略.strategy_spec.json index 30079e2..4f1ad02 100644 --- a/data/demo/000852量价微盘平台策略.strategy_spec.json +++ b/data/demo/000852量价微盘平台策略.strategy_spec.json @@ -16,12 +16,12 @@ "rankLimit": 40 }, "runtimeExpressions": { - "prelude": "let refresh_rate = 15;\nlet stocknum = 40;\nlet close_rate = 1.07;\nlet loss_rate = 0.93;\nlet rsi_rate = 1.0001;\nlet trade_rate = 0.5;\nfn band_start(current_price) {\n if abs(current_price - 2000) < 0.000001 {\n 7\n } else {\n (current_price - 2000) * (4.0 / 500.0) + 7\n }\n}\nfn band_end(current_price) {\n band_start(current_price) + 10\n}", + "prelude": "let refresh_rate = 15;\nlet stocknum = 40;\nlet close_rate = 1.07;\nlet loss_rate = 0.93;\nlet rsi_rate = 1.0001;\nlet trade_rate = 0.5;\nlet xs = 4 / 500;\nlet base_index_level = 2000;\nlet base_cap_floor = 7;\nlet cap_span = 10;\nfn band_start(current_price, base_index_level, xs, base_cap_floor) {\n if current_price == base_index_level {\n base_cap_floor\n } else if current_price > 0 {\n (current_price - base_index_level) * xs + base_cap_floor\n } else {\n base_cap_floor\n }\n}\nfn band_end(current_price, base_index_level, xs, base_cap_floor, cap_span) {\n band_start(current_price, base_index_level, xs, base_cap_floor) + cap_span\n}", "selection": { "limitExpr": "stocknum", "marketCapField": "market_cap", - "marketCapLowerExpr": "band_start(signal_close)", - "marketCapUpperExpr": "band_end(signal_close)", + "marketCapLowerExpr": "band_start(signal_close, base_index_level, xs, base_cap_floor)", + "marketCapUpperExpr": "band_end(signal_close, base_index_level, xs, base_cap_floor, cap_span)", "stockFilterExpr": "stock_ma5 > stock_ma10 * rsi_rate && stock_ma10 > stock_ma30 * rsi_rate && rolling_mean(\"volume\", 5) < rolling_mean(\"volume\", 20) && rolling_mean(\"volume\", 5) < rolling_mean(\"volume\", 60)" }, "risk": {