diff --git a/data/demo/000852量价微盘平台策略.engine-script.txt b/data/demo/000852量价微盘平台策略.engine-script.txt new file mode 100644 index 0000000..71d3bf5 --- /dev/null +++ b/data/demo/000852量价微盘平台策略.engine-script.txt @@ -0,0 +1,51 @@ +let refresh_rate = 15; +let stocknum = 40; +let close_rate = 1.07; +let loss_rate = 0.93; +let rsi_rate = 1.0001; +let trade_rate = 0.5; + +fn band_start(current_price) { + if abs(current_price - 2000) < 0.000001 { + 7 + } else { + (current_price - 2000) * (4.0 / 500.0) + 7 + } +} + +fn band_end(current_price) { + band_start(current_price) + 10 +} + +strategy("microcap_volume_trend_000852") { + market("CN_A") + benchmark("000852.SH") + signal("000852.SH") + + rebalance.every_days(refresh_rate).at("10:18") + + universe.exclude("paused", "st", "kcb", "one_yuan", "new_listing") + + selection.limit(stocknum) + selection.market_cap_band( + field="market_cap", + lower=band_start(signal_close), + upper=band_end(signal_close) + ) + + risk.index_exposure( + signal_ma5 > signal_ma10 * rsi_rate ? 1.0 : trade_rate + ) + + filter.stock_expr( + 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.take_profit(close_rate) + risk.stop_loss(loss_rate) + + ordering.rank_by("market_cap", "asc") +} diff --git a/data/demo/000852量价微盘平台策略.strategy_spec.json b/data/demo/000852量价微盘平台策略.strategy_spec.json new file mode 100644 index 0000000..30079e2 --- /dev/null +++ b/data/demo/000852量价微盘平台策略.strategy_spec.json @@ -0,0 +1,38 @@ +{ + "strategyId": "microcap_volume_trend_000852", + "version": "2", + "parser": "omniquant-engine-script-v2", + "market": "CN_A", + "signalSymbol": "000852.SH", + "benchmark": { + "instrumentId": "000852.SH", + "fallbackInstrumentId": "000852.SH" + }, + "engineConfig": { + "market": "CN_A", + "signalSymbol": "000852.SH", + "benchmarkSymbol": "000852.SH", + "refreshRate": 15, + "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}", + "selection": { + "limitExpr": "stocknum", + "marketCapField": "market_cap", + "marketCapLowerExpr": "band_start(signal_close)", + "marketCapUpperExpr": "band_end(signal_close)", + "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": { + "exposureExpr": "signal_ma5 > signal_ma10 * rsi_rate ? 1.0 : trade_rate", + "stopLossExpr": "loss_rate", + "takeProfitExpr": "close_rate" + }, + "ordering": { + "rankBy": "market_cap", + "rankExpr": "", + "rankOrder": "asc" + } + } +}