@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 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
- payload.verbose && console.time("Walker");
921
- await awaiter;
922
- payload.verbose && console.timeEnd("Walker");
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=${path} __filename=\`${__filename}\` __dirname=\`${__dirname}\``);
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.2.0"}\n`);
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.2.0"}\n\n`);
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.2.0"}\n`);
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 { Storage, Notification, Markdown, Report, Dump, Memory, StorageLive, StorageBacktest, NotificationLive, NotificationBacktest, setConfig, 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, Exchange } from 'backtest-kit';
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
- payload.verbose && console.time("Walker");
896
- await awaiter;
897
- payload.verbose && console.timeEnd("Walker");
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=${path} __filename=\`${__filename}\` __dirname=\`${__dirname}\``);
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.2.0"}\n`);
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.2.0"}\n\n`);
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.2.0"}\n`);
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.2.0",
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.2.0",
65
- "@backtest-kit/graph": "6.2.0",
66
- "@backtest-kit/ollama": "6.2.0",
67
- "@backtest-kit/pinets": "6.2.0",
68
- "@backtest-kit/signals": "6.2.0",
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.2.0",
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.2.0",
92
- "@backtest-kit/graph": "^6.2.0",
93
- "@backtest-kit/ollama": "^6.2.0",
94
- "@backtest-kit/pinets": "^6.2.0",
95
- "@backtest-kit/signals": "^6.2.0",
96
- "backtest-kit": "^6.2.0",
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
- ## 🚶 Walker — A/B Strategy Comparison (`--walker`)
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
 
@@ -12,7 +12,7 @@
12
12
  "license": "ISC",
13
13
  "type": "commonjs",
14
14
  "dependencies": {
15
- "@backtest-kit/cli": "^6.2.0",
15
+ "@backtest-kit/cli": "^6.2.1",
16
16
  "@backtest-kit/graph": "^6.2.0",
17
17
  "@backtest-kit/pinets": "^6.2.0",
18
18
  "@backtest-kit/ui": "^6.2.0",
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
- interface ILoader {
270
- import(filePath: string): any;
271
- check(filePath: string): boolean;
272
- }
273
-
274
- declare enum ExchangeName {
275
- DefaultExchange = "default_exchange"
276
- }
277
-
278
- declare enum FrameName {
279
- DefaultFrame = "default_frame"
280
- }
281
-
282
- declare function setLogger(logger: ILogger): void;
283
-
284
- type PayloadBacktest = Parameters<typeof cli.backtestMainService.run>[0];
285
- type PayloadPaper = Parameters<typeof cli.paperMainService.run>[0];
286
- type PayloadLive = Parameters<typeof cli.liveMainService.run>[0];
287
- type Mode = "backtest" | "live" | "paper";
288
- type Args = Partial<PayloadBacktest> | Partial<PayloadPaper> | Partial<PayloadLive>;
289
- declare function run(mode: Mode, args: Args): Promise<void>;
290
-
291
- export { ExchangeName, FrameName, type IBabel, type ILoader, type ILogger, cli, run, setLogger };
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 };