backtest-kit 1.5.28 → 1.5.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/index.cjs +644 -394
- package/build/index.mjs +643 -395
- package/package.json +1 -1
- package/types.d.ts +107 -1
package/build/index.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
|
},
|
|
@@ -6441,6 +6441,13 @@ class WalkerSchemaService {
|
|
|
6441
6441
|
if (walkerSchema.strategies.length === 0) {
|
|
6442
6442
|
throw new Error(`walker schema validation failed: strategies array cannot be empty for walkerName=${walkerSchema.walkerName}`);
|
|
6443
6443
|
}
|
|
6444
|
+
if (walkerSchema.strategies &&
|
|
6445
|
+
walkerSchema.strategies.length !== new Set(walkerSchema.strategies).size) {
|
|
6446
|
+
throw new Error(`walker schema validation failed: found duplicate strategies for walkerName=${walkerSchema.walkerName} strategies=[${walkerSchema.strategies}]`);
|
|
6447
|
+
}
|
|
6448
|
+
if (walkerSchema.strategies?.some((value) => typeof value !== "string")) {
|
|
6449
|
+
throw new Error(`walker schema validation failed: invalid strategies for walkerName=${walkerSchema.walkerName} strategies=[${walkerSchema.strategies}]`);
|
|
6450
|
+
}
|
|
6444
6451
|
};
|
|
6445
6452
|
/**
|
|
6446
6453
|
* Overrides an existing walker schema with partial updates.
|
|
@@ -13654,7 +13661,7 @@ const backtest = {
|
|
|
13654
13661
|
...templateServices,
|
|
13655
13662
|
};
|
|
13656
13663
|
init();
|
|
13657
|
-
var
|
|
13664
|
+
var backtest$1 = backtest;
|
|
13658
13665
|
|
|
13659
13666
|
/**
|
|
13660
13667
|
* Sets custom logger implementation for the framework.
|
|
@@ -13674,7 +13681,7 @@ var bt = backtest;
|
|
|
13674
13681
|
* ```
|
|
13675
13682
|
*/
|
|
13676
13683
|
function setLogger(logger) {
|
|
13677
|
-
|
|
13684
|
+
backtest$1.loggerService.setLogger(logger);
|
|
13678
13685
|
}
|
|
13679
13686
|
/**
|
|
13680
13687
|
* Sets global configuration parameters for the framework.
|
|
@@ -13692,7 +13699,7 @@ function setConfig(config, _unsafe) {
|
|
|
13692
13699
|
const prevConfig = Object.assign({}, GLOBAL_CONFIG);
|
|
13693
13700
|
try {
|
|
13694
13701
|
Object.assign(GLOBAL_CONFIG, config);
|
|
13695
|
-
!_unsafe &&
|
|
13702
|
+
!_unsafe && backtest$1.configValidationService.validate();
|
|
13696
13703
|
}
|
|
13697
13704
|
catch (error) {
|
|
13698
13705
|
console.warn(`backtest-kit setConfig failed: ${functoolsKit.getErrorMessage(error)}`, config);
|
|
@@ -13763,7 +13770,7 @@ function setColumns(columns, _unsafe) {
|
|
|
13763
13770
|
const prevConfig = Object.assign({}, COLUMN_CONFIG);
|
|
13764
13771
|
try {
|
|
13765
13772
|
Object.assign(COLUMN_CONFIG, columns);
|
|
13766
|
-
!_unsafe &&
|
|
13773
|
+
!_unsafe && backtest$1.columnValidationService.validate();
|
|
13767
13774
|
}
|
|
13768
13775
|
catch (error) {
|
|
13769
13776
|
console.warn(`backtest-kit setColumns failed: ${functoolsKit.getErrorMessage(error)}`, columns);
|
|
@@ -13848,11 +13855,11 @@ const ADD_OPTIMIZER_METHOD_NAME = "add.addOptimizer";
|
|
|
13848
13855
|
* ```
|
|
13849
13856
|
*/
|
|
13850
13857
|
function addStrategy(strategySchema) {
|
|
13851
|
-
|
|
13858
|
+
backtest$1.loggerService.info(ADD_STRATEGY_METHOD_NAME, {
|
|
13852
13859
|
strategySchema,
|
|
13853
13860
|
});
|
|
13854
|
-
|
|
13855
|
-
|
|
13861
|
+
backtest$1.strategyValidationService.addStrategy(strategySchema.strategyName, strategySchema);
|
|
13862
|
+
backtest$1.strategySchemaService.register(strategySchema.strategyName, strategySchema);
|
|
13856
13863
|
}
|
|
13857
13864
|
/**
|
|
13858
13865
|
* Registers an exchange data source in the framework.
|
|
@@ -13890,11 +13897,11 @@ function addStrategy(strategySchema) {
|
|
|
13890
13897
|
* ```
|
|
13891
13898
|
*/
|
|
13892
13899
|
function addExchange(exchangeSchema) {
|
|
13893
|
-
|
|
13900
|
+
backtest$1.loggerService.info(ADD_EXCHANGE_METHOD_NAME, {
|
|
13894
13901
|
exchangeSchema,
|
|
13895
13902
|
});
|
|
13896
|
-
|
|
13897
|
-
|
|
13903
|
+
backtest$1.exchangeValidationService.addExchange(exchangeSchema.exchangeName, exchangeSchema);
|
|
13904
|
+
backtest$1.exchangeSchemaService.register(exchangeSchema.exchangeName, exchangeSchema);
|
|
13898
13905
|
}
|
|
13899
13906
|
/**
|
|
13900
13907
|
* Registers a timeframe generator for backtesting.
|
|
@@ -13927,11 +13934,11 @@ function addExchange(exchangeSchema) {
|
|
|
13927
13934
|
* ```
|
|
13928
13935
|
*/
|
|
13929
13936
|
function addFrame(frameSchema) {
|
|
13930
|
-
|
|
13937
|
+
backtest$1.loggerService.info(ADD_FRAME_METHOD_NAME, {
|
|
13931
13938
|
frameSchema,
|
|
13932
13939
|
});
|
|
13933
|
-
|
|
13934
|
-
|
|
13940
|
+
backtest$1.frameValidationService.addFrame(frameSchema.frameName, frameSchema);
|
|
13941
|
+
backtest$1.frameSchemaService.register(frameSchema.frameName, frameSchema);
|
|
13935
13942
|
}
|
|
13936
13943
|
/**
|
|
13937
13944
|
* Registers a walker for strategy comparison.
|
|
@@ -13971,11 +13978,11 @@ function addFrame(frameSchema) {
|
|
|
13971
13978
|
* ```
|
|
13972
13979
|
*/
|
|
13973
13980
|
function addWalker(walkerSchema) {
|
|
13974
|
-
|
|
13981
|
+
backtest$1.loggerService.info(ADD_WALKER_METHOD_NAME, {
|
|
13975
13982
|
walkerSchema,
|
|
13976
13983
|
});
|
|
13977
|
-
|
|
13978
|
-
|
|
13984
|
+
backtest$1.walkerValidationService.addWalker(walkerSchema.walkerName, walkerSchema);
|
|
13985
|
+
backtest$1.walkerSchemaService.register(walkerSchema.walkerName, walkerSchema);
|
|
13979
13986
|
}
|
|
13980
13987
|
/**
|
|
13981
13988
|
* Registers a position sizing configuration in the framework.
|
|
@@ -14030,11 +14037,11 @@ function addWalker(walkerSchema) {
|
|
|
14030
14037
|
* ```
|
|
14031
14038
|
*/
|
|
14032
14039
|
function addSizing(sizingSchema) {
|
|
14033
|
-
|
|
14040
|
+
backtest$1.loggerService.info(ADD_SIZING_METHOD_NAME, {
|
|
14034
14041
|
sizingSchema,
|
|
14035
14042
|
});
|
|
14036
|
-
|
|
14037
|
-
|
|
14043
|
+
backtest$1.sizingValidationService.addSizing(sizingSchema.sizingName, sizingSchema);
|
|
14044
|
+
backtest$1.sizingSchemaService.register(sizingSchema.sizingName, sizingSchema);
|
|
14038
14045
|
}
|
|
14039
14046
|
/**
|
|
14040
14047
|
* Registers a risk management configuration in the framework.
|
|
@@ -14098,11 +14105,11 @@ function addSizing(sizingSchema) {
|
|
|
14098
14105
|
* ```
|
|
14099
14106
|
*/
|
|
14100
14107
|
function addRisk(riskSchema) {
|
|
14101
|
-
|
|
14108
|
+
backtest$1.loggerService.info(ADD_RISK_METHOD_NAME, {
|
|
14102
14109
|
riskSchema,
|
|
14103
14110
|
});
|
|
14104
|
-
|
|
14105
|
-
|
|
14111
|
+
backtest$1.riskValidationService.addRisk(riskSchema.riskName, riskSchema);
|
|
14112
|
+
backtest$1.riskSchemaService.register(riskSchema.riskName, riskSchema);
|
|
14106
14113
|
}
|
|
14107
14114
|
/**
|
|
14108
14115
|
* Registers an optimizer configuration in the framework.
|
|
@@ -14192,11 +14199,11 @@ function addRisk(riskSchema) {
|
|
|
14192
14199
|
* ```
|
|
14193
14200
|
*/
|
|
14194
14201
|
function addOptimizer(optimizerSchema) {
|
|
14195
|
-
|
|
14202
|
+
backtest$1.loggerService.info(ADD_OPTIMIZER_METHOD_NAME, {
|
|
14196
14203
|
optimizerSchema,
|
|
14197
14204
|
});
|
|
14198
|
-
|
|
14199
|
-
|
|
14205
|
+
backtest$1.optimizerValidationService.addOptimizer(optimizerSchema.optimizerName, optimizerSchema);
|
|
14206
|
+
backtest$1.optimizerSchemaService.register(optimizerSchema.optimizerName, optimizerSchema);
|
|
14200
14207
|
}
|
|
14201
14208
|
|
|
14202
14209
|
const LIST_EXCHANGES_METHOD_NAME = "list.listExchanges";
|
|
@@ -14232,8 +14239,8 @@ const LIST_OPTIMIZERS_METHOD_NAME = "list.listOptimizers";
|
|
|
14232
14239
|
* ```
|
|
14233
14240
|
*/
|
|
14234
14241
|
async function listExchanges() {
|
|
14235
|
-
|
|
14236
|
-
return await
|
|
14242
|
+
backtest$1.loggerService.log(LIST_EXCHANGES_METHOD_NAME);
|
|
14243
|
+
return await backtest$1.exchangeValidationService.list();
|
|
14237
14244
|
}
|
|
14238
14245
|
/**
|
|
14239
14246
|
* Returns a list of all registered strategy schemas.
|
|
@@ -14266,8 +14273,8 @@ async function listExchanges() {
|
|
|
14266
14273
|
* ```
|
|
14267
14274
|
*/
|
|
14268
14275
|
async function listStrategies() {
|
|
14269
|
-
|
|
14270
|
-
return await
|
|
14276
|
+
backtest$1.loggerService.log(LIST_STRATEGIES_METHOD_NAME);
|
|
14277
|
+
return await backtest$1.strategyValidationService.list();
|
|
14271
14278
|
}
|
|
14272
14279
|
/**
|
|
14273
14280
|
* Returns a list of all registered frame schemas.
|
|
@@ -14295,8 +14302,8 @@ async function listStrategies() {
|
|
|
14295
14302
|
* ```
|
|
14296
14303
|
*/
|
|
14297
14304
|
async function listFrames() {
|
|
14298
|
-
|
|
14299
|
-
return await
|
|
14305
|
+
backtest$1.loggerService.log(LIST_FRAMES_METHOD_NAME);
|
|
14306
|
+
return await backtest$1.frameValidationService.list();
|
|
14300
14307
|
}
|
|
14301
14308
|
/**
|
|
14302
14309
|
* Returns a list of all registered walker schemas.
|
|
@@ -14325,8 +14332,8 @@ async function listFrames() {
|
|
|
14325
14332
|
* ```
|
|
14326
14333
|
*/
|
|
14327
14334
|
async function listWalkers() {
|
|
14328
|
-
|
|
14329
|
-
return await
|
|
14335
|
+
backtest$1.loggerService.log(LIST_WALKERS_METHOD_NAME);
|
|
14336
|
+
return await backtest$1.walkerValidationService.list();
|
|
14330
14337
|
}
|
|
14331
14338
|
/**
|
|
14332
14339
|
* Returns a list of all registered sizing schemas.
|
|
@@ -14364,8 +14371,8 @@ async function listWalkers() {
|
|
|
14364
14371
|
* ```
|
|
14365
14372
|
*/
|
|
14366
14373
|
async function listSizings() {
|
|
14367
|
-
|
|
14368
|
-
return await
|
|
14374
|
+
backtest$1.loggerService.log(LIST_SIZINGS_METHOD_NAME);
|
|
14375
|
+
return await backtest$1.sizingValidationService.list();
|
|
14369
14376
|
}
|
|
14370
14377
|
/**
|
|
14371
14378
|
* Returns a list of all registered risk schemas.
|
|
@@ -14400,8 +14407,8 @@ async function listSizings() {
|
|
|
14400
14407
|
* ```
|
|
14401
14408
|
*/
|
|
14402
14409
|
async function listRisks() {
|
|
14403
|
-
|
|
14404
|
-
return await
|
|
14410
|
+
backtest$1.loggerService.log(LIST_RISKS_METHOD_NAME);
|
|
14411
|
+
return await backtest$1.riskValidationService.list();
|
|
14405
14412
|
}
|
|
14406
14413
|
/**
|
|
14407
14414
|
* Returns a list of all registered optimizer schemas.
|
|
@@ -14440,8 +14447,8 @@ async function listRisks() {
|
|
|
14440
14447
|
* ```
|
|
14441
14448
|
*/
|
|
14442
14449
|
async function listOptimizers() {
|
|
14443
|
-
|
|
14444
|
-
return await
|
|
14450
|
+
backtest$1.loggerService.log(LIST_OPTIMIZERS_METHOD_NAME);
|
|
14451
|
+
return await backtest$1.optimizerValidationService.list();
|
|
14445
14452
|
}
|
|
14446
14453
|
|
|
14447
14454
|
const LISTEN_SIGNAL_METHOD_NAME = "event.listenSignal";
|
|
@@ -14498,7 +14505,7 @@ const LISTEN_RISK_ONCE_METHOD_NAME = "event.listenRiskOnce";
|
|
|
14498
14505
|
* ```
|
|
14499
14506
|
*/
|
|
14500
14507
|
function listenSignal(fn) {
|
|
14501
|
-
|
|
14508
|
+
backtest$1.loggerService.log(LISTEN_SIGNAL_METHOD_NAME);
|
|
14502
14509
|
return signalEmitter.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
14503
14510
|
}
|
|
14504
14511
|
/**
|
|
@@ -14534,7 +14541,7 @@ function listenSignal(fn) {
|
|
|
14534
14541
|
* ```
|
|
14535
14542
|
*/
|
|
14536
14543
|
function listenSignalOnce(filterFn, fn) {
|
|
14537
|
-
|
|
14544
|
+
backtest$1.loggerService.log(LISTEN_SIGNAL_ONCE_METHOD_NAME);
|
|
14538
14545
|
return signalEmitter.filter(filterFn).once(fn);
|
|
14539
14546
|
}
|
|
14540
14547
|
/**
|
|
@@ -14558,7 +14565,7 @@ function listenSignalOnce(filterFn, fn) {
|
|
|
14558
14565
|
* ```
|
|
14559
14566
|
*/
|
|
14560
14567
|
function listenSignalLive(fn) {
|
|
14561
|
-
|
|
14568
|
+
backtest$1.loggerService.log(LISTEN_SIGNAL_LIVE_METHOD_NAME);
|
|
14562
14569
|
return signalLiveEmitter.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
14563
14570
|
}
|
|
14564
14571
|
/**
|
|
@@ -14583,7 +14590,7 @@ function listenSignalLive(fn) {
|
|
|
14583
14590
|
* ```
|
|
14584
14591
|
*/
|
|
14585
14592
|
function listenSignalLiveOnce(filterFn, fn) {
|
|
14586
|
-
|
|
14593
|
+
backtest$1.loggerService.log(LISTEN_SIGNAL_LIVE_ONCE_METHOD_NAME);
|
|
14587
14594
|
return signalLiveEmitter.filter(filterFn).once(fn);
|
|
14588
14595
|
}
|
|
14589
14596
|
/**
|
|
@@ -14607,7 +14614,7 @@ function listenSignalLiveOnce(filterFn, fn) {
|
|
|
14607
14614
|
* ```
|
|
14608
14615
|
*/
|
|
14609
14616
|
function listenSignalBacktest(fn) {
|
|
14610
|
-
|
|
14617
|
+
backtest$1.loggerService.log(LISTEN_SIGNAL_BACKTEST_METHOD_NAME);
|
|
14611
14618
|
return signalBacktestEmitter.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
14612
14619
|
}
|
|
14613
14620
|
/**
|
|
@@ -14632,7 +14639,7 @@ function listenSignalBacktest(fn) {
|
|
|
14632
14639
|
* ```
|
|
14633
14640
|
*/
|
|
14634
14641
|
function listenSignalBacktestOnce(filterFn, fn) {
|
|
14635
|
-
|
|
14642
|
+
backtest$1.loggerService.log(LISTEN_SIGNAL_BACKTEST_ONCE_METHOD_NAME);
|
|
14636
14643
|
return signalBacktestEmitter.filter(filterFn).once(fn);
|
|
14637
14644
|
}
|
|
14638
14645
|
/**
|
|
@@ -14660,7 +14667,7 @@ function listenSignalBacktestOnce(filterFn, fn) {
|
|
|
14660
14667
|
* ```
|
|
14661
14668
|
*/
|
|
14662
14669
|
function listenError(fn) {
|
|
14663
|
-
|
|
14670
|
+
backtest$1.loggerService.log(LISTEN_ERROR_METHOD_NAME);
|
|
14664
14671
|
return errorEmitter.subscribe(functoolsKit.queued(async (error) => fn(error)));
|
|
14665
14672
|
}
|
|
14666
14673
|
/**
|
|
@@ -14688,7 +14695,7 @@ function listenError(fn) {
|
|
|
14688
14695
|
* ```
|
|
14689
14696
|
*/
|
|
14690
14697
|
function listenExit(fn) {
|
|
14691
|
-
|
|
14698
|
+
backtest$1.loggerService.log(LISTEN_EXIT_METHOD_NAME);
|
|
14692
14699
|
return exitEmitter.subscribe(functoolsKit.queued(async (error) => fn(error)));
|
|
14693
14700
|
}
|
|
14694
14701
|
/**
|
|
@@ -14719,7 +14726,7 @@ function listenExit(fn) {
|
|
|
14719
14726
|
* ```
|
|
14720
14727
|
*/
|
|
14721
14728
|
function listenDoneLive(fn) {
|
|
14722
|
-
|
|
14729
|
+
backtest$1.loggerService.log(LISTEN_DONE_LIVE_METHOD_NAME);
|
|
14723
14730
|
return doneLiveSubject.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
14724
14731
|
}
|
|
14725
14732
|
/**
|
|
@@ -14749,7 +14756,7 @@ function listenDoneLive(fn) {
|
|
|
14749
14756
|
* ```
|
|
14750
14757
|
*/
|
|
14751
14758
|
function listenDoneLiveOnce(filterFn, fn) {
|
|
14752
|
-
|
|
14759
|
+
backtest$1.loggerService.log(LISTEN_DONE_LIVE_ONCE_METHOD_NAME);
|
|
14753
14760
|
return doneLiveSubject.filter(filterFn).once(fn);
|
|
14754
14761
|
}
|
|
14755
14762
|
/**
|
|
@@ -14781,7 +14788,7 @@ function listenDoneLiveOnce(filterFn, fn) {
|
|
|
14781
14788
|
* ```
|
|
14782
14789
|
*/
|
|
14783
14790
|
function listenDoneBacktest(fn) {
|
|
14784
|
-
|
|
14791
|
+
backtest$1.loggerService.log(LISTEN_DONE_BACKTEST_METHOD_NAME);
|
|
14785
14792
|
return doneBacktestSubject.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
14786
14793
|
}
|
|
14787
14794
|
/**
|
|
@@ -14812,7 +14819,7 @@ function listenDoneBacktest(fn) {
|
|
|
14812
14819
|
* ```
|
|
14813
14820
|
*/
|
|
14814
14821
|
function listenDoneBacktestOnce(filterFn, fn) {
|
|
14815
|
-
|
|
14822
|
+
backtest$1.loggerService.log(LISTEN_DONE_BACKTEST_ONCE_METHOD_NAME);
|
|
14816
14823
|
return doneBacktestSubject.filter(filterFn).once(fn);
|
|
14817
14824
|
}
|
|
14818
14825
|
/**
|
|
@@ -14842,7 +14849,7 @@ function listenDoneBacktestOnce(filterFn, fn) {
|
|
|
14842
14849
|
* ```
|
|
14843
14850
|
*/
|
|
14844
14851
|
function listenDoneWalker(fn) {
|
|
14845
|
-
|
|
14852
|
+
backtest$1.loggerService.log(LISTEN_DONE_WALKER_METHOD_NAME);
|
|
14846
14853
|
return doneWalkerSubject.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
14847
14854
|
}
|
|
14848
14855
|
/**
|
|
@@ -14871,7 +14878,7 @@ function listenDoneWalker(fn) {
|
|
|
14871
14878
|
* ```
|
|
14872
14879
|
*/
|
|
14873
14880
|
function listenDoneWalkerOnce(filterFn, fn) {
|
|
14874
|
-
|
|
14881
|
+
backtest$1.loggerService.log(LISTEN_DONE_WALKER_ONCE_METHOD_NAME);
|
|
14875
14882
|
return doneWalkerSubject.filter(filterFn).once(fn);
|
|
14876
14883
|
}
|
|
14877
14884
|
/**
|
|
@@ -14905,7 +14912,7 @@ function listenDoneWalkerOnce(filterFn, fn) {
|
|
|
14905
14912
|
* ```
|
|
14906
14913
|
*/
|
|
14907
14914
|
function listenBacktestProgress(fn) {
|
|
14908
|
-
|
|
14915
|
+
backtest$1.loggerService.log(LISTEN_PROGRESS_METHOD_NAME);
|
|
14909
14916
|
return progressBacktestEmitter.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
14910
14917
|
}
|
|
14911
14918
|
/**
|
|
@@ -14939,7 +14946,7 @@ function listenBacktestProgress(fn) {
|
|
|
14939
14946
|
* ```
|
|
14940
14947
|
*/
|
|
14941
14948
|
function listenWalkerProgress(fn) {
|
|
14942
|
-
|
|
14949
|
+
backtest$1.loggerService.log(LISTEN_PROGRESS_WALKER_METHOD_NAME);
|
|
14943
14950
|
return progressWalkerEmitter.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
14944
14951
|
}
|
|
14945
14952
|
/**
|
|
@@ -14967,7 +14974,7 @@ function listenWalkerProgress(fn) {
|
|
|
14967
14974
|
* ```
|
|
14968
14975
|
*/
|
|
14969
14976
|
function listenOptimizerProgress(fn) {
|
|
14970
|
-
|
|
14977
|
+
backtest$1.loggerService.log(LISTEN_PROGRESS_OPTIMIZER_METHOD_NAME);
|
|
14971
14978
|
return progressOptimizerEmitter.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
14972
14979
|
}
|
|
14973
14980
|
/**
|
|
@@ -15003,7 +15010,7 @@ function listenOptimizerProgress(fn) {
|
|
|
15003
15010
|
* ```
|
|
15004
15011
|
*/
|
|
15005
15012
|
function listenPerformance(fn) {
|
|
15006
|
-
|
|
15013
|
+
backtest$1.loggerService.log(LISTEN_PERFORMANCE_METHOD_NAME);
|
|
15007
15014
|
return performanceEmitter.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
15008
15015
|
}
|
|
15009
15016
|
/**
|
|
@@ -15037,7 +15044,7 @@ function listenPerformance(fn) {
|
|
|
15037
15044
|
* ```
|
|
15038
15045
|
*/
|
|
15039
15046
|
function listenWalker(fn) {
|
|
15040
|
-
|
|
15047
|
+
backtest$1.loggerService.log(LISTEN_WALKER_METHOD_NAME);
|
|
15041
15048
|
return walkerEmitter.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
15042
15049
|
}
|
|
15043
15050
|
/**
|
|
@@ -15080,7 +15087,7 @@ function listenWalker(fn) {
|
|
|
15080
15087
|
* ```
|
|
15081
15088
|
*/
|
|
15082
15089
|
function listenWalkerOnce(filterFn, fn) {
|
|
15083
|
-
|
|
15090
|
+
backtest$1.loggerService.log(LISTEN_WALKER_ONCE_METHOD_NAME);
|
|
15084
15091
|
return walkerEmitter.filter(filterFn).once(fn);
|
|
15085
15092
|
}
|
|
15086
15093
|
/**
|
|
@@ -15115,7 +15122,7 @@ function listenWalkerOnce(filterFn, fn) {
|
|
|
15115
15122
|
* ```
|
|
15116
15123
|
*/
|
|
15117
15124
|
function listenWalkerComplete(fn) {
|
|
15118
|
-
|
|
15125
|
+
backtest$1.loggerService.log(LISTEN_WALKER_COMPLETE_METHOD_NAME);
|
|
15119
15126
|
return walkerCompleteSubject.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
15120
15127
|
}
|
|
15121
15128
|
/**
|
|
@@ -15143,7 +15150,7 @@ function listenWalkerComplete(fn) {
|
|
|
15143
15150
|
* ```
|
|
15144
15151
|
*/
|
|
15145
15152
|
function listenValidation(fn) {
|
|
15146
|
-
|
|
15153
|
+
backtest$1.loggerService.log(LISTEN_VALIDATION_METHOD_NAME);
|
|
15147
15154
|
return validationSubject.subscribe(functoolsKit.queued(async (error) => fn(error)));
|
|
15148
15155
|
}
|
|
15149
15156
|
/**
|
|
@@ -15171,7 +15178,7 @@ function listenValidation(fn) {
|
|
|
15171
15178
|
* ```
|
|
15172
15179
|
*/
|
|
15173
15180
|
function listenPartialProfit(fn) {
|
|
15174
|
-
|
|
15181
|
+
backtest$1.loggerService.log(LISTEN_PARTIAL_PROFIT_METHOD_NAME);
|
|
15175
15182
|
return partialProfitSubject.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
15176
15183
|
}
|
|
15177
15184
|
/**
|
|
@@ -15205,7 +15212,7 @@ function listenPartialProfit(fn) {
|
|
|
15205
15212
|
* ```
|
|
15206
15213
|
*/
|
|
15207
15214
|
function listenPartialProfitOnce(filterFn, fn) {
|
|
15208
|
-
|
|
15215
|
+
backtest$1.loggerService.log(LISTEN_PARTIAL_PROFIT_ONCE_METHOD_NAME);
|
|
15209
15216
|
return partialProfitSubject.filter(filterFn).once(fn);
|
|
15210
15217
|
}
|
|
15211
15218
|
/**
|
|
@@ -15233,7 +15240,7 @@ function listenPartialProfitOnce(filterFn, fn) {
|
|
|
15233
15240
|
* ```
|
|
15234
15241
|
*/
|
|
15235
15242
|
function listenPartialLoss(fn) {
|
|
15236
|
-
|
|
15243
|
+
backtest$1.loggerService.log(LISTEN_PARTIAL_LOSS_METHOD_NAME);
|
|
15237
15244
|
return partialLossSubject.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
15238
15245
|
}
|
|
15239
15246
|
/**
|
|
@@ -15267,7 +15274,7 @@ function listenPartialLoss(fn) {
|
|
|
15267
15274
|
* ```
|
|
15268
15275
|
*/
|
|
15269
15276
|
function listenPartialLossOnce(filterFn, fn) {
|
|
15270
|
-
|
|
15277
|
+
backtest$1.loggerService.log(LISTEN_PARTIAL_LOSS_ONCE_METHOD_NAME);
|
|
15271
15278
|
return partialLossSubject.filter(filterFn).once(fn);
|
|
15272
15279
|
}
|
|
15273
15280
|
/**
|
|
@@ -15299,7 +15306,7 @@ function listenPartialLossOnce(filterFn, fn) {
|
|
|
15299
15306
|
* ```
|
|
15300
15307
|
*/
|
|
15301
15308
|
function listenRisk(fn) {
|
|
15302
|
-
|
|
15309
|
+
backtest$1.loggerService.log(LISTEN_RISK_METHOD_NAME);
|
|
15303
15310
|
return riskSubject.subscribe(functoolsKit.queued(async (event) => fn(event)));
|
|
15304
15311
|
}
|
|
15305
15312
|
/**
|
|
@@ -15336,7 +15343,7 @@ function listenRisk(fn) {
|
|
|
15336
15343
|
* ```
|
|
15337
15344
|
*/
|
|
15338
15345
|
function listenRiskOnce(filterFn, fn) {
|
|
15339
|
-
|
|
15346
|
+
backtest$1.loggerService.log(LISTEN_RISK_ONCE_METHOD_NAME);
|
|
15340
15347
|
return riskSubject.filter(filterFn).once(fn);
|
|
15341
15348
|
}
|
|
15342
15349
|
|
|
@@ -15346,6 +15353,31 @@ const FORMAT_PRICE_METHOD_NAME = "exchange.formatPrice";
|
|
|
15346
15353
|
const FORMAT_QUANTITY_METHOD_NAME = "exchange.formatQuantity";
|
|
15347
15354
|
const GET_DATE_METHOD_NAME = "exchange.getDate";
|
|
15348
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
|
+
}
|
|
15349
15381
|
/**
|
|
15350
15382
|
* Fetches historical candle data from the registered exchange.
|
|
15351
15383
|
*
|
|
@@ -15364,12 +15396,18 @@ const GET_MODE_METHOD_NAME = "exchange.getMode";
|
|
|
15364
15396
|
* ```
|
|
15365
15397
|
*/
|
|
15366
15398
|
async function getCandles(symbol, interval, limit) {
|
|
15367
|
-
|
|
15399
|
+
backtest$1.loggerService.info(GET_CANDLES_METHOD_NAME, {
|
|
15368
15400
|
symbol,
|
|
15369
15401
|
interval,
|
|
15370
15402
|
limit,
|
|
15371
15403
|
});
|
|
15372
|
-
|
|
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);
|
|
15373
15411
|
}
|
|
15374
15412
|
/**
|
|
15375
15413
|
* Calculates VWAP (Volume Weighted Average Price) for a symbol.
|
|
@@ -15390,10 +15428,16 @@ async function getCandles(symbol, interval, limit) {
|
|
|
15390
15428
|
* ```
|
|
15391
15429
|
*/
|
|
15392
15430
|
async function getAveragePrice(symbol) {
|
|
15393
|
-
|
|
15431
|
+
backtest$1.loggerService.info(GET_AVERAGE_PRICE_METHOD_NAME, {
|
|
15394
15432
|
symbol,
|
|
15395
15433
|
});
|
|
15396
|
-
|
|
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);
|
|
15397
15441
|
}
|
|
15398
15442
|
/**
|
|
15399
15443
|
* Formats a price value according to exchange rules.
|
|
@@ -15411,11 +15455,14 @@ async function getAveragePrice(symbol) {
|
|
|
15411
15455
|
* ```
|
|
15412
15456
|
*/
|
|
15413
15457
|
async function formatPrice(symbol, price) {
|
|
15414
|
-
|
|
15458
|
+
backtest$1.loggerService.info(FORMAT_PRICE_METHOD_NAME, {
|
|
15415
15459
|
symbol,
|
|
15416
15460
|
price,
|
|
15417
15461
|
});
|
|
15418
|
-
|
|
15462
|
+
if (!MethodContextService.hasContext()) {
|
|
15463
|
+
throw new Error("formatPrice requires a method context");
|
|
15464
|
+
}
|
|
15465
|
+
return await backtest$1.exchangeConnectionService.formatPrice(symbol, price);
|
|
15419
15466
|
}
|
|
15420
15467
|
/**
|
|
15421
15468
|
* Formats a quantity value according to exchange rules.
|
|
@@ -15433,11 +15480,14 @@ async function formatPrice(symbol, price) {
|
|
|
15433
15480
|
* ```
|
|
15434
15481
|
*/
|
|
15435
15482
|
async function formatQuantity(symbol, quantity) {
|
|
15436
|
-
|
|
15483
|
+
backtest$1.loggerService.info(FORMAT_QUANTITY_METHOD_NAME, {
|
|
15437
15484
|
symbol,
|
|
15438
15485
|
quantity,
|
|
15439
15486
|
});
|
|
15440
|
-
|
|
15487
|
+
if (!MethodContextService.hasContext()) {
|
|
15488
|
+
throw new Error("formatQuantity requires a method context");
|
|
15489
|
+
}
|
|
15490
|
+
return await backtest$1.exchangeConnectionService.formatQuantity(symbol, quantity);
|
|
15441
15491
|
}
|
|
15442
15492
|
/**
|
|
15443
15493
|
* Gets the current date from execution context.
|
|
@@ -15454,8 +15504,11 @@ async function formatQuantity(symbol, quantity) {
|
|
|
15454
15504
|
* ```
|
|
15455
15505
|
*/
|
|
15456
15506
|
async function getDate() {
|
|
15457
|
-
|
|
15458
|
-
|
|
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;
|
|
15459
15512
|
return new Date(when.getTime());
|
|
15460
15513
|
}
|
|
15461
15514
|
/**
|
|
@@ -15474,9 +15527,12 @@ async function getDate() {
|
|
|
15474
15527
|
* ```
|
|
15475
15528
|
*/
|
|
15476
15529
|
async function getMode() {
|
|
15477
|
-
|
|
15478
|
-
|
|
15479
|
-
|
|
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";
|
|
15480
15536
|
}
|
|
15481
15537
|
|
|
15482
15538
|
const DUMP_SIGNAL_METHOD_NAME = "dump.dumpSignal";
|
|
@@ -15547,13 +15603,13 @@ const DUMP_SIGNAL_METHOD_NAME = "dump.dumpSignal";
|
|
|
15547
15603
|
* ```
|
|
15548
15604
|
*/
|
|
15549
15605
|
async function dumpSignal(signalId, history, signal, outputDir = "./dump/strategy") {
|
|
15550
|
-
|
|
15606
|
+
backtest$1.loggerService.info(DUMP_SIGNAL_METHOD_NAME, {
|
|
15551
15607
|
signalId,
|
|
15552
15608
|
history,
|
|
15553
15609
|
signal,
|
|
15554
15610
|
outputDir,
|
|
15555
15611
|
});
|
|
15556
|
-
return await
|
|
15612
|
+
return await backtest$1.outlineMarkdownService.dumpSignal(signalId, history, signal, outputDir);
|
|
15557
15613
|
}
|
|
15558
15614
|
|
|
15559
15615
|
const BACKTEST_METHOD_NAME_RUN = "BacktestUtils.run";
|
|
@@ -15640,7 +15696,7 @@ class BacktestInstance {
|
|
|
15640
15696
|
* @internal
|
|
15641
15697
|
*/
|
|
15642
15698
|
this.task = functoolsKit.singlerun(async (symbol, context) => {
|
|
15643
|
-
|
|
15699
|
+
backtest$1.loggerService.info(BACKTEST_METHOD_NAME_TASK, {
|
|
15644
15700
|
symbol,
|
|
15645
15701
|
context,
|
|
15646
15702
|
});
|
|
@@ -15659,7 +15715,7 @@ class BacktestInstance {
|
|
|
15659
15715
|
* ```
|
|
15660
15716
|
*/
|
|
15661
15717
|
this.getStatus = async () => {
|
|
15662
|
-
|
|
15718
|
+
backtest$1.loggerService.info(BACKTEST_METHOD_NAME_GET_STATUS);
|
|
15663
15719
|
return {
|
|
15664
15720
|
id: this.id,
|
|
15665
15721
|
symbol: this.symbol,
|
|
@@ -15675,27 +15731,27 @@ class BacktestInstance {
|
|
|
15675
15731
|
* @returns Async generator yielding closed signals with PNL
|
|
15676
15732
|
*/
|
|
15677
15733
|
this.run = (symbol, context) => {
|
|
15678
|
-
|
|
15734
|
+
backtest$1.loggerService.info(BACKTEST_METHOD_NAME_RUN, {
|
|
15679
15735
|
symbol,
|
|
15680
15736
|
context,
|
|
15681
15737
|
});
|
|
15682
15738
|
{
|
|
15683
|
-
|
|
15684
|
-
|
|
15685
|
-
|
|
15686
|
-
|
|
15687
|
-
|
|
15688
|
-
|
|
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 });
|
|
15689
15745
|
}
|
|
15690
15746
|
{
|
|
15691
|
-
|
|
15747
|
+
backtest$1.strategyCoreService.clear(true, { symbol, strategyName: context.strategyName });
|
|
15692
15748
|
}
|
|
15693
15749
|
{
|
|
15694
|
-
const { riskName, riskList } =
|
|
15695
|
-
riskName &&
|
|
15696
|
-
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));
|
|
15697
15753
|
}
|
|
15698
|
-
return
|
|
15754
|
+
return backtest$1.backtestCommandService.run(symbol, context);
|
|
15699
15755
|
};
|
|
15700
15756
|
/**
|
|
15701
15757
|
* Runs backtest in background without yielding results.
|
|
@@ -15718,7 +15774,7 @@ class BacktestInstance {
|
|
|
15718
15774
|
* ```
|
|
15719
15775
|
*/
|
|
15720
15776
|
this.background = (symbol, context) => {
|
|
15721
|
-
|
|
15777
|
+
backtest$1.loggerService.info(BACKTEST_METHOD_NAME_BACKGROUND, {
|
|
15722
15778
|
symbol,
|
|
15723
15779
|
context,
|
|
15724
15780
|
});
|
|
@@ -15733,8 +15789,8 @@ class BacktestInstance {
|
|
|
15733
15789
|
}
|
|
15734
15790
|
this.task(symbol, context).catch((error) => exitEmitter.next(new Error(functoolsKit.getErrorMessage(error))));
|
|
15735
15791
|
return () => {
|
|
15736
|
-
|
|
15737
|
-
|
|
15792
|
+
backtest$1.strategyCoreService.stop(true, { symbol, strategyName: context.strategyName });
|
|
15793
|
+
backtest$1.strategyCoreService
|
|
15738
15794
|
.getPendingSignal(true, symbol, context.strategyName)
|
|
15739
15795
|
.then(async (pendingSignal) => {
|
|
15740
15796
|
if (pendingSignal) {
|
|
@@ -15771,11 +15827,11 @@ class BacktestInstance {
|
|
|
15771
15827
|
* ```
|
|
15772
15828
|
*/
|
|
15773
15829
|
this.stop = async (symbol, strategyName) => {
|
|
15774
|
-
|
|
15830
|
+
backtest$1.loggerService.info(BACKTEST_METHOD_NAME_STOP, {
|
|
15775
15831
|
symbol,
|
|
15776
15832
|
strategyName,
|
|
15777
15833
|
});
|
|
15778
|
-
await
|
|
15834
|
+
await backtest$1.strategyCoreService.stop(true, { symbol, strategyName });
|
|
15779
15835
|
};
|
|
15780
15836
|
/**
|
|
15781
15837
|
* Gets statistical data from all closed signals for a symbol-strategy pair.
|
|
@@ -15792,11 +15848,11 @@ class BacktestInstance {
|
|
|
15792
15848
|
* ```
|
|
15793
15849
|
*/
|
|
15794
15850
|
this.getData = async (symbol, strategyName) => {
|
|
15795
|
-
|
|
15851
|
+
backtest$1.loggerService.info("BacktestUtils.getData", {
|
|
15796
15852
|
symbol,
|
|
15797
15853
|
strategyName,
|
|
15798
15854
|
});
|
|
15799
|
-
return await
|
|
15855
|
+
return await backtest$1.backtestMarkdownService.getData(symbol, strategyName, true);
|
|
15800
15856
|
};
|
|
15801
15857
|
/**
|
|
15802
15858
|
* Generates markdown report with all closed signals for a symbol-strategy pair.
|
|
@@ -15814,11 +15870,11 @@ class BacktestInstance {
|
|
|
15814
15870
|
* ```
|
|
15815
15871
|
*/
|
|
15816
15872
|
this.getReport = async (symbol, strategyName, columns) => {
|
|
15817
|
-
|
|
15873
|
+
backtest$1.loggerService.info(BACKTEST_METHOD_NAME_GET_REPORT, {
|
|
15818
15874
|
symbol,
|
|
15819
15875
|
strategyName,
|
|
15820
15876
|
});
|
|
15821
|
-
return await
|
|
15877
|
+
return await backtest$1.backtestMarkdownService.getReport(symbol, strategyName, true, columns);
|
|
15822
15878
|
};
|
|
15823
15879
|
/**
|
|
15824
15880
|
* Saves strategy report to disk.
|
|
@@ -15839,12 +15895,12 @@ class BacktestInstance {
|
|
|
15839
15895
|
* ```
|
|
15840
15896
|
*/
|
|
15841
15897
|
this.dump = async (symbol, strategyName, path, columns) => {
|
|
15842
|
-
|
|
15898
|
+
backtest$1.loggerService.info(BACKTEST_METHOD_NAME_DUMP, {
|
|
15843
15899
|
symbol,
|
|
15844
15900
|
strategyName,
|
|
15845
15901
|
path,
|
|
15846
15902
|
});
|
|
15847
|
-
await
|
|
15903
|
+
await backtest$1.backtestMarkdownService.dump(symbol, strategyName, true, path, columns);
|
|
15848
15904
|
};
|
|
15849
15905
|
}
|
|
15850
15906
|
}
|
|
@@ -15883,14 +15939,14 @@ class BacktestUtils {
|
|
|
15883
15939
|
*/
|
|
15884
15940
|
this.run = (symbol, context) => {
|
|
15885
15941
|
{
|
|
15886
|
-
|
|
15887
|
-
|
|
15888
|
-
|
|
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);
|
|
15889
15945
|
}
|
|
15890
15946
|
{
|
|
15891
|
-
const { riskName, riskList } =
|
|
15892
|
-
riskName &&
|
|
15893
|
-
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));
|
|
15894
15950
|
}
|
|
15895
15951
|
const instance = this._getInstance(symbol, context.strategyName);
|
|
15896
15952
|
return instance.run(symbol, context);
|
|
@@ -15917,13 +15973,13 @@ class BacktestUtils {
|
|
|
15917
15973
|
* ```
|
|
15918
15974
|
*/
|
|
15919
15975
|
this.background = (symbol, context) => {
|
|
15920
|
-
|
|
15921
|
-
|
|
15922
|
-
|
|
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);
|
|
15923
15979
|
{
|
|
15924
|
-
const { riskName, riskList } =
|
|
15925
|
-
riskName &&
|
|
15926
|
-
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));
|
|
15927
15983
|
}
|
|
15928
15984
|
const instance = this._getInstance(symbol, context.strategyName);
|
|
15929
15985
|
return instance.background(symbol, context);
|
|
@@ -15946,11 +16002,11 @@ class BacktestUtils {
|
|
|
15946
16002
|
* ```
|
|
15947
16003
|
*/
|
|
15948
16004
|
this.stop = async (symbol, strategyName) => {
|
|
15949
|
-
|
|
16005
|
+
backtest$1.strategyValidationService.validate(strategyName, BACKTEST_METHOD_NAME_STOP);
|
|
15950
16006
|
{
|
|
15951
|
-
const { riskName, riskList } =
|
|
15952
|
-
riskName &&
|
|
15953
|
-
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));
|
|
15954
16010
|
}
|
|
15955
16011
|
const instance = this._getInstance(symbol, strategyName);
|
|
15956
16012
|
return await instance.stop(symbol, strategyName);
|
|
@@ -15969,11 +16025,11 @@ class BacktestUtils {
|
|
|
15969
16025
|
* ```
|
|
15970
16026
|
*/
|
|
15971
16027
|
this.getData = async (symbol, strategyName) => {
|
|
15972
|
-
|
|
16028
|
+
backtest$1.strategyValidationService.validate(strategyName, "BacktestUtils.getData");
|
|
15973
16029
|
{
|
|
15974
|
-
const { riskName, riskList } =
|
|
15975
|
-
riskName &&
|
|
15976
|
-
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"));
|
|
15977
16033
|
}
|
|
15978
16034
|
const instance = this._getInstance(symbol, strategyName);
|
|
15979
16035
|
return await instance.getData(symbol, strategyName);
|
|
@@ -15993,11 +16049,11 @@ class BacktestUtils {
|
|
|
15993
16049
|
* ```
|
|
15994
16050
|
*/
|
|
15995
16051
|
this.getReport = async (symbol, strategyName, columns) => {
|
|
15996
|
-
|
|
16052
|
+
backtest$1.strategyValidationService.validate(strategyName, BACKTEST_METHOD_NAME_GET_REPORT);
|
|
15997
16053
|
{
|
|
15998
|
-
const { riskName, riskList } =
|
|
15999
|
-
riskName &&
|
|
16000
|
-
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));
|
|
16001
16057
|
}
|
|
16002
16058
|
const instance = this._getInstance(symbol, strategyName);
|
|
16003
16059
|
return await instance.getReport(symbol, strategyName, columns);
|
|
@@ -16020,11 +16076,11 @@ class BacktestUtils {
|
|
|
16020
16076
|
* ```
|
|
16021
16077
|
*/
|
|
16022
16078
|
this.dump = async (symbol, strategyName, path, columns) => {
|
|
16023
|
-
|
|
16079
|
+
backtest$1.strategyValidationService.validate(strategyName, BACKTEST_METHOD_NAME_DUMP);
|
|
16024
16080
|
{
|
|
16025
|
-
const { riskName, riskList } =
|
|
16026
|
-
riskName &&
|
|
16027
|
-
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));
|
|
16028
16084
|
}
|
|
16029
16085
|
const instance = this._getInstance(symbol, strategyName);
|
|
16030
16086
|
return await instance.dump(symbol, strategyName, path, columns);
|
|
@@ -16154,7 +16210,7 @@ class LiveInstance {
|
|
|
16154
16210
|
* @internal
|
|
16155
16211
|
*/
|
|
16156
16212
|
this.task = functoolsKit.singlerun(async (symbol, context) => {
|
|
16157
|
-
|
|
16213
|
+
backtest$1.loggerService.info(LIVE_METHOD_NAME_TASK, {
|
|
16158
16214
|
symbol,
|
|
16159
16215
|
context,
|
|
16160
16216
|
});
|
|
@@ -16173,7 +16229,7 @@ class LiveInstance {
|
|
|
16173
16229
|
* ```
|
|
16174
16230
|
*/
|
|
16175
16231
|
this.getStatus = async () => {
|
|
16176
|
-
|
|
16232
|
+
backtest$1.loggerService.info(LIVE_METHOD_NAME_GET_STATUS);
|
|
16177
16233
|
return {
|
|
16178
16234
|
id: this.id,
|
|
16179
16235
|
symbol: this.symbol,
|
|
@@ -16192,27 +16248,27 @@ class LiveInstance {
|
|
|
16192
16248
|
* @returns Infinite async generator yielding opened and closed signals
|
|
16193
16249
|
*/
|
|
16194
16250
|
this.run = (symbol, context) => {
|
|
16195
|
-
|
|
16251
|
+
backtest$1.loggerService.info(LIVE_METHOD_NAME_RUN, {
|
|
16196
16252
|
symbol,
|
|
16197
16253
|
context,
|
|
16198
16254
|
});
|
|
16199
16255
|
{
|
|
16200
|
-
|
|
16201
|
-
|
|
16202
|
-
|
|
16203
|
-
|
|
16204
|
-
|
|
16205
|
-
|
|
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 });
|
|
16206
16262
|
}
|
|
16207
16263
|
{
|
|
16208
|
-
|
|
16264
|
+
backtest$1.strategyCoreService.clear(false, { symbol, strategyName: context.strategyName });
|
|
16209
16265
|
}
|
|
16210
16266
|
{
|
|
16211
|
-
const { riskName, riskList } =
|
|
16212
|
-
riskName &&
|
|
16213
|
-
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));
|
|
16214
16270
|
}
|
|
16215
|
-
return
|
|
16271
|
+
return backtest$1.liveCommandService.run(symbol, context);
|
|
16216
16272
|
};
|
|
16217
16273
|
/**
|
|
16218
16274
|
* Runs live trading in background without yielding results.
|
|
@@ -16235,7 +16291,7 @@ class LiveInstance {
|
|
|
16235
16291
|
* ```
|
|
16236
16292
|
*/
|
|
16237
16293
|
this.background = (symbol, context) => {
|
|
16238
|
-
|
|
16294
|
+
backtest$1.loggerService.info(LIVE_METHOD_NAME_BACKGROUND, {
|
|
16239
16295
|
symbol,
|
|
16240
16296
|
context,
|
|
16241
16297
|
});
|
|
@@ -16250,8 +16306,8 @@ class LiveInstance {
|
|
|
16250
16306
|
}
|
|
16251
16307
|
this.task(symbol, context).catch((error) => exitEmitter.next(new Error(functoolsKit.getErrorMessage(error))));
|
|
16252
16308
|
return () => {
|
|
16253
|
-
|
|
16254
|
-
|
|
16309
|
+
backtest$1.strategyCoreService.stop(false, { symbol, strategyName: context.strategyName });
|
|
16310
|
+
backtest$1.strategyCoreService
|
|
16255
16311
|
.getPendingSignal(false, symbol, context.strategyName)
|
|
16256
16312
|
.then(async (pendingSignal) => {
|
|
16257
16313
|
if (pendingSignal) {
|
|
@@ -16288,11 +16344,11 @@ class LiveInstance {
|
|
|
16288
16344
|
* ```
|
|
16289
16345
|
*/
|
|
16290
16346
|
this.stop = async (symbol, strategyName) => {
|
|
16291
|
-
|
|
16347
|
+
backtest$1.loggerService.info(LIVE_METHOD_NAME_STOP, {
|
|
16292
16348
|
symbol,
|
|
16293
16349
|
strategyName,
|
|
16294
16350
|
});
|
|
16295
|
-
await
|
|
16351
|
+
await backtest$1.strategyCoreService.stop(false, { symbol, strategyName });
|
|
16296
16352
|
};
|
|
16297
16353
|
/**
|
|
16298
16354
|
* Gets statistical data from all live trading events for a symbol-strategy pair.
|
|
@@ -16309,11 +16365,11 @@ class LiveInstance {
|
|
|
16309
16365
|
* ```
|
|
16310
16366
|
*/
|
|
16311
16367
|
this.getData = async (symbol, strategyName) => {
|
|
16312
|
-
|
|
16368
|
+
backtest$1.loggerService.info("LiveUtils.getData", {
|
|
16313
16369
|
symbol,
|
|
16314
16370
|
strategyName,
|
|
16315
16371
|
});
|
|
16316
|
-
return await
|
|
16372
|
+
return await backtest$1.liveMarkdownService.getData(symbol, strategyName, false);
|
|
16317
16373
|
};
|
|
16318
16374
|
/**
|
|
16319
16375
|
* Generates markdown report with all events for a symbol-strategy pair.
|
|
@@ -16331,11 +16387,11 @@ class LiveInstance {
|
|
|
16331
16387
|
* ```
|
|
16332
16388
|
*/
|
|
16333
16389
|
this.getReport = async (symbol, strategyName, columns) => {
|
|
16334
|
-
|
|
16390
|
+
backtest$1.loggerService.info(LIVE_METHOD_NAME_GET_REPORT, {
|
|
16335
16391
|
symbol,
|
|
16336
16392
|
strategyName,
|
|
16337
16393
|
});
|
|
16338
|
-
return await
|
|
16394
|
+
return await backtest$1.liveMarkdownService.getReport(symbol, strategyName, false, columns);
|
|
16339
16395
|
};
|
|
16340
16396
|
/**
|
|
16341
16397
|
* Saves strategy report to disk.
|
|
@@ -16356,12 +16412,12 @@ class LiveInstance {
|
|
|
16356
16412
|
* ```
|
|
16357
16413
|
*/
|
|
16358
16414
|
this.dump = async (symbol, strategyName, path, columns) => {
|
|
16359
|
-
|
|
16415
|
+
backtest$1.loggerService.info(LIVE_METHOD_NAME_DUMP, {
|
|
16360
16416
|
symbol,
|
|
16361
16417
|
strategyName,
|
|
16362
16418
|
path,
|
|
16363
16419
|
});
|
|
16364
|
-
await
|
|
16420
|
+
await backtest$1.liveMarkdownService.dump(symbol, strategyName, false, path, columns);
|
|
16365
16421
|
};
|
|
16366
16422
|
}
|
|
16367
16423
|
}
|
|
@@ -16413,13 +16469,13 @@ class LiveUtils {
|
|
|
16413
16469
|
*/
|
|
16414
16470
|
this.run = (symbol, context) => {
|
|
16415
16471
|
{
|
|
16416
|
-
|
|
16417
|
-
|
|
16472
|
+
backtest$1.strategyValidationService.validate(context.strategyName, LIVE_METHOD_NAME_RUN);
|
|
16473
|
+
backtest$1.exchangeValidationService.validate(context.exchangeName, LIVE_METHOD_NAME_RUN);
|
|
16418
16474
|
}
|
|
16419
16475
|
{
|
|
16420
|
-
const { riskName, riskList } =
|
|
16421
|
-
riskName &&
|
|
16422
|
-
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));
|
|
16423
16479
|
}
|
|
16424
16480
|
const instance = this._getInstance(symbol, context.strategyName);
|
|
16425
16481
|
return instance.run(symbol, context);
|
|
@@ -16446,12 +16502,12 @@ class LiveUtils {
|
|
|
16446
16502
|
* ```
|
|
16447
16503
|
*/
|
|
16448
16504
|
this.background = (symbol, context) => {
|
|
16449
|
-
|
|
16450
|
-
|
|
16505
|
+
backtest$1.strategyValidationService.validate(context.strategyName, LIVE_METHOD_NAME_BACKGROUND);
|
|
16506
|
+
backtest$1.exchangeValidationService.validate(context.exchangeName, LIVE_METHOD_NAME_BACKGROUND);
|
|
16451
16507
|
{
|
|
16452
|
-
const { riskName, riskList } =
|
|
16453
|
-
riskName &&
|
|
16454
|
-
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));
|
|
16455
16511
|
}
|
|
16456
16512
|
const instance = this._getInstance(symbol, context.strategyName);
|
|
16457
16513
|
return instance.background(symbol, context);
|
|
@@ -16474,11 +16530,11 @@ class LiveUtils {
|
|
|
16474
16530
|
* ```
|
|
16475
16531
|
*/
|
|
16476
16532
|
this.stop = async (symbol, strategyName) => {
|
|
16477
|
-
|
|
16533
|
+
backtest$1.strategyValidationService.validate(strategyName, LIVE_METHOD_NAME_STOP);
|
|
16478
16534
|
{
|
|
16479
|
-
const { riskName, riskList } =
|
|
16480
|
-
riskName &&
|
|
16481
|
-
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));
|
|
16482
16538
|
}
|
|
16483
16539
|
const instance = this._getInstance(symbol, strategyName);
|
|
16484
16540
|
return await instance.stop(symbol, strategyName);
|
|
@@ -16497,11 +16553,11 @@ class LiveUtils {
|
|
|
16497
16553
|
* ```
|
|
16498
16554
|
*/
|
|
16499
16555
|
this.getData = async (symbol, strategyName) => {
|
|
16500
|
-
|
|
16556
|
+
backtest$1.strategyValidationService.validate(strategyName, "LiveUtils.getData");
|
|
16501
16557
|
{
|
|
16502
|
-
const { riskName, riskList } =
|
|
16503
|
-
riskName &&
|
|
16504
|
-
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));
|
|
16505
16561
|
}
|
|
16506
16562
|
const instance = this._getInstance(symbol, strategyName);
|
|
16507
16563
|
return await instance.getData(symbol, strategyName);
|
|
@@ -16521,11 +16577,11 @@ class LiveUtils {
|
|
|
16521
16577
|
* ```
|
|
16522
16578
|
*/
|
|
16523
16579
|
this.getReport = async (symbol, strategyName, columns) => {
|
|
16524
|
-
|
|
16580
|
+
backtest$1.strategyValidationService.validate(strategyName, LIVE_METHOD_NAME_GET_REPORT);
|
|
16525
16581
|
{
|
|
16526
|
-
const { riskName, riskList } =
|
|
16527
|
-
riskName &&
|
|
16528
|
-
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));
|
|
16529
16585
|
}
|
|
16530
16586
|
const instance = this._getInstance(symbol, strategyName);
|
|
16531
16587
|
return await instance.getReport(symbol, strategyName, columns);
|
|
@@ -16548,11 +16604,11 @@ class LiveUtils {
|
|
|
16548
16604
|
* ```
|
|
16549
16605
|
*/
|
|
16550
16606
|
this.dump = async (symbol, strategyName, path, columns) => {
|
|
16551
|
-
|
|
16607
|
+
backtest$1.strategyValidationService.validate(strategyName, LIVE_METHOD_NAME_DUMP);
|
|
16552
16608
|
{
|
|
16553
|
-
const { riskName, riskList } =
|
|
16554
|
-
riskName &&
|
|
16555
|
-
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));
|
|
16556
16612
|
}
|
|
16557
16613
|
const instance = this._getInstance(symbol, strategyName);
|
|
16558
16614
|
return await instance.dump(symbol, strategyName, path, columns);
|
|
@@ -16637,18 +16693,18 @@ class ScheduleUtils {
|
|
|
16637
16693
|
* ```
|
|
16638
16694
|
*/
|
|
16639
16695
|
this.getData = async (symbol, strategyName, backtest) => {
|
|
16640
|
-
|
|
16696
|
+
backtest$1.loggerService.info(SCHEDULE_METHOD_NAME_GET_DATA, {
|
|
16641
16697
|
symbol,
|
|
16642
16698
|
strategyName,
|
|
16643
16699
|
backtest,
|
|
16644
16700
|
});
|
|
16645
|
-
|
|
16701
|
+
backtest$1.strategyValidationService.validate(strategyName, SCHEDULE_METHOD_NAME_GET_DATA);
|
|
16646
16702
|
{
|
|
16647
|
-
const { riskName, riskList } =
|
|
16648
|
-
riskName &&
|
|
16649
|
-
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));
|
|
16650
16706
|
}
|
|
16651
|
-
return await
|
|
16707
|
+
return await backtest$1.scheduleMarkdownService.getData(symbol, strategyName, backtest);
|
|
16652
16708
|
};
|
|
16653
16709
|
/**
|
|
16654
16710
|
* Generates markdown report with all scheduled events for a symbol-strategy pair.
|
|
@@ -16665,18 +16721,18 @@ class ScheduleUtils {
|
|
|
16665
16721
|
* ```
|
|
16666
16722
|
*/
|
|
16667
16723
|
this.getReport = async (symbol, strategyName, backtest, columns) => {
|
|
16668
|
-
|
|
16724
|
+
backtest$1.loggerService.info(SCHEDULE_METHOD_NAME_GET_REPORT, {
|
|
16669
16725
|
symbol,
|
|
16670
16726
|
strategyName,
|
|
16671
16727
|
backtest,
|
|
16672
16728
|
});
|
|
16673
|
-
|
|
16729
|
+
backtest$1.strategyValidationService.validate(strategyName, SCHEDULE_METHOD_NAME_GET_REPORT);
|
|
16674
16730
|
{
|
|
16675
|
-
const { riskName, riskList } =
|
|
16676
|
-
riskName &&
|
|
16677
|
-
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));
|
|
16678
16734
|
}
|
|
16679
|
-
return await
|
|
16735
|
+
return await backtest$1.scheduleMarkdownService.getReport(symbol, strategyName, backtest, columns);
|
|
16680
16736
|
};
|
|
16681
16737
|
/**
|
|
16682
16738
|
* Saves strategy report to disk.
|
|
@@ -16696,19 +16752,19 @@ class ScheduleUtils {
|
|
|
16696
16752
|
* ```
|
|
16697
16753
|
*/
|
|
16698
16754
|
this.dump = async (symbol, strategyName, backtest, path, columns) => {
|
|
16699
|
-
|
|
16755
|
+
backtest$1.loggerService.info(SCHEDULE_METHOD_NAME_DUMP, {
|
|
16700
16756
|
symbol,
|
|
16701
16757
|
strategyName,
|
|
16702
16758
|
backtest,
|
|
16703
16759
|
path,
|
|
16704
16760
|
});
|
|
16705
|
-
|
|
16761
|
+
backtest$1.strategyValidationService.validate(strategyName, SCHEDULE_METHOD_NAME_DUMP);
|
|
16706
16762
|
{
|
|
16707
|
-
const { riskName, riskList } =
|
|
16708
|
-
riskName &&
|
|
16709
|
-
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));
|
|
16710
16766
|
}
|
|
16711
|
-
await
|
|
16767
|
+
await backtest$1.scheduleMarkdownService.dump(symbol, strategyName, backtest, path, columns);
|
|
16712
16768
|
};
|
|
16713
16769
|
}
|
|
16714
16770
|
}
|
|
@@ -16790,13 +16846,13 @@ class Performance {
|
|
|
16790
16846
|
* ```
|
|
16791
16847
|
*/
|
|
16792
16848
|
static async getData(symbol, strategyName, backtest) {
|
|
16793
|
-
|
|
16849
|
+
backtest$1.strategyValidationService.validate(strategyName, PERFORMANCE_METHOD_NAME_GET_DATA);
|
|
16794
16850
|
{
|
|
16795
|
-
const { riskName, riskList } =
|
|
16796
|
-
riskName &&
|
|
16797
|
-
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));
|
|
16798
16854
|
}
|
|
16799
|
-
return
|
|
16855
|
+
return backtest$1.performanceMarkdownService.getData(symbol, strategyName, backtest);
|
|
16800
16856
|
}
|
|
16801
16857
|
/**
|
|
16802
16858
|
* Generates markdown report with performance analysis.
|
|
@@ -16822,13 +16878,13 @@ class Performance {
|
|
|
16822
16878
|
* ```
|
|
16823
16879
|
*/
|
|
16824
16880
|
static async getReport(symbol, strategyName, backtest, columns) {
|
|
16825
|
-
|
|
16881
|
+
backtest$1.strategyValidationService.validate(strategyName, PERFORMANCE_METHOD_NAME_GET_REPORT);
|
|
16826
16882
|
{
|
|
16827
|
-
const { riskName, riskList } =
|
|
16828
|
-
riskName &&
|
|
16829
|
-
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));
|
|
16830
16886
|
}
|
|
16831
|
-
return
|
|
16887
|
+
return backtest$1.performanceMarkdownService.getReport(symbol, strategyName, backtest, columns);
|
|
16832
16888
|
}
|
|
16833
16889
|
/**
|
|
16834
16890
|
* Saves performance report to disk.
|
|
@@ -16851,13 +16907,13 @@ class Performance {
|
|
|
16851
16907
|
* ```
|
|
16852
16908
|
*/
|
|
16853
16909
|
static async dump(symbol, strategyName, backtest, path = "./dump/performance", columns) {
|
|
16854
|
-
|
|
16910
|
+
backtest$1.strategyValidationService.validate(strategyName, PERFORMANCE_METHOD_NAME_DUMP);
|
|
16855
16911
|
{
|
|
16856
|
-
const { riskName, riskList } =
|
|
16857
|
-
riskName &&
|
|
16858
|
-
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));
|
|
16859
16915
|
}
|
|
16860
|
-
return
|
|
16916
|
+
return backtest$1.performanceMarkdownService.dump(symbol, strategyName, backtest, path, columns);
|
|
16861
16917
|
}
|
|
16862
16918
|
}
|
|
16863
16919
|
|
|
@@ -16891,7 +16947,7 @@ const INSTANCE_TASK_FN = async (symbol, context, self) => {
|
|
|
16891
16947
|
}
|
|
16892
16948
|
}
|
|
16893
16949
|
if (!self._isDone) {
|
|
16894
|
-
const walkerSchema =
|
|
16950
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(context.walkerName);
|
|
16895
16951
|
await doneWalkerSubject.next({
|
|
16896
16952
|
exchangeName: walkerSchema.exchangeName,
|
|
16897
16953
|
strategyName: context.walkerName,
|
|
@@ -16945,7 +17001,7 @@ class WalkerInstance {
|
|
|
16945
17001
|
* @internal
|
|
16946
17002
|
*/
|
|
16947
17003
|
this.task = functoolsKit.singlerun(async (symbol, context) => {
|
|
16948
|
-
|
|
17004
|
+
backtest$1.loggerService.info(WALKER_METHOD_NAME_TASK, {
|
|
16949
17005
|
symbol,
|
|
16950
17006
|
context,
|
|
16951
17007
|
});
|
|
@@ -16964,7 +17020,7 @@ class WalkerInstance {
|
|
|
16964
17020
|
* ```
|
|
16965
17021
|
*/
|
|
16966
17022
|
this.getStatus = async () => {
|
|
16967
|
-
|
|
17023
|
+
backtest$1.loggerService.info(WALKER_METHOD_NAME_GET_STATUS);
|
|
16968
17024
|
return {
|
|
16969
17025
|
id: this.id,
|
|
16970
17026
|
symbol: this.symbol,
|
|
@@ -16980,39 +17036,39 @@ class WalkerInstance {
|
|
|
16980
17036
|
* @returns Async generator yielding progress updates after each strategy
|
|
16981
17037
|
*/
|
|
16982
17038
|
this.run = (symbol, context) => {
|
|
16983
|
-
|
|
17039
|
+
backtest$1.loggerService.info(WALKER_METHOD_NAME_RUN, {
|
|
16984
17040
|
symbol,
|
|
16985
17041
|
context,
|
|
16986
17042
|
});
|
|
16987
|
-
|
|
16988
|
-
const walkerSchema =
|
|
16989
|
-
|
|
16990
|
-
|
|
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);
|
|
16991
17047
|
for (const strategyName of walkerSchema.strategies) {
|
|
16992
|
-
|
|
17048
|
+
backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_RUN);
|
|
16993
17049
|
}
|
|
16994
|
-
|
|
17050
|
+
backtest$1.walkerMarkdownService.clear(context.walkerName);
|
|
16995
17051
|
// Clear backtest data for all strategies
|
|
16996
17052
|
for (const strategyName of walkerSchema.strategies) {
|
|
16997
17053
|
{
|
|
16998
|
-
|
|
16999
|
-
|
|
17000
|
-
|
|
17001
|
-
|
|
17002
|
-
|
|
17003
|
-
|
|
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 });
|
|
17004
17060
|
}
|
|
17005
17061
|
{
|
|
17006
|
-
|
|
17062
|
+
backtest$1.strategyCoreService.clear(true, { symbol, strategyName });
|
|
17007
17063
|
}
|
|
17008
17064
|
{
|
|
17009
|
-
const { riskName, riskList } =
|
|
17010
|
-
riskName &&
|
|
17065
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17066
|
+
riskName && backtest$1.riskGlobalService.clear(true, riskName);
|
|
17011
17067
|
riskList &&
|
|
17012
|
-
riskList.forEach((riskName) =>
|
|
17068
|
+
riskList.forEach((riskName) => backtest$1.riskGlobalService.clear(true, riskName));
|
|
17013
17069
|
}
|
|
17014
17070
|
}
|
|
17015
|
-
return
|
|
17071
|
+
return backtest$1.walkerCommandService.run(symbol, {
|
|
17016
17072
|
walkerName: context.walkerName,
|
|
17017
17073
|
exchangeName: walkerSchema.exchangeName,
|
|
17018
17074
|
frameName: walkerSchema.frameName,
|
|
@@ -17037,11 +17093,11 @@ class WalkerInstance {
|
|
|
17037
17093
|
* ```
|
|
17038
17094
|
*/
|
|
17039
17095
|
this.background = (symbol, context) => {
|
|
17040
|
-
|
|
17096
|
+
backtest$1.loggerService.info(WALKER_METHOD_NAME_BACKGROUND, {
|
|
17041
17097
|
symbol,
|
|
17042
17098
|
context,
|
|
17043
17099
|
});
|
|
17044
|
-
const walkerSchema =
|
|
17100
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(context.walkerName);
|
|
17045
17101
|
{
|
|
17046
17102
|
const currentStatus = this.task.getStatus();
|
|
17047
17103
|
if (currentStatus === "pending") {
|
|
@@ -17054,7 +17110,7 @@ class WalkerInstance {
|
|
|
17054
17110
|
this.task(symbol, context).catch((error) => exitEmitter.next(new Error(functoolsKit.getErrorMessage(error))));
|
|
17055
17111
|
return () => {
|
|
17056
17112
|
for (const strategyName of walkerSchema.strategies) {
|
|
17057
|
-
|
|
17113
|
+
backtest$1.strategyCoreService.stop(true, { symbol, strategyName });
|
|
17058
17114
|
walkerStopSubject.next({
|
|
17059
17115
|
symbol,
|
|
17060
17116
|
strategyName,
|
|
@@ -17097,14 +17153,14 @@ class WalkerInstance {
|
|
|
17097
17153
|
* ```
|
|
17098
17154
|
*/
|
|
17099
17155
|
this.stop = async (symbol, walkerName) => {
|
|
17100
|
-
|
|
17156
|
+
backtest$1.loggerService.info(WALKER_METHOD_NAME_STOP, {
|
|
17101
17157
|
symbol,
|
|
17102
17158
|
walkerName,
|
|
17103
17159
|
});
|
|
17104
|
-
const walkerSchema =
|
|
17160
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
|
|
17105
17161
|
for (const strategyName of walkerSchema.strategies) {
|
|
17106
17162
|
await walkerStopSubject.next({ symbol, strategyName, walkerName });
|
|
17107
|
-
await
|
|
17163
|
+
await backtest$1.strategyCoreService.stop(true, { symbol, strategyName });
|
|
17108
17164
|
}
|
|
17109
17165
|
};
|
|
17110
17166
|
/**
|
|
@@ -17122,12 +17178,12 @@ class WalkerInstance {
|
|
|
17122
17178
|
* ```
|
|
17123
17179
|
*/
|
|
17124
17180
|
this.getData = async (symbol, walkerName) => {
|
|
17125
|
-
|
|
17181
|
+
backtest$1.loggerService.info(WALKER_METHOD_NAME_GET_DATA, {
|
|
17126
17182
|
symbol,
|
|
17127
17183
|
walkerName,
|
|
17128
17184
|
});
|
|
17129
|
-
const walkerSchema =
|
|
17130
|
-
return await
|
|
17185
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
|
|
17186
|
+
return await backtest$1.walkerMarkdownService.getData(walkerName, symbol, walkerSchema.metric || "sharpeRatio", {
|
|
17131
17187
|
exchangeName: walkerSchema.exchangeName,
|
|
17132
17188
|
frameName: walkerSchema.frameName,
|
|
17133
17189
|
});
|
|
@@ -17149,12 +17205,12 @@ class WalkerInstance {
|
|
|
17149
17205
|
* ```
|
|
17150
17206
|
*/
|
|
17151
17207
|
this.getReport = async (symbol, walkerName, strategyColumns, pnlColumns) => {
|
|
17152
|
-
|
|
17208
|
+
backtest$1.loggerService.info(WALKER_METHOD_NAME_GET_REPORT, {
|
|
17153
17209
|
symbol,
|
|
17154
17210
|
walkerName,
|
|
17155
17211
|
});
|
|
17156
|
-
const walkerSchema =
|
|
17157
|
-
return await
|
|
17212
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
|
|
17213
|
+
return await backtest$1.walkerMarkdownService.getReport(walkerName, symbol, walkerSchema.metric || "sharpeRatio", {
|
|
17158
17214
|
exchangeName: walkerSchema.exchangeName,
|
|
17159
17215
|
frameName: walkerSchema.frameName,
|
|
17160
17216
|
}, strategyColumns, pnlColumns);
|
|
@@ -17179,13 +17235,13 @@ class WalkerInstance {
|
|
|
17179
17235
|
* ```
|
|
17180
17236
|
*/
|
|
17181
17237
|
this.dump = async (symbol, walkerName, path, strategyColumns, pnlColumns) => {
|
|
17182
|
-
|
|
17238
|
+
backtest$1.loggerService.info(WALKER_METHOD_NAME_DUMP, {
|
|
17183
17239
|
symbol,
|
|
17184
17240
|
walkerName,
|
|
17185
17241
|
path,
|
|
17186
17242
|
});
|
|
17187
|
-
const walkerSchema =
|
|
17188
|
-
await
|
|
17243
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
|
|
17244
|
+
await backtest$1.walkerMarkdownService.dump(walkerName, symbol, walkerSchema.metric || "sharpeRatio", {
|
|
17189
17245
|
exchangeName: walkerSchema.exchangeName,
|
|
17190
17246
|
frameName: walkerSchema.frameName,
|
|
17191
17247
|
}, path, strategyColumns, pnlColumns);
|
|
@@ -17226,17 +17282,17 @@ class WalkerUtils {
|
|
|
17226
17282
|
* @returns Async generator yielding progress updates after each strategy
|
|
17227
17283
|
*/
|
|
17228
17284
|
this.run = (symbol, context) => {
|
|
17229
|
-
|
|
17230
|
-
const walkerSchema =
|
|
17231
|
-
|
|
17232
|
-
|
|
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);
|
|
17233
17289
|
for (const strategyName of walkerSchema.strategies) {
|
|
17234
|
-
|
|
17235
|
-
const { riskName, riskList } =
|
|
17290
|
+
backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_RUN);
|
|
17291
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17236
17292
|
riskName &&
|
|
17237
|
-
|
|
17293
|
+
backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_RUN);
|
|
17238
17294
|
riskList &&
|
|
17239
|
-
riskList.forEach((riskName) =>
|
|
17295
|
+
riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_RUN));
|
|
17240
17296
|
}
|
|
17241
17297
|
const instance = this._getInstance(symbol, context.walkerName);
|
|
17242
17298
|
return instance.run(symbol, context);
|
|
@@ -17261,17 +17317,17 @@ class WalkerUtils {
|
|
|
17261
17317
|
* ```
|
|
17262
17318
|
*/
|
|
17263
17319
|
this.background = (symbol, context) => {
|
|
17264
|
-
|
|
17265
|
-
const walkerSchema =
|
|
17266
|
-
|
|
17267
|
-
|
|
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);
|
|
17268
17324
|
for (const strategyName of walkerSchema.strategies) {
|
|
17269
|
-
|
|
17270
|
-
const { riskName, riskList } =
|
|
17325
|
+
backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_BACKGROUND);
|
|
17326
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17271
17327
|
riskName &&
|
|
17272
|
-
|
|
17328
|
+
backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_BACKGROUND);
|
|
17273
17329
|
riskList &&
|
|
17274
|
-
riskList.forEach((riskName) =>
|
|
17330
|
+
riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_BACKGROUND));
|
|
17275
17331
|
}
|
|
17276
17332
|
const instance = this._getInstance(symbol, context.walkerName);
|
|
17277
17333
|
return instance.background(symbol, context);
|
|
@@ -17300,15 +17356,15 @@ class WalkerUtils {
|
|
|
17300
17356
|
* ```
|
|
17301
17357
|
*/
|
|
17302
17358
|
this.stop = async (symbol, walkerName) => {
|
|
17303
|
-
|
|
17304
|
-
const walkerSchema =
|
|
17359
|
+
backtest$1.walkerValidationService.validate(walkerName, WALKER_METHOD_NAME_STOP);
|
|
17360
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
|
|
17305
17361
|
for (const strategyName of walkerSchema.strategies) {
|
|
17306
|
-
|
|
17307
|
-
const { riskName, riskList } =
|
|
17362
|
+
backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_STOP);
|
|
17363
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17308
17364
|
riskName &&
|
|
17309
|
-
|
|
17365
|
+
backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_STOP);
|
|
17310
17366
|
riskList &&
|
|
17311
|
-
riskList.forEach((riskName) =>
|
|
17367
|
+
riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_STOP));
|
|
17312
17368
|
}
|
|
17313
17369
|
const instance = this._getInstance(symbol, walkerName);
|
|
17314
17370
|
return await instance.stop(symbol, walkerName);
|
|
@@ -17327,15 +17383,15 @@ class WalkerUtils {
|
|
|
17327
17383
|
* ```
|
|
17328
17384
|
*/
|
|
17329
17385
|
this.getData = async (symbol, walkerName) => {
|
|
17330
|
-
|
|
17331
|
-
const walkerSchema =
|
|
17386
|
+
backtest$1.walkerValidationService.validate(walkerName, WALKER_METHOD_NAME_GET_DATA);
|
|
17387
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
|
|
17332
17388
|
for (const strategyName of walkerSchema.strategies) {
|
|
17333
|
-
|
|
17334
|
-
const { riskName, riskList } =
|
|
17389
|
+
backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_GET_DATA);
|
|
17390
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17335
17391
|
riskName &&
|
|
17336
|
-
|
|
17392
|
+
backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_GET_DATA);
|
|
17337
17393
|
riskList &&
|
|
17338
|
-
riskList.forEach((riskName) =>
|
|
17394
|
+
riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_GET_DATA));
|
|
17339
17395
|
}
|
|
17340
17396
|
const instance = this._getInstance(symbol, walkerName);
|
|
17341
17397
|
return await instance.getData(symbol, walkerName);
|
|
@@ -17356,15 +17412,15 @@ class WalkerUtils {
|
|
|
17356
17412
|
* ```
|
|
17357
17413
|
*/
|
|
17358
17414
|
this.getReport = async (symbol, walkerName, strategyColumns, pnlColumns) => {
|
|
17359
|
-
|
|
17360
|
-
const walkerSchema =
|
|
17415
|
+
backtest$1.walkerValidationService.validate(walkerName, WALKER_METHOD_NAME_GET_REPORT);
|
|
17416
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
|
|
17361
17417
|
for (const strategyName of walkerSchema.strategies) {
|
|
17362
|
-
|
|
17363
|
-
const { riskName, riskList } =
|
|
17418
|
+
backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_GET_REPORT);
|
|
17419
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17364
17420
|
riskName &&
|
|
17365
|
-
|
|
17421
|
+
backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_GET_REPORT);
|
|
17366
17422
|
riskList &&
|
|
17367
|
-
riskList.forEach((riskName) =>
|
|
17423
|
+
riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_GET_REPORT));
|
|
17368
17424
|
}
|
|
17369
17425
|
const instance = this._getInstance(symbol, walkerName);
|
|
17370
17426
|
return await instance.getReport(symbol, walkerName, strategyColumns, pnlColumns);
|
|
@@ -17388,15 +17444,15 @@ class WalkerUtils {
|
|
|
17388
17444
|
* ```
|
|
17389
17445
|
*/
|
|
17390
17446
|
this.dump = async (symbol, walkerName, path, strategyColumns, pnlColumns) => {
|
|
17391
|
-
|
|
17392
|
-
const walkerSchema =
|
|
17447
|
+
backtest$1.walkerValidationService.validate(walkerName, WALKER_METHOD_NAME_DUMP);
|
|
17448
|
+
const walkerSchema = backtest$1.walkerSchemaService.get(walkerName);
|
|
17393
17449
|
for (const strategyName of walkerSchema.strategies) {
|
|
17394
|
-
|
|
17395
|
-
const { riskName, riskList } =
|
|
17450
|
+
backtest$1.strategyValidationService.validate(strategyName, WALKER_METHOD_NAME_DUMP);
|
|
17451
|
+
const { riskName, riskList } = backtest$1.strategySchemaService.get(strategyName);
|
|
17396
17452
|
riskName &&
|
|
17397
|
-
|
|
17453
|
+
backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_DUMP);
|
|
17398
17454
|
riskList &&
|
|
17399
|
-
riskList.forEach((riskName) =>
|
|
17455
|
+
riskList.forEach((riskName) => backtest$1.riskValidationService.validate(riskName, WALKER_METHOD_NAME_DUMP));
|
|
17400
17456
|
}
|
|
17401
17457
|
const instance = this._getInstance(symbol, walkerName);
|
|
17402
17458
|
return await instance.dump(symbol, walkerName, path, strategyColumns, pnlColumns);
|
|
@@ -17489,14 +17545,14 @@ class HeatUtils {
|
|
|
17489
17545
|
* ```
|
|
17490
17546
|
*/
|
|
17491
17547
|
this.getData = async (strategyName, backtest) => {
|
|
17492
|
-
|
|
17493
|
-
|
|
17548
|
+
backtest$1.loggerService.info(HEAT_METHOD_NAME_GET_DATA, { strategyName });
|
|
17549
|
+
backtest$1.strategyValidationService.validate(strategyName, HEAT_METHOD_NAME_GET_DATA);
|
|
17494
17550
|
{
|
|
17495
|
-
const { riskName, riskList } =
|
|
17496
|
-
riskName &&
|
|
17497
|
-
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));
|
|
17498
17554
|
}
|
|
17499
|
-
return await
|
|
17555
|
+
return await backtest$1.heatMarkdownService.getData(strategyName, backtest);
|
|
17500
17556
|
};
|
|
17501
17557
|
/**
|
|
17502
17558
|
* Generates markdown report with portfolio heatmap table for a strategy.
|
|
@@ -17525,14 +17581,14 @@ class HeatUtils {
|
|
|
17525
17581
|
* ```
|
|
17526
17582
|
*/
|
|
17527
17583
|
this.getReport = async (strategyName, backtest, columns) => {
|
|
17528
|
-
|
|
17529
|
-
|
|
17584
|
+
backtest$1.loggerService.info(HEAT_METHOD_NAME_GET_REPORT, { strategyName });
|
|
17585
|
+
backtest$1.strategyValidationService.validate(strategyName, HEAT_METHOD_NAME_GET_REPORT);
|
|
17530
17586
|
{
|
|
17531
|
-
const { riskName, riskList } =
|
|
17532
|
-
riskName &&
|
|
17533
|
-
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));
|
|
17534
17590
|
}
|
|
17535
|
-
return await
|
|
17591
|
+
return await backtest$1.heatMarkdownService.getReport(strategyName, backtest, columns);
|
|
17536
17592
|
};
|
|
17537
17593
|
/**
|
|
17538
17594
|
* Saves heatmap report to disk for a strategy.
|
|
@@ -17554,14 +17610,14 @@ class HeatUtils {
|
|
|
17554
17610
|
* ```
|
|
17555
17611
|
*/
|
|
17556
17612
|
this.dump = async (strategyName, backtest, path, columns) => {
|
|
17557
|
-
|
|
17558
|
-
|
|
17613
|
+
backtest$1.loggerService.info(HEAT_METHOD_NAME_DUMP, { strategyName, path });
|
|
17614
|
+
backtest$1.strategyValidationService.validate(strategyName, HEAT_METHOD_NAME_DUMP);
|
|
17559
17615
|
{
|
|
17560
|
-
const { riskName, riskList } =
|
|
17561
|
-
riskName &&
|
|
17562
|
-
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));
|
|
17563
17619
|
}
|
|
17564
|
-
await
|
|
17620
|
+
await backtest$1.heatMarkdownService.dump(strategyName, backtest, path, columns);
|
|
17565
17621
|
};
|
|
17566
17622
|
}
|
|
17567
17623
|
}
|
|
@@ -17648,12 +17704,12 @@ class PositionSizeUtils {
|
|
|
17648
17704
|
* @throws Error if sizing schema method is not "fixed-percentage"
|
|
17649
17705
|
*/
|
|
17650
17706
|
PositionSizeUtils.fixedPercentage = async (symbol, accountBalance, priceOpen, priceStopLoss, context) => {
|
|
17651
|
-
|
|
17707
|
+
backtest$1.loggerService.info(POSITION_SIZE_METHOD_NAME_FIXED, {
|
|
17652
17708
|
context,
|
|
17653
17709
|
symbol,
|
|
17654
17710
|
});
|
|
17655
|
-
|
|
17656
|
-
return await
|
|
17711
|
+
backtest$1.sizingValidationService.validate(context.sizingName, POSITION_SIZE_METHOD_NAME_FIXED, "fixed-percentage");
|
|
17712
|
+
return await backtest$1.sizingGlobalService.calculate({
|
|
17657
17713
|
symbol,
|
|
17658
17714
|
accountBalance,
|
|
17659
17715
|
priceOpen,
|
|
@@ -17674,12 +17730,12 @@ PositionSizeUtils.fixedPercentage = async (symbol, accountBalance, priceOpen, pr
|
|
|
17674
17730
|
* @throws Error if sizing schema method is not "kelly-criterion"
|
|
17675
17731
|
*/
|
|
17676
17732
|
PositionSizeUtils.kellyCriterion = async (symbol, accountBalance, priceOpen, winRate, winLossRatio, context) => {
|
|
17677
|
-
|
|
17733
|
+
backtest$1.loggerService.info(POSITION_SIZE_METHOD_NAME_KELLY, {
|
|
17678
17734
|
context,
|
|
17679
17735
|
symbol,
|
|
17680
17736
|
});
|
|
17681
|
-
|
|
17682
|
-
return await
|
|
17737
|
+
backtest$1.sizingValidationService.validate(context.sizingName, POSITION_SIZE_METHOD_NAME_KELLY, "kelly-criterion");
|
|
17738
|
+
return await backtest$1.sizingGlobalService.calculate({
|
|
17683
17739
|
symbol,
|
|
17684
17740
|
accountBalance,
|
|
17685
17741
|
priceOpen,
|
|
@@ -17700,12 +17756,12 @@ PositionSizeUtils.kellyCriterion = async (symbol, accountBalance, priceOpen, win
|
|
|
17700
17756
|
* @throws Error if sizing schema method is not "atr-based"
|
|
17701
17757
|
*/
|
|
17702
17758
|
PositionSizeUtils.atrBased = async (symbol, accountBalance, priceOpen, atr, context) => {
|
|
17703
|
-
|
|
17759
|
+
backtest$1.loggerService.info(POSITION_SIZE_METHOD_NAME_ATR, {
|
|
17704
17760
|
context,
|
|
17705
17761
|
symbol,
|
|
17706
17762
|
});
|
|
17707
|
-
|
|
17708
|
-
return await
|
|
17763
|
+
backtest$1.sizingValidationService.validate(context.sizingName, POSITION_SIZE_METHOD_NAME_ATR, "atr-based");
|
|
17764
|
+
return await backtest$1.sizingGlobalService.calculate({
|
|
17709
17765
|
symbol,
|
|
17710
17766
|
accountBalance,
|
|
17711
17767
|
priceOpen,
|
|
@@ -17754,12 +17810,12 @@ class OptimizerUtils {
|
|
|
17754
17810
|
* @throws Error if optimizer not found
|
|
17755
17811
|
*/
|
|
17756
17812
|
this.getData = async (symbol, context) => {
|
|
17757
|
-
|
|
17813
|
+
backtest$1.loggerService.info(OPTIMIZER_METHOD_NAME_GET_DATA, {
|
|
17758
17814
|
symbol,
|
|
17759
17815
|
context,
|
|
17760
17816
|
});
|
|
17761
|
-
|
|
17762
|
-
return await
|
|
17817
|
+
backtest$1.optimizerValidationService.validate(context.optimizerName, OPTIMIZER_METHOD_NAME_GET_DATA);
|
|
17818
|
+
return await backtest$1.optimizerGlobalService.getData(symbol, context.optimizerName);
|
|
17763
17819
|
};
|
|
17764
17820
|
/**
|
|
17765
17821
|
* Generates complete executable strategy code.
|
|
@@ -17771,12 +17827,12 @@ class OptimizerUtils {
|
|
|
17771
17827
|
* @throws Error if optimizer not found
|
|
17772
17828
|
*/
|
|
17773
17829
|
this.getCode = async (symbol, context) => {
|
|
17774
|
-
|
|
17830
|
+
backtest$1.loggerService.info(OPTIMIZER_METHOD_NAME_GET_CODE, {
|
|
17775
17831
|
symbol,
|
|
17776
17832
|
context,
|
|
17777
17833
|
});
|
|
17778
|
-
|
|
17779
|
-
return await
|
|
17834
|
+
backtest$1.optimizerValidationService.validate(context.optimizerName, OPTIMIZER_METHOD_NAME_GET_CODE);
|
|
17835
|
+
return await backtest$1.optimizerGlobalService.getCode(symbol, context.optimizerName);
|
|
17780
17836
|
};
|
|
17781
17837
|
/**
|
|
17782
17838
|
* Generates and saves strategy code to file.
|
|
@@ -17790,13 +17846,13 @@ class OptimizerUtils {
|
|
|
17790
17846
|
* @throws Error if optimizer not found or file write fails
|
|
17791
17847
|
*/
|
|
17792
17848
|
this.dump = async (symbol, context, path) => {
|
|
17793
|
-
|
|
17849
|
+
backtest$1.loggerService.info(OPTIMIZER_METHOD_NAME_DUMP, {
|
|
17794
17850
|
symbol,
|
|
17795
17851
|
context,
|
|
17796
17852
|
path,
|
|
17797
17853
|
});
|
|
17798
|
-
|
|
17799
|
-
await
|
|
17854
|
+
backtest$1.optimizerValidationService.validate(context.optimizerName, OPTIMIZER_METHOD_NAME_DUMP);
|
|
17855
|
+
await backtest$1.optimizerGlobalService.dump(symbol, context.optimizerName, path);
|
|
17800
17856
|
};
|
|
17801
17857
|
}
|
|
17802
17858
|
}
|
|
@@ -17878,14 +17934,14 @@ class PartialUtils {
|
|
|
17878
17934
|
* ```
|
|
17879
17935
|
*/
|
|
17880
17936
|
this.getData = async (symbol, strategyName, backtest) => {
|
|
17881
|
-
|
|
17882
|
-
|
|
17937
|
+
backtest$1.loggerService.info(PARTIAL_METHOD_NAME_GET_DATA, { symbol, strategyName });
|
|
17938
|
+
backtest$1.strategyValidationService.validate(strategyName, PARTIAL_METHOD_NAME_GET_DATA);
|
|
17883
17939
|
{
|
|
17884
|
-
const { riskName, riskList } =
|
|
17885
|
-
riskName &&
|
|
17886
|
-
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));
|
|
17887
17943
|
}
|
|
17888
|
-
return await
|
|
17944
|
+
return await backtest$1.partialMarkdownService.getData(symbol, strategyName, backtest);
|
|
17889
17945
|
};
|
|
17890
17946
|
/**
|
|
17891
17947
|
* Generates markdown report with all partial profit/loss events for a symbol-strategy pair.
|
|
@@ -17927,14 +17983,14 @@ class PartialUtils {
|
|
|
17927
17983
|
* ```
|
|
17928
17984
|
*/
|
|
17929
17985
|
this.getReport = async (symbol, strategyName, backtest, columns) => {
|
|
17930
|
-
|
|
17931
|
-
|
|
17986
|
+
backtest$1.loggerService.info(PARTIAL_METHOD_NAME_GET_REPORT, { symbol, strategyName });
|
|
17987
|
+
backtest$1.strategyValidationService.validate(strategyName, PARTIAL_METHOD_NAME_GET_REPORT);
|
|
17932
17988
|
{
|
|
17933
|
-
const { riskName, riskList } =
|
|
17934
|
-
riskName &&
|
|
17935
|
-
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));
|
|
17936
17992
|
}
|
|
17937
|
-
return await
|
|
17993
|
+
return await backtest$1.partialMarkdownService.getReport(symbol, strategyName, backtest, columns);
|
|
17938
17994
|
};
|
|
17939
17995
|
/**
|
|
17940
17996
|
* Generates and saves markdown report to file.
|
|
@@ -17969,14 +18025,14 @@ class PartialUtils {
|
|
|
17969
18025
|
* ```
|
|
17970
18026
|
*/
|
|
17971
18027
|
this.dump = async (symbol, strategyName, backtest, path, columns) => {
|
|
17972
|
-
|
|
17973
|
-
|
|
18028
|
+
backtest$1.loggerService.info(PARTIAL_METHOD_NAME_DUMP, { symbol, strategyName, path });
|
|
18029
|
+
backtest$1.strategyValidationService.validate(strategyName, PARTIAL_METHOD_NAME_DUMP);
|
|
17974
18030
|
{
|
|
17975
|
-
const { riskName, riskList } =
|
|
17976
|
-
riskName &&
|
|
17977
|
-
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));
|
|
17978
18034
|
}
|
|
17979
|
-
await
|
|
18035
|
+
await backtest$1.partialMarkdownService.dump(symbol, strategyName, backtest, path, columns);
|
|
17980
18036
|
};
|
|
17981
18037
|
}
|
|
17982
18038
|
}
|
|
@@ -18077,8 +18133,201 @@ class ConstantUtils {
|
|
|
18077
18133
|
*/
|
|
18078
18134
|
const Constant = new ConstantUtils();
|
|
18079
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
|
+
|
|
18080
18328
|
exports.Backtest = Backtest;
|
|
18081
18329
|
exports.Constant = Constant;
|
|
18330
|
+
exports.Exchange = Exchange;
|
|
18082
18331
|
exports.ExecutionContextService = ExecutionContextService;
|
|
18083
18332
|
exports.Heat = Heat;
|
|
18084
18333
|
exports.Live = Live;
|
|
@@ -18114,6 +18363,7 @@ exports.getDate = getDate;
|
|
|
18114
18363
|
exports.getDefaultColumns = getDefaultColumns;
|
|
18115
18364
|
exports.getDefaultConfig = getDefaultConfig;
|
|
18116
18365
|
exports.getMode = getMode;
|
|
18366
|
+
exports.hasTradeContext = hasTradeContext;
|
|
18117
18367
|
exports.lib = backtest;
|
|
18118
18368
|
exports.listExchanges = listExchanges;
|
|
18119
18369
|
exports.listFrames = listFrames;
|