backtest-kit 1.5.8 → 1.5.10

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
@@ -11315,6 +11315,35 @@ class PartialGlobalService {
11315
11315
  * Handles actual ClientPartial instance creation and management.
11316
11316
  */
11317
11317
  this.partialConnectionService = inject(TYPES.partialConnectionService);
11318
+ /**
11319
+ * Strategy validation service for validating strategy existence.
11320
+ */
11321
+ this.strategyValidationService = inject(TYPES.strategyValidationService);
11322
+ /**
11323
+ * Strategy schema service for retrieving strategy configuration.
11324
+ */
11325
+ this.strategySchemaService = inject(TYPES.strategySchemaService);
11326
+ /**
11327
+ * Risk validation service for validating risk existence.
11328
+ */
11329
+ this.riskValidationService = inject(TYPES.riskValidationService);
11330
+ /**
11331
+ * Validates strategy and associated risk configuration.
11332
+ * Memoized to avoid redundant validations for the same strategy.
11333
+ *
11334
+ * @param strategyName - Name of the strategy to validate
11335
+ * @param methodName - Name of the calling method for error tracking
11336
+ */
11337
+ this.validate = functoolsKit.memoize(([strategyName]) => `${strategyName}`, (strategyName, methodName) => {
11338
+ this.loggerService.log("partialGlobalService validate", {
11339
+ strategyName,
11340
+ methodName,
11341
+ });
11342
+ this.strategyValidationService.validate(strategyName, methodName);
11343
+ const strategySchema = this.strategySchemaService.get(strategyName);
11344
+ const riskName = strategySchema.riskName;
11345
+ riskName && this.riskValidationService.validate(riskName, methodName);
11346
+ });
11318
11347
  /**
11319
11348
  * Processes profit state and emits events for newly reached profit levels.
11320
11349
  *
@@ -11337,6 +11366,7 @@ class PartialGlobalService {
11337
11366
  backtest,
11338
11367
  when,
11339
11368
  });
11369
+ this.validate(data.strategyName, "partialGlobalService profit");
11340
11370
  return await this.partialConnectionService.profit(symbol, data, currentPrice, revenuePercent, backtest, when);
11341
11371
  };
11342
11372
  /**
@@ -11361,6 +11391,7 @@ class PartialGlobalService {
11361
11391
  backtest,
11362
11392
  when,
11363
11393
  });
11394
+ this.validate(data.strategyName, "partialGlobalService loss");
11364
11395
  return await this.partialConnectionService.loss(symbol, data, currentPrice, lossPercent, backtest, when);
11365
11396
  };
11366
11397
  /**
@@ -11374,12 +11405,13 @@ class PartialGlobalService {
11374
11405
  * @returns Promise that resolves when clear is complete
11375
11406
  */
11376
11407
  this.clear = async (symbol, data, priceClose, backtest) => {
11377
- this.loggerService.log("partialGlobalService profit", {
11408
+ this.loggerService.log("partialGlobalService clear", {
11378
11409
  symbol,
11379
11410
  data,
11380
11411
  priceClose,
11381
11412
  backtest,
11382
11413
  });
11414
+ this.validate(data.strategyName, "partialGlobalService clear");
11383
11415
  return await this.partialConnectionService.clear(symbol, data, priceClose, backtest);
11384
11416
  };
11385
11417
  }
@@ -13738,10 +13770,12 @@ class BacktestUtils {
13738
13770
  * ```
13739
13771
  */
13740
13772
  this.background = (symbol, context) => {
13773
+ backtest$1.strategyValidationService.validate(context.strategyName, BACKTEST_METHOD_NAME_BACKGROUND);
13774
+ backtest$1.exchangeValidationService.validate(context.exchangeName, BACKTEST_METHOD_NAME_BACKGROUND);
13775
+ backtest$1.frameValidationService.validate(context.frameName, BACKTEST_METHOD_NAME_BACKGROUND);
13741
13776
  {
13742
- backtest$1.strategyValidationService.validate(context.strategyName, BACKTEST_METHOD_NAME_BACKGROUND);
13743
- backtest$1.exchangeValidationService.validate(context.exchangeName, BACKTEST_METHOD_NAME_BACKGROUND);
13744
- backtest$1.frameValidationService.validate(context.frameName, BACKTEST_METHOD_NAME_BACKGROUND);
13777
+ const { riskName } = backtest$1.strategySchemaService.get(context.strategyName);
13778
+ riskName && backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_BACKGROUND);
13745
13779
  }
13746
13780
  const instance = this._getInstance(symbol, context.strategyName);
13747
13781
  return instance.background(symbol, context);
@@ -13765,6 +13799,10 @@ class BacktestUtils {
13765
13799
  */
13766
13800
  this.stop = async (symbol, strategyName) => {
13767
13801
  backtest$1.strategyValidationService.validate(strategyName, BACKTEST_METHOD_NAME_STOP);
13802
+ {
13803
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
13804
+ riskName && backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_STOP);
13805
+ }
13768
13806
  const instance = this._getInstance(symbol, strategyName);
13769
13807
  return await instance.stop(symbol, strategyName);
13770
13808
  };
@@ -13783,6 +13821,10 @@ class BacktestUtils {
13783
13821
  */
13784
13822
  this.getData = async (symbol, strategyName) => {
13785
13823
  backtest$1.strategyValidationService.validate(strategyName, "BacktestUtils.getData");
13824
+ {
13825
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
13826
+ riskName && backtest$1.riskValidationService.validate(riskName, "BacktestUtils.getData");
13827
+ }
13786
13828
  const instance = this._getInstance(symbol, strategyName);
13787
13829
  return await instance.getData(symbol, strategyName);
13788
13830
  };
@@ -13801,6 +13843,10 @@ class BacktestUtils {
13801
13843
  */
13802
13844
  this.getReport = async (symbol, strategyName) => {
13803
13845
  backtest$1.strategyValidationService.validate(strategyName, BACKTEST_METHOD_NAME_GET_REPORT);
13846
+ {
13847
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
13848
+ riskName && backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_GET_REPORT);
13849
+ }
13804
13850
  const instance = this._getInstance(symbol, strategyName);
13805
13851
  return await instance.getReport(symbol, strategyName);
13806
13852
  };
@@ -13822,6 +13868,10 @@ class BacktestUtils {
13822
13868
  */
13823
13869
  this.dump = async (symbol, strategyName, path) => {
13824
13870
  backtest$1.strategyValidationService.validate(strategyName, BACKTEST_METHOD_NAME_DUMP);
13871
+ {
13872
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
13873
+ riskName && backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_DUMP);
13874
+ }
13825
13875
  const instance = this._getInstance(symbol, strategyName);
13826
13876
  return await instance.dump(symbol, strategyName, path);
13827
13877
  };
@@ -14223,6 +14273,10 @@ class LiveUtils {
14223
14273
  this.background = (symbol, context) => {
14224
14274
  backtest$1.strategyValidationService.validate(context.strategyName, LIVE_METHOD_NAME_BACKGROUND);
14225
14275
  backtest$1.exchangeValidationService.validate(context.exchangeName, LIVE_METHOD_NAME_BACKGROUND);
14276
+ {
14277
+ const { riskName } = backtest$1.strategySchemaService.get(context.strategyName);
14278
+ riskName && backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_BACKGROUND);
14279
+ }
14226
14280
  const instance = this._getInstance(symbol, context.strategyName);
14227
14281
  return instance.background(symbol, context);
14228
14282
  };
@@ -14245,6 +14299,10 @@ class LiveUtils {
14245
14299
  */
14246
14300
  this.stop = async (symbol, strategyName) => {
14247
14301
  backtest$1.strategyValidationService.validate(strategyName, LIVE_METHOD_NAME_STOP);
14302
+ {
14303
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
14304
+ riskName && backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_STOP);
14305
+ }
14248
14306
  const instance = this._getInstance(symbol, strategyName);
14249
14307
  return await instance.stop(symbol, strategyName);
14250
14308
  };
@@ -14263,6 +14321,10 @@ class LiveUtils {
14263
14321
  */
14264
14322
  this.getData = async (symbol, strategyName) => {
14265
14323
  backtest$1.strategyValidationService.validate(strategyName, "LiveUtils.getData");
14324
+ {
14325
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
14326
+ riskName && backtest$1.riskValidationService.validate(riskName, "LiveUtils.getData");
14327
+ }
14266
14328
  const instance = this._getInstance(symbol, strategyName);
14267
14329
  return await instance.getData(symbol, strategyName);
14268
14330
  };
@@ -14281,6 +14343,10 @@ class LiveUtils {
14281
14343
  */
14282
14344
  this.getReport = async (symbol, strategyName) => {
14283
14345
  backtest$1.strategyValidationService.validate(strategyName, LIVE_METHOD_NAME_GET_REPORT);
14346
+ {
14347
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
14348
+ riskName && backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_GET_REPORT);
14349
+ }
14284
14350
  const instance = this._getInstance(symbol, strategyName);
14285
14351
  return await instance.getReport(symbol, strategyName);
14286
14352
  };
@@ -14302,6 +14368,10 @@ class LiveUtils {
14302
14368
  */
14303
14369
  this.dump = async (symbol, strategyName, path) => {
14304
14370
  backtest$1.strategyValidationService.validate(strategyName, LIVE_METHOD_NAME_DUMP);
14371
+ {
14372
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
14373
+ riskName && backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_DUMP);
14374
+ }
14305
14375
  const instance = this._getInstance(symbol, strategyName);
14306
14376
  return await instance.dump(symbol, strategyName, path);
14307
14377
  };
@@ -14389,6 +14459,11 @@ class ScheduleUtils {
14389
14459
  symbol,
14390
14460
  strategyName,
14391
14461
  });
14462
+ backtest$1.strategyValidationService.validate(strategyName, SCHEDULE_METHOD_NAME_GET_DATA);
14463
+ {
14464
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
14465
+ riskName && backtest$1.riskValidationService.validate(riskName, SCHEDULE_METHOD_NAME_GET_DATA);
14466
+ }
14392
14467
  return await backtest$1.scheduleMarkdownService.getData(symbol, strategyName);
14393
14468
  };
14394
14469
  /**
@@ -14409,6 +14484,11 @@ class ScheduleUtils {
14409
14484
  symbol,
14410
14485
  strategyName,
14411
14486
  });
14487
+ backtest$1.strategyValidationService.validate(strategyName, SCHEDULE_METHOD_NAME_GET_REPORT);
14488
+ {
14489
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
14490
+ riskName && backtest$1.riskValidationService.validate(riskName, SCHEDULE_METHOD_NAME_GET_REPORT);
14491
+ }
14412
14492
  return await backtest$1.scheduleMarkdownService.getReport(symbol, strategyName);
14413
14493
  };
14414
14494
  /**
@@ -14433,6 +14513,11 @@ class ScheduleUtils {
14433
14513
  strategyName,
14434
14514
  path,
14435
14515
  });
14516
+ backtest$1.strategyValidationService.validate(strategyName, SCHEDULE_METHOD_NAME_DUMP);
14517
+ {
14518
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
14519
+ riskName && backtest$1.riskValidationService.validate(riskName, SCHEDULE_METHOD_NAME_DUMP);
14520
+ }
14436
14521
  await backtest$1.scheduleMarkdownService.dump(symbol, strategyName, path);
14437
14522
  };
14438
14523
  }
@@ -14512,6 +14597,11 @@ class Performance {
14512
14597
  * ```
14513
14598
  */
14514
14599
  static async getData(symbol, strategyName) {
14600
+ backtest$1.strategyValidationService.validate(strategyName, "Performance.getData");
14601
+ {
14602
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
14603
+ riskName && backtest$1.riskValidationService.validate(riskName, "Performance.getData");
14604
+ }
14515
14605
  return backtest$1.performanceMarkdownService.getData(symbol, strategyName);
14516
14606
  }
14517
14607
  /**
@@ -14537,6 +14627,11 @@ class Performance {
14537
14627
  * ```
14538
14628
  */
14539
14629
  static async getReport(symbol, strategyName) {
14630
+ backtest$1.strategyValidationService.validate(strategyName, "Performance.getReport");
14631
+ {
14632
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
14633
+ riskName && backtest$1.riskValidationService.validate(riskName, "Performance.getReport");
14634
+ }
14540
14635
  return backtest$1.performanceMarkdownService.getReport(symbol, strategyName);
14541
14636
  }
14542
14637
  /**
@@ -14559,6 +14654,11 @@ class Performance {
14559
14654
  * ```
14560
14655
  */
14561
14656
  static async dump(symbol, strategyName, path = "./dump/performance") {
14657
+ backtest$1.strategyValidationService.validate(strategyName, "Performance.dump");
14658
+ {
14659
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
14660
+ riskName && backtest$1.riskValidationService.validate(riskName, "Performance.dump");
14661
+ }
14562
14662
  return backtest$1.performanceMarkdownService.dump(symbol, strategyName, path);
14563
14663
  }
14564
14664
  }
@@ -14973,6 +15073,13 @@ class WalkerUtils {
14973
15073
  */
14974
15074
  this.stop = async (symbol, walkerName) => {
14975
15075
  backtest$1.walkerValidationService.validate(walkerName, WALKER_METHOD_NAME_STOP);
15076
+ const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
15077
+ for (const strategyName of walkerSchema.strategies) {
15078
+ backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_STOP);
15079
+ const strategySchema = backtest$1.strategySchemaService.get(strategyName);
15080
+ const riskName = strategySchema.riskName;
15081
+ riskName && backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_STOP);
15082
+ }
14976
15083
  const instance = this._getInstance(symbol, walkerName);
14977
15084
  return await instance.stop(symbol, walkerName);
14978
15085
  };
@@ -14991,6 +15098,13 @@ class WalkerUtils {
14991
15098
  */
14992
15099
  this.getData = async (symbol, walkerName) => {
14993
15100
  backtest$1.walkerValidationService.validate(walkerName, WALKER_METHOD_NAME_GET_DATA);
15101
+ const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
15102
+ for (const strategyName of walkerSchema.strategies) {
15103
+ backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_GET_DATA);
15104
+ const strategySchema = backtest$1.strategySchemaService.get(strategyName);
15105
+ const riskName = strategySchema.riskName;
15106
+ riskName && backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_GET_DATA);
15107
+ }
14994
15108
  const instance = this._getInstance(symbol, walkerName);
14995
15109
  return await instance.getData(symbol, walkerName);
14996
15110
  };
