@dshtrading/client-ui-strategies 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +75 -0
- package/lib/client/contract.d.ts +15 -0
- package/lib/client/locales.d.ts +6 -0
- package/lib/client/locales.js +239 -0
- package/lib/client.js +10948 -0
- package/lib/client.js.map +1 -0
- package/lib/index.d.ts +12 -0
- package/lib/index.js +12 -0
- package/package.json +66 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
Copyright (c) 2026 zhu1090093659 (dsh-trading)
|
|
2
|
+
|
|
3
|
+
# PolyForm Noncommercial License 1.0.0
|
|
4
|
+
|
|
5
|
+
<https://polyformproject.org/licenses/noncommercial/1.0.0>
|
|
6
|
+
|
|
7
|
+
## Acceptance
|
|
8
|
+
|
|
9
|
+
In order to get any license under these terms, you must agree to them as both strict obligations and conditions to all your licenses.
|
|
10
|
+
|
|
11
|
+
## Copyright License
|
|
12
|
+
|
|
13
|
+
The licensor grants you a copyright license for the software to do everything you might do with the software that would otherwise infringe the licensor's copyright in it for any permitted purpose. However, you may only distribute the software according to [Distribution License](#distribution-license) and make changes or new works based on the software according to [Changes and New Works License](#changes-and-new-works-license).
|
|
14
|
+
|
|
15
|
+
## Distribution License
|
|
16
|
+
|
|
17
|
+
The licensor grants you an additional copyright license to distribute copies of the software. Your license to distribute covers distributing the software with changes and new works permitted by [Changes and New Works License](#changes-and-new-works-license).
|
|
18
|
+
|
|
19
|
+
## Notices
|
|
20
|
+
|
|
21
|
+
You must ensure that anyone who gets a copy of any part of the software from you also gets a copy of these terms or the URL for them above, as well as copies of any plain-text lines beginning with `Required Notice:` that the licensor provided with the software. For example:
|
|
22
|
+
|
|
23
|
+
> Required Notice: Copyright Yoyodyne, Inc. (http://example.com)
|
|
24
|
+
|
|
25
|
+
## Changes and New Works License
|
|
26
|
+
|
|
27
|
+
The licensor grants you an additional copyright license to make changes and new works based on the software for any permitted purpose.
|
|
28
|
+
|
|
29
|
+
## Patent License
|
|
30
|
+
|
|
31
|
+
The licensor grants you a patent license for the software that covers patent claims the licensor can license, or becomes able to license, that you would infringe by using the software.
|
|
32
|
+
|
|
33
|
+
## Noncommercial Purposes
|
|
34
|
+
|
|
35
|
+
Any noncommercial purpose is a permitted purpose.
|
|
36
|
+
|
|
37
|
+
## Personal Uses
|
|
38
|
+
|
|
39
|
+
Personal use for research, experiment, and testing for the benefit of public knowledge, personal study, private entertainment, hobby projects, amateur pursuits, or religious observance, without any anticipated commercial application, is use for a permitted purpose.
|
|
40
|
+
|
|
41
|
+
## Noncommercial Organizations
|
|
42
|
+
|
|
43
|
+
Use by any charitable organization, educational institution, public research organization, public safety or health organization, environmental protection organization, or government institution is use for a permitted purpose regardless of the source of funding or obligations resulting from the funding.
|
|
44
|
+
|
|
45
|
+
## Fair Use
|
|
46
|
+
|
|
47
|
+
You may have "fair use" rights for the software under the law. These terms do not limit them.
|
|
48
|
+
|
|
49
|
+
## No Other Rights
|
|
50
|
+
|
|
51
|
+
These terms do not allow you to sublicense or transfer any of your licenses to anyone else, or prevent the licensor from granting licenses to anyone else. These terms do not imply any other licenses.
|
|
52
|
+
|
|
53
|
+
## Patent Defense
|
|
54
|
+
|
|
55
|
+
If you make any written claim that the software infringes or contributes to infringement of any patent, your patent license for the software granted under these terms ends immediately. If your company makes such a claim, your patent license ends immediately for work on behalf of your company.
|
|
56
|
+
|
|
57
|
+
## Violations
|
|
58
|
+
|
|
59
|
+
The first time you are notified in writing that you have violated any of these terms, or done anything with the software not covered by your licenses, your licenses can nonetheless continue if you come into full compliance with these terms, and take practical steps to correct past violations, within 32 days of receiving notice. Otherwise, all your licenses end immediately.
|
|
60
|
+
|
|
61
|
+
## No Liability
|
|
62
|
+
|
|
63
|
+
***As far as the law allows, the software comes as is, without any warranty or condition, and the licensor will not be liable to you for any damages arising out of these terms or the use or nature of the software, under any kind of legal claim.***
|
|
64
|
+
|
|
65
|
+
## Definitions
|
|
66
|
+
|
|
67
|
+
The **licensor** is the individual or entity offering these terms, and the **software** is the software the licensor makes available under these terms.
|
|
68
|
+
|
|
69
|
+
**You** refers to the individual or entity agreeing to these terms.
|
|
70
|
+
|
|
71
|
+
**Your company** is any legal entity, sole proprietorship, or other kind of organization that you work for, plus all organizations that have control over, are under the control of, or are under common control with that organization. **Control** means ownership of substantially all the assets of an entity, or the power to direct its management and policies by vote, contract, or otherwise. Control can be direct or indirect.
|
|
72
|
+
|
|
73
|
+
**Your licenses** are all the licenses granted to you for the software under these terms.
|
|
74
|
+
|
|
75
|
+
**Use** means anything you do with the software requiring one of your licenses.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
//#region src/client/contract.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* client-ui-strategies 的 locale 契约:独立 namespace「dshtrading.strategies」
|
|
4
|
+
* (P5 拆包后文案随视图包走,不再寄生 shell 的 dshtrading.market 词典——
|
|
5
|
+
* 同 NS 双包注册会整表覆盖)。key 前缀 sv.*(stage view strategies)。
|
|
6
|
+
*/
|
|
7
|
+
type StrategyLocaleKey = 'sv.section.screener' | 'sv.section.quant' | 'sv.error.noKlines' | 'sv.error.failed' | 'sv.horizon.short' | 'sv.horizon.swing' | 'sv.horizon.long' | 'sv.symbolLabel' | 'sv.intervalDaily' | 'sv.run' | 'sv.running' | 'sv.metrics.totalReturn' | 'sv.metrics.cagr' | 'sv.metrics.maxDrawdown' | 'sv.metrics.sharpe' | 'sv.metrics.winRate' | 'sv.metrics.profitFactor' | 'sv.metrics.tradeCount' | 'sv.metrics.tradeUnit' | 'sv.metrics.exposure' | 'sv.trades.title' | 'sv.trades.empty' | 'sv.trades.entryTime' | 'sv.trades.exitTime' | 'sv.trades.entryPrice' | 'sv.trades.exitPrice' | 'sv.trades.holdingBars' | 'sv.trades.netReturn' | 'sv.trades.exitReason' | 'sv.empty.hint' | 'sv.screener.run' | 'sv.screener.stop' | 'sv.screener.scanLimit' | 'sv.screener.universePrefix' | 'sv.screener.scanned' | 'sv.screener.hits' | 'sv.screener.failed' | 'sv.screener.noUniverse' | 'sv.screener.noHits' | 'sv.screener.scanning' | 'sv.screener.emptyHint' | 'sv.screener.col.symbol' | 'sv.screener.col.name' | 'sv.screener.col.price' | 'sv.screener.col.reason' | 'sv.author.failed' | 'strat.donchian-breakout' | 'strat.donchian-breakout.summary' | 'strat.donchian-breakout.param.lookbackEntry' | 'strat.donchian-breakout.param.lookbackExit' | 'strat.donchian-breakout.reason.entry' | 'strat.donchian-breakout.reason.exit' | 'strat.rsi-reversion' | 'strat.rsi-reversion.summary' | 'strat.rsi-reversion.param.rsiPeriod' | 'strat.rsi-reversion.param.entryThreshold' | 'strat.rsi-reversion.param.exitThreshold' | 'strat.rsi-reversion.reason.entry' | 'strat.rsi-reversion.reason.exit' | 'strat.ema-crossover' | 'strat.ema-crossover.summary' | 'strat.ema-crossover.param.fastPeriod' | 'strat.ema-crossover.param.slowPeriod' | 'strat.ema-crossover.reason.entry' | 'strat.ema-crossover.reason.exit' | 'strat.bollinger-reversion' | 'strat.bollinger-reversion.summary' | 'strat.bollinger-reversion.param.period' | 'strat.bollinger-reversion.param.multiplier' | 'strat.bollinger-reversion.reason.entry' | 'strat.bollinger-reversion.reason.exit' | 'strat.sma-baseline' | 'strat.sma-baseline.summary' | 'strat.sma-baseline.param.period' | 'strat.sma-baseline.reason.entry' | 'strat.sma-baseline.reason.exit' | 'strat.momentum-12m' | 'strat.momentum-12m.summary' | 'strat.momentum-12m.param.lookbackBars' | 'strat.momentum-12m.reason.entry' | 'strat.momentum-12m.reason.exit' | 'scr.ma-bull-align' | 'scr.ma-bull-align.summary' | 'scr.ma-bull-align.param.n1' | 'scr.ma-bull-align.param.n2' | 'scr.ma-bull-align.param.n3' | 'scr.ma-bull-align.col.distLongPct' | 'scr.ma-bull-align.reason' | 'scr.volume-breakout' | 'scr.volume-breakout.summary' | 'scr.volume-breakout.param.lookback' | 'scr.volume-breakout.param.volMultiple' | 'scr.volume-breakout.col.volRatio' | 'scr.volume-breakout.col.breakoutPct' | 'scr.volume-breakout.reason' | 'scr.rsi-oversold' | 'scr.rsi-oversold.summary' | 'scr.rsi-oversold.param.period' | 'scr.rsi-oversold.param.threshold' | 'scr.rsi-oversold.col.rsi' | 'scr.rsi-oversold.reason' | 'scr.near-high' | 'scr.near-high.summary' | 'scr.near-high.param.window' | 'scr.near-high.param.withinPct' | 'scr.near-high.col.offHighPct' | 'scr.near-high.reason' | 'scr.above-ma' | 'scr.above-ma.summary' | 'scr.above-ma.param.period' | 'scr.above-ma.param.slopeBars' | 'scr.above-ma.col.aboveMaPct' | 'scr.above-ma.col.maSlopePct' | 'scr.above-ma.reason' | 'strat.momentum-12m.cause.momentumNegative' | 'strat.momentum-12m.cause.belowBaseline';
|
|
8
|
+
declare module '@deepseek-ai/dsh-client-locale/client' {
|
|
9
|
+
interface LocaleNamespaceMap {
|
|
10
|
+
/** 策略视图词典(client-ui-strategies 包私有)。 */
|
|
11
|
+
'dshtrading.strategies': StrategyLocaleKey;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//#endregion
|
|
15
|
+
export { StrategyLocaleKey };
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
//#region src/client/locales.ts
|
|
2
|
+
const zh = {
|
|
3
|
+
"sv.section.screener": "选股策略",
|
|
4
|
+
"sv.section.quant": "量化策略",
|
|
5
|
+
"sv.horizon.short": "短线交易",
|
|
6
|
+
"sv.horizon.swing": "波段操作",
|
|
7
|
+
"sv.horizon.long": "长线投资",
|
|
8
|
+
"sv.run": "运行回测",
|
|
9
|
+
"sv.running": "回测计算中...",
|
|
10
|
+
"sv.symbolLabel": "标的:",
|
|
11
|
+
"sv.intervalDaily": "(日K)",
|
|
12
|
+
"sv.error.noKlines": "未能获取到该标的的 K 线数据,无法执行回测",
|
|
13
|
+
"sv.error.failed": "策略计算异常",
|
|
14
|
+
"sv.metrics.totalReturn": "累计收益率",
|
|
15
|
+
"sv.metrics.cagr": "年化复合增长率 (CAGR)",
|
|
16
|
+
"sv.metrics.maxDrawdown": "最大回撤 (MDD)",
|
|
17
|
+
"sv.metrics.sharpe": "夏普比率 (Sharpe)",
|
|
18
|
+
"sv.metrics.winRate": "胜率 (Win Rate)",
|
|
19
|
+
"sv.metrics.profitFactor": "盈亏比 (Profit Factor)",
|
|
20
|
+
"sv.metrics.tradeCount": "交易笔数",
|
|
21
|
+
"sv.metrics.tradeUnit": "笔",
|
|
22
|
+
"sv.metrics.exposure": "市场暴露度 (Exposure)",
|
|
23
|
+
"sv.trades.title": "交易明细流水",
|
|
24
|
+
"sv.trades.empty": "回测区间内未触发交易信号",
|
|
25
|
+
"sv.trades.entryTime": "开仓时间",
|
|
26
|
+
"sv.trades.exitTime": "平仓时间",
|
|
27
|
+
"sv.trades.entryPrice": "开仓均价",
|
|
28
|
+
"sv.trades.exitPrice": "平仓均价",
|
|
29
|
+
"sv.trades.holdingBars": "持仓根数",
|
|
30
|
+
"sv.trades.netReturn": "单笔净收益率",
|
|
31
|
+
"sv.trades.exitReason": "离场原因",
|
|
32
|
+
"sv.empty.hint": "选择上方策略与参数后,点击「运行回测」查看绩效与权益曲线",
|
|
33
|
+
"sv.screener.run": "运行选股",
|
|
34
|
+
"sv.screener.stop": "停止",
|
|
35
|
+
"sv.screener.scanLimit": "扫描池上限",
|
|
36
|
+
"sv.screener.universePrefix": "标的名册",
|
|
37
|
+
"sv.screener.scanned": "已扫描",
|
|
38
|
+
"sv.screener.hits": "命中",
|
|
39
|
+
"sv.screener.failed": "失败",
|
|
40
|
+
"sv.screener.noUniverse": "当前数据源未提供标的全集,选股功能不可用(Binance/OKX 等提供名册的连接器可用)",
|
|
41
|
+
"sv.screener.noHits": "扫描完成:没有标的满足当前条件",
|
|
42
|
+
"sv.screener.scanning": "扫描中,命中将实时出现在下方...",
|
|
43
|
+
"sv.screener.emptyHint": "选择上方选股器与参数后,点击「运行选股」扫描全市场标的",
|
|
44
|
+
"sv.screener.col.symbol": "代码",
|
|
45
|
+
"sv.screener.col.name": "名称",
|
|
46
|
+
"sv.screener.col.price": "现价",
|
|
47
|
+
"sv.screener.col.reason": "信号说明",
|
|
48
|
+
"sv.author.failed": "策略校验未通过",
|
|
49
|
+
"strat.donchian-breakout": "唐奇安通道突破",
|
|
50
|
+
"strat.donchian-breakout.summary": "收盘价突破前 N1 根最高价做多,跌破前 N2 根最低价离场(海龟经典简化版)",
|
|
51
|
+
"strat.donchian-breakout.param.lookbackEntry": "突破周期 (N1)",
|
|
52
|
+
"strat.donchian-breakout.param.lookbackExit": "离场周期 (N2)",
|
|
53
|
+
"strat.donchian-breakout.reason.entry": "收盘价 ({close}) 突破前 {n} 根最高价 ({high})",
|
|
54
|
+
"strat.donchian-breakout.reason.exit": "收盘价 ({close}) 跌破前 {n} 根最低价 ({low})",
|
|
55
|
+
"strat.rsi-reversion": "RSI 短线极值回归",
|
|
56
|
+
"strat.rsi-reversion.summary": "短周期 RSI(2) 进入极端超卖区抄底,快速反弹后止盈(经典均值回归)",
|
|
57
|
+
"strat.rsi-reversion.param.rsiPeriod": "RSI 周期",
|
|
58
|
+
"strat.rsi-reversion.param.entryThreshold": "入场超卖阈值",
|
|
59
|
+
"strat.rsi-reversion.param.exitThreshold": "出场止盈阈值",
|
|
60
|
+
"strat.rsi-reversion.reason.entry": "RSI({period}) 达到极端超卖值 ({val} < {thresh}),触发反弹买入",
|
|
61
|
+
"strat.rsi-reversion.reason.exit": "RSI({period}) 回升至目标位 ({val} > {thresh}),止盈离场",
|
|
62
|
+
"strat.ema-crossover": "EMA 双均线趋势跟踪",
|
|
63
|
+
"strat.ema-crossover.summary": "快线 EMA 上穿慢线 EMA 金叉做多,死叉平仓(经典中线波段趋势策略)",
|
|
64
|
+
"strat.ema-crossover.param.fastPeriod": "快线周期 (Fast)",
|
|
65
|
+
"strat.ema-crossover.param.slowPeriod": "慢线周期 (Slow)",
|
|
66
|
+
"strat.ema-crossover.reason.entry": "EMA({fastP}) ({fast}) 上穿 EMA({slowP}) ({slow}) 形成金叉",
|
|
67
|
+
"strat.ema-crossover.reason.exit": "EMA({fastP}) ({fast}) 下穿 EMA({slowP}) ({slow}) 形成死叉",
|
|
68
|
+
"strat.bollinger-reversion": "布林带下轨均值回归",
|
|
69
|
+
"strat.bollinger-reversion.summary": "价格跌破布林线下轨时介入抄底,反弹至中轨(基准均线)时平仓(波段通道回归)",
|
|
70
|
+
"strat.bollinger-reversion.param.period": "布林周期",
|
|
71
|
+
"strat.bollinger-reversion.param.multiplier": "标准差倍数 (k)",
|
|
72
|
+
"strat.bollinger-reversion.reason.entry": "收盘价 ({close}) 跌破布林下轨 ({band}),触发波段均值回归",
|
|
73
|
+
"strat.bollinger-reversion.reason.exit": "收盘价 ({close}) 成功回归至布林中轨 ({mid}),完成目标止盈",
|
|
74
|
+
"strat.sma-baseline": "200 日均线牛熊择时基线",
|
|
75
|
+
"strat.sma-baseline.summary": "收盘价站上 SMA200 均线做多,跌破均线空仓避险(长线资产配置经典基线)",
|
|
76
|
+
"strat.sma-baseline.param.period": "长期均线周期",
|
|
77
|
+
"strat.sma-baseline.reason.entry": "收盘价 ({close}) 站上长期基线 SMA({period}) ({sma}),确立多头趋势",
|
|
78
|
+
"strat.sma-baseline.reason.exit": "收盘价 ({close}) 跌破长期基线 SMA({period}) ({sma}),转入防御避险",
|
|
79
|
+
"strat.momentum-12m": "12 个月动量择时",
|
|
80
|
+
"strat.momentum-12m.summary": "近 12 个月动量为正且站上年线做多,动量转负或破位离场(低换手长线动量)",
|
|
81
|
+
"strat.momentum-12m.param.lookbackBars": "动量回溯周期 (K线)",
|
|
82
|
+
"strat.momentum-12m.reason.entry": "近 {n} 周期动量为正 (+{pct}%) 且位于均线 ({sma}) 之上,确认强动量",
|
|
83
|
+
"strat.momentum-12m.reason.exit": "{cause} ({pct}% / SMA {sma}),动量衰减平仓",
|
|
84
|
+
"scr.ma-bull-align": "均线多头排列",
|
|
85
|
+
"scr.ma-bull-align.summary": "现价站上三线且 SMA(短) > SMA(中) > SMA(长),筛选趋势结构完整的标的",
|
|
86
|
+
"scr.ma-bull-align.param.n1": "短期均线",
|
|
87
|
+
"scr.ma-bull-align.param.n2": "中期均线",
|
|
88
|
+
"scr.ma-bull-align.param.n3": "长期均线",
|
|
89
|
+
"scr.ma-bull-align.col.distLongPct": "距长期均线",
|
|
90
|
+
"scr.ma-bull-align.reason": "现价站上三线且 SMA({n1}) > SMA({n2}) > SMA({n3}),多头排列",
|
|
91
|
+
"scr.volume-breakout": "放量突破",
|
|
92
|
+
"scr.volume-breakout.summary": "收盘价创 N 日新高且成交量 ≥ 均量 M 倍,量价配合的突破筛选",
|
|
93
|
+
"scr.volume-breakout.param.lookback": "突破窗口(日)",
|
|
94
|
+
"scr.volume-breakout.param.volMultiple": "量能倍数",
|
|
95
|
+
"scr.volume-breakout.col.volRatio": "量比(倍)",
|
|
96
|
+
"scr.volume-breakout.col.breakoutPct": "突破幅度",
|
|
97
|
+
"scr.volume-breakout.reason": "放量 {ratio} 倍突破 {n} 日高点",
|
|
98
|
+
"scr.rsi-oversold": "RSI 超卖",
|
|
99
|
+
"scr.rsi-oversold.summary": "RSI 跌入超卖区(默认 <30),筛选值得盯的反转候选(逆势信号)",
|
|
100
|
+
"scr.rsi-oversold.param.period": "RSI 周期",
|
|
101
|
+
"scr.rsi-oversold.param.threshold": "超卖阈值",
|
|
102
|
+
"scr.rsi-oversold.col.rsi": "RSI",
|
|
103
|
+
"scr.rsi-oversold.reason": "RSI({period}) = {val},进入超卖区(逆势信号)",
|
|
104
|
+
"scr.near-high": "接近一年新高",
|
|
105
|
+
"scr.near-high.summary": "现价距 N 日最高价不超过 X%,强势整理/突破前夜的动量筛选",
|
|
106
|
+
"scr.near-high.param.window": "窗口(日)",
|
|
107
|
+
"scr.near-high.param.withinPct": "接近阈值(%)",
|
|
108
|
+
"scr.near-high.col.offHighPct": "距高点",
|
|
109
|
+
"scr.near-high.reason": "距 {n} 日高点仅 {pct}%,处于突破前夜",
|
|
110
|
+
"scr.above-ma": "站上牛熊线",
|
|
111
|
+
"scr.above-ma.summary": "现价站上长期均线且均线斜率向上,筛选长线多头环境的标的",
|
|
112
|
+
"scr.above-ma.param.period": "牛熊线周期",
|
|
113
|
+
"scr.above-ma.param.slopeBars": "斜率窗口(日)",
|
|
114
|
+
"scr.above-ma.col.aboveMaPct": "高于均线",
|
|
115
|
+
"scr.above-ma.col.maSlopePct": "均线斜率",
|
|
116
|
+
"scr.above-ma.reason": "现价高于 SMA({period}) {above}%,均线 {slope} 日斜率 +{slopePct}%",
|
|
117
|
+
"strat.momentum-12m.cause.momentumNegative": "动量转为负值",
|
|
118
|
+
"strat.momentum-12m.cause.belowBaseline": "跌破基准均线"
|
|
119
|
+
};
|
|
120
|
+
const en = {
|
|
121
|
+
"sv.section.screener": "Screener",
|
|
122
|
+
"sv.section.quant": "Quantitative",
|
|
123
|
+
"sv.horizon.short": "Short-term",
|
|
124
|
+
"sv.horizon.swing": "Swing",
|
|
125
|
+
"sv.horizon.long": "Long-term",
|
|
126
|
+
"sv.run": "Run Backtest",
|
|
127
|
+
"sv.running": "Running...",
|
|
128
|
+
"sv.symbolLabel": "Symbol & Interval:",
|
|
129
|
+
"sv.intervalDaily": "(Daily)",
|
|
130
|
+
"sv.error.noKlines": "Failed to fetch klines for this symbol, cannot run backtest",
|
|
131
|
+
"sv.error.failed": "Strategy compute error",
|
|
132
|
+
"sv.metrics.totalReturn": "Total Return",
|
|
133
|
+
"sv.metrics.cagr": "CAGR",
|
|
134
|
+
"sv.metrics.maxDrawdown": "Max Drawdown",
|
|
135
|
+
"sv.metrics.sharpe": "Sharpe Ratio",
|
|
136
|
+
"sv.metrics.winRate": "Win Rate",
|
|
137
|
+
"sv.metrics.profitFactor": "Profit Factor",
|
|
138
|
+
"sv.metrics.tradeCount": "Trades",
|
|
139
|
+
"sv.metrics.tradeUnit": "trades",
|
|
140
|
+
"sv.metrics.exposure": "Market Exposure",
|
|
141
|
+
"sv.trades.title": "Trade Log",
|
|
142
|
+
"sv.trades.empty": "No trades generated in the backtest period",
|
|
143
|
+
"sv.trades.entryTime": "Entry Time",
|
|
144
|
+
"sv.trades.exitTime": "Exit Time",
|
|
145
|
+
"sv.trades.entryPrice": "Entry Price",
|
|
146
|
+
"sv.trades.exitPrice": "Exit Price",
|
|
147
|
+
"sv.trades.holdingBars": "Holding Bars",
|
|
148
|
+
"sv.trades.netReturn": "Net Return",
|
|
149
|
+
"sv.trades.exitReason": "Exit Reason",
|
|
150
|
+
"sv.empty.hint": "Select a strategy and parameters above, then click \"Run Backtest\"",
|
|
151
|
+
"sv.screener.run": "Scan",
|
|
152
|
+
"sv.screener.stop": "Stop",
|
|
153
|
+
"sv.screener.scanLimit": "Scan Cap",
|
|
154
|
+
"sv.screener.universePrefix": "Universe",
|
|
155
|
+
"sv.screener.scanned": "Scanned",
|
|
156
|
+
"sv.screener.hits": "Hits",
|
|
157
|
+
"sv.screener.failed": "Failed",
|
|
158
|
+
"sv.screener.noUniverse": "This data source does not provide a symbol universe; screening is unavailable (connectors like Binance/OKX do)",
|
|
159
|
+
"sv.screener.noHits": "Scan finished: no symbols match the current criteria",
|
|
160
|
+
"sv.screener.scanning": "Scanning, hits appear below in real time...",
|
|
161
|
+
"sv.screener.emptyHint": "Pick a screener and parameters above, then click \"Scan\" to screen the market",
|
|
162
|
+
"sv.screener.col.symbol": "Symbol",
|
|
163
|
+
"sv.screener.col.name": "Name",
|
|
164
|
+
"sv.screener.col.price": "Price",
|
|
165
|
+
"sv.screener.col.reason": "Signal",
|
|
166
|
+
"sv.author.failed": "Validation failed",
|
|
167
|
+
"strat.donchian-breakout": "Donchian breakout",
|
|
168
|
+
"strat.donchian-breakout.summary": "Go long when close breaks the N1-bar high; exit below the N2-bar low (classic turtle, simplified)",
|
|
169
|
+
"strat.donchian-breakout.param.lookbackEntry": "Breakout lookback (N1)",
|
|
170
|
+
"strat.donchian-breakout.param.lookbackExit": "Exit lookback (N2)",
|
|
171
|
+
"strat.donchian-breakout.reason.entry": "Close ({close}) breaks the {n}-bar high ({high})",
|
|
172
|
+
"strat.donchian-breakout.reason.exit": "Close ({close}) falls below the {n}-bar low ({low})",
|
|
173
|
+
"strat.rsi-reversion": "RSI short-term reversion",
|
|
174
|
+
"strat.rsi-reversion.summary": "Buy when short-period RSI(2) reaches extreme oversold; take profit on the quick bounce (classic mean reversion)",
|
|
175
|
+
"strat.rsi-reversion.param.rsiPeriod": "RSI period",
|
|
176
|
+
"strat.rsi-reversion.param.entryThreshold": "Entry oversold threshold",
|
|
177
|
+
"strat.rsi-reversion.param.exitThreshold": "Exit take-profit threshold",
|
|
178
|
+
"strat.rsi-reversion.reason.entry": "RSI({period}) at extreme oversold ({val} < {thresh}); bounce buy",
|
|
179
|
+
"strat.rsi-reversion.reason.exit": "RSI({period}) recovered to target ({val} > {thresh}); take profit",
|
|
180
|
+
"strat.ema-crossover": "EMA dual-MA trend following",
|
|
181
|
+
"strat.ema-crossover.summary": "Long on fast-EMA/slow-EMA golden cross, flat on death cross (classic swing trend strategy)",
|
|
182
|
+
"strat.ema-crossover.param.fastPeriod": "Fast period",
|
|
183
|
+
"strat.ema-crossover.param.slowPeriod": "Slow period",
|
|
184
|
+
"strat.ema-crossover.reason.entry": "EMA({fastP}) ({fast}) crosses above EMA({slowP}) ({slow}) — golden cross",
|
|
185
|
+
"strat.ema-crossover.reason.exit": "EMA({fastP}) ({fast}) crosses below EMA({slowP}) ({slow}) — death cross",
|
|
186
|
+
"strat.bollinger-reversion": "Bollinger lower-band reversion",
|
|
187
|
+
"strat.bollinger-reversion.summary": "Buy when price pierces the lower band; exit at the middle band (swing channel reversion)",
|
|
188
|
+
"strat.bollinger-reversion.param.period": "Bollinger period",
|
|
189
|
+
"strat.bollinger-reversion.param.multiplier": "Std-dev multiple (k)",
|
|
190
|
+
"strat.bollinger-reversion.reason.entry": "Close ({close}) pierces the lower band ({band}); swing reversion entry",
|
|
191
|
+
"strat.bollinger-reversion.reason.exit": "Close ({close}) reverted to the middle band ({mid}); target profit taken",
|
|
192
|
+
"strat.sma-baseline": "200-day SMA bull/bear baseline",
|
|
193
|
+
"strat.sma-baseline.summary": "Long above SMA200, in cash below it (classic long-term allocation baseline)",
|
|
194
|
+
"strat.sma-baseline.param.period": "Long MA period",
|
|
195
|
+
"strat.sma-baseline.reason.entry": "Close ({close}) above the long baseline SMA({period}) ({sma}); bull trend established",
|
|
196
|
+
"strat.sma-baseline.reason.exit": "Close ({close}) below the long baseline SMA({period}) ({sma}); defensive exit",
|
|
197
|
+
"strat.momentum-12m": "12-month momentum timing",
|
|
198
|
+
"strat.momentum-12m.summary": "Long when 12-month momentum is positive and price is above the yearly MA; exit on momentum decay (low-turnover long momentum)",
|
|
199
|
+
"strat.momentum-12m.param.lookbackBars": "Momentum lookback (bars)",
|
|
200
|
+
"strat.momentum-12m.reason.entry": "Positive {n}-bar momentum (+{pct}%) with price above the MA ({sma}); strong momentum confirmed",
|
|
201
|
+
"strat.momentum-12m.reason.exit": "{cause} ({pct}% / SMA {sma}); momentum-decay exit",
|
|
202
|
+
"scr.ma-bull-align": "MA bull alignment",
|
|
203
|
+
"scr.ma-bull-align.summary": "Price above all three MAs with SMA(short) > SMA(mid) > SMA(long); screens intact uptrends",
|
|
204
|
+
"scr.ma-bull-align.param.n1": "Short MA",
|
|
205
|
+
"scr.ma-bull-align.param.n2": "Mid MA",
|
|
206
|
+
"scr.ma-bull-align.param.n3": "Long MA",
|
|
207
|
+
"scr.ma-bull-align.col.distLongPct": "Distance to long MA",
|
|
208
|
+
"scr.ma-bull-align.reason": "Price above all three MAs, SMA({n1}) > SMA({n2}) > SMA({n3}) — bull alignment",
|
|
209
|
+
"scr.volume-breakout": "Volume breakout",
|
|
210
|
+
"scr.volume-breakout.summary": "Close at an N-bar high with volume ≥ M× average; volume-confirmed breakouts",
|
|
211
|
+
"scr.volume-breakout.param.lookback": "Breakout window (bars)",
|
|
212
|
+
"scr.volume-breakout.param.volMultiple": "Volume multiple",
|
|
213
|
+
"scr.volume-breakout.col.volRatio": "Volume ratio (x)",
|
|
214
|
+
"scr.volume-breakout.col.breakoutPct": "Breakout magnitude",
|
|
215
|
+
"scr.volume-breakout.reason": "{ratio}x volume breakout of the {n}-bar high",
|
|
216
|
+
"scr.rsi-oversold": "RSI oversold",
|
|
217
|
+
"scr.rsi-oversold.summary": "RSI in oversold territory (default <30); reversal candidates to watch (contrarian)",
|
|
218
|
+
"scr.rsi-oversold.param.period": "RSI period",
|
|
219
|
+
"scr.rsi-oversold.param.threshold": "Oversold threshold",
|
|
220
|
+
"scr.rsi-oversold.col.rsi": "RSI",
|
|
221
|
+
"scr.rsi-oversold.reason": "RSI({period}) = {val}; oversold (contrarian)",
|
|
222
|
+
"scr.near-high": "Near 52-week high",
|
|
223
|
+
"scr.near-high.summary": "Price within X% of the N-bar high; consolidation / pre-breakout momentum",
|
|
224
|
+
"scr.near-high.param.window": "Window (bars)",
|
|
225
|
+
"scr.near-high.param.withinPct": "Proximity threshold (%)",
|
|
226
|
+
"scr.near-high.col.offHighPct": "Off high",
|
|
227
|
+
"scr.near-high.reason": "Within {pct}% of the {n}-bar high; pre-breakout",
|
|
228
|
+
"scr.above-ma": "Above bull/bear line",
|
|
229
|
+
"scr.above-ma.summary": "Price above the long MA with rising slope; screens long-term bull regimes",
|
|
230
|
+
"scr.above-ma.param.period": "Bull/bear MA period",
|
|
231
|
+
"scr.above-ma.param.slopeBars": "Slope window (bars)",
|
|
232
|
+
"scr.above-ma.col.aboveMaPct": "Above MA",
|
|
233
|
+
"scr.above-ma.col.maSlopePct": "MA slope",
|
|
234
|
+
"scr.above-ma.reason": "Price {above}% above SMA({period}); {slope}-bar slope +{slopePct}%",
|
|
235
|
+
"strat.momentum-12m.cause.momentumNegative": "momentum turned negative",
|
|
236
|
+
"strat.momentum-12m.cause.belowBaseline": "fell below the baseline MA"
|
|
237
|
+
};
|
|
238
|
+
//#endregion
|
|
239
|
+
export { en, zh };
|