backtest-kit 1.5.20 → 1.5.22

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.mjs CHANGED
@@ -3247,11 +3247,321 @@ class ClientStrategy {
3247
3247
  }
3248
3248
  }
3249
3249
 
3250
+ const RISK_METHOD_NAME_GET_DATA = "RiskUtils.getData";
3251
+ const RISK_METHOD_NAME_GET_REPORT = "RiskUtils.getReport";
3252
+ const RISK_METHOD_NAME_DUMP = "RiskUtils.dump";
3253
+ /**
3254
+ * Composite risk management class that combines multiple risk profiles.
3255
+ *
3256
+ * Implements the Composite pattern to merge multiple IRisk instances into a single
3257
+ * risk checker. All risk checks must pass (logical AND) for a signal to be allowed.
3258
+ *
3259
+ * Features:
3260
+ * - Combines multiple risk profiles into one
3261
+ * - Signal is allowed only if ALL risks approve (checkSignal returns true for all)
3262
+ * - Propagates addSignal/removeSignal to all child risks
3263
+ * - Used internally when strategy has both riskName and riskList
3264
+ *
3265
+ * @example
3266
+ * ```typescript
3267
+ * import { MergeRisk } from "./classes/Risk";
3268
+ *
3269
+ * // Combine multiple risk profiles
3270
+ * const maxPositionsRisk = new MaxPositionsRisk(3);
3271
+ * const correlationRisk = new CorrelationRisk(0.7);
3272
+ * const mergedRisk = new MergeRisk([maxPositionsRisk, correlationRisk]);
3273
+ *
3274
+ * // Check if signal passes all risks
3275
+ * const canTrade = await mergedRisk.checkSignal({
3276
+ * symbol: "BTCUSDT",
3277
+ * strategyName: "my-strategy",
3278
+ * position: PositionEnum.LONG,
3279
+ * exchangeName: "binance"
3280
+ * });
3281
+ *
3282
+ * // If canTrade is true, all risks approved
3283
+ * // If false, at least one risk rejected the signal
3284
+ * ```
3285
+ */
3286
+ class MergeRisk {
3287
+ /**
3288
+ * Creates a merged risk profile from multiple risk instances.
3289
+ *
3290
+ * @param _riskList - Array of IRisk instances to combine
3291
+ */
3292
+ constructor(_riskList) {
3293
+ this._riskList = _riskList;
3294
+ }
3295
+ /**
3296
+ * Checks if signal passes all combined risk profiles.
3297
+ *
3298
+ * Executes checkSignal on all child risks in parallel and returns true only
3299
+ * if ALL risks approve the signal (logical AND operation).
3300
+ *
3301
+ * @param params - Risk check parameters (symbol, strategy, position, exchange)
3302
+ * @returns Promise resolving to true if all risks approve, false if any risk rejects
3303
+ */
3304
+ async checkSignal(params) {
3305
+ backtest$1.loggerService.info("MergeRisk checkSignal", {
3306
+ params,
3307
+ });
3308
+ const riskCheck = await Promise.all(this._riskList.map(async (risk) => await risk.checkSignal(params)));
3309
+ return riskCheck.every((isSafe) => isSafe);
3310
+ }
3311
+ /**
3312
+ * Registers a signal with all child risk profiles.
3313
+ *
3314
+ * Propagates the addSignal call to all child risks in parallel.
3315
+ * Used to track active positions across all risk management systems.
3316
+ *
3317
+ * @param symbol - Trading pair symbol
3318
+ * @param context - Context with strategyName and riskName
3319
+ * @returns Promise that resolves when all risks have registered the signal
3320
+ */
3321
+ async addSignal(symbol, context) {
3322
+ backtest$1.loggerService.info("MergeRisk addSignal", {
3323
+ symbol,
3324
+ context,
3325
+ });
3326
+ await Promise.all(this._riskList.map(async (risk) => await risk.addSignal(symbol, context)));
3327
+ }
3328
+ /**
3329
+ * Removes a signal from all child risk profiles.
3330
+ *
3331
+ * Propagates the removeSignal call to all child risks in parallel.
3332
+ * Used to update risk state when a position closes.
3333
+ *
3334
+ * @param symbol - Trading pair symbol
3335
+ * @param context - Context with strategyName and riskName
3336
+ * @returns Promise that resolves when all risks have removed the signal
3337
+ */
3338
+ async removeSignal(symbol, context) {
3339
+ backtest$1.loggerService.info("MergeRisk removeSignal", {
3340
+ symbol,
3341
+ context,
3342
+ });
3343
+ await Promise.all(this._riskList.map(async (risk) => await risk.removeSignal(symbol, context)));
3344
+ }
3345
+ }
3346
+ /**
3347
+ * Utility class for accessing risk rejection reports and statistics.
3348
+ *
3349
+ * Provides static-like methods (via singleton instance) to retrieve data
3350
+ * accumulated by RiskMarkdownService from risk rejection events.
3351
+ *
3352
+ * Features:
3353
+ * - Statistical data extraction (total rejections count, by symbol, by strategy)
3354
+ * - Markdown report generation with event tables
3355
+ * - File export to disk
3356
+ *
3357
+ * Data source:
3358
+ * - RiskMarkdownService listens to riskSubject
3359
+ * - Accumulates rejection events in ReportStorage (max 250 events per symbol-strategy pair)
3360
+ * - Events include: timestamp, symbol, strategyName, position, exchangeName, price, activePositionCount, comment
3361
+ *
3362
+ * @example
3363
+ * ```typescript
3364
+ * import { Risk } from "./classes/Risk";
3365
+ *
3366
+ * // Get statistical data for BTCUSDT:my-strategy
3367
+ * const stats = await Risk.getData("BTCUSDT", "my-strategy");
3368
+ * console.log(`Total rejections: ${stats.totalRejections}`);
3369
+ * console.log(`By symbol:`, stats.bySymbol);
3370
+ * console.log(`By strategy:`, stats.byStrategy);
3371
+ *
3372
+ * // Generate markdown report
3373
+ * const markdown = await Risk.getReport("BTCUSDT", "my-strategy");
3374
+ * console.log(markdown); // Formatted table with all rejection events
3375
+ *
3376
+ * // Export report to file
3377
+ * await Risk.dump("BTCUSDT", "my-strategy"); // Saves to ./dump/risk/BTCUSDT_my-strategy.md
3378
+ * await Risk.dump("BTCUSDT", "my-strategy", "./custom/path"); // Custom directory
3379
+ * ```
3380
+ */
3381
+ class RiskUtils {
3382
+ constructor() {
3383
+ /**
3384
+ * Retrieves statistical data from accumulated risk rejection events.
3385
+ *
3386
+ * Delegates to RiskMarkdownService.getData() which reads from ReportStorage.
3387
+ * Returns aggregated metrics calculated from all rejection events.
3388
+ *
3389
+ * @param symbol - Trading pair symbol (e.g., "BTCUSDT")
3390
+ * @param strategyName - Strategy name (e.g., "my-strategy")
3391
+ * @returns Promise resolving to RiskStatistics object with counts and event list
3392
+ *
3393
+ * @example
3394
+ * ```typescript
3395
+ * const stats = await Risk.getData("BTCUSDT", "my-strategy");
3396
+ *
3397
+ * console.log(`Total rejections: ${stats.totalRejections}`);
3398
+ * console.log(`Rejections by symbol:`, stats.bySymbol);
3399
+ * console.log(`Rejections by strategy:`, stats.byStrategy);
3400
+ *
3401
+ * // Iterate through all rejection events
3402
+ * for (const event of stats.eventList) {
3403
+ * console.log(`REJECTED: ${event.symbol} - ${event.comment} (${event.activePositionCount} active)`);
3404
+ * }
3405
+ * ```
3406
+ */
3407
+ this.getData = async (symbol, strategyName) => {
3408
+ backtest$1.loggerService.info(RISK_METHOD_NAME_GET_DATA, {
3409
+ symbol,
3410
+ strategyName,
3411
+ });
3412
+ backtest$1.strategyValidationService.validate(strategyName, RISK_METHOD_NAME_GET_DATA);
3413
+ {
3414
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
3415
+ riskName &&
3416
+ backtest$1.riskValidationService.validate(riskName, RISK_METHOD_NAME_GET_DATA);
3417
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, RISK_METHOD_NAME_GET_DATA));
3418
+ }
3419
+ return await backtest$1.riskMarkdownService.getData(symbol, strategyName);
3420
+ };
3421
+ /**
3422
+ * Generates markdown report with all risk rejection events for a symbol-strategy pair.
3423
+ *
3424
+ * Creates formatted table containing:
3425
+ * - Symbol
3426
+ * - Strategy
3427
+ * - Position (LONG/SHORT)
3428
+ * - Exchange
3429
+ * - Price
3430
+ * - Active Positions (at rejection time)
3431
+ * - Reason (from validation note)
3432
+ * - Timestamp (ISO 8601)
3433
+ *
3434
+ * Also includes summary statistics at the end (total rejections, by symbol, by strategy).
3435
+ *
3436
+ * @param symbol - Trading pair symbol (e.g., "BTCUSDT")
3437
+ * @param strategyName - Strategy name (e.g., "my-strategy")
3438
+ * @returns Promise resolving to markdown formatted report string
3439
+ *
3440
+ * @example
3441
+ * ```typescript
3442
+ * const markdown = await Risk.getReport("BTCUSDT", "my-strategy");
3443
+ * console.log(markdown);
3444
+ *
3445
+ * // Output:
3446
+ * // # Risk Rejection Report: BTCUSDT:my-strategy
3447
+ * //
3448
+ * // | Symbol | Strategy | Position | Exchange | Price | Active Positions | Reason | Timestamp |
3449
+ * // | --- | --- | --- | --- | --- | --- | --- | --- |
3450
+ * // | BTCUSDT | my-strategy | LONG | binance | 50000.00000000 USD | 3 | Max 3 positions allowed | 2024-01-15T10:30:00.000Z |
3451
+ * //
3452
+ * // **Total rejections:** 1
3453
+ * //
3454
+ * // ## Rejections by Symbol
3455
+ * // - BTCUSDT: 1
3456
+ * //
3457
+ * // ## Rejections by Strategy
3458
+ * // - my-strategy: 1
3459
+ * ```
3460
+ */
3461
+ this.getReport = async (symbol, strategyName) => {
3462
+ backtest$1.loggerService.info(RISK_METHOD_NAME_GET_REPORT, {
3463
+ symbol,
3464
+ strategyName,
3465
+ });
3466
+ backtest$1.strategyValidationService.validate(strategyName, RISK_METHOD_NAME_GET_REPORT);
3467
+ {
3468
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
3469
+ riskName &&
3470
+ backtest$1.riskValidationService.validate(riskName, RISK_METHOD_NAME_GET_REPORT);
3471
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, RISK_METHOD_NAME_GET_REPORT));
3472
+ }
3473
+ return await backtest$1.riskMarkdownService.getReport(symbol, strategyName);
3474
+ };
3475
+ /**
3476
+ * Generates and saves markdown report to file.
3477
+ *
3478
+ * Creates directory if it doesn't exist.
3479
+ * Filename format: {symbol}_{strategyName}.md (e.g., "BTCUSDT_my-strategy.md")
3480
+ *
3481
+ * Delegates to RiskMarkdownService.dump() which:
3482
+ * 1. Generates markdown report via getReport()
3483
+ * 2. Creates output directory (recursive mkdir)
3484
+ * 3. Writes file with UTF-8 encoding
3485
+ * 4. Logs success/failure to console
3486
+ *
3487
+ * @param symbol - Trading pair symbol (e.g., "BTCUSDT")
3488
+ * @param strategyName - Strategy name (e.g., "my-strategy")
3489
+ * @param path - Output directory path (default: "./dump/risk")
3490
+ * @returns Promise that resolves when file is written
3491
+ *
3492
+ * @example
3493
+ * ```typescript
3494
+ * // Save to default path: ./dump/risk/BTCUSDT_my-strategy.md
3495
+ * await Risk.dump("BTCUSDT", "my-strategy");
3496
+ *
3497
+ * // Save to custom path: ./reports/risk/BTCUSDT_my-strategy.md
3498
+ * await Risk.dump("BTCUSDT", "my-strategy", "./reports/risk");
3499
+ *
3500
+ * // After multiple symbols backtested, export all risk reports
3501
+ * for (const symbol of ["BTCUSDT", "ETHUSDT", "BNBUSDT"]) {
3502
+ * await Risk.dump(symbol, "my-strategy", "./backtest-results");
3503
+ * }
3504
+ * ```
3505
+ */
3506
+ this.dump = async (symbol, strategyName, path) => {
3507
+ backtest$1.loggerService.info(RISK_METHOD_NAME_DUMP, {
3508
+ symbol,
3509
+ strategyName,
3510
+ path,
3511
+ });
3512
+ backtest$1.strategyValidationService.validate(strategyName, RISK_METHOD_NAME_DUMP);
3513
+ {
3514
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
3515
+ riskName &&
3516
+ backtest$1.riskValidationService.validate(riskName, RISK_METHOD_NAME_DUMP);
3517
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, RISK_METHOD_NAME_DUMP));
3518
+ }
3519
+ await backtest$1.riskMarkdownService.dump(symbol, strategyName, path);
3520
+ };
3521
+ }
3522
+ }
3523
+ /**
3524
+ * Global singleton instance of RiskUtils.
3525
+ * Provides static-like access to risk rejection reporting methods.
3526
+ *
3527
+ * @example
3528
+ * ```typescript
3529
+ * import { Risk } from "backtest-kit";
3530
+ *
3531
+ * // Usage same as RiskUtils methods
3532
+ * const stats = await Risk.getData("BTCUSDT", "my-strategy");
3533
+ * const report = await Risk.getReport("BTCUSDT", "my-strategy");
3534
+ * await Risk.dump("BTCUSDT", "my-strategy");
3535
+ * ```
3536
+ */
3537
+ const Risk = new RiskUtils();
3538
+
3250
3539
  const NOOP_RISK = {
3251
3540
  checkSignal: () => Promise.resolve(true),
3252
3541
  addSignal: () => Promise.resolve(),
3253
3542
  removeSignal: () => Promise.resolve(),
3254
3543
  };