@@ -15009,6 +15123,13 @@ class WalkerUtils {
15009
15123
  */
15010
15124
  this.getReport = async (symbol, walkerName) => {
15011
15125
  backtest$1.walkerValidationService.validate(walkerName, WALKER_METHOD_NAME_GET_REPORT);
15126
+ const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
15127
+ for (const strategyName of walkerSchema.strategies) {
15128
+ backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_GET_REPORT);
15129
+ const strategySchema = backtest$1.strategySchemaService.get(strategyName);
15130
+ const riskName = strategySchema.riskName;
15131
+ riskName && backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_GET_REPORT);
15132
+ }
15012
15133
  const instance = this._getInstance(symbol, walkerName);
15013
15134
  return await instance.getReport(symbol, walkerName);
15014
15135
  };
@@ -15030,6 +15151,13 @@ class WalkerUtils {
15030
15151
  */
15031
15152
  this.dump = async (symbol, walkerName, path) => {
15032
15153
  backtest$1.walkerValidationService.validate(walkerName, WALKER_METHOD_NAME_DUMP);
15154
+ const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
15155
+ for (const strategyName of walkerSchema.strategies) {
15156
+ backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_DUMP);
15157
+ const strategySchema = backtest$1.strategySchemaService.get(strategyName);
15158
+ const riskName = strategySchema.riskName;
15159
+ riskName && backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_DUMP);
15160
+ }
15033
15161
  const instance = this._getInstance(symbol, walkerName);
