backtest-kit 1.5.28 → 1.5.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/index.cjs +644 -394
- package/build/index.mjs +643 -395
- package/package.json +1 -1
- package/types.d.ts +107 -1
package/build/index.mjs
CHANGED
|
@@ -2041,7 +2041,7 @@ const BASE_WAIT_FOR_INIT_FN_METHOD_NAME = "PersistBase.waitForInitFn";
|
|
|
2041
2041
|
const BASE_UNLINK_RETRY_COUNT = 5;
|
|
2042
2042
|
const BASE_UNLINK_RETRY_DELAY = 1000;
|
|
2043
2043
|
const BASE_WAIT_FOR_INIT_FN = async (self) => {
|
|
2044
|
-
|
|
2044
|
+
backtest$1.loggerService.debug(BASE_WAIT_FOR_INIT_FN_METHOD_NAME, {
|
|
2045
2045
|
entityName: self.entityName,
|
|
2046
2046
|
directory: self._directory,
|
|
2047
2047
|
});
|
|
@@ -2099,7 +2099,7 @@ const PersistBase = makeExtendable(class {
|
|
|
2099
2099
|
this.entityName = entityName;
|
|
2100
2100
|
this.baseDir = baseDir;
|
|
2101
2101
|
this[_a] = singleshot(async () => await BASE_WAIT_FOR_INIT_FN(this));
|
|
2102
|
-
|
|
2102
|
+
backtest$1.loggerService.debug(PERSIST_BASE_METHOD_NAME_CTOR, {
|
|
2103
2103
|
entityName: this.entityName,
|
|
2104
2104
|
baseDir,
|
|
2105
2105
|
});
|
|
@@ -2115,7 +2115,7 @@ const PersistBase = makeExtendable(class {
|
|
|
2115
2115
|
return join(this.baseDir, this.entityName, `${entityId}.json`);
|
|
2116
2116
|
}
|
|
2117
2117
|
async waitForInit(initial) {
|
|
2118
|
-
|
|
2118
|
+
backtest$1.loggerService.debug(PERSIST_BASE_METHOD_NAME_WAIT_FOR_INIT, {
|
|
2119
2119
|
entityName: this.entityName,
|
|
2120
2120
|
initial,
|
|
2121
2121
|
});
|
|
@@ -2132,7 +2132,7 @@ const PersistBase = makeExtendable(class {
|
|
|
2132
2132
|
return length;
|
|
2133
2133
|
}
|
|
2134
2134
|
async readValue(entityId) {
|
|
2135
|
-
|
|
2135
|
+
backtest$1.loggerService.debug(PERSIST_BASE_METHOD_NAME_READ_VALUE, {
|
|
2136
2136
|
entityName: this.entityName,
|
|
2137
2137
|
entityId,
|
|
2138
2138
|
});
|
|
@@ -2149,7 +2149,7 @@ const PersistBase = makeExtendable(class {
|
|
|
2149
2149
|
}
|
|
2150
2150
|
}
|
|
2151
2151
|
async hasValue(entityId) {
|
|
2152
|
-
|
|
2152
|
+
backtest$1.loggerService.debug(PERSIST_BASE_METHOD_NAME_HAS_VALUE, {
|
|
2153
2153
|
entityName: this.entityName,
|
|
2154
2154
|
entityId,
|
|
2155
2155
|
});
|
|
@@ -2166,7 +2166,7 @@ const PersistBase = makeExtendable(class {
|
|
|
2166
2166
|
}
|
|
2167
2167
|
}
|
|
2168
2168
|
async writeValue(entityId, entity) {
|
|
2169
|
-
|
|
2169
|
+
backtest$1.loggerService.debug(PERSIST_BASE_METHOD_NAME_WRITE_VALUE, {
|
|
2170
2170
|
entityName: this.entityName,
|
|
2171
2171
|
entityId,
|
|
2172
2172
|
});
|
|
@@ -2187,7 +2187,7 @@ const PersistBase = makeExtendable(class {
|
|
|
2187
2187
|
* @throws Error if entity not found or deletion fails
|
|
2188
2188
|
*/
|
|
2189
2189
|
async removeValue(entityId) {
|
|
2190
|
-
|
|
2190
|
+
backtest$1.loggerService.debug(PERSIST_BASE_METHOD_NAME_REMOVE_VALUE, {
|
|
2191
2191
|
entityName: this.entityName,
|
|
2192
2192
|
entityId,
|
|
2193
2193
|
});
|
|
@@ -2209,7 +2209,7 @@ const PersistBase = makeExtendable(class {
|
|
|
2209
2209
|
* @throws Error if deletion fails
|
|
2210
2210
|
*/
|
|
2211
2211
|
async removeAll() {
|
|
2212
|
-
|
|
2212
|
+
backtest$1.loggerService.debug(PERSIST_BASE_METHOD_NAME_REMOVE_ALL, {
|
|
2213
2213
|
entityName: this.entityName,
|
|
2214
2214
|
});
|
|
2215
2215
|
try {
|
|
@@ -2231,7 +2231,7 @@ const PersistBase = makeExtendable(class {
|
|
|
2231
2231
|
* @throws Error if reading fails
|
|
2232
2232
|
*/
|
|
2233
2233
|
async *values() {
|
|
2234
|
-
|
|
2234
|
+
backtest$1.loggerService.debug(PERSIST_BASE_METHOD_NAME_VALUES, {
|
|
2235
2235
|
entityName: this.entityName,
|
|
2236
2236
|
});
|
|
2237
2237
|
try {
|
|
@@ -2260,7 +2260,7 @@ const PersistBase = makeExtendable(class {
|
|
|
2260
2260
|
* @throws Error if reading fails
|
|
2261
2261
|
*/
|
|
2262
2262
|
async *keys() {
|
|
2263
|
-
|
|
2263
|
+
backtest$1.loggerService.debug(PERSIST_BASE_METHOD_NAME_KEYS, {
|
|
2264
2264
|
entityName: this.entityName,
|
|
2265
2265
|
});
|
|
2266
2266
|
try {
|
|
@@ -2365,7 +2365,7 @@ class PersistSignalUtils {
|
|
|
2365
2365
|
* @returns Promise resolving to signal or null
|
|
2366
2366
|
*/
|
|
2367
2367
|
this.readSignalData = async (symbol, strategyName) => {
|
|
2368
|
-
|
|
2368
|
+
backtest$1.loggerService.info(PERSIST_SIGNAL_UTILS_METHOD_NAME_READ_DATA);
|
|
2369
2369
|
const key = `${symbol}:${strategyName}`;
|
|
2370
2370
|
const isInitial = !this.getSignalStorage.has(key);
|
|
2371
2371
|
const stateStorage = this.getSignalStorage(symbol, strategyName);
|
|
@@ -2387,7 +2387,7 @@ class PersistSignalUtils {
|
|
|
2387
2387
|
* @returns Promise that resolves when write is complete
|
|
2388
2388
|
*/
|
|
2389
2389
|
this.writeSignalData = async (signalRow, symbol, strategyName) => {
|
|
2390
|
-
|
|
2390
|
+
backtest$1.loggerService.info(PERSIST_SIGNAL_UTILS_METHOD_NAME_WRITE_DATA);
|
|
2391
2391
|
const key = `${symbol}:${strategyName}`;
|
|
2392
2392
|
const isInitial = !this.getSignalStorage.has(key);
|
|
2393
2393
|
const stateStorage = this.getSignalStorage(symbol, strategyName);
|
|
@@ -2410,7 +2410,7 @@ class PersistSignalUtils {
|
|
|
2410
2410
|
* ```
|
|
2411
2411
|
*/
|
|
2412
2412
|
usePersistSignalAdapter(Ctor) {
|
|
2413
|
-
|
|
2413
|
+
backtest$1.loggerService.info(PERSIST_SIGNAL_UTILS_METHOD_NAME_USE_PERSIST_SIGNAL_ADAPTER);
|
|
2414
2414
|
this.PersistSignalFactory = Ctor;
|
|
2415
2415
|
}
|
|
2416
2416
|
}
|
|
@@ -2462,7 +2462,7 @@ class PersistRiskUtils {
|
|
|
2462
2462
|
* @returns Promise resolving to Map of active positions
|
|
2463
2463
|
*/
|
|
2464
2464
|
this.readPositionData = async (riskName) => {
|
|
2465
|
-
|
|
2465
|
+
backtest$1.loggerService.info(PERSIST_RISK_UTILS_METHOD_NAME_READ_DATA);
|
|
2466
2466
|
const isInitial = !this.getRiskStorage.has(riskName);
|
|
2467
2467
|
const stateStorage = this.getRiskStorage(riskName);
|
|
2468
2468
|
await stateStorage.waitForInit(isInitial);
|
|
@@ -2483,7 +2483,7 @@ class PersistRiskUtils {
|
|
|
2483
2483
|
* @returns Promise that resolves when write is complete
|
|
2484
2484
|
*/
|
|
2485
2485
|
this.writePositionData = async (riskRow, riskName) => {
|
|
2486
|
-
|
|
2486
|
+
backtest$1.loggerService.info(PERSIST_RISK_UTILS_METHOD_NAME_WRITE_DATA);
|
|
2487
2487
|
const isInitial = !this.getRiskStorage.has(riskName);
|
|
2488
2488
|
const stateStorage = this.getRiskStorage(riskName);
|
|
2489
2489
|
await stateStorage.waitForInit(isInitial);
|
|
@@ -2506,7 +2506,7 @@ class PersistRiskUtils {
|
|
|
2506
2506
|
* ```
|
|
2507
2507
|
*/
|
|
2508
2508
|
usePersistRiskAdapter(Ctor) {
|
|
2509
|
-
|
|
2509
|
+
backtest$1.loggerService.info(PERSIST_RISK_UTILS_METHOD_NAME_USE_PERSIST_RISK_ADAPTER);
|
|
2510
2510
|
this.PersistRiskFactory = Ctor;
|
|
2511
2511
|
}
|
|
2512
2512
|
}
|
|
@@ -2556,7 +2556,7 @@ class PersistScheduleUtils {
|
|
|
2556
2556
|
* @returns Promise resolving to scheduled signal or null
|
|
2557
2557
|
*/
|
|
2558
2558
|
this.readScheduleData = async (symbol, strategyName) => {
|
|
2559
|
-
|
|
2559
|
+
backtest$1.loggerService.info(PERSIST_SCHEDULE_UTILS_METHOD_NAME_READ_DATA);
|
|
2560
2560
|
const key = `${symbol}:${strategyName}`;
|
|
2561
2561
|
const isInitial = !this.getScheduleStorage.has(key);
|
|
2562
2562
|
const stateStorage = this.getScheduleStorage(symbol, strategyName);
|
|
@@ -2578,7 +2578,7 @@ class PersistScheduleUtils {
|
|
|
2578
2578
|
* @returns Promise that resolves when write is complete
|
|
2579
2579
|
*/
|
|
2580
2580
|
this.writeScheduleData = async (scheduledSignalRow, symbol, strategyName) => {
|
|
2581
|
-
|
|
2581
|
+
backtest$1.loggerService.info(PERSIST_SCHEDULE_UTILS_METHOD_NAME_WRITE_DATA);
|
|
2582
2582
|
const key = `${symbol}:${strategyName}`;
|
|
2583
2583
|
const isInitial = !this.getScheduleStorage.has(key);
|
|
2584
2584
|
const stateStorage = this.getScheduleStorage(symbol, strategyName);
|
|
@@ -2601,7 +2601,7 @@ class PersistScheduleUtils {
|
|
|
2601
2601
|
* ```
|
|
2602
2602
|
*/
|
|
2603
2603
|
usePersistScheduleAdapter(Ctor) {
|
|
2604
|
-
|
|
2604
|
+
backtest$1.loggerService.info(PERSIST_SCHEDULE_UTILS_METHOD_NAME_USE_PERSIST_SCHEDULE_ADAPTER);
|
|
2605
2605
|
this.PersistScheduleFactory = Ctor;
|
|
2606
2606
|
}
|
|
2607
2607
|
}
|
|
@@ -2651,7 +2651,7 @@ class PersistPartialUtils {
|
|
|
2651
2651
|
* @returns Promise resolving to partial data record
|
|
2652
2652
|
*/
|
|
2653
2653
|
this.readPartialData = async (symbol, strategyName) => {
|
|
2654
|
-
|
|
2654
|
+
backtest$1.loggerService.info(PERSIST_PARTIAL_UTILS_METHOD_NAME_READ_DATA);
|
|
2655
2655
|
const key = `${symbol}:${strategyName}`;
|
|
2656
2656
|
const isInitial = !this.getPartialStorage.has(key);
|
|
2657
2657
|
const stateStorage = this.getPartialStorage(symbol, strategyName);
|
|
@@ -2674,7 +2674,7 @@ class PersistPartialUtils {
|
|
|
2674
2674
|
* @returns Promise that resolves when write is complete
|
|
2675
2675
|
*/
|
|
2676
2676
|
this.writePartialData = async (partialData, symbol, strategyName) => {
|
|
2677
|
-
|
|
2677
|
+
backtest$1.loggerService.info(PERSIST_PARTIAL_UTILS_METHOD_NAME_WRITE_DATA);
|
|
2678
2678
|
const key = `${symbol}:${strategyName}`;
|
|
2679
2679
|
const isInitial = !this.getPartialStorage.has(key);
|
|
2680
2680
|
const stateStorage = this.getPartialStorage(symbol, strategyName);
|
|
@@ -2698,7 +2698,7 @@ class PersistPartialUtils {
|
|
|
2698
2698
|
* ```
|
|
2699
2699
|
*/
|
|
2700
2700
|
usePersistPartialAdapter(Ctor) {
|
|
2701
|
-
|
|
2701
|
+
backtest$1.loggerService.info(PERSIST_PARTIAL_UTILS_METHOD_NAME_USE_PERSIST_PARTIAL_ADAPTER);
|
|
2702
2702
|
this.PersistPartialFactory = Ctor;
|
|
2703
2703
|
}
|
|
2704
2704
|
}
|
|
@@ -3167,7 +3167,7 @@ const GET_SIGNAL_FN = trycatch(async (self) => {
|
|
|
3167
3167
|
error: errorData(error),
|
|
3168
3168
|
message: getErrorMessage(error),
|
|
3169
3169
|
};
|
|
3170
|
-
|
|
3170
|
+
backtest$1.loggerService.warn(message, payload);
|
|
3171
3171
|
console.warn(message, payload);
|
|
3172
3172
|
errorEmitter.next(error);
|
|
3173
3173
|
},
|
|
@@ -4347,7 +4347,7 @@ class MergeRisk {
|
|
|
4347
4347
|
* @returns Promise resolving to true if all risks approve, false if any risk rejects
|
|
4348
4348
|
*/
|
|
4349
4349
|
async checkSignal(params) {
|
|
4350
|
-
|
|
4350
|
+
backtest$1.loggerService.info("MergeRisk checkSignal", {
|
|
4351
4351
|
params,
|
|
4352
4352
|
});
|
|
4353
4353
|
const riskCheck = await Promise.all(this._riskList.map(async (risk) => await risk.checkSignal(params)));
|
|
@@ -4364,7 +4364,7 @@ class MergeRisk {
|
|
|
4364
4364
|
* @returns Promise that resolves when all risks have registered the signal
|
|
4365
4365
|
*/
|
|
4366
4366
|
async addSignal(symbol, context) {
|
|
4367
|
-
|
|
4367
|
+
backtest$1.loggerService.info("MergeRisk addSignal", {
|
|
4368
4368
|
symbol,
|
|
4369
4369
|
context,
|
|
4370
4370
|
});
|
|
@@ -4381,7 +4381,7 @@ class MergeRisk {
|
|
|
4381
4381
|
* @returns Promise that resolves when all risks have removed the signal
|
|
4382
4382
|
*/
|
|
4383
4383
|
async removeSignal(symbol, context) {
|
|
4384
|
-
|
|
4384
|
+
backtest$1.loggerService.info("MergeRisk removeSignal", {
|
|
4385
4385
|
symbol,
|
|
4386
4386
|
context,
|
|
4387
4387
|
});
|
|
@@ -4450,18 +4450,18 @@ class RiskUtils {
|
|
|
4450
4450
|
* ```
|
|
4451
4451
|
*/
|
|
4452
4452
|
this.getData = async (symbol, strategyName, backtest) => {
|
|
4453
|
-
|
|
4453
|
+
backtest$1.loggerService.info(RISK_METHOD_NAME_GET_DATA, {
|
|
4454
4454
|
symbol,
|
|
4455
4455
|
strategyName,
|
|
4456
4456
|
});
|
|
4457
|
-
|
|
4457
|
+
backtest$1.strategyValidationService.validate(strategyName, RISK_METHOD_NAME_GET_DATA);
|
|
4458
4458
|
{
|
|
4459
|
-
const { riskName, riskList } =
|
|
4459
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
4460
4460
|
riskName &&
|
|
4461
|
-
|
|
4462
|
-
riskList && riskList.forEach((riskName) =>
|
|
4461
|
+
backtest$1.riskValidationService.validate(riskName, RISK_METHOD_NAME_GET_DATA);
|
|
4462
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, RISK_METHOD_NAME_GET_DATA));
|
|
4463
4463
|
}
|
|
4464
|
-
return await
|
|
4464
|
+
return await backtest$1.riskMarkdownService.getData(symbol, strategyName, backtest);
|
|
4465
4465
|
};
|
|
4466
4466
|
/**
|
|
4467
4467
|
* Generates markdown report with all risk rejection events for a symbol-strategy pair.
|
|
@@ -4505,18 +4505,18 @@ class RiskUtils {
|
|
|
4505
4505
|
* ```
|
|
4506
4506
|
*/
|
|
4507
4507
|
this.getReport = async (symbol, strategyName, backtest, columns) => {
|
|
4508
|
-
|
|
4508
|
+
backtest$1.loggerService.info(RISK_METHOD_NAME_GET_REPORT, {
|
|
4509
4509
|
symbol,
|
|
4510
4510
|
strategyName,
|
|
4511
4511
|
});
|
|
4512
|
-
|
|
4512
|
+
backtest$1.strategyValidationService.validate(strategyName, RISK_METHOD_NAME_GET_REPORT);
|
|
4513
4513
|
{
|
|
4514
|
-
const { riskName, riskList } =
|
|
4514
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
4515
4515
|
riskName &&
|
|
4516
|
-
|
|
4517
|
-
riskList && riskList.forEach((riskName) =>
|
|
4516
|
+
backtest$1.riskValidationService.validate(riskName, RISK_METHOD_NAME_GET_REPORT);
|
|
4517
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, RISK_METHOD_NAME_GET_REPORT));
|
|
4518
4518
|
}
|
|
4519
|
-
return await
|
|
4519
|
+
return await backtest$1.riskMarkdownService.getReport(symbol, strategyName, backtest, columns);
|
|
4520
4520
|
};
|
|
4521
4521
|
/**
|
|
4522
4522
|
* Generates and saves markdown report to file.
|
|
@@ -4551,19 +4551,19 @@ class RiskUtils {
|
|
|
4551
4551
|
* ```
|
|
4552
4552
|
*/
|
|
4553
4553
|
this.dump = async (symbol, strategyName, backtest, path, columns) => {
|
|
4554
|
-
|
|
4554
|
+
backtest$1.loggerService.info(RISK_METHOD_NAME_DUMP, {
|
|
4555
4555
|
symbol,
|
|
4556
4556
|
strategyName,
|
|
4557
4557
|
path,
|
|
4558
4558
|
});
|
|
4559
|
-
|
|
4559
|
+
backtest$1.strategyValidationService.validate(strategyName, RISK_METHOD_NAME_DUMP);
|
|
4560
4560
|
{
|
|
4561
|
-
const { riskName, riskList } =
|
|
4561
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
4562
4562
|
riskName &&
|
|
4563
|
-
|
|
4564
|
-
riskList && riskList.forEach((riskName) =>
|
|
4563
|
+
backtest$1.riskValidationService.validate(riskName, RISK_METHOD_NAME_DUMP);
|
|
4564
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, RISK_METHOD_NAME_DUMP));
|
|
4565
4565
|
}
|
|
4566
|
-
await
|
|
4566
|
+
await backtest$1.riskMarkdownService.dump(symbol, strategyName, backtest, path, columns);
|
|
4567
4567
|
};
|
|
4568
4568
|
}
|
|
4569
4569
|
}
|
|
@@ -5181,7 +5181,7 @@ const DO_VALIDATION_FN = trycatch(async (validation, params) => {
|
|
|
5181
5181
|
error: errorData(error),
|
|
5182
5182
|
message: getErrorMessage(error),
|
|
5183
5183
|
};
|
|
5184
|
-
|
|
5184
|
+
backtest$1.loggerService.warn(message, payload);
|
|
5185
5185
|
console.warn(message, payload);
|
|
5186
5186
|
validationSubject.next(error);
|
|
5187
5187
|
},
|
|
@@ -6439,6 +6439,13 @@ class WalkerSchemaService {
|
|
|
6439
6439
|
if (walkerSchema.strategies.length === 0) {
|
|
6440
6440
|
throw new Error(`walker schema validation failed: strategies array cannot be empty for walkerName=${walkerSchema.walkerName}`);
|
|
6441
6441
|
}
|
|
6442
|
+
if (walkerSchema.strategies &&
|
|
6443
|
+
walkerSchema.strategies.length !== new Set(walkerSchema.strategies).size) {
|
|
6444
|
+
throw new Error(`walker schema validation failed: found duplicate strategies for walkerName=${walkerSchema.walkerName} strategies=[${walkerSchema.strategies}]`);
|
|
6445
|
+
}
|
|
6446
|
+
if (walkerSchema.strategies?.some((value) => typeof value !== "string")) {
|
|
6447
|
+
throw new Error(`walker schema validation failed: invalid strategies for walkerName=${walkerSchema.walkerName} strategies=[${walkerSchema.strategies}]`);
|
|
6448
|
+
}
|
|
6442
6449
|
};
|
|
6443
6450
|
/**
|
|
6444
6451
|
* Overrides an existing walker schema with partial updates.
|
|
@@ -13652,7 +13659,7 @@ const backtest = {
|
|
|
13652
13659
|
...templateServices,
|
|
13653
13660
|
};
|
|
13654
13661
|
init();
|
|
13655
|
-
var
|
|
13662
|
+
var backtest$1 = backtest;
|
|
13656
13663
|
|
|
13657
13664
|
/**
|
|
13658
13665
|
* Sets custom logger implementation for the framework.
|
|
@@ -13672,7 +13679,7 @@ var bt = backtest;
|
|
|
13672
13679
|
* ```
|
|
13673
13680
|
*/
|
|
13674
13681
|
function setLogger(logger) {
|
|
13675
|
-
|
|
13682
|
+
backtest$1.loggerService.setLogger(logger);
|
|
13676
13683
|
}
|
|
13677
13684
|
/**
|
|
13678
13685
|
* Sets global configuration parameters for the framework.
|
|
@@ -13690,7 +13697,7 @@ function setConfig(config, _unsafe) {
|
|
|
13690
13697
|
const prevConfig = Object.assign({}, GLOBAL_CONFIG);
|
|
13691
13698
|
try {
|
|
13692
13699
|
Object.assign(GLOBAL_CONFIG, config);
|
|
13693
|
-
!_unsafe &&
|
|
13700
|
+
!_unsafe && backtest$1.configValidationService.validate();
|
|
13694
13701
|
}
|
|
13695
13702
|
catch (error) {
|
|
13696
13703
|
console.warn(`backtest-kit setConfig failed: ${getErrorMessage(error)}`, config);
|
|
@@ -13761,7 +13768,7 @@ function setColumns(columns, _unsafe) {
|
|
|
13761
13768
|
const prevConfig = Object.assign({}, COLUMN_CONFIG);
|
|
13762
13769
|
try {
|
|
13763
13770
|
Object.assign(COLUMN_CONFIG, columns);
|
|
13764
|
-
!_unsafe &&
|
|
13771
|
+
!_unsafe && backtest$1.columnValidationService.validate();
|
|
13765
13772
|
}
|
|
13766
13773
|
catch (error) {
|
|
13767
13774
|
console.warn(`backtest-kit setColumns failed: ${getErrorMessage(error)}`, columns);
|
|
@@ -13846,11 +13853,11 @@ const ADD_OPTIMIZER_METHOD_NAME = "add.addOptimizer";
|
|
|
13846
13853
|
* ```
|
|
13847
13854
|
*/
|
|
13848
13855
|
function addStrategy(strategySchema) {
|
|
13849
|
-
|
|
13856
|
+
backtest$1.loggerService.info(ADD_STRATEGY_METHOD_NAME, {
|
|
13850
13857
|
strategySchema,
|
|
13851
13858
|
});
|
|
13852
|
-
|
|
13853
|
-
|
|
13859
|
+
backtest$1.strategyValidationService.addStrategy(strategySchema.strategyName, strategySchema);
|
|
13860
|
+
backtest$1.strategySchemaService.register(strategySchema.strategyName, strategySchema);
|
|
13854
13861
|
}
|
|
13855
13862
|
/**
|
|
13856
13863
|
* Registers an exchange data source in the framework.
|
|
@@ -13888,11 +13895,11 @@ function addStrategy(strategySchema) {
|
|
|
13888
13895
|
* ```
|
|
13889
13896
|
*/
|
|
13890
13897
|
function addExchange(exchangeSchema) {
|
|
13891
|
-
|
|
13898
|
+
backtest$1.loggerService.info(ADD_EXCHANGE_METHOD_NAME, {
|
|
13892
13899
|
exchangeSchema,
|
|
13893
13900
|
});
|
|
13894
|
-
|
|
13895
|
-
|
|
13901
|
+
backtest$1.exchangeValidationService.addExchange(exchangeSchema.exchangeName, exchangeSchema);
|
|
13902
|
+
backtest$1.exchangeSchemaService.register(exchangeSchema.exchangeName, exchangeSchema);
|
|
13896
13903
|
}
|
|
13897
13904
|
/**
|
|
13898
13905
|
* Registers a timeframe generator for backtesting.
|
|
@@ -13925,11 +13932,11 @@ function addExchange(exchangeSchema) {
|
|
|
13925
13932
|
* ```
|
|
13926
13933
|
*/
|
|
13927
13934
|
function addFrame(frameSchema) {
|
|
13928
|
-
|
|
13935
|
+
backtest$1.loggerService.info(ADD_FRAME_METHOD_NAME, {
|
|
13929
13936
|
frameSchema,
|
|
13930
13937
|
});
|
|
13931
|
-
|
|
13932
|
-
|
|
13938
|
+
backtest$1.frameValidationService.addFrame(frameSchema.frameName, frameSchema);
|
|
13939
|
+
backtest$1.frameSchemaService.register(frameSchema.frameName, frameSchema);
|
|
13933
13940
|
}
|
|
13934
13941
|
/**
|
|
13935
13942
|
* Registers a walker for strategy comparison.
|
|
@@ -13969,11 +13976,11 @@ function addFrame(frameSchema) {
|
|
|
13969
13976
|
* ```
|
|
13970
13977
|
*/
|
|
13971
13978
|
function addWalker(walkerSchema) {
|
|
13972
|
-
|
|
13979
|
+
backtest$1.loggerService.info(ADD_WALKER_METHOD_NAME, {
|
|
13973
13980
|
walkerSchema,
|
|
13974
13981
|
});
|
|
13975
|
-
|
|
13976
|
-
|
|
13982
|
+
backtest$1.walkerValidationService.addWalker(walkerSchema.walkerName, walkerSchema);
|
|
13983
|
+
backtest$1.walkerSchemaService.register(walkerSchema.walkerName, walkerSchema);
|
|
13977
13984
|
}
|
|
13978
13985
|
/**
|
|
13979
13986
|
* Registers a position sizing configuration in the framework.
|
|
@@ -14028,11 +14035,11 @@ function addWalker(walkerSchema) {
|
|
|
14028
14035
|
* ```
|
|
14029
14036
|
*/
|
|
14030
14037
|
function addSizing(sizingSchema) {
|
|
14031
|
-
|
|
14038
|
+
backtest$1.loggerService.info(ADD_SIZING_METHOD_NAME, {
|
|
14032
14039
|
sizingSchema,
|
|
14033
14040
|
});
|
|
14034
|
-
|
|
14035
|
-
|
|
14041
|
+
backtest$1.sizingValidationService.addSizing(sizingSchema.sizingName, sizingSchema);
|
|
14042
|
+
backtest$1.sizingSchemaService.register(sizingSchema.sizingName, sizingSchema);
|
|
14036
14043
|
}
|
|
14037
14044
|
/**
|
|
14038
14045
|
* Registers a risk management configuration in the framework.
|
|
@@ -14096,11 +14103,11 @@ function addSizing(sizingSchema) {
|
|
|
14096
14103
|
* ```
|
|
14097
14104
|
*/
|
|
14098
14105
|
function addRisk(riskSchema) {
|
|
14099
|
-
|
|
14106
|
+
backtest$1.loggerService.info(ADD_RISK_METHOD_NAME, {
|
|
14100
14107
|
riskSchema,
|
|
14101
14108
|
});
|
|
14102
|
-
|
|
14103
|
-
|
|
14109
|
+
backtest$1.riskValidationService.addRisk(riskSchema.riskName, riskSchema);
|
|
14110
|
+
backtest$1.riskSchemaService.register(riskSchema.riskName, riskSchema);
|
|
14104
14111
|
}
|
|
14105
14112
|
/**
|
|
14106
14113
|
* Registers an optimizer configuration in the framework.
|
|
@@ -14190,11 +14197,11 @@ function addRisk(riskSchema) {
|
|
|
14190
14197
|
* ```
|
|
14191
14198
|
*/
|
|
14192
14199
|
function addOptimizer(optimizerSchema) {
|
|
14193
|
-
|
|
14200
|
+
backtest$1.loggerService.info(ADD_OPTIMIZER_METHOD_NAME, {
|
|
14194
14201
|
optimizerSchema,
|
|
14195
14202
|
});
|
|
14196
|
-
|
|
14197
|
-
|
|
14203
|
+
backtest$1.optimizerValidationService.addOptimizer(optimizerSchema.optimizerName, optimizerSchema);
|
|
14204
|
+
backtest$1.optimizerSchemaService.register(optimizerSchema.optimizerName, optimizerSchema);
|
|
14198
14205
|
}
|
|
14199
14206
|
|
|
14200
14207
|
const LIST_EXCHANGES_METHOD_NAME = "list.listExchanges";
|
|
@@ -14230,8 +14237,8 @@ const LIST_OPTIMIZERS_METHOD_NAME = "list.listOptimizers";
|
|
|
14230
14237
|
* ```
|
|
14231
14238
|
*/
|
|
14232
14239
|
async function listExchanges() {
|
|
14233
|
-
|
|
14234
|
-
return await
|
|
14240
|
+
backtest$1.loggerService.log(LIST_EXCHANGES_METHOD_NAME);
|
|
14241
|
+
return await backtest$1.exchangeValidationService.list();
|
|
14235
14242
|
}
|
|
14236
14243
|
/**
|
|
14237
14244
|
* Returns a list of all registered strategy schemas.
|
|
@@ -14264,8 +14271,8 @@ async function listExchanges() {
|
|
|
14264
14271
|
* ```
|
|
14265
14272
|
*/
|
|
14266
14273
|
async function listStrategies() {
|
|
14267
|
-
|
|
14268
|
-
return await
|
|
14274
|
+
backtest$1.loggerService.log(LIST_STRATEGIES_METHOD_NAME);
|
|
14275
|
+
return await backtest$1.strategyValidationService.list();
|
|
14269
14276
|
}
|
|
14270
14277
|
/**
|
|
14271
14278
|
* Returns a list of all registered frame schemas.
|
|
@@ -14293,8 +14300,8 @@ async function listStrategies() {
|
|
|
14293
14300
|
* ```
|
|
14294
14301
|
*/
|
|
14295
14302
|
async function listFrames() {
|
|
14296
|
-
|
|
14297
|
-
return await
|
|
14303
|
+
backtest$1.loggerService.log(LIST_FRAMES_METHOD_NAME);
|
|
14304
|
+
return await backtest$1.frameValidationService.list();
|
|
14298
14305
|
}
|
|
14299
14306
|
/**
|
|
14300
14307
|
* Returns a list of all registered walker schemas.
|
|
@@ -14323,8 +14330,8 @@ async function listFrames() {
|
|
|
14323
14330
|
* ```
|
|
14324
14331
|
*/
|
|
14325
14332
|
async function listWalkers() {
|
|
14326
|
-
|
|
14327
|
-
return await
|
|
14333
|
+
backtest$1.loggerService.log(LIST_WALKERS_METHOD_NAME);
|
|
14334
|
+
return await backtest$1.walkerValidationService.list();
|
|
14328
14335
|
}
|
|
14329
14336
|
/**
|
|
14330
14337
|
* Returns a list of all registered sizing schemas.
|
|
@@ -14362,8 +14369,8 @@ async function listWalkers() {
|
|
|
14362
14369
|
* ```
|
|
14363
14370
|
*/
|
|
14364
14371
|
async function listSizings() {
|
|
14365
|
-
|
|
14366
|
-
return await
|
|
14372
|
+
backtest$1.loggerService.log(LIST_SIZINGS_METHOD_NAME);
|
|
14373
|
+
return await backtest$1.sizingValidationService.list();
|
|
14367
14374
|
}
|
|
14368
14375
|
/**
|
|
14369
14376
|
* Returns a list of all registered risk schemas.
|
|
@@ -14398,8 +14405,8 @@ async function listSizings() {
|
|
|
14398
14405
|
* ```
|
|
14399
14406
|
*/
|
|
14400
14407
|
async function listRisks() {
|
|
14401
|
-
|
|
14402
|
-
return await
|
|
14408
|
+
backtest$1.loggerService.log(LIST_RISKS_METHOD_NAME);
|
|
14409
|
+
return await backtest$1.riskValidationService.list();
|
|
14403
14410
|
}
|
|
14404
14411
|
/**
|
|
14405
14412
|
* Returns a list of all registered optimizer schemas.
|
|
@@ -14438,8 +14445,8 @@ async function listRisks() {
|
|
|
14438
14445
|
* ```
|
|
14439
14446
|
*/
|
|
14440
14447
|
async function listOptimizers() {
|
|
14441
|
-
|
|
14442
|
-
return await
|
|
14448
|
+
backtest$1.loggerService.log(LIST_OPTIMIZERS_METHOD_NAME);
|
|
14449
|
+
return await backtest$1.optimizerValidationService.list();
|
|
14443
14450
|
}
|
|
14444
14451
|
|
|
14445
14452
|
const LISTEN_SIGNAL_METHOD_NAME = "event.listenSignal";
|
|
@@ -14496,7 +14503,7 @@ const LISTEN_RISK_ONCE_METHOD_NAME = "event.listenRiskOnce";
|
|
|
14496
14503
|
* ```
|
|
14497
14504
|
*/
|
|
14498
14505
|
function listenSignal(fn) {
|
|
14499
|
-
|
|
14506
|
+
backtest$1.loggerService.log(LISTEN_SIGNAL_METHOD_NAME);
|
|
14500
14507
|
return signalEmitter.subscribe(queued(async (event) => fn(event)));
|
|
14501
14508
|
}
|
|
14502
14509
|
/**
|
|
@@ -14532,7 +14539,7 @@ function listenSignal(fn) {
|
|
|
14532
14539
|
* ```
|
|
14533
14540
|
*/
|
|
14534
14541
|
function listenSignalOnce(filterFn, fn) {
|
|
14535
|
-
|
|
14542
|
+
backtest$1.loggerService.log(LISTEN_SIGNAL_ONCE_METHOD_NAME);
|
|
14536
14543
|
return signalEmitter.filter(filterFn).once(fn);
|
|
14537
14544
|
}
|
|
14538
14545
|
/**
|
|
@@ -14556,7 +14563,7 @@ function listenSignalOnce(filterFn, fn) {
|
|
|
14556
14563
|
* ```
|
|
14557
14564
|
*/
|
|
14558
14565
|
function listenSignalLive(fn) {
|
|
14559
|
-
|
|
14566
|
+
backtest$1.loggerService.log(LISTEN_SIGNAL_LIVE_METHOD_NAME);
|
|
14560
14567
|
return signalLiveEmitter.subscribe(queued(async (event) => fn(event)));
|
|
14561
14568
|
}
|
|
14562
14569
|
/**
|
|
@@ -14581,7 +14588,7 @@ function listenSignalLive(fn) {
|
|
|
14581
14588
|
* ```
|
|
14582
14589
|
*/
|
|
14583
14590
|
function listenSignalLiveOnce(filterFn, fn) {
|
|
14584
|
-
|
|
14591
|
+
backtest$1.loggerService.log(LISTEN_SIGNAL_LIVE_ONCE_METHOD_NAME);
|
|
14585
14592
|
return signalLiveEmitter.filter(filterFn).once(fn);
|
|
14586
14593
|
}
|
|
14587
14594
|
/**
|
|
@@ -14605,7 +14612,7 @@ function listenSignalLiveOnce(filterFn, fn) {
|
|
|
14605
14612
|
* ```
|
|
14606
14613
|
*/
|
|
14607
14614
|
function listenSignalBacktest(fn) {
|
|
14608
|
-
|
|
14615
|
+
backtest$1.loggerService.log(LISTEN_SIGNAL_BACKTEST_METHOD_NAME);
|
|
14609
14616
|
return signalBacktestEmitter.subscribe(queued(async (event) => fn(event)));
|
|
14610
14617
|
}
|
|
14611
14618
|
/**
|
|
@@ -14630,7 +14637,7 @@ function listenSignalBacktest(fn) {
|
|
|
14630
14637
|
* ```
|
|
14631
14638
|
*/
|
|
14632
14639
|
function listenSignalBacktestOnce(filterFn, fn) {
|
|
14633
|
-
|
|
14640
|
+
backtest$1.loggerService.log(LISTEN_SIGNAL_BACKTEST_ONCE_METHOD_NAME);
|
|
14634
14641
|
return signalBacktestEmitter.filter(filterFn).once(fn);
|
|
14635
14642
|
}
|
|
14636
14643
|
/**
|
|
@@ -14658,7 +14665,7 @@ function listenSignalBacktestOnce(filterFn, fn) {
|
|
|
14658
14665
|
* ```
|
|
14659
14666
|
*/
|
|
14660
14667
|
function listenError(fn) {
|
|
14661
|
-
|
|
14668
|
+
backtest$1.loggerService.log(LISTEN_ERROR_METHOD_NAME);
|
|
14662
14669
|
return errorEmitter.subscribe(queued(async (error) => fn(error)));
|
|
14663
14670
|
}
|
|
14664
14671
|
/**
|
|
@@ -14686,7 +14693,7 @@ function listenError(fn) {
|
|
|
14686
14693
|
* ```
|
|
14687
14694
|
*/
|
|
14688
14695
|
function listenExit(fn) {
|
|
14689
|
-
|
|
14696
|
+
backtest$1.loggerService.log(LISTEN_EXIT_METHOD_NAME);
|
|
14690
14697
|
return exitEmitter.subscribe(queued(async (error) => fn(error)));
|
|
14691
14698
|
}
|
|
14692
14699
|
/**
|
|
@@ -14717,7 +14724,7 @@ function listenExit(fn) {
|
|
|
14717
14724
|
* ```
|
|
14718
14725
|
*/
|
|
14719
14726
|
function listenDoneLive(fn) {
|
|
14720
|
-
|
|
14727
|
+
backtest$1.loggerService.log(LISTEN_DONE_LIVE_METHOD_NAME);
|
|
14721
14728
|
return doneLiveSubject.subscribe(queued(async (event) => fn(event)));
|
|
14722
14729
|
}
|
|
14723
14730
|
/**
|
|
@@ -14747,7 +14754,7 @@ function listenDoneLive(fn) {
|
|
|
14747
14754
|
* ```
|
|
14748
14755
|
*/
|
|
14749
14756
|
function listenDoneLiveOnce(filterFn, fn) {
|
|
14750
|
-
|
|
14757
|
+
backtest$1.loggerService.log(LISTEN_DONE_LIVE_ONCE_METHOD_NAME);
|
|
14751
14758
|
return doneLiveSubject.filter(filterFn).once(fn);
|
|
14752
14759
|
}
|
|
14753
14760
|
/**
|
|
@@ -14779,7 +14786,7 @@ function listenDoneLiveOnce(filterFn, fn) {
|
|
|
14779
14786
|
* ```
|
|
14780
14787
|
*/
|
|
14781
14788
|
function listenDoneBacktest(fn) {
|
|
14782
|
-
|
|
14789
|
+
backtest$1.loggerService.log(LISTEN_DONE_BACKTEST_METHOD_NAME);
|
|
14783
14790
|
return doneBacktestSubject.subscribe(queued(async (event) => fn(event)));
|
|
14784
14791
|
}
|
|
14785
14792
|
/**
|
|
@@ -14810,7 +14817,7 @@ function listenDoneBacktest(fn) {
|
|
|
14810
14817
|
* ```
|
|
14811
14818
|
*/
|
|
14812
14819
|
function listenDoneBacktestOnce(filterFn, fn) {
|
|
14813
|
-
|
|
14820
|
+
backtest$1.loggerService.log(LISTEN_DONE_BACKTEST_ONCE_METHOD_NAME);
|
|
14814
14821
|
return doneBacktestSubject.filter(filterFn).once(fn);
|
|
14815
14822
|
}
|
|
14816
14823
|
/**
|
|
@@ -14840,7 +14847,7 @@ function listenDoneBacktestOnce(filterFn, fn) {
|
|
|
14840
14847
|
* ```
|
|
14841
14848
|
*/
|
|
14842
14849
|
function listenDoneWalker(fn) {
|
|
14843
|
-
|
|
14850
|
+
backtest$1.loggerService.log(LISTEN_DONE_WALKER_METHOD_NAME);
|
|
14844
14851
|
return doneWalkerSubject.subscribe(queued(async (event) => fn(event)));
|
|
14845
14852
|
}
|
|
14846
14853
|
/**
|
|
@@ -14869,7 +14876,7 @@ function listenDoneWalker(fn) {
|
|
|
14869
14876
|
* ```
|
|
14870
14877
|
*/
|
|
14871
14878
|
function listenDoneWalkerOnce(filterFn, fn) {
|
|
14872
|
-
|
|
14879
|
+
backtest$1.loggerService.log(LISTEN_DONE_WALKER_ONCE_METHOD_NAME);
|
|
14873
14880
|
return doneWalkerSubject.filter(filterFn).once(fn);
|
|
14874
14881
|
}
|
|
14875
14882
|
/**
|
|
@@ -14903,7 +14910,7 @@ function listenDoneWalkerOnce(filterFn, fn) {
|
|
|
14903
14910
|
* ```
|
|
14904
14911
|
*/
|
|
14905
14912
|
function listenBacktestProgress(fn) {
|
|
14906
|
-
|
|
14913
|
+
backtest$1.loggerService.log(LISTEN_PROGRESS_METHOD_NAME);
|
|
14907
14914
|
return progressBacktestEmitter.subscribe(queued(async (event) => fn(event)));
|
|
14908
14915
|
}
|
|
14909
14916
|
/**
|
|
@@ -14937,7 +14944,7 @@ function listenBacktestProgress(fn) {
|
|
|
14937
14944
|
* ```
|
|
14938
14945
|
*/
|
|
14939
14946
|
function listenWalkerProgress(fn) {
|
|
14940
|
-
|
|
14947
|
+
backtest$1.loggerService.log(LISTEN_PROGRESS_WALKER_METHOD_NAME);
|
|
14941
14948
|
return progressWalkerEmitter.subscribe(queued(async (event) => fn(event)));
|
|
14942
14949
|
}
|
|
14943
14950
|
/**
|
|
@@ -14965,7 +14972,7 @@ function listenWalkerProgress(fn) {
|
|
|
14965
14972
|
* ```
|
|
14966
14973
|
*/
|
|
14967
14974
|
function listenOptimizerProgress(fn) {
|
|
14968
|
-
|
|
14975
|
+
backtest$1.loggerService.log(LISTEN_PROGRESS_OPTIMIZER_METHOD_NAME);
|
|
14969
14976
|
return progressOptimizerEmitter.subscribe(queued(async (event) => fn(event)));
|
|
14970
14977
|
}
|
|
14971
14978
|
/**
|
|
@@ -15001,7 +15008,7 @@ function listenOptimizerProgress(fn) {
|
|
|
15001
15008
|
* ```
|
|
15002
15009
|
*/
|
|
15003
15010
|
function listenPerformance(fn) {
|
|
15004
|
-
|
|
15011
|
+
backtest$1.loggerService.log(LISTEN_PERFORMANCE_METHOD_NAME);
|
|
15005
15012
|
return performanceEmitter.subscribe(queued(async (event) => fn(event)));
|
|
15006
15013
|
}
|
|
15007
15014
|
/**
|
|
@@ -15035,7 +15042,7 @@ function listenPerformance(fn) {
|
|
|
15035
15042
|
* ```
|
|
15036
15043
|
*/
|
|
15037
15044
|
function listenWalker(fn) {
|
|
15038
|
-
|
|
15045
|
+
backtest$1.loggerService.log(LISTEN_WALKER_METHOD_NAME);
|
|
15039
15046
|
return walkerEmitter.subscribe(queued(async (event) => fn(event)));
|
|
15040
15047
|
}
|
|
15041
15048
|
/**
|
|
@@ -15078,7 +15085,7 @@ function listenWalker(fn) {
|
|
|
15078
15085
|
* ```
|
|
15079
15086
|
*/
|
|
15080
15087
|
function listenWalkerOnce(filterFn, fn) {
|
|
15081
|
-
|
|
15088
|
+
backtest$1.loggerService.log(LISTEN_WALKER_ONCE_METHOD_NAME);
|
|
15082
15089
|
return walkerEmitter.filter(filterFn).once(fn);
|
|
15083
15090
|
}
|
|
15084
15091
|
/**
|
|
@@ -15113,7 +15120,7 @@ function listenWalkerOnce(filterFn, fn) {
|
|
|
15113
15120
|
* ```
|
|
15114
15121
|
*/
|
|
15115
15122
|
function listenWalkerComplete(fn) {
|
|
15116
|
-
|
|
15123
|
+
backtest$1.loggerService.log(LISTEN_WALKER_COMPLETE_METHOD_NAME);
|
|
15117
15124
|
return walkerCompleteSubject.subscribe(queued(async (event) => fn(event)));
|
|
15118
15125
|
}
|
|
15119
15126
|
/**
|
|
@@ -15141,7 +15148,7 @@ function listenWalkerComplete(fn) {
|
|
|
15141
15148
|
* ```
|
|
15142
15149
|
*/
|
|
15143
15150
|
function listenValidation(fn) {
|
|
15144
|
-
|
|
15151
|
+
backtest$1.loggerService.log(LISTEN_VALIDATION_METHOD_NAME);
|
|
15145
15152
|
return validationSubject.subscribe(queued(async (error) => fn(error)));
|
|
15146
15153
|
}
|
|
15147
15154
|
/**
|
|
@@ -15169,7 +15176,7 @@ function listenValidation(fn) {
|
|
|
15169
15176
|
* ```
|
|
15170
15177
|
*/
|
|
15171
15178
|
function listenPartialProfit(fn) {
|
|
15172
|
-
|
|
15179
|
+
backtest$1.loggerService.log(LISTEN_PARTIAL_PROFIT_METHOD_NAME);
|
|
15173
15180
|
return partialProfitSubject.subscribe(queued(async (event) => fn(event)));
|
|
15174
15181
|
}
|
|
15175
15182
|
/**
|
|
@@ -15203,7 +15210,7 @@ function listenPartialProfit(fn) {
|
|
|
15203
15210
|
* ```
|
|
15204
15211
|
*/
|
|
15205
15212
|
function listenPartialProfitOnce(filterFn, fn) {
|
|
15206
|
-
|
|
15213
|
+
backtest$1.loggerService.log(LISTEN_PARTIAL_PROFIT_ONCE_METHOD_NAME);
|
|
15207
15214
|
return partialProfitSubject.filter(filterFn).once(fn);
|
|
15208
15215
|
}
|
|
15209
15216
|
/**
|
|
@@ -15231,7 +15238,7 @@ function listenPartialProfitOnce(filterFn, fn) {
|
|
|
15231
15238
|
* ```
|
|
15232
15239
|
*/
|
|
15233
15240
|
function listenPartialLoss(fn) {
|
|
15234
|
-
|
|
15241
|
+
backtest$1.loggerService.log(LISTEN_PARTIAL_LOSS_METHOD_NAME);
|
|
15235
15242
|
return partialLossSubject.subscribe(queued(async (event) => fn(event)));
|
|
15236
15243
|
}
|
|
15237
15244
|
/**
|
|
@@ -15265,7 +15272,7 @@ function listenPartialLoss(fn) {
|
|
|
15265
15272
|
* ```
|
|
15266
15273
|
*/
|
|
15267
15274
|
function listenPartialLossOnce(filterFn, fn) {
|
|
15268
|
-
|
|
15275
|
+
backtest$1.loggerService.log(LISTEN_PARTIAL_LOSS_ONCE_METHOD_NAME);
|
|
15269
15276
|
return partialLossSubject.filter(filterFn).once(fn);
|
|
15270
15277
|
}
|
|
15271
15278
|
/**
|
|
@@ -15297,7 +15304,7 @@ function listenPartialLossOnce(filterFn, fn) {
|
|
|
15297
15304
|
* ```
|
|
15298
15305
|
*/
|
|
15299
15306
|
function listenRisk(fn) {
|
|
15300
|
-
|
|
15307
|
+
backtest$1.loggerService.log(LISTEN_RISK_METHOD_NAME);
|
|
15301
15308
|
return riskSubject.subscribe(queued(async (event) => fn(event)));
|
|
15302
15309
|
}
|
|
15303
15310
|
/**
|
|
@@ -15334,7 +15341,7 @@ function listenRisk(fn) {
|
|
|
15334
15341
|
* ```
|
|
15335
15342
|
*/
|
|
15336
15343
|
function listenRiskOnce(filterFn, fn) {
|
|
15337
|
-
|
|
15344
|
+
backtest$1.loggerService.log(LISTEN_RISK_ONCE_METHOD_NAME);
|
|
15338
15345
|
return riskSubject.filter(filterFn).once(fn);
|
|
15339
15346
|
}
|
|
15340
15347
|
|
|
@@ -15344,6 +15351,31 @@ const FORMAT_PRICE_METHOD_NAME = "exchange.formatPrice";
|
|
|
15344
15351
|
const FORMAT_QUANTITY_METHOD_NAME = "exchange.formatQuantity";
|
|
15345
15352
|
const GET_DATE_METHOD_NAME = "exchange.getDate";
|
|
15346
15353
|
const GET_MODE_METHOD_NAME = "exchange.getMode";
|
|
15354
|
+
const HAS_TRADE_CONTEXT_METHOD_NAME = "exchange.hasTradeContext";
|
|
15355
|
+
/**
|
|
15356
|
+
* Checks if trade context is active (execution and method contexts).
|
|
15357
|
+
*
|
|
15358
|
+
* Returns true when both contexts are active, which is required for calling
|
|
15359
|
+
* exchange functions like getCandles, getAveragePrice, formatPrice, formatQuantity,
|
|
15360
|
+
* getDate, and getMode.
|
|
15361
|
+
*
|
|
15362
|
+
* @returns true if trade context is active, false otherwise
|
|
15363
|
+
*
|
|
15364
|
+
* @example
|
|
15365
|
+
* ```typescript
|
|
15366
|
+
* import { hasTradeContext, getCandles } from "backtest-kit";
|
|
15367
|
+
*
|
|
15368
|
+
* if (hasTradeContext()) {
|
|
15369
|
+
* const candles = await getCandles("BTCUSDT", "1m", 100);
|
|
15370
|
+
* } else {
|
|
15371
|
+
* console.log("Trade context not active");
|
|
15372
|
+
* }
|
|
15373
|
+
* ```
|
|
15374
|
+
*/
|
|
15375
|
+
function hasTradeContext() {
|
|
15376
|
+
backtest$1.loggerService.info(HAS_TRADE_CONTEXT_METHOD_NAME);
|
|
15377
|
+
return ExecutionContextService.hasContext() && MethodContextService.hasContext();
|
|
15378
|
+
}
|
|
15347
15379
|
/**
|
|
15348
15380
|
* Fetches historical candle data from the registered exchange.
|
|
15349
15381
|
*
|
|
@@ -15362,12 +15394,18 @@ const GET_MODE_METHOD_NAME = "exchange.getMode";
|
|
|
15362
15394
|
* ```
|
|
15363
15395
|
*/
|
|
15364
15396
|
async function getCandles(symbol, interval, limit) {
|
|
15365
|
-
|
|
15397
|
+
backtest$1.loggerService.info(GET_CANDLES_METHOD_NAME, {
|
|
15366
15398
|
symbol,
|
|
15367
15399
|
interval,
|
|
15368
15400
|
limit,
|
|
15369
15401
|
});
|
|
15370
|
-
|
|
15402
|
+
if (!ExecutionContextService.hasContext()) {
|
|
15403
|
+
throw new Error("getCandles requires an execution context");
|
|
15404
|
+
}
|
|
15405
|
+
if (!MethodContextService.hasContext()) {
|
|
15406
|
+
throw new Error("getCandles requires a method context");
|
|
15407
|
+
}
|
|
15408
|
+
return await backtest$1.exchangeConnectionService.getCandles(symbol, interval, limit);
|
|
15371
15409
|
}
|
|
15372
15410
|
/**
|
|
15373
15411
|
* Calculates VWAP (Volume Weighted Average Price) for a symbol.
|
|
@@ -15388,10 +15426,16 @@ async function getCandles(symbol, interval, limit) {
|
|
|
15388
15426
|
* ```
|
|
15389
15427
|
*/
|
|
15390
15428
|
async function getAveragePrice(symbol) {
|
|
15391
|
-
|
|
15429
|
+
backtest$1.loggerService.info(GET_AVERAGE_PRICE_METHOD_NAME, {
|
|
15392
15430
|
symbol,
|
|
15393
15431
|
});
|
|
15394
|
-
|
|
15432
|
+
if (!ExecutionContextService.hasContext()) {
|
|
15433
|
+
throw new Error("getAveragePrice requires an execution context");
|
|
15434
|
+
}
|
|
15435
|
+
if (!MethodContextService.hasContext()) {
|
|
15436
|
+
throw new Error("getAveragePrice requires a method context");
|
|
15437
|
+
}
|
|
15438
|
+
return await backtest$1.exchangeConnectionService.getAveragePrice(symbol);
|
|
15395
15439
|
}
|
|
15396
15440
|
/**
|
|
15397
15441
|
* Formats a price value according to exchange rules.
|
|
@@ -15409,11 +15453,14 @@ async function getAveragePrice(symbol) {
|
|
|
15409
15453
|
* ```
|
|
15410
15454
|
*/
|
|
15411
15455
|
async function formatPrice(symbol, price) {
|
|
15412
|
-
|
|
15456
|
+
backtest$1.loggerService.info(FORMAT_PRICE_METHOD_NAME, {
|
|
15413
15457
|
symbol,
|
|
15414
15458
|
price,
|
|
15415
15459
|
});
|
|
15416
|
-
|
|
15460
|
+
if (!MethodContextService.hasContext()) {
|
|
15461
|
+
throw new Error("formatPrice requires a method context");
|
|
15462
|
+
}
|
|
15463
|
+
return await backtest$1.exchangeConnectionService.formatPrice(symbol, price);
|
|
15417
15464
|
}
|
|
15418
15465
|
/**
|
|
15419
15466
|
* Formats a quantity value according to exchange rules.
|
|
@@ -15431,11 +15478,14 @@ async function formatPrice(symbol, price) {
|
|
|
15431
15478
|
* ```
|
|
15432
15479
|
*/
|
|
15433
15480
|
async function formatQuantity(symbol, quantity) {
|
|
15434
|
-
|
|
15481
|
+
backtest$1.loggerService.info(FORMAT_QUANTITY_METHOD_NAME, {
|
|
15435
15482
|
symbol,
|
|
15436
15483
|
quantity,
|
|
15437
15484
|
});
|
|
15438
|
-
|
|
15485
|
+
if (!MethodContextService.hasContext()) {
|
|
15486
|
+
throw new Error("formatQuantity requires a method context");
|
|
15487
|
+
}
|
|
15488
|
+
return await backtest$1.exchangeConnectionService.formatQuantity(symbol, quantity);
|
|
15439
15489
|
}
|
|
15440
15490
|
/**
|
|
15441
15491
|
* Gets the current date from execution context.
|
|
@@ -15452,8 +15502,11 @@ async function formatQuantity(symbol, quantity) {
|
|
|
15452
15502
|
* ```
|
|
15453
15503
|
*/
|
|
15454
15504
|
async function getDate() {
|
|
15455
|
-
|
|
15456
|
-
|
|
15505
|
+
backtest$1.loggerService.info(GET_DATE_METHOD_NAME);
|
|
15506
|
+
if (!ExecutionContextService.hasContext()) {
|
|
15507
|
+
throw new Error("getDate requires an execution context");
|
|
15508
|
+
}
|
|
15509
|
+
const { when } = backtest$1.executionContextService.context;
|
|
15457
15510
|
return new Date(when.getTime());
|
|
15458
15511
|
}
|
|
15459
15512
|
/**
|
|
@@ -15472,9 +15525,12 @@ async function getDate() {
|
|
|
15472
15525
|
* ```
|
|
15473
15526
|
*/
|
|
15474
15527
|
async function getMode() {
|
|
15475
|
-
|
|
15476
|
-
|
|
15477
|
-
|
|
15528
|
+
backtest$1.loggerService.info(GET_MODE_METHOD_NAME);
|
|
15529
|
+
if (!ExecutionContextService.hasContext()) {
|
|
15530
|
+
throw new Error("getMode requires an execution context");
|
|
15531
|
+
}
|
|
15532
|
+
const { backtest: bt } = backtest$1.executionContextService.context;
|
|
15533
|
+
return bt ? "backtest" : "live";
|
|
15478
15534
|
}
|
|
15479
15535
|
|
|
15480
15536
|
const DUMP_SIGNAL_METHOD_NAME = "dump.dumpSignal";
|
|
@@ -15545,13 +15601,13 @@ const DUMP_SIGNAL_METHOD_NAME = "dump.dumpSignal";
|
|
|
15545
15601
|
* ```
|
|
15546
15602
|
*/
|
|
15547
15603
|
async function dumpSignal(signalId, history, signal, outputDir = "./dump/strategy") {
|
|
15548
|
-
|
|
15604
|
+
backtest$1.loggerService.info(DUMP_SIGNAL_METHOD_NAME, {
|
|
15549
15605
|
signalId,
|
|
15550
15606
|
history,
|
|
15551
15607
|
signal,
|
|
15552
15608
|
outputDir,
|
|
15553
15609
|
});
|
|
15554
|
-
return await
|
|
15610
|
+
return await backtest$1.outlineMarkdownService.dumpSignal(signalId, history, signal, outputDir);
|
|
15555
15611
|
}
|
|
15556
15612
|
|
|
15557
15613
|
const BACKTEST_METHOD_NAME_RUN = "BacktestUtils.run";
|
|
@@ -15638,7 +15694,7 @@ class BacktestInstance {
|
|
|
15638
15694
|
* @internal
|
|
15639
15695
|
*/
|
|
15640
15696
|
this.task = singlerun(async (symbol, context) => {
|
|
15641
|
-
|
|
15697
|
+
backtest$1.loggerService.info(BACKTEST_METHOD_NAME_TASK, {
|
|
15642
15698
|
symbol,
|
|
15643
15699
|
context,
|
|
15644
15700
|
});
|
|
@@ -15657,7 +15713,7 @@ class BacktestInstance {
|
|
|
15657
15713
|
* ```
|
|
15658
15714
|
*/
|
|
15659
15715
|
this.getStatus = async () => {
|
|
15660
|
-
|
|
15716
|
+
backtest$1.loggerService.info(BACKTEST_METHOD_NAME_GET_STATUS);
|
|
15661
15717
|
return {
|
|
15662
15718
|
id: this.id,
|
|
15663
15719
|
symbol: this.symbol,
|
|
@@ -15673,27 +15729,27 @@ class BacktestInstance {
|
|
|
15673
15729
|
* @returns Async generator yielding closed signals with PNL
|
|
15674
15730
|
*/
|
|
15675
15731
|
this.run = (symbol, context) => {
|
|
15676
|
-
|
|
15732
|
+
backtest$1.loggerService.info(BACKTEST_METHOD_NAME_RUN, {
|
|
15677
15733
|
symbol,
|
|
15678
15734
|
context,
|
|
15679
15735
|
});
|
|
15680
15736
|
{
|
|
15681
|
-
|
|
15682
|
-
|
|
15683
|
-
|
|
15684
|
-
|
|
15685
|
-
|
|
15686
|
-
|
|
15737
|
+
backtest$1.backtestMarkdownService.clear(true, { symbol, strategyName: context.strategyName });
|
|
15738
|
+
backtest$1.liveMarkdownService.clear(true, { symbol, strategyName: context.strategyName });
|
|
15739
|
+
backtest$1.scheduleMarkdownService.clear(true, { symbol, strategyName: context.strategyName });
|
|
15740
|
+
backtest$1.performanceMarkdownService.clear(true, { symbol, strategyName: context.strategyName });
|
|
15741
|
+
backtest$1.partialMarkdownService.clear(true, { symbol, strategyName: context.strategyName });
|
|
15742
|
+
backtest$1.riskMarkdownService.clear(true, { symbol, strategyName: context.strategyName });
|
|
15687
15743
|
}
|
|
15688
15744
|
{
|
|
15689
|
-
|
|
15745
|
+
backtest$1.strategyCoreService.clear(true, { symbol, strategyName: context.strategyName });
|
|
15690
15746
|
}
|
|
15691
15747
|
{
|
|
15692
|
-
const { riskName, riskList } =
|
|
15693
|
-
riskName &&
|
|
15694
|
-
riskList && riskList.forEach((riskName) =>
|
|
15748
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(context.strategyName);
|
|
15749
|
+
riskName && backtest$1.riskGlobalService.clear(true, riskName);
|
|
15750
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskGlobalService.clear(true, riskName));
|
|
15695
15751
|
}
|
|
15696
|
-
return
|
|
15752
|
+
return backtest$1.backtestCommandService.run(symbol, context);
|
|
15697
15753
|
};
|
|
15698
15754
|
/**
|
|
15699
15755
|
* Runs backtest in background without yielding results.
|
|
@@ -15716,7 +15772,7 @@ class BacktestInstance {
|
|
|
15716
15772
|
* ```
|
|
15717
15773
|
*/
|
|
15718
15774
|
this.background = (symbol, context) => {
|
|
15719
|
-
|
|
15775
|
+
backtest$1.loggerService.info(BACKTEST_METHOD_NAME_BACKGROUND, {
|
|
15720
15776
|
symbol,
|
|
15721
15777
|
context,
|
|
15722
15778
|
});
|
|
@@ -15731,8 +15787,8 @@ class BacktestInstance {
|
|
|
15731
15787
|
}
|
|
15732
15788
|
this.task(symbol, context).catch((error) => exitEmitter.next(new Error(getErrorMessage(error))));
|
|
15733
15789
|
return () => {
|
|
15734
|
-
|
|
15735
|
-
|
|
15790
|
+
backtest$1.strategyCoreService.stop(true, { symbol, strategyName: context.strategyName });
|
|
15791
|
+
backtest$1.strategyCoreService
|
|
15736
15792
|
.getPendingSignal(true, symbol, context.strategyName)
|
|
15737
15793
|
.then(async (pendingSignal) => {
|
|
15738
15794
|
if (pendingSignal) {
|
|
@@ -15769,11 +15825,11 @@ class BacktestInstance {
|
|
|
15769
15825
|
* ```
|
|
15770
15826
|
*/
|
|
15771
15827
|
this.stop = async (symbol, strategyName) => {
|
|
15772
|
-
|
|
15828
|
+
backtest$1.loggerService.info(BACKTEST_METHOD_NAME_STOP, {
|
|
15773
15829
|
symbol,
|
|
15774
15830
|
strategyName,
|
|
15775
15831
|
});
|
|
15776
|
-
await
|
|
15832
|
+
await backtest$1.strategyCoreService.stop(true, { symbol, strategyName });
|
|
15777
15833
|
};
|
|
15778
15834
|
/**
|
|
15779
15835
|
* Gets statistical data from all closed signals for a symbol-strategy pair.
|
|
@@ -15790,11 +15846,11 @@ class BacktestInstance {
|
|
|
15790
15846
|
* ```
|
|
15791
15847
|
*/
|
|
15792
15848
|
this.getData = async (symbol, strategyName) => {
|
|
15793
|
-
|
|
15849
|
+
backtest$1.loggerService.info("BacktestUtils.getData", {
|
|
15794
15850
|
symbol,
|
|
15795
15851
|
strategyName,
|
|
15796
15852
|
});
|
|
15797
|
-
return await
|
|
15853
|
+
return await backtest$1.backtestMarkdownService.getData(symbol, strategyName, true);
|
|
15798
15854
|
};
|
|
15799
15855
|
/**
|
|
15800
15856
|
* Generates markdown report with all closed signals for a symbol-strategy pair.
|
|
@@ -15812,11 +15868,11 @@ class BacktestInstance {
|
|
|
15812
15868
|
* ```
|
|
15813
15869
|
*/
|
|
15814
15870
|
this.getReport = async (symbol, strategyName, columns) => {
|
|
15815
|
-
|
|
15871
|
+
backtest$1.loggerService.info(BACKTEST_METHOD_NAME_GET_REPORT, {
|
|
15816
15872
|
symbol,
|
|
15817
15873
|
strategyName,
|
|
15818
15874
|
});
|
|
15819
|
-
return await
|
|
15875
|
+
return await backtest$1.backtestMarkdownService.getReport(symbol, strategyName, true, columns);
|
|
15820
15876
|
};
|
|
15821
15877
|
/**
|
|
15822
15878
|
* Saves strategy report to disk.
|
|
@@ -15837,12 +15893,12 @@ class BacktestInstance {
|
|
|
15837
15893
|
* ```
|
|
15838
15894
|
*/
|
|
15839
15895
|
this.dump = async (symbol, strategyName, path, columns) => {
|
|
15840
|
-
|
|
15896
|
+
backtest$1.loggerService.info(BACKTEST_METHOD_NAME_DUMP, {
|
|
15841
15897
|
symbol,
|
|
15842
15898
|
strategyName,
|
|
15843
15899
|
path,
|
|
15844
15900
|
});
|
|
15845
|
-
await
|
|
15901
|
+
await backtest$1.backtestMarkdownService.dump(symbol, strategyName, true, path, columns);
|
|
15846
15902
|
};
|
|
15847
15903
|
}
|
|
15848
15904
|
}
|
|
@@ -15881,14 +15937,14 @@ class BacktestUtils {
|
|
|
15881
15937
|
*/
|
|
15882
15938
|
this.run = (symbol, context) => {
|
|
15883
15939
|
{
|
|
15884
|
-
|
|
15885
|
-
|
|
15886
|
-
|
|
15940
|
+
backtest$1.strategyValidationService.validate(context.strategyName, BACKTEST_METHOD_NAME_RUN);
|
|
15941
|
+
backtest$1.exchangeValidationService.validate(context.exchangeName, BACKTEST_METHOD_NAME_RUN);
|
|
15942
|
+
backtest$1.frameValidationService.validate(context.frameName, BACKTEST_METHOD_NAME_RUN);
|
|
15887
15943
|
}
|
|
15888
15944
|
{
|
|
15889
|
-
const { riskName, riskList } =
|
|
15890
|
-
riskName &&
|
|
15891
|
-
riskList && riskList.forEach((riskName) =>
|
|
15945
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(context.strategyName);
|
|
15946
|
+
riskName && backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_RUN);
|
|
15947
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_RUN));
|
|
15892
15948
|
}
|
|
15893
15949
|
const instance = this._getInstance(symbol, context.strategyName);
|
|
15894
15950
|
return instance.run(symbol, context);
|
|
@@ -15915,13 +15971,13 @@ class BacktestUtils {
|
|
|
15915
15971
|
* ```
|
|
15916
15972
|
*/
|
|
15917
15973
|
this.background = (symbol, context) => {
|
|
15918
|
-
|
|
15919
|
-
|
|
15920
|
-
|
|
15974
|
+
backtest$1.strategyValidationService.validate(context.strategyName, BACKTEST_METHOD_NAME_BACKGROUND);
|
|
15975
|
+
backtest$1.exchangeValidationService.validate(context.exchangeName, BACKTEST_METHOD_NAME_BACKGROUND);
|
|
15976
|
+
backtest$1.frameValidationService.validate(context.frameName, BACKTEST_METHOD_NAME_BACKGROUND);
|
|
15921
15977
|
{
|
|
15922
|
-
const { riskName, riskList } =
|
|
15923
|
-
riskName &&
|
|
15924
|
-
riskList && riskList.forEach((riskName) =>
|
|
15978
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(context.strategyName);
|
|
15979
|
+
riskName && backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_BACKGROUND);
|
|
15980
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_BACKGROUND));
|
|
15925
15981
|
}
|
|
15926
15982
|
const instance = this._getInstance(symbol, context.strategyName);
|
|
15927
15983
|
return instance.background(symbol, context);
|
|
@@ -15944,11 +16000,11 @@ class BacktestUtils {
|
|
|
15944
16000
|
* ```
|
|
15945
16001
|
*/
|
|
15946
16002
|
this.stop = async (symbol, strategyName) => {
|
|
15947
|
-
|
|
16003
|
+
backtest$1.strategyValidationService.validate(strategyName, BACKTEST_METHOD_NAME_STOP);
|
|
15948
16004
|
{
|
|
15949
|
-
const { riskName, riskList } =
|
|
15950
|
-
riskName &&
|
|
15951
|
-
riskList && riskList.forEach((riskName) =>
|
|
16005
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
16006
|
+
riskName && backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_STOP);
|
|
16007
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_STOP));
|
|
15952
16008
|
}
|
|
15953
16009
|
const instance = this._getInstance(symbol, strategyName);
|
|
15954
16010
|
return await instance.stop(symbol, strategyName);
|
|
@@ -15967,11 +16023,11 @@ class BacktestUtils {
|
|
|
15967
16023
|
* ```
|
|
15968
16024
|
*/
|
|
15969
16025
|
this.getData = async (symbol, strategyName) => {
|
|
15970
|
-
|
|
16026
|
+
backtest$1.strategyValidationService.validate(strategyName, "BacktestUtils.getData");
|
|
15971
16027
|
{
|
|
15972
|
-
const { riskName, riskList } =
|
|
15973
|
-
riskName &&
|
|
15974
|
-
riskList && riskList.forEach((riskName) =>
|
|
16028
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
16029
|
+
riskName && backtest$1.riskValidationService.validate(riskName, "BacktestUtils.getData");
|
|
16030
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, "BacktestUtils.getData"));
|
|
15975
16031
|
}
|
|
15976
16032
|
const instance = this._getInstance(symbol, strategyName);
|
|
15977
16033
|
return await instance.getData(symbol, strategyName);
|
|
@@ -15991,11 +16047,11 @@ class BacktestUtils {
|
|
|
15991
16047
|
* ```
|
|
15992
16048
|
*/
|
|
15993
16049
|
this.getReport = async (symbol, strategyName, columns) => {
|
|
15994
|
-
|
|
16050
|
+
backtest$1.strategyValidationService.validate(strategyName, BACKTEST_METHOD_NAME_GET_REPORT);
|
|
15995
16051
|
{
|
|
15996
|
-
const { riskName, riskList } =
|
|
15997
|
-
riskName &&
|
|
15998
|
-
riskList && riskList.forEach((riskName) =>
|
|
16052
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
16053
|
+
riskName && backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_GET_REPORT);
|
|
16054
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_GET_REPORT));
|
|
15999
16055
|
}
|
|
16000
16056
|
const instance = this._getInstance(symbol, strategyName);
|
|
16001
16057
|
return await instance.getReport(symbol, strategyName, columns);
|
|
@@ -16018,11 +16074,11 @@ class BacktestUtils {
|
|
|
16018
16074
|
* ```
|
|
16019
16075
|
*/
|
|
16020
16076
|
this.dump = async (symbol, strategyName, path, columns) => {
|
|
16021
|
-
|
|
16077
|
+
backtest$1.strategyValidationService.validate(strategyName, BACKTEST_METHOD_NAME_DUMP);
|
|
16022
16078
|
{
|
|
16023
|
-
const { riskName, riskList } =
|
|
16024
|
-
riskName &&
|
|
16025
|
-
riskList && riskList.forEach((riskName) =>
|
|
16079
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
16080
|
+
riskName && backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_DUMP);
|
|
16081
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_DUMP));
|
|
16026
16082
|
}
|
|
16027
16083
|
const instance = this._getInstance(symbol, strategyName);
|
|
16028
16084
|
return await instance.dump(symbol, strategyName, path, columns);
|
|
@@ -16152,7 +16208,7 @@ class LiveInstance {
|
|
|
16152
16208
|
* @internal
|
|
16153
16209
|
*/
|
|
16154
16210
|
this.task = singlerun(async (symbol, context) => {
|
|
16155
|
-
|
|
16211
|
+
backtest$1.loggerService.info(LIVE_METHOD_NAME_TASK, {
|
|
16156
16212
|
symbol,
|
|
16157
16213
|
context,
|
|
16158
16214
|
});
|
|
@@ -16171,7 +16227,7 @@ class LiveInstance {
|
|
|
16171
16227
|
* ```
|
|
16172
16228
|
*/
|
|
16173
16229
|
this.getStatus = async () => {
|
|
16174
|
-
|
|
16230
|
+
backtest$1.loggerService.info(LIVE_METHOD_NAME_GET_STATUS);
|
|
16175
16231
|
return {
|
|
16176
16232
|
id: this.id,
|
|
16177
16233
|
symbol: this.symbol,
|
|
@@ -16190,27 +16246,27 @@ class LiveInstance {
|
|
|
16190
16246
|
* @returns Infinite async generator yielding opened and closed signals
|
|
16191
16247
|
*/
|
|
16192
16248
|
this.run = (symbol, context) => {
|
|
16193
|
-
|
|
16249
|
+
backtest$1.loggerService.info(LIVE_METHOD_NAME_RUN, {
|
|
16194
16250
|
symbol,
|
|
16195
16251
|
context,
|
|
16196
16252
|
});
|
|
16197
16253
|
{
|
|
16198
|
-
|
|
16199
|
-
|
|
16200
|
-
|
|
16201
|
-
|
|
16202
|
-
|
|
16203
|
-
|
|
16254
|
+
backtest$1.backtestMarkdownService.clear(false, { symbol, strategyName: context.strategyName });
|
|
16255
|
+
backtest$1.liveMarkdownService.clear(false, { symbol, strategyName: context.strategyName });
|
|
16256
|
+
backtest$1.scheduleMarkdownService.clear(false, { symbol, strategyName: context.strategyName });
|
|
16257
|
+
backtest$1.performanceMarkdownService.clear(false, { symbol, strategyName: context.strategyName });
|
|
16258
|
+
backtest$1.partialMarkdownService.clear(false, { symbol, strategyName: context.strategyName });
|
|
16259
|
+
backtest$1.riskMarkdownService.clear(false, { symbol, strategyName: context.strategyName });
|
|
16204
16260
|
}
|
|
16205
16261
|
{
|
|
16206
|
-
|
|
16262
|
+
backtest$1.strategyCoreService.clear(false, { symbol, strategyName: context.strategyName });
|
|
16207
16263
|
}
|
|
16208
16264
|
{
|
|
16209
|
-
const { riskName, riskList } =
|
|
16210
|
-
riskName &&
|
|
16211
|
-
riskList && riskList.forEach((riskName) =>
|
|
16265
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(context.strategyName);
|
|
16266
|
+
riskName && backtest$1.riskGlobalService.clear(false, riskName);
|
|
16267
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskGlobalService.clear(false, riskName));
|
|
16212
16268
|
}
|
|
16213
|
-
return
|
|
16269
|
+
return backtest$1.liveCommandService.run(symbol, context);
|
|
16214
16270
|
};
|
|
16215
16271
|
/**
|
|
16216
16272
|
* Runs live trading in background without yielding results.
|
|
@@ -16233,7 +16289,7 @@ class LiveInstance {
|
|
|
16233
16289
|
* ```
|
|
16234
16290
|
*/
|
|
16235
16291
|
this.background = (symbol, context) => {
|
|
16236
|
-
|
|
16292
|
+
backtest$1.loggerService.info(LIVE_METHOD_NAME_BACKGROUND, {
|
|
16237
16293
|
symbol,
|
|
16238
16294
|
context,
|
|
16239
16295
|
});
|
|
@@ -16248,8 +16304,8 @@ class LiveInstance {
|
|
|
16248
16304
|
}
|
|
16249
16305
|
this.task(symbol, context).catch((error) => exitEmitter.next(new Error(getErrorMessage(error))));
|
|
16250
16306
|
return () => {
|
|
16251
|
-
|
|
16252
|
-
|
|
16307
|
+
backtest$1.strategyCoreService.stop(false, { symbol, strategyName: context.strategyName });
|
|
16308
|
+
backtest$1.strategyCoreService
|
|
16253
16309
|
.getPendingSignal(false, symbol, context.strategyName)
|
|
16254
16310
|
.then(async (pendingSignal) => {
|
|
16255
16311
|
if (pendingSignal) {
|
|
@@ -16286,11 +16342,11 @@ class LiveInstance {
|
|
|
16286
16342
|
* ```
|
|
16287
16343
|
*/
|
|
16288
16344
|
this.stop = async (symbol, strategyName) => {
|
|
16289
|
-
|
|
16345
|
+
backtest$1.loggerService.info(LIVE_METHOD_NAME_STOP, {
|
|
16290
16346
|
symbol,
|
|
16291
16347
|
strategyName,
|
|
16292
16348
|
});
|
|
16293
|
-
await
|
|
16349
|
+
await backtest$1.strategyCoreService.stop(false, { symbol, strategyName });
|
|
16294
16350
|
};
|
|
16295
16351
|
/**
|
|
16296
16352
|
* Gets statistical data from all live trading events for a symbol-strategy pair.
|
|
@@ -16307,11 +16363,11 @@ class LiveInstance {
|
|
|
16307
16363
|
* ```
|
|
16308
16364
|
*/
|
|
16309
16365
|
this.getData = async (symbol, strategyName) => {
|
|
16310
|
-
|
|
16366
|
+
backtest$1.loggerService.info("LiveUtils.getData", {
|
|
16311
16367
|
symbol,
|
|
16312
16368
|
strategyName,
|
|
16313
16369
|
});
|
|
16314
|
-
return await
|
|
16370
|
+
return await backtest$1.liveMarkdownService.getData(symbol, strategyName, false);
|
|
16315
16371
|
};
|
|
16316
16372
|
/**
|
|
16317
16373
|
* Generates markdown report with all events for a symbol-strategy pair.
|
|
@@ -16329,11 +16385,11 @@ class LiveInstance {
|
|
|
16329
16385
|
* ```
|
|
16330
16386
|
*/
|
|
16331
16387
|
this.getReport = async (symbol, strategyName, columns) => {
|
|
16332
|
-
|
|
16388
|
+
backtest$1.loggerService.info(LIVE_METHOD_NAME_GET_REPORT, {
|
|
16333
16389
|
symbol,
|
|
16334
16390
|
strategyName,
|
|
16335
16391
|
});
|
|
16336
|
-
return await
|
|
16392
|
+
return await backtest$1.liveMarkdownService.getReport(symbol, strategyName, false, columns);
|
|
16337
16393
|
};
|
|
16338
16394
|
/**
|
|
16339
16395
|
* Saves strategy report to disk.
|
|
@@ -16354,12 +16410,12 @@ class LiveInstance {
|
|
|
16354
16410
|
* ```
|
|
16355
16411
|
*/
|
|
16356
16412
|
this.dump = async (symbol, strategyName, path, columns) => {
|
|
16357
|
-
|
|
16413
|
+
backtest$1.loggerService.info(LIVE_METHOD_NAME_DUMP, {
|
|
16358
16414
|
symbol,
|
|
16359
16415
|
strategyName,
|
|
16360
16416
|
path,
|
|
16361
16417
|
});
|
|
16362
|
-
await
|
|
16418
|
+
await backtest$1.liveMarkdownService.dump(symbol, strategyName, false, path, columns);
|
|
16363
16419
|
};
|
|
16364
16420
|
}
|
|
16365
16421
|
}
|
|
@@ -16411,13 +16467,13 @@ class LiveUtils {
|
|
|
16411
16467
|
*/
|
|
16412
16468
|
this.run = (symbol, context) => {
|
|
16413
16469
|
{
|
|
16414
|
-
|
|
16415
|
-
|
|
16470
|
+
backtest$1.strategyValidationService.validate(context.strategyName, LIVE_METHOD_NAME_RUN);
|
|
16471
|
+
backtest$1.exchangeValidationService.validate(context.exchangeName, LIVE_METHOD_NAME_RUN);
|
|
16416
16472
|
}
|
|
16417
16473
|
{
|
|
16418
|
-
const { riskName, riskList } =
|
|
16419
|
-
riskName &&
|
|
16420
|
-
riskList && riskList.forEach((riskName) =>
|
|
16474
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(context.strategyName);
|
|
16475
|
+
riskName && backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_RUN);
|
|
16476
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_RUN));
|
|
16421
16477
|
}
|
|
16422
16478
|
const instance = this._getInstance(symbol, context.strategyName);
|
|
16423
16479
|
return instance.run(symbol, context);
|
|
@@ -16444,12 +16500,12 @@ class LiveUtils {
|
|
|
16444
16500
|
* ```
|
|
16445
16501
|
*/
|
|
16446
16502
|
this.background = (symbol, context) => {
|
|
16447
|
-
|
|
16448
|
-
|
|
16503
|
+
backtest$1.strategyValidationService.validate(context.strategyName, LIVE_METHOD_NAME_BACKGROUND);
|
|
16504
|
+
backtest$1.exchangeValidationService.validate(context.exchangeName, LIVE_METHOD_NAME_BACKGROUND);
|
|
16449
16505
|
{
|
|
16450
|
-
const { riskName, riskList } =
|
|
16451
|
-
riskName &&
|
|
16452
|
-
riskList && riskList.forEach((riskName) =>
|
|
16506
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(context.strategyName);
|
|
16507
|
+
riskName && backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_BACKGROUND);
|
|
16508
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_BACKGROUND));
|
|
16453
16509
|
}
|
|
16454
16510
|
const instance = this._getInstance(symbol, context.strategyName);
|
|
16455
16511
|
return instance.background(symbol, context);
|
|
@@ -16472,11 +16528,11 @@ class LiveUtils {
|
|
|
16472
16528
|
* ```
|
|
16473
16529
|
*/
|
|
16474
16530
|
this.stop = async (symbol, strategyName) => {
|
|
16475
|
-
|
|
16531
|
+
backtest$1.strategyValidationService.validate(strategyName, LIVE_METHOD_NAME_STOP);
|
|
16476
16532
|
{
|
|
16477
|
-
const { riskName, riskList } =
|
|
16478
|
-
riskName &&
|
|
16479
|
-
riskList && riskList.forEach((riskName) =>
|
|
16533
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
16534
|
+
riskName && backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_STOP);
|
|
16535
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_STOP));
|
|
16480
16536
|
}
|
|
16481
16537
|
const instance = this._getInstance(symbol, strategyName);
|
|
16482
16538
|
return await instance.stop(symbol, strategyName);
|
|
@@ -16495,11 +16551,11 @@ class LiveUtils {
|
|
|
16495
16551
|
* ```
|
|
16496
16552
|
*/
|
|
16497
16553
|
this.getData = async (symbol, strategyName) => {
|
|
16498
|
-
|
|
16554
|
+
backtest$1.strategyValidationService.validate(strategyName, "LiveUtils.getData");
|
|
16499
16555
|
{
|
|
16500
|
-
const { riskName, riskList } =
|
|
16501
|
-
riskName &&
|
|
16502
|
-
riskList && riskList.forEach((riskName) =>
|
|
16556
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
16557
|
+
riskName && backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_GET_DATA);
|
|
16558
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_GET_DATA));
|
|
16503
16559
|
}
|
|
16504
16560
|
const instance = this._getInstance(symbol, strategyName);
|
|
16505
16561
|
return await instance.getData(symbol, strategyName);
|
|
@@ -16519,11 +16575,11 @@ class LiveUtils {
|
|
|
16519
16575
|
* ```
|
|
16520
16576
|
*/
|
|
16521
16577
|
this.getReport = async (symbol, strategyName, columns) => {
|
|
16522
|
-
|
|
16578
|
+
backtest$1.strategyValidationService.validate(strategyName, LIVE_METHOD_NAME_GET_REPORT);
|
|
16523
16579
|
{
|
|
16524
|
-
const { riskName, riskList } =
|
|
16525
|
-
riskName &&
|
|
16526
|
-
riskList && riskList.forEach((riskName) =>
|
|
16580
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
16581
|
+
riskName && backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_GET_REPORT);
|
|
16582
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_GET_REPORT));
|
|
16527
16583
|
}
|
|
16528
16584
|
const instance = this._getInstance(symbol, strategyName);
|
|
16529
16585
|
return await instance.getReport(symbol, strategyName, columns);
|
|
@@ -16546,11 +16602,11 @@ class LiveUtils {
|
|
|
16546
16602
|
* ```
|
|
16547
16603
|
*/
|
|
16548
16604
|
this.dump = async (symbol, strategyName, path, columns) => {
|
|
16549
|
-
|
|
16605
|
+
backtest$1.strategyValidationService.validate(strategyName, LIVE_METHOD_NAME_DUMP);
|
|
16550
16606
|
{
|
|
16551
|
-
const { riskName, riskList } =
|
|
16552
|
-
riskName &&
|
|
16553
|
-
riskList && riskList.forEach((riskName) =>
|
|
16607
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
16608
|
+
riskName && backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_DUMP);
|
|
16609
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_DUMP));
|
|
16554
16610
|
}
|
|
16555
16611
|
const instance = this._getInstance(symbol, strategyName);
|
|
16556
16612
|
return await instance.dump(symbol, strategyName, path, columns);
|
|
@@ -16635,18 +16691,18 @@ class ScheduleUtils {
|
|
|
16635
16691
|
* ```
|
|
16636
16692
|
*/
|
|
16637
16693
|
this.getData = async (symbol, strategyName, backtest) => {
|
|
16638
|
-
|
|
16694
|
+
backtest$1.loggerService.info(SCHEDULE_METHOD_NAME_GET_DATA, {
|
|
16639
16695
|
symbol,
|
|
16640
16696
|
strategyName,
|
|
16641
16697
|
backtest,
|
|
16642
16698
|
});
|
|
16643
|
-
|
|
16699
|
+
backtest$1.strategyValidationService.validate(strategyName, SCHEDULE_METHOD_NAME_GET_DATA);
|
|
16644
16700
|
{
|
|
16645
|
-
const { riskName, riskList } =
|
|
16646
|
-
riskName &&
|
|
16647
|
-
riskList && riskList.forEach((riskName) =>
|
|
16701
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
16702
|
+
riskName && backtest$1.riskValidationService.validate(riskName, SCHEDULE_METHOD_NAME_GET_DATA);
|
|
16703
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, SCHEDULE_METHOD_NAME_GET_DATA));
|
|
16648
16704
|
}
|
|
16649
|
-
return await
|
|
16705
|
+
return await backtest$1.scheduleMarkdownService.getData(symbol, strategyName, backtest);
|
|
16650
16706
|
};
|
|
16651
16707
|
/**
|
|
16652
16708
|
* Generates markdown report with all scheduled events for a symbol-strategy pair.
|
|
@@ -16663,18 +16719,18 @@ class ScheduleUtils {
|
|
|
16663
16719
|
* ```
|
|
16664
16720
|
*/
|
|
16665
16721
|
this.getReport = async (symbol, strategyName, backtest, columns) => {
|
|
16666
|
-
|
|
16722
|
+
backtest$1.loggerService.info(SCHEDULE_METHOD_NAME_GET_REPORT, {
|
|
16667
16723
|
symbol,
|
|
16668
16724
|
strategyName,
|
|
16669
16725
|
backtest,
|
|
16670
16726
|
});
|
|
16671
|
-
|
|
16727
|
+
backtest$1.strategyValidationService.validate(strategyName, SCHEDULE_METHOD_NAME_GET_REPORT);
|
|
16672
16728
|
{
|
|
16673
|
-
const { riskName, riskList } =
|
|
16674
|
-
riskName &&
|
|
16675
|
-
riskList && riskList.forEach((riskName) =>
|
|
16729
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
16730
|
+
riskName && backtest$1.riskValidationService.validate(riskName, SCHEDULE_METHOD_NAME_GET_REPORT);
|
|
16731
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, SCHEDULE_METHOD_NAME_GET_REPORT));
|
|
16676
16732
|
}
|
|
16677
|
-
return await
|
|
16733
|
+
return await backtest$1.scheduleMarkdownService.getReport(symbol, strategyName, backtest, columns);
|
|
16678
16734
|
};
|
|
16679
16735
|
/**
|
|
16680
16736
|
* Saves strategy report to disk.
|
|
@@ -16694,19 +16750,19 @@ class ScheduleUtils {
|
|
|
16694
16750
|
* ```
|
|
16695
16751
|
*/
|
|
16696
16752
|
this.dump = async (symbol, strategyName, backtest, path, columns) => {
|
|
16697
|
-
|
|
16753
|
+
backtest$1.loggerService.info(SCHEDULE_METHOD_NAME_DUMP, {
|
|
16698
16754
|
symbol,
|
|
16699
16755
|
strategyName,
|
|
16700
16756
|
backtest,
|
|
16701
16757
|
path,
|
|
16702
16758
|
});
|
|
16703
|
-
|
|
16759
|
+
backtest$1.strategyValidationService.validate(strategyName, SCHEDULE_METHOD_NAME_DUMP);
|
|
16704
16760
|
{
|
|
16705
|
-
const { riskName, riskList } =
|
|
16706
|
-
riskName &&
|
|
16707
|
-
riskList && riskList.forEach((riskName) =>
|
|
16761
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
16762
|
+
riskName && backtest$1.riskValidationService.validate(riskName, SCHEDULE_METHOD_NAME_DUMP);
|
|
16763
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, SCHEDULE_METHOD_NAME_DUMP));
|
|
16708
16764
|
}
|
|
16709
|
-
await
|
|
16765
|
+
await backtest$1.scheduleMarkdownService.dump(symbol, strategyName, backtest, path, columns);
|
|
16710
16766
|
};
|
|
16711
16767
|
}
|
|
16712
16768
|
}
|
|
@@ -16788,13 +16844,13 @@ class Performance {
|
|
|
16788
16844
|
* ```
|
|
16789
16845
|
*/
|
|
16790
16846
|
static async getData(symbol, strategyName, backtest) {
|
|
16791
|
-
|
|
16847
|
+
backtest$1.strategyValidationService.validate(strategyName, PERFORMANCE_METHOD_NAME_GET_DATA);
|
|
16792
16848
|
{
|
|
16793
|
-
const { riskName, riskList } =
|
|
16794
|
-
riskName &&
|
|
16795
|
-
riskList && riskList.forEach((riskName) =>
|
|
16849
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
16850
|
+
riskName && backtest$1.riskValidationService.validate(riskName, PERFORMANCE_METHOD_NAME_GET_DATA);
|
|
16851
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, PERFORMANCE_METHOD_NAME_GET_DATA));
|
|
16796
16852
|
}
|
|
16797
|
-
return
|
|
16853
|
+
return backtest$1.performanceMarkdownService.getData(symbol, strategyName, backtest);
|
|
16798
16854
|
}
|
|
16799
16855
|
/**
|
|
16800
16856
|
* Generates markdown report with performance analysis.
|
|
@@ -16820,13 +16876,13 @@ class Performance {
|
|
|
16820
16876
|
* ```
|
|
16821
16877
|
*/
|
|
16822
16878
|
static async getReport(symbol, strategyName, backtest, columns) {
|
|
16823
|
-
|
|
16879
|
+
backtest$1.strategyValidationService.validate(strategyName, PERFORMANCE_METHOD_NAME_GET_REPORT);
|
|
16824
16880
|
{
|
|
16825
|
-
const { riskName, riskList } =
|
|
16826
|
-
riskName &&
|
|
16827
|
-
riskList && riskList.forEach((riskName) =>
|
|
16881
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
16882
|
+
riskName && backtest$1.riskValidationService.validate(riskName, PERFORMANCE_METHOD_NAME_GET_REPORT);
|
|
16883
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, PERFORMANCE_METHOD_NAME_GET_REPORT));
|
|
16828
16884
|
}
|
|
16829
|
-
return
|
|
16885
|
+
return backtest$1.performanceMarkdownService.getReport(symbol, strategyName, backtest, columns);
|
|
16830
16886
|
}
|
|
16831
16887
|
/**
|
|
16832
16888
|
* Saves performance report to disk.
|
|
@@ -16849,13 +16905,13 @@ class Performance {
|
|
|
16849
16905
|
* ```
|
|
16850
16906
|
*/
|
|
16851
16907
|
static async dump(symbol, strategyName, backtest, path = "./dump/performance", columns) {
|
|
16852
|
-
|
|
16908
|
+
backtest$1.strategyValidationService.validate(strategyName, PERFORMANCE_METHOD_NAME_DUMP);
|
|
16853
16909
|
{
|
|
16854
|
-
const { riskName, riskList } =
|
|
16855
|
-
riskName &&
|
|
16856
|
-
riskList && riskList.forEach((riskName) =>
|
|
16910
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
16911
|
+
riskName && backtest$1.riskValidationService.validate(riskName, PERFORMANCE_METHOD_NAME_DUMP);
|
|
16912
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, PERFORMANCE_METHOD_NAME_DUMP));
|
|
16857
16913
|
}
|
|
16858
|
-
return
|
|
16914
|
+
return backtest$1.performanceMarkdownService.dump(symbol, strategyName, backtest, path, columns);
|
|
16859
16915
|
}
|
|
16860
16916
|
}
|
|
16861
16917
|
|
|
@@ -16889,7 +16945,7 @@ const INSTANCE_TASK_FN = async (symbol, context, self) => {
|
|
|
16889
16945
|
}
|
|
16890
16946
|
}
|
|
16891
16947
|
if (!self._isDone) {
|
|
16892
|
-
const walkerSchema =
|
|
16948
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(context.walkerName);
|
|
16893
16949
|
await doneWalkerSubject.next({
|
|
16894
16950
|
exchangeName: walkerSchema.exchangeName,
|
|
16895
16951
|
strategyName: context.walkerName,
|
|
@@ -16943,7 +16999,7 @@ class WalkerInstance {
|
|
|
16943
16999
|
* @internal
|
|
16944
17000
|
*/
|
|
16945
17001
|
this.task = singlerun(async (symbol, context) => {
|
|
16946
|
-
|
|
17002
|
+
backtest$1.loggerService.info(WALKER_METHOD_NAME_TASK, {
|
|
16947
17003
|
symbol,
|
|
16948
17004
|
context,
|
|
16949
17005
|
});
|
|
@@ -16962,7 +17018,7 @@ class WalkerInstance {
|
|
|
16962
17018
|
* ```
|
|
16963
17019
|
*/
|
|
16964
17020
|
this.getStatus = async () => {
|
|
16965
|
-
|
|
17021
|
+
backtest$1.loggerService.info(WALKER_METHOD_NAME_GET_STATUS);
|
|
16966
17022
|
return {
|
|
16967
17023
|
id: this.id,
|
|
16968
17024
|
symbol: this.symbol,
|
|
@@ -16978,39 +17034,39 @@ class WalkerInstance {
|
|
|
16978
17034
|
* @returns Async generator yielding progress updates after each strategy
|
|
16979
17035
|
*/
|
|
16980
17036
|
this.run = (symbol, context) => {
|
|
16981
|
-
|
|
17037
|
+
backtest$1.loggerService.info(WALKER_METHOD_NAME_RUN, {
|
|
16982
17038
|
symbol,
|
|
16983
17039
|
context,
|
|
16984
17040
|
});
|
|
16985
|
-
|
|
16986
|
-
const walkerSchema =
|
|
16987
|
-
|
|
16988
|
-
|
|
17041
|
+
backtest$1.walkerValidationService.validate(context.walkerName, WALKER_METHOD_NAME_RUN);
|
|
17042
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(context.walkerName);
|
|
17043
|
+
backtest$1.exchangeValidationService.validate(walkerSchema.exchangeName, WALKER_METHOD_NAME_RUN);
|
|
17044
|
+
backtest$1.frameValidationService.validate(walkerSchema.frameName, WALKER_METHOD_NAME_RUN);
|
|
16989
17045
|
for (const strategyName of walkerSchema.strategies) {
|
|
16990
|
-
|
|
17046
|
+
backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_RUN);
|
|
16991
17047
|
}
|
|
16992
|
-
|
|
17048
|
+
backtest$1.walkerMarkdownService.clear(context.walkerName);
|
|
16993
17049
|
// Clear backtest data for all strategies
|
|
16994
17050
|
for (const strategyName of walkerSchema.strategies) {
|
|
16995
17051
|
{
|
|
16996
|
-
|
|
16997
|
-
|
|
16998
|
-
|
|
16999
|
-
|
|
17000
|
-
|
|
17001
|
-
|
|
17052
|
+
backtest$1.backtestMarkdownService.clear(true, { symbol, strategyName });
|
|
17053
|
+
backtest$1.liveMarkdownService.clear(true, { symbol, strategyName });
|
|
17054
|
+
backtest$1.scheduleMarkdownService.clear(true, { symbol, strategyName });
|
|
17055
|
+
backtest$1.performanceMarkdownService.clear(true, { symbol, strategyName });
|
|
17056
|
+
backtest$1.partialMarkdownService.clear(true, { symbol, strategyName });
|
|
17057
|
+
backtest$1.riskMarkdownService.clear(true, { symbol, strategyName });
|
|
17002
17058
|
}
|
|
17003
17059
|
{
|
|
17004
|
-
|
|
17060
|
+
backtest$1.strategyCoreService.clear(true, { symbol, strategyName });
|
|
17005
17061
|
}
|
|
17006
17062
|
{
|
|
17007
|
-
const { riskName, riskList } =
|
|
17008
|
-
riskName &&
|
|
17063
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17064
|
+
riskName && backtest$1.riskGlobalService.clear(true, riskName);
|
|
17009
17065
|
riskList &&
|
|
17010
|
-
riskList.forEach((riskName) =>
|
|
17066
|
+
riskList.forEach((riskName) => backtest$1.riskGlobalService.clear(true, riskName));
|
|
17011
17067
|
}
|
|
17012
17068
|
}
|
|
17013
|
-
return
|
|
17069
|
+
return backtest$1.walkerCommandService.run(symbol, {
|
|
17014
17070
|
walkerName: context.walkerName,
|
|
17015
17071
|
exchangeName: walkerSchema.exchangeName,
|
|
17016
17072
|
frameName: walkerSchema.frameName,
|
|
@@ -17035,11 +17091,11 @@ class WalkerInstance {
|
|
|
17035
17091
|
* ```
|
|
17036
17092
|
*/
|
|
17037
17093
|
this.background = (symbol, context) => {
|
|
17038
|
-
|
|
17094
|
+
backtest$1.loggerService.info(WALKER_METHOD_NAME_BACKGROUND, {
|
|
17039
17095
|
symbol,
|
|
17040
17096
|
context,
|
|
17041
17097
|
});
|
|
17042
|
-
const walkerSchema =
|
|
17098
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(context.walkerName);
|
|
17043
17099
|
{
|
|
17044
17100
|
const currentStatus = this.task.getStatus();
|
|
17045
17101
|
if (currentStatus === "pending") {
|
|
@@ -17052,7 +17108,7 @@ class WalkerInstance {
|
|
|
17052
17108
|
this.task(symbol, context).catch((error) => exitEmitter.next(new Error(getErrorMessage(error))));
|
|
17053
17109
|
return () => {
|
|
17054
17110
|
for (const strategyName of walkerSchema.strategies) {
|
|
17055
|
-
|
|
17111
|
+
backtest$1.strategyCoreService.stop(true, { symbol, strategyName });
|
|
17056
17112
|
walkerStopSubject.next({
|
|
17057
17113
|
symbol,
|
|
17058
17114
|
strategyName,
|
|
@@ -17095,14 +17151,14 @@ class WalkerInstance {
|
|
|
17095
17151
|
* ```
|
|
17096
17152
|
*/
|
|
17097
17153
|
this.stop = async (symbol, walkerName) => {
|
|
17098
|
-
|
|
17154
|
+
backtest$1.loggerService.info(WALKER_METHOD_NAME_STOP, {
|
|
17099
17155
|
symbol,
|
|
17100
17156
|
walkerName,
|
|
17101
17157
|
});
|
|
17102
|
-
const walkerSchema =
|
|
17158
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
|
|
17103
17159
|
for (const strategyName of walkerSchema.strategies) {
|
|
17104
17160
|
await walkerStopSubject.next({ symbol, strategyName, walkerName });
|
|
17105
|
-
await
|
|
17161
|
+
await backtest$1.strategyCoreService.stop(true, { symbol, strategyName });
|
|
17106
17162
|
}
|
|
17107
17163
|
};
|
|
17108
17164
|
/**
|
|
@@ -17120,12 +17176,12 @@ class WalkerInstance {
|
|
|
17120
17176
|
* ```
|
|
17121
17177
|
*/
|
|
17122
17178
|
this.getData = async (symbol, walkerName) => {
|
|
17123
|
-
|
|
17179
|
+
backtest$1.loggerService.info(WALKER_METHOD_NAME_GET_DATA, {
|
|
17124
17180
|
symbol,
|
|
17125
17181
|
walkerName,
|
|
17126
17182
|
});
|
|
17127
|
-
const walkerSchema =
|
|
17128
|
-
return await
|
|
17183
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
|
|
17184
|
+
return await backtest$1.walkerMarkdownService.getData(walkerName, symbol, walkerSchema.metric || "sharpeRatio", {
|
|
17129
17185
|
exchangeName: walkerSchema.exchangeName,
|
|
17130
17186
|
frameName: walkerSchema.frameName,
|
|
17131
17187
|
});
|
|
@@ -17147,12 +17203,12 @@ class WalkerInstance {
|
|
|
17147
17203
|
* ```
|
|
17148
17204
|
*/
|
|
17149
17205
|
this.getReport = async (symbol, walkerName, strategyColumns, pnlColumns) => {
|
|
17150
|
-
|
|
17206
|
+
backtest$1.loggerService.info(WALKER_METHOD_NAME_GET_REPORT, {
|
|
17151
17207
|
symbol,
|
|
17152
17208
|
walkerName,
|
|
17153
17209
|
});
|
|
17154
|
-
const walkerSchema =
|
|
17155
|
-
return await
|
|
17210
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
|
|
17211
|
+
return await backtest$1.walkerMarkdownService.getReport(walkerName, symbol, walkerSchema.metric || "sharpeRatio", {
|
|
17156
17212
|
exchangeName: walkerSchema.exchangeName,
|
|
17157
17213
|
frameName: walkerSchema.frameName,
|
|
17158
17214
|
}, strategyColumns, pnlColumns);
|
|
@@ -17177,13 +17233,13 @@ class WalkerInstance {
|
|
|
17177
17233
|
* ```
|
|
17178
17234
|
*/
|
|
17179
17235
|
this.dump = async (symbol, walkerName, path, strategyColumns, pnlColumns) => {
|
|
17180
|
-
|
|
17236
|
+
backtest$1.loggerService.info(WALKER_METHOD_NAME_DUMP, {
|
|
17181
17237
|
symbol,
|
|
17182
17238
|
walkerName,
|
|
17183
17239
|
path,
|
|
17184
17240
|
});
|
|
17185
|
-
const walkerSchema =
|
|
17186
|
-
await
|
|
17241
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
|
|
17242
|
+
await backtest$1.walkerMarkdownService.dump(walkerName, symbol, walkerSchema.metric || "sharpeRatio", {
|
|
17187
17243
|
exchangeName: walkerSchema.exchangeName,
|
|
17188
17244
|
frameName: walkerSchema.frameName,
|
|
17189
17245
|
}, path, strategyColumns, pnlColumns);
|
|
@@ -17224,17 +17280,17 @@ class WalkerUtils {
|
|
|
17224
17280
|
* @returns Async generator yielding progress updates after each strategy
|
|
17225
17281
|
*/
|
|
17226
17282
|
this.run = (symbol, context) => {
|
|
17227
|
-
|
|
17228
|
-
const walkerSchema =
|
|
17229
|
-
|
|
17230
|
-
|
|
17283
|
+
backtest$1.walkerValidationService.validate(context.walkerName, WALKER_METHOD_NAME_RUN);
|
|
17284
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(context.walkerName);
|
|
17285
|
+
backtest$1.exchangeValidationService.validate(walkerSchema.exchangeName, WALKER_METHOD_NAME_RUN);
|
|
17286
|
+
backtest$1.frameValidationService.validate(walkerSchema.frameName, WALKER_METHOD_NAME_RUN);
|
|
17231
17287
|
for (const strategyName of walkerSchema.strategies) {
|
|
17232
|
-
|
|
17233
|
-
const { riskName, riskList } =
|
|
17288
|
+
backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_RUN);
|
|
17289
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17234
17290
|
riskName &&
|
|
17235
|
-
|
|
17291
|
+
backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_RUN);
|
|
17236
17292
|
riskList &&
|
|
17237
|
-
riskList.forEach((riskName) =>
|
|
17293
|
+
riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_RUN));
|
|
17238
17294
|
}
|
|
17239
17295
|
const instance = this._getInstance(symbol, context.walkerName);
|
|
17240
17296
|
return instance.run(symbol, context);
|
|
@@ -17259,17 +17315,17 @@ class WalkerUtils {
|
|
|
17259
17315
|
* ```
|
|
17260
17316
|
*/
|
|
17261
17317
|
this.background = (symbol, context) => {
|
|
17262
|
-
|
|
17263
|
-
const walkerSchema =
|
|
17264
|
-
|
|
17265
|
-
|
|
17318
|
+
backtest$1.walkerValidationService.validate(context.walkerName, WALKER_METHOD_NAME_BACKGROUND);
|
|
17319
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(context.walkerName);
|
|
17320
|
+
backtest$1.exchangeValidationService.validate(walkerSchema.exchangeName, WALKER_METHOD_NAME_BACKGROUND);
|
|
17321
|
+
backtest$1.frameValidationService.validate(walkerSchema.frameName, WALKER_METHOD_NAME_BACKGROUND);
|
|
17266
17322
|
for (const strategyName of walkerSchema.strategies) {
|
|
17267
|
-
|
|
17268
|
-
const { riskName, riskList } =
|
|
17323
|
+
backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_BACKGROUND);
|
|
17324
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17269
17325
|
riskName &&
|
|
17270
|
-
|
|
17326
|
+
backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_BACKGROUND);
|
|
17271
17327
|
riskList &&
|
|
17272
|
-
riskList.forEach((riskName) =>
|
|
17328
|
+
riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_BACKGROUND));
|
|
17273
17329
|
}
|
|
17274
17330
|
const instance = this._getInstance(symbol, context.walkerName);
|
|
17275
17331
|
return instance.background(symbol, context);
|
|
@@ -17298,15 +17354,15 @@ class WalkerUtils {
|
|
|
17298
17354
|
* ```
|
|
17299
17355
|
*/
|
|
17300
17356
|
this.stop = async (symbol, walkerName) => {
|
|
17301
|
-
|
|
17302
|
-
const walkerSchema =
|
|
17357
|
+
backtest$1.walkerValidationService.validate(walkerName, WALKER_METHOD_NAME_STOP);
|
|
17358
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
|
|
17303
17359
|
for (const strategyName of walkerSchema.strategies) {
|
|
17304
|
-
|
|
17305
|
-
const { riskName, riskList } =
|
|
17360
|
+
backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_STOP);
|
|
17361
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17306
17362
|
riskName &&
|
|
17307
|
-
|
|
17363
|
+
backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_STOP);
|
|
17308
17364
|
riskList &&
|
|
17309
|
-
riskList.forEach((riskName) =>
|
|
17365
|
+
riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_STOP));
|
|
17310
17366
|
}
|
|
17311
17367
|
const instance = this._getInstance(symbol, walkerName);
|
|
17312
17368
|
return await instance.stop(symbol, walkerName);
|
|
@@ -17325,15 +17381,15 @@ class WalkerUtils {
|
|
|
17325
17381
|
* ```
|
|
17326
17382
|
*/
|
|
17327
17383
|
this.getData = async (symbol, walkerName) => {
|
|
17328
|
-
|
|
17329
|
-
const walkerSchema =
|
|
17384
|
+
backtest$1.walkerValidationService.validate(walkerName, WALKER_METHOD_NAME_GET_DATA);
|
|
17385
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
|
|
17330
17386
|
for (const strategyName of walkerSchema.strategies) {
|
|
17331
|
-
|
|
17332
|
-
const { riskName, riskList } =
|
|
17387
|
+
backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_GET_DATA);
|
|
17388
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17333
17389
|
riskName &&
|
|
17334
|
-
|
|
17390
|
+
backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_GET_DATA);
|
|
17335
17391
|
riskList &&
|
|
17336
|
-
riskList.forEach((riskName) =>
|
|
17392
|
+
riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_GET_DATA));
|
|
17337
17393
|
}
|
|
17338
17394
|
const instance = this._getInstance(symbol, walkerName);
|
|
17339
17395
|
return await instance.getData(symbol, walkerName);
|
|
@@ -17354,15 +17410,15 @@ class WalkerUtils {
|
|
|
17354
17410
|
* ```
|
|
17355
17411
|
*/
|
|
17356
17412
|
this.getReport = async (symbol, walkerName, strategyColumns, pnlColumns) => {
|
|
17357
|
-
|
|
17358
|
-
const walkerSchema =
|
|
17413
|
+
backtest$1.walkerValidationService.validate(walkerName, WALKER_METHOD_NAME_GET_REPORT);
|
|
17414
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
|
|
17359
17415
|
for (const strategyName of walkerSchema.strategies) {
|
|
17360
|
-
|
|
17361
|
-
const { riskName, riskList } =
|
|
17416
|
+
backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_GET_REPORT);
|
|
17417
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17362
17418
|
riskName &&
|
|
17363
|
-
|
|
17419
|
+
backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_GET_REPORT);
|
|
17364
17420
|
riskList &&
|
|
17365
|
-
riskList.forEach((riskName) =>
|
|
17421
|
+
riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_GET_REPORT));
|
|
17366
17422
|
}
|
|
17367
17423
|
const instance = this._getInstance(symbol, walkerName);
|
|
17368
17424
|
return await instance.getReport(symbol, walkerName, strategyColumns, pnlColumns);
|
|
@@ -17386,15 +17442,15 @@ class WalkerUtils {
|
|
|
17386
17442
|
* ```
|
|
17387
17443
|
*/
|
|
17388
17444
|
this.dump = async (symbol, walkerName, path, strategyColumns, pnlColumns) => {
|
|
17389
|
-
|
|
17390
|
-
const walkerSchema =
|
|
17445
|
+
backtest$1.walkerValidationService.validate(walkerName, WALKER_METHOD_NAME_DUMP);
|
|
17446
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
|
|
17391
17447
|
for (const strategyName of walkerSchema.strategies) {
|
|
17392
|
-
|
|
17393
|
-
const { riskName, riskList } =
|
|
17448
|
+
backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_DUMP);
|
|
17449
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17394
17450
|
riskName &&
|
|
17395
|
-
|
|
17451
|
+
backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_DUMP);
|
|
17396
17452
|
riskList &&
|
|
17397
|
-
riskList.forEach((riskName) =>
|
|
17453
|
+
riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_DUMP));
|
|
17398
17454
|
}
|
|
17399
17455
|
const instance = this._getInstance(symbol, walkerName);
|
|
17400
17456
|
return await instance.dump(symbol, walkerName, path, strategyColumns, pnlColumns);
|
|
@@ -17487,14 +17543,14 @@ class HeatUtils {
|
|
|
17487
17543
|
* ```
|
|
17488
17544
|
*/
|
|
17489
17545
|
this.getData = async (strategyName, backtest) => {
|
|
17490
|
-
|
|
17491
|
-
|
|
17546
|
+
backtest$1.loggerService.info(HEAT_METHOD_NAME_GET_DATA, { strategyName });
|
|
17547
|
+
backtest$1.strategyValidationService.validate(strategyName, HEAT_METHOD_NAME_GET_DATA);
|
|
17492
17548
|
{
|
|
17493
|
-
const { riskName, riskList } =
|
|
17494
|
-
riskName &&
|
|
17495
|
-
riskList && riskList.forEach((riskName) =>
|
|
17549
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17550
|
+
riskName && backtest$1.riskValidationService.validate(riskName, HEAT_METHOD_NAME_GET_DATA);
|
|
17551
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, HEAT_METHOD_NAME_GET_DATA));
|
|
17496
17552
|
}
|
|
17497
|
-
return await
|
|
17553
|
+
return await backtest$1.heatMarkdownService.getData(strategyName, backtest);
|
|
17498
17554
|
};
|
|
17499
17555
|
/**
|
|
17500
17556
|
* Generates markdown report with portfolio heatmap table for a strategy.
|
|
@@ -17523,14 +17579,14 @@ class HeatUtils {
|
|
|
17523
17579
|
* ```
|
|
17524
17580
|
*/
|
|
17525
17581
|
this.getReport = async (strategyName, backtest, columns) => {
|
|
17526
|
-
|
|
17527
|
-
|
|
17582
|
+
backtest$1.loggerService.info(HEAT_METHOD_NAME_GET_REPORT, { strategyName });
|
|
17583
|
+
backtest$1.strategyValidationService.validate(strategyName, HEAT_METHOD_NAME_GET_REPORT);
|
|
17528
17584
|
{
|
|
17529
|
-
const { riskName, riskList } =
|
|
17530
|
-
riskName &&
|
|
17531
|
-
riskList && riskList.forEach((riskName) =>
|
|
17585
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17586
|
+
riskName && backtest$1.riskValidationService.validate(riskName, HEAT_METHOD_NAME_GET_REPORT);
|
|
17587
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, HEAT_METHOD_NAME_GET_REPORT));
|
|
17532
17588
|
}
|
|
17533
|
-
return await
|
|
17589
|
+
return await backtest$1.heatMarkdownService.getReport(strategyName, backtest, columns);
|
|
17534
17590
|
};
|
|
17535
17591
|
/**
|
|
17536
17592
|
* Saves heatmap report to disk for a strategy.
|
|
@@ -17552,14 +17608,14 @@ class HeatUtils {
|
|
|
17552
17608
|
* ```
|
|
17553
17609
|
*/
|
|
17554
17610
|
this.dump = async (strategyName, backtest, path, columns) => {
|
|
17555
|
-
|
|
17556
|
-
|
|
17611
|
+
backtest$1.loggerService.info(HEAT_METHOD_NAME_DUMP, { strategyName, path });
|
|
17612
|
+
backtest$1.strategyValidationService.validate(strategyName, HEAT_METHOD_NAME_DUMP);
|
|
17557
17613
|
{
|
|
17558
|
-
const { riskName, riskList } =
|
|
17559
|
-
riskName &&
|
|
17560
|
-
riskList && riskList.forEach((riskName) =>
|
|
17614
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17615
|
+
riskName && backtest$1.riskValidationService.validate(riskName, HEAT_METHOD_NAME_DUMP);
|
|
17616
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, HEAT_METHOD_NAME_DUMP));
|
|
17561
17617
|
}
|
|
17562
|
-
await
|
|
17618
|
+
await backtest$1.heatMarkdownService.dump(strategyName, backtest, path, columns);
|
|
17563
17619
|
};
|
|
17564
17620
|
}
|
|
17565
17621
|
}
|
|
@@ -17646,12 +17702,12 @@ class PositionSizeUtils {
|
|
|
17646
17702
|
* @throws Error if sizing schema method is not "fixed-percentage"
|
|
17647
17703
|
*/
|
|
17648
17704
|
PositionSizeUtils.fixedPercentage = async (symbol, accountBalance, priceOpen, priceStopLoss, context) => {
|
|
17649
|
-
|
|
17705
|
+
backtest$1.loggerService.info(POSITION_SIZE_METHOD_NAME_FIXED, {
|
|
17650
17706
|
context,
|
|
17651
17707
|
symbol,
|
|
17652
17708
|
});
|
|
17653
|
-
|
|
17654
|
-
return await
|
|
17709
|
+
backtest$1.sizingValidationService.validate(context.sizingName, POSITION_SIZE_METHOD_NAME_FIXED, "fixed-percentage");
|
|
17710
|
+
return await backtest$1.sizingGlobalService.calculate({
|
|
17655
17711
|
symbol,
|
|
17656
17712
|
accountBalance,
|
|
17657
17713
|
priceOpen,
|
|
@@ -17672,12 +17728,12 @@ PositionSizeUtils.fixedPercentage = async (symbol, accountBalance, priceOpen, pr
|
|
|
17672
17728
|
* @throws Error if sizing schema method is not "kelly-criterion"
|
|
17673
17729
|
*/
|
|
17674
17730
|
PositionSizeUtils.kellyCriterion = async (symbol, accountBalance, priceOpen, winRate, winLossRatio, context) => {
|
|
17675
|
-
|
|
17731
|
+
backtest$1.loggerService.info(POSITION_SIZE_METHOD_NAME_KELLY, {
|
|
17676
17732
|
context,
|
|
17677
17733
|
symbol,
|
|
17678
17734
|
});
|
|
17679
|
-
|
|
17680
|
-
return await
|
|
17735
|
+
backtest$1.sizingValidationService.validate(context.sizingName, POSITION_SIZE_METHOD_NAME_KELLY, "kelly-criterion");
|
|
17736
|
+
return await backtest$1.sizingGlobalService.calculate({
|
|
17681
17737
|
symbol,
|
|
17682
17738
|
accountBalance,
|
|
17683
17739
|
priceOpen,
|
|
@@ -17698,12 +17754,12 @@ PositionSizeUtils.kellyCriterion = async (symbol, accountBalance, priceOpen, win
|
|
|
17698
17754
|
* @throws Error if sizing schema method is not "atr-based"
|
|
17699
17755
|
*/
|
|
17700
17756
|
PositionSizeUtils.atrBased = async (symbol, accountBalance, priceOpen, atr, context) => {
|
|
17701
|
-
|
|
17757
|
+
backtest$1.loggerService.info(POSITION_SIZE_METHOD_NAME_ATR, {
|
|
17702
17758
|
context,
|
|
17703
17759
|
symbol,
|
|
17704
17760
|
});
|
|
17705
|
-
|
|
17706
|
-
return await
|
|
17761
|
+
backtest$1.sizingValidationService.validate(context.sizingName, POSITION_SIZE_METHOD_NAME_ATR, "atr-based");
|
|
17762
|
+
return await backtest$1.sizingGlobalService.calculate({
|
|
17707
17763
|
symbol,
|
|
17708
17764
|
accountBalance,
|
|
17709
17765
|
priceOpen,
|
|
@@ -17752,12 +17808,12 @@ class OptimizerUtils {
|
|
|
17752
17808
|
* @throws Error if optimizer not found
|
|
17753
17809
|
*/
|
|
17754
17810
|
this.getData = async (symbol, context) => {
|
|
17755
|
-
|
|
17811
|
+
backtest$1.loggerService.info(OPTIMIZER_METHOD_NAME_GET_DATA, {
|
|
17756
17812
|
symbol,
|
|
17757
17813
|
context,
|
|
17758
17814
|
});
|
|
17759
|
-
|
|
17760
|
-
return await
|
|
17815
|
+
backtest$1.optimizerValidationService.validate(context.optimizerName, OPTIMIZER_METHOD_NAME_GET_DATA);
|
|
17816
|
+
return await backtest$1.optimizerGlobalService.getData(symbol, context.optimizerName);
|
|
17761
17817
|
};
|
|
17762
17818
|
/**
|
|
17763
17819
|
* Generates complete executable strategy code.
|
|
@@ -17769,12 +17825,12 @@ class OptimizerUtils {
|
|
|
17769
17825
|
* @throws Error if optimizer not found
|
|
17770
17826
|
*/
|
|
17771
17827
|
this.getCode = async (symbol, context) => {
|
|
17772
|
-
|
|
17828
|
+
backtest$1.loggerService.info(OPTIMIZER_METHOD_NAME_GET_CODE, {
|
|
17773
17829
|
symbol,
|
|
17774
17830
|
context,
|
|
17775
17831
|
});
|
|
17776
|
-
|
|
17777
|
-
return await
|
|
17832
|
+
backtest$1.optimizerValidationService.validate(context.optimizerName, OPTIMIZER_METHOD_NAME_GET_CODE);
|
|
17833
|
+
return await backtest$1.optimizerGlobalService.getCode(symbol, context.optimizerName);
|
|
17778
17834
|
};
|
|
17779
17835
|
/**
|
|
17780
17836
|
* Generates and saves strategy code to file.
|
|
@@ -17788,13 +17844,13 @@ class OptimizerUtils {
|
|
|
17788
17844
|
* @throws Error if optimizer not found or file write fails
|
|
17789
17845
|
*/
|
|
17790
17846
|
this.dump = async (symbol, context, path) => {
|
|
17791
|
-
|
|
17847
|
+
backtest$1.loggerService.info(OPTIMIZER_METHOD_NAME_DUMP, {
|
|
17792
17848
|
symbol,
|
|
17793
17849
|
context,
|
|
17794
17850
|
path,
|
|
17795
17851
|
});
|
|
17796
|
-
|
|
17797
|
-
await
|
|
17852
|
+
backtest$1.optimizerValidationService.validate(context.optimizerName, OPTIMIZER_METHOD_NAME_DUMP);
|
|
17853
|
+
await backtest$1.optimizerGlobalService.dump(symbol, context.optimizerName, path);
|
|
17798
17854
|
};
|
|
17799
17855
|
}
|
|
17800
17856
|
}
|
|
@@ -17876,14 +17932,14 @@ class PartialUtils {
|
|
|
17876
17932
|
* ```
|
|
17877
17933
|
*/
|
|
17878
17934
|
this.getData = async (symbol, strategyName, backtest) => {
|
|
17879
|
-
|
|
17880
|
-
|
|
17935
|
+
backtest$1.loggerService.info(PARTIAL_METHOD_NAME_GET_DATA, { symbol, strategyName });
|
|
17936
|
+
backtest$1.strategyValidationService.validate(strategyName, PARTIAL_METHOD_NAME_GET_DATA);
|
|
17881
17937
|
{
|
|
17882
|
-
const { riskName, riskList } =
|
|
17883
|
-
riskName &&
|
|
17884
|
-
riskList && riskList.forEach((riskName) =>
|
|
17938
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17939
|
+
riskName && backtest$1.riskValidationService.validate(riskName, PARTIAL_METHOD_NAME_GET_DATA);
|
|
17940
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, PARTIAL_METHOD_NAME_GET_DATA));
|
|
17885
17941
|
}
|
|
17886
|
-
return await
|
|
17942
|
+
return await backtest$1.partialMarkdownService.getData(symbol, strategyName, backtest);
|
|
17887
17943
|
};
|
|
17888
17944
|
/**
|
|
17889
17945
|
* Generates markdown report with all partial profit/loss events for a symbol-strategy pair.
|
|
@@ -17925,14 +17981,14 @@ class PartialUtils {
|
|
|
17925
17981
|
* ```
|
|
17926
17982
|
*/
|
|
17927
17983
|
this.getReport = async (symbol, strategyName, backtest, columns) => {
|
|
17928
|
-
|
|
17929
|
-
|
|
17984
|
+
backtest$1.loggerService.info(PARTIAL_METHOD_NAME_GET_REPORT, { symbol, strategyName });
|
|
17985
|
+
backtest$1.strategyValidationService.validate(strategyName, PARTIAL_METHOD_NAME_GET_REPORT);
|
|
17930
17986
|
{
|
|
17931
|
-
const { riskName, riskList } =
|
|
17932
|
-
riskName &&
|
|
17933
|
-
riskList && riskList.forEach((riskName) =>
|
|
17987
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17988
|
+
riskName && backtest$1.riskValidationService.validate(riskName, PARTIAL_METHOD_NAME_GET_REPORT);
|
|
17989
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, PARTIAL_METHOD_NAME_GET_REPORT));
|
|
17934
17990
|
}
|
|
17935
|
-
return await
|
|
17991
|
+
return await backtest$1.partialMarkdownService.getReport(symbol, strategyName, backtest, columns);
|
|
17936
17992
|
};
|
|
17937
17993
|
/**
|
|
17938
17994
|
* Generates and saves markdown report to file.
|
|
@@ -17967,14 +18023,14 @@ class PartialUtils {
|
|
|
17967
18023
|
* ```
|
|
17968
18024
|
*/
|
|
17969
18025
|
this.dump = async (symbol, strategyName, backtest, path, columns) => {
|
|
17970
|
-
|
|
17971
|
-
|
|
18026
|
+
backtest$1.loggerService.info(PARTIAL_METHOD_NAME_DUMP, { symbol, strategyName, path });
|
|
18027
|
+
backtest$1.strategyValidationService.validate(strategyName, PARTIAL_METHOD_NAME_DUMP);
|
|
17972
18028
|
{
|
|
17973
|
-
const { riskName, riskList } =
|
|
17974
|
-
riskName &&
|
|
17975
|
-
riskList && riskList.forEach((riskName) =>
|
|
18029
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
18030
|
+
riskName && backtest$1.riskValidationService.validate(riskName, PARTIAL_METHOD_NAME_DUMP);
|
|
18031
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, PARTIAL_METHOD_NAME_DUMP));
|
|
17976
18032
|
}
|
|
17977
|
-
await
|
|
18033
|
+
await backtest$1.partialMarkdownService.dump(symbol, strategyName, backtest, path, columns);
|
|
17978
18034
|
};
|
|
17979
18035
|
}
|
|
17980
18036
|
}
|
|
@@ -18075,4 +18131,196 @@ class ConstantUtils {
|
|
|
18075
18131
|
*/
|
|
18076
18132
|
const Constant = new ConstantUtils();
|
|
18077
18133
|
|
|
18078
|
-
|
|
18134
|
+
const EXCHANGE_METHOD_NAME_GET_CANDLES = "ExchangeUtils.getCandles";
|
|
18135
|
+
const EXCHANGE_METHOD_NAME_FORMAT_QUANTITY = "ExchangeUtils.formatQuantity";
|
|
18136
|
+
const EXCHANGE_METHOD_NAME_FORMAT_PRICE = "ExchangeUtils.formatPrice";
|
|
18137
|
+
/**
|
|
18138
|
+
* Instance class for exchange operations on a specific exchange.
|
|
18139
|
+
*
|
|
18140
|
+
* Provides isolated exchange operations for a single exchange.
|
|
18141
|
+
* Each instance maintains its own context and exposes IExchangeSchema methods.
|
|
18142
|
+
* The schema is retrieved once during construction for better performance.
|
|
18143
|
+
*
|
|
18144
|
+
* @example
|
|
18145
|
+
* ```typescript
|
|
18146
|
+
* const instance = new ExchangeInstance("binance");
|
|
18147
|
+
*
|
|
18148
|
+
* const candles = await instance.getCandles("BTCUSDT", "1m", new Date(), 100);
|
|
18149
|
+
* const formattedQty = await instance.formatQuantity("BTCUSDT", 0.001);
|
|
18150
|
+
* const formattedPrice = await instance.formatPrice("BTCUSDT", 50000.123);
|
|
18151
|
+
* ```
|
|
18152
|
+
*/
|
|
18153
|
+
class ExchangeInstance {
|
|
18154
|
+
/**
|
|
18155
|
+
* Creates a new ExchangeInstance for a specific exchange.
|
|
18156
|
+
*
|
|
18157
|
+
* @param exchangeName - Exchange name (e.g., "binance")
|
|
18158
|
+
*/
|
|
18159
|
+
constructor(exchangeName) {
|
|
18160
|
+
this.exchangeName = exchangeName;
|
|
18161
|
+
/**
|
|
18162
|
+
* Fetch candles from data source (API or database).
|
|
18163
|
+
*
|
|
18164
|
+
* @param symbol - Trading pair symbol (e.g., "BTCUSDT")
|
|
18165
|
+
* @param interval - Candle time interval (e.g., "1m", "1h")
|
|
18166
|
+
* @param since - Start date for candle fetching
|
|
18167
|
+
* @param limit - Maximum number of candles to fetch
|
|
18168
|
+
* @returns Promise resolving to array of OHLCV candle data
|
|
18169
|
+
*
|
|
18170
|
+
* @example
|
|
18171
|
+
* ```typescript
|
|
18172
|
+
* const instance = new ExchangeInstance("binance");
|
|
18173
|
+
* const candles = await instance.getCandles("BTCUSDT", "1m", new Date(), 100);
|
|
18174
|
+
* ```
|
|
18175
|
+
*/
|
|
18176
|
+
this.getCandles = async (symbol, interval, since, limit) => {
|
|
18177
|
+
backtest$1.loggerService.info(EXCHANGE_METHOD_NAME_GET_CANDLES, {
|
|
18178
|
+
exchangeName: this.exchangeName,
|
|
18179
|
+
symbol,
|
|
18180
|
+
interval,
|
|
18181
|
+
since,
|
|
18182
|
+
limit,
|
|
18183
|
+
});
|
|
18184
|
+
return await this._schema.getCandles(symbol, interval, since, limit);
|
|
18185
|
+
};
|
|
18186
|
+
/**
|
|
18187
|
+
* Format quantity according to exchange precision rules.
|
|
18188
|
+
*
|
|
18189
|
+
* @param symbol - Trading pair symbol
|
|
18190
|
+
* @param quantity - Raw quantity value
|
|
18191
|
+
* @returns Promise resolving to formatted quantity string
|
|
18192
|
+
*
|
|
18193
|
+
* @example
|
|
18194
|
+
* ```typescript
|
|
18195
|
+
* const instance = new ExchangeInstance("binance");
|
|
18196
|
+
* const formatted = await instance.formatQuantity("BTCUSDT", 0.001);
|
|
18197
|
+
* console.log(formatted); // "0.001"
|
|
18198
|
+
* ```
|
|
18199
|
+
*/
|
|
18200
|
+
this.formatQuantity = async (symbol, quantity) => {
|
|
18201
|
+
backtest$1.loggerService.info(EXCHANGE_METHOD_NAME_FORMAT_QUANTITY, {
|
|
18202
|
+
exchangeName: this.exchangeName,
|
|
18203
|
+
symbol,
|
|
18204
|
+
quantity,
|
|
18205
|
+
});
|
|
18206
|
+
return await this._schema.formatQuantity(symbol, quantity);
|
|
18207
|
+
};
|
|
18208
|
+
/**
|
|
18209
|
+
* Format price according to exchange precision rules.
|
|
18210
|
+
*
|
|
18211
|
+
* @param symbol - Trading pair symbol
|
|
18212
|
+
* @param price - Raw price value
|
|
18213
|
+
* @returns Promise resolving to formatted price string
|
|
18214
|
+
*
|
|
18215
|
+
* @example
|
|
18216
|
+
* ```typescript
|
|
18217
|
+
* const instance = new ExchangeInstance("binance");
|
|
18218
|
+
* const formatted = await instance.formatPrice("BTCUSDT", 50000.123);
|
|
18219
|
+
* console.log(formatted); // "50000.12"
|
|
18220
|
+
* ```
|
|
18221
|
+
*/
|
|
18222
|
+
this.formatPrice = async (symbol, price) => {
|
|
18223
|
+
backtest$1.loggerService.info(EXCHANGE_METHOD_NAME_FORMAT_PRICE, {
|
|
18224
|
+
exchangeName: this.exchangeName,
|
|
18225
|
+
symbol,
|
|
18226
|
+
price,
|
|
18227
|
+
});
|
|
18228
|
+
return await this._schema.formatPrice(symbol, price);
|
|
18229
|
+
};
|
|
18230
|
+
this._schema = backtest$1.exchangeSchemaService.get(this.exchangeName);
|
|
18231
|
+
}
|
|
18232
|
+
}
|
|
18233
|
+
/**
|
|
18234
|
+
* Utility class for exchange operations.
|
|
18235
|
+
*
|
|
18236
|
+
* Provides simplified access to exchange schema methods with validation.
|
|
18237
|
+
* Exported as singleton instance for convenient usage.
|
|
18238
|
+
*
|
|
18239
|
+
* @example
|
|
18240
|
+
* ```typescript
|
|
18241
|
+
* import { Exchange } from "./classes/Exchange";
|
|
18242
|
+
*
|
|
18243
|
+
* const candles = await Exchange.getCandles("BTCUSDT", "1m", new Date(), 100, {
|
|
18244
|
+
* exchangeName: "binance"
|
|
18245
|
+
* });
|
|
18246
|
+
* const formatted = await Exchange.formatQuantity("BTCUSDT", 0.001, {
|
|
18247
|
+
* exchangeName: "binance"
|
|
18248
|
+
* });
|
|
18249
|
+
* ```
|
|
18250
|
+
*/
|
|
18251
|
+
class ExchangeUtils {
|
|
18252
|
+
constructor() {
|
|
18253
|
+
/**
|
|
18254
|
+
* Memoized function to get or create ExchangeInstance for an exchange.
|
|
18255
|
+
* Each exchange gets its own isolated instance.
|
|
18256
|
+
*/
|
|
18257
|
+
this._getInstance = memoize(([exchangeName]) => exchangeName, (exchangeName) => new ExchangeInstance(exchangeName));
|
|
18258
|
+
/**
|
|
18259
|
+
* Fetch candles from data source (API or database).
|
|
18260
|
+
*
|
|
18261
|
+
* @param symbol - Trading pair symbol (e.g., "BTCUSDT")
|
|
18262
|
+
* @param interval - Candle time interval (e.g., "1m", "1h")
|
|
18263
|
+
* @param since - Start date for candle fetching
|
|
18264
|
+
* @param limit - Maximum number of candles to fetch
|
|
18265
|
+
* @param context - Execution context with exchange name
|
|
18266
|
+
* @returns Promise resolving to array of OHLCV candle data
|
|
18267
|
+
*/
|
|
18268
|
+
this.getCandles = async (symbol, interval, since, limit, context) => {
|
|
18269
|
+
backtest$1.exchangeValidationService.validate(context.exchangeName, EXCHANGE_METHOD_NAME_GET_CANDLES);
|
|
18270
|
+
const instance = this._getInstance(context.exchangeName);
|
|
18271
|
+
return await instance.getCandles(symbol, interval, since, limit);
|
|
18272
|
+
};
|
|
18273
|
+
/**
|
|
18274
|
+
* Format quantity according to exchange precision rules.
|
|
18275
|
+
*
|
|
18276
|
+
* @param symbol - Trading pair symbol
|
|
18277
|
+
* @param quantity - Raw quantity value
|
|
18278
|
+
* @param context - Execution context with exchange name
|
|
18279
|
+
* @returns Promise resolving to formatted quantity string
|
|
18280
|
+
*/
|
|
18281
|
+
this.formatQuantity = async (symbol, quantity, context) => {
|
|
18282
|
+
backtest$1.exchangeValidationService.validate(context.exchangeName, EXCHANGE_METHOD_NAME_FORMAT_QUANTITY);
|
|
18283
|
+
const instance = this._getInstance(context.exchangeName);
|
|
18284
|
+
return await instance.formatQuantity(symbol, quantity);
|
|
18285
|
+
};
|
|
18286
|
+
/**
|
|
18287
|
+
* Format price according to exchange precision rules.
|
|
18288
|
+
*
|
|
18289
|
+
* @param symbol - Trading pair symbol
|
|
18290
|
+
* @param price - Raw price value
|
|
18291
|
+
* @param context - Execution context with exchange name
|
|
18292
|
+
* @returns Promise resolving to formatted price string
|
|
18293
|
+
*/
|
|
18294
|
+
this.formatPrice = async (symbol, price, context) => {
|
|
18295
|
+
backtest$1.exchangeValidationService.validate(context.exchangeName, EXCHANGE_METHOD_NAME_FORMAT_PRICE);
|
|
18296
|
+
const instance = this._getInstance(context.exchangeName);
|
|
18297
|
+
return await instance.formatPrice(symbol, price);
|
|
18298
|
+
};
|
|
18299
|
+
}
|
|
18300
|
+
}
|
|
18301
|
+
/**
|
|
18302
|
+
* Singleton instance of ExchangeUtils for convenient exchange operations.
|
|
18303
|
+
*
|
|
18304
|
+
* @example
|
|
18305
|
+
* ```typescript
|
|
18306
|
+
* import { Exchange } from "./classes/Exchange";
|
|
18307
|
+
*
|
|
18308
|
+
* // Using static-like API with context
|
|
18309
|
+
* const candles = await Exchange.getCandles("BTCUSDT", "1m", new Date(), 100, {
|
|
18310
|
+
* exchangeName: "binance"
|
|
18311
|
+
* });
|
|
18312
|
+
* const qty = await Exchange.formatQuantity("BTCUSDT", 0.001, {
|
|
18313
|
+
* exchangeName: "binance"
|
|
18314
|
+
* });
|
|
18315
|
+
* const price = await Exchange.formatPrice("BTCUSDT", 50000.123, {
|
|
18316
|
+
* exchangeName: "binance"
|
|
18317
|
+
* });
|
|
18318
|
+
*
|
|
18319
|
+
* // Using instance API (no context needed, exchange set in constructor)
|
|
18320
|
+
* const binance = new ExchangeInstance("binance");
|
|
18321
|
+
* const candles2 = await binance.getCandles("BTCUSDT", "1m", new Date(), 100);
|
|
18322
|
+
* ```
|
|
18323
|
+
*/
|
|
18324
|
+
const Exchange = new ExchangeUtils();
|
|
18325
|
+
|
|
18326
|
+
export { Backtest, Constant, Exchange, 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, getColumns, getConfig, getDate, getDefaultColumns, getDefaultConfig, getMode, hasTradeContext, 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, setColumns, setConfig, setLogger };
|