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/README.md +15 -2
- package/build/index.cjs +409 -245
- package/build/index.mjs +409 -245
- package/package.json +1 -1
- package/types.d.ts +351 -345
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:
|
|
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
|
|
4624
|
+
const { riskName, riskList } = this.strategySchemaService.get(strategyName);
|
|
4312
4625
|
this.strategyValidationService.validate(strategyName, METHOD_NAME_VALIDATE);
|
|
4313
|
-
|
|
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
|
|
5922
|
-
|
|
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
|
|
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
|
|
6322
|
+
const { riskName, riskList } = this.strategySchemaService.get(strategyName);
|
|
6012
6323
|
this.strategyValidationService.validate(strategyName, METHOD_NAME_RUN);
|
|
6013
|
-
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 };
|