backtest-kit 6.1.0 → 6.2.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
@@ -19398,6 +19398,22 @@ const walker_strategy_columns = [
19398
19398
  : "N/A",
19399
19399
  isVisible: () => true,
19400
19400
  },
19401
+ {
19402
+ key: "firstEventTime",
19403
+ label: "First Event",
19404
+ format: (data) => data.firstEventTime !== null
19405
+ ? new Date(data.firstEventTime).toISOString()
19406
+ : "N/A",
19407
+ isVisible: () => true,
19408
+ },
19409
+ {
19410
+ key: "lastEventTime",
19411
+ label: "Last Event",
19412
+ format: (data) => data.lastEventTime !== null
19413
+ ? new Date(data.lastEventTime).toISOString()
19414
+ : "N/A",
19415
+ isVisible: () => true,
19416
+ },
19401
19417
  ];
19402
19418
  /**
19403
19419
  * Column configuration for walker PNL table in markdown reports.
@@ -22206,10 +22222,19 @@ let ReportStorage$6 = class ReportStorage {
22206
22222
  if (data.strategyName === data.bestStrategy) {
22207
22223
  this._bestStats = data.stats;
22208
22224
  }
22225
+ const signals = data.stats.signalList;
22226
+ const firstEventTime = signals.length > 0
22227
+ ? signals.reduce((acc, s) => s.signal.pendingAt < acc ? s.signal.pendingAt : acc, signals[0].signal.pendingAt)
22228
+ : null;
22229
+ const lastEventTime = signals.length > 0
22230
+ ? signals.reduce((acc, s) => s.closeTimestamp > acc ? s.closeTimestamp : acc, signals[0].closeTimestamp)
22231
+ : null;
22209
22232
  this._strategyResults.unshift({
22210
22233
  strategyName: data.strategyName,
22211
22234
  stats: data.stats,
22212
22235
  metricValue: isUnsafe$1(data.metricValue) ? null : data.metricValue,
22236
+ firstEventTime,
22237
+ lastEventTime,
22213
22238
  });
22214
22239
  }
22215
22240
  /**
@@ -28052,6 +28077,13 @@ class WalkerReportService {
28052
28077
  */