3544
+ const GET_RISK_FN = (dto, self) => {
3545
+ const hasRiskName = !!dto.riskName;
3546
+ const hasRiskList = !!(dto.riskList?.length);
3547
+ // Нет ни riskName, ни riskList
3548
+ if (!hasRiskName && !hasRiskList) {
3549
+ return NOOP_RISK;
3550
+ }
3551
+ // Есть только riskName (без riskList)
3552
+ if (hasRiskName && !hasRiskList) {
3553
+ return self.riskConnectionService.getRisk(dto.riskName);
3554
+ }
3555
+ // Есть только riskList (без riskName)
3556
+ if (!hasRiskName && hasRiskList) {
3557
+ return new MergeRisk(dto.riskList.map((riskName) => self.riskConnectionService.getRisk(riskName)));
3558
+ }
3559
+ // Есть и riskName, и riskList - объединяем (riskName в начало)
3560
+ return new MergeRisk([
3561
+ self.riskConnectionService.getRisk(dto.riskName),
3562
+ ...dto.riskList.map((riskName) => self.riskConnectionService.getRisk(riskName))
3563
+ ]);
3564
+ };
3255
3565
  /**
3256
3566
  * Connection service routing strategy operations to correct ClientStrategy instance.
3257
3567
  *
@@ -3292,7 +3602,7 @@ class StrategyConnectionService {
3292
3602
  * @returns Configured ClientStrategy instance
3293
3603
  */
