@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.
- package/README.md +1854 -1738
- package/build/index.cjs +268 -204
- package/build/index.mjs +268 -204
- package/config/notification.config.mjs +13 -13
- package/config/symbol.config.mjs +460 -460
- package/docker/.env.example +2 -2
- package/docker/README.md +1 -0
- package/docker/content/feb_2026/feb_2026.strategy.ts +11 -11
- package/docker/content/feb_2026/modules/backtest.module.ts +83 -83
- package/docker/docker-compose.yaml +46 -46
- package/docker/package.json +38 -38
- package/docker/tsconfig.json +36 -36
- package/package.json +126 -126
- package/template/average-buy.mustache +22 -22
- package/template/breakeven.mustache +21 -21
- package/template/cancel-scheduled.mustache +14 -14
- package/template/cancelled.mustache +21 -21
- package/template/close-pending.mustache +16 -16
- package/template/closed.mustache +23 -23
- package/template/opened.mustache +22 -22
- package/template/partial-loss.mustache +22 -22
- package/template/partial-profit.mustache +22 -22
- package/template/project/README.md +1 -0
- package/template/project/config/symbol.config.ts +460 -460
- package/template/project/package.mustache +28 -28
- package/template/risk.mustache +19 -19
- package/template/scheduled.mustache +22 -22
- package/template/signal-close.mustache +22 -22
- package/template/signal-info.mustache +20 -20
- package/template/signal-open.mustache +22 -22
- package/template/source/CLAUDE.md +160 -160
- package/template/trailing-stop.mustache +21 -21
- package/template/trailing-take.mustache +21 -21
- package/types.d.ts +1 -6
package/package.json
CHANGED
|
@@ -1,126 +1,126 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@backtest-kit/cli",
|
|
3
|
-
"version": "9.
|
|
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.
|
|
67
|
-
"@backtest-kit/ollama": "9.
|
|
68
|
-
"@backtest-kit/pinets": "9.
|
|
69
|
-
"@backtest-kit/signals": "9.
|
|
70
|
-
"@backtest-kit/ui": "9.
|
|
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.
|
|
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.
|
|
94
|
-
"@backtest-kit/ollama": "^9.
|
|
95
|
-
"@backtest-kit/pinets": "^9.
|
|
96
|
-
"@backtest-kit/signals": "^9.
|
|
97
|
-
"@backtest-kit/ui": "^9.
|
|
98
|
-
"backtest-kit": "^9.
|
|
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}}
|
package/template/closed.mustache
CHANGED
|
@@ -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}}
|
package/template/opened.mustache
CHANGED
|
@@ -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** |
|