15034
15162
  return await instance.dump(symbol, walkerName, path);
15035
15163
  };
@@ -15122,6 +15250,11 @@ class HeatUtils {
15122
15250
  */
15123
15251
  this.getData = async (strategyName) => {
15124
15252
  backtest$1.loggerService.info(HEAT_METHOD_NAME_GET_DATA, { strategyName });
15253
+ backtest$1.strategyValidationService.validate(strategyName, HEAT_METHOD_NAME_GET_DATA);
15254
+ {
15255
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
15256
+ riskName && backtest$1.riskValidationService.validate(riskName, HEAT_METHOD_NAME_GET_DATA);
15257
+ }
15125
15258
  return await backtest$1.heatMarkdownService.getData(strategyName);
15126
15259
  };
15127
15260
  /**
@@ -15151,6 +15284,11 @@ class HeatUtils {
15151
15284
  */
15152
15285
  this.getReport = async (strategyName) => {
15153
15286
  backtest$1.loggerService.info(HEAT_METHOD_NAME_GET_REPORT, { strategyName });
15287
+ backtest$1.strategyValidationService.validate(strategyName, HEAT_METHOD_NAME_GET_REPORT);
15288
+ {
15289
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
15290
+ riskName && backtest$1.riskValidationService.validate(riskName, HEAT_METHOD_NAME_GET_REPORT);
15291
+ }
15154
15292
  return await backtest$1.heatMarkdownService.getReport(strategyName);
15155
15293
  };
15156
15294
  /**
@@ -15173,6 +15311,11 @@ class HeatUtils {
15173
15311
  */
15174
15312
  this.dump = async (strategyName, path) => {
15175
15313
  backtest$1.loggerService.info(HEAT_METHOD_NAME_DUMP, { strategyName, path });
15314
+ backtest$1.strategyValidationService.validate(strategyName, HEAT_METHOD_NAME_DUMP);
15315
+ {
15316
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
15317
+ riskName && backtest$1.riskValidationService.validate(riskName, HEAT_METHOD_NAME_DUMP);
15318
+ }
15176
15319
  await backtest$1.heatMarkdownService.dump(strategyName, path);
15177
15320
  };
15178
15321
  }