3294
3604
  this.getStrategy = memoize(([symbol, strategyName]) => `${symbol}:${strategyName}`, (symbol, strategyName) => {
3295
- const { riskName, getSignal, interval, callbacks } = this.strategySchemaService.get(strategyName);
3605
+ const { riskName = "", riskList = [], getSignal, interval, callbacks, } = this.strategySchemaService.get(strategyName);
3296
3606
  return new ClientStrategy({
3297
3607
  symbol,
3298
3608
  interval,
@@ -3301,7 +3611,10 @@ class StrategyConnectionService {
3301
3611
  logger: this.loggerService,
3302
3612
  partial: this.partialConnectionService,
3303
3613
  exchange: this.exchangeConnectionService,
3304
- risk: riskName ? this.riskConnectionService.getRisk(riskName) : NOOP_RISK,
3614
+ risk: GET_RISK_FN({
3615
+ riskName,
3616
+ riskList,
3617
+ }, this),
3305
3618
  riskName,
3306
3619
  strategyName,
3307
3620
  getSignal,
@@ -3413,7 +3726,7 @@ class StrategyConnectionService {
3413
3726
  */
3414
3727
  this.stop = async (ctx, backtest) => {
3415
3728
  this.loggerService.log("strategyConnectionService stop", {
3416
- ctx
3729
+ ctx,
3417
3730
  });
3418
3731
  const strategy = this.getStrategy(ctx.symbol, ctx.strategyName);
3419
3732
  await strategy.stop(ctx.symbol, ctx.strategyName, backtest);
@@ -4308,11 +4621,10 @@ class StrategyCoreService {
4308
4621
  symbol,
4309
4622
  strategyName,
4310
4623
  });
4311
- const strategySchema = this.strategySchemaService.get(strategyName);
4624
+ const { riskName, riskList } = this.strategySchemaService.get(strategyName);
4312
4625
  this.strategyValidationService.validate(strategyName, METHOD_NAME_VALIDATE);
4313
- const riskName = strategySchema.riskName;
4314
- riskName &&
4315
- this.riskValidationService.validate(riskName, METHOD_NAME_VALIDATE);
4626
+ riskName && this.riskValidationService.validate(riskName, METHOD_NAME_VALIDATE);
4627
+ riskList && riskList.forEach((riskName) => this.riskValidationService.validate(riskName, METHOD_NAME_VALIDATE));
4316
4628
  });
4317
4629
  /**
4318
4630
  * Retrieves the currently active pending signal for the symbol.
@@ -5918,10 +6230,9 @@ class LiveCommandService {
5918
6230
  this.exchangeValidationService.validate(context.exchangeName, METHOD_NAME_RUN$2);
5919
6231
  }
5920
6232
  {
5921
- const strategySchema = this.strategySchemaService.get(context.strategyName);
5922
- const riskName = strategySchema.riskName;
5923
- riskName &&
5924
- this.riskValidationService.validate(riskName, METHOD_NAME_RUN$2);
6233
+ const { riskName, riskList } = this.strategySchemaService.get(context.strategyName);
6234
+ riskName && this.riskValidationService.validate(riskName, METHOD_NAME_RUN$2);
6235
+ riskList && riskList.forEach((riskName) => this.riskValidationService.validate(riskName, METHOD_NAME_RUN$2));
5925
6236
  }
5926
6237
  return this.liveLogicPublicService.run(symbol, context);
5927
6238
  };
@@ -5962,9 +6273,9 @@ class BacktestCommandService {
5962
6273
  this.frameValidationService.validate(context.frameName, METHOD_NAME_RUN$1);
5963
6274
  }
5964
6275
  {
5965
- const strategySchema = this.strategySchemaService.get(context.strategyName);
5966
- const riskName = strategySchema.riskName;
6276
+ const { riskName, riskList } = this.strategySchemaService.get(context.strategyName);
5967
6277
  riskName && this.riskValidationService.validate(riskName, METHOD_NAME_RUN$1);
6278
+ riskList && riskList.forEach((riskName) => this.riskValidationService.validate(riskName, METHOD_NAME_RUN$1));
5968
6279
  }
5969
6280
  return this.backtestLogicPublicService.run(symbol, context);
5970
6281
  };
@@ -6008,11 +6319,10 @@ class WalkerCommandService {
6008
6319
  {
6009
6320
  const walkerSchema = this.walkerSchemaService.get(context.walkerName);
6010
6321
  for (const strategyName of walkerSchema.strategies) {
6011
- const strategySchema = this.strategySchemaService.get(strategyName);
6322
+ const { riskName, riskList } = this.strategySchemaService.get(strategyName);
6012
6323
  this.strategyValidationService.validate(strategyName, METHOD_NAME_RUN);
6013
- const riskName = strategySchema.riskName;
6014
- riskName &&
6015
- this.riskValidationService.validate(riskName, METHOD_NAME_RUN);
6324
+ riskName && this.riskValidationService.validate(riskName, METHOD_NAME_RUN);
6325
+ riskList && riskList.forEach((riskName) => this.riskValidationService.validate(riskName, METHOD_NAME_RUN));
6016
6326
  }
6017
6327
  }
6018
6328
  return this.walkerLogicPublicService.run(symbol, context);
@@ -9133,6 +9443,9 @@ class StrategyValidationService {
9133
9443
  if (strategy.riskName) {
9134
9444
  this.riskValidationService.validate(strategy.riskName, source);
9135
9445
  }
9446
+ if (strategy.riskList) {
9447
+ strategy.riskList.forEach((riskName) => this.riskValidationService.validate(riskName, source));
9448
+ }
9136
9449
  return true;
9137
9450
  });
9138
9451
  /**
@@ -11770,9 +12083,9 @@ class PartialGlobalService {
11770
12083
  methodName,
11771
12084
  });
11772
12085
  this.strategyValidationService.validate(strategyName, methodName);
11773
- const strategySchema = this.strategySchemaService.get(strategyName);
11774
- const riskName = strategySchema.riskName;
12086
+ const { riskName, riskList } = this.strategySchemaService.get(strategyName);
11775
12087
  riskName && this.riskValidationService.validate(riskName, methodName);
12088
+ riskList && riskList.forEach((riskName) => this.riskValidationService.validate(riskName, methodName));
11776
12089
  });
11777
12090
  /**
11778
12091
  * Processes profit state and emits events for newly reached profit levels.
@@ -14607,8 +14920,9 @@ class BacktestInstance {
14607
14920
  backtest$1.strategyCoreService.clear({ symbol, strategyName: context.strategyName });
14608
14921
  }
14609
14922
  {
14610
- const { riskName } = backtest$1.strategySchemaService.get(context.strategyName);
14923
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(context.strategyName);
14611
14924
  riskName && backtest$1.riskGlobalService.clear(riskName);
14925
+ riskList && riskList.forEach((riskName) => backtest$1.riskGlobalService.clear(riskName));
14612
14926
  }
14613
14927
  return backtest$1.backtestCommandService.run(symbol, context);
14614
14928
  };
@@ -14792,8 +15106,9 @@ class BacktestUtils {
14792
15106
  backtest$1.frameValidationService.validate(context.frameName, BACKTEST_METHOD_NAME_RUN);
14793
15107
  }
14794
15108
  {
14795
- const { riskName } = backtest$1.strategySchemaService.get(context.strategyName);
15109
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(context.strategyName);
14796
15110
  riskName && backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_RUN);
15111
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_RUN));
14797
15112
  }
14798
15113
  const instance = this._getInstance(symbol, context.strategyName);
14799
15114
  return instance.run(symbol, context);
@@ -14824,8 +15139,9 @@ class BacktestUtils {
14824
15139
  backtest$1.exchangeValidationService.validate(context.exchangeName, BACKTEST_METHOD_NAME_BACKGROUND);
14825
15140
  backtest$1.frameValidationService.validate(context.frameName, BACKTEST_METHOD_NAME_BACKGROUND);
14826
15141
  {
14827
- const { riskName } = backtest$1.strategySchemaService.get(context.strategyName);
15142
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(context.strategyName);
14828
15143
  riskName && backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_BACKGROUND);
15144
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_BACKGROUND));
14829
15145
  }
14830
15146
  const instance = this._getInstance(symbol, context.strategyName);
14831
15147
  return instance.background(symbol, context);
@@ -14850,8 +15166,9 @@ class BacktestUtils {
14850
15166
  this.stop = async (symbol, strategyName) => {
14851
15167
  backtest$1.strategyValidationService.validate(strategyName, BACKTEST_METHOD_NAME_STOP);
14852
15168
  {
14853
- const { riskName } = backtest$1.strategySchemaService.get(strategyName);
15169
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
14854
15170
  riskName && backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_STOP);
15171
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_STOP));
14855
15172
  }
14856
15173
  const instance = this._getInstance(symbol, strategyName);
14857
15174
  return await instance.stop(symbol, strategyName);
@@ -14872,8 +15189,9 @@ class BacktestUtils {
14872
15189
  this.getData = async (symbol, strategyName) => {
14873
15190
  backtest$1.strategyValidationService.validate(strategyName, "BacktestUtils.getData");
14874
15191
  {
14875
- const { riskName } = backtest$1.strategySchemaService.get(strategyName);
15192
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
14876
15193
  riskName && backtest$1.riskValidationService.validate(riskName, "BacktestUtils.getData");
15194
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, "BacktestUtils.getData"));
14877
15195
  }
14878
15196
  const instance = this._getInstance(symbol, strategyName);
14879
15197
  return await instance.getData(symbol, strategyName);
@@ -14894,8 +15212,9 @@ class BacktestUtils {
14894
15212
  this.getReport = async (symbol, strategyName) => {
14895
15213
  backtest$1.strategyValidationService.validate(strategyName, BACKTEST_METHOD_NAME_GET_REPORT);
14896
15214
  {
14897
- const { riskName } = backtest$1.strategySchemaService.get(strategyName);
15215
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
14898
15216
  riskName && backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_GET_REPORT);
15217
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_GET_REPORT));
14899
15218
  }
14900
15219
  const instance = this._getInstance(symbol, strategyName);
14901
15220
  return await instance.getReport(symbol, strategyName);
@@ -14919,8 +15238,9 @@ class BacktestUtils {
14919
15238
  this.dump = async (symbol, strategyName, path) => {
14920
15239
  backtest$1.strategyValidationService.validate(strategyName, BACKTEST_METHOD_NAME_DUMP);
14921
15240
  {
14922
- const { riskName } = backtest$1.strategySchemaService.get(strategyName);
15241
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
14923
15242
  riskName && backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_DUMP);
15243
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_DUMP));
14924
15244
  }
14925
15245
  const instance = this._getInstance(symbol, strategyName);
14926
15246
  return await instance.dump(symbol, strategyName, path);
@@ -14968,6 +15288,7 @@ const LIVE_METHOD_NAME_RUN = "LiveUtils.run";
14968
15288
  const LIVE_METHOD_NAME_BACKGROUND = "LiveUtils.background";
14969
15289
  const LIVE_METHOD_NAME_STOP = "LiveUtils.stop";
14970
15290
  const LIVE_METHOD_NAME_GET_REPORT = "LiveUtils.getReport";
15291
+ const LIVE_METHOD_NAME_GET_DATA = "LiveUtils.getData";
14971
15292
  const LIVE_METHOD_NAME_DUMP = "LiveUtils.dump";
14972
15293
  const LIVE_METHOD_NAME_TASK = "LiveUtils.task";
14973
15294
  const LIVE_METHOD_NAME_GET_STATUS = "LiveUtils.getStatus";
@@ -15099,8 +15420,9 @@ class LiveInstance {
15099
15420
  backtest$1.strategyCoreService.clear({ symbol, strategyName: context.strategyName });
15100
15421
  }
15101
15422
  {
15102
- const { riskName } = backtest$1.strategySchemaService.get(context.strategyName);
15423
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(context.strategyName);
15103
15424
  riskName && backtest$1.riskGlobalService.clear(riskName);
15425
+ riskList && riskList.forEach((riskName) => backtest$1.riskGlobalService.clear(riskName));
15104
15426
  }
15105
15427
  return backtest$1.liveCommandService.run(symbol, context);
15106
15428
  };
@@ -15296,8 +15618,9 @@ class LiveUtils {
15296
15618
  backtest$1.exchangeValidationService.validate(context.exchangeName, LIVE_METHOD_NAME_RUN);
15297
15619
  }
15298
15620
  {
15299
- const { riskName } = backtest$1.strategySchemaService.get(context.strategyName);
15621
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(context.strategyName);
15300
15622
  riskName && backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_RUN);
15623
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_RUN));
15301
15624
  }
15302
15625
  const instance = this._getInstance(symbol, context.strategyName);
15303
15626
  return instance.run(symbol, context);
@@ -15327,8 +15650,9 @@ class LiveUtils {
15327
15650
  backtest$1.strategyValidationService.validate(context.strategyName, LIVE_METHOD_NAME_BACKGROUND);
15328
15651
  backtest$1.exchangeValidationService.validate(context.exchangeName, LIVE_METHOD_NAME_BACKGROUND);
15329
15652
  {
15330
- const { riskName } = backtest$1.strategySchemaService.get(context.strategyName);
15653
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(context.strategyName);
15331
15654
  riskName && backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_BACKGROUND);
15655
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_BACKGROUND));
15332
15656
  }
15333
15657
  const instance = this._getInstance(symbol, context.strategyName);
15334
15658
  return instance.background(symbol, context);
@@ -15353,8 +15677,9 @@ class LiveUtils {
15353
15677
  this.stop = async (symbol, strategyName) => {
15354
15678
  backtest$1.strategyValidationService.validate(strategyName, LIVE_METHOD_NAME_STOP);
15355
15679
  {
15356
- const { riskName } = backtest$1.strategySchemaService.get(strategyName);
15680
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
15357
15681
  riskName && backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_STOP);
15682
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_STOP));
15358
15683
  }
15359
15684
  const instance = this._getInstance(symbol, strategyName);
15360
15685
  return await instance.stop(symbol, strategyName);
@@ -15375,8 +15700,9 @@ class LiveUtils {
15375
15700
  this.getData = async (symbol, strategyName) => {
15376
15701
  backtest$1.strategyValidationService.validate(strategyName, "LiveUtils.getData");
15377
15702
  {
15378
- const { riskName } = backtest$1.strategySchemaService.get(strategyName);
15379
- riskName && backtest$1.riskValidationService.validate(riskName, "LiveUtils.getData");
15703
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
15704
+ riskName && backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_GET_DATA);
15705
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_GET_DATA));
15380
15706
  }
15381
15707
  const instance = this._getInstance(symbol, strategyName);
15382
15708
  return await instance.getData(symbol, strategyName);
@@ -15397,8 +15723,9 @@ class LiveUtils {
15397
15723
  this.getReport = async (symbol, strategyName) => {
15398
15724
  backtest$1.strategyValidationService.validate(strategyName, LIVE_METHOD_NAME_GET_REPORT);
15399
15725
  {
15400
- const { riskName } = backtest$1.strategySchemaService.get(strategyName);
15726
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
15401
15727
  riskName && backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_GET_REPORT);
15728
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_GET_REPORT));
15402
15729
  }
15403
15730
  const instance = this._getInstance(symbol, strategyName);
15404
15731
  return await instance.getReport(symbol, strategyName);
@@ -15422,8 +15749,9 @@ class LiveUtils {
15422
15749
  this.dump = async (symbol, strategyName, path) => {
15423
15750
  backtest$1.strategyValidationService.validate(strategyName, LIVE_METHOD_NAME_DUMP);
15424
15751
  {
15425
- const { riskName } = backtest$1.strategySchemaService.get(strategyName);
15752
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
15426
15753
  riskName && backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_DUMP);
15754
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_DUMP));
15427
15755
  }
15428
15756
  const instance = this._getInstance(symbol, strategyName);
15429
15757
  return await instance.dump(symbol, strategyName, path);
@@ -15514,8 +15842,9 @@ class ScheduleUtils {
15514
15842
  });
15515
15843
  backtest$1.strategyValidationService.validate(strategyName, SCHEDULE_METHOD_NAME_GET_DATA);
15516
15844
  {
15517
- const { riskName } = backtest$1.strategySchemaService.get(strategyName);
15845
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
15518
15846
  riskName && backtest$1.riskValidationService.validate(riskName, SCHEDULE_METHOD_NAME_GET_DATA);
15847
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, SCHEDULE_METHOD_NAME_GET_DATA));
15519
15848
  }
15520
15849
  return await backtest$1.scheduleMarkdownService.getData(symbol, strategyName);
15521
15850
  };
@@ -15539,8 +15868,9 @@ class ScheduleUtils {
15539
15868
  });
15540
15869
  backtest$1.strategyValidationService.validate(strategyName, SCHEDULE_METHOD_NAME_GET_REPORT);
15541
15870
  {
15542
- const { riskName } = backtest$1.strategySchemaService.get(strategyName);
15871
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
15543
15872
  riskName && backtest$1.riskValidationService.validate(riskName, SCHEDULE_METHOD_NAME_GET_REPORT);
15873
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, SCHEDULE_METHOD_NAME_GET_REPORT));
15544
15874
  }
15545
15875
  return await backtest$1.scheduleMarkdownService.getReport(symbol, strategyName);
15546
15876
  };
@@ -15568,8 +15898,9 @@ class ScheduleUtils {
15568
15898
  });
15569
15899
  backtest$1.strategyValidationService.validate(strategyName, SCHEDULE_METHOD_NAME_DUMP);
15570
15900
  {
15571
- const { riskName } = backtest$1.strategySchemaService.get(strategyName);
15901
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
15572
15902
  riskName && backtest$1.riskValidationService.validate(riskName, SCHEDULE_METHOD_NAME_DUMP);
15903
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, SCHEDULE_METHOD_NAME_DUMP));
15573
15904
  }
15574
15905
  await backtest$1.scheduleMarkdownService.dump(symbol, strategyName, path);
15575
15906
  };
@@ -15588,6 +15919,9 @@ class ScheduleUtils {
15588
15919
  */
15589
15920
  const Schedule = new ScheduleUtils();
15590
15921
 
15922
+ const PERFORMANCE_METHOD_NAME_GET_DATA = "Performance.getData";
15923
+ const PERFORMANCE_METHOD_NAME_GET_REPORT = "Performance.getReport";
15924
+ const PERFORMANCE_METHOD_NAME_DUMP = "Performance.dump";
15591
15925
  /**
15592
15926
  * Performance class provides static methods for performance metrics analysis.
15593
15927
  *
@@ -15650,10 +15984,11 @@ class Performance {
15650
15984
  * ```
15651
15985
  */
15652
15986
  static async getData(symbol, strategyName) {
15653
- backtest$1.strategyValidationService.validate(strategyName, "Performance.getData");
15987
+ backtest$1.strategyValidationService.validate(strategyName, PERFORMANCE_METHOD_NAME_GET_DATA);
15654
15988
  {
15655
- const { riskName } = backtest$1.strategySchemaService.get(strategyName);
15656
- riskName && backtest$1.riskValidationService.validate(riskName, "Performance.getData");
15989
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
15990
+ riskName && backtest$1.riskValidationService.validate(riskName, PERFORMANCE_METHOD_NAME_GET_DATA);
15991
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, PERFORMANCE_METHOD_NAME_GET_DATA));
15657
15992
  }
15658
15993
  return backtest$1.performanceMarkdownService.getData(symbol, strategyName);
15659
15994
  }
@@ -15680,10 +16015,11 @@ class Performance {
15680
16015
  * ```
15681
16016
  */
15682
16017
  static async getReport(symbol, strategyName) {
15683
- backtest$1.strategyValidationService.validate(strategyName, "Performance.getReport");
16018
+ backtest$1.strategyValidationService.validate(strategyName, PERFORMANCE_METHOD_NAME_GET_REPORT);
15684
16019
  {
15685
- const { riskName } = backtest$1.strategySchemaService.get(strategyName);
15686
- riskName && backtest$1.riskValidationService.validate(riskName, "Performance.getReport");
16020
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
16021
+ riskName && backtest$1.riskValidationService.validate(riskName, PERFORMANCE_METHOD_NAME_GET_REPORT);
16022
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, PERFORMANCE_METHOD_NAME_GET_REPORT));
15687
16023
  }
15688
16024
  return backtest$1.performanceMarkdownService.getReport(symbol, strategyName);
15689
16025
  }
@@ -15707,10 +16043,11 @@ class Performance {
15707
16043
  * ```
15708
16044
  */
15709
16045
  static async dump(symbol, strategyName, path = "./dump/performance") {
15710
- backtest$1.strategyValidationService.validate(strategyName, "Performance.dump");
16046
+ backtest$1.strategyValidationService.validate(strategyName, PERFORMANCE_METHOD_NAME_DUMP);
15711
16047
  {
15712
- const { riskName } = backtest$1.strategySchemaService.get(strategyName);
15713
- riskName && backtest$1.riskValidationService.validate(riskName, "Performance.dump");
16048
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
16049
+ riskName && backtest$1.riskValidationService.validate(riskName, PERFORMANCE_METHOD_NAME_DUMP);
16050
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, PERFORMANCE_METHOD_NAME_DUMP));
15714
16051
  }
15715
16052
  return backtest$1.performanceMarkdownService.dump(symbol, strategyName, path);
15716
16053
  }
@@ -15857,8 +16194,9 @@ class WalkerInstance {
15857
16194
  backtest$1.strategyCoreService.clear({ symbol, strategyName });
15858
16195
  }
15859
16196
  {
15860
- const { riskName } = backtest$1.strategySchemaService.get(strategyName);
16197
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
15861
16198
  riskName && backtest$1.riskGlobalService.clear(riskName);
16199
+ riskList && riskList.forEach((riskName) => backtest$1.riskGlobalService.clear(riskName));
15862
16200
  }
15863
16201
  }
