@backtest-kit/cli 9.6.0 β†’ 9.7.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.
Files changed (34) hide show
  1. package/README.md +1854 -1738
  2. package/build/index.cjs +268 -204
  3. package/build/index.mjs +268 -204
  4. package/config/notification.config.mjs +13 -13
  5. package/config/symbol.config.mjs +460 -460
  6. package/docker/.env.example +2 -2
  7. package/docker/README.md +1 -0
  8. package/docker/content/feb_2026/feb_2026.strategy.ts +11 -11
  9. package/docker/content/feb_2026/modules/backtest.module.ts +83 -83
  10. package/docker/docker-compose.yaml +46 -46
  11. package/docker/package.json +38 -38
  12. package/docker/tsconfig.json +36 -36
  13. package/package.json +126 -126
  14. package/template/average-buy.mustache +22 -22
  15. package/template/breakeven.mustache +21 -21
  16. package/template/cancel-scheduled.mustache +14 -14
  17. package/template/cancelled.mustache +21 -21
  18. package/template/close-pending.mustache +16 -16
  19. package/template/closed.mustache +23 -23
  20. package/template/opened.mustache +22 -22
  21. package/template/partial-loss.mustache +22 -22
  22. package/template/partial-profit.mustache +22 -22
  23. package/template/project/README.md +1 -0
  24. package/template/project/config/symbol.config.ts +460 -460
  25. package/template/project/package.mustache +28 -28
  26. package/template/risk.mustache +19 -19
  27. package/template/scheduled.mustache +22 -22
  28. package/template/signal-close.mustache +22 -22
  29. package/template/signal-info.mustache +20 -20
  30. package/template/signal-open.mustache +22 -22
  31. package/template/source/CLAUDE.md +160 -160
  32. package/template/trailing-stop.mustache +21 -21
  33. package/template/trailing-take.mustache +21 -21
  34. package/types.d.ts +1 -6