@@ -15370,6 +15513,7 @@ class OptimizerUtils {
15370
15513
  symbol,
15371
15514
  context,
15372
15515
  });
15516
+ backtest$1.optimizerValidationService.validate(context.optimizerName, OPTIMIZER_METHOD_NAME_GET_DATA);
15373
15517
  return await backtest$1.optimizerGlobalService.getData(symbol, context.optimizerName);
15374
15518
  };
15375
15519
  /**
@@ -15386,6 +15530,7 @@ class OptimizerUtils {
15386
15530
  symbol,
15387
15531
  context,
15388
15532
  });
15533
+ backtest$1.optimizerValidationService.validate(context.optimizerName, OPTIMIZER_METHOD_NAME_GET_CODE);
15389
15534
  return await backtest$1.optimizerGlobalService.getCode(symbol, context.optimizerName);
15390
15535
  };
15391
15536
  /**
@@ -15405,6 +15550,7 @@ class OptimizerUtils {
15405
15550
  context,
15406
15551
  path,
15407
15552
  });
15553
+ backtest$1.optimizerValidationService.validate(context.optimizerName, OPTIMIZER_METHOD_NAME_DUMP);
15408
15554
  await backtest$1.optimizerGlobalService.dump(symbol, context.optimizerName, path);
15409
15555
  };
15410
15556
  }
@@ -15488,6 +15634,11 @@ class PartialUtils {
15488
15634
  */
15489
15635
  this.getData = async (symbol, strategyName) => {
15490
15636
  backtest$1.loggerService.info(PARTIAL_METHOD_NAME_GET_DATA, { symbol, strategyName });
15637
+ backtest$1.strategyValidationService.validate(strategyName, PARTIAL_METHOD_NAME_GET_DATA);
15638
+ {
15639
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
15640
+ riskName && backtest$1.riskValidationService.validate(riskName, PARTIAL_METHOD_NAME_GET_DATA);
15641
+ }
15491
15642
  return await backtest$1.partialMarkdownService.getData(symbol, strategyName);
15492
15643
  };
15493
15644
  /**
@@ -15530,6 +15681,11 @@ class PartialUtils {
15530
15681
  */
15531
15682
  this.getReport = async (symbol, strategyName) => {
15532
15683
  backtest$1.loggerService.info(PARTIAL_METHOD_NAME_GET_REPORT, { symbol, strategyName });
15684
+ backtest$1.strategyValidationService.validate(strategyName, PARTIAL_METHOD_NAME_GET_REPORT);
15685
+ {
15686
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
15687
+ riskName && backtest$1.riskValidationService.validate(riskName, PARTIAL_METHOD_NAME_GET_REPORT);
15688
+ }
15533
15689
  return await backtest$1.partialMarkdownService.getReport(symbol, strategyName);
15534
15690
  };
15535
15691
  /**
@@ -15565,6 +15721,11 @@ class PartialUtils {
15565
15721
  */
15566
15722
  this.dump = async (symbol, strategyName, path) => {
15567
15723
  backtest$1.loggerService.info(PARTIAL_METHOD_NAME_DUMP, { symbol, strategyName, path });
15724
+ backtest$1.strategyValidationService.validate(strategyName, PARTIAL_METHOD_NAME_DUMP);
15725
+ {
15726
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
15727
+ riskName && backtest$1.riskValidationService.validate(riskName, PARTIAL_METHOD_NAME_DUMP);
15728
+ }
15568
15729
  await backtest$1.partialMarkdownService.dump(symbol, strategyName, path);
15569
15730
  };
15570
15731
  }