15864
16202
  return backtest$1.walkerCommandService.run(symbol, {
@@ -16064,9 +16402,9 @@ class WalkerUtils {
16064
16402
  backtest$1.frameValidationService.validate(walkerSchema.frameName, WALKER_METHOD_NAME_RUN);
16065
16403
  for (const strategyName of walkerSchema.strategies) {
16066
16404
  backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_RUN);
16067
- const strategySchema = backtest$1.strategySchemaService.get(strategyName);
16068
- const riskName = strategySchema.riskName;
16405
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
16069
16406
  riskName && backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_RUN);
16407
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_RUN));
16070
16408
  }
16071
16409
  const instance = this._getInstance(symbol, context.walkerName);
16072
16410
  return instance.run(symbol, context);
@@ -16097,9 +16435,9 @@ class WalkerUtils {
16097
16435
  backtest$1.frameValidationService.validate(walkerSchema.frameName, WALKER_METHOD_NAME_BACKGROUND);
16098
16436
  for (const strategyName of walkerSchema.strategies) {
16099
16437
  backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_BACKGROUND);
16100
- const strategySchema = backtest$1.strategySchemaService.get(strategyName);
16101
- const riskName = strategySchema.riskName;
16438
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
16102
16439
  riskName && backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_BACKGROUND);
