@backtest-kit/cli 6.2.0 → 6.4.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/build/index.cjs +169 -73
- package/build/index.mjs +170 -75
- package/package.json +13 -13
- package/template/project/README.md +1 -1
- package/template/project/package.mustache +1 -1
- package/types.d.ts +297 -291
package/build/index.cjs
CHANGED
|
@@ -87,64 +87,6 @@ var BacktestKitSignals__namespace = /*#__PURE__*/_interopNamespaceDefault(Backte
|
|
|
87
87
|
});
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
-
{
|
|
91
|
-
BacktestKit.Storage.enable();
|
|
92
|
-
BacktestKit.Notification.enable();
|
|
93
|
-
}
|
|
94
|
-
{
|
|
95
|
-
BacktestKit.Markdown.enable();
|
|
96
|
-
BacktestKit.Report.enable();
|
|
97
|
-
BacktestKit.Dump.enable();
|
|
98
|
-
BacktestKit.Memory.enable();
|
|
99
|
-
}
|
|
100
|
-
{
|
|
101
|
-
BacktestKit.Dump.useMarkdown();
|
|
102
|
-
BacktestKit.Memory.usePersist();
|
|
103
|
-
}
|
|
104
|
-
{
|
|
105
|
-
BacktestKit.StorageLive.usePersist();
|
|
106
|
-
BacktestKit.StorageBacktest.useMemory();
|
|
107
|
-
}
|
|
108
|
-
{
|
|
109
|
-
BacktestKit.NotificationLive.usePersist();
|
|
110
|
-
BacktestKit.NotificationBacktest.useMemory();
|
|
111
|
-
}
|
|
112
|
-
{
|
|
113
|
-
BacktestKit.Markdown.useDummy();
|
|
114
|
-
}
|
|
115
|
-
BacktestKit.setConfig({
|
|
116
|
-
CC_MAX_NOTIFICATIONS: 5000,
|
|
117
|
-
CC_MAX_SIGNALS: 750,
|
|
118
|
-
});
|
|
119
|
-
BacktestKit.setConfig({
|
|
120
|
-
CC_ENABLE_DCA_EVERYWHERE: true,
|
|
121
|
-
CC_ENABLE_PPPL_EVERYWHERE: true,
|
|
122
|
-
CC_ENABLE_TRAILING_EVERYWHERE: true,
|
|
123
|
-
});
|
|
124
|
-
BacktestKit.setConfig({
|
|
125
|
-
CC_MAX_SIGNAL_GENERATION_SECONDS: 15 * 60,
|
|
126
|
-
});
|
|
127
|
-
BacktestKit.setConfig({
|
|
128
|
-
CC_MAX_BACKTEST_MARKDOWN_ROWS: 1000,
|
|
129
|
-
CC_MAX_BREAKEVEN_MARKDOWN_ROWS: 1000,
|
|
130
|
-
CC_MAX_HEATMAP_MARKDOWN_ROWS: 1000,
|
|
131
|
-
CC_MAX_HIGHEST_PROFIT_MARKDOWN_ROWS: 1000,
|
|
132
|
-
CC_MAX_LIVE_MARKDOWN_ROWS: 1000,
|
|
133
|
-
CC_MAX_PARTIAL_MARKDOWN_ROWS: 1000,
|
|
134
|
-
CC_MAX_RISK_MARKDOWN_ROWS: 1000,
|
|
135
|
-
CC_MAX_SCHEDULE_MARKDOWN_ROWS: 1000,
|
|
136
|
-
CC_MAX_STRATEGY_MARKDOWN_ROWS: 1000,
|
|
137
|
-
CC_MAX_SYNC_MARKDOWN_ROWS: 1000,
|
|
138
|
-
CC_MAX_PERFORMANCE_MARKDOWN_ROWS: 1000,
|
|
139
|
-
});
|
|
140
|
-
BacktestKit.setConfig({
|
|
141
|
-
CC_MAX_SIGNAL_LIFETIME_MINUTES: Infinity,
|
|
142
|
-
});
|
|
143
|
-
BacktestKit.setConfig({
|
|
144
|
-
CC_WALKER_MARKDOWN_TOP_N: 10,
|
|
145
|
-
});
|
|
146
|
-
BacktestKit.Log.useJsonl();
|
|
147
|
-
|
|
148
90
|
const ERROR_HANDLER_INSTALLED = Symbol.for("error-handler-installed");
|
|
149
91
|
function dumpStackTrace() {
|
|
150
92
|
const trace = stackTrace__namespace.get();
|
|
@@ -829,8 +771,15 @@ class WalkerMainService {
|
|
|
829
771
|
this.moduleConnectionService = inject(TYPES.moduleConnectionService);
|
|
830
772
|
this.run = functoolsKit.singleshot(async (payload) => {
|
|
831
773
|
this.loggerService.log("walkerMainService run", { payload });
|
|
774
|
+
const strategyMap = new Map();
|
|
832
775
|
for (const entryPoint of payload.entryPoints) {
|
|
833
776
|
await this.resolveService.attachStrategy(entryPoint);
|
|
777
|
+
for (const { strategyName } of await BacktestKit.listStrategySchema()) {
|
|
778
|
+
if (strategyMap.has(strategyName)) {
|
|
779
|
+
continue;
|
|
780
|
+
}
|
|
781
|
+
strategyMap.set(strategyName, entryPoint);
|
|
782
|
+
}
|
|
834
783
|
}
|
|
835
784
|
await this.moduleConnectionService.loadModule("./walker.module");
|
|
836
785
|
{
|
|
@@ -867,19 +816,42 @@ class WalkerMainService {
|
|
|
867
816
|
if (!frameName) {
|
|
868
817
|
throw new Error("Frame name is required");
|
|
869
818
|
}
|
|
819
|
+
const cwd = process.cwd();
|
|
820
|
+
const self = this;
|
|
821
|
+
const callbacks = {
|
|
822
|
+
async onStrategyStart(strategyName) {
|
|
823
|
+
const entryPoint = strategyMap.get(strategyName);
|
|
824
|
+
if (!entryPoint) {
|
|
825
|
+
return;
|
|
826
|
+
}
|
|
827
|
+
{
|
|
828
|
+
Setup.clear();
|
|
829
|
+
Setup.enable();
|
|
830
|
+
}
|
|
831
|
+
const absolutePath = path.resolve(entryPoint);
|
|
832
|
+
const moduleRoot = path.dirname(absolutePath);
|
|
833
|
+
{
|
|
834
|
+
process.chdir(moduleRoot);
|
|
835
|
+
cwd !== moduleRoot && BacktestKit.Log.useJsonl();
|
|
836
|
+
dotenv.config({ path: path.join(cwd, '.env'), override: true, quiet: true });
|
|
837
|
+
dotenv.config({ path: path.join(moduleRoot, '.env'), override: true, quiet: true });
|
|
838
|
+
}
|
|
839
|
+
if (!payload.noCache) {
|
|
840
|
+
await self.cacheLogicService.execute(payload.cacheInterval, {
|
|
841
|
+
exchangeName,
|
|
842
|
+
frameName,
|
|
843
|
+
symbol,
|
|
844
|
+
});
|
|
845
|
+
}
|
|
846
|
+
},
|
|
847
|
+
};
|
|
870
848
|
BacktestKit.addWalkerSchema({
|
|
871
849
|
walkerName: WALKER_NAME,
|
|
872
850
|
exchangeName,
|
|
873
851
|
frameName,
|
|
874
852
|
strategies: strategyNames,
|
|
853
|
+
callbacks,
|
|
875
854
|
});
|
|
876
|
-
if (!payload.noCache) {
|
|
877
|
-
await this.cacheLogicService.execute(payload.cacheInterval, {
|
|
878
|
-
exchangeName,
|
|
879
|
-
frameName,
|
|
880
|
-
symbol,
|
|
881
|
-
});
|
|
882
|
-
}
|
|
883
855
|
if (payload.verbose) {
|
|
884
856
|
BacktestKit.overrideExchangeSchema({
|
|
885
857
|
exchangeName,
|
|
@@ -895,8 +867,9 @@ class WalkerMainService {
|
|
|
895
867
|
BacktestKit.overrideWalkerSchema({
|
|
896
868
|
walkerName: WALKER_NAME,
|
|
897
869
|
callbacks: {
|
|
898
|
-
onStrategyStart(strategyName, symbol) {
|
|
870
|
+
async onStrategyStart(strategyName, symbol) {
|
|
899
871
|
console.log(`Strategy started: ${strategyName} for symbol: ${symbol}`);
|
|
872
|
+
await callbacks.onStrategyStart(strategyName);
|
|
900
873
|
},
|
|
901
874
|
onStrategyError(strategyName, symbol, error) {
|
|
902
875
|
console.error(`Strategy error: ${strategyName} for symbol: ${symbol}`, error);
|
|
@@ -917,9 +890,12 @@ class WalkerMainService {
|
|
|
917
890
|
unWalker();
|
|
918
891
|
res();
|
|
919
892
|
});
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
893
|
+
{
|
|
894
|
+
payload.verbose && console.time("Walker");
|
|
895
|
+
await awaiter;
|
|
896
|
+
payload.verbose && console.timeEnd("Walker");
|
|
897
|
+
}
|
|
898
|
+
process.chdir(cwd);
|
|
923
899
|
const dumpName = payload.output || `walker_${symbol}_${Date.now()}`;
|
|
924
900
|
const dumpDir = path.join(process.cwd(), "dump");
|
|
925
901
|
if (payload.json) {
|
|
@@ -2119,7 +2095,7 @@ const TRANSPILE_FN = functoolsKit.memoize(([path]) => `${path}`, (path, code, se
|
|
|
2119
2095
|
eval(self.params.babel.transpile(code));
|
|
2120
2096
|
}
|
|
2121
2097
|
catch (error) {
|
|
2122
|
-
console.log(`Error during transpilation error=\`${functoolsKit.getErrorMessage(error)}\` path
|
|
2098
|
+
console.log(`Error during transpilation error=\`${functoolsKit.getErrorMessage(error)}\` path=\`${path}\` __filename=\`${__filename}\` __dirname=\`${__dirname}\``);
|
|
2123
2099
|
process.exit(-1);
|
|
2124
2100
|
}
|
|
2125
2101
|
return {
|
|
@@ -2411,6 +2387,109 @@ const cli = {
|
|
|
2411
2387
|
};
|
|
2412
2388
|
init();
|
|
2413
2389
|
|
|
2390
|
+
class SetupUtils {
|
|
2391
|
+
constructor() {
|
|
2392
|
+
this.enable = functoolsKit.singleshot(() => {
|
|
2393
|
+
cli.loggerService.debug("SetupUtils enable");
|
|
2394
|
+
{
|
|
2395
|
+
BacktestKit.Storage.enable();
|
|
2396
|
+
BacktestKit.Notification.enable();
|
|
2397
|
+
}
|
|
2398
|
+
{
|
|
2399
|
+
BacktestKit.Markdown.enable();
|
|
2400
|
+
BacktestKit.Report.enable();
|
|
2401
|
+
BacktestKit.Dump.enable();
|
|
2402
|
+
BacktestKit.Memory.enable();
|
|
2403
|
+
}
|
|
2404
|
+
{
|
|
2405
|
+
BacktestKit.Dump.useMarkdown();
|
|
2406
|
+
BacktestKit.Memory.usePersist();
|
|
2407
|
+
}
|
|
2408
|
+
{
|
|
2409
|
+
BacktestKit.StorageLive.usePersist();
|
|
2410
|
+
BacktestKit.StorageBacktest.useMemory();
|
|
2411
|
+
}
|
|
2412
|
+
{
|
|
2413
|
+
BacktestKit.NotificationLive.usePersist();
|
|
2414
|
+
BacktestKit.NotificationBacktest.useMemory();
|
|
2415
|
+
}
|
|
2416
|
+
{
|
|
2417
|
+
BacktestKit.Markdown.useDummy();
|
|
2418
|
+
BacktestKit.Log.useJsonl();
|
|
2419
|
+
}
|
|
2420
|
+
});
|
|
2421
|
+
this.clear = () => {
|
|
2422
|
+
cli.loggerService.debug("SetupUtils clear");
|
|
2423
|
+
if (!this.enable.hasValue()) {
|
|
2424
|
+
return;
|
|
2425
|
+
}
|
|
2426
|
+
this.enable.clear();
|
|
2427
|
+
{
|
|
2428
|
+
BacktestKit.PersistSignalAdapter.clear();
|
|
2429
|
+
BacktestKit.PersistRiskAdapter.clear();
|
|
2430
|
+
BacktestKit.PersistScheduleAdapter.clear();
|
|
2431
|
+
BacktestKit.PersistPartialAdapter.clear();
|
|
2432
|
+
BacktestKit.PersistBreakevenAdapter.clear();
|
|
2433
|
+
BacktestKit.PersistCandleAdapter.clear();
|
|
2434
|
+
BacktestKit.PersistStorageAdapter.clear();
|
|
2435
|
+
BacktestKit.PersistNotificationAdapter.clear();
|
|
2436
|
+
BacktestKit.PersistLogAdapter.clear();
|
|
2437
|
+
BacktestKit.PersistMeasureAdapter.clear();
|
|
2438
|
+
BacktestKit.PersistMemoryAdapter.clear();
|
|
2439
|
+
}
|
|
2440
|
+
{
|
|
2441
|
+
BacktestKit.Dump.clear();
|
|
2442
|
+
BacktestKit.Log.clear();
|
|
2443
|
+
BacktestKit.Markdown.clear();
|
|
2444
|
+
BacktestKit.Memory.clear();
|
|
2445
|
+
BacktestKit.Report.clear();
|
|
2446
|
+
}
|
|
2447
|
+
{
|
|
2448
|
+
BacktestKit.StorageLive.clear();
|
|
2449
|
+
BacktestKit.StorageBacktest.clear();
|
|
2450
|
+
}
|
|
2451
|
+
{
|
|
2452
|
+
BacktestKit.NotificationLive.clear();
|
|
2453
|
+
BacktestKit.NotificationBacktest.clear();
|
|
2454
|
+
}
|
|
2455
|
+
};
|
|
2456
|
+
}
|
|
2457
|
+
}
|
|
2458
|
+
const Setup = new SetupUtils();
|
|
2459
|
+
|
|
2460
|
+
Setup.enable();
|
|
2461
|
+
BacktestKit.setConfig({
|
|
2462
|
+
CC_MAX_NOTIFICATIONS: 5000,
|
|
2463
|
+
CC_MAX_SIGNALS: 750,
|
|
2464
|
+
});
|
|
2465
|
+
BacktestKit.setConfig({
|
|
2466
|
+
CC_ENABLE_DCA_EVERYWHERE: true,
|
|
2467
|
+
CC_ENABLE_PPPL_EVERYWHERE: true,
|
|
2468
|
+
CC_ENABLE_TRAILING_EVERYWHERE: true,
|
|
2469
|
+
});
|
|
2470
|
+
BacktestKit.setConfig({
|
|
2471
|
+
CC_MAX_SIGNAL_GENERATION_SECONDS: 15 * 60,
|
|
2472
|
+
});
|
|
2473
|
+
BacktestKit.setConfig({
|
|
2474
|
+
CC_MAX_BACKTEST_MARKDOWN_ROWS: 1000,
|
|
2475
|
+
CC_MAX_BREAKEVEN_MARKDOWN_ROWS: 1000,
|
|
2476
|
+
CC_MAX_HEATMAP_MARKDOWN_ROWS: 1000,
|
|
2477
|
+
CC_MAX_HIGHEST_PROFIT_MARKDOWN_ROWS: 1000,
|
|
2478
|
+
CC_MAX_LIVE_MARKDOWN_ROWS: 1000,
|
|
2479
|
+
CC_MAX_PARTIAL_MARKDOWN_ROWS: 1000,
|
|
2480
|
+
CC_MAX_RISK_MARKDOWN_ROWS: 1000,
|
|
2481
|
+
CC_MAX_SCHEDULE_MARKDOWN_ROWS: 1000,
|
|
2482
|
+
CC_MAX_STRATEGY_MARKDOWN_ROWS: 1000,
|
|
2483
|
+
CC_MAX_SYNC_MARKDOWN_ROWS: 1000,
|
|
2484
|
+
CC_MAX_PERFORMANCE_MARKDOWN_ROWS: 1000,
|
|
2485
|
+
});
|
|
2486
|
+
BacktestKit.setConfig({
|
|
2487
|
+
CC_MAX_SIGNAL_LIFETIME_MINUTES: Infinity,
|
|
2488
|
+
});
|
|
2489
|
+
BacktestKit.setConfig({
|
|
2490
|
+
CC_WALKER_MARKDOWN_TOP_N: 10,
|
|
2491
|
+
});
|
|
2492
|
+
|
|
2414
2493
|
const MODES = ["backtest", "walker", "paper", "live", "pine", "dump", "init", "help", "version"];
|
|
2415
2494
|
const ENTRY_PATH$1 = "./node_modules/@backtest-kit/cli/build/index.mjs";
|
|
2416
2495
|
const HELP_TEXT$1 = `
|
|
@@ -2426,7 +2505,7 @@ const main$b = async () => {
|
|
|
2426
2505
|
if (MODES.some((mode) => values[mode])) {
|
|
2427
2506
|
return;
|
|
2428
2507
|
}
|
|
2429
|
-
process.stdout.write(`@backtest-kit/cli ${"6.
|
|
2508
|
+
process.stdout.write(`@backtest-kit/cli ${"6.3.0"}\n`);
|
|
2430
2509
|
process.stdout.write("\n");
|
|
2431
2510
|
process.stdout.write(`Run with --help to see available commands.\n`);
|
|
2432
2511
|
process.stdout.write("\n");
|
|
@@ -2827,6 +2906,20 @@ function runScript(scriptPath, cwd) {
|
|
|
2827
2906
|
child.on("error", reject);
|
|
2828
2907
|
});
|
|
2829
2908
|
}
|
|
2909
|
+
function runNpmInstall(cwd) {
|
|
2910
|
+
return new Promise((resolve, reject) => {
|
|
2911
|
+
const npm = process.platform === "win32" ? "npm.cmd" : "npm";
|
|
2912
|
+
const child = child_process.spawn(npm, ["install"], { cwd, stdio: "inherit", shell: true });
|
|
2913
|
+
child.on("close", (code) => {
|
|
2914
|
+
if (code !== 0) {
|
|
2915
|
+
reject(new Error(`npm install exited with code ${code}`));
|
|
2916
|
+
return;
|
|
2917
|
+
}
|
|
2918
|
+
resolve();
|
|
2919
|
+
});
|
|
2920
|
+
child.on("error", reject);
|
|
2921
|
+
});
|
|
2922
|
+
}
|
|
2830
2923
|
const main$2 = async () => {
|
|
2831
2924
|
if (!getEntry((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)))) {
|
|
2832
2925
|
return;
|
|
@@ -2847,6 +2940,8 @@ const main$2 = async () => {
|
|
|
2847
2940
|
await copyDir(templatePath, projectPath, { PROJECT_NAME: projectName });
|
|
2848
2941
|
console.log(`Fetching docs...`);
|
|
2849
2942
|
await runScript(path.join(projectPath, "scripts/fetch_docs.mjs"), projectPath);
|
|
2943
|
+
console.log(`Installing dependencies...`);
|
|
2944
|
+
await runNpmInstall(projectPath);
|
|
2850
2945
|
console.log(`Done! Project created at ${projectPath}`);
|
|
2851
2946
|
process.exit(0);
|
|
2852
2947
|
};
|
|
@@ -2978,7 +3073,7 @@ const main$1 = async () => {
|
|
|
2978
3073
|
if (!values.help) {
|
|
2979
3074
|
return;
|
|
2980
3075
|
}
|
|
2981
|
-
process.stdout.write(`@backtest-kit/cli ${"6.
|
|
3076
|
+
process.stdout.write(`@backtest-kit/cli ${"6.3.0"}\n\n`);
|
|
2982
3077
|
process.stdout.write(HELP_TEXT);
|
|
2983
3078
|
process.exit(0);
|
|
2984
3079
|
};
|
|
@@ -2992,7 +3087,7 @@ const main = async () => {
|
|
|
2992
3087
|
if (!values.version) {
|
|
2993
3088
|
return;
|
|
2994
3089
|
}
|
|
2995
|
-
process.stdout.write(`@backtest-kit/cli ${"6.
|
|
3090
|
+
process.stdout.write(`@backtest-kit/cli ${"6.3.0"}\n`);
|
|
2996
3091
|
process.exit(0);
|
|
2997
3092
|
};
|
|
2998
3093
|
main();
|
|
@@ -3030,6 +3125,7 @@ async function run(mode, args) {
|
|
|
3030
3125
|
throw new Error(`Invalid mode: ${mode}`);
|
|
3031
3126
|
}
|
|
3032
3127
|
|
|
3128
|
+
exports.Setup = Setup;
|
|
3033
3129
|
exports.cli = cli;
|
|
3034
3130
|
exports.run = run;
|
|
3035
3131
|
exports.setLogger = setLogger;
|
package/build/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import * as BacktestKit from 'backtest-kit';
|
|
3
|
-
import {
|
|
3
|
+
import { Log, listExchangeSchema, addExchangeSchema, roundTicks, listFrameSchema, addFrameSchema, listenDoneLive, listenDoneBacktest, shutdown, listenSignal, listStrategySchema, overrideExchangeSchema, Backtest, alignToInterval, addWalkerSchema, overrideWalkerSchema, Walker, listenDoneWalker, Live, getCandles, checkCandles, warmCandles, listenRisk, listenStrategyCommit, listenSync, Storage, Notification, Markdown, Report, Dump, Memory, StorageLive, StorageBacktest, NotificationLive, NotificationBacktest, PersistSignalAdapter, PersistRiskAdapter, PersistScheduleAdapter, PersistPartialAdapter, PersistBreakevenAdapter, PersistCandleAdapter, PersistStorageAdapter, PersistNotificationAdapter, PersistLogAdapter, PersistMeasureAdapter, PersistMemoryAdapter, setConfig, Exchange } from 'backtest-kit';
|
|
4
4
|
import { getErrorMessage, errorData, singleshot, str, BehaviorSubject, compose, createAwaiter, execpool, queued, sleep, randomString, TIMEOUT_SYMBOL, typo, retry, trycatch, memoize } from 'functools-kit';
|
|
5
5
|
import fs, { constants } from 'fs';
|
|
6
6
|
import * as stackTrace from 'stack-trace';
|
|
@@ -62,64 +62,6 @@ import { spawn } from 'child_process';
|
|
|
62
62
|
});
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
{
|
|
66
|
-
Storage.enable();
|
|
67
|
-
Notification.enable();
|
|
68
|
-
}
|
|
69
|
-
{
|
|
70
|
-
Markdown.enable();
|
|
71
|
-
Report.enable();
|
|
72
|
-
Dump.enable();
|
|
73
|
-
Memory.enable();
|
|
74
|
-
}
|
|
75
|
-
{
|
|
76
|
-
Dump.useMarkdown();
|
|
77
|
-
Memory.usePersist();
|
|
78
|
-
}
|
|
79
|
-
{
|
|
80
|
-
StorageLive.usePersist();
|
|
81
|
-
StorageBacktest.useMemory();
|
|
82
|
-
}
|
|
83
|
-
{
|
|
84
|
-
NotificationLive.usePersist();
|
|
85
|
-
NotificationBacktest.useMemory();
|
|
86
|
-
}
|
|
87
|
-
{
|
|
88
|
-
Markdown.useDummy();
|
|
89
|
-
}
|
|
90
|
-
setConfig({
|
|
91
|
-
CC_MAX_NOTIFICATIONS: 5000,
|
|
92
|
-
CC_MAX_SIGNALS: 750,
|
|
93
|
-
});
|
|
94
|
-
setConfig({
|
|
95
|
-
CC_ENABLE_DCA_EVERYWHERE: true,
|
|
96
|
-
CC_ENABLE_PPPL_EVERYWHERE: true,
|
|
97
|
-
CC_ENABLE_TRAILING_EVERYWHERE: true,
|
|
98
|
-
});
|
|
99
|
-
setConfig({
|
|
100
|
-
CC_MAX_SIGNAL_GENERATION_SECONDS: 15 * 60,
|
|
101
|
-
});
|
|
102
|
-
setConfig({
|
|
103
|
-
CC_MAX_BACKTEST_MARKDOWN_ROWS: 1000,
|
|
104
|
-
CC_MAX_BREAKEVEN_MARKDOWN_ROWS: 1000,
|
|
105
|
-
CC_MAX_HEATMAP_MARKDOWN_ROWS: 1000,
|
|
106
|
-
CC_MAX_HIGHEST_PROFIT_MARKDOWN_ROWS: 1000,
|
|
107
|
-
CC_MAX_LIVE_MARKDOWN_ROWS: 1000,
|
|
108
|
-
CC_MAX_PARTIAL_MARKDOWN_ROWS: 1000,
|
|
109
|
-
CC_MAX_RISK_MARKDOWN_ROWS: 1000,
|
|
110
|
-
CC_MAX_SCHEDULE_MARKDOWN_ROWS: 1000,
|
|
111
|
-
CC_MAX_STRATEGY_MARKDOWN_ROWS: 1000,
|
|
112
|
-
CC_MAX_SYNC_MARKDOWN_ROWS: 1000,
|
|
113
|
-
CC_MAX_PERFORMANCE_MARKDOWN_ROWS: 1000,
|
|
114
|
-
});
|
|
115
|
-
setConfig({
|
|
116
|
-
CC_MAX_SIGNAL_LIFETIME_MINUTES: Infinity,
|
|
117
|
-
});
|
|
118
|
-
setConfig({
|
|
119
|
-
CC_WALKER_MARKDOWN_TOP_N: 10,
|
|
120
|
-
});
|
|
121
|
-
Log.useJsonl();
|
|
122
|
-
|
|
123
65
|
const ERROR_HANDLER_INSTALLED = Symbol.for("error-handler-installed");
|
|
124
66
|
function dumpStackTrace() {
|
|
125
67
|
const trace = stackTrace.get();
|
|
@@ -804,8 +746,15 @@ class WalkerMainService {
|
|
|
804
746
|
this.moduleConnectionService = inject(TYPES.moduleConnectionService);
|
|
805
747
|
this.run = singleshot(async (payload) => {
|
|
806
748
|
this.loggerService.log("walkerMainService run", { payload });
|
|
749
|
+
const strategyMap = new Map();
|
|
807
750
|
for (const entryPoint of payload.entryPoints) {
|
|
808
751
|
await this.resolveService.attachStrategy(entryPoint);
|
|
752
|
+
for (const { strategyName } of await listStrategySchema()) {
|
|
753
|
+
if (strategyMap.has(strategyName)) {
|
|
754
|
+
continue;
|
|
755
|
+
}
|
|
756
|
+
strategyMap.set(strategyName, entryPoint);
|
|
757
|
+
}
|
|
809
758
|
}
|
|
810
759
|
await this.moduleConnectionService.loadModule("./walker.module");
|
|
811
760
|
{
|
|
@@ -842,19 +791,42 @@ class WalkerMainService {
|
|
|
842
791
|
if (!frameName) {
|
|
843
792
|
throw new Error("Frame name is required");
|
|
844
793
|
}
|
|
794
|
+
const cwd = process.cwd();
|
|
795
|
+
const self = this;
|
|
796
|
+
const callbacks = {
|
|
797
|
+
async onStrategyStart(strategyName) {
|
|
798
|
+
const entryPoint = strategyMap.get(strategyName);
|
|
799
|
+
if (!entryPoint) {
|
|
800
|
+
return;
|
|
801
|
+
}
|
|
802
|
+
{
|
|
803
|
+
Setup.clear();
|
|
804
|
+
Setup.enable();
|
|
805
|
+
}
|
|
806
|
+
const absolutePath = path.resolve(entryPoint);
|
|
807
|
+
const moduleRoot = path.dirname(absolutePath);
|
|
808
|
+
{
|
|
809
|
+
process.chdir(moduleRoot);
|
|
810
|
+
cwd !== moduleRoot && Log.useJsonl();
|
|
811
|
+
dotenv.config({ path: path.join(cwd, '.env'), override: true, quiet: true });
|
|
812
|
+
dotenv.config({ path: path.join(moduleRoot, '.env'), override: true, quiet: true });
|
|
813
|
+
}
|
|
814
|
+
if (!payload.noCache) {
|
|
815
|
+
await self.cacheLogicService.execute(payload.cacheInterval, {
|
|
816
|
+
exchangeName,
|
|
817
|
+
frameName,
|
|
818
|
+
symbol,
|
|
819
|
+
});
|
|
820
|
+
}
|
|
821
|
+
},
|
|
822
|
+
};
|
|
845
823
|
addWalkerSchema({
|
|
846
824
|
walkerName: WALKER_NAME,
|
|
847
825
|
exchangeName,
|
|
848
826
|
frameName,
|
|
849
827
|
strategies: strategyNames,
|
|
828
|
+
callbacks,
|
|
850
829
|
});
|
|
851
|
-
if (!payload.noCache) {
|
|
852
|
-
await this.cacheLogicService.execute(payload.cacheInterval, {
|
|
853
|
-
exchangeName,
|
|
854
|
-
frameName,
|
|
855
|
-
symbol,
|
|
856
|
-
});
|
|
857
|
-
}
|
|
858
830
|
if (payload.verbose) {
|
|
859
831
|
overrideExchangeSchema({
|
|
860
832
|
exchangeName,
|
|
@@ -870,8 +842,9 @@ class WalkerMainService {
|
|
|
870
842
|
overrideWalkerSchema({
|
|
871
843
|
walkerName: WALKER_NAME,
|
|
872
844
|
callbacks: {
|
|
873
|
-
onStrategyStart(strategyName, symbol) {
|
|
845
|
+
async onStrategyStart(strategyName, symbol) {
|
|
874
846
|
console.log(`Strategy started: ${strategyName} for symbol: ${symbol}`);
|
|
847
|
+
await callbacks.onStrategyStart(strategyName);
|
|
875
848
|
},
|
|
876
849
|
onStrategyError(strategyName, symbol, error) {
|
|
877
850
|
console.error(`Strategy error: ${strategyName} for symbol: ${symbol}`, error);
|
|
@@ -892,9 +865,12 @@ class WalkerMainService {
|
|
|
892
865
|
unWalker();
|
|
893
866
|
res();
|
|
894
867
|
});
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
868
|
+
{
|
|
869
|
+
payload.verbose && console.time("Walker");
|
|
870
|
+
await awaiter;
|
|
871
|
+
payload.verbose && console.timeEnd("Walker");
|
|
872
|
+
}
|
|
873
|
+
process.chdir(cwd);
|
|
898
874
|
const dumpName = payload.output || `walker_${symbol}_${Date.now()}`;
|
|
899
875
|
const dumpDir = join(process.cwd(), "dump");
|
|
900
876
|
if (payload.json) {
|
|
@@ -2094,7 +2070,7 @@ const TRANSPILE_FN = memoize(([path]) => `${path}`, (path, code, self, require)
|
|
|
2094
2070
|
eval(self.params.babel.transpile(code));
|
|
2095
2071
|
}
|
|
2096
2072
|
catch (error) {
|
|
2097
|
-
console.log(`Error during transpilation error=\`${getErrorMessage(error)}\` path
|
|
2073
|
+
console.log(`Error during transpilation error=\`${getErrorMessage(error)}\` path=\`${path}\` __filename=\`${__filename}\` __dirname=\`${__dirname}\``);
|
|
2098
2074
|
process.exit(-1);
|
|
2099
2075
|
}
|
|
2100
2076
|
return {
|
|
@@ -2382,6 +2358,109 @@ const cli = {
|
|
|
2382
2358
|
};
|
|
2383
2359
|
init();
|
|
2384
2360
|
|
|
2361
|
+
class SetupUtils {
|
|
2362
|
+
constructor() {
|
|
2363
|
+
this.enable = singleshot(() => {
|
|
2364
|
+
cli.loggerService.debug("SetupUtils enable");
|
|
2365
|
+
{
|
|
2366
|
+
Storage.enable();
|
|
2367
|
+
Notification.enable();
|
|
2368
|
+
}
|
|
2369
|
+
{
|
|
2370
|
+
Markdown.enable();
|
|
2371
|
+
Report.enable();
|
|
2372
|
+
Dump.enable();
|
|
2373
|
+
Memory.enable();
|
|
2374
|
+
}
|
|
2375
|
+
{
|
|
2376
|
+
Dump.useMarkdown();
|
|
2377
|
+
Memory.usePersist();
|
|
2378
|
+
}
|
|
2379
|
+
{
|
|
2380
|
+
StorageLive.usePersist();
|
|
2381
|
+
StorageBacktest.useMemory();
|
|
2382
|
+
}
|
|
2383
|
+
{
|
|
2384
|
+
NotificationLive.usePersist();
|
|
2385
|
+
NotificationBacktest.useMemory();
|
|
2386
|
+
}
|
|
2387
|
+
{
|
|
2388
|
+
Markdown.useDummy();
|
|
2389
|
+
Log.useJsonl();
|
|
2390
|
+
}
|
|
2391
|
+
});
|
|
2392
|
+
this.clear = () => {
|
|
2393
|
+
cli.loggerService.debug("SetupUtils clear");
|
|
2394
|
+
if (!this.enable.hasValue()) {
|
|
2395
|
+
return;
|
|
2396
|
+
}
|
|
2397
|
+
this.enable.clear();
|
|
2398
|
+
{
|
|
2399
|
+
PersistSignalAdapter.clear();
|
|
2400
|
+
PersistRiskAdapter.clear();
|
|
2401
|
+
PersistScheduleAdapter.clear();
|
|
2402
|
+
PersistPartialAdapter.clear();
|
|
2403
|
+
PersistBreakevenAdapter.clear();
|
|
2404
|
+
PersistCandleAdapter.clear();
|
|
2405
|
+
PersistStorageAdapter.clear();
|
|
2406
|
+
PersistNotificationAdapter.clear();
|
|
2407
|
+
PersistLogAdapter.clear();
|
|
2408
|
+
PersistMeasureAdapter.clear();
|
|
2409
|
+
PersistMemoryAdapter.clear();
|
|
2410
|
+
}
|
|
2411
|
+
{
|
|
2412
|
+
Dump.clear();
|
|
2413
|
+
Log.clear();
|
|
2414
|
+
Markdown.clear();
|
|
2415
|
+
Memory.clear();
|
|
2416
|
+
Report.clear();
|
|
2417
|
+
}
|
|
2418
|
+
{
|
|
2419
|
+
StorageLive.clear();
|
|
2420
|
+
StorageBacktest.clear();
|
|
2421
|
+
}
|
|
2422
|
+
{
|
|
2423
|
+
NotificationLive.clear();
|
|
2424
|
+
NotificationBacktest.clear();
|
|
2425
|
+
}
|
|
2426
|
+
};
|
|
2427
|
+
}
|
|
2428
|
+
}
|
|
2429
|
+
const Setup = new SetupUtils();
|
|
2430
|
+
|
|
2431
|
+
Setup.enable();
|
|
2432
|
+
setConfig({
|
|
2433
|
+
CC_MAX_NOTIFICATIONS: 5000,
|
|
2434
|
+
CC_MAX_SIGNALS: 750,
|
|
2435
|
+
});
|
|
2436
|
+
setConfig({
|
|
2437
|
+
CC_ENABLE_DCA_EVERYWHERE: true,
|
|
2438
|
+
CC_ENABLE_PPPL_EVERYWHERE: true,
|
|
2439
|
+
CC_ENABLE_TRAILING_EVERYWHERE: true,
|
|
2440
|
+
});
|
|
2441
|
+
setConfig({
|
|
2442
|
+
CC_MAX_SIGNAL_GENERATION_SECONDS: 15 * 60,
|
|
2443
|
+
});
|
|
2444
|
+
setConfig({
|
|
2445
|
+
CC_MAX_BACKTEST_MARKDOWN_ROWS: 1000,
|
|
2446
|
+
CC_MAX_BREAKEVEN_MARKDOWN_ROWS: 1000,
|
|
2447
|
+
CC_MAX_HEATMAP_MARKDOWN_ROWS: 1000,
|
|
2448
|
+
CC_MAX_HIGHEST_PROFIT_MARKDOWN_ROWS: 1000,
|
|
2449
|
+
CC_MAX_LIVE_MARKDOWN_ROWS: 1000,
|
|
2450
|
+
CC_MAX_PARTIAL_MARKDOWN_ROWS: 1000,
|
|
2451
|
+
CC_MAX_RISK_MARKDOWN_ROWS: 1000,
|
|
2452
|
+
CC_MAX_SCHEDULE_MARKDOWN_ROWS: 1000,
|
|
2453
|
+
CC_MAX_STRATEGY_MARKDOWN_ROWS: 1000,
|
|
2454
|
+
CC_MAX_SYNC_MARKDOWN_ROWS: 1000,
|
|
2455
|
+
CC_MAX_PERFORMANCE_MARKDOWN_ROWS: 1000,
|
|
2456
|
+
});
|
|
2457
|
+
setConfig({
|
|
2458
|
+
CC_MAX_SIGNAL_LIFETIME_MINUTES: Infinity,
|
|
2459
|
+
});
|
|
2460
|
+
setConfig({
|
|
2461
|
+
CC_WALKER_MARKDOWN_TOP_N: 10,
|
|
2462
|
+
});
|
|
2463
|
+
|
|
2385
2464
|
const MODES = ["backtest", "walker", "paper", "live", "pine", "dump", "init", "help", "version"];
|
|
2386
2465
|
const ENTRY_PATH$1 = "./node_modules/@backtest-kit/cli/build/index.mjs";
|
|
2387
2466
|
const HELP_TEXT$1 = `
|
|
@@ -2397,7 +2476,7 @@ const main$b = async () => {
|
|
|
2397
2476
|
if (MODES.some((mode) => values[mode])) {
|
|
2398
2477
|
return;
|
|
2399
2478
|
}
|
|
2400
|
-
process.stdout.write(`@backtest-kit/cli ${"6.
|
|
2479
|
+
process.stdout.write(`@backtest-kit/cli ${"6.3.0"}\n`);
|
|
2401
2480
|
process.stdout.write("\n");
|
|
2402
2481
|
process.stdout.write(`Run with --help to see available commands.\n`);
|
|
2403
2482
|
process.stdout.write("\n");
|
|
@@ -2798,6 +2877,20 @@ function runScript(scriptPath, cwd) {
|
|
|
2798
2877
|
child.on("error", reject);
|
|
2799
2878
|
});
|
|
2800
2879
|
}
|
|
2880
|
+
function runNpmInstall(cwd) {
|
|
2881
|
+
return new Promise((resolve, reject) => {
|
|
2882
|
+
const npm = process.platform === "win32" ? "npm.cmd" : "npm";
|
|
2883
|
+
const child = spawn(npm, ["install"], { cwd, stdio: "inherit", shell: true });
|
|
2884
|
+
child.on("close", (code) => {
|
|
2885
|
+
if (code !== 0) {
|
|
2886
|
+
reject(new Error(`npm install exited with code ${code}`));
|
|
2887
|
+
return;
|
|
2888
|
+
}
|
|
2889
|
+
resolve();
|
|
2890
|
+
});
|
|
2891
|
+
child.on("error", reject);
|
|
2892
|
+
});
|
|
2893
|
+
}
|
|
2801
2894
|
const main$2 = async () => {
|
|
2802
2895
|
if (!getEntry(import.meta.url)) {
|
|
2803
2896
|
return;
|
|
@@ -2818,6 +2911,8 @@ const main$2 = async () => {
|
|
|
2818
2911
|
await copyDir(templatePath, projectPath, { PROJECT_NAME: projectName });
|
|
2819
2912
|
console.log(`Fetching docs...`);
|
|
2820
2913
|
await runScript(join(projectPath, "scripts/fetch_docs.mjs"), projectPath);
|
|
2914
|
+
console.log(`Installing dependencies...`);
|
|
2915
|
+
await runNpmInstall(projectPath);
|
|
2821
2916
|
console.log(`Done! Project created at ${projectPath}`);
|
|
2822
2917
|
process.exit(0);
|
|
2823
2918
|
};
|
|
@@ -2949,7 +3044,7 @@ const main$1 = async () => {
|
|
|
2949
3044
|
if (!values.help) {
|
|
2950
3045
|
return;
|
|
2951
3046
|
}
|
|
2952
|
-
process.stdout.write(`@backtest-kit/cli ${"6.
|
|
3047
|
+
process.stdout.write(`@backtest-kit/cli ${"6.3.0"}\n\n`);
|
|
2953
3048
|
process.stdout.write(HELP_TEXT);
|
|
2954
3049
|
process.exit(0);
|
|
2955
3050
|
};
|
|
@@ -2963,7 +3058,7 @@ const main = async () => {
|
|
|
2963
3058
|
if (!values.version) {
|
|
2964
3059
|
return;
|
|
2965
3060
|
}
|
|
2966
|
-
process.stdout.write(`@backtest-kit/cli ${"6.
|
|
3061
|
+
process.stdout.write(`@backtest-kit/cli ${"6.3.0"}\n`);
|
|
2967
3062
|
process.exit(0);
|
|
2968
3063
|
};
|
|
2969
3064
|
main();
|
|
@@ -3001,4 +3096,4 @@ async function run(mode, args) {
|
|
|
3001
3096
|
throw new Error(`Invalid mode: ${mode}`);
|
|
3002
3097
|
}
|
|
3003
3098
|
|
|
3004
|
-
export { cli, run, setLogger };
|
|
3099
|
+
export { Setup, cli, run, setLogger };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backtest-kit/cli",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.4.0",
|
|
4
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
5
|
"author": {
|
|
6
6
|
"name": "Petr Tripolsky",
|
|
@@ -61,11 +61,11 @@
|
|
|
61
61
|
"devDependencies": {
|
|
62
62
|
"@babel/plugin-transform-modules-umd": "7.27.1",
|
|
63
63
|
"@babel/standalone": "7.29.1",
|
|
64
|
-
"@backtest-kit/ui": "6.
|
|
65
|
-
"@backtest-kit/graph": "6.
|
|
66
|
-
"@backtest-kit/ollama": "6.
|
|
67
|
-
"@backtest-kit/pinets": "6.
|
|
68
|
-
"@backtest-kit/signals": "6.
|
|
64
|
+
"@backtest-kit/ui": "6.4.0",
|
|
65
|
+
"@backtest-kit/graph": "6.4.0",
|
|
66
|
+
"@backtest-kit/ollama": "6.4.0",
|
|
67
|
+
"@backtest-kit/pinets": "6.4.0",
|
|
68
|
+
"@backtest-kit/signals": "6.4.0",
|
|
69
69
|
"@rollup/plugin-replace": "6.0.3",
|
|
70
70
|
"@rollup/plugin-typescript": "11.1.6",
|
|
71
71
|
"@types/image-size": "0.7.0",
|
|
@@ -73,7 +73,7 @@
|
|
|
73
73
|
"@types/mustache": "4.2.6",
|
|
74
74
|
"@types/node": "22.9.0",
|
|
75
75
|
"@types/stack-trace": "0.0.33",
|
|
76
|
-
"backtest-kit": "6.
|
|
76
|
+
"backtest-kit": "6.4.0",
|
|
77
77
|
"glob": "11.0.1",
|
|
78
78
|
"markdown-it": "14.1.1",
|
|
79
79
|
"rimraf": "6.0.1",
|
|
@@ -88,12 +88,12 @@
|
|
|
88
88
|
"peerDependencies": {
|
|
89
89
|
"@babel/plugin-transform-modules-umd": "^7.27.1",
|
|
90
90
|
"@babel/standalone": "^7.29.1",
|
|
91
|
-
"@backtest-kit/ui": "^6.
|
|
92
|
-
"@backtest-kit/graph": "^6.
|
|
93
|
-
"@backtest-kit/ollama": "^6.
|
|
94
|
-
"@backtest-kit/pinets": "^6.
|
|
95
|
-
"@backtest-kit/signals": "^6.
|
|
96
|
-
"backtest-kit": "^6.
|
|
91
|
+
"@backtest-kit/ui": "^6.4.0",
|
|
92
|
+
"@backtest-kit/graph": "^6.4.0",
|
|
93
|
+
"@backtest-kit/ollama": "^6.4.0",
|
|
94
|
+
"@backtest-kit/pinets": "^6.4.0",
|
|
95
|
+
"@backtest-kit/signals": "^6.4.0",
|
|
96
|
+
"backtest-kit": "^6.4.0",
|
|
97
97
|
"markdown-it": "^14.1.1",
|
|
98
98
|
"typescript": "^5.0.0"
|
|
99
99
|
},
|
|
@@ -87,7 +87,7 @@ npm start -- --live --symbol BTCUSDT --ui --telegram ./content/feb_2026.strategy
|
|
|
87
87
|
|
|
88
88
|
Module file `./modules/live.module.ts` is loaded automatically if it exists. Use it to register a `Broker` adapter that intercepts every trade mutation before internal state changes — exchange rejection rolls back the operation atomically.
|
|
89
89
|
|
|
90
|
-
##
|
|
90
|
+
## ⚖️ Walker — A/B Strategy Comparison (`--walker`)
|
|
91
91
|
|
|
92
92
|
Runs the same historical period across multiple strategy files and prints a ranked comparison report. Use it to pick the best variant before committing to a single strategy.
|
|
93
93
|
|
package/types.d.ts
CHANGED
|
@@ -1,291 +1,297 @@
|
|
|
1
|
-
import * as functools_kit from 'functools-kit';
|
|
2
|
-
import { CandleInterval, TrailingTakeCommit, TrailingStopCommit, BreakevenCommit, PartialProfitCommit, PartialLossCommit, IStrategyTickResultScheduled, IStrategyTickResultCancelled, IStrategyTickResultOpened, IStrategyTickResultClosed, RiskContract, AverageBuyCommit, SignalOpenContract, SignalCloseContract, CancelScheduledCommit, ClosePendingCommit } from 'backtest-kit';
|
|
3
|
-
import { Input } from 'telegraf';
|
|
4
|
-
|
|
5
|
-
interface ILogger {
|
|
6
|
-
log(topic: string, ...args: any[]): void;
|
|
7
|
-
debug(topic: string, ...args: any[]): void;
|
|
8
|
-
info(topic: string, ...args: any[]): void;
|
|
9
|
-
warn(topic: string, ...args: any[]): void;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
declare class LoggerService implements ILogger {
|
|
13
|
-
private _commonLogger;
|
|
14
|
-
log: (topic: string, ...args: any[]) => Promise<void>;
|
|
15
|
-
debug: (topic: string, ...args: any[]) => Promise<void>;
|
|
16
|
-
info: (topic: string, ...args: any[]) => Promise<void>;
|
|
17
|
-
warn: (topic: string, ...args: any[]) => Promise<void>;
|
|
18
|
-
setLogger: (logger: ILogger) => void;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
declare class PaperMainService {
|
|
22
|
-
private loggerService;
|
|
23
|
-
private resolveService;
|
|
24
|
-
private exchangeSchemaService;
|
|
25
|
-
private symbolSchemaService;
|
|
26
|
-
private frontendProviderService;
|
|
27
|
-
private telegramProviderService;
|
|
28
|
-
private moduleConnectionService;
|
|
29
|
-
run: ((payload: {
|
|
30
|
-
entryPoint: string;
|
|
31
|
-
symbol: string;
|
|
32
|
-
strategy: string;
|
|
33
|
-
exchange: string;
|
|
34
|
-
verbose: boolean;
|
|
35
|
-
}) => Promise<void>) & functools_kit.ISingleshotClearable;
|
|
36
|
-
connect: (() => Promise<void>) & functools_kit.ISingleshotClearable;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
declare class LiveMainService {
|
|
40
|
-
private loggerService;
|
|
41
|
-
private resolveService;
|
|
42
|
-
private exchangeSchemaService;
|
|
43
|
-
private symbolSchemaService;
|
|
44
|
-
private frontendProviderService;
|
|
45
|
-
private telegramProviderService;
|
|
46
|
-
private moduleConnectionService;
|
|
47
|
-
run: ((payload: {
|
|
48
|
-
entryPoint: string;
|
|
49
|
-
symbol: string;
|
|
50
|
-
strategy: string;
|
|
51
|
-
exchange: string;
|
|
52
|
-
verbose: boolean;
|
|
53
|
-
}) => Promise<void>) & functools_kit.ISingleshotClearable;
|
|
54
|
-
connect: (() => Promise<void>) & functools_kit.ISingleshotClearable;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
declare class BacktestMainService {
|
|
58
|
-
private loggerService;
|
|
59
|
-
private resolveService;
|
|
60
|
-
private exchangeSchemaService;
|
|
61
|
-
private frameSchemaService;
|
|
62
|
-
private symbolSchemaService;
|
|
63
|
-
private cacheLogicService;
|
|
64
|
-
private frontendProviderService;
|
|
65
|
-
private telegramProviderService;
|
|
66
|
-
private moduleConnectionService;
|
|
67
|
-
run: ((payload: {
|
|
68
|
-
entryPoint: string;
|
|
69
|
-
symbol: string;
|
|
70
|
-
strategy: string;
|
|
71
|
-
exchange: string;
|
|
72
|
-
frame: string;
|
|
73
|
-
cacheInterval: string[];
|
|
74
|
-
verbose: boolean;
|
|
75
|
-
noCache: boolean;
|
|
76
|
-
}) => Promise<void>) & functools_kit.ISingleshotClearable;
|
|
77
|
-
connect: (() => Promise<void>) & functools_kit.ISingleshotClearable;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
declare class WalkerMainService {
|
|
81
|
-
private loggerService;
|
|
82
|
-
private resolveService;
|
|
83
|
-
private exchangeSchemaService;
|
|
84
|
-
private symbolSchemaService;
|
|
85
|
-
private cacheLogicService;
|
|
86
|
-
private moduleConnectionService;
|
|
87
|
-
run: ((payload: {
|
|
88
|
-
entryPoints: string[];
|
|
89
|
-
symbol: string;
|
|
90
|
-
output: string;
|
|
91
|
-
cacheInterval: CandleInterval[];
|
|
92
|
-
json: boolean;
|
|
93
|
-
markdown: boolean;
|
|
94
|
-
verbose: boolean;
|
|
95
|
-
noCache: boolean;
|
|
96
|
-
}) => Promise<void>) & functools_kit.ISingleshotClearable;
|
|
97
|
-
connect: (() => Promise<void>) & functools_kit.ISingleshotClearable;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
declare class ExchangeSchemaService {
|
|
101
|
-
readonly loggerService: LoggerService;
|
|
102
|
-
addSchema: (() => Promise<void>) & functools_kit.ISingleshotClearable;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
declare class FrameSchemaService {
|
|
106
|
-
readonly loggerService: LoggerService;
|
|
107
|
-
addSchema: (() => Promise<void>) & functools_kit.ISingleshotClearable;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
declare class LoaderService {
|
|
111
|
-
private readonly babelService;
|
|
112
|
-
private readonly loggerService;
|
|
113
|
-
private getInstance;
|
|
114
|
-
import: (filePath: string, basePath?: string) => any;
|
|
115
|
-
check: (filePath: string, basePath?: string) => Promise<boolean>;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
declare class ResolveService {
|
|
119
|
-
readonly loggerService: LoggerService;
|
|
120
|
-
readonly loaderService: LoaderService;
|
|
121
|
-
readonly DEFAULT_TEMPLATE_DIR: string;
|
|
122
|
-
readonly DEFAULT_MODULES_DIR: string;
|
|
123
|
-
readonly OVERRIDE_TEMPLATE_DIR: string;
|
|
124
|
-
readonly OVERRIDE_MODULES_DIR: string;
|
|
125
|
-
getIsLaunched: () => boolean;
|
|
126
|
-
attachPine: (pinePath: string) => Promise<string>;
|
|
127
|
-
attachStrategy: (jsPath: string) => Promise<void>;
|
|
128
|
-
attachJavascript: (jsPath: string) => Promise<void>;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
declare class ErrorService {
|
|
132
|
-
handleGlobalError: (error: Error) => Promise<void>;
|
|
133
|
-
private _listenForError;
|
|
134
|
-
protected init: (() => void) & functools_kit.ISingleshotClearable;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
declare class SymbolSchemaService {
|
|
138
|
-
readonly loggerService: LoggerService;
|
|
139
|
-
addSchema: (() => Promise<void>) & functools_kit.ISingleshotClearable;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
declare class FrontendProviderService {
|
|
143
|
-
private readonly loggerService;
|
|
144
|
-
enable: (() => () => void) & functools_kit.ISingleshotClearable;
|
|
145
|
-
disable: () => void;
|
|
146
|
-
connect: (() => Promise<() => void>) & functools_kit.ISingleshotClearable;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
declare class TelegramProviderService {
|
|
150
|
-
private readonly loggerService;
|
|
151
|
-
private readonly telegramLogicService;
|
|
152
|
-
enable: (() => () => void) & functools_kit.ISingleshotClearable;
|
|
153
|
-
disable: () => void;
|
|
154
|
-
connect: (() => Promise<() => void>) & functools_kit.ISingleshotClearable;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
declare class CacheLogicService {
|
|
158
|
-
private readonly loggerService;
|
|
159
|
-
execute: (intervalList: CandleInterval[], dto: {
|
|
160
|
-
symbol: string;
|
|
161
|
-
frameName: string;
|
|
162
|
-
exchangeName: string;
|
|
163
|
-
}) => Promise<void>;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
type InputFile = ReturnType<typeof Input.fromReadableStream>;
|
|
167
|
-
type Image = string | InputFile;
|
|
168
|
-
declare class TelegramApiService {
|
|
169
|
-
publish: (channel: string, msg: string, images?: Image[]) => Promise<"Message scheduled for publication" | "Message published successfully">;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
declare class QuickchartApiService {
|
|
173
|
-
readonly loggerService: LoggerService;
|
|
174
|
-
getChart: (symbol: string, interval: string) => Promise<Buffer<ArrayBufferLike>>;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
declare class TelegramWebService {
|
|
178
|
-
private readonly loggerService;
|
|
179
|
-
private readonly telegramApiService;
|
|
180
|
-
private readonly quickchartApiService;
|
|
181
|
-
publishNotify: (dto: {
|
|
182
|
-
symbol: string;
|
|
183
|
-
markdown: string;
|
|
184
|
-
}) => Promise<void>;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
declare class TelegramLogicService {
|
|
188
|
-
private readonly loggerService;
|
|
189
|
-
private readonly telegramTemplateService;
|
|
190
|
-
private readonly telegramWebService;
|
|
191
|
-
private notifyTrailingTake;
|
|
192
|
-
private notifyTrailingStop;
|
|
193
|
-
private notifyBreakeven;
|
|
194
|
-
private notifyPartialProfit;
|
|
195
|
-
private notifyPartialLoss;
|
|
196
|
-
private notifyScheduled;
|
|
197
|
-
private notifyCancelled;
|
|
198
|
-
private notifyOpened;
|
|
199
|
-
private notifyClosed;
|
|
200
|
-
private notifyRisk;
|
|
201
|
-
private notifyAverageBuy;
|
|
202
|
-
private notifySignalOpen;
|
|
203
|
-
private notifySignalClose;
|
|
204
|
-
private notifyCancelScheduled;
|
|
205
|
-
private notifyClosePending;
|
|
206
|
-
connect: (() => () => void) & functools_kit.ISingleshotClearable;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
declare class TelegramTemplateService {
|
|
210
|
-
readonly loggerService: LoggerService;
|
|
211
|
-
readonly resolveService: ResolveService;
|
|
212
|
-
getTrailingTakeMarkdown: (event: TrailingTakeCommit) => Promise<string>;
|
|
213
|
-
getTrailingStopMarkdown: (event: TrailingStopCommit) => Promise<string>;
|
|
214
|
-
getBreakevenMarkdown: (event: BreakevenCommit) => Promise<string>;
|
|
215
|
-
getPartialProfitMarkdown: (event: PartialProfitCommit) => Promise<string>;
|
|
216
|
-
getPartialLossMarkdown: (event: PartialLossCommit) => Promise<string>;
|
|
217
|
-
getScheduledMarkdown: (event: IStrategyTickResultScheduled) => Promise<string>;
|
|
218
|
-
getCancelledMarkdown: (event: IStrategyTickResultCancelled) => Promise<string>;
|
|
219
|
-
getOpenedMarkdown: (event: IStrategyTickResultOpened) => Promise<string>;
|
|
220
|
-
getClosedMarkdown: (event: IStrategyTickResultClosed) => Promise<string>;
|
|
221
|
-
getRiskMarkdown: (event: RiskContract) => Promise<string>;
|
|
222
|
-
getAverageBuyMarkdown: (event: AverageBuyCommit) => Promise<string>;
|
|
223
|
-
getSignalOpenMarkdown: (event: SignalOpenContract) => Promise<string>;
|
|
224
|
-
getSignalCloseMarkdown: (event: SignalCloseContract) => Promise<string>;
|
|
225
|
-
getCancelScheduledMarkdown: (event: CancelScheduledCommit) => Promise<string>;
|
|
226
|
-
getClosePendingMarkdown: (event: ClosePendingCommit) => Promise<string>;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
declare class ModuleConnectionService {
|
|
230
|
-
readonly loggerService: LoggerService;
|
|
231
|
-
readonly resolveService: ResolveService;
|
|
232
|
-
readonly loaderService: LoaderService;
|
|
233
|
-
loadModule: (fileName: string) => Promise<boolean>;
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
interface IBabel {
|
|
237
|
-
transpile(code: string): string;
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
declare class BabelService implements IBabel {
|
|
241
|
-
readonly loggerService: LoggerService;
|
|
242
|
-
transpile: (code: string) => any;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
declare const cli: {
|
|
246
|
-
telegramTemplateService: TelegramTemplateService;
|
|
247
|
-
telegramWebService: TelegramWebService;
|
|
248
|
-
frontendProviderService: FrontendProviderService;
|
|
249
|
-
telegramProviderService: TelegramProviderService;
|
|
250
|
-
exchangeSchemaService: ExchangeSchemaService;
|
|
251
|
-
symbolSchemaService: SymbolSchemaService;
|
|
252
|
-
frameSchemaService: FrameSchemaService;
|
|
253
|
-
cacheLogicService: CacheLogicService;
|
|
254
|
-
telegramLogicService: TelegramLogicService;
|
|
255
|
-
backtestMainService: BacktestMainService;
|
|
256
|
-
walkerMainService: WalkerMainService;
|
|
257
|
-
paperMainService: PaperMainService;
|
|
258
|
-
liveMainService: LiveMainService;
|
|
259
|
-
moduleConnectionService: ModuleConnectionService;
|
|
260
|
-
errorService: ErrorService;
|
|
261
|
-
loggerService: LoggerService;
|
|
262
|
-
resolveService: ResolveService;
|
|
263
|
-
loaderService: LoaderService;
|
|
264
|
-
babelService: BabelService;
|
|
265
|
-
telegramApiService: TelegramApiService;
|
|
266
|
-
quickchartApiService: QuickchartApiService;
|
|
267
|
-
};
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
1
|
+
import * as functools_kit from 'functools-kit';
|
|
2
|
+
import { CandleInterval, TrailingTakeCommit, TrailingStopCommit, BreakevenCommit, PartialProfitCommit, PartialLossCommit, IStrategyTickResultScheduled, IStrategyTickResultCancelled, IStrategyTickResultOpened, IStrategyTickResultClosed, RiskContract, AverageBuyCommit, SignalOpenContract, SignalCloseContract, CancelScheduledCommit, ClosePendingCommit } from 'backtest-kit';
|
|
3
|
+
import { Input } from 'telegraf';
|
|
4
|
+
|
|
5
|
+
interface ILogger {
|
|
6
|
+
log(topic: string, ...args: any[]): void;
|
|
7
|
+
debug(topic: string, ...args: any[]): void;
|
|
8
|
+
info(topic: string, ...args: any[]): void;
|
|
9
|
+
warn(topic: string, ...args: any[]): void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
declare class LoggerService implements ILogger {
|
|
13
|
+
private _commonLogger;
|
|
14
|
+
log: (topic: string, ...args: any[]) => Promise<void>;
|
|
15
|
+
debug: (topic: string, ...args: any[]) => Promise<void>;
|
|
16
|
+
info: (topic: string, ...args: any[]) => Promise<void>;
|
|
17
|
+
warn: (topic: string, ...args: any[]) => Promise<void>;
|
|
18
|
+
setLogger: (logger: ILogger) => void;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
declare class PaperMainService {
|
|
22
|
+
private loggerService;
|
|
23
|
+
private resolveService;
|
|
24
|
+
private exchangeSchemaService;
|
|
25
|
+
private symbolSchemaService;
|
|
26
|
+
private frontendProviderService;
|
|
27
|
+
private telegramProviderService;
|
|
28
|
+
private moduleConnectionService;
|
|
29
|
+
run: ((payload: {
|
|
30
|
+
entryPoint: string;
|
|
31
|
+
symbol: string;
|
|
32
|
+
strategy: string;
|
|
33
|
+
exchange: string;
|
|
34
|
+
verbose: boolean;
|
|
35
|
+
}) => Promise<void>) & functools_kit.ISingleshotClearable;
|
|
36
|
+
connect: (() => Promise<void>) & functools_kit.ISingleshotClearable;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
declare class LiveMainService {
|
|
40
|
+
private loggerService;
|
|
41
|
+
private resolveService;
|
|
42
|
+
private exchangeSchemaService;
|
|
43
|
+
private symbolSchemaService;
|
|
44
|
+
private frontendProviderService;
|
|
45
|
+
private telegramProviderService;
|
|
46
|
+
private moduleConnectionService;
|
|
47
|
+
run: ((payload: {
|
|
48
|
+
entryPoint: string;
|
|
49
|
+
symbol: string;
|
|
50
|
+
strategy: string;
|
|
51
|
+
exchange: string;
|
|
52
|
+
verbose: boolean;
|
|
53
|
+
}) => Promise<void>) & functools_kit.ISingleshotClearable;
|
|
54
|
+
connect: (() => Promise<void>) & functools_kit.ISingleshotClearable;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
declare class BacktestMainService {
|
|
58
|
+
private loggerService;
|
|
59
|
+
private resolveService;
|
|
60
|
+
private exchangeSchemaService;
|
|
61
|
+
private frameSchemaService;
|
|
62
|
+
private symbolSchemaService;
|
|
63
|
+
private cacheLogicService;
|
|
64
|
+
private frontendProviderService;
|
|
65
|
+
private telegramProviderService;
|
|
66
|
+
private moduleConnectionService;
|
|
67
|
+
run: ((payload: {
|
|
68
|
+
entryPoint: string;
|
|
69
|
+
symbol: string;
|
|
70
|
+
strategy: string;
|
|
71
|
+
exchange: string;
|
|
72
|
+
frame: string;
|
|
73
|
+
cacheInterval: string[];
|
|
74
|
+
verbose: boolean;
|
|
75
|
+
noCache: boolean;
|
|
76
|
+
}) => Promise<void>) & functools_kit.ISingleshotClearable;
|
|
77
|
+
connect: (() => Promise<void>) & functools_kit.ISingleshotClearable;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
declare class WalkerMainService {
|
|
81
|
+
private loggerService;
|
|
82
|
+
private resolveService;
|
|
83
|
+
private exchangeSchemaService;
|
|
84
|
+
private symbolSchemaService;
|
|
85
|
+
private cacheLogicService;
|
|
86
|
+
private moduleConnectionService;
|
|
87
|
+
run: ((payload: {
|
|
88
|
+
entryPoints: string[];
|
|
89
|
+
symbol: string;
|
|
90
|
+
output: string;
|
|
91
|
+
cacheInterval: CandleInterval[];
|
|
92
|
+
json: boolean;
|
|
93
|
+
markdown: boolean;
|
|
94
|
+
verbose: boolean;
|
|
95
|
+
noCache: boolean;
|
|
96
|
+
}) => Promise<void>) & functools_kit.ISingleshotClearable;
|
|
97
|
+
connect: (() => Promise<void>) & functools_kit.ISingleshotClearable;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
declare class ExchangeSchemaService {
|
|
101
|
+
readonly loggerService: LoggerService;
|
|
102
|
+
addSchema: (() => Promise<void>) & functools_kit.ISingleshotClearable;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
declare class FrameSchemaService {
|
|
106
|
+
readonly loggerService: LoggerService;
|
|
107
|
+
addSchema: (() => Promise<void>) & functools_kit.ISingleshotClearable;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
declare class LoaderService {
|
|
111
|
+
private readonly babelService;
|
|
112
|
+
private readonly loggerService;
|
|
113
|
+
private getInstance;
|
|
114
|
+
import: (filePath: string, basePath?: string) => any;
|
|
115
|
+
check: (filePath: string, basePath?: string) => Promise<boolean>;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
declare class ResolveService {
|
|
119
|
+
readonly loggerService: LoggerService;
|
|
120
|
+
readonly loaderService: LoaderService;
|
|
121
|
+
readonly DEFAULT_TEMPLATE_DIR: string;
|
|
122
|
+
readonly DEFAULT_MODULES_DIR: string;
|
|
123
|
+
readonly OVERRIDE_TEMPLATE_DIR: string;
|
|
124
|
+
readonly OVERRIDE_MODULES_DIR: string;
|
|
125
|
+
getIsLaunched: () => boolean;
|
|
126
|
+
attachPine: (pinePath: string) => Promise<string>;
|
|
127
|
+
attachStrategy: (jsPath: string) => Promise<void>;
|
|
128
|
+
attachJavascript: (jsPath: string) => Promise<void>;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
declare class ErrorService {
|
|
132
|
+
handleGlobalError: (error: Error) => Promise<void>;
|
|
133
|
+
private _listenForError;
|
|
134
|
+
protected init: (() => void) & functools_kit.ISingleshotClearable;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
declare class SymbolSchemaService {
|
|
138
|
+
readonly loggerService: LoggerService;
|
|
139
|
+
addSchema: (() => Promise<void>) & functools_kit.ISingleshotClearable;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
declare class FrontendProviderService {
|
|
143
|
+
private readonly loggerService;
|
|
144
|
+
enable: (() => () => void) & functools_kit.ISingleshotClearable;
|
|
145
|
+
disable: () => void;
|
|
146
|
+
connect: (() => Promise<() => void>) & functools_kit.ISingleshotClearable;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
declare class TelegramProviderService {
|
|
150
|
+
private readonly loggerService;
|
|
151
|
+
private readonly telegramLogicService;
|
|
152
|
+
enable: (() => () => void) & functools_kit.ISingleshotClearable;
|
|
153
|
+
disable: () => void;
|
|
154
|
+
connect: (() => Promise<() => void>) & functools_kit.ISingleshotClearable;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
declare class CacheLogicService {
|
|
158
|
+
private readonly loggerService;
|
|
159
|
+
execute: (intervalList: CandleInterval[], dto: {
|
|
160
|
+
symbol: string;
|
|
161
|
+
frameName: string;
|
|
162
|
+
exchangeName: string;
|
|
163
|
+
}) => Promise<void>;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
type InputFile = ReturnType<typeof Input.fromReadableStream>;
|
|
167
|
+
type Image = string | InputFile;
|
|
168
|
+
declare class TelegramApiService {
|
|
169
|
+
publish: (channel: string, msg: string, images?: Image[]) => Promise<"Message scheduled for publication" | "Message published successfully">;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
declare class QuickchartApiService {
|
|
173
|
+
readonly loggerService: LoggerService;
|
|
174
|
+
getChart: (symbol: string, interval: string) => Promise<Buffer<ArrayBufferLike>>;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
declare class TelegramWebService {
|
|
178
|
+
private readonly loggerService;
|
|
179
|
+
private readonly telegramApiService;
|
|
180
|
+
private readonly quickchartApiService;
|
|
181
|
+
publishNotify: (dto: {
|
|
182
|
+
symbol: string;
|
|
183
|
+
markdown: string;
|
|
184
|
+
}) => Promise<void>;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
declare class TelegramLogicService {
|
|
188
|
+
private readonly loggerService;
|
|
189
|
+
private readonly telegramTemplateService;
|
|
190
|
+
private readonly telegramWebService;
|
|
191
|
+
private notifyTrailingTake;
|
|
192
|
+
private notifyTrailingStop;
|
|
193
|
+
private notifyBreakeven;
|
|
194
|
+
private notifyPartialProfit;
|
|
195
|
+
private notifyPartialLoss;
|
|
196
|
+
private notifyScheduled;
|
|
197
|
+
private notifyCancelled;
|
|
198
|
+
private notifyOpened;
|
|
199
|
+
private notifyClosed;
|
|
200
|
+
private notifyRisk;
|
|
201
|
+
private notifyAverageBuy;
|
|
202
|
+
private notifySignalOpen;
|
|
203
|
+
private notifySignalClose;
|
|
204
|
+
private notifyCancelScheduled;
|
|
205
|
+
private notifyClosePending;
|
|
206
|
+
connect: (() => () => void) & functools_kit.ISingleshotClearable;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
declare class TelegramTemplateService {
|
|
210
|
+
readonly loggerService: LoggerService;
|
|
211
|
+
readonly resolveService: ResolveService;
|
|
212
|
+
getTrailingTakeMarkdown: (event: TrailingTakeCommit) => Promise<string>;
|
|
213
|
+
getTrailingStopMarkdown: (event: TrailingStopCommit) => Promise<string>;
|
|
214
|
+
getBreakevenMarkdown: (event: BreakevenCommit) => Promise<string>;
|
|
215
|
+
getPartialProfitMarkdown: (event: PartialProfitCommit) => Promise<string>;
|
|
216
|
+
getPartialLossMarkdown: (event: PartialLossCommit) => Promise<string>;
|
|
217
|
+
getScheduledMarkdown: (event: IStrategyTickResultScheduled) => Promise<string>;
|
|
218
|
+
getCancelledMarkdown: (event: IStrategyTickResultCancelled) => Promise<string>;
|
|
219
|
+
getOpenedMarkdown: (event: IStrategyTickResultOpened) => Promise<string>;
|
|
220
|
+
getClosedMarkdown: (event: IStrategyTickResultClosed) => Promise<string>;
|
|
221
|
+
getRiskMarkdown: (event: RiskContract) => Promise<string>;
|
|
222
|
+
getAverageBuyMarkdown: (event: AverageBuyCommit) => Promise<string>;
|
|
223
|
+
getSignalOpenMarkdown: (event: SignalOpenContract) => Promise<string>;
|
|
224
|
+
getSignalCloseMarkdown: (event: SignalCloseContract) => Promise<string>;
|
|
225
|
+
getCancelScheduledMarkdown: (event: CancelScheduledCommit) => Promise<string>;
|
|
226
|
+
getClosePendingMarkdown: (event: ClosePendingCommit) => Promise<string>;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
declare class ModuleConnectionService {
|
|
230
|
+
readonly loggerService: LoggerService;
|
|
231
|
+
readonly resolveService: ResolveService;
|
|
232
|
+
readonly loaderService: LoaderService;
|
|
233
|
+
loadModule: (fileName: string) => Promise<boolean>;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
interface IBabel {
|
|
237
|
+
transpile(code: string): string;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
declare class BabelService implements IBabel {
|
|
241
|
+
readonly loggerService: LoggerService;
|
|
242
|
+
transpile: (code: string) => any;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
declare const cli: {
|
|
246
|
+
telegramTemplateService: TelegramTemplateService;
|
|
247
|
+
telegramWebService: TelegramWebService;
|
|
248
|
+
frontendProviderService: FrontendProviderService;
|
|
249
|
+
telegramProviderService: TelegramProviderService;
|
|
250
|
+
exchangeSchemaService: ExchangeSchemaService;
|
|
251
|
+
symbolSchemaService: SymbolSchemaService;
|
|
252
|
+
frameSchemaService: FrameSchemaService;
|
|
253
|
+
cacheLogicService: CacheLogicService;
|
|
254
|
+
telegramLogicService: TelegramLogicService;
|
|
255
|
+
backtestMainService: BacktestMainService;
|
|
256
|
+
walkerMainService: WalkerMainService;
|
|
257
|
+
paperMainService: PaperMainService;
|
|
258
|
+
liveMainService: LiveMainService;
|
|
259
|
+
moduleConnectionService: ModuleConnectionService;
|
|
260
|
+
errorService: ErrorService;
|
|
261
|
+
loggerService: LoggerService;
|
|
262
|
+
resolveService: ResolveService;
|
|
263
|
+
loaderService: LoaderService;
|
|
264
|
+
babelService: BabelService;
|
|
265
|
+
telegramApiService: TelegramApiService;
|
|
266
|
+
quickchartApiService: QuickchartApiService;
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
declare class SetupUtils {
|
|
270
|
+
enable: (() => void) & functools_kit.ISingleshotClearable;
|
|
271
|
+
clear: () => void;
|
|
272
|
+
}
|
|
273
|
+
declare const Setup: SetupUtils;
|
|
274
|
+
|
|
275
|
+
interface ILoader {
|
|
276
|
+
import(filePath: string): any;
|
|
277
|
+
check(filePath: string): boolean;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
declare enum ExchangeName {
|
|
281
|
+
DefaultExchange = "default_exchange"
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
declare enum FrameName {
|
|
285
|
+
DefaultFrame = "default_frame"
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
declare function setLogger(logger: ILogger): void;
|
|
289
|
+
|
|
290
|
+
type PayloadBacktest = Parameters<typeof cli.backtestMainService.run>[0];
|
|
291
|
+
type PayloadPaper = Parameters<typeof cli.paperMainService.run>[0];
|
|
292
|
+
type PayloadLive = Parameters<typeof cli.liveMainService.run>[0];
|
|
293
|
+
type Mode = "backtest" | "live" | "paper";
|
|
294
|
+
type Args = Partial<PayloadBacktest> | Partial<PayloadPaper> | Partial<PayloadLive>;
|
|
295
|
+
declare function run(mode: Mode, args: Args): Promise<void>;
|
|
296
|
+
|
|
297
|
+
export { ExchangeName, FrameName, type IBabel, type ILoader, type ILogger, Setup, cli, run, setLogger };
|