28053
28078
  this.tick = async (data) => {
28054
28079
  this.loggerService.log(WALKER_REPORT_METHOD_NAME_TICK, { data });
28080
+ const signals = data.stats.signalList;
28081
+ const firstEventTime = signals.length > 0
28082
+ ? signals.reduce((acc, s) => s.signal.pendingAt < acc ? s.signal.pendingAt : acc, signals[0].signal.pendingAt)
28083
+ : null;
28084
+ const lastEventTime = signals.length > 0
28085
+ ? signals.reduce((acc, s) => s.closeTimestamp > acc ? s.closeTimestamp : acc, signals[0].closeTimestamp)
28086
+ : null;
28055
28087
  await Report.writeData("walker", {
28056
28088
  timestamp: getContextTimestamp(),
28057
28089
  walkerName: data.walkerName,
@@ -28076,6 +28108,8 @@ class WalkerReportService {
28076
28108
  annualizedSharpeRatio: data.stats.annualizedSharpeRatio,
28077
28109
  certaintyRatio: data.stats.certaintyRatio,
28078
28110
  expectedYearlyReturns: data.stats.expectedYearlyReturns,
28111
+ firstEventTime,
28112
+ lastEventTime,
28079
28113
  }, {
28080
28114
  symbol: data.symbol,
28081
28115
  strategyName: data.strategyName,
package/build/index.mjs CHANGED
@@ -19378,6 +19378,22 @@ const walker_strategy_columns = [
19378
19378
  : "N/A",
19379
19379
  isVisible: () => true,
19380
19380
  },
19381
+ {
19382
+ key: "firstEventTime",
19383
+ label: "First Event",
19384
+ format: (data) => data.firstEventTime !== null
19385
+ ? new Date(data.firstEventTime).toISOString()
19386
+ : "N/A",
19387
+ isVisible: () => true,
19388
+ },
19389
+ {
19390
+ key: "lastEventTime",
19391
+ label: "Last Event",
19392
+ format: (data) => data.lastEventTime !== null
19393
+ ? new Date(data.lastEventTime).toISOString()
19394
+ : "N/A",
19395
+ isVisible: () => true,
19396
+ },
19381
19397
  ];
19382
19398
  /**
19383
19399
  * Column configuration for walker PNL table in markdown reports.
@@ -22186,10 +22202,19 @@ let ReportStorage$6 = class ReportStorage {
22186
22202
  if (data.strategyName === data.bestStrategy) {
22187
22203
  this._bestStats = data.stats;
22188
22204
  }
22205
+ const signals = data.stats.signalList;
22206
+ const firstEventTime = signals.length > 0
22207
+ ? signals.reduce((acc, s) => s.signal.pendingAt < acc ? s.signal.pendingAt : acc, signals[0].signal.pendingAt)
22208
+ : null;
22209
+ const lastEventTime = signals.length > 0
22210
+ ? signals.reduce((acc, s) => s.closeTimestamp > acc ? s.closeTimestamp : acc, signals[0].closeTimestamp)
22211
+ : null;
22189
22212
  this._strategyResults.unshift({
22190
22213
  strategyName: data.strategyName,
22191
22214
  stats: data.stats,
22192
22215
  metricValue: isUnsafe$1(data.metricValue) ? null : data.metricValue,
22216
+ firstEventTime,
22217
+ lastEventTime,
22193
22218
  });
22194
22219
  }
22195
22220
  /**
@@ -28032,6 +28057,13 @@ class WalkerReportService {
28032
28057
  */
28033
28058
  this.tick = async (data) => {
28034
28059
  this.loggerService.log(WALKER_REPORT_METHOD_NAME_TICK, { data });
28060
+ const signals = data.stats.signalList;
28061
+ const firstEventTime = signals.length > 0
28062
+ ? signals.reduce((acc, s) => s.signal.pendingAt < acc ? s.signal.pendingAt : acc, signals[0].signal.pendingAt)
28063
+ : null;
28064
+ const lastEventTime = signals.length > 0
28065
+ ? signals.reduce((acc, s) => s.closeTimestamp > acc ? s.closeTimestamp : acc, signals[0].closeTimestamp)
28066
+ : null;
28035
28067
  await Report.writeData("walker", {
28036
28068
  timestamp: getContextTimestamp(),
28037
28069
  walkerName: data.walkerName,
@@ -28056,6 +28088,8 @@ class WalkerReportService {
28056
28088
  annualizedSharpeRatio: data.stats.annualizedSharpeRatio,
28057
28089
  certaintyRatio: data.stats.certaintyRatio,
28058
28090
  expectedYearlyReturns: data.stats.expectedYearlyReturns,
28091
+ firstEventTime,
28092
+ lastEventTime,
28059
28093
  }, {
28060
28094
  symbol: data.symbol,
28061
28095
  strategyName: data.strategyName,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "backtest-kit",
3
- "version": "6.1.0",
3
+ "version": "6.2.0",
4
4
  "description": "A TypeScript library for trading system backtest",
5
5
  "author": {
6
6
  "name": "Petr Tripolsky",
package/types.d.ts CHANGED
@@ -10311,6 +10311,10 @@ interface IStrategyResult {
10311
10311
  stats: BacktestStatisticsModel;
10312
10312
  /** Value of the optimization metric (null if invalid) */
10313
10313
  metricValue: number | null;
10314
+ /** Timestamp of the first signal event (pendingAt of earliest signal), null if no signals */
10315
+ firstEventTime: number | null;
10316
+ /** Timestamp of the last signal event (closeTimestamp of latest signal), null if no signals */
10317
+ lastEventTime: number | null;
10314
10318
  }
10315
10319
  /**
10316
10320
  * Alias for walker statistics result interface.