backtest-kit 1.5.29 → 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 +637 -394
- package/build/index.mjs +636 -395
- package/package.json +1 -1
- package/types.d.ts +107 -1
package/build/index.cjs
CHANGED
|
@@ -2043,7 +2043,7 @@ const BASE_WAIT_FOR_INIT_FN_METHOD_NAME = "PersistBase.waitForInitFn";
|
|
|
2043
2043
|
const BASE_UNLINK_RETRY_COUNT = 5;
|
|
2044
2044
|
const BASE_UNLINK_RETRY_DELAY = 1000;
|
|
2045
2045
|
const BASE_WAIT_FOR_INIT_FN = async (self) => {
|
|
2046
|
-
|
|
2046
|
+
backtest$1.loggerService.debug(BASE_WAIT_FOR_INIT_FN_METHOD_NAME, {
|
|
2047
2047
|
entityName: self.entityName,
|
|
2048
2048
|
directory: self._directory,
|
|
2049
2049
|
});
|
|
@@ -2101,7 +2101,7 @@ const PersistBase = functoolsKit.makeExtendable(class {
|
|
|
2101
2101
|
this.entityName = entityName;
|
|
2102
2102
|
this.baseDir = baseDir;
|
|
2103
2103
|
this[_a] = functoolsKit.singleshot(async () => await BASE_WAIT_FOR_INIT_FN(this));
|
|
2104
|
-
|
|
2104
|
+
backtest$1.loggerService.debug(PERSIST_BASE_METHOD_NAME_CTOR, {
|
|
2105
2105
|
entityName: this.entityName,
|
|
2106
2106
|
baseDir,
|
|
2107
2107
|
});
|
|
@@ -2117,7 +2117,7 @@ const PersistBase = functoolsKit.makeExtendable(class {
|
|
|
2117
2117
|
return path.join(this.baseDir, this.entityName, `${entityId}.json`);
|
|
2118
2118
|
}
|
|
2119
2119
|
async waitForInit(initial) {
|
|
2120
|
-
|
|
2120
|
+
backtest$1.loggerService.debug(PERSIST_BASE_METHOD_NAME_WAIT_FOR_INIT, {
|
|
2121
2121
|
entityName: this.entityName,
|
|
2122
2122
|
initial,
|
|
2123
2123
|
});
|
|
@@ -2134,7 +2134,7 @@ const PersistBase = functoolsKit.makeExtendable(class {
|
|
|
2134
2134
|
return length;
|
|
2135
2135
|
}
|
|
2136
2136
|
async readValue(entityId) {
|
|
2137
|
-
|
|
2137
|
+
backtest$1.loggerService.debug(PERSIST_BASE_METHOD_NAME_READ_VALUE, {
|
|
2138
2138
|
entityName: this.entityName,
|
|
2139
2139
|
entityId,
|
|
2140
2140
|
});
|
|
@@ -2151,7 +2151,7 @@ const PersistBase = functoolsKit.makeExtendable(class {
|
|
|
2151
2151
|
}
|
|
2152
2152
|
}
|
|
2153
2153
|
async hasValue(entityId) {
|
|
2154
|
-
|
|
2154
|
+
backtest$1.loggerService.debug(PERSIST_BASE_METHOD_NAME_HAS_VALUE, {
|
|
2155
2155
|
entityName: this.entityName,
|
|
2156
2156
|
entityId,
|
|
2157
2157
|
});
|
|
@@ -2168,7 +2168,7 @@ const PersistBase = functoolsKit.makeExtendable(class {
|
|
|
2168
2168
|
}
|
|
2169
2169
|
}
|
|
2170
2170
|
async writeValue(entityId, entity) {
|
|
2171
|
-
|
|
2171
|
+
backtest$1.loggerService.debug(PERSIST_BASE_METHOD_NAME_WRITE_VALUE, {
|
|
2172
2172
|
entityName: this.entityName,
|
|
2173
2173
|
entityId,
|
|
2174
2174
|
});
|
|
@@ -2189,7 +2189,7 @@ const PersistBase = functoolsKit.makeExtendable(class {
|
|
|
2189
2189
|
* @throws Error if entity not found or deletion fails
|
|
2190
2190
|
*/
|
|
2191
2191
|
async removeValue(entityId) {
|
|
2192
|
-
|
|
2192
|
+
backtest$1.loggerService.debug(PERSIST_BASE_METHOD_NAME_REMOVE_VALUE, {
|
|
2193
2193
|
entityName: this.entityName,
|
|
2194
2194
|
entityId,
|
|
2195
2195
|
});
|
|
@@ -2211,7 +2211,7 @@ const PersistBase = functoolsKit.makeExtendable(class {
|
|
|
2211
2211
|
* @throws Error if deletion fails
|
|
2212
2212
|
*/
|
|
2213
2213
|
async removeAll() {
|
|
2214
|
-
|
|
2214
|
+
backtest$1.loggerService.debug(PERSIST_BASE_METHOD_NAME_REMOVE_ALL, {
|
|
2215
2215
|
entityName: this.entityName,
|
|
2216
2216
|
});
|
|
2217
2217
|
try {
|
|
@@ -2233,7 +2233,7 @@ const PersistBase = functoolsKit.makeExtendable(class {
|
|
|
2233
2233
|
* @throws Error if reading fails
|
|
2234
2234
|
*/
|
|
2235
2235
|
async *values() {
|
|
2236
|
-
|
|
2236
|
+
backtest$1.loggerService.debug(PERSIST_BASE_METHOD_NAME_VALUES, {
|
|
2237
2237
|
entityName: this.entityName,
|
|
2238
2238
|
});
|
|
2239
2239
|
try {
|
|
@@ -2262,7 +2262,7 @@ const PersistBase = functoolsKit.makeExtendable(class {
|
|
|
2262
2262
|
* @throws Error if reading fails
|
|
2263
2263
|
*/
|
|
2264
2264
|
async *keys() {
|
|
2265
|
-
|
|
2265
|
+
backtest$1.loggerService.debug(PERSIST_BASE_METHOD_NAME_KEYS, {
|
|
2266
2266
|
entityName: this.entityName,
|
|
2267
2267
|
});
|
|
2268
2268
|
try {
|
|
@@ -2367,7 +2367,7 @@ class PersistSignalUtils {
|
|
|
2367
2367
|
* @returns Promise resolving to signal or null
|
|
2368
2368
|
*/
|
|
2369
2369
|
this.readSignalData = async (symbol, strategyName) => {
|
|
2370
|
-
|
|
2370
|
+
backtest$1.loggerService.info(PERSIST_SIGNAL_UTILS_METHOD_NAME_READ_DATA);
|
|
2371
2371
|
const key = `${symbol}:${strategyName}`;
|
|
2372
2372
|
const isInitial = !this.getSignalStorage.has(key);
|
|
2373
2373
|
const stateStorage = this.getSignalStorage(symbol, strategyName);
|
|
@@ -2389,7 +2389,7 @@ class PersistSignalUtils {
|
|
|
2389
2389
|
* @returns Promise that resolves when write is complete
|
|
2390
2390
|
*/
|
|
2391
2391
|
this.writeSignalData = async (signalRow, symbol, strategyName) => {
|
|
2392
|
-
|
|
2392
|
+
backtest$1.loggerService.info(PERSIST_SIGNAL_UTILS_METHOD_NAME_WRITE_DATA);
|
|
2393
2393
|
const key = `${symbol}:${strategyName}`;
|
|
2394
2394
|
const isInitial = !this.getSignalStorage.has(key);
|
|
2395
2395
|
const stateStorage = this.getSignalStorage(symbol, strategyName);
|
|
@@ -2412,7 +2412,7 @@ class PersistSignalUtils {
|
|
|
2412
2412
|
* ```
|
|
2413
2413
|
*/
|
|
2414
2414
|
usePersistSignalAdapter(Ctor) {
|
|
2415
|
-
|
|
2415
|
+
backtest$1.loggerService.info(PERSIST_SIGNAL_UTILS_METHOD_NAME_USE_PERSIST_SIGNAL_ADAPTER);
|
|
2416
2416
|
this.PersistSignalFactory = Ctor;
|
|
2417
2417
|
}
|
|
2418
2418
|
}
|
|
@@ -2464,7 +2464,7 @@ class PersistRiskUtils {
|
|
|
2464
2464
|
* @returns Promise resolving to Map of active positions
|
|
2465
2465
|
*/
|
|
2466
2466
|
this.readPositionData = async (riskName) => {
|
|
2467
|
-
|
|
2467
|
+
backtest$1.loggerService.info(PERSIST_RISK_UTILS_METHOD_NAME_READ_DATA);
|
|
2468
2468
|
const isInitial = !this.getRiskStorage.has(riskName);
|
|
2469
2469
|
const stateStorage = this.getRiskStorage(riskName);
|
|
2470
2470
|
await stateStorage.waitForInit(isInitial);
|
|
@@ -2485,7 +2485,7 @@ class PersistRiskUtils {
|
|
|
2485
2485
|
* @returns Promise that resolves when write is complete
|
|
2486
2486
|
*/
|
|
2487
2487
|
this.writePositionData = async (riskRow, riskName) => {
|
|
2488
|
-
|
|
2488
|
+
backtest$1.loggerService.info(PERSIST_RISK_UTILS_METHOD_NAME_WRITE_DATA);
|
|
2489
2489
|
const isInitial = !this.getRiskStorage.has(riskName);
|
|
2490
2490
|
const stateStorage = this.getRiskStorage(riskName);
|
|
2491
2491
|
await stateStorage.waitForInit(isInitial);
|
|
@@ -2508,7 +2508,7 @@ class PersistRiskUtils {
|
|
|
2508
2508
|
* ```
|
|
2509
2509
|
*/
|
|
2510
2510
|
usePersistRiskAdapter(Ctor) {
|
|
2511
|
-
|
|
2511
|
+
backtest$1.loggerService.info(PERSIST_RISK_UTILS_METHOD_NAME_USE_PERSIST_RISK_ADAPTER);
|
|
2512
2512
|
this.PersistRiskFactory = Ctor;
|
|
2513
2513
|
}
|
|
2514
2514
|
}
|
|
@@ -2558,7 +2558,7 @@ class PersistScheduleUtils {
|
|
|
2558
2558
|
* @returns Promise resolving to scheduled signal or null
|
|
2559
2559
|
*/
|
|
2560
2560
|
this.readScheduleData = async (symbol, strategyName) => {
|
|
2561
|
-
|
|
2561
|
+
backtest$1.loggerService.info(PERSIST_SCHEDULE_UTILS_METHOD_NAME_READ_DATA);
|
|
2562
2562
|
const key = `${symbol}:${strategyName}`;
|
|
2563
2563
|
const isInitial = !this.getScheduleStorage.has(key);
|
|
2564
2564
|
const stateStorage = this.getScheduleStorage(symbol, strategyName);
|
|
@@ -2580,7 +2580,7 @@ class PersistScheduleUtils {
|
|
|
2580
2580
|
* @returns Promise that resolves when write is complete
|
|
2581
2581
|
*/
|
|
2582
2582
|
this.writeScheduleData = async (scheduledSignalRow, symbol, strategyName) => {
|
|
2583
|
-
|
|
2583
|
+
backtest$1.loggerService.info(PERSIST_SCHEDULE_UTILS_METHOD_NAME_WRITE_DATA);
|
|
2584
2584
|
const key = `${symbol}:${strategyName}`;
|
|
2585
2585
|
const isInitial = !this.getScheduleStorage.has(key);
|
|
2586
2586
|
const stateStorage = this.getScheduleStorage(symbol, strategyName);
|
|
@@ -2603,7 +2603,7 @@ class PersistScheduleUtils {
|
|
|
2603
2603
|
* ```
|
|
2604
2604
|
*/
|
|
2605
2605
|
usePersistScheduleAdapter(Ctor) {
|
|
2606
|
-
|
|
2606
|
+
backtest$1.loggerService.info(PERSIST_SCHEDULE_UTILS_METHOD_NAME_USE_PERSIST_SCHEDULE_ADAPTER);
|
|
2607
2607
|
this.PersistScheduleFactory = Ctor;
|
|
2608
2608
|
}
|
|
2609
2609
|
}
|
|
@@ -2653,7 +2653,7 @@ class PersistPartialUtils {
|
|
|
2653
2653
|
* @returns Promise resolving to partial data record
|
|
2654
2654
|
*/
|
|
2655
2655
|
this.readPartialData = async (symbol, strategyName) => {
|
|
2656
|
-
|
|
2656
|
+
backtest$1.loggerService.info(PERSIST_PARTIAL_UTILS_METHOD_NAME_READ_DATA);
|
|
2657
2657
|
const key = `${symbol}:${strategyName}`;
|
|
2658
2658
|
const isInitial = !this.getPartialStorage.has(key);
|
|
2659
2659
|
const stateStorage = this.getPartialStorage(symbol, strategyName);
|
|
@@ -2676,7 +2676,7 @@ class PersistPartialUtils {
|
|
|
2676
2676
|
* @returns Promise that resolves when write is complete
|
|
2677
2677
|
*/
|
|
2678
2678
|
this.writePartialData = async (partialData, symbol, strategyName) => {
|
|
2679
|
-
|
|
2679
|
+
backtest$1.loggerService.info(PERSIST_PARTIAL_UTILS_METHOD_NAME_WRITE_DATA);
|
|
2680
2680
|
const key = `${symbol}:${strategyName}`;
|
|
2681
2681
|
const isInitial = !this.getPartialStorage.has(key);
|
|
2682
2682
|
const stateStorage = this.getPartialStorage(symbol, strategyName);
|
|
@@ -2700,7 +2700,7 @@ class PersistPartialUtils {
|
|
|
2700
2700
|
* ```
|
|
2701
2701
|
*/
|
|
2702
2702
|
usePersistPartialAdapter(Ctor) {
|
|
2703
|
-
|
|
2703
|
+
backtest$1.loggerService.info(PERSIST_PARTIAL_UTILS_METHOD_NAME_USE_PERSIST_PARTIAL_ADAPTER);
|
|
2704
2704
|
this.PersistPartialFactory = Ctor;
|
|
2705
2705
|
}
|
|
2706
2706
|
}
|
|
@@ -3169,7 +3169,7 @@ const GET_SIGNAL_FN = functoolsKit.trycatch(async (self) => {
|
|
|
3169
3169
|
error: functoolsKit.errorData(error),
|
|
3170
3170
|
message: functoolsKit.getErrorMessage(error),
|
|
3171
3171
|
};
|
|
3172
|
-
|
|
3172
|
+
backtest$1.loggerService.warn(message, payload);
|
|
3173
3173
|
console.warn(message, payload);
|
|
3174
3174
|
errorEmitter.next(error);
|
|
3175
3175
|
},
|
|
@@ -4349,7 +4349,7 @@ class MergeRisk {
|
|
|
4349
4349
|
* @returns Promise resolving to true if all risks approve, false if any risk rejects
|
|
4350
4350
|
*/
|
|
4351
4351
|
async checkSignal(params) {
|
|
4352
|
-
|
|
4352
|
+
backtest$1.loggerService.info("MergeRisk checkSignal", {
|
|
4353
4353
|
params,
|
|
4354
4354
|
});
|
|
4355
4355
|
const riskCheck = await Promise.all(this._riskList.map(async (risk) => await risk.checkSignal(params)));
|
|
@@ -4366,7 +4366,7 @@ class MergeRisk {
|
|
|
4366
4366
|
* @returns Promise that resolves when all risks have registered the signal
|
|
4367
4367
|
*/
|
|
4368
4368
|
async addSignal(symbol, context) {
|
|
4369
|
-
|
|
4369
|
+
backtest$1.loggerService.info("MergeRisk addSignal", {
|
|
4370
4370
|
symbol,
|
|
4371
4371
|
context,
|
|
4372
4372
|
});
|
|
@@ -4383,7 +4383,7 @@ class MergeRisk {
|
|
|
4383
4383
|
* @returns Promise that resolves when all risks have removed the signal
|
|
4384
4384
|
*/
|
|
4385
4385
|
async removeSignal(symbol, context) {
|
|
4386
|
-
|
|
4386
|
+
backtest$1.loggerService.info("MergeRisk removeSignal", {
|
|
4387
4387
|
symbol,
|
|
4388
4388
|
context,
|
|
4389
4389
|
});
|
|
@@ -4452,18 +4452,18 @@ class RiskUtils {
|
|
|
4452
4452
|
* ```
|
|
4453
4453
|
*/
|
|
4454
4454
|
this.getData = async (symbol, strategyName, backtest) => {
|
|
4455
|
-
|
|
4455
|
+
backtest$1.loggerService.info(RISK_METHOD_NAME_GET_DATA, {
|
|
4456
4456
|
symbol,
|
|
4457
4457
|
strategyName,
|
|
4458
4458
|
});
|
|
4459
|
-
|
|
4459
|
+
backtest$1.strategyValidationService.validate(strategyName, RISK_METHOD_NAME_GET_DATA);
|
|
4460
4460
|
{
|
|
4461
|
-
const { riskName, riskList } =
|
|
4461
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
4462
4462
|
riskName &&
|
|
4463
|
-
|
|
4464
|
-
riskList && riskList.forEach((riskName) =>
|
|
4463
|
+
backtest$1.riskValidationService.validate(riskName, RISK_METHOD_NAME_GET_DATA);
|
|
4464
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, RISK_METHOD_NAME_GET_DATA));
|
|
4465
4465
|
}
|
|
4466
|
-
return await
|
|
4466
|
+
return await backtest$1.riskMarkdownService.getData(symbol, strategyName, backtest);
|
|
4467
4467
|
};
|
|
4468
4468
|
/**
|
|
4469
4469
|
* Generates markdown report with all risk rejection events for a symbol-strategy pair.
|
|
@@ -4507,18 +4507,18 @@ class RiskUtils {
|
|
|
4507
4507
|
* ```
|
|
4508
4508
|
*/
|
|
4509
4509
|
this.getReport = async (symbol, strategyName, backtest, columns) => {
|
|
4510
|
-
|
|
4510
|
+
backtest$1.loggerService.info(RISK_METHOD_NAME_GET_REPORT, {
|
|
4511
4511
|
symbol,
|
|
4512
4512
|
strategyName,
|
|
4513
4513
|
});
|
|
4514
|
-
|
|
4514
|
+
backtest$1.strategyValidationService.validate(strategyName, RISK_METHOD_NAME_GET_REPORT);
|
|
4515
4515
|
{
|
|
4516
|
-
const { riskName, riskList } =
|
|
4516
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
4517
4517
|
riskName &&
|
|
4518
|
-
|
|
4519
|
-
riskList && riskList.forEach((riskName) =>
|
|
4518
|
+
backtest$1.riskValidationService.validate(riskName, RISK_METHOD_NAME_GET_REPORT);
|
|
4519
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, RISK_METHOD_NAME_GET_REPORT));
|
|
4520
4520
|
}
|
|
4521
|
-
return await
|
|
4521
|
+
return await backtest$1.riskMarkdownService.getReport(symbol, strategyName, backtest, columns);
|
|
4522
4522
|
};
|
|
4523
4523
|
/**
|
|
4524
4524
|
* Generates and saves markdown report to file.
|
|
@@ -4553,19 +4553,19 @@ class RiskUtils {
|
|
|
4553
4553
|
* ```
|
|
4554
4554
|
*/
|
|
4555
4555
|
this.dump = async (symbol, strategyName, backtest, path, columns) => {
|
|
4556
|
-
|
|
4556
|
+
backtest$1.loggerService.info(RISK_METHOD_NAME_DUMP, {
|
|
4557
4557
|
symbol,
|
|
4558
4558
|
strategyName,
|
|
4559
4559
|
path,
|
|
4560
4560
|
});
|
|
4561
|
-
|
|
4561
|
+
backtest$1.strategyValidationService.validate(strategyName, RISK_METHOD_NAME_DUMP);
|
|
4562
4562
|
{
|
|
4563
|
-
const { riskName, riskList } =
|
|
4563
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
4564
4564
|
riskName &&
|
|
4565
|
-
|
|
4566
|
-
riskList && riskList.forEach((riskName) =>
|
|
4565
|
+
backtest$1.riskValidationService.validate(riskName, RISK_METHOD_NAME_DUMP);
|
|
4566
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, RISK_METHOD_NAME_DUMP));
|
|
4567
4567
|
}
|
|
4568
|
-
await
|
|
4568
|
+
await backtest$1.riskMarkdownService.dump(symbol, strategyName, backtest, path, columns);
|
|
4569
4569
|
};
|
|
4570
4570
|
}
|
|
4571
4571
|
}
|
|
@@ -5183,7 +5183,7 @@ const DO_VALIDATION_FN = functoolsKit.trycatch(async (validation, params) => {
|
|
|
5183
5183
|
error: functoolsKit.errorData(error),
|
|
5184
5184
|
message: functoolsKit.getErrorMessage(error),
|
|
5185
5185
|
};
|
|
5186
|
-
|
|
5186
|
+
backtest$1.loggerService.warn(message, payload);
|
|
5187
5187
|
console.warn(message, payload);
|
|
5188
5188
|
validationSubject.next(error);
|
|
5189
5189
|
},
|
|
@@ -13661,7 +13661,7 @@ const backtest = {
|
|
|
13661
13661
|
...templateServices,
|
|
13662
13662
|
};
|
|
13663
13663
|
init();
|
|
13664
|
-
var
|
|
13664
|
+
var backtest$1 = backtest;
|
|
13665
13665
|
|
|
13666
13666
|
/**
|
|
13667
13667
|
* Sets custom logger implementation for the framework.
|
|
@@ -13681,7 +13681,7 @@ var bt = backtest;
|
|
|
13681
13681
|
* ```
|
|
13682
13682
|
*/
|
|
13683
13683
|
function setLogger(logger) {
|
|
13684
|
-
|
|
13684
|
+
backtest$1.loggerService.setLogger(logger);
|
|
13685
13685
|
}
|
|
13686
13686
|
/**
|
|
13687
13687
|
* Sets global configuration parameters for the framework.
|
|
@@ -13699,7 +13699,7 @@ function setConfig(config, _unsafe) {
|
|
|
13699
13699
|
const prevConfig = Object.assign({}, GLOBAL_CONFIG);
|
|
13700
13700
|
try {
|
|
13701
13701
|
Object.assign(GLOBAL_CONFIG, config);
|
|
13702
|
-
!_unsafe &&
|
|
13702
|
+
!_unsafe && backtest$1.configValidationService.validate();
|
|
13703
13703
|
}
|
|
13704
13704
|
catch (error) {
|
|
13705
13705
|
console.warn(`backtest-kit setConfig failed: ${functoolsKit.getErrorMessage(error)}`, config);
|
|
@@ -13770,7 +13770,7 @@ function setColumns(columns, _unsafe) {
|
|
|
13770
13770
|
const prevConfig = Object.assign({}, COLUMN_CONFIG);
|
|
13771
13771
|
try {
|
|
13772
13772
|
Object.assign(COLUMN_CONFIG, columns);
|
|
13773
|
-
!_unsafe &&
|
|
13773
|
+
!_unsafe && backtest$1.columnValidationService.validate();
|
|
13774
13774
|
}
|
|
13775
13775
|
catch (error) {
|
|
13776
13776
|
console.warn(`backtest-kit setColumns failed: ${functoolsKit.getErrorMessage(error)}`, columns);
|
|
@@ -13855,11 +13855,11 @@ const ADD_OPTIMIZER_METHOD_NAME = "add.addOptimizer";
|
|
|
13855
13855
|
* ```
|
|
13856
13856
|
*/
|
|
13857
13857
|
function addStrategy(strategySchema) {
|
|
13858
|
-
|
|
13858
|
+
backtest$1.loggerService.info(ADD_STRATEGY_METHOD_NAME, {
|
|
13859
13859
|
strategySchema,
|
|
13860
13860
|
});
|
|
13861
|
-
|
|
13862
|
-
|
|
13861
|
+
backtest$1.strategyValidationService.addStrategy(strategySchema.strategyName, strategySchema);
|
|
13862
|
+
backtest$1.strategySchemaService.register(strategySchema.strategyName, strategySchema);
|
|
13863
13863
|
}
|
|
13864
13864
|
/**
|
|
13865
13865
|
* Registers an exchange data source in the framework.
|
|
@@ -13897,11 +13897,11 @@ function addStrategy(strategySchema) {
|
|
|
13897
13897
|
* ```
|
|
13898
13898
|
*/
|
|
13899
13899
|
function addExchange(exchangeSchema) {
|
|
13900
|
-
|
|
13900
|
+
backtest$1.loggerService.info(ADD_EXCHANGE_METHOD_NAME, {
|
|
13901
13901
|
exchangeSchema,
|
|
13902
13902
|
});
|
|
13903
|
-
|
|
13904
|
-
|
|
13903
|
+
backtest$1.exchangeValidationService.addExchange(exchangeSchema.exchangeName, exchangeSchema);
|
|
13904
|
+
backtest$1.exchangeSchemaService.register(exchangeSchema.exchangeName, exchangeSchema);
|
|
13905
13905
|
}
|
|
13906
13906
|
/**
|
|
13907
13907
|
* Registers a timeframe generator for backtesting.
|
|
@@ -13934,11 +13934,11 @@ function addExchange(exchangeSchema) {
|
|
|
13934
13934
|
* ```
|
|
13935
13935
|
*/
|
|
13936
13936
|
function addFrame(frameSchema) {
|
|
13937
|
-
|
|
13937
|
+
backtest$1.loggerService.info(ADD_FRAME_METHOD_NAME, {
|
|
13938
13938
|
frameSchema,
|
|
13939
13939
|
});
|
|
13940
|
-
|
|
13941
|
-
|
|
13940
|
+
backtest$1.frameValidationService.addFrame(frameSchema.frameName, frameSchema);
|
|
13941
|
+
backtest$1.frameSchemaService.register(frameSchema.frameName, frameSchema);
|
|
13942
13942
|
}
|
|
13943
13943
|
/**
|
|
13944
13944
|
* Registers a walker for strategy comparison.
|
|
@@ -13978,11 +13978,11 @@ function addFrame(frameSchema) {
|
|
|
13978
13978
|
* ```
|
|
13979
13979
|
*/
|
|
13980
13980
|
function addWalker(walkerSchema) {
|
|
13981
|
-
|
|
13981
|
+
backtest$1.loggerService.info(ADD_WALKER_METHOD_NAME, {
|
|
13982
13982
|
walkerSchema,
|
|
13983
13983
|
});
|
|
13984
|
-
|
|
13985
|
-
|
|
13984
|
+
backtest$1.walkerValidationService.addWalker(walkerSchema.walkerName, walkerSchema);
|
|
13985
|
+
backtest$1.walkerSchemaService.register(walkerSchema.walkerName, walkerSchema);
|
|
13986
13986
|
}
|
|
13987
13987
|
/**
|
|
13988
13988
|
* Registers a position sizing configuration in the framework.
|
|
@@ -14037,11 +14037,11 @@ function addWalker(walkerSchema) {
|
|
|
14037
14037
|
* ```
|
|
14038
14038
|
*/
|
|
14039
14039
|
function addSizing(sizingSchema) {
|
|
14040
|
-
|
|
14040
|
+
backtest$1.loggerService.info(ADD_SIZING_METHOD_NAME, {
|
|
14041
14041
|
sizingSchema,
|
|
14042
14042
|
});
|
|
14043
|
-
|
|
14044
|
-
|
|
14043
|
+
backtest$1.sizingValidationService.addSizing(sizingSchema.sizingName, sizingSchema);
|
|
14044
|
+
backtest$1.sizingSchemaService.register(sizingSchema.sizingName, sizingSchema);
|
|
14045
14045
|
}
|
|
14046
14046
|
/**
|
|
14047
14047
|
* Registers a risk management configuration in the framework.
|
|
@@ -14105,11 +14105,11 @@ function addSizing(sizingSchema) {
|
|
|
14105
14105
|
* ```
|
|
14106
14106
|
*/
|
|
14107
14107
|
function addRisk(riskSchema) {
|
|
14108
|
-
|
|
14108
|
+
backtest$1.loggerService.info(ADD_RISK_METHOD_NAME, {
|
|
14109
14109
|
riskSchema,
|
|
14110
14110
|
});
|
|
14111
|
-
|
|
14112
|
-
|
|
14111
|
+
backtest$1.riskValidationService.addRisk(riskSchema.riskName, riskSchema);
|
|
14112
|
+
backtest$1.riskSchemaService.register(riskSchema.riskName, riskSchema);
|
|
14113
14113
|
}
|
|
14114
14114
|
/**
|
|
14115
14115
|
* Registers an optimizer configuration in the framework.
|
|
@@ -14199,11 +14199,11 @@ function addRisk(riskSchema) {
|
|
|
14199
14199
|
* ```
|
|
14200
14200
|
*/
|
|
14201
14201
|
function addOptimizer(optimizerSchema) {
|
|
14202
|
-
|
|
14202
|
+
backtest$1.loggerService.info(ADD_OPTIMIZER_METHOD_NAME, {
|
|
14203
14203
|
optimizerSchema,
|
|
14204
14204
|
});
|
|
14205
|
-
|
|
14206
|
-
|
|
14205
|
+
backtest$1.optimizerValidationService.addOptimizer(optimizerSchema.optimizerName, optimizerSchema);
|
|
14206
|
+
backtest$1.optimizerSchemaService.register(optimizerSchema.optimizerName, optimizerSchema);
|
|
14207
14207
|
}
|
|
14208
14208
|
|
|
14209
14209
|
const LIST_EXCHANGES_METHOD_NAME = "list.listExchanges";
|
|
@@ -14239,8 +14239,8 @@ const LIST_OPTIMIZERS_METHOD_NAME = "list.listOptimizers";
|
|
|
14239
14239
|
* ```
|
|
14240
14240
|
*/
|
|
14241
14241
|
async function listExchanges() {
|
|
14242
|
-
|
|
14243
|
-
return await
|
|
14242
|
+
backtest$1.loggerService.log(LIST_EXCHANGES_METHOD_NAME);
|
|
14243
|
+
return await backtest$1.exchangeValidationService.list();
|
|
14244
14244
|
}
|
|
14245
14245
|
/**
|
|
14246
14246
|
* Returns a list of all registered strategy schemas.
|
|
@@ -14273,8 +14273,8 @@ async function listExchanges() {
|
|
|
14273
14273
|
* ```
|
|
14274
14274
|
*/
|
|
14275
14275
|
async function listStrategies() {
|
|
14276
|
-
|
|
14277
|
-
return await
|
|
14276
|
+
backtest$1.loggerService.log(LIST_STRATEGIES_METHOD_NAME);
|
|
14277
|
+
return await backtest$1.strategyValidationService.list();
|
|
14278
14278
|
}
|
|
14279
14279
|
/**
|
|
14280
14280
|
* Returns a list of all registered frame schemas.
|
|
@@ -14302,8 +14302,8 @@ async function listStrategies() {
|
|
|
14302
14302
|
* ```
|
|
14303
14303
|
*/
|
|
14304
14304
|
async function listFrames() {
|
|
14305
|
-
|
|
14306
|
-
return await
|
|
14305
|
+
backtest$1.loggerService.log(LIST_FRAMES_METHOD_NAME);
|
|
14306
|
+
return await backtest$1.frameValidationService.list();
|
|
14307
14307
|
}
|
|
14308
14308
|
/**
|
|
14309
14309
|
* Returns a list of all registered walker schemas.
|
|
@@ -14332,8 +14332,8 @@ async function listFrames() {
|
|
|
14332
14332
|
* ```
|
|
14333
14333
|
*/
|
|
14334
14334
|
async function listWalkers() {
|
|
14335
|
-
|
|
14336
|
-
return await
|
|
14335
|
+
backtest$1.loggerService.log(LIST_WALKERS_METHOD_NAME);
|
|
14336
|
+
return await backtest$1.walkerValidationService.list();
|
|
14337
14337
|
}
|
|
14338
14338
|
/**
|
|
14339
14339
|
* Returns a list of all registered sizing schemas.
|
|
@@ -14371,8 +14371,8 @@ async function listWalkers() {
|
|
|
14371
14371
|
* ```
|
|
14372
14372
|
*/
|
|
14373
14373
|
async function listSizings() {
|
|
14374
|
-
|
|
14375
|
-
return await
|
|
14374
|
+
backtest$1.loggerService.log(LIST_SIZINGS_METHOD_NAME);
|
|
14375
|
+
return await backtest$1.sizingValidationService.list();
|
|
14376
14376
|
}
|
|
14377
14377
|
/**
|
|
14378
14378
|
* Returns a list of all registered risk schemas.
|
|
@@ -14407,8 +14407,8 @@ async function listSizings() {
|
|
|
14407
14407
|
* ```
|
|
14408
14408
|
*/
|
|
14409
14409
|
async function listRisks() {
|
|
14410
|
-
|
|
14411
|
-
return await
|
|
14410
|
+
backtest$1.loggerService.log(LIST_RISKS_METHOD_NAME);
|
|
14411
|
+
return await backtest$1.riskValidationService.list();
|
|
14412
14412
|
}
|
|
14413
14413
|
/**
|
|
14414
14414
|
* Returns a list of all registered optimizer schemas.
|
|
@@ -14447,8 +14447,8 @@ async function listRisks() {
|
|
|
14447
14447
|
* ```
|
|
14448
14448
|
*/
|
|
14449
14449
|
async function listOptimizers() {
|
|
14450
|
-
|
|
14451
|
-
return await
|
|
14450
|
+
backtest$1.loggerService.log(LIST_OPTIMIZERS_METHOD_NAME);
|
|
14451
|
+
return await backtest$1.optimizerValidationService.list();
|
|
14452
14452
|
}
|
|
14453
14453
|
|
|
14454
14454
|
const LISTEN_SIGNAL_METHOD_NAME = "event.listenSignal";
|
|
@@ -14505,7 +14505,7 @@ const LISTEN_RISK_ONCE_METHOD_NAME = "event.listenRiskOnce";
|
|
|
14505
14505
|
* ```
|
|
14506
14506
|
*/
|
|
14507
14507
|
function listenSignal(fn) {
|
|
14508
|
-
|
|
14508
|
+
backtest$1.loggerService.log(LISTEN_SIGNAL_METHOD_NAME);
|
|
14509
14509
|
return signalEmitter.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
14510
14510
|
}
|
|
14511
14511
|
/**
|
|
@@ -14541,7 +14541,7 @@ function listenSignal(fn) {
|
|
|
14541
14541
|
* ```
|
|
14542
14542
|
*/
|
|
14543
14543
|
function listenSignalOnce(filterFn, fn) {
|
|
14544
|
-
|
|
14544
|
+
backtest$1.loggerService.log(LISTEN_SIGNAL_ONCE_METHOD_NAME);
|
|
14545
14545
|
return signalEmitter.filter(filterFn).once(fn);
|
|
14546
14546
|
}
|
|
14547
14547
|
/**
|
|
@@ -14565,7 +14565,7 @@ function listenSignalOnce(filterFn, fn) {
|
|
|
14565
14565
|
* ```
|
|
14566
14566
|
*/
|
|
14567
14567
|
function listenSignalLive(fn) {
|
|
14568
|
-
|
|
14568
|
+
backtest$1.loggerService.log(LISTEN_SIGNAL_LIVE_METHOD_NAME);
|
|
14569
14569
|
return signalLiveEmitter.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
14570
14570
|
}
|
|
14571
14571
|
/**
|
|
@@ -14590,7 +14590,7 @@ function listenSignalLive(fn) {
|
|
|
14590
14590
|
* ```
|
|
14591
14591
|
*/
|
|
14592
14592
|
function listenSignalLiveOnce(filterFn, fn) {
|
|
14593
|
-
|
|
14593
|
+
backtest$1.loggerService.log(LISTEN_SIGNAL_LIVE_ONCE_METHOD_NAME);
|
|
14594
14594
|
return signalLiveEmitter.filter(filterFn).once(fn);
|
|
14595
14595
|
}
|
|
14596
14596
|
/**
|
|
@@ -14614,7 +14614,7 @@ function listenSignalLiveOnce(filterFn, fn) {
|
|
|
14614
14614
|
* ```
|
|
14615
14615
|
*/
|
|
14616
14616
|
function listenSignalBacktest(fn) {
|
|
14617
|
-
|
|
14617
|
+
backtest$1.loggerService.log(LISTEN_SIGNAL_BACKTEST_METHOD_NAME);
|
|
14618
14618
|
return signalBacktestEmitter.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
14619
14619
|
}
|
|
14620
14620
|
/**
|
|
@@ -14639,7 +14639,7 @@ function listenSignalBacktest(fn) {
|
|
|
14639
14639
|
* ```
|
|
14640
14640
|
*/
|
|
14641
14641
|
function listenSignalBacktestOnce(filterFn, fn) {
|
|
14642
|
-
|
|
14642
|
+
backtest$1.loggerService.log(LISTEN_SIGNAL_BACKTEST_ONCE_METHOD_NAME);
|
|
14643
14643
|
return signalBacktestEmitter.filter(filterFn).once(fn);
|
|
14644
14644
|
}
|
|
14645
14645
|
/**
|
|
@@ -14667,7 +14667,7 @@ function listenSignalBacktestOnce(filterFn, fn) {
|
|
|
14667
14667
|
* ```
|
|
14668
14668
|
*/
|
|
14669
14669
|
function listenError(fn) {
|
|
14670
|
-
|
|
14670
|
+
backtest$1.loggerService.log(LISTEN_ERROR_METHOD_NAME);
|
|
14671
14671
|
return errorEmitter.subscribe(functoolsKit.queued(async (error) => fn(error)));
|
|
14672
14672
|
}
|
|
14673
14673
|
/**
|
|
@@ -14695,7 +14695,7 @@ function listenError(fn) {
|
|
|
14695
14695
|
* ```
|
|
14696
14696
|
*/
|
|
14697
14697
|
function listenExit(fn) {
|
|
14698
|
-
|
|
14698
|
+
backtest$1.loggerService.log(LISTEN_EXIT_METHOD_NAME);
|
|
14699
14699
|
return exitEmitter.subscribe(functoolsKit.queued(async (error) => fn(error)));
|
|
14700
14700
|
}
|
|
14701
14701
|
/**
|
|
@@ -14726,7 +14726,7 @@ function listenExit(fn) {
|
|
|
14726
14726
|
* ```
|
|
14727
14727
|
*/
|
|
14728
14728
|
function listenDoneLive(fn) {
|
|
14729
|
-
|
|
14729
|
+
backtest$1.loggerService.log(LISTEN_DONE_LIVE_METHOD_NAME);
|
|
14730
14730
|
return doneLiveSubject.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
14731
14731
|
}
|
|
14732
14732
|
/**
|
|
@@ -14756,7 +14756,7 @@ function listenDoneLive(fn) {
|
|
|
14756
14756
|
* ```
|
|
14757
14757
|
*/
|
|
14758
14758
|
function listenDoneLiveOnce(filterFn, fn) {
|
|
14759
|
-
|
|
14759
|
+
backtest$1.loggerService.log(LISTEN_DONE_LIVE_ONCE_METHOD_NAME);
|
|
14760
14760
|
return doneLiveSubject.filter(filterFn).once(fn);
|
|
14761
14761
|
}
|
|
14762
14762
|
/**
|
|
@@ -14788,7 +14788,7 @@ function listenDoneLiveOnce(filterFn, fn) {
|
|
|
14788
14788
|
* ```
|
|
14789
14789
|
*/
|
|
14790
14790
|
function listenDoneBacktest(fn) {
|
|
14791
|
-
|
|
14791
|
+
backtest$1.loggerService.log(LISTEN_DONE_BACKTEST_METHOD_NAME);
|
|
14792
14792
|
return doneBacktestSubject.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
14793
14793
|
}
|
|
14794
14794
|
/**
|
|
@@ -14819,7 +14819,7 @@ function listenDoneBacktest(fn) {
|
|
|
14819
14819
|
* ```
|
|
14820
14820
|
*/
|
|
14821
14821
|
function listenDoneBacktestOnce(filterFn, fn) {
|
|
14822
|
-
|
|
14822
|
+
backtest$1.loggerService.log(LISTEN_DONE_BACKTEST_ONCE_METHOD_NAME);
|
|
14823
14823
|
return doneBacktestSubject.filter(filterFn).once(fn);
|
|
14824
14824
|
}
|
|
14825
14825
|
/**
|
|
@@ -14849,7 +14849,7 @@ function listenDoneBacktestOnce(filterFn, fn) {
|
|
|
14849
14849
|
* ```
|
|
14850
14850
|
*/
|
|
14851
14851
|
function listenDoneWalker(fn) {
|
|
14852
|
-
|
|
14852
|
+
backtest$1.loggerService.log(LISTEN_DONE_WALKER_METHOD_NAME);
|
|
14853
14853
|
return doneWalkerSubject.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
14854
14854
|
}
|
|
14855
14855
|
/**
|
|
@@ -14878,7 +14878,7 @@ function listenDoneWalker(fn) {
|
|
|
14878
14878
|
* ```
|
|
14879
14879
|
*/
|
|
14880
14880
|
function listenDoneWalkerOnce(filterFn, fn) {
|
|
14881
|
-
|
|
14881
|
+
backtest$1.loggerService.log(LISTEN_DONE_WALKER_ONCE_METHOD_NAME);
|
|
14882
14882
|
return doneWalkerSubject.filter(filterFn).once(fn);
|
|
14883
14883
|
}
|
|
14884
14884
|
/**
|
|
@@ -14912,7 +14912,7 @@ function listenDoneWalkerOnce(filterFn, fn) {
|
|
|
14912
14912
|
* ```
|
|
14913
14913
|
*/
|
|
14914
14914
|
function listenBacktestProgress(fn) {
|
|
14915
|
-
|
|
14915
|
+
backtest$1.loggerService.log(LISTEN_PROGRESS_METHOD_NAME);
|
|
14916
14916
|
return progressBacktestEmitter.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
14917
14917
|
}
|
|
14918
14918
|
/**
|
|
@@ -14946,7 +14946,7 @@ function listenBacktestProgress(fn) {
|
|
|
14946
14946
|
* ```
|
|
14947
14947
|
*/
|
|
14948
14948
|
function listenWalkerProgress(fn) {
|
|
14949
|
-
|
|
14949
|
+
backtest$1.loggerService.log(LISTEN_PROGRESS_WALKER_METHOD_NAME);
|
|
14950
14950
|
return progressWalkerEmitter.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
14951
14951
|
}
|
|
14952
14952
|
/**
|
|
@@ -14974,7 +14974,7 @@ function listenWalkerProgress(fn) {
|
|
|
14974
14974
|
* ```
|
|
14975
14975
|
*/
|
|
14976
14976
|
function listenOptimizerProgress(fn) {
|
|
14977
|
-
|
|
14977
|
+
backtest$1.loggerService.log(LISTEN_PROGRESS_OPTIMIZER_METHOD_NAME);
|
|
14978
14978
|
return progressOptimizerEmitter.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
14979
14979
|
}
|
|
14980
14980
|
/**
|
|
@@ -15010,7 +15010,7 @@ function listenOptimizerProgress(fn) {
|
|
|
15010
15010
|
* ```
|
|
15011
15011
|
*/
|
|
15012
15012
|
function listenPerformance(fn) {
|
|
15013
|
-
|
|
15013
|
+
backtest$1.loggerService.log(LISTEN_PERFORMANCE_METHOD_NAME);
|
|
15014
15014
|
return performanceEmitter.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
15015
15015
|
}
|
|
15016
15016
|
/**
|
|
@@ -15044,7 +15044,7 @@ function listenPerformance(fn) {
|
|
|
15044
15044
|
* ```
|
|
15045
15045
|
*/
|
|
15046
15046
|
function listenWalker(fn) {
|
|
15047
|
-
|
|
15047
|
+
backtest$1.loggerService.log(LISTEN_WALKER_METHOD_NAME);
|
|
15048
15048
|
return walkerEmitter.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
15049
15049
|
}
|
|
15050
15050
|
/**
|
|
@@ -15087,7 +15087,7 @@ function listenWalker(fn) {
|
|
|
15087
15087
|
* ```
|
|
15088
15088
|
*/
|
|
15089
15089
|
function listenWalkerOnce(filterFn, fn) {
|
|
15090
|
-
|
|
15090
|
+
backtest$1.loggerService.log(LISTEN_WALKER_ONCE_METHOD_NAME);
|
|
15091
15091
|
return walkerEmitter.filter(filterFn).once(fn);
|
|
15092
15092
|
}
|
|
15093
15093
|
/**
|
|
@@ -15122,7 +15122,7 @@ function listenWalkerOnce(filterFn, fn) {
|
|
|
15122
15122
|
* ```
|
|
15123
15123
|
*/
|
|
15124
15124
|
function listenWalkerComplete(fn) {
|
|
15125
|
-
|
|
15125
|
+
backtest$1.loggerService.log(LISTEN_WALKER_COMPLETE_METHOD_NAME);
|
|
15126
15126
|
return walkerCompleteSubject.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
15127
15127
|
}
|
|
15128
15128
|
/**
|
|
@@ -15150,7 +15150,7 @@ function listenWalkerComplete(fn) {
|
|
|
15150
15150
|
* ```
|
|
15151
15151
|
*/
|
|
15152
15152
|
function listenValidation(fn) {
|
|
15153
|
-
|
|
15153
|
+
backtest$1.loggerService.log(LISTEN_VALIDATION_METHOD_NAME);
|
|
15154
15154
|
return validationSubject.subscribe(functoolsKit.queued(async (error) => fn(error)));
|
|
15155
15155
|
}
|
|
15156
15156
|
/**
|
|
@@ -15178,7 +15178,7 @@ function listenValidation(fn) {
|
|
|
15178
15178
|
* ```
|
|
15179
15179
|
*/
|
|
15180
15180
|
function listenPartialProfit(fn) {
|
|
15181
|
-
|
|
15181
|
+
backtest$1.loggerService.log(LISTEN_PARTIAL_PROFIT_METHOD_NAME);
|
|
15182
15182
|
return partialProfitSubject.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
15183
15183
|
}
|
|
15184
15184
|
/**
|
|
@@ -15212,7 +15212,7 @@ function listenPartialProfit(fn) {
|
|
|
15212
15212
|
* ```
|
|
15213
15213
|
*/
|
|
15214
15214
|
function listenPartialProfitOnce(filterFn, fn) {
|
|
15215
|
-
|
|
15215
|
+
backtest$1.loggerService.log(LISTEN_PARTIAL_PROFIT_ONCE_METHOD_NAME);
|
|
15216
15216
|
return partialProfitSubject.filter(filterFn).once(fn);
|
|
15217
15217
|
}
|
|
15218
15218
|
/**
|
|
@@ -15240,7 +15240,7 @@ function listenPartialProfitOnce(filterFn, fn) {
|
|
|
15240
15240
|
* ```
|
|
15241
15241
|
*/
|
|
15242
15242
|
function listenPartialLoss(fn) {
|
|
15243
|
-
|
|
15243
|
+
backtest$1.loggerService.log(LISTEN_PARTIAL_LOSS_METHOD_NAME);
|
|
15244
15244
|
return partialLossSubject.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
15245
15245
|
}
|
|
15246
15246
|
/**
|
|
@@ -15274,7 +15274,7 @@ function listenPartialLoss(fn) {
|
|
|
15274
15274
|
* ```
|
|
15275
15275
|
*/
|
|
15276
15276
|
function listenPartialLossOnce(filterFn, fn) {
|
|
15277
|
-
|
|
15277
|
+
backtest$1.loggerService.log(LISTEN_PARTIAL_LOSS_ONCE_METHOD_NAME);
|
|
15278
15278
|
return partialLossSubject.filter(filterFn).once(fn);
|
|
15279
15279
|
}
|
|
15280
15280
|
/**
|
|
@@ -15306,7 +15306,7 @@ function listenPartialLossOnce(filterFn, fn) {
|
|
|
15306
15306
|
* ```
|
|
15307
15307
|
*/
|
|
15308
15308
|
function listenRisk(fn) {
|
|
15309
|
-
|
|
15309
|
+
backtest$1.loggerService.log(LISTEN_RISK_METHOD_NAME);
|
|
15310
15310
|
return riskSubject.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
15311
15311
|
}
|
|
15312
15312
|
/**
|
|
@@ -15343,7 +15343,7 @@ function listenRisk(fn) {
|
|
|
15343
15343
|
* ```
|
|
15344
15344
|
*/
|
|
15345
15345
|
function listenRiskOnce(filterFn, fn) {
|
|
15346
|
-
|
|
15346
|
+
backtest$1.loggerService.log(LISTEN_RISK_ONCE_METHOD_NAME);
|
|
15347
15347
|
return riskSubject.filter(filterFn).once(fn);
|
|
15348
15348
|
}
|
|
15349
15349
|
|
|
@@ -15353,6 +15353,31 @@ const FORMAT_PRICE_METHOD_NAME = "exchange.formatPrice";
|
|
|
15353
15353
|
const FORMAT_QUANTITY_METHOD_NAME = "exchange.formatQuantity";
|
|
15354
15354
|
const GET_DATE_METHOD_NAME = "exchange.getDate";
|
|
15355
15355
|
const GET_MODE_METHOD_NAME = "exchange.getMode";
|
|
15356
|
+
const HAS_TRADE_CONTEXT_METHOD_NAME = "exchange.hasTradeContext";
|
|
15357
|
+
/**
|
|
15358
|
+
* Checks if trade context is active (execution and method contexts).
|
|
15359
|
+
*
|
|
15360
|
+
* Returns true when both contexts are active, which is required for calling
|
|
15361
|
+
* exchange functions like getCandles, getAveragePrice, formatPrice, formatQuantity,
|
|
15362
|
+
* getDate, and getMode.
|
|
15363
|
+
*
|
|
15364
|
+
* @returns true if trade context is active, false otherwise
|
|
15365
|
+
*
|
|
15366
|
+
* @example
|
|
15367
|
+
* ```typescript
|
|
15368
|
+
* import { hasTradeContext, getCandles } from "backtest-kit";
|
|
15369
|
+
*
|
|
15370
|
+
* if (hasTradeContext()) {
|
|
15371
|
+
* const candles = await getCandles("BTCUSDT", "1m", 100);
|
|
15372
|
+
* } else {
|
|
15373
|
+
* console.log("Trade context not active");
|
|
15374
|
+
* }
|
|
15375
|
+
* ```
|
|
15376
|
+
*/
|
|
15377
|
+
function hasTradeContext() {
|
|
15378
|
+
backtest$1.loggerService.info(HAS_TRADE_CONTEXT_METHOD_NAME);
|
|
15379
|
+
return ExecutionContextService.hasContext() && MethodContextService.hasContext();
|
|
15380
|
+
}
|
|
15356
15381
|
/**
|
|
15357
15382
|
* Fetches historical candle data from the registered exchange.
|
|
15358
15383
|
*
|
|
@@ -15371,12 +15396,18 @@ const GET_MODE_METHOD_NAME = "exchange.getMode";
|
|
|
15371
15396
|
* ```
|
|
15372
15397
|
*/
|
|
15373
15398
|
async function getCandles(symbol, interval, limit) {
|
|
15374
|
-
|
|
15399
|
+
backtest$1.loggerService.info(GET_CANDLES_METHOD_NAME, {
|
|
15375
15400
|
symbol,
|
|
15376
15401
|
interval,
|
|
15377
15402
|
limit,
|
|
15378
15403
|
});
|
|
15379
|
-
|
|
15404
|
+
if (!ExecutionContextService.hasContext()) {
|
|
15405
|
+
throw new Error("getCandles requires an execution context");
|
|
15406
|
+
}
|
|
15407
|
+
if (!MethodContextService.hasContext()) {
|
|
15408
|
+
throw new Error("getCandles requires a method context");
|
|
15409
|
+
}
|
|
15410
|
+
return await backtest$1.exchangeConnectionService.getCandles(symbol, interval, limit);
|
|
15380
15411
|
}
|
|
15381
15412
|
/**
|
|
15382
15413
|
* Calculates VWAP (Volume Weighted Average Price) for a symbol.
|
|
@@ -15397,10 +15428,16 @@ async function getCandles(symbol, interval, limit) {
|
|
|
15397
15428
|
* ```
|
|
15398
15429
|
*/
|
|
15399
15430
|
async function getAveragePrice(symbol) {
|
|
15400
|
-
|
|
15431
|
+
backtest$1.loggerService.info(GET_AVERAGE_PRICE_METHOD_NAME, {
|
|
15401
15432
|
symbol,
|
|
15402
15433
|
});
|
|
15403
|
-
|
|
15434
|
+
if (!ExecutionContextService.hasContext()) {
|
|
15435
|
+
throw new Error("getAveragePrice requires an execution context");
|
|
15436
|
+
}
|
|
15437
|
+
if (!MethodContextService.hasContext()) {
|
|
15438
|
+
throw new Error("getAveragePrice requires a method context");
|
|
15439
|
+
}
|
|
15440
|
+
return await backtest$1.exchangeConnectionService.getAveragePrice(symbol);
|
|
15404
15441
|
}
|
|
15405
15442
|
/**
|
|
15406
15443
|
* Formats a price value according to exchange rules.
|
|
@@ -15418,11 +15455,14 @@ async function getAveragePrice(symbol) {
|
|
|
15418
15455
|
* ```
|
|
15419
15456
|
*/
|
|
15420
15457
|
async function formatPrice(symbol, price) {
|
|
15421
|
-
|
|
15458
|
+
backtest$1.loggerService.info(FORMAT_PRICE_METHOD_NAME, {
|
|
15422
15459
|
symbol,
|
|
15423
15460
|
price,
|
|
15424
15461
|
});
|
|
15425
|
-
|
|
15462
|
+
if (!MethodContextService.hasContext()) {
|
|
15463
|
+
throw new Error("formatPrice requires a method context");
|
|
15464
|
+
}
|
|
15465
|
+
return await backtest$1.exchangeConnectionService.formatPrice(symbol, price);
|
|
15426
15466
|
}
|
|
15427
15467
|
/**
|
|
15428
15468
|
* Formats a quantity value according to exchange rules.
|
|
@@ -15440,11 +15480,14 @@ async function formatPrice(symbol, price) {
|
|
|
15440
15480
|
* ```
|
|
15441
15481
|
*/
|
|
15442
15482
|
async function formatQuantity(symbol, quantity) {
|
|
15443
|
-
|
|
15483
|
+
backtest$1.loggerService.info(FORMAT_QUANTITY_METHOD_NAME, {
|
|
15444
15484
|
symbol,
|
|
15445
15485
|
quantity,
|
|
15446
15486
|
});
|
|
15447
|
-
|
|
15487
|
+
if (!MethodContextService.hasContext()) {
|
|
15488
|
+
throw new Error("formatQuantity requires a method context");
|
|
15489
|
+
}
|
|
15490
|
+
return await backtest$1.exchangeConnectionService.formatQuantity(symbol, quantity);
|
|
15448
15491
|
}
|
|
15449
15492
|
/**
|
|
15450
15493
|
* Gets the current date from execution context.
|
|
@@ -15461,8 +15504,11 @@ async function formatQuantity(symbol, quantity) {
|
|
|
15461
15504
|
* ```
|
|
15462
15505
|
*/
|
|
15463
15506
|
async function getDate() {
|
|
15464
|
-
|
|
15465
|
-
|
|
15507
|
+
backtest$1.loggerService.info(GET_DATE_METHOD_NAME);
|
|
15508
|
+
if (!ExecutionContextService.hasContext()) {
|
|
15509
|
+
throw new Error("getDate requires an execution context");
|
|
15510
|
+
}
|
|
15511
|
+
const { when } = backtest$1.executionContextService.context;
|
|
15466
15512
|
return new Date(when.getTime());
|
|
15467
15513
|
}
|
|
15468
15514
|
/**
|
|
@@ -15481,9 +15527,12 @@ async function getDate() {
|
|
|
15481
15527
|
* ```
|
|
15482
15528
|
*/
|
|
15483
15529
|
async function getMode() {
|
|
15484
|
-
|
|
15485
|
-
|
|
15486
|
-
|
|
15530
|
+
backtest$1.loggerService.info(GET_MODE_METHOD_NAME);
|
|
15531
|
+
if (!ExecutionContextService.hasContext()) {
|
|
15532
|
+
throw new Error("getMode requires an execution context");
|
|
15533
|
+
}
|
|
15534
|
+
const { backtest: bt } = backtest$1.executionContextService.context;
|
|
15535
|
+
return bt ? "backtest" : "live";
|
|
15487
15536
|
}
|
|
15488
15537
|
|
|
15489
15538
|
const DUMP_SIGNAL_METHOD_NAME = "dump.dumpSignal";
|
|
@@ -15554,13 +15603,13 @@ const DUMP_SIGNAL_METHOD_NAME = "dump.dumpSignal";
|
|
|
15554
15603
|
* ```
|
|
15555
15604
|
*/
|
|
15556
15605
|
async function dumpSignal(signalId, history, signal, outputDir = "./dump/strategy") {
|
|
15557
|
-
|
|
15606
|
+
backtest$1.loggerService.info(DUMP_SIGNAL_METHOD_NAME, {
|
|
15558
15607
|
signalId,
|
|
15559
15608
|
history,
|
|
15560
15609
|
signal,
|
|
15561
15610
|
outputDir,
|
|
15562
15611
|
});
|
|
15563
|
-
return await
|
|
15612
|
+
return await backtest$1.outlineMarkdownService.dumpSignal(signalId, history, signal, outputDir);
|
|
15564
15613
|
}
|
|
15565
15614
|
|
|
15566
15615
|
const BACKTEST_METHOD_NAME_RUN = "BacktestUtils.run";
|
|
@@ -15647,7 +15696,7 @@ class BacktestInstance {
|
|
|
15647
15696
|
* @internal
|
|
15648
15697
|
*/
|
|
15649
15698
|
this.task = functoolsKit.singlerun(async (symbol, context) => {
|
|
15650
|
-
|
|
15699
|
+
backtest$1.loggerService.info(BACKTEST_METHOD_NAME_TASK, {
|
|
15651
15700
|
symbol,
|
|
15652
15701
|
context,
|
|
15653
15702
|
});
|
|
@@ -15666,7 +15715,7 @@ class BacktestInstance {
|
|
|
15666
15715
|
* ```
|
|
15667
15716
|
*/
|
|
15668
15717
|
this.getStatus = async () => {
|
|
15669
|
-
|
|
15718
|
+
backtest$1.loggerService.info(BACKTEST_METHOD_NAME_GET_STATUS);
|
|
15670
15719
|
return {
|
|
15671
15720
|
id: this.id,
|
|
15672
15721
|
symbol: this.symbol,
|
|
@@ -15682,27 +15731,27 @@ class BacktestInstance {
|
|
|
15682
15731
|
* @returns Async generator yielding closed signals with PNL
|
|
15683
15732
|
*/
|
|
15684
15733
|
this.run = (symbol, context) => {
|
|
15685
|
-
|
|
15734
|
+
backtest$1.loggerService.info(BACKTEST_METHOD_NAME_RUN, {
|
|
15686
15735
|
symbol,
|
|
15687
15736
|
context,
|
|
15688
15737
|
});
|
|
15689
15738
|
{
|
|
15690
|
-
|
|
15691
|
-
|
|
15692
|
-
|
|
15693
|
-
|
|
15694
|
-
|
|
15695
|
-
|
|
15739
|
+
backtest$1.backtestMarkdownService.clear(true, { symbol, strategyName: context.strategyName });
|
|
15740
|
+
backtest$1.liveMarkdownService.clear(true, { symbol, strategyName: context.strategyName });
|
|
15741
|
+
backtest$1.scheduleMarkdownService.clear(true, { symbol, strategyName: context.strategyName });
|
|
15742
|
+
backtest$1.performanceMarkdownService.clear(true, { symbol, strategyName: context.strategyName });
|
|
15743
|
+
backtest$1.partialMarkdownService.clear(true, { symbol, strategyName: context.strategyName });
|
|
15744
|
+
backtest$1.riskMarkdownService.clear(true, { symbol, strategyName: context.strategyName });
|
|
15696
15745
|
}
|
|
15697
15746
|
{
|
|
15698
|
-
|
|
15747
|
+
backtest$1.strategyCoreService.clear(true, { symbol, strategyName: context.strategyName });
|
|
15699
15748
|
}
|
|
15700
15749
|
{
|
|
15701
|
-
const { riskName, riskList } =
|
|
15702
|
-
riskName &&
|
|
15703
|
-
riskList && riskList.forEach((riskName) =>
|
|
15750
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(context.strategyName);
|
|
15751
|
+
riskName && backtest$1.riskGlobalService.clear(true, riskName);
|
|
15752
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskGlobalService.clear(true, riskName));
|
|
15704
15753
|
}
|
|
15705
|
-
return
|
|
15754
|
+
return backtest$1.backtestCommandService.run(symbol, context);
|
|
15706
15755
|
};
|
|
15707
15756
|
/**
|
|
15708
15757
|
* Runs backtest in background without yielding results.
|
|
@@ -15725,7 +15774,7 @@ class BacktestInstance {
|
|
|
15725
15774
|
* ```
|
|
15726
15775
|
*/
|
|
15727
15776
|
this.background = (symbol, context) => {
|
|
15728
|
-
|
|
15777
|
+
backtest$1.loggerService.info(BACKTEST_METHOD_NAME_BACKGROUND, {
|
|
15729
15778
|
symbol,
|
|
15730
15779
|
context,
|
|
15731
15780
|
});
|
|
@@ -15740,8 +15789,8 @@ class BacktestInstance {
|
|
|
15740
15789
|
}
|
|
15741
15790
|
this.task(symbol, context).catch((error) => exitEmitter.next(new Error(functoolsKit.getErrorMessage(error))));
|
|
15742
15791
|
return () => {
|
|
15743
|
-
|
|
15744
|
-
|
|
15792
|
+
backtest$1.strategyCoreService.stop(true, { symbol, strategyName: context.strategyName });
|
|
15793
|
+
backtest$1.strategyCoreService
|
|
15745
15794
|
.getPendingSignal(true, symbol, context.strategyName)
|
|
15746
15795
|
.then(async (pendingSignal) => {
|
|
15747
15796
|
if (pendingSignal) {
|
|
@@ -15778,11 +15827,11 @@ class BacktestInstance {
|
|
|
15778
15827
|
* ```
|
|
15779
15828
|
*/
|
|
15780
15829
|
this.stop = async (symbol, strategyName) => {
|
|
15781
|
-
|
|
15830
|
+
backtest$1.loggerService.info(BACKTEST_METHOD_NAME_STOP, {
|
|
15782
15831
|
symbol,
|
|
15783
15832
|
strategyName,
|
|
15784
15833
|
});
|
|
15785
|
-
await
|
|
15834
|
+
await backtest$1.strategyCoreService.stop(true, { symbol, strategyName });
|
|
15786
15835
|
};
|
|
15787
15836
|
/**
|
|
15788
15837
|
* Gets statistical data from all closed signals for a symbol-strategy pair.
|
|
@@ -15799,11 +15848,11 @@ class BacktestInstance {
|
|
|
15799
15848
|
* ```
|
|
15800
15849
|
*/
|
|
15801
15850
|
this.getData = async (symbol, strategyName) => {
|
|
15802
|
-
|
|
15851
|
+
backtest$1.loggerService.info("BacktestUtils.getData", {
|
|
15803
15852
|
symbol,
|
|
15804
15853
|
strategyName,
|
|
15805
15854
|
});
|
|
15806
|
-
return await
|
|
15855
|
+
return await backtest$1.backtestMarkdownService.getData(symbol, strategyName, true);
|
|
15807
15856
|
};
|
|
15808
15857
|
/**
|
|
15809
15858
|
* Generates markdown report with all closed signals for a symbol-strategy pair.
|
|
@@ -15821,11 +15870,11 @@ class BacktestInstance {
|
|
|
15821
15870
|
* ```
|
|
15822
15871
|
*/
|
|
15823
15872
|
this.getReport = async (symbol, strategyName, columns) => {
|
|
15824
|
-
|
|
15873
|
+
backtest$1.loggerService.info(BACKTEST_METHOD_NAME_GET_REPORT, {
|
|
15825
15874
|
symbol,
|
|
15826
15875
|
strategyName,
|
|
15827
15876
|
});
|
|
15828
|
-
return await
|
|
15877
|
+
return await backtest$1.backtestMarkdownService.getReport(symbol, strategyName, true, columns);
|
|
15829
15878
|
};
|
|
15830
15879
|
/**
|
|
15831
15880
|
* Saves strategy report to disk.
|
|
@@ -15846,12 +15895,12 @@ class BacktestInstance {
|
|
|
15846
15895
|
* ```
|
|
15847
15896
|
*/
|
|
15848
15897
|
this.dump = async (symbol, strategyName, path, columns) => {
|
|
15849
|
-
|
|
15898
|
+
backtest$1.loggerService.info(BACKTEST_METHOD_NAME_DUMP, {
|
|
15850
15899
|
symbol,
|
|
15851
15900
|
strategyName,
|
|
15852
15901
|
path,
|
|
15853
15902
|
});
|
|
15854
|
-
await
|
|
15903
|
+
await backtest$1.backtestMarkdownService.dump(symbol, strategyName, true, path, columns);
|
|
15855
15904
|
};
|
|
15856
15905
|
}
|
|
15857
15906
|
}
|
|
@@ -15890,14 +15939,14 @@ class BacktestUtils {
|
|
|
15890
15939
|
*/
|
|
15891
15940
|
this.run = (symbol, context) => {
|
|
15892
15941
|
{
|
|
15893
|
-
|
|
15894
|
-
|
|
15895
|
-
|
|
15942
|
+
backtest$1.strategyValidationService.validate(context.strategyName, BACKTEST_METHOD_NAME_RUN);
|
|
15943
|
+
backtest$1.exchangeValidationService.validate(context.exchangeName, BACKTEST_METHOD_NAME_RUN);
|
|
15944
|
+
backtest$1.frameValidationService.validate(context.frameName, BACKTEST_METHOD_NAME_RUN);
|
|
15896
15945
|
}
|
|
15897
15946
|
{
|
|
15898
|
-
const { riskName, riskList } =
|
|
15899
|
-
riskName &&
|
|
15900
|
-
riskList && riskList.forEach((riskName) =>
|
|
15947
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(context.strategyName);
|
|
15948
|
+
riskName && backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_RUN);
|
|
15949
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_RUN));
|
|
15901
15950
|
}
|
|
15902
15951
|
const instance = this._getInstance(symbol, context.strategyName);
|
|
15903
15952
|
return instance.run(symbol, context);
|
|
@@ -15924,13 +15973,13 @@ class BacktestUtils {
|
|
|
15924
15973
|
* ```
|
|
15925
15974
|
*/
|
|
15926
15975
|
this.background = (symbol, context) => {
|
|
15927
|
-
|
|
15928
|
-
|
|
15929
|
-
|
|
15976
|
+
backtest$1.strategyValidationService.validate(context.strategyName, BACKTEST_METHOD_NAME_BACKGROUND);
|
|
15977
|
+
backtest$1.exchangeValidationService.validate(context.exchangeName, BACKTEST_METHOD_NAME_BACKGROUND);
|
|
15978
|
+
backtest$1.frameValidationService.validate(context.frameName, BACKTEST_METHOD_NAME_BACKGROUND);
|
|
15930
15979
|
{
|
|
15931
|
-
const { riskName, riskList } =
|
|
15932
|
-
riskName &&
|
|
15933
|
-
riskList && riskList.forEach((riskName) =>
|
|
15980
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(context.strategyName);
|
|
15981
|
+
riskName && backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_BACKGROUND);
|
|
15982
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_BACKGROUND));
|
|
15934
15983
|
}
|
|
15935
15984
|
const instance = this._getInstance(symbol, context.strategyName);
|
|
15936
15985
|
return instance.background(symbol, context);
|
|
@@ -15953,11 +16002,11 @@ class BacktestUtils {
|
|
|
15953
16002
|
* ```
|
|
15954
16003
|
*/
|
|
15955
16004
|
this.stop = async (symbol, strategyName) => {
|
|
15956
|
-
|
|
16005
|
+
backtest$1.strategyValidationService.validate(strategyName, BACKTEST_METHOD_NAME_STOP);
|
|
15957
16006
|
{
|
|
15958
|
-
const { riskName, riskList } =
|
|
15959
|
-
riskName &&
|
|
15960
|
-
riskList && riskList.forEach((riskName) =>
|
|
16007
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
16008
|
+
riskName && backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_STOP);
|
|
16009
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_STOP));
|
|
15961
16010
|
}
|
|
15962
16011
|
const instance = this._getInstance(symbol, strategyName);
|
|
15963
16012
|
return await instance.stop(symbol, strategyName);
|
|
@@ -15976,11 +16025,11 @@ class BacktestUtils {
|
|
|
15976
16025
|
* ```
|
|
15977
16026
|
*/
|
|
15978
16027
|
this.getData = async (symbol, strategyName) => {
|
|
15979
|
-
|
|
16028
|
+
backtest$1.strategyValidationService.validate(strategyName, "BacktestUtils.getData");
|
|
15980
16029
|
{
|
|
15981
|
-
const { riskName, riskList } =
|
|
15982
|
-
riskName &&
|
|
15983
|
-
riskList && riskList.forEach((riskName) =>
|
|
16030
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
16031
|
+
riskName && backtest$1.riskValidationService.validate(riskName, "BacktestUtils.getData");
|
|
16032
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, "BacktestUtils.getData"));
|
|
15984
16033
|
}
|
|
15985
16034
|
const instance = this._getInstance(symbol, strategyName);
|
|
15986
16035
|
return await instance.getData(symbol, strategyName);
|
|
@@ -16000,11 +16049,11 @@ class BacktestUtils {
|
|
|
16000
16049
|
* ```
|
|
16001
16050
|
*/
|
|
16002
16051
|
this.getReport = async (symbol, strategyName, columns) => {
|
|
16003
|
-
|
|
16052
|
+
backtest$1.strategyValidationService.validate(strategyName, BACKTEST_METHOD_NAME_GET_REPORT);
|
|
16004
16053
|
{
|
|
16005
|
-
const { riskName, riskList } =
|
|
16006
|
-
riskName &&
|
|
16007
|
-
riskList && riskList.forEach((riskName) =>
|
|
16054
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
16055
|
+
riskName && backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_GET_REPORT);
|
|
16056
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_GET_REPORT));
|
|
16008
16057
|
}
|
|
16009
16058
|
const instance = this._getInstance(symbol, strategyName);
|
|
16010
16059
|
return await instance.getReport(symbol, strategyName, columns);
|
|
@@ -16027,11 +16076,11 @@ class BacktestUtils {
|
|
|
16027
16076
|
* ```
|
|
16028
16077
|
*/
|
|
16029
16078
|
this.dump = async (symbol, strategyName, path, columns) => {
|
|
16030
|
-
|
|
16079
|
+
backtest$1.strategyValidationService.validate(strategyName, BACKTEST_METHOD_NAME_DUMP);
|
|
16031
16080
|
{
|
|
16032
|
-
const { riskName, riskList } =
|
|
16033
|
-
riskName &&
|
|
16034
|
-
riskList && riskList.forEach((riskName) =>
|
|
16081
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
16082
|
+
riskName && backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_DUMP);
|
|
16083
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, BACKTEST_METHOD_NAME_DUMP));
|
|
16035
16084
|
}
|
|
16036
16085
|
const instance = this._getInstance(symbol, strategyName);
|
|
16037
16086
|
return await instance.dump(symbol, strategyName, path, columns);
|
|
@@ -16161,7 +16210,7 @@ class LiveInstance {
|
|
|
16161
16210
|
* @internal
|
|
16162
16211
|
*/
|
|
16163
16212
|
this.task = functoolsKit.singlerun(async (symbol, context) => {
|
|
16164
|
-
|
|
16213
|
+
backtest$1.loggerService.info(LIVE_METHOD_NAME_TASK, {
|
|
16165
16214
|
symbol,
|
|
16166
16215
|
context,
|
|
16167
16216
|
});
|
|
@@ -16180,7 +16229,7 @@ class LiveInstance {
|
|
|
16180
16229
|
* ```
|
|
16181
16230
|
*/
|
|
16182
16231
|
this.getStatus = async () => {
|
|
16183
|
-
|
|
16232
|
+
backtest$1.loggerService.info(LIVE_METHOD_NAME_GET_STATUS);
|
|
16184
16233
|
return {
|
|
16185
16234
|
id: this.id,
|
|
16186
16235
|
symbol: this.symbol,
|
|
@@ -16199,27 +16248,27 @@ class LiveInstance {
|
|
|
16199
16248
|
* @returns Infinite async generator yielding opened and closed signals
|
|
16200
16249
|
*/
|
|
16201
16250
|
this.run = (symbol, context) => {
|
|
16202
|
-
|
|
16251
|
+
backtest$1.loggerService.info(LIVE_METHOD_NAME_RUN, {
|
|
16203
16252
|
symbol,
|
|
16204
16253
|
context,
|
|
16205
16254
|
});
|
|
16206
16255
|
{
|
|
16207
|
-
|
|
16208
|
-
|
|
16209
|
-
|
|
16210
|
-
|
|
16211
|
-
|
|
16212
|
-
|
|
16256
|
+
backtest$1.backtestMarkdownService.clear(false, { symbol, strategyName: context.strategyName });
|
|
16257
|
+
backtest$1.liveMarkdownService.clear(false, { symbol, strategyName: context.strategyName });
|
|
16258
|
+
backtest$1.scheduleMarkdownService.clear(false, { symbol, strategyName: context.strategyName });
|
|
16259
|
+
backtest$1.performanceMarkdownService.clear(false, { symbol, strategyName: context.strategyName });
|
|
16260
|
+
backtest$1.partialMarkdownService.clear(false, { symbol, strategyName: context.strategyName });
|
|
16261
|
+
backtest$1.riskMarkdownService.clear(false, { symbol, strategyName: context.strategyName });
|
|
16213
16262
|
}
|
|
16214
16263
|
{
|
|
16215
|
-
|
|
16264
|
+
backtest$1.strategyCoreService.clear(false, { symbol, strategyName: context.strategyName });
|
|
16216
16265
|
}
|
|
16217
16266
|
{
|
|
16218
|
-
const { riskName, riskList } =
|
|
16219
|
-
riskName &&
|
|
16220
|
-
riskList && riskList.forEach((riskName) =>
|
|
16267
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(context.strategyName);
|
|
16268
|
+
riskName && backtest$1.riskGlobalService.clear(false, riskName);
|
|
16269
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskGlobalService.clear(false, riskName));
|
|
16221
16270
|
}
|
|
16222
|
-
return
|
|
16271
|
+
return backtest$1.liveCommandService.run(symbol, context);
|
|
16223
16272
|
};
|
|
16224
16273
|
/**
|
|
16225
16274
|
* Runs live trading in background without yielding results.
|
|
@@ -16242,7 +16291,7 @@ class LiveInstance {
|
|
|
16242
16291
|
* ```
|
|
16243
16292
|
*/
|
|
16244
16293
|
this.background = (symbol, context) => {
|
|
16245
|
-
|
|
16294
|
+
backtest$1.loggerService.info(LIVE_METHOD_NAME_BACKGROUND, {
|
|
16246
16295
|
symbol,
|
|
16247
16296
|
context,
|
|
16248
16297
|
});
|
|
@@ -16257,8 +16306,8 @@ class LiveInstance {
|
|
|
16257
16306
|
}
|
|
16258
16307
|
this.task(symbol, context).catch((error) => exitEmitter.next(new Error(functoolsKit.getErrorMessage(error))));
|
|
16259
16308
|
return () => {
|
|
16260
|
-
|
|
16261
|
-
|
|
16309
|
+
backtest$1.strategyCoreService.stop(false, { symbol, strategyName: context.strategyName });
|
|
16310
|
+
backtest$1.strategyCoreService
|
|
16262
16311
|
.getPendingSignal(false, symbol, context.strategyName)
|
|
16263
16312
|
.then(async (pendingSignal) => {
|
|
16264
16313
|
if (pendingSignal) {
|
|
@@ -16295,11 +16344,11 @@ class LiveInstance {
|
|
|
16295
16344
|
* ```
|
|
16296
16345
|
*/
|
|
16297
16346
|
this.stop = async (symbol, strategyName) => {
|
|
16298
|
-
|
|
16347
|
+
backtest$1.loggerService.info(LIVE_METHOD_NAME_STOP, {
|
|
16299
16348
|
symbol,
|
|
16300
16349
|
strategyName,
|
|
16301
16350
|
});
|
|
16302
|
-
await
|
|
16351
|
+
await backtest$1.strategyCoreService.stop(false, { symbol, strategyName });
|
|
16303
16352
|
};
|
|
16304
16353
|
/**
|
|
16305
16354
|
* Gets statistical data from all live trading events for a symbol-strategy pair.
|
|
@@ -16316,11 +16365,11 @@ class LiveInstance {
|
|
|
16316
16365
|
* ```
|
|
16317
16366
|
*/
|
|
16318
16367
|
this.getData = async (symbol, strategyName) => {
|
|
16319
|
-
|
|
16368
|
+
backtest$1.loggerService.info("LiveUtils.getData", {
|
|
16320
16369
|
symbol,
|
|
16321
16370
|
strategyName,
|
|
16322
16371
|
});
|
|
16323
|
-
return await
|
|
16372
|
+
return await backtest$1.liveMarkdownService.getData(symbol, strategyName, false);
|
|
16324
16373
|
};
|
|
16325
16374
|
/**
|
|
16326
16375
|
* Generates markdown report with all events for a symbol-strategy pair.
|
|
@@ -16338,11 +16387,11 @@ class LiveInstance {
|
|
|
16338
16387
|
* ```
|
|
16339
16388
|
*/
|
|
16340
16389
|
this.getReport = async (symbol, strategyName, columns) => {
|
|
16341
|
-
|
|
16390
|
+
backtest$1.loggerService.info(LIVE_METHOD_NAME_GET_REPORT, {
|
|
16342
16391
|
symbol,
|
|
16343
16392
|
strategyName,
|
|
16344
16393
|
});
|
|
16345
|
-
return await
|
|
16394
|
+
return await backtest$1.liveMarkdownService.getReport(symbol, strategyName, false, columns);
|
|
16346
16395
|
};
|
|
16347
16396
|
/**
|
|
16348
16397
|
* Saves strategy report to disk.
|
|
@@ -16363,12 +16412,12 @@ class LiveInstance {
|
|
|
16363
16412
|
* ```
|
|
16364
16413
|
*/
|
|
16365
16414
|
this.dump = async (symbol, strategyName, path, columns) => {
|
|
16366
|
-
|
|
16415
|
+
backtest$1.loggerService.info(LIVE_METHOD_NAME_DUMP, {
|
|
16367
16416
|
symbol,
|
|
16368
16417
|
strategyName,
|
|
16369
16418
|
path,
|
|
16370
16419
|
});
|
|
16371
|
-
await
|
|
16420
|
+
await backtest$1.liveMarkdownService.dump(symbol, strategyName, false, path, columns);
|
|
16372
16421
|
};
|
|
16373
16422
|
}
|
|
16374
16423
|
}
|
|
@@ -16420,13 +16469,13 @@ class LiveUtils {
|
|
|
16420
16469
|
*/
|
|
16421
16470
|
this.run = (symbol, context) => {
|
|
16422
16471
|
{
|
|
16423
|
-
|
|
16424
|
-
|
|
16472
|
+
backtest$1.strategyValidationService.validate(context.strategyName, LIVE_METHOD_NAME_RUN);
|
|
16473
|
+
backtest$1.exchangeValidationService.validate(context.exchangeName, LIVE_METHOD_NAME_RUN);
|
|
16425
16474
|
}
|
|
16426
16475
|
{
|
|
16427
|
-
const { riskName, riskList } =
|
|
16428
|
-
riskName &&
|
|
16429
|
-
riskList && riskList.forEach((riskName) =>
|
|
16476
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(context.strategyName);
|
|
16477
|
+
riskName && backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_RUN);
|
|
16478
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_RUN));
|
|
16430
16479
|
}
|
|
16431
16480
|
const instance = this._getInstance(symbol, context.strategyName);
|
|
16432
16481
|
return instance.run(symbol, context);
|
|
@@ -16453,12 +16502,12 @@ class LiveUtils {
|
|
|
16453
16502
|
* ```
|
|
16454
16503
|
*/
|
|
16455
16504
|
this.background = (symbol, context) => {
|
|
16456
|
-
|
|
16457
|
-
|
|
16505
|
+
backtest$1.strategyValidationService.validate(context.strategyName, LIVE_METHOD_NAME_BACKGROUND);
|
|
16506
|
+
backtest$1.exchangeValidationService.validate(context.exchangeName, LIVE_METHOD_NAME_BACKGROUND);
|
|
16458
16507
|
{
|
|
16459
|
-
const { riskName, riskList } =
|
|
16460
|
-
riskName &&
|
|
16461
|
-
riskList && riskList.forEach((riskName) =>
|
|
16508
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(context.strategyName);
|
|
16509
|
+
riskName && backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_BACKGROUND);
|
|
16510
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_BACKGROUND));
|
|
16462
16511
|
}
|
|
16463
16512
|
const instance = this._getInstance(symbol, context.strategyName);
|
|
16464
16513
|
return instance.background(symbol, context);
|
|
@@ -16481,11 +16530,11 @@ class LiveUtils {
|
|
|
16481
16530
|
* ```
|
|
16482
16531
|
*/
|
|
16483
16532
|
this.stop = async (symbol, strategyName) => {
|
|
16484
|
-
|
|
16533
|
+
backtest$1.strategyValidationService.validate(strategyName, LIVE_METHOD_NAME_STOP);
|
|
16485
16534
|
{
|
|
16486
|
-
const { riskName, riskList } =
|
|
16487
|
-
riskName &&
|
|
16488
|
-
riskList && riskList.forEach((riskName) =>
|
|
16535
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
16536
|
+
riskName && backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_STOP);
|
|
16537
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_STOP));
|
|
16489
16538
|
}
|
|
16490
16539
|
const instance = this._getInstance(symbol, strategyName);
|
|
16491
16540
|
return await instance.stop(symbol, strategyName);
|
|
@@ -16504,11 +16553,11 @@ class LiveUtils {
|
|
|
16504
16553
|
* ```
|
|
16505
16554
|
*/
|
|
16506
16555
|
this.getData = async (symbol, strategyName) => {
|
|
16507
|
-
|
|
16556
|
+
backtest$1.strategyValidationService.validate(strategyName, "LiveUtils.getData");
|
|
16508
16557
|
{
|
|
16509
|
-
const { riskName, riskList } =
|
|
16510
|
-
riskName &&
|
|
16511
|
-
riskList && riskList.forEach((riskName) =>
|
|
16558
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
16559
|
+
riskName && backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_GET_DATA);
|
|
16560
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_GET_DATA));
|
|
16512
16561
|
}
|
|
16513
16562
|
const instance = this._getInstance(symbol, strategyName);
|
|
16514
16563
|
return await instance.getData(symbol, strategyName);
|
|
@@ -16528,11 +16577,11 @@ class LiveUtils {
|
|
|
16528
16577
|
* ```
|
|
16529
16578
|
*/
|
|
16530
16579
|
this.getReport = async (symbol, strategyName, columns) => {
|
|
16531
|
-
|
|
16580
|
+
backtest$1.strategyValidationService.validate(strategyName, LIVE_METHOD_NAME_GET_REPORT);
|
|
16532
16581
|
{
|
|
16533
|
-
const { riskName, riskList } =
|
|
16534
|
-
riskName &&
|
|
16535
|
-
riskList && riskList.forEach((riskName) =>
|
|
16582
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
16583
|
+
riskName && backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_GET_REPORT);
|
|
16584
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_GET_REPORT));
|
|
16536
16585
|
}
|
|
16537
16586
|
const instance = this._getInstance(symbol, strategyName);
|
|
16538
16587
|
return await instance.getReport(symbol, strategyName, columns);
|
|
@@ -16555,11 +16604,11 @@ class LiveUtils {
|
|
|
16555
16604
|
* ```
|
|
16556
16605
|
*/
|
|
16557
16606
|
this.dump = async (symbol, strategyName, path, columns) => {
|
|
16558
|
-
|
|
16607
|
+
backtest$1.strategyValidationService.validate(strategyName, LIVE_METHOD_NAME_DUMP);
|
|
16559
16608
|
{
|
|
16560
|
-
const { riskName, riskList } =
|
|
16561
|
-
riskName &&
|
|
16562
|
-
riskList && riskList.forEach((riskName) =>
|
|
16609
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
16610
|
+
riskName && backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_DUMP);
|
|
16611
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, LIVE_METHOD_NAME_DUMP));
|
|
16563
16612
|
}
|
|
16564
16613
|
const instance = this._getInstance(symbol, strategyName);
|
|
16565
16614
|
return await instance.dump(symbol, strategyName, path, columns);
|
|
@@ -16644,18 +16693,18 @@ class ScheduleUtils {
|
|
|
16644
16693
|
* ```
|
|
16645
16694
|
*/
|
|
16646
16695
|
this.getData = async (symbol, strategyName, backtest) => {
|
|
16647
|
-
|
|
16696
|
+
backtest$1.loggerService.info(SCHEDULE_METHOD_NAME_GET_DATA, {
|
|
16648
16697
|
symbol,
|
|
16649
16698
|
strategyName,
|
|
16650
16699
|
backtest,
|
|
16651
16700
|
});
|
|
16652
|
-
|
|
16701
|
+
backtest$1.strategyValidationService.validate(strategyName, SCHEDULE_METHOD_NAME_GET_DATA);
|
|
16653
16702
|
{
|
|
16654
|
-
const { riskName, riskList } =
|
|
16655
|
-
riskName &&
|
|
16656
|
-
riskList && riskList.forEach((riskName) =>
|
|
16703
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
16704
|
+
riskName && backtest$1.riskValidationService.validate(riskName, SCHEDULE_METHOD_NAME_GET_DATA);
|
|
16705
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, SCHEDULE_METHOD_NAME_GET_DATA));
|
|
16657
16706
|
}
|
|
16658
|
-
return await
|
|
16707
|
+
return await backtest$1.scheduleMarkdownService.getData(symbol, strategyName, backtest);
|
|
16659
16708
|
};
|
|
16660
16709
|
/**
|
|
16661
16710
|
* Generates markdown report with all scheduled events for a symbol-strategy pair.
|
|
@@ -16672,18 +16721,18 @@ class ScheduleUtils {
|
|
|
16672
16721
|
* ```
|
|
16673
16722
|
*/
|
|
16674
16723
|
this.getReport = async (symbol, strategyName, backtest, columns) => {
|
|
16675
|
-
|
|
16724
|
+
backtest$1.loggerService.info(SCHEDULE_METHOD_NAME_GET_REPORT, {
|
|
16676
16725
|
symbol,
|
|
16677
16726
|
strategyName,
|
|
16678
16727
|
backtest,
|
|
16679
16728
|
});
|
|
16680
|
-
|
|
16729
|
+
backtest$1.strategyValidationService.validate(strategyName, SCHEDULE_METHOD_NAME_GET_REPORT);
|
|
16681
16730
|
{
|
|
16682
|
-
const { riskName, riskList } =
|
|
16683
|
-
riskName &&
|
|
16684
|
-
riskList && riskList.forEach((riskName) =>
|
|
16731
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
16732
|
+
riskName && backtest$1.riskValidationService.validate(riskName, SCHEDULE_METHOD_NAME_GET_REPORT);
|
|
16733
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, SCHEDULE_METHOD_NAME_GET_REPORT));
|
|
16685
16734
|
}
|
|
16686
|
-
return await
|
|
16735
|
+
return await backtest$1.scheduleMarkdownService.getReport(symbol, strategyName, backtest, columns);
|
|
16687
16736
|
};
|
|
16688
16737
|
/**
|
|
16689
16738
|
* Saves strategy report to disk.
|
|
@@ -16703,19 +16752,19 @@ class ScheduleUtils {
|
|
|
16703
16752
|
* ```
|
|
16704
16753
|
*/
|
|
16705
16754
|
this.dump = async (symbol, strategyName, backtest, path, columns) => {
|
|
16706
|
-
|
|
16755
|
+
backtest$1.loggerService.info(SCHEDULE_METHOD_NAME_DUMP, {
|
|
16707
16756
|
symbol,
|
|
16708
16757
|
strategyName,
|
|
16709
16758
|
backtest,
|
|
16710
16759
|
path,
|
|
16711
16760
|
});
|
|
16712
|
-
|
|
16761
|
+
backtest$1.strategyValidationService.validate(strategyName, SCHEDULE_METHOD_NAME_DUMP);
|
|
16713
16762
|
{
|
|
16714
|
-
const { riskName, riskList } =
|
|
16715
|
-
riskName &&
|
|
16716
|
-
riskList && riskList.forEach((riskName) =>
|
|
16763
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
16764
|
+
riskName && backtest$1.riskValidationService.validate(riskName, SCHEDULE_METHOD_NAME_DUMP);
|
|
16765
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, SCHEDULE_METHOD_NAME_DUMP));
|
|
16717
16766
|
}
|
|
16718
|
-
await
|
|
16767
|
+
await backtest$1.scheduleMarkdownService.dump(symbol, strategyName, backtest, path, columns);
|
|
16719
16768
|
};
|
|
16720
16769
|
}
|
|
16721
16770
|
}
|
|
@@ -16797,13 +16846,13 @@ class Performance {
|
|
|
16797
16846
|
* ```
|
|
16798
16847
|
*/
|
|
16799
16848
|
static async getData(symbol, strategyName, backtest) {
|
|
16800
|
-
|
|
16849
|
+
backtest$1.strategyValidationService.validate(strategyName, PERFORMANCE_METHOD_NAME_GET_DATA);
|
|
16801
16850
|
{
|
|
16802
|
-
const { riskName, riskList } =
|
|
16803
|
-
riskName &&
|
|
16804
|
-
riskList && riskList.forEach((riskName) =>
|
|
16851
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
16852
|
+
riskName && backtest$1.riskValidationService.validate(riskName, PERFORMANCE_METHOD_NAME_GET_DATA);
|
|
16853
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, PERFORMANCE_METHOD_NAME_GET_DATA));
|
|
16805
16854
|
}
|
|
16806
|
-
return
|
|
16855
|
+
return backtest$1.performanceMarkdownService.getData(symbol, strategyName, backtest);
|
|
16807
16856
|
}
|
|
16808
16857
|
/**
|
|
16809
16858
|
* Generates markdown report with performance analysis.
|
|
@@ -16829,13 +16878,13 @@ class Performance {
|
|
|
16829
16878
|
* ```
|
|
16830
16879
|
*/
|
|
16831
16880
|
static async getReport(symbol, strategyName, backtest, columns) {
|
|
16832
|
-
|
|
16881
|
+
backtest$1.strategyValidationService.validate(strategyName, PERFORMANCE_METHOD_NAME_GET_REPORT);
|
|
16833
16882
|
{
|
|
16834
|
-
const { riskName, riskList } =
|
|
16835
|
-
riskName &&
|
|
16836
|
-
riskList && riskList.forEach((riskName) =>
|
|
16883
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
16884
|
+
riskName && backtest$1.riskValidationService.validate(riskName, PERFORMANCE_METHOD_NAME_GET_REPORT);
|
|
16885
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, PERFORMANCE_METHOD_NAME_GET_REPORT));
|
|
16837
16886
|
}
|
|
16838
|
-
return
|
|
16887
|
+
return backtest$1.performanceMarkdownService.getReport(symbol, strategyName, backtest, columns);
|
|
16839
16888
|
}
|
|
16840
16889
|
/**
|
|
16841
16890
|
* Saves performance report to disk.
|
|
@@ -16858,13 +16907,13 @@ class Performance {
|
|
|
16858
16907
|
* ```
|
|
16859
16908
|
*/
|
|
16860
16909
|
static async dump(symbol, strategyName, backtest, path = "./dump/performance", columns) {
|
|
16861
|
-
|
|
16910
|
+
backtest$1.strategyValidationService.validate(strategyName, PERFORMANCE_METHOD_NAME_DUMP);
|
|
16862
16911
|
{
|
|
16863
|
-
const { riskName, riskList } =
|
|
16864
|
-
riskName &&
|
|
16865
|
-
riskList && riskList.forEach((riskName) =>
|
|
16912
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
16913
|
+
riskName && backtest$1.riskValidationService.validate(riskName, PERFORMANCE_METHOD_NAME_DUMP);
|
|
16914
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, PERFORMANCE_METHOD_NAME_DUMP));
|
|
16866
16915
|
}
|
|
16867
|
-
return
|
|
16916
|
+
return backtest$1.performanceMarkdownService.dump(symbol, strategyName, backtest, path, columns);
|
|
16868
16917
|
}
|
|
16869
16918
|
}
|
|
16870
16919
|
|
|
@@ -16898,7 +16947,7 @@ const INSTANCE_TASK_FN = async (symbol, context, self) => {
|
|
|
16898
16947
|
}
|
|
16899
16948
|
}
|
|
16900
16949
|
if (!self._isDone) {
|
|
16901
|
-
const walkerSchema =
|
|
16950
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(context.walkerName);
|
|
16902
16951
|
await doneWalkerSubject.next({
|
|
16903
16952
|
exchangeName: walkerSchema.exchangeName,
|
|
16904
16953
|
strategyName: context.walkerName,
|
|
@@ -16952,7 +17001,7 @@ class WalkerInstance {
|
|
|
16952
17001
|
* @internal
|
|
16953
17002
|
*/
|
|
16954
17003
|
this.task = functoolsKit.singlerun(async (symbol, context) => {
|
|
16955
|
-
|
|
17004
|
+
backtest$1.loggerService.info(WALKER_METHOD_NAME_TASK, {
|
|
16956
17005
|
symbol,
|
|
16957
17006
|
context,
|
|
16958
17007
|
});
|
|
@@ -16971,7 +17020,7 @@ class WalkerInstance {
|
|
|
16971
17020
|
* ```
|
|
16972
17021
|
*/
|
|
16973
17022
|
this.getStatus = async () => {
|
|
16974
|
-
|
|
17023
|
+
backtest$1.loggerService.info(WALKER_METHOD_NAME_GET_STATUS);
|
|
16975
17024
|
return {
|
|
16976
17025
|
id: this.id,
|
|
16977
17026
|
symbol: this.symbol,
|
|
@@ -16987,39 +17036,39 @@ class WalkerInstance {
|
|
|
16987
17036
|
* @returns Async generator yielding progress updates after each strategy
|
|
16988
17037
|
*/
|
|
16989
17038
|
this.run = (symbol, context) => {
|
|
16990
|
-
|
|
17039
|
+
backtest$1.loggerService.info(WALKER_METHOD_NAME_RUN, {
|
|
16991
17040
|
symbol,
|
|
16992
17041
|
context,
|
|
16993
17042
|
});
|
|
16994
|
-
|
|
16995
|
-
const walkerSchema =
|
|
16996
|
-
|
|
16997
|
-
|
|
17043
|
+
backtest$1.walkerValidationService.validate(context.walkerName, WALKER_METHOD_NAME_RUN);
|
|
17044
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(context.walkerName);
|
|
17045
|
+
backtest$1.exchangeValidationService.validate(walkerSchema.exchangeName, WALKER_METHOD_NAME_RUN);
|
|
17046
|
+
backtest$1.frameValidationService.validate(walkerSchema.frameName, WALKER_METHOD_NAME_RUN);
|
|
16998
17047
|
for (const strategyName of walkerSchema.strategies) {
|
|
16999
|
-
|
|
17048
|
+
backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_RUN);
|
|
17000
17049
|
}
|
|
17001
|
-
|
|
17050
|
+
backtest$1.walkerMarkdownService.clear(context.walkerName);
|
|
17002
17051
|
// Clear backtest data for all strategies
|
|
17003
17052
|
for (const strategyName of walkerSchema.strategies) {
|
|
17004
17053
|
{
|
|
17005
|
-
|
|
17006
|
-
|
|
17007
|
-
|
|
17008
|
-
|
|
17009
|
-
|
|
17010
|
-
|
|
17054
|
+
backtest$1.backtestMarkdownService.clear(true, { symbol, strategyName });
|
|
17055
|
+
backtest$1.liveMarkdownService.clear(true, { symbol, strategyName });
|
|
17056
|
+
backtest$1.scheduleMarkdownService.clear(true, { symbol, strategyName });
|
|
17057
|
+
backtest$1.performanceMarkdownService.clear(true, { symbol, strategyName });
|
|
17058
|
+
backtest$1.partialMarkdownService.clear(true, { symbol, strategyName });
|
|
17059
|
+
backtest$1.riskMarkdownService.clear(true, { symbol, strategyName });
|
|
17011
17060
|
}
|
|
17012
17061
|
{
|
|
17013
|
-
|
|
17062
|
+
backtest$1.strategyCoreService.clear(true, { symbol, strategyName });
|
|
17014
17063
|
}
|
|
17015
17064
|
{
|
|
17016
|
-
const { riskName, riskList } =
|
|
17017
|
-
riskName &&
|
|
17065
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17066
|
+
riskName && backtest$1.riskGlobalService.clear(true, riskName);
|
|
17018
17067
|
riskList &&
|
|
17019
|
-
riskList.forEach((riskName) =>
|
|
17068
|
+
riskList.forEach((riskName) => backtest$1.riskGlobalService.clear(true, riskName));
|
|
17020
17069
|
}
|
|
17021
17070
|
}
|
|
17022
|
-
return
|
|
17071
|
+
return backtest$1.walkerCommandService.run(symbol, {
|
|
17023
17072
|
walkerName: context.walkerName,
|
|
17024
17073
|
exchangeName: walkerSchema.exchangeName,
|
|
17025
17074
|
frameName: walkerSchema.frameName,
|
|
@@ -17044,11 +17093,11 @@ class WalkerInstance {
|
|
|
17044
17093
|
* ```
|
|
17045
17094
|
*/
|
|
17046
17095
|
this.background = (symbol, context) => {
|
|
17047
|
-
|
|
17096
|
+
backtest$1.loggerService.info(WALKER_METHOD_NAME_BACKGROUND, {
|
|
17048
17097
|
symbol,
|
|
17049
17098
|
context,
|
|
17050
17099
|
});
|
|
17051
|
-
const walkerSchema =
|
|
17100
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(context.walkerName);
|
|
17052
17101
|
{
|
|
17053
17102
|
const currentStatus = this.task.getStatus();
|
|
17054
17103
|
if (currentStatus === "pending") {
|
|
@@ -17061,7 +17110,7 @@ class WalkerInstance {
|
|
|
17061
17110
|
this.task(symbol, context).catch((error) => exitEmitter.next(new Error(functoolsKit.getErrorMessage(error))));
|
|
17062
17111
|
return () => {
|
|
17063
17112
|
for (const strategyName of walkerSchema.strategies) {
|
|
17064
|
-
|
|
17113
|
+
backtest$1.strategyCoreService.stop(true, { symbol, strategyName });
|
|
17065
17114
|
walkerStopSubject.next({
|
|
17066
17115
|
symbol,
|
|
17067
17116
|
strategyName,
|
|
@@ -17104,14 +17153,14 @@ class WalkerInstance {
|
|
|
17104
17153
|
* ```
|
|
17105
17154
|
*/
|
|
17106
17155
|
this.stop = async (symbol, walkerName) => {
|
|
17107
|
-
|
|
17156
|
+
backtest$1.loggerService.info(WALKER_METHOD_NAME_STOP, {
|
|
17108
17157
|
symbol,
|
|
17109
17158
|
walkerName,
|
|
17110
17159
|
});
|
|
17111
|
-
const walkerSchema =
|
|
17160
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
|
|
17112
17161
|
for (const strategyName of walkerSchema.strategies) {
|
|
17113
17162
|
await walkerStopSubject.next({ symbol, strategyName, walkerName });
|
|
17114
|
-
await
|
|
17163
|
+
await backtest$1.strategyCoreService.stop(true, { symbol, strategyName });
|
|
17115
17164
|
}
|
|
17116
17165
|
};
|
|
17117
17166
|
/**
|
|
@@ -17129,12 +17178,12 @@ class WalkerInstance {
|
|
|
17129
17178
|
* ```
|
|
17130
17179
|
*/
|
|
17131
17180
|
this.getData = async (symbol, walkerName) => {
|
|
17132
|
-
|
|
17181
|
+
backtest$1.loggerService.info(WALKER_METHOD_NAME_GET_DATA, {
|
|
17133
17182
|
symbol,
|
|
17134
17183
|
walkerName,
|
|
17135
17184
|
});
|
|
17136
|
-
const walkerSchema =
|
|
17137
|
-
return await
|
|
17185
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
|
|
17186
|
+
return await backtest$1.walkerMarkdownService.getData(walkerName, symbol, walkerSchema.metric || "sharpeRatio", {
|
|
17138
17187
|
exchangeName: walkerSchema.exchangeName,
|
|
17139
17188
|
frameName: walkerSchema.frameName,
|
|
17140
17189
|
});
|
|
@@ -17156,12 +17205,12 @@ class WalkerInstance {
|
|
|
17156
17205
|
* ```
|
|
17157
17206
|
*/
|
|
17158
17207
|
this.getReport = async (symbol, walkerName, strategyColumns, pnlColumns) => {
|
|
17159
|
-
|
|
17208
|
+
backtest$1.loggerService.info(WALKER_METHOD_NAME_GET_REPORT, {
|
|
17160
17209
|
symbol,
|
|
17161
17210
|
walkerName,
|
|
17162
17211
|
});
|
|
17163
|
-
const walkerSchema =
|
|
17164
|
-
return await
|
|
17212
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
|
|
17213
|
+
return await backtest$1.walkerMarkdownService.getReport(walkerName, symbol, walkerSchema.metric || "sharpeRatio", {
|
|
17165
17214
|
exchangeName: walkerSchema.exchangeName,
|
|
17166
17215
|
frameName: walkerSchema.frameName,
|
|
17167
17216
|
}, strategyColumns, pnlColumns);
|
|
@@ -17186,13 +17235,13 @@ class WalkerInstance {
|
|
|
17186
17235
|
* ```
|
|
17187
17236
|
*/
|
|
17188
17237
|
this.dump = async (symbol, walkerName, path, strategyColumns, pnlColumns) => {
|
|
17189
|
-
|
|
17238
|
+
backtest$1.loggerService.info(WALKER_METHOD_NAME_DUMP, {
|
|
17190
17239
|
symbol,
|
|
17191
17240
|
walkerName,
|
|
17192
17241
|
path,
|
|
17193
17242
|
});
|
|
17194
|
-
const walkerSchema =
|
|
17195
|
-
await
|
|
17243
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
|
|
17244
|
+
await backtest$1.walkerMarkdownService.dump(walkerName, symbol, walkerSchema.metric || "sharpeRatio", {
|
|
17196
17245
|
exchangeName: walkerSchema.exchangeName,
|
|
17197
17246
|
frameName: walkerSchema.frameName,
|
|
17198
17247
|
}, path, strategyColumns, pnlColumns);
|
|
@@ -17233,17 +17282,17 @@ class WalkerUtils {
|
|
|
17233
17282
|
* @returns Async generator yielding progress updates after each strategy
|
|
17234
17283
|
*/
|
|
17235
17284
|
this.run = (symbol, context) => {
|
|
17236
|
-
|
|
17237
|
-
const walkerSchema =
|
|
17238
|
-
|
|
17239
|
-
|
|
17285
|
+
backtest$1.walkerValidationService.validate(context.walkerName, WALKER_METHOD_NAME_RUN);
|
|
17286
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(context.walkerName);
|
|
17287
|
+
backtest$1.exchangeValidationService.validate(walkerSchema.exchangeName, WALKER_METHOD_NAME_RUN);
|
|
17288
|
+
backtest$1.frameValidationService.validate(walkerSchema.frameName, WALKER_METHOD_NAME_RUN);
|
|
17240
17289
|
for (const strategyName of walkerSchema.strategies) {
|
|
17241
|
-
|
|
17242
|
-
const { riskName, riskList } =
|
|
17290
|
+
backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_RUN);
|
|
17291
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17243
17292
|
riskName &&
|
|
17244
|
-
|
|
17293
|
+
backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_RUN);
|
|
17245
17294
|
riskList &&
|
|
17246
|
-
riskList.forEach((riskName) =>
|
|
17295
|
+
riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_RUN));
|
|
17247
17296
|
}
|
|
17248
17297
|
const instance = this._getInstance(symbol, context.walkerName);
|
|
17249
17298
|
return instance.run(symbol, context);
|
|
@@ -17268,17 +17317,17 @@ class WalkerUtils {
|
|
|
17268
17317
|
* ```
|
|
17269
17318
|
*/
|
|
17270
17319
|
this.background = (symbol, context) => {
|
|
17271
|
-
|
|
17272
|
-
const walkerSchema =
|
|
17273
|
-
|
|
17274
|
-
|
|
17320
|
+
backtest$1.walkerValidationService.validate(context.walkerName, WALKER_METHOD_NAME_BACKGROUND);
|
|
17321
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(context.walkerName);
|
|
17322
|
+
backtest$1.exchangeValidationService.validate(walkerSchema.exchangeName, WALKER_METHOD_NAME_BACKGROUND);
|
|
17323
|
+
backtest$1.frameValidationService.validate(walkerSchema.frameName, WALKER_METHOD_NAME_BACKGROUND);
|
|
17275
17324
|
for (const strategyName of walkerSchema.strategies) {
|
|
17276
|
-
|
|
17277
|
-
const { riskName, riskList } =
|
|
17325
|
+
backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_BACKGROUND);
|
|
17326
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17278
17327
|
riskName &&
|
|
17279
|
-
|
|
17328
|
+
backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_BACKGROUND);
|
|
17280
17329
|
riskList &&
|
|
17281
|
-
riskList.forEach((riskName) =>
|
|
17330
|
+
riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_BACKGROUND));
|
|
17282
17331
|
}
|
|
17283
17332
|
const instance = this._getInstance(symbol, context.walkerName);
|
|
17284
17333
|
return instance.background(symbol, context);
|
|
@@ -17307,15 +17356,15 @@ class WalkerUtils {
|
|
|
17307
17356
|
* ```
|
|
17308
17357
|
*/
|
|
17309
17358
|
this.stop = async (symbol, walkerName) => {
|
|
17310
|
-
|
|
17311
|
-
const walkerSchema =
|
|
17359
|
+
backtest$1.walkerValidationService.validate(walkerName, WALKER_METHOD_NAME_STOP);
|
|
17360
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
|
|
17312
17361
|
for (const strategyName of walkerSchema.strategies) {
|
|
17313
|
-
|
|
17314
|
-
const { riskName, riskList } =
|
|
17362
|
+
backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_STOP);
|
|
17363
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17315
17364
|
riskName &&
|
|
17316
|
-
|
|
17365
|
+
backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_STOP);
|
|
17317
17366
|
riskList &&
|
|
17318
|
-
riskList.forEach((riskName) =>
|
|
17367
|
+
riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_STOP));
|
|
17319
17368
|
}
|
|
17320
17369
|
const instance = this._getInstance(symbol, walkerName);
|
|
17321
17370
|
return await instance.stop(symbol, walkerName);
|
|
@@ -17334,15 +17383,15 @@ class WalkerUtils {
|
|
|
17334
17383
|
* ```
|
|
17335
17384
|
*/
|
|
17336
17385
|
this.getData = async (symbol, walkerName) => {
|
|
17337
|
-
|
|
17338
|
-
const walkerSchema =
|
|
17386
|
+
backtest$1.walkerValidationService.validate(walkerName, WALKER_METHOD_NAME_GET_DATA);
|
|
17387
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
|
|
17339
17388
|
for (const strategyName of walkerSchema.strategies) {
|
|
17340
|
-
|
|
17341
|
-
const { riskName, riskList } =
|
|
17389
|
+
backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_GET_DATA);
|
|
17390
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17342
17391
|
riskName &&
|
|
17343
|
-
|
|
17392
|
+
backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_GET_DATA);
|
|
17344
17393
|
riskList &&
|
|
17345
|
-
riskList.forEach((riskName) =>
|
|
17394
|
+
riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_GET_DATA));
|
|
17346
17395
|
}
|
|
17347
17396
|
const instance = this._getInstance(symbol, walkerName);
|
|
17348
17397
|
return await instance.getData(symbol, walkerName);
|
|
@@ -17363,15 +17412,15 @@ class WalkerUtils {
|
|
|
17363
17412
|
* ```
|
|
17364
17413
|
*/
|
|
17365
17414
|
this.getReport = async (symbol, walkerName, strategyColumns, pnlColumns) => {
|
|
17366
|
-
|
|
17367
|
-
const walkerSchema =
|
|
17415
|
+
backtest$1.walkerValidationService.validate(walkerName, WALKER_METHOD_NAME_GET_REPORT);
|
|
17416
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
|
|
17368
17417
|
for (const strategyName of walkerSchema.strategies) {
|
|
17369
|
-
|
|
17370
|
-
const { riskName, riskList } =
|
|
17418
|
+
backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_GET_REPORT);
|
|
17419
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17371
17420
|
riskName &&
|
|
17372
|
-
|
|
17421
|
+
backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_GET_REPORT);
|
|
17373
17422
|
riskList &&
|
|
17374
|
-
riskList.forEach((riskName) =>
|
|
17423
|
+
riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_GET_REPORT));
|
|
17375
17424
|
}
|
|
17376
17425
|
const instance = this._getInstance(symbol, walkerName);
|
|
17377
17426
|
return await instance.getReport(symbol, walkerName, strategyColumns, pnlColumns);
|
|
@@ -17395,15 +17444,15 @@ class WalkerUtils {
|
|
|
17395
17444
|
* ```
|
|
17396
17445
|
*/
|
|
17397
17446
|
this.dump = async (symbol, walkerName, path, strategyColumns, pnlColumns) => {
|
|
17398
|
-
|
|
17399
|
-
const walkerSchema =
|
|
17447
|
+
backtest$1.walkerValidationService.validate(walkerName, WALKER_METHOD_NAME_DUMP);
|
|
17448
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
|
|
17400
17449
|
for (const strategyName of walkerSchema.strategies) {
|
|
17401
|
-
|
|
17402
|
-
const { riskName, riskList } =
|
|
17450
|
+
backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_DUMP);
|
|
17451
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17403
17452
|
riskName &&
|
|
17404
|
-
|
|
17453
|
+
backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_DUMP);
|
|
17405
17454
|
riskList &&
|
|
17406
|
-
riskList.forEach((riskName) =>
|
|
17455
|
+
riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_DUMP));
|
|
17407
17456
|
}
|
|
17408
17457
|
const instance = this._getInstance(symbol, walkerName);
|
|
17409
17458
|
return await instance.dump(symbol, walkerName, path, strategyColumns, pnlColumns);
|
|
@@ -17496,14 +17545,14 @@ class HeatUtils {
|
|
|
17496
17545
|
* ```
|
|
17497
17546
|
*/
|
|
17498
17547
|
this.getData = async (strategyName, backtest) => {
|
|
17499
|
-
|
|
17500
|
-
|
|
17548
|
+
backtest$1.loggerService.info(HEAT_METHOD_NAME_GET_DATA, { strategyName });
|
|
17549
|
+
backtest$1.strategyValidationService.validate(strategyName, HEAT_METHOD_NAME_GET_DATA);
|
|
17501
17550
|
{
|
|
17502
|
-
const { riskName, riskList } =
|
|
17503
|
-
riskName &&
|
|
17504
|
-
riskList && riskList.forEach((riskName) =>
|
|
17551
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17552
|
+
riskName && backtest$1.riskValidationService.validate(riskName, HEAT_METHOD_NAME_GET_DATA);
|
|
17553
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, HEAT_METHOD_NAME_GET_DATA));
|
|
17505
17554
|
}
|
|
17506
|
-
return await
|
|
17555
|
+
return await backtest$1.heatMarkdownService.getData(strategyName, backtest);
|
|
17507
17556
|
};
|
|
17508
17557
|
/**
|
|
17509
17558
|
* Generates markdown report with portfolio heatmap table for a strategy.
|
|
@@ -17532,14 +17581,14 @@ class HeatUtils {
|
|
|
17532
17581
|
* ```
|
|
17533
17582
|
*/
|
|
17534
17583
|
this.getReport = async (strategyName, backtest, columns) => {
|
|
17535
|
-
|
|
17536
|
-
|
|
17584
|
+
backtest$1.loggerService.info(HEAT_METHOD_NAME_GET_REPORT, { strategyName });
|
|
17585
|
+
backtest$1.strategyValidationService.validate(strategyName, HEAT_METHOD_NAME_GET_REPORT);
|
|
17537
17586
|
{
|
|
17538
|
-
const { riskName, riskList } =
|
|
17539
|
-
riskName &&
|
|
17540
|
-
riskList && riskList.forEach((riskName) =>
|
|
17587
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17588
|
+
riskName && backtest$1.riskValidationService.validate(riskName, HEAT_METHOD_NAME_GET_REPORT);
|
|
17589
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, HEAT_METHOD_NAME_GET_REPORT));
|
|
17541
17590
|
}
|
|
17542
|
-
return await
|
|
17591
|
+
return await backtest$1.heatMarkdownService.getReport(strategyName, backtest, columns);
|
|
17543
17592
|
};
|
|
17544
17593
|
/**
|
|
17545
17594
|
* Saves heatmap report to disk for a strategy.
|
|
@@ -17561,14 +17610,14 @@ class HeatUtils {
|
|
|
17561
17610
|
* ```
|
|
17562
17611
|
*/
|
|
17563
17612
|
this.dump = async (strategyName, backtest, path, columns) => {
|
|
17564
|
-
|
|
17565
|
-
|
|
17613
|
+
backtest$1.loggerService.info(HEAT_METHOD_NAME_DUMP, { strategyName, path });
|
|
17614
|
+
backtest$1.strategyValidationService.validate(strategyName, HEAT_METHOD_NAME_DUMP);
|
|
17566
17615
|
{
|
|
17567
|
-
const { riskName, riskList } =
|
|
17568
|
-
riskName &&
|
|
17569
|
-
riskList && riskList.forEach((riskName) =>
|
|
17616
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17617
|
+
riskName && backtest$1.riskValidationService.validate(riskName, HEAT_METHOD_NAME_DUMP);
|
|
17618
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, HEAT_METHOD_NAME_DUMP));
|
|
17570
17619
|
}
|
|
17571
|
-
await
|
|
17620
|
+
await backtest$1.heatMarkdownService.dump(strategyName, backtest, path, columns);
|
|
17572
17621
|
};
|
|
17573
17622
|
}
|
|
17574
17623
|
}
|
|
@@ -17655,12 +17704,12 @@ class PositionSizeUtils {
|
|
|
17655
17704
|
* @throws Error if sizing schema method is not "fixed-percentage"
|
|
17656
17705
|
*/
|
|
17657
17706
|
PositionSizeUtils.fixedPercentage = async (symbol, accountBalance, priceOpen, priceStopLoss, context) => {
|
|
17658
|
-
|
|
17707
|
+
backtest$1.loggerService.info(POSITION_SIZE_METHOD_NAME_FIXED, {
|
|
17659
17708
|
context,
|
|
17660
17709
|
symbol,
|
|
17661
17710
|
});
|
|
17662
|
-
|
|
17663
|
-
return await
|
|
17711
|
+
backtest$1.sizingValidationService.validate(context.sizingName, POSITION_SIZE_METHOD_NAME_FIXED, "fixed-percentage");
|
|
17712
|
+
return await backtest$1.sizingGlobalService.calculate({
|
|
17664
17713
|
symbol,
|
|
17665
17714
|
accountBalance,
|
|
17666
17715
|
priceOpen,
|
|
@@ -17681,12 +17730,12 @@ PositionSizeUtils.fixedPercentage = async (symbol, accountBalance, priceOpen, pr
|
|
|
17681
17730
|
* @throws Error if sizing schema method is not "kelly-criterion"
|
|
17682
17731
|
*/
|
|
17683
17732
|
PositionSizeUtils.kellyCriterion = async (symbol, accountBalance, priceOpen, winRate, winLossRatio, context) => {
|
|
17684
|
-
|
|
17733
|
+
backtest$1.loggerService.info(POSITION_SIZE_METHOD_NAME_KELLY, {
|
|
17685
17734
|
context,
|
|
17686
17735
|
symbol,
|
|
17687
17736
|
});
|
|
17688
|
-
|
|
17689
|
-
return await
|
|
17737
|
+
backtest$1.sizingValidationService.validate(context.sizingName, POSITION_SIZE_METHOD_NAME_KELLY, "kelly-criterion");
|
|
17738
|
+
return await backtest$1.sizingGlobalService.calculate({
|
|
17690
17739
|
symbol,
|
|
17691
17740
|
accountBalance,
|
|
17692
17741
|
priceOpen,
|
|
@@ -17707,12 +17756,12 @@ PositionSizeUtils.kellyCriterion = async (symbol, accountBalance, priceOpen, win
|
|
|
17707
17756
|
* @throws Error if sizing schema method is not "atr-based"
|
|
17708
17757
|
*/
|
|
17709
17758
|
PositionSizeUtils.atrBased = async (symbol, accountBalance, priceOpen, atr, context) => {
|
|
17710
|
-
|
|
17759
|
+
backtest$1.loggerService.info(POSITION_SIZE_METHOD_NAME_ATR, {
|
|
17711
17760
|
context,
|
|
17712
17761
|
symbol,
|
|
17713
17762
|
});
|
|
17714
|
-
|
|
17715
|
-
return await
|
|
17763
|
+
backtest$1.sizingValidationService.validate(context.sizingName, POSITION_SIZE_METHOD_NAME_ATR, "atr-based");
|
|
17764
|
+
return await backtest$1.sizingGlobalService.calculate({
|
|
17716
17765
|
symbol,
|
|
17717
17766
|
accountBalance,
|
|
17718
17767
|
priceOpen,
|
|
@@ -17761,12 +17810,12 @@ class OptimizerUtils {
|
|
|
17761
17810
|
* @throws Error if optimizer not found
|
|
17762
17811
|
*/
|
|
17763
17812
|
this.getData = async (symbol, context) => {
|
|
17764
|
-
|
|
17813
|
+
backtest$1.loggerService.info(OPTIMIZER_METHOD_NAME_GET_DATA, {
|
|
17765
17814
|
symbol,
|
|
17766
17815
|
context,
|
|
17767
17816
|
});
|
|
17768
|
-
|
|
17769
|
-
return await
|
|
17817
|
+
backtest$1.optimizerValidationService.validate(context.optimizerName, OPTIMIZER_METHOD_NAME_GET_DATA);
|
|
17818
|
+
return await backtest$1.optimizerGlobalService.getData(symbol, context.optimizerName);
|
|
17770
17819
|
};
|
|
17771
17820
|
/**
|
|
17772
17821
|
* Generates complete executable strategy code.
|
|
@@ -17778,12 +17827,12 @@ class OptimizerUtils {
|
|
|
17778
17827
|
* @throws Error if optimizer not found
|
|
17779
17828
|
*/
|
|
17780
17829
|
this.getCode = async (symbol, context) => {
|
|
17781
|
-
|
|
17830
|
+
backtest$1.loggerService.info(OPTIMIZER_METHOD_NAME_GET_CODE, {
|
|
17782
17831
|
symbol,
|
|
17783
17832
|
context,
|
|
17784
17833
|
});
|
|
17785
|
-
|
|
17786
|
-
return await
|
|
17834
|
+
backtest$1.optimizerValidationService.validate(context.optimizerName, OPTIMIZER_METHOD_NAME_GET_CODE);
|
|
17835
|
+
return await backtest$1.optimizerGlobalService.getCode(symbol, context.optimizerName);
|
|
17787
17836
|
};
|
|
17788
17837
|
/**
|
|
17789
17838
|
* Generates and saves strategy code to file.
|
|
@@ -17797,13 +17846,13 @@ class OptimizerUtils {
|
|
|
17797
17846
|
* @throws Error if optimizer not found or file write fails
|
|
17798
17847
|
*/
|
|
17799
17848
|
this.dump = async (symbol, context, path) => {
|
|
17800
|
-
|
|
17849
|
+
backtest$1.loggerService.info(OPTIMIZER_METHOD_NAME_DUMP, {
|
|
17801
17850
|
symbol,
|
|
17802
17851
|
context,
|
|
17803
17852
|
path,
|
|
17804
17853
|
});
|
|
17805
|
-
|
|
17806
|
-
await
|
|
17854
|
+
backtest$1.optimizerValidationService.validate(context.optimizerName, OPTIMIZER_METHOD_NAME_DUMP);
|
|
17855
|
+
await backtest$1.optimizerGlobalService.dump(symbol, context.optimizerName, path);
|
|
17807
17856
|
};
|
|
17808
17857
|
}
|
|
17809
17858
|
}
|
|
@@ -17885,14 +17934,14 @@ class PartialUtils {
|
|
|
17885
17934
|
* ```
|
|
17886
17935
|
*/
|
|
17887
17936
|
this.getData = async (symbol, strategyName, backtest) => {
|
|
17888
|
-
|
|
17889
|
-
|
|
17937
|
+
backtest$1.loggerService.info(PARTIAL_METHOD_NAME_GET_DATA, { symbol, strategyName });
|
|
17938
|
+
backtest$1.strategyValidationService.validate(strategyName, PARTIAL_METHOD_NAME_GET_DATA);
|
|
17890
17939
|
{
|
|
17891
|
-
const { riskName, riskList } =
|
|
17892
|
-
riskName &&
|
|
17893
|
-
riskList && riskList.forEach((riskName) =>
|
|
17940
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17941
|
+
riskName && backtest$1.riskValidationService.validate(riskName, PARTIAL_METHOD_NAME_GET_DATA);
|
|
17942
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, PARTIAL_METHOD_NAME_GET_DATA));
|
|
17894
17943
|
}
|
|
17895
|
-
return await
|
|
17944
|
+
return await backtest$1.partialMarkdownService.getData(symbol, strategyName, backtest);
|
|
17896
17945
|
};
|
|
17897
17946
|
/**
|
|
17898
17947
|
* Generates markdown report with all partial profit/loss events for a symbol-strategy pair.
|
|
@@ -17934,14 +17983,14 @@ class PartialUtils {
|
|
|
17934
17983
|
* ```
|
|
17935
17984
|
*/
|
|
17936
17985
|
this.getReport = async (symbol, strategyName, backtest, columns) => {
|
|
17937
|
-
|
|
17938
|
-
|
|
17986
|
+
backtest$1.loggerService.info(PARTIAL_METHOD_NAME_GET_REPORT, { symbol, strategyName });
|
|
17987
|
+
backtest$1.strategyValidationService.validate(strategyName, PARTIAL_METHOD_NAME_GET_REPORT);
|
|
17939
17988
|
{
|
|
17940
|
-
const { riskName, riskList } =
|
|
17941
|
-
riskName &&
|
|
17942
|
-
riskList && riskList.forEach((riskName) =>
|
|
17989
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17990
|
+
riskName && backtest$1.riskValidationService.validate(riskName, PARTIAL_METHOD_NAME_GET_REPORT);
|
|
17991
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, PARTIAL_METHOD_NAME_GET_REPORT));
|
|
17943
17992
|
}
|
|
17944
|
-
return await
|
|
17993
|
+
return await backtest$1.partialMarkdownService.getReport(symbol, strategyName, backtest, columns);
|
|
17945
17994
|
};
|
|
17946
17995
|
/**
|
|
17947
17996
|
* Generates and saves markdown report to file.
|
|
@@ -17976,14 +18025,14 @@ class PartialUtils {
|
|
|
17976
18025
|
* ```
|
|
17977
18026
|
*/
|
|
17978
18027
|
this.dump = async (symbol, strategyName, backtest, path, columns) => {
|
|
17979
|
-
|
|
17980
|
-
|
|
18028
|
+
backtest$1.loggerService.info(PARTIAL_METHOD_NAME_DUMP, { symbol, strategyName, path });
|
|
18029
|
+
backtest$1.strategyValidationService.validate(strategyName, PARTIAL_METHOD_NAME_DUMP);
|
|
17981
18030
|
{
|
|
17982
|
-
const { riskName, riskList } =
|
|
17983
|
-
riskName &&
|
|
17984
|
-
riskList && riskList.forEach((riskName) =>
|
|
18031
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
18032
|
+
riskName && backtest$1.riskValidationService.validate(riskName, PARTIAL_METHOD_NAME_DUMP);
|
|
18033
|
+
riskList && riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, PARTIAL_METHOD_NAME_DUMP));
|
|
17985
18034
|
}
|
|
17986
|
-
await
|
|
18035
|
+
await backtest$1.partialMarkdownService.dump(symbol, strategyName, backtest, path, columns);
|
|
17987
18036
|
};
|
|
17988
18037
|
}
|
|
17989
18038
|
}
|
|
@@ -18084,8 +18133,201 @@ class ConstantUtils {
|
|
|
18084
18133
|
*/
|
|
18085
18134
|
const Constant = new ConstantUtils();
|
|
18086
18135
|
|
|
18136
|
+
const EXCHANGE_METHOD_NAME_GET_CANDLES = "ExchangeUtils.getCandles";
|
|
18137
|
+
const EXCHANGE_METHOD_NAME_FORMAT_QUANTITY = "ExchangeUtils.formatQuantity";
|
|
18138
|
+
const EXCHANGE_METHOD_NAME_FORMAT_PRICE = "ExchangeUtils.formatPrice";
|
|
18139
|
+
/**
|
|
18140
|
+
* Instance class for exchange operations on a specific exchange.
|
|
18141
|
+
*
|
|
18142
|
+
* Provides isolated exchange operations for a single exchange.
|
|
18143
|
+
* Each instance maintains its own context and exposes IExchangeSchema methods.
|
|
18144
|
+
* The schema is retrieved once during construction for better performance.
|
|
18145
|
+
*
|
|
18146
|
+
* @example
|
|
18147
|
+
* ```typescript
|
|
18148
|
+
* const instance = new ExchangeInstance("binance");
|
|
18149
|
+
*
|
|
18150
|
+
* const candles = await instance.getCandles("BTCUSDT", "1m", new Date(), 100);
|
|
18151
|
+
* const formattedQty = await instance.formatQuantity("BTCUSDT", 0.001);
|
|
18152
|
+
* const formattedPrice = await instance.formatPrice("BTCUSDT", 50000.123);
|
|
18153
|
+
* ```
|
|
18154
|
+
*/
|
|
18155
|
+
class ExchangeInstance {
|
|
18156
|
+
/**
|
|
18157
|
+
* Creates a new ExchangeInstance for a specific exchange.
|
|
18158
|
+
*
|
|
18159
|
+
* @param exchangeName - Exchange name (e.g., "binance")
|
|
18160
|
+
*/
|
|
18161
|
+
constructor(exchangeName) {
|
|
18162
|
+
this.exchangeName = exchangeName;
|
|
18163
|
+
/**
|
|
18164
|
+
* Fetch candles from data source (API or database).
|
|
18165
|
+
*
|
|
18166
|
+
* @param symbol - Trading pair symbol (e.g., "BTCUSDT")
|
|
18167
|
+
* @param interval - Candle time interval (e.g., "1m", "1h")
|
|
18168
|
+
* @param since - Start date for candle fetching
|
|
18169
|
+
* @param limit - Maximum number of candles to fetch
|
|
18170
|
+
* @returns Promise resolving to array of OHLCV candle data
|
|
18171
|
+
*
|
|
18172
|
+
* @example
|
|
18173
|
+
* ```typescript
|
|
18174
|
+
* const instance = new ExchangeInstance("binance");
|
|
18175
|
+
* const candles = await instance.getCandles("BTCUSDT", "1m", new Date(), 100);
|
|
18176
|
+
* ```
|
|
18177
|
+
*/
|
|
18178
|
+
this.getCandles = async (symbol, interval, since, limit) => {
|
|
18179
|
+
backtest$1.loggerService.info(EXCHANGE_METHOD_NAME_GET_CANDLES, {
|
|
18180
|
+
exchangeName: this.exchangeName,
|
|
18181
|
+
symbol,
|
|
18182
|
+
interval,
|
|
18183
|
+
since,
|
|
18184
|
+
limit,
|
|
18185
|
+
});
|
|
18186
|
+
return await this._schema.getCandles(symbol, interval, since, limit);
|
|
18187
|
+
};
|
|
18188
|
+
/**
|
|
18189
|
+
* Format quantity according to exchange precision rules.
|
|
18190
|
+
*
|
|
18191
|
+
* @param symbol - Trading pair symbol
|
|
18192
|
+
* @param quantity - Raw quantity value
|
|
18193
|
+
* @returns Promise resolving to formatted quantity string
|
|
18194
|
+
*
|
|
18195
|
+
* @example
|
|
18196
|
+
* ```typescript
|
|
18197
|
+
* const instance = new ExchangeInstance("binance");
|
|
18198
|
+
* const formatted = await instance.formatQuantity("BTCUSDT", 0.001);
|
|
18199
|
+
* console.log(formatted); // "0.001"
|
|
18200
|
+
* ```
|
|
18201
|
+
*/
|
|
18202
|
+
this.formatQuantity = async (symbol, quantity) => {
|
|
18203
|
+
backtest$1.loggerService.info(EXCHANGE_METHOD_NAME_FORMAT_QUANTITY, {
|
|
18204
|
+
exchangeName: this.exchangeName,
|
|
18205
|
+
symbol,
|
|
18206
|
+
quantity,
|
|
18207
|
+
});
|
|
18208
|
+
return await this._schema.formatQuantity(symbol, quantity);
|
|
18209
|
+
};
|
|
18210
|
+
/**
|
|
18211
|
+
* Format price according to exchange precision rules.
|
|
18212
|
+
*
|
|
18213
|
+
* @param symbol - Trading pair symbol
|
|
18214
|
+
* @param price - Raw price value
|
|
18215
|
+
* @returns Promise resolving to formatted price string
|
|
18216
|
+
*
|
|
18217
|
+
* @example
|
|
18218
|
+
* ```typescript
|
|
18219
|
+
* const instance = new ExchangeInstance("binance");
|
|
18220
|
+
* const formatted = await instance.formatPrice("BTCUSDT", 50000.123);
|
|
18221
|
+
* console.log(formatted); // "50000.12"
|
|
18222
|
+
* ```
|
|
18223
|
+
*/
|
|
18224
|
+
this.formatPrice = async (symbol, price) => {
|
|
18225
|
+
backtest$1.loggerService.info(EXCHANGE_METHOD_NAME_FORMAT_PRICE, {
|
|
18226
|
+
exchangeName: this.exchangeName,
|
|
18227
|
+
symbol,
|
|
18228
|
+
price,
|
|
18229
|
+
});
|
|
18230
|
+
return await this._schema.formatPrice(symbol, price);
|
|
18231
|
+
};
|
|
18232
|
+
this._schema = backtest$1.exchangeSchemaService.get(this.exchangeName);
|
|
18233
|
+
}
|
|
18234
|
+
}
|
|
18235
|
+
/**
|
|
18236
|
+
* Utility class for exchange operations.
|
|
18237
|
+
*
|
|
18238
|
+
* Provides simplified access to exchange schema methods with validation.
|
|
18239
|
+
* Exported as singleton instance for convenient usage.
|
|
18240
|
+
*
|
|
18241
|
+
* @example
|
|
18242
|
+
* ```typescript
|
|
18243
|
+
* import { Exchange } from "./classes/Exchange";
|
|
18244
|
+
*
|
|
18245
|
+
* const candles = await Exchange.getCandles("BTCUSDT", "1m", new Date(), 100, {
|
|
18246
|
+
* exchangeName: "binance"
|
|
18247
|
+
* });
|
|
18248
|
+
* const formatted = await Exchange.formatQuantity("BTCUSDT", 0.001, {
|
|
18249
|
+
* exchangeName: "binance"
|
|
18250
|
+
* });
|
|
18251
|
+
* ```
|
|
18252
|
+
*/
|
|
18253
|
+
class ExchangeUtils {
|
|
18254
|
+
constructor() {
|
|
18255
|
+
/**
|
|
18256
|
+
* Memoized function to get or create ExchangeInstance for an exchange.
|
|
18257
|
+
* Each exchange gets its own isolated instance.
|
|
18258
|
+
*/
|
|
18259
|
+
this._getInstance = functoolsKit.memoize(([exchangeName]) => exchangeName, (exchangeName) => new ExchangeInstance(exchangeName));
|
|
18260
|
+
/**
|
|
18261
|
+
* Fetch candles from data source (API or database).
|
|
18262
|
+
*
|
|
18263
|
+
* @param symbol - Trading pair symbol (e.g., "BTCUSDT")
|
|
18264
|
+
* @param interval - Candle time interval (e.g., "1m", "1h")
|
|
18265
|
+
* @param since - Start date for candle fetching
|
|
18266
|
+
* @param limit - Maximum number of candles to fetch
|
|
18267
|
+
* @param context - Execution context with exchange name
|
|
18268
|
+
* @returns Promise resolving to array of OHLCV candle data
|
|
18269
|
+
*/
|
|
18270
|
+
this.getCandles = async (symbol, interval, since, limit, context) => {
|
|
18271
|
+
backtest$1.exchangeValidationService.validate(context.exchangeName, EXCHANGE_METHOD_NAME_GET_CANDLES);
|
|
18272
|
+
const instance = this._getInstance(context.exchangeName);
|
|
18273
|
+
return await instance.getCandles(symbol, interval, since, limit);
|
|
18274
|
+
};
|
|
18275
|
+
/**
|
|
18276
|
+
* Format quantity according to exchange precision rules.
|
|
18277
|
+
*
|
|
18278
|
+
* @param symbol - Trading pair symbol
|
|
18279
|
+
* @param quantity - Raw quantity value
|
|
18280
|
+
* @param context - Execution context with exchange name
|
|
18281
|
+
* @returns Promise resolving to formatted quantity string
|
|
18282
|
+
*/
|
|
18283
|
+
this.formatQuantity = async (symbol, quantity, context) => {
|
|
18284
|
+
backtest$1.exchangeValidationService.validate(context.exchangeName, EXCHANGE_METHOD_NAME_FORMAT_QUANTITY);
|
|
18285
|
+
const instance = this._getInstance(context.exchangeName);
|
|
18286
|
+
return await instance.formatQuantity(symbol, quantity);
|
|
18287
|
+
};
|
|
18288
|
+
/**
|
|
18289
|
+
* Format price according to exchange precision rules.
|
|
18290
|
+
*
|
|
18291
|
+
* @param symbol - Trading pair symbol
|
|
18292
|
+
* @param price - Raw price value
|
|
18293
|
+
* @param context - Execution context with exchange name
|
|
18294
|
+
* @returns Promise resolving to formatted price string
|
|
18295
|
+
*/
|
|
18296
|
+
this.formatPrice = async (symbol, price, context) => {
|
|
18297
|
+
backtest$1.exchangeValidationService.validate(context.exchangeName, EXCHANGE_METHOD_NAME_FORMAT_PRICE);
|
|
18298
|
+
const instance = this._getInstance(context.exchangeName);
|
|
18299
|
+
return await instance.formatPrice(symbol, price);
|
|
18300
|
+
};
|
|
18301
|
+
}
|
|
18302
|
+
}
|
|
18303
|
+
/**
|
|
18304
|
+
* Singleton instance of ExchangeUtils for convenient exchange operations.
|
|
18305
|
+
*
|
|
18306
|
+
* @example
|
|
18307
|
+
* ```typescript
|
|
18308
|
+
* import { Exchange } from "./classes/Exchange";
|
|
18309
|
+
*
|
|
18310
|
+
* // Using static-like API with context
|
|
18311
|
+
* const candles = await Exchange.getCandles("BTCUSDT", "1m", new Date(), 100, {
|
|
18312
|
+
* exchangeName: "binance"
|
|
18313
|
+
* });
|
|
18314
|
+
* const qty = await Exchange.formatQuantity("BTCUSDT", 0.001, {
|
|
18315
|
+
* exchangeName: "binance"
|
|
18316
|
+
* });
|
|
18317
|
+
* const price = await Exchange.formatPrice("BTCUSDT", 50000.123, {
|
|
18318
|
+
* exchangeName: "binance"
|
|
18319
|
+
* });
|
|
18320
|
+
*
|
|
18321
|
+
* // Using instance API (no context needed, exchange set in constructor)
|
|
18322
|
+
* const binance = new ExchangeInstance("binance");
|
|
18323
|
+
* const candles2 = await binance.getCandles("BTCUSDT", "1m", new Date(), 100);
|
|
18324
|
+
* ```
|
|
18325
|
+
*/
|
|
18326
|
+
const Exchange = new ExchangeUtils();
|
|
18327
|
+
|
|
18087
18328
|
exports.Backtest = Backtest;
|
|
18088
18329
|
exports.Constant = Constant;
|
|
18330
|
+
exports.Exchange = Exchange;
|
|
18089
18331
|
exports.ExecutionContextService = ExecutionContextService;
|
|
18090
18332
|
exports.Heat = Heat;
|
|
18091
18333
|
exports.Live = Live;
|
|
@@ -18121,6 +18363,7 @@ exports.getDate = getDate;
|
|
|
18121
18363
|
exports.getDefaultColumns = getDefaultColumns;
|
|
18122
18364
|
exports.getDefaultConfig = getDefaultConfig;
|
|
18123
18365
|
exports.getMode = getMode;
|
|
18366
|
+
exports.hasTradeContext = hasTradeContext;
|
|
18124
18367
|
exports.lib = backtest;
|
|
18125
18368
|
exports.listExchanges = listExchanges;
|
|
18126
18369
|
exports.listFrames = listFrames;
|