package/package.json CHANGED
@@ -1,126 +1,126 @@
1
- {
2
- "name": "@backtest-kit/cli",
3
- "version": "9.6.0",
4
- "description": "Zero-boilerplate CLI runner for backtest-kit strategies. Run backtests, paper trading, and live bots with candle cache warming, web dashboard, and Telegram notifications β€” no setup code required.",
5
- "author": {
6
- "name": "Petr Tripolsky",
7
- "email": "tripolskypetr@gmail.com",
8
- "url": "https://github.com/tripolskypetr"
9
- },
10
- "funding": {
11
- "type": "individual",
12
- "url": "http://paypal.me/tripolskypetr"
13
- },
14
- "license": "MIT",
15
- "homepage": "https://backtest-kit.github.io/documents/article_07_ai_news_trading_signals.html",
16
- "keywords": [
17
- "backtest",
18
- "backtesting",
19
- "trading",
20
- "cli",
21
- "cryptocurrency",
22
- "crypto",
23
- "live-trading",
24
- "paper-trading",
25
- "telegram",
26
- "binance",
27
- "ccxt",
28
- "candle-cache",
29
- "strategy",
30
- "typescript",
31
- "monorepo"
32
- ],
33
- "files": [
34
- "build",
35
- "types.d.ts",
36
- "template",
37
- "config",
38
- "docker",
39
- "README.md"
40
- ],
41
- "repository": {
42
- "type": "git",
43
- "url": "https://github.com/tripolskypetr/backtest-kit",
44
- "documentation": "https://github.com/tripolskypetr/backtest-kit/tree/master/docs"
45
- },
46
- "bugs": {
47
- "url": "https://github.com/tripolskypetr/backtest-kit/issues"
48
- },
49
- "scripts": {
50
- "build": "rollup -c",
51
- "start": "npm run build && node build/index.mjs ./math/test.pine --pine --symbol BTCUSDT --timeframe 15m --limit 180"
52
- },
53
- "main": "build/index.cjs",
54
- "module": "build/index.mjs",
55
- "source": "src/index.ts",
56
- "types": "./types.d.ts",
57
- "exports": {
58
- "require": "./build/index.cjs",
59
- "types": "./types.d.ts",
60
- "import": "./build/index.mjs",
61
- "default": "./build/index.cjs"
62
- },
63
- "devDependencies": {
64
- "@babel/plugin-transform-modules-umd": "7.27.1",
65
- "@babel/standalone": "7.29.1",
66
- "@backtest-kit/graph": "9.6.0",
67
- "@backtest-kit/ollama": "9.6.0",
68
- "@backtest-kit/pinets": "9.6.0",
69
- "@backtest-kit/signals": "9.6.0",
70
- "@backtest-kit/ui": "9.6.0",
71
- "@rollup/plugin-replace": "6.0.3",
72
- "@rollup/plugin-typescript": "11.1.6",
73
- "@types/image-size": "0.7.0",
74
- "@types/jsdom": "21.1.7",
75
- "@types/mustache": "4.2.6",
76
- "@types/node": "22.9.0",
77
- "@types/stack-trace": "0.0.33",
78
- "backtest-kit": "9.6.0",
79
- "glob": "11.0.1",
80
- "markdown-it": "14.1.1",
81
- "rimraf": "6.0.1",
82
- "rollup": "3.29.5",
83
- "rollup-plugin-dts": "6.1.1",
84
- "rollup-plugin-peer-deps-external": "2.2.4",
85
- "ts-morph": "27.0.2",
86
- "tslib": "2.7.0",
87
- "typedoc": "0.27.9",
88
- "worker-testbed": "2.0.0"
89
- },
90
- "peerDependencies": {
91
- "@babel/plugin-transform-modules-umd": "^7.27.1",
92
- "@babel/standalone": "^7.29.1",
93
- "@backtest-kit/graph": "^9.6.0",
94
- "@backtest-kit/ollama": "^9.6.0",
95
- "@backtest-kit/pinets": "^9.6.0",
96
- "@backtest-kit/signals": "^9.6.0",
97
- "@backtest-kit/ui": "^9.6.0",
98
- "backtest-kit": "^9.6.0",
99
- "markdown-it": "^14.1.1",
100
- "typescript": "^5.0.0"
101
- },
102
- "dependencies": {
103
- "ccxt": "4.5.39",
104
- "di-kit": "1.1.1",
105
- "di-scoped": "1.0.21",
106
- "dotenv": "17.3.1",
107
- "functools-kit": "2.3.0",
108
- "get-moment-stamp": "1.1.2",
109
- "image-size": "1.1.1",
110
- "jsdom": "26.1.0",
111
- "markdownlint": "0.38.0",
112
- "mustache": "4.2.0",
113
- "open": "11.0.0",
114
- "quickchart-js": "3.1.3",
115
- "resize-image-buffer": "1.0.0",
116
- "sanitize-html": "2.17.0",
117
- "stack-trace": "0.0.10",
118
- "telegraf": "4.15.3"
119
- },
120
- "bin": {
121
- "backtest-kit": "./build/index.mjs"
122
- },
123
- "publishConfig": {
124
- "access": "public"
125
- }
126
- }
1
+ {
2
+ "name": "@backtest-kit/cli",
3
+ "version": "9.7.0",
4
+ "description": "Zero-boilerplate CLI runner for backtest-kit strategies. Run backtests, paper trading, and live bots with candle cache warming, web dashboard, and Telegram notifications β€” no setup code required.",
5
+ "author": {
6
+ "name": "Petr Tripolsky",
7
+ "email": "tripolskypetr@gmail.com",
8
+ "url": "https://github.com/tripolskypetr"
9
+ },
10
+ "funding": {
11
+ "type": "individual",
12
+ "url": "http://paypal.me/tripolskypetr"
13
+ },
14
+ "license": "MIT",
15
+ "homepage": "https://backtest-kit.github.io/documents/article_07_ai_news_trading_signals.html",
16
+ "keywords": [
17
+ "backtest",
18
+ "backtesting",
19
+ "trading",
20
+ "cli",
21
+ "cryptocurrency",
22
+ "crypto",
23
+ "live-trading",
24
+ "paper-trading",
25
+ "telegram",
26
+ "binance",
27
+ "ccxt",
28
+ "candle-cache",
29
+ "strategy",
30
+ "typescript",
31
+ "monorepo"
32
+ ],
33
+ "files": [
34
+ "build",
35
+ "types.d.ts",
36
+ "template",
37
+ "config",
38
+ "docker",
39
+ "README.md"
40
+ ],
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "https://github.com/tripolskypetr/backtest-kit",
44
+ "documentation": "https://github.com/tripolskypetr/backtest-kit/tree/master/docs"
45
+ },
46
+ "bugs": {
47
+ "url": "https://github.com/tripolskypetr/backtest-kit/issues"
48
+ },
49
+ "scripts": {
50
+ "build": "rollup -c",
51
+ "start": "npm run build && node build/index.mjs ./math/test.pine --pine --symbol BTCUSDT --timeframe 15m --limit 180"
52
+ },
53
+ "main": "build/index.cjs",
54
+ "module": "build/index.mjs",
55
+ "source": "src/index.ts",
56
+ "types": "./types.d.ts",
57
+ "exports": {
58
+ "require": "./build/index.cjs",
59
+ "types": "./types.d.ts",
60
+ "import": "./build/index.mjs",
61
+ "default": "./build/index.cjs"
62
+ },
63
+ "devDependencies": {
64
+ "@babel/plugin-transform-modules-umd": "7.27.1",
65
+ "@babel/standalone": "7.29.1",
66
+ "@backtest-kit/graph": "9.7.0",
67
+ "@backtest-kit/ollama": "9.7.0",
68
+ "@backtest-kit/pinets": "9.7.0",
69
+ "@backtest-kit/signals": "9.7.0",
70
+ "@backtest-kit/ui": "9.7.0",
71
+ "@rollup/plugin-replace": "6.0.3",
72
+ "@rollup/plugin-typescript": "11.1.6",
73
+ "@types/image-size": "0.7.0",
74
+ "@types/jsdom": "21.1.7",
75
+ "@types/mustache": "4.2.6",
76
+ "@types/node": "22.9.0",
77
+ "@types/stack-trace": "0.0.33",
78
+ "backtest-kit": "9.7.0",
79
+ "glob": "11.0.1",
80
+ "markdown-it": "14.1.1",
81
+ "rimraf": "6.0.1",
82
+ "rollup": "3.29.5",
83
+ "rollup-plugin-dts": "6.1.1",
84
+ "rollup-plugin-peer-deps-external": "2.2.4",
85
+ "ts-morph": "27.0.2",
86
+ "tslib": "2.7.0",
87
+ "typedoc": "0.27.9",
88
+ "worker-testbed": "2.0.0"
89
+ },
90
+ "peerDependencies": {
91
+ "@babel/plugin-transform-modules-umd": "^7.27.1",
92
+ "@babel/standalone": "^7.29.1",
93
+ "@backtest-kit/graph": "^9.7.0",
94
+ "@backtest-kit/ollama": "^9.7.0",
95
+ "@backtest-kit/pinets": "^9.7.0",
96
+ "@backtest-kit/signals": "^9.7.0",
97
+ "@backtest-kit/ui": "^9.7.0",
98
+ "backtest-kit": "^9.7.0",
99
+ "markdown-it": "^14.1.1",
100
+ "typescript": "^5.0.0"
101
+ },
102
+ "dependencies": {
103
+ "ccxt": "4.5.39",
104
+ "di-kit": "1.1.1",
105
+ "di-scoped": "1.0.21",
106
+ "dotenv": "17.3.1",
107
+ "functools-kit": "2.3.0",
108
+ "get-moment-stamp": "1.1.2",
109
+ "image-size": "1.1.1",
110
+ "jsdom": "26.1.0",
111
+ "markdownlint": "0.38.0",
112
+ "mustache": "4.2.0",
113
+ "open": "11.0.0",
114
+ "quickchart-js": "3.1.3",
115
+ "resize-image-buffer": "1.0.0",
116
+ "sanitize-html": "2.17.0",
117
+ "stack-trace": "0.0.10",
118
+ "telegraf": "4.15.3"
119
+ },
120
+ "bin": {
121
+ "backtest-kit": "./build/index.mjs"
122
+ },
123
+ "publishConfig": {
124
+ "access": "public"
125
+ }
126
+ }
@@ -1,23 +1,23 @@
1
- **πŸͺ“ Averaging Entry (DCA)**
2
-
3
- **Symbol:** `{{symbol}}` ({{position}})
4
-
5
- **Current:** `{{currentPrice}}`
6
- **New Avg Entry:** `{{effectivePriceOpen}}`
7
- **Orig Entry:** `{{originalPriceOpen}}`
8
- **Cost:** `{{cost}}`
9
- **DCA Entries:** `{{totalEntries}}`
10
- **Partials Done:** `{{totalPartials}}`
11
- **Take Profit:** `{{priceTakeProfit}}`
12
- **Stop Loss:** `{{priceStopLoss}}`
13
- **Orig TP:** `{{originalPriceTakeProfit}}`
14
- **Orig SL:** `{{originalPriceStopLoss}}`
15
- **PnL:** {{pnl.pnlPercentage}}% ({{pnl.pnlCost}} / {{pnl.pnlEntries}})
16
- **Peak Profit:** {{peakProfit.pnlPercentage}}% ({{peakProfit.pnlCost}} / {{peakProfit.pnlEntries}})
17
- **Max Drawdown:** {{maxDrawdown.pnlPercentage}}% ({{maxDrawdown.pnlCost}} / {{maxDrawdown.pnlEntries}})
18
- **Signal ID:** `{{signalId}}`
19
- **Time:** `{{timestamp}}`
20
-
21
- {{#backtest}}
22
- _πŸ§ͺ Backtest_
1
+ **πŸͺ“ Averaging Entry (DCA)**
2
+
3
+ **Symbol:** `{{symbol}}` ({{position}})
4
+
5
+ **Current:** `{{currentPrice}}`
6
+ **New Avg Entry:** `{{effectivePriceOpen}}`
7
+ **Orig Entry:** `{{originalPriceOpen}}`
8
+ **Cost:** `{{cost}}`
9
+ **DCA Entries:** `{{totalEntries}}`
10
+ **Partials Done:** `{{totalPartials}}`
11
+ **Take Profit:** `{{priceTakeProfit}}`
12
+ **Stop Loss:** `{{priceStopLoss}}`
13
+ **Orig TP:** `{{originalPriceTakeProfit}}`
14
+ **Orig SL:** `{{originalPriceStopLoss}}`
15
+ **PnL:** {{pnl.pnlPercentage}}% ({{pnl.pnlCost}} / {{pnl.pnlEntries}})
16
+ **Peak Profit:** {{peakProfit.pnlPercentage}}% ({{peakProfit.pnlCost}} / {{peakProfit.pnlEntries}})
17
+ **Max Drawdown:** {{maxDrawdown.pnlPercentage}}% ({{maxDrawdown.pnlCost}} / {{maxDrawdown.pnlEntries}})
18
+ **Signal ID:** `{{signalId}}`
19
+ **Time:** `{{timestamp}}`
20
+
21
+ {{#backtest}}
22
+ _πŸ§ͺ Backtest_
23
23
  {{/backtest}}
@@ -1,22 +1,22 @@
1
- **βš–οΈ Breakeven**
2
-
3
- **Symbol:** `{{symbol}}` ({{position}})
4
-
5
- **Current:** `{{currentPrice}}`
6
- **Entry:** `{{priceOpen}}`
7
- **Orig Entry:** `{{originalPriceOpen}}`
8
- **DCA Entries:** `{{totalEntries}}`
9
- **Partials Done:** `{{totalPartials}}`
10
- **Take Profit:** `{{priceTakeProfit}}`
11
- **Stop Loss:** `{{priceStopLoss}}`
12
- **Orig TP:** `{{originalPriceTakeProfit}}`
13
- **Orig SL:** `{{originalPriceStopLoss}}`
14
- **PnL:** {{pnl.pnlPercentage}}% ({{pnl.pnlCost}} / {{pnl.pnlEntries}})
15
- **Peak Profit:** {{peakProfit.pnlPercentage}}% ({{peakProfit.pnlCost}} / {{peakProfit.pnlEntries}})
16
- **Max Drawdown:** {{maxDrawdown.pnlPercentage}}% ({{maxDrawdown.pnlCost}} / {{maxDrawdown.pnlEntries}})
17
- **Signal ID:** `{{signalId}}`
18
- **Time:** `{{timestamp}}`
19
-
20
- {{#backtest}}
21
- _πŸ§ͺ Backtest_
1
+ **βš–οΈ Breakeven**
2
+
3
+ **Symbol:** `{{symbol}}` ({{position}})
4
+
5
+ **Current:** `{{currentPrice}}`
6
+ **Entry:** `{{priceOpen}}`
7
+ **Orig Entry:** `{{originalPriceOpen}}`
8
+ **DCA Entries:** `{{totalEntries}}`
9
+ **Partials Done:** `{{totalPartials}}`
10
+ **Take Profit:** `{{priceTakeProfit}}`
11
+ **Stop Loss:** `{{priceStopLoss}}`
12
+ **Orig TP:** `{{originalPriceTakeProfit}}`
13
+ **Orig SL:** `{{originalPriceStopLoss}}`
14
+ **PnL:** {{pnl.pnlPercentage}}% ({{pnl.pnlCost}} / {{pnl.pnlEntries}})
15
+ **Peak Profit:** {{peakProfit.pnlPercentage}}% ({{peakProfit.pnlCost}} / {{peakProfit.pnlEntries}})
16
+ **Max Drawdown:** {{maxDrawdown.pnlPercentage}}% ({{maxDrawdown.pnlCost}} / {{maxDrawdown.pnlEntries}})
17
+ **Signal ID:** `{{signalId}}`
18
+ **Time:** `{{timestamp}}`
19
+
20
+ {{#backtest}}
21
+ _πŸ§ͺ Backtest_
22
22
  {{/backtest}}
@@ -1,15 +1,15 @@
1
- **🚫 Cancel Scheduled**
2
-
3
- **Symbol:** `{{symbol}}`
4
-
5
- **Orig Entry:** `{{originalPriceOpen}}`
6
- **DCA Entries:** `{{totalEntries}}`
7
- **Partials Done:** `{{totalPartials}}`
8
- {{#cancelId}}**Cancel ID:** `{{cancelId}}`
9
- {{/cancelId}}
10
- **Signal ID:** `{{signalId}}`
11
- **Time:** `{{timestamp}}`
12
-
13
- {{#backtest}}
14
- _πŸ§ͺ Backtest_
1
+ **🚫 Cancel Scheduled**
2
+
3
+ **Symbol:** `{{symbol}}`
4
+
5
+ **Orig Entry:** `{{originalPriceOpen}}`
6
+ **DCA Entries:** `{{totalEntries}}`
7
+ **Partials Done:** `{{totalPartials}}`
8
+ {{#cancelId}}**Cancel ID:** `{{cancelId}}`
9
+ {{/cancelId}}
10
+ **Signal ID:** `{{signalId}}`
11
+ **Time:** `{{timestamp}}`
12
+
13
+ {{#backtest}}
14
+ _πŸ§ͺ Backtest_
15
15
  {{/backtest}}
@@ -1,22 +1,22 @@
1
- **🚫 Signal Cancelled**
2
-
3
- **Symbol:** `{{symbol}}` ({{signal.position}})
4
-
5
- **Reason:** `{{reason}}`
6
- **Entry:** `{{signal.priceOpen}}`
7
- **Current:** `{{currentPrice}}`
8
- **Orig Entry:** `{{signal.originalPriceOpen}}`
9
- **Orig TP:** `{{signal.originalPriceTakeProfit}}`
10
- **Orig SL:** `{{signal.originalPriceStopLoss}}`
11
- **DCA Entries:** `{{signal.totalEntries}}`
12
- **Partials Done:** `{{signal.totalPartials}}`
13
- **Partial Executed:** {{signal.partialExecuted}}%
14
- **Peak Profit:** {{signal.peakProfit.pnlPercentage}}% ({{signal.peakProfit.pnlCost}} / {{signal.peakProfit.pnlEntries}})
15
- **Max Drawdown:** {{signal.maxDrawdown.pnlPercentage}}% ({{signal.maxDrawdown.pnlCost}} / {{signal.maxDrawdown.pnlEntries}})
16
- **Signal ID:** `{{signal.id}}`
17
- {{#cancelId}}**Cancel ID:** `{{cancelId}}`
18
- {{/cancelId}}**Time:** `{{createdAt}}`
19
-
20
- {{#backtest}}
21
- _πŸ§ͺ Backtest_
1
+ **🚫 Signal Cancelled**
2
+
3
+ **Symbol:** `{{symbol}}` ({{signal.position}})
4
+
5
+ **Reason:** `{{reason}}`
6
+ **Entry:** `{{signal.priceOpen}}`
7
+ **Current:** `{{currentPrice}}`
8
+ **Orig Entry:** `{{signal.originalPriceOpen}}`
9
+ **Orig TP:** `{{signal.originalPriceTakeProfit}}`
10
+ **Orig SL:** `{{signal.originalPriceStopLoss}}`
11
+ **DCA Entries:** `{{signal.totalEntries}}`
12
+ **Partials Done:** `{{signal.totalPartials}}`
13
+ **Partial Executed:** {{signal.partialExecuted}}%
14
+ **Peak Profit:** {{signal.peakProfit.pnlPercentage}}% ({{signal.peakProfit.pnlCost}} / {{signal.peakProfit.pnlEntries}})
15
+ **Max Drawdown:** {{signal.maxDrawdown.pnlPercentage}}% ({{signal.maxDrawdown.pnlCost}} / {{signal.maxDrawdown.pnlEntries}})
16
+ **Signal ID:** `{{signal.id}}`
17
+ {{#cancelId}}**Cancel ID:** `{{cancelId}}`
18
+ {{/cancelId}}**Time:** `{{createdAt}}`
19
+
20
+ {{#backtest}}
21
+ _πŸ§ͺ Backtest_
22
22
  {{/backtest}}
@@ -1,17 +1,17 @@
1
- **πŸ”’ Close Pending**
2
-
3
- **Symbol:** `{{symbol}}`
4
-
5
- **Orig Entry:** `{{originalPriceOpen}}`
6
- **DCA Entries:** `{{totalEntries}}`
7
- **Partials Done:** `{{totalPartials}}`
8
- {{#closeId}}**Close ID:** `{{closeId}}`
9
- {{/closeId}}**PnL:** {{pnl.pnlPercentage}}% ({{pnl.pnlCost}} / {{pnl.pnlEntries}})
10
- **Peak Profit:** {{peakProfit.pnlPercentage}}% ({{peakProfit.pnlCost}} / {{peakProfit.pnlEntries}})
11
- **Max Drawdown:** {{maxDrawdown.pnlPercentage}}% ({{maxDrawdown.pnlCost}} / {{maxDrawdown.pnlEntries}})
12
- **Signal ID:** `{{signalId}}`
13
- **Time:** `{{timestamp}}`
14
-
15
- {{#backtest}}
16
- _πŸ§ͺ Backtest_
1
+ **πŸ”’ Close Pending**
2
+
3
+ **Symbol:** `{{symbol}}`
4
+
5
+ **Orig Entry:** `{{originalPriceOpen}}`
6
+ **DCA Entries:** `{{totalEntries}}`
7
+ **Partials Done:** `{{totalPartials}}`
8
+ {{#closeId}}**Close ID:** `{{closeId}}`
9
+ {{/closeId}}**PnL:** {{pnl.pnlPercentage}}% ({{pnl.pnlCost}} / {{pnl.pnlEntries}})
10
+ **Peak Profit:** {{peakProfit.pnlPercentage}}% ({{peakProfit.pnlCost}} / {{peakProfit.pnlEntries}})
11
+ **Max Drawdown:** {{maxDrawdown.pnlPercentage}}% ({{maxDrawdown.pnlCost}} / {{maxDrawdown.pnlEntries}})
12
+ **Signal ID:** `{{signalId}}`
13
+ **Time:** `{{timestamp}}`
14
+
15
+ {{#backtest}}
16
+ _πŸ§ͺ Backtest_
17
17
  {{/backtest}}
@@ -1,24 +1,24 @@
1
- **🏁 Position Closed**
2
-
3
- **Symbol:** `{{symbol}}` ({{signal.position}})
4
-
5
- **Reason:** `{{closeReason}}`
6
- **Current:** `{{currentPrice}}`
7
- **Entry:** `{{pnl.priceOpen}}`
8
- **Exit:** `{{pnl.priceClose}}`
9
- **PnL:** {{pnl.pnlPercentage}}% ({{pnl.pnlCost}} / {{pnl.pnlEntries}})
10
- **Peak Profit:** {{signal.peakProfit.pnlPercentage}}% ({{signal.peakProfit.pnlCost}} / {{signal.peakProfit.pnlEntries}})
11
- **Max Drawdown:** {{signal.maxDrawdown.pnlPercentage}}% ({{signal.maxDrawdown.pnlCost}} / {{signal.maxDrawdown.pnlEntries}})
12
- **Orig Entry:** `{{signal.originalPriceOpen}}`
13
- **Orig TP:** `{{signal.originalPriceTakeProfit}}`
14
- **Orig SL:** `{{signal.originalPriceStopLoss}}`
15
- **DCA Entries:** `{{signal.totalEntries}}`
16
- **Partials Done:** `{{signal.totalPartials}}`
17
- **Partial Executed:** {{signal.partialExecuted}}%
18
- **Signal ID:** `{{signal.id}}`
19
- {{#closeId}}**Close ID:** `{{closeId}}`
20
- {{/closeId}}**Time:** `{{createdAt}}`
21
-
22
- {{#backtest}}
23
- _πŸ§ͺ Backtest_
1
+ **🏁 Position Closed**
2
+
3
+ **Symbol:** `{{symbol}}` ({{signal.position}})
4
+
5
+ **Reason:** `{{closeReason}}`
6
+ **Current:** `{{currentPrice}}`
7
+ **Entry:** `{{pnl.priceOpen}}`
8
+ **Exit:** `{{pnl.priceClose}}`
9
+ **PnL:** {{pnl.pnlPercentage}}% ({{pnl.pnlCost}} / {{pnl.pnlEntries}})
10
+ **Peak Profit:** {{signal.peakProfit.pnlPercentage}}% ({{signal.peakProfit.pnlCost}} / {{signal.peakProfit.pnlEntries}})
11
+ **Max Drawdown:** {{signal.maxDrawdown.pnlPercentage}}% ({{signal.maxDrawdown.pnlCost}} / {{signal.maxDrawdown.pnlEntries}})
12
+ **Orig Entry:** `{{signal.originalPriceOpen}}`
13
+ **Orig TP:** `{{signal.originalPriceTakeProfit}}`
14
+ **Orig SL:** `{{signal.originalPriceStopLoss}}`
15
+ **DCA Entries:** `{{signal.totalEntries}}`
16
+ **Partials Done:** `{{signal.totalPartials}}`
17
+ **Partial Executed:** {{signal.partialExecuted}}%
18
+ **Signal ID:** `{{signal.id}}`
19
+ {{#closeId}}**Close ID:** `{{closeId}}`
20
+ {{/closeId}}**Time:** `{{createdAt}}`
21
+
22
+ {{#backtest}}
23
+ _πŸ§ͺ Backtest_
24
24
  {{/backtest}}
@@ -1,23 +1,23 @@
1
- **πŸš€ Position Opened**
2
-
3
- **Symbol:** `{{symbol}}` ({{signal.position}})
4
-
5
- **Current:** `{{currentPrice}}`
6
- **Entry:** `{{signal.priceOpen}}`
7
- **Take Profit:** `{{signal.priceTakeProfit}}`
8
- **Stop Loss:** `{{signal.priceStopLoss}}`
9
- **Orig Entry:** `{{signal.originalPriceOpen}}`
10
- **Orig TP:** `{{signal.originalPriceTakeProfit}}`
11
- **Orig SL:** `{{signal.originalPriceStopLoss}}`
12
- **Cost:** `{{signal.cost}}`
13
- **DCA Entries:** `{{signal.totalEntries}}`
14
- **Partials Done:** `{{signal.totalPartials}}`
15
- **TTL:** {{signal.minuteEstimatedTime}} min
16
- **Peak Profit:** {{signal.peakProfit.pnlPercentage}}% ({{signal.peakProfit.pnlCost}} / {{signal.peakProfit.pnlEntries}})
17
- **Max Drawdown:** {{signal.maxDrawdown.pnlPercentage}}% ({{signal.maxDrawdown.pnlCost}} / {{signal.maxDrawdown.pnlEntries}})
18
- **Signal ID:** `{{signal.id}}`
19
- **Time:** `{{createdAt}}`
20
-
21
- {{#backtest}}
22
- _πŸ§ͺ Backtest_
1
+ **πŸš€ Position Opened**
2
+
3
+ **Symbol:** `{{symbol}}` ({{signal.position}})
4
+
5
+ **Current:** `{{currentPrice}}`
6
+ **Entry:** `{{signal.priceOpen}}`
7
+ **Take Profit:** `{{signal.priceTakeProfit}}`
8
+ **Stop Loss:** `{{signal.priceStopLoss}}`
9
+ **Orig Entry:** `{{signal.originalPriceOpen}}`
10
+ **Orig TP:** `{{signal.originalPriceTakeProfit}}`
11
+ **Orig SL:** `{{signal.originalPriceStopLoss}}`
12
+ **Cost:** `{{signal.cost}}`
13
+ **DCA Entries:** `{{signal.totalEntries}}`
14
+ **Partials Done:** `{{signal.totalPartials}}`
15
+ **TTL:** {{signal.minuteEstimatedTime}} min
16
+ **Peak Profit:** {{signal.peakProfit.pnlPercentage}}% ({{signal.peakProfit.pnlCost}} / {{signal.peakProfit.pnlEntries}})
17
+ **Max Drawdown:** {{signal.maxDrawdown.pnlPercentage}}% ({{signal.maxDrawdown.pnlCost}} / {{signal.maxDrawdown.pnlEntries}})
18
+ **Signal ID:** `{{signal.id}}`
19
+ **Time:** `{{createdAt}}`
20
+
21
+ {{#backtest}}
22
+ _πŸ§ͺ Backtest_
23
23
  {{/backtest}}
@@ -1,23 +1,23 @@
1
- **πŸ”» Partial Loss**
2
-
3
- **Symbol:** `{{symbol}}` ({{position}})
4
-
5
- **Current:** `{{currentPrice}}`
6
- **Entry:** `{{priceOpen}}`
7
- **Orig Entry:** `{{originalPriceOpen}}`
8
- **Closed:** {{percentToClose}}%
9
- **Take Profit:** `{{priceTakeProfit}}`
10
- **Stop Loss:** `{{priceStopLoss}}`
11
- **Orig TP:** `{{originalPriceTakeProfit}}`
12
- **Orig SL:** `{{originalPriceStopLoss}}`
13
- **DCA Entries:** `{{totalEntries}}`
14
- **Partials Done:** `{{totalPartials}}`
15
- **PnL:** {{pnl.pnlPercentage}}% ({{pnl.pnlCost}} / {{pnl.pnlEntries}})
16
- **Peak Profit:** {{peakProfit.pnlPercentage}}% ({{peakProfit.pnlCost}} / {{peakProfit.pnlEntries}})
17
- **Max Drawdown:** {{maxDrawdown.pnlPercentage}}% ({{maxDrawdown.pnlCost}} / {{maxDrawdown.pnlEntries}})
18
- **Signal ID:** `{{signalId}}`
19
- **Time:** `{{timestamp}}`
20
-
21
- {{#backtest}}
22
- _πŸ§ͺ Backtest_
1
+ **πŸ”» Partial Loss**
2
+
3
+ **Symbol:** `{{symbol}}` ({{position}})
4
+
5
+ **Current:** `{{currentPrice}}`
6
+ **Entry:** `{{priceOpen}}`
7
+ **Orig Entry:** `{{originalPriceOpen}}`
8
+ **Closed:** {{percentToClose}}%
9
+ **Take Profit:** `{{priceTakeProfit}}`
10
+ **Stop Loss:** `{{priceStopLoss}}`
11
+ **Orig TP:** `{{originalPriceTakeProfit}}`
12
+ **Orig SL:** `{{originalPriceStopLoss}}`
13
+ **DCA Entries:** `{{totalEntries}}`
14
+ **Partials Done:** `{{totalPartials}}`
15
+ **PnL:** {{pnl.pnlPercentage}}% ({{pnl.pnlCost}} / {{pnl.pnlEntries}})
16
+ **Peak Profit:** {{peakProfit.pnlPercentage}}% ({{peakProfit.pnlCost}} / {{peakProfit.pnlEntries}})
17
+ **Max Drawdown:** {{maxDrawdown.pnlPercentage}}% ({{maxDrawdown.pnlCost}} / {{maxDrawdown.pnlEntries}})
18
+ **Signal ID:** `{{signalId}}`
19
+ **Time:** `{{timestamp}}`
20
+
21
+ {{#backtest}}
22
+ _πŸ§ͺ Backtest_
23
23
  {{/backtest}}
@@ -1,23 +1,23 @@
1
- **πŸ’š Partial Profit**
2
-
3
- **Symbol:** `{{symbol}}` ({{position}})
4
-
5
- **Current:** `{{currentPrice}}`
6
- **Entry:** `{{priceOpen}}`
7
- **Orig Entry:** `{{originalPriceOpen}}`
8
- **Closed:** {{percentToClose}}%
9
- **Take Profit:** `{{priceTakeProfit}}`
10
- **Stop Loss:** `{{priceStopLoss}}`
11
- **Orig TP:** `{{originalPriceTakeProfit}}`
12
- **Orig SL:** `{{originalPriceStopLoss}}`
13
- **DCA Entries:** `{{totalEntries}}`
14
- **Partials Done:** `{{totalPartials}}`
15
- **PnL:** {{pnl.pnlPercentage}}% ({{pnl.pnlCost}} / {{pnl.pnlEntries}})
16
- **Peak Profit:** {{peakProfit.pnlPercentage}}% ({{peakProfit.pnlCost}} / {{peakProfit.pnlEntries}})
17
- **Max Drawdown:** {{maxDrawdown.pnlPercentage}}% ({{maxDrawdown.pnlCost}} / {{maxDrawdown.pnlEntries}})
18
- **Signal ID:** `{{signalId}}`
19
- **Time:** `{{timestamp}}`
20
-
21
- {{#backtest}}
22
- _πŸ§ͺ Backtest_
1
+ **πŸ’š Partial Profit**
2
+
3
+ **Symbol:** `{{symbol}}` ({{position}})
4
+
5
+ **Current:** `{{currentPrice}}`
6
+ **Entry:** `{{priceOpen}}`
7
+ **Orig Entry:** `{{originalPriceOpen}}`
8
+ **Closed:** {{percentToClose}}%
9
+ **Take Profit:** `{{priceTakeProfit}}`
10
+ **Stop Loss:** `{{priceStopLoss}}`
11
+ **Orig TP:** `{{originalPriceTakeProfit}}`
12
+ **Orig SL:** `{{originalPriceStopLoss}}`
13
+ **DCA Entries:** `{{totalEntries}}`
14
+ **Partials Done:** `{{totalPartials}}`
15
+ **PnL:** {{pnl.pnlPercentage}}% ({{pnl.pnlCost}} / {{pnl.pnlEntries}})
16
+ **Peak Profit:** {{peakProfit.pnlPercentage}}% ({{peakProfit.pnlCost}} / {{peakProfit.pnlEntries}})
17
+ **Max Drawdown:** {{maxDrawdown.pnlPercentage}}% ({{maxDrawdown.pnlCost}} / {{maxDrawdown.pnlEntries}})
18
+ **Signal ID:** `{{signalId}}`
19
+ **Time:** `{{timestamp}}`
20
+
21
+ {{#backtest}}
22
+ _πŸ§ͺ Backtest_
23
23
  {{/backtest}}
@@ -17,6 +17,7 @@ A minimal project scaffold for [backtest-kit](https://github.com/tripolskypetr/b
17
17
  | Strategy | Ticker | Period | Signal source | Net PNL | Sharpe |
18
18
  |---|---|---|---|---|---|
19
19
  | [DOTUSDT Feb 2021 β€” Python EMA Crossover](https://github.com/tripolskypetr/backtest-kit/tree/master/example/content/feb_2021.strategy) | DOTUSDT | Feb 2021 | Python EMA(9)/EMA(21) crossover via WebAssembly | **+5.52%** | **0.09** |
20
+ | [BTCUSDT Apr 2024 β€” Polymarket Ξ”prob](https://github.com/tripolskypetr/backtest-kit/tree/master/example/content/apr_2024.strategy) | BTCUSDT | Apr 2024 | Polymarket "yes" probability shifts on crypto-prices markets | **+0.63%** | **0.055** |
20
21
  | [BTCUSDT Oct 2021 β€” TensorFlow Neural Network](https://github.com/tripolskypetr/backtest-kit/tree/master/example/content/oct_2021.strategy) | BTCUSDT | Oct 2021 | TensorFlow NN predicting next candle close | **+18.26%** | **0.31** |
21
22
  | [BTCUSDT Dec 2025 β€” Pine Script Range Breakout](https://github.com/tripolskypetr/backtest-kit/tree/master/example/content/dec_2025.strategy) | BTCUSDT | Dec 2025 | Pine Script BB + range detector + volume spike | **+2.40%** | **0.06** |
22
23
  | [TRXUSDT Jan 2026 β€” Liquidity Harvesting](https://github.com/tripolskypetr/backtest-kit/tree/master/example/content//jan_2026.strategy) | TRXUSDT | Jan 2026 | Telegram channel signals (inverted) | **+8.58%** | **1.14** |