16440
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_BACKGROUND));
16103
16441
  }
16104
16442
  const instance = this._getInstance(symbol, context.walkerName);
16105
16443
  return instance.background(symbol, context);
@@ -16132,9 +16470,9 @@ class WalkerUtils {
16132
16470
  const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
16133
16471
  for (const strategyName of walkerSchema.strategies) {
16134
16472
  backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_STOP);
16135
- const strategySchema = backtest$1.strategySchemaService.get(strategyName);
16136
- const riskName = strategySchema.riskName;
16473
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
16137
16474
  riskName && backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_STOP);
16475
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_STOP));
16138
16476
  }
16139
16477
  const instance = this._getInstance(symbol, walkerName);
16140
16478
  return await instance.stop(symbol, walkerName);
@@ -16157,9 +16495,9 @@ class WalkerUtils {
16157
16495
  const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
16158
16496
  for (const strategyName of walkerSchema.strategies) {
16159
16497
  backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_GET_DATA);
16160
- const strategySchema = backtest$1.strategySchemaService.get(strategyName);
16161
- const riskName = strategySchema.riskName;
16498
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
16162
16499
  riskName && backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_GET_DATA);
16500
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_GET_DATA));
16163
16501
  }
16164
16502
  const instance = this._getInstance(symbol, walkerName);