package/build/index.mjs CHANGED
@@ -11313,6 +11313,35 @@ class PartialGlobalService {
11313
11313
  * Handles actual ClientPartial instance creation and management.
11314
11314
  */
11315
11315
  this.partialConnectionService = inject(TYPES.partialConnectionService);
11316
+ /**
11317
+ * Strategy validation service for validating strategy existence.
11318
+ */
11319
+ this.strategyValidationService = inject(TYPES.strategyValidationService);
11320
+ /**
11321
+ * Strategy schema service for retrieving strategy configuration.
11322
+ */
11323
+ this.strategySchemaService = inject(TYPES.strategySchemaService);
11324
+ /**
11325
+ * Risk validation service for validating risk existence.
11326
+ */
11327
+ this.riskValidationService = inject(TYPES.riskValidationService);
11328
+ /**
11329
+ * Validates strategy and associated risk configuration.
11330
+ * Memoized to avoid redundant validations for the same strategy.
11331
+ *
11332
+ * @param strategyName - Name of the strategy to validate
11333
+ * @param methodName - Name of the calling method for error tracking
11334
+ */
11335
+ this.validate = memoize(([strategyName]) => `${strategyName}`, (strategyName, methodName) => {
11336
+ this.loggerService.log("partialGlobalService validate", {
11337
+ strategyName,
11338
+ methodName,
11339
+ });
11340
+ this.strategyValidationService.validate(strategyName, methodName);
11341
+ const strategySchema = this.strategySchemaService.get(strategyName);
11342
+ const riskName = strategySchema.riskName;
11343
+ riskName && this.riskValidationService.validate(riskName, methodName);
11344
+ });
11316
11345
  /**
11317
11346
  * Processes profit state and emits events for newly reached profit levels.
11318
11347
  *
@@ -11335,6 +11364,7 @@ class PartialGlobalService {
11335
11364
  backtest,
11336
11365
  when,
11337
11366
  });
11367
+ this.validate(data.strategyName, "partialGlobalService profit");
11338
11368
  return await this.partialConnectionService.profit(symbol, data, currentPrice, revenuePercent, backtest, when);
11339
11369
  };
11340
11370
  /**
@@ -11359,6 +11389,7 @@ class PartialGlobalService {
11359
11389
  backtest,
11360
11390
  when,
11361
11391
  });
11392
+ this.validate(data.strategyName, "partialGlobalService loss");
11362
11393
  return await this.partialConnectionService.loss(symbol, data, currentPrice, lossPercent, backtest, when);
11363
11394
  };
11364
11395
  /**
@@ -11372,12 +11403,13 @@ class PartialGlobalService {
11372
11403
  * @returns Promise that resolves when clear is complete
11373
11404
  */
11374
11405
  this.clear = async (symbol, data, priceClose, backtest) => {
11375
- this.loggerService.log("partialGlobalService profit", {
11406
+ this.loggerService.log("partialGlobalService clear", {
11376
11407
  symbol,
11377
11408
  data,
11378
11409
  priceClose,
11379
11410
  backtest,
11380
11411
  });
11412
+ this.validate(data.strategyName, "partialGlobalService clear");
11381
11413
  return await this.partialConnectionService.clear(symbol, data, priceClose, backtest);
11382
11414
  };
11383
11415
  }
@@ -13736,10 +13768,12 @@ class BacktestUtils {
13736
13768
  * ```
13737
13769
  */
13738
13770
  this.background = (symbol, context) => {
13771
+ backtest$1.strategyValidationService.validate(context.strategyName, BACKTEST_METHOD_NAME_BACKGROUND);
13772
+ backtest$1.exchangeValidationService.validate(context.exchangeName, BACKTEST_METHOD_NAME_BACKGROUND);
13773
+ backtest$1.frameValidationService.validate(context.frameName, BACKTEST_METHOD_NAME_BACKGROUND);
13739
13774
  {
13740
- backtest$1.strategyValidationService.validate(context.strategyName, BACKTEST_METHOD_NAME_BACKGROUND);
13741
- backtest$1.exchangeValidationService.validate(context.exchangeName, BACKTEST_METHOD_NAME_BACKGROUND);
13742
- backtest$1.frameValidationService.validate(context.frameName, BACKTEST_METHOD_NAME_BACKGROUND);
13775
+ const { riskName } = backtest$1.strategySchemaService.get(context.strategyName);
13776
+ riskName && backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_BACKGROUND);
13743
13777
  }
13744
13778
  const instance = this._getInstance(symbol, context.strategyName);
13745
13779
  return instance.background(symbol, context);
@@ -13763,6 +13797,10 @@ class BacktestUtils {
13763
13797
  */
13764
13798
  this.stop = async (symbol, strategyName) => {
13765
13799
  backtest$1.strategyValidationService.validate(strategyName, BACKTEST_METHOD_NAME_STOP);
13800
+ {
13801
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
13802
+ riskName && backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_STOP);
13803
+ }
13766
13804
  const instance = this._getInstance(symbol, strategyName);
13767
13805
  return await instance.stop(symbol, strategyName);
13768
13806
  };
@@ -13781,6 +13819,10 @@ class BacktestUtils {
13781
13819
  */
13782
13820
  this.getData = async (symbol, strategyName) => {
13783
13821
  backtest$1.strategyValidationService.validate(strategyName, "BacktestUtils.getData");
13822
+ {
13823
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
13824
+ riskName && backtest$1.riskValidationService.validate(riskName, "BacktestUtils.getData");
13825
+ }
13784
13826
  const instance = this._getInstance(symbol, strategyName);
13785
13827
  return await instance.getData(symbol, strategyName);
13786
13828
  };
@@ -13799,6 +13841,10 @@ class BacktestUtils {
13799
13841
  */
13800
13842
  this.getReport = async (symbol, strategyName) => {
13801
13843
  backtest$1.strategyValidationService.validate(strategyName, BACKTEST_METHOD_NAME_GET_REPORT);
13844
+ {
13845
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
13846
+ riskName && backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_GET_REPORT);
13847
+ }
13802
13848
  const instance = this._getInstance(symbol, strategyName);
13803
13849
  return await instance.getReport(symbol, strategyName);
13804
13850
  };
@@ -13820,6 +13866,10 @@ class BacktestUtils {
13820
13866
  */
13821
13867
  this.dump = async (symbol, strategyName, path) => {
13822
13868
  backtest$1.strategyValidationService.validate(strategyName, BACKTEST_METHOD_NAME_DUMP);
13869
+ {
13870
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
13871
+ riskName && backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_DUMP);
13872
+ }
13823
13873
  const instance = this._getInstance(symbol, strategyName);
13824
13874
  return await instance.dump(symbol, strategyName, path);
13825
13875
  };
@@ -14221,6 +14271,10 @@ class LiveUtils {
14221
14271
  this.background = (symbol, context) => {
14222
14272
  backtest$1.strategyValidationService.validate(context.strategyName, LIVE_METHOD_NAME_BACKGROUND);
14223
14273
  backtest$1.exchangeValidationService.validate(context.exchangeName, LIVE_METHOD_NAME_BACKGROUND);
14274
+ {
14275
+ const { riskName } = backtest$1.strategySchemaService.get(context.strategyName);
14276
+ riskName && backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_BACKGROUND);
14277
+ }
14224
14278
  const instance = this._getInstance(symbol, context.strategyName);
14225
14279
  return instance.background(symbol, context);
14226
14280
  };
@@ -14243,6 +14297,10 @@ class LiveUtils {
14243
14297
  */
14244
14298
  this.stop = async (symbol, strategyName) => {
14245
14299
  backtest$1.strategyValidationService.validate(strategyName, LIVE_METHOD_NAME_STOP);
14300
+ {
14301
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
14302
+ riskName && backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_STOP);
14303
+ }
14246
14304
  const instance = this._getInstance(symbol, strategyName);
14247
14305
  return await instance.stop(symbol, strategyName);
14248
14306
  };
@@ -14261,6 +14319,10 @@ class LiveUtils {
14261
14319
  */
14262
14320
  this.getData = async (symbol, strategyName) => {
14263
14321
  backtest$1.strategyValidationService.validate(strategyName, "LiveUtils.getData");
14322
+ {
14323
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
14324
+ riskName && backtest$1.riskValidationService.validate(riskName, "LiveUtils.getData");
14325
+ }
14264
14326
  const instance = this._getInstance(symbol, strategyName);
14265
14327
  return await instance.getData(symbol, strategyName);
14266
14328
  };
@@ -14279,6 +14341,10 @@ class LiveUtils {
14279
14341
  */
14280
14342
  this.getReport = async (symbol, strategyName) => {
14281
14343
  backtest$1.strategyValidationService.validate(strategyName, LIVE_METHOD_NAME_GET_REPORT);
14344
+ {
14345
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
14346
+ riskName && backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_GET_REPORT);
14347
+ }
14282
14348
  const instance = this._getInstance(symbol, strategyName);
14283
14349
  return await instance.getReport(symbol, strategyName);
14284
14350
  };
@@ -14300,6 +14366,10 @@ class LiveUtils {
14300
14366
  */
14301
14367
  this.dump = async (symbol, strategyName, path) => {
14302
14368
  backtest$1.strategyValidationService.validate(strategyName, LIVE_METHOD_NAME_DUMP);
14369
+ {
14370
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
14371
+ riskName && backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_DUMP);
14372
+ }
14303
14373
  const instance = this._getInstance(symbol, strategyName);
14304
14374
  return await instance.dump(symbol, strategyName, path);
14305
14375
  };
@@ -14387,6 +14457,11 @@ class ScheduleUtils {
14387
14457
  symbol,
14388
14458
  strategyName,
14389
14459
  });
14460
+ backtest$1.strategyValidationService.validate(strategyName, SCHEDULE_METHOD_NAME_GET_DATA);
14461
+ {
14462
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
14463
+ riskName && backtest$1.riskValidationService.validate(riskName, SCHEDULE_METHOD_NAME_GET_DATA);
14464
+ }
14390
14465
  return await backtest$1.scheduleMarkdownService.getData(symbol, strategyName);
14391
14466
  };
14392
14467
  /**
@@ -14407,6 +14482,11 @@ class ScheduleUtils {
14407
14482
  symbol,
14408
14483
  strategyName,
14409
14484
  });
14485
+ backtest$1.strategyValidationService.validate(strategyName, SCHEDULE_METHOD_NAME_GET_REPORT);
14486
+ {
14487
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
14488
+ riskName && backtest$1.riskValidationService.validate(riskName, SCHEDULE_METHOD_NAME_GET_REPORT);
14489
+ }
14410
14490
  return await backtest$1.scheduleMarkdownService.getReport(symbol, strategyName);
14411
14491
  };
14412
14492
  /**
@@ -14431,6 +14511,11 @@ class ScheduleUtils {
14431
14511
  strategyName,
14432
14512
  path,
14433
14513
  });
14514
+ backtest$1.strategyValidationService.validate(strategyName, SCHEDULE_METHOD_NAME_DUMP);
14515
+ {
14516
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
14517
+ riskName && backtest$1.riskValidationService.validate(riskName, SCHEDULE_METHOD_NAME_DUMP);
14518
+ }
14434
14519
  await backtest$1.scheduleMarkdownService.dump(symbol, strategyName, path);
14435
14520
  };
14436
14521
  }
@@ -14510,6 +14595,11 @@ class Performance {
14510
14595
  * ```
14511
14596
  */
14512
14597
  static async getData(symbol, strategyName) {
14598
+ backtest$1.strategyValidationService.validate(strategyName, "Performance.getData");
14599
+ {
14600
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
14601
+ riskName && backtest$1.riskValidationService.validate(riskName, "Performance.getData");
14602
+ }
14513
14603
  return backtest$1.performanceMarkdownService.getData(symbol, strategyName);
14514
14604
  }
14515
14605
  /**
@@ -14535,6 +14625,11 @@ class Performance {
14535
14625
  * ```
14536
14626
  */
14537
14627
  static async getReport(symbol, strategyName) {
14628
+ backtest$1.strategyValidationService.validate(strategyName, "Performance.getReport");
14629
+ {
14630
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
14631
+ riskName && backtest$1.riskValidationService.validate(riskName, "Performance.getReport");
14632
+ }
14538
14633
  return backtest$1.performanceMarkdownService.getReport(symbol, strategyName);
14539
14634
  }
14540
14635
  /**
@@ -14557,6 +14652,11 @@ class Performance {
14557
14652
  * ```
14558
14653
  */
14559
14654
  static async dump(symbol, strategyName, path = "./dump/performance") {
14655
+ backtest$1.strategyValidationService.validate(strategyName, "Performance.dump");
14656
+ {
14657
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
14658
+ riskName && backtest$1.riskValidationService.validate(riskName, "Performance.dump");
14659
+ }
14560
14660
  return backtest$1.performanceMarkdownService.dump(symbol, strategyName, path);
14561
14661
  }
14562
14662
  }
@@ -14971,6 +15071,13 @@ class WalkerUtils {
14971
15071
  */
14972
15072
  this.stop = async (symbol, walkerName) => {
14973
15073
  backtest$1.walkerValidationService.validate(walkerName, WALKER_METHOD_NAME_STOP);
15074
+ const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
15075
+ for (const strategyName of walkerSchema.strategies) {
15076
+ backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_STOP);
15077
+ const strategySchema = backtest$1.strategySchemaService.get(strategyName);
15078
+ const riskName = strategySchema.riskName;
15079
+ riskName && backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_STOP);
15080
+ }
14974
15081
  const instance = this._getInstance(symbol, walkerName);
14975
15082
  return await instance.stop(symbol, walkerName);
14976
15083
  };
@@ -14989,6 +15096,13 @@ class WalkerUtils {
14989
15096
  */
14990
15097
  this.getData = async (symbol, walkerName) => {
14991
15098
  backtest$1.walkerValidationService.validate(walkerName, WALKER_METHOD_NAME_GET_DATA);
15099
+ const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
15100
+ for (const strategyName of walkerSchema.strategies) {
15101
+ backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_GET_DATA);
15102
+ const strategySchema = backtest$1.strategySchemaService.get(strategyName);
15103
+ const riskName = strategySchema.riskName;
15104
+ riskName && backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_GET_DATA);
15105
+ }
14992
15106
  const instance = this._getInstance(symbol, walkerName);
14993
15107
  return await instance.getData(symbol, walkerName);
14994
15108
  };