16165
16503
  return await instance.getData(symbol, walkerName);
@@ -16182,9 +16520,9 @@ class WalkerUtils {
16182
16520
  const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
16183
16521
  for (const strategyName of walkerSchema.strategies) {
16184
16522
  backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_GET_REPORT);
16185
- const strategySchema = backtest$1.strategySchemaService.get(strategyName);
16186
- const riskName = strategySchema.riskName;
16523
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
16187
16524
  riskName && backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_GET_REPORT);
16525
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_GET_REPORT));
16188
16526
  }
16189
16527
  const instance = this._getInstance(symbol, walkerName);
16190
16528
  return await instance.getReport(symbol, walkerName);
@@ -16210,9 +16548,9 @@ class WalkerUtils {
16210
16548
  const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
16211
16549
  for (const strategyName of walkerSchema.strategies) {
16212
16550
  backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_DUMP);
16213
- const strategySchema = backtest$1.strategySchemaService.get(strategyName);
16214
- const riskName = strategySchema.riskName;
16551
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
16215
16552
  riskName && backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_DUMP);
16553
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_DUMP));
16216
16554
  }
16217
16555
  const instance = this._getInstance(symbol, walkerName);
16218
16556
  return await instance.dump(symbol, walkerName, path);
@@ -16308,8 +16646,9 @@ class HeatUtils {
16308
16646
  backtest$1.loggerService.info(HEAT_METHOD_NAME_GET_DATA, { strategyName });
16309
16647
  backtest$1.strategyValidationService.validate(strategyName, HEAT_METHOD_NAME_GET_DATA);
16310
16648
  {
16311
- const { riskName } = backtest$1.strategySchemaService.get(strategyName);
16649
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
16312
16650
  riskName && backtest$1.riskValidationService.validate(riskName, HEAT_METHOD_NAME_GET_DATA);
16651
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, HEAT_METHOD_NAME_GET_DATA));
16313
16652
  }
16314
16653
  return await backtest$1.heatMarkdownService.getData(strategyName);
16315
16654
  };
@@ -16342,8 +16681,9 @@ class HeatUtils {
16342
16681
  backtest$1.loggerService.info(HEAT_METHOD_NAME_GET_REPORT, { strategyName });
16343
16682
  backtest$1.strategyValidationService.validate(strategyName, HEAT_METHOD_NAME_GET_REPORT);
16344
16683
  {
16345
- const { riskName } = backtest$1.strategySchemaService.get(strategyName);
16684
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
16346
16685
  riskName && backtest$1.riskValidationService.validate(riskName, HEAT_METHOD_NAME_GET_REPORT);
16686
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, HEAT_METHOD_NAME_GET_REPORT));
16347
16687
  }
16348
16688
  return await backtest$1.heatMarkdownService.getReport(strategyName);
16349
16689
  };
@@ -16369,8 +16709,9 @@ class HeatUtils {
16369
16709
  backtest$1.loggerService.info(HEAT_METHOD_NAME_DUMP, { strategyName, path });
16370
16710
  backtest$1.strategyValidationService.validate(strategyName, HEAT_METHOD_NAME_DUMP);
16371
16711
  {
16372
- const { riskName } = backtest$1.strategySchemaService.get(strategyName);
16712
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
16373
16713
  riskName && backtest$1.riskValidationService.validate(riskName, HEAT_METHOD_NAME_DUMP);
16714
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, HEAT_METHOD_NAME_DUMP));
16374
16715
  }
16375
16716
  await backtest$1.heatMarkdownService.dump(strategyName, path);
16376
16717
  };
@@ -16692,8 +17033,9 @@ class PartialUtils {
16692
17033
  backtest$1.loggerService.info(PARTIAL_METHOD_NAME_GET_DATA, { symbol, strategyName });
16693
17034
  backtest$1.strategyValidationService.validate(strategyName, PARTIAL_METHOD_NAME_GET_DATA);
16694
17035
  {
16695
- const { riskName } = backtest$1.strategySchemaService.get(strategyName);
17036
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
16696
17037
  riskName && backtest$1.riskValidationService.validate(riskName, PARTIAL_METHOD_NAME_GET_DATA);
17038
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, PARTIAL_METHOD_NAME_GET_DATA));
16697
17039
  }
16698
17040
  return await backtest$1.partialMarkdownService.getData(symbol, strategyName);
16699
17041
  };
@@ -16739,8 +17081,9 @@ class PartialUtils {
16739
17081
  backtest$1.loggerService.info(PARTIAL_METHOD_NAME_GET_REPORT, { symbol, strategyName });
16740
17082
  backtest$1.strategyValidationService.validate(strategyName, PARTIAL_METHOD_NAME_GET_REPORT);
16741
17083
  {
16742
- const { riskName } = backtest$1.strategySchemaService.get(strategyName);
17084
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
16743
17085
  riskName && backtest$1.riskValidationService.validate(riskName, PARTIAL_METHOD_NAME_GET_REPORT);
17086
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, PARTIAL_METHOD_NAME_GET_REPORT));
16744
17087
  }
16745
17088
  return await backtest$1.partialMarkdownService.getReport(symbol, strategyName);
16746
17089
  };
@@ -16779,8 +17122,9 @@ class PartialUtils {
16779
17122
  backtest$1.loggerService.info(PARTIAL_METHOD_NAME_DUMP, { symbol, strategyName, path });
16780
17123
  backtest$1.strategyValidationService.validate(strategyName, PARTIAL_METHOD_NAME_DUMP);
16781
17124
  {
16782
- const { riskName } = backtest$1.strategySchemaService.get(strategyName);
17125
+ const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
16783
17126
  riskName && backtest$1.riskValidationService.validate(riskName, PARTIAL_METHOD_NAME_DUMP);
17127
+ riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, PARTIAL_METHOD_NAME_DUMP));
16784
17128
  }
16785
17129
  await backtest$1.partialMarkdownService.dump(symbol, strategyName, path);
16786
17130
  };