@@ -15007,6 +15121,13 @@ class WalkerUtils {
15007
15121
  */
15008
15122
  this.getReport = async (symbol, walkerName) => {
15009
15123
  backtest$1.walkerValidationService.validate(walkerName, WALKER_METHOD_NAME_GET_REPORT);
15124
+ const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
15125
+ for (const strategyName of walkerSchema.strategies) {
15126
+ backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_GET_REPORT);
15127
+ const strategySchema = backtest$1.strategySchemaService.get(strategyName);
15128
+ const riskName = strategySchema.riskName;
15129
+ riskName && backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_GET_REPORT);
15130
+ }
15010
15131
  const instance = this._getInstance(symbol, walkerName);
15011
15132
  return await instance.getReport(symbol, walkerName);
15012
15133
  };
@@ -15028,6 +15149,13 @@ class WalkerUtils {
15028
15149
  */
15029
15150
  this.dump = async (symbol, walkerName, path) => {
15030
15151
  backtest$1.walkerValidationService.validate(walkerName, WALKER_METHOD_NAME_DUMP);
15152
+ const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
15153
+ for (const strategyName of walkerSchema.strategies) {
15154
+ backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_DUMP);
15155
+ const strategySchema = backtest$1.strategySchemaService.get(strategyName);
15156
+ const riskName = strategySchema.riskName;
15157
+ riskName && backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_DUMP);
15158
+ }
15031
15159
  const instance = this._getInstance(symbol, walkerName);
15032
15160
  return await instance.dump(symbol, walkerName, path);
15033
15161
  };
@@ -15120,6 +15248,11 @@ class HeatUtils {
15120
15248
  */
15121
15249
  this.getData = async (strategyName) => {
15122
15250
  backtest$1.loggerService.info(HEAT_METHOD_NAME_GET_DATA, { strategyName });
15251
+ backtest$1.strategyValidationService.validate(strategyName, HEAT_METHOD_NAME_GET_DATA);
15252
+ {
15253
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
15254
+ riskName && backtest$1.riskValidationService.validate(riskName, HEAT_METHOD_NAME_GET_DATA);
15255
+ }
15123
15256
  return await backtest$1.heatMarkdownService.getData(strategyName);
15124
15257
  };
15125
15258
  /**
@@ -15149,6 +15282,11 @@ class HeatUtils {
15149
15282
  */
15150
15283
  this.getReport = async (strategyName) => {
15151
15284
  backtest$1.loggerService.info(HEAT_METHOD_NAME_GET_REPORT, { strategyName });
15285
+ backtest$1.strategyValidationService.validate(strategyName, HEAT_METHOD_NAME_GET_REPORT);
15286
+ {
15287
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
15288
+ riskName && backtest$1.riskValidationService.validate(riskName, HEAT_METHOD_NAME_GET_REPORT);
15289
+ }
15152
15290
  return await backtest$1.heatMarkdownService.getReport(strategyName);
15153
15291
  };
15154
15292
  /**
@@ -15171,6 +15309,11 @@ class HeatUtils {
15171
15309
  */
15172
15310
  this.dump = async (strategyName, path) => {
15173
15311
  backtest$1.loggerService.info(HEAT_METHOD_NAME_DUMP, { strategyName, path });
15312
+ backtest$1.strategyValidationService.validate(strategyName, HEAT_METHOD_NAME_DUMP);
15313
+ {
15314
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
15315
+ riskName && backtest$1.riskValidationService.validate(riskName, HEAT_METHOD_NAME_DUMP);
15316
+ }
15174
15317
  await backtest$1.heatMarkdownService.dump(strategyName, path);
15175
15318
  };
15176
15319
  }