@@ -16883,184 +17227,4 @@ class ConstantUtils {
16883
17227
  */
16884
17228
  const Constant = new ConstantUtils();
16885
17229
 
16886
- const RISK_METHOD_NAME_GET_DATA = "RiskUtils.getData";
16887
- const RISK_METHOD_NAME_GET_REPORT = "RiskUtils.getReport";
16888
- const RISK_METHOD_NAME_DUMP = "RiskUtils.dump";
16889
- /**
16890
- * Utility class for accessing risk rejection reports and statistics.
16891
- *
16892
- * Provides static-like methods (via singleton instance) to retrieve data
16893
- * accumulated by RiskMarkdownService from risk rejection events.
16894
- *
16895
- * Features:
16896
- * - Statistical data extraction (total rejections count, by symbol, by strategy)
16897
- * - Markdown report generation with event tables
16898
- * - File export to disk
16899
- *
16900
- * Data source:
16901
- * - RiskMarkdownService listens to riskSubject
16902
- * - Accumulates rejection events in ReportStorage (max 250 events per symbol-strategy pair)
16903
- * - Events include: timestamp, symbol, strategyName, position, exchangeName, price, activePositionCount, comment
16904
- *
16905
- * @example
16906
- * ```typescript
16907
- * import { Risk } from "./classes/Risk";
16908
- *
16909
- * // Get statistical data for BTCUSDT:my-strategy
16910
- * const stats = await Risk.getData("BTCUSDT", "my-strategy");
16911
- * console.log(`Total rejections: ${stats.totalRejections}`);
16912
- * console.log(`By symbol:`, stats.bySymbol);
16913
- * console.log(`By strategy:`, stats.byStrategy);
16914
- *
16915
- * // Generate markdown report
16916
- * const markdown = await Risk.getReport("BTCUSDT", "my-strategy");
16917
- * console.log(markdown); // Formatted table with all rejection events
16918
- *
16919
- * // Export report to file
16920
- * await Risk.dump("BTCUSDT", "my-strategy"); // Saves to ./dump/risk/BTCUSDT_my-strategy.md
16921
- * await Risk.dump("BTCUSDT", "my-strategy", "./custom/path"); // Custom directory
16922
- * ```
16923
- */
16924
- class RiskUtils {
16925
- constructor() {
16926
- /**
16927
- * Retrieves statistical data from accumulated risk rejection events.
16928
- *
16929
- * Delegates to RiskMarkdownService.getData() which reads from ReportStorage.
16930
- * Returns aggregated metrics calculated from all rejection events.
16931
- *
16932
- * @param symbol - Trading pair symbol (e.g., "BTCUSDT")
16933
- * @param strategyName - Strategy name (e.g., "my-strategy")
16934
- * @returns Promise resolving to RiskStatistics object with counts and event list
16935
- *
16936
- * @example
16937
- * ```typescript
16938
- * const stats = await Risk.getData("BTCUSDT", "my-strategy");
16939
- *
16940
- * console.log(`Total rejections: ${stats.totalRejections}`);
16941
- * console.log(`Rejections by symbol:`, stats.bySymbol);
16942
- * console.log(`Rejections by strategy:`, stats.byStrategy);
16943
- *
16944
- * // Iterate through all rejection events
16945
- * for (const event of stats.eventList) {
16946
- * console.log(`REJECTED: ${event.symbol} - ${event.comment} (${event.activePositionCount} active)`);
16947
- * }
16948
- * ```
16949
- */
16950
- this.getData = async (symbol, strategyName) => {
16951
- backtest$1.loggerService.info(RISK_METHOD_NAME_GET_DATA, { symbol, strategyName });
16952
- backtest$1.strategyValidationService.validate(strategyName, RISK_METHOD_NAME_GET_DATA);
16953
- {
16954
- const { riskName } = backtest$1.strategySchemaService.get(strategyName);
16955
- riskName && backtest$1.riskValidationService.validate(riskName, RISK_METHOD_NAME_GET_DATA);
16956
- }
16957
- return await backtest$1.riskMarkdownService.getData(symbol, strategyName);
16958
- };
16959
- /**
16960
- * Generates markdown report with all risk rejection events for a symbol-strategy pair.
16961
- *
16962
- * Creates formatted table containing:
16963
- * - Symbol
16964
- * - Strategy
16965
- * - Position (LONG/SHORT)
16966
- * - Exchange
16967
- * - Price
16968
- * - Active Positions (at rejection time)
16969
- * - Reason (from validation note)
16970
- * - Timestamp (ISO 8601)
16971
- *
16972
- * Also includes summary statistics at the end (total rejections, by symbol, by strategy).
16973
- *
16974
- * @param symbol - Trading pair symbol (e.g., "BTCUSDT")
16975
- * @param strategyName - Strategy name (e.g., "my-strategy")
16976
- * @returns Promise resolving to markdown formatted report string
16977
- *
16978
- * @example
16979
- * ```typescript
16980
- * const markdown = await Risk.getReport("BTCUSDT", "my-strategy");
16981
- * console.log(markdown);
16982
- *
16983
- * // Output:
16984
- * // # Risk Rejection Report: BTCUSDT:my-strategy
16985
- * //
16986
- * // | Symbol | Strategy | Position | Exchange | Price | Active Positions | Reason | Timestamp |
16987
- * // | --- | --- | --- | --- | --- | --- | --- | --- |
16988
- * // | BTCUSDT | my-strategy | LONG | binance | 50000.00000000 USD | 3 | Max 3 positions allowed | 2024-01-15T10:30:00.000Z |
16989
- * //
16990
- * // **Total rejections:** 1
16991
- * //
16992
- * // ## Rejections by Symbol
16993
- * // - BTCUSDT: 1
16994
- * //
16995
- * // ## Rejections by Strategy
16996
- * // - my-strategy: 1
16997
- * ```
16998
- */
16999
- this.getReport = async (symbol, strategyName) => {
17000
- backtest$1.loggerService.info(RISK_METHOD_NAME_GET_REPORT, { symbol, strategyName });
17001
- backtest$1.strategyValidationService.validate(strategyName, RISK_METHOD_NAME_GET_REPORT);
17002
- {
17003
- const { riskName } = backtest$1.strategySchemaService.get(strategyName);
17004
- riskName && backtest$1.riskValidationService.validate(riskName, RISK_METHOD_NAME_GET_REPORT);
17005
- }
17006
- return await backtest$1.riskMarkdownService.getReport(symbol, strategyName);
17007
- };
17008
- /**
17009
- * Generates and saves markdown report to file.
17010
- *
17011
- * Creates directory if it doesn't exist.
17012
- * Filename format: {symbol}_{strategyName}.md (e.g., "BTCUSDT_my-strategy.md")
17013
- *
17014
- * Delegates to RiskMarkdownService.dump() which:
17015
- * 1. Generates markdown report via getReport()
17016
- * 2. Creates output directory (recursive mkdir)
17017
- * 3. Writes file with UTF-8 encoding
17018
- * 4. Logs success/failure to console
17019
- *
17020
- * @param symbol - Trading pair symbol (e.g., "BTCUSDT")
17021
- * @param strategyName - Strategy name (e.g., "my-strategy")
17022
- * @param path - Output directory path (default: "./dump/risk")
17023
- * @returns Promise that resolves when file is written
17024
- *
17025
- * @example
17026
- * ```typescript
17027
- * // Save to default path: ./dump/risk/BTCUSDT_my-strategy.md
17028
- * await Risk.dump("BTCUSDT", "my-strategy");
17029
- *
17030
- * // Save to custom path: ./reports/risk/BTCUSDT_my-strategy.md
17031
- * await Risk.dump("BTCUSDT", "my-strategy", "./reports/risk");
17032
- *
17033
- * // After multiple symbols backtested, export all risk reports
17034
- * for (const symbol of ["BTCUSDT", "ETHUSDT", "BNBUSDT"]) {
17035
- * await Risk.dump(symbol, "my-strategy", "./backtest-results");
17036
- * }
17037
- * ```
17038
- */
17039
- this.dump = async (symbol, strategyName, path) => {
17040
- backtest$1.loggerService.info(RISK_METHOD_NAME_DUMP, { symbol, strategyName, path });
17041
- backtest$1.strategyValidationService.validate(strategyName, RISK_METHOD_NAME_DUMP);
17042
- {
17043
- const { riskName } = backtest$1.strategySchemaService.get(strategyName);
17044
- riskName && backtest$1.riskValidationService.validate(riskName, RISK_METHOD_NAME_DUMP);
17045
- }
17046
- await backtest$1.riskMarkdownService.dump(symbol, strategyName, path);
17047
- };
17048
- }
17049
- }
17050
- /**
17051
- * Global singleton instance of RiskUtils.
17052
- * Provides static-like access to risk rejection reporting methods.
17053
- *
17054
- * @example
17055
- * ```typescript
17056
- * import { Risk } from "backtest-kit";
17057
- *
17058
- * // Usage same as RiskUtils methods
17059
- * const stats = await Risk.getData("BTCUSDT", "my-strategy");
17060
- * const report = await Risk.getReport("BTCUSDT", "my-strategy");
17061
- * await Risk.dump("BTCUSDT", "my-strategy");
17062
- * ```
17063
- */
17064
- const Risk = new RiskUtils();
17065
-
17066
17230
  export { Backtest, Constant, ExecutionContextService, Heat, Live, MethodContextService, Optimizer, Partial, Performance, PersistBase, PersistPartialAdapter, PersistRiskAdapter, PersistScheduleAdapter, PersistSignalAdapter, PositionSize, Risk, Schedule, Walker, addExchange, addFrame, addOptimizer, addRisk, addSizing, addStrategy, addWalker, dumpSignal, emitters, formatPrice, formatQuantity, getAveragePrice, getCandles, getConfig, getDate, getDefaultConfig, getMode, backtest as lib, listExchanges, listFrames, listOptimizers, listRisks, listSizings, listStrategies, listWalkers, listenBacktestProgress, listenDoneBacktest, listenDoneBacktestOnce, listenDoneLive, listenDoneLiveOnce, listenDoneWalker, listenDoneWalkerOnce, listenError, listenExit, listenOptimizerProgress, listenPartialLoss, listenPartialLossOnce, listenPartialProfit, listenPartialProfitOnce, listenPerformance, listenRisk, listenRiskOnce, listenSignal, listenSignalBacktest, listenSignalBacktestOnce, listenSignalLive, listenSignalLiveOnce, listenSignalOnce, listenValidation, listenWalker, listenWalkerComplete, listenWalkerOnce, listenWalkerProgress, setConfig, setLogger };