@@ -15368,6 +15511,7 @@ class OptimizerUtils {
15368
15511
  symbol,
15369
15512
  context,
15370
15513
  });
15514
+ backtest$1.optimizerValidationService.validate(context.optimizerName, OPTIMIZER_METHOD_NAME_GET_DATA);
15371
15515
  return await backtest$1.optimizerGlobalService.getData(symbol, context.optimizerName);
15372
15516
  };
15373
15517
  /**
@@ -15384,6 +15528,7 @@ class OptimizerUtils {
15384
15528
  symbol,
15385
15529
  context,
15386
15530
  });
15531
+ backtest$1.optimizerValidationService.validate(context.optimizerName, OPTIMIZER_METHOD_NAME_GET_CODE);
15387
15532
  return await backtest$1.optimizerGlobalService.getCode(symbol, context.optimizerName);
15388
15533
  };
15389
15534
  /**
@@ -15403,6 +15548,7 @@ class OptimizerUtils {
15403
15548
  context,
15404
15549
  path,
15405
15550
  });
15551
+ backtest$1.optimizerValidationService.validate(context.optimizerName, OPTIMIZER_METHOD_NAME_DUMP);
15406
15552
  await backtest$1.optimizerGlobalService.dump(symbol, context.optimizerName, path);
15407
15553
  };
15408
15554
  }
@@ -15486,6 +15632,11 @@ class PartialUtils {
15486
15632
  */
15487
15633
  this.getData = async (symbol, strategyName) => {
15488
15634
  backtest$1.loggerService.info(PARTIAL_METHOD_NAME_GET_DATA, { symbol, strategyName });
15635
+ backtest$1.strategyValidationService.validate(strategyName, PARTIAL_METHOD_NAME_GET_DATA);
15636
+ {
15637
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
15638
+ riskName && backtest$1.riskValidationService.validate(riskName, PARTIAL_METHOD_NAME_GET_DATA);
15639
+ }
15489
15640
  return await backtest$1.partialMarkdownService.getData(symbol, strategyName);
15490
15641
  };
15491
15642
  /**
@@ -15528,6 +15679,11 @@ class PartialUtils {
15528
15679
  */
15529
15680
  this.getReport = async (symbol, strategyName) => {
15530
15681
  backtest$1.loggerService.info(PARTIAL_METHOD_NAME_GET_REPORT, { symbol, strategyName });
15682
+ backtest$1.strategyValidationService.validate(strategyName, PARTIAL_METHOD_NAME_GET_REPORT);
15683
+ {
15684
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
15685
+ riskName && backtest$1.riskValidationService.validate(riskName, PARTIAL_METHOD_NAME_GET_REPORT);
15686
+ }
15531
15687
  return await backtest$1.partialMarkdownService.getReport(symbol, strategyName);
15532
15688
  };
15533
15689
  /**
@@ -15563,6 +15719,11 @@ class PartialUtils {
15563
15719
  */
15564
15720
  this.dump = async (symbol, strategyName, path) => {
15565
15721
  backtest$1.loggerService.info(PARTIAL_METHOD_NAME_DUMP, { symbol, strategyName, path });
15722
+ backtest$1.strategyValidationService.validate(strategyName, PARTIAL_METHOD_NAME_DUMP);
15723
+ {
15724
+ const { riskName } = backtest$1.strategySchemaService.get(strategyName);
15725
+ riskName && backtest$1.riskValidationService.validate(riskName, PARTIAL_METHOD_NAME_DUMP);
15726
+ }
15566
15727
  await backtest$1.partialMarkdownService.dump(symbol, strategyName, path);
15567
15728
  };
15568
15729
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "backtest-kit",
3
- "version": "1.5.8",
3
+ "version": "1.5.10",
4
4
  "description": "A TypeScript library for trading system backtest",
5
5
  "author": {
6
6
  "name": "Petr Tripolsky",
package/types.d.ts CHANGED
@@ -8907,6 +8907,26 @@ declare class PartialGlobalService {
8907
8907
  * Handles actual ClientPartial instance creation and management.
8908
8908
  */
8909
8909
  private readonly partialConnectionService;
8910
+ /**
8911
+ * Strategy validation service for validating strategy existence.
8912
+ */
8913
+ private readonly strategyValidationService;
8914
+ /**
8915
+ * Strategy schema service for retrieving strategy configuration.
8916
+ */
8917
+ private readonly strategySchemaService;
8918
+ /**
8919
+ * Risk validation service for validating risk existence.
8920
+ */
8921
+ private readonly riskValidationService;
8922
+ /**
8923
+ * Validates strategy and associated risk configuration.
8924
+ * Memoized to avoid redundant validations for the same strategy.
8925
+ *
8926
+ * @param strategyName - Name of the strategy to validate
8927
+ * @param methodName - Name of the calling method for error tracking
8928
+ */
8929
+ private validate;
8910
8930
  /**
8911
8931
  * Processes profit state and emits events for newly reached profit levels.
8912
8932
  *