backtest-kit 5.6.5 → 5.6.7
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 +169 -23
- package/build/index.mjs +169 -23
- package/package.json +1 -1
package/build/index.cjs
CHANGED
|
@@ -11762,9 +11762,17 @@ const CALL_PARTIAL_LOSS_AVAILABLE_FN = functoolsKit.trycatch(async (event, self)
|
|
|
11762
11762
|
* Wrapper to call pingScheduled method with error capture.
|
|
11763
11763
|
*/
|
|
11764
11764
|
const CALL_PING_SCHEDULED_FN = functoolsKit.trycatch(async (event, self) => {
|
|
11765
|
-
if (self._target.pingScheduled) {
|
|
11766
|
-
return
|
|
11765
|
+
if (!self._target.pingScheduled) {
|
|
11766
|
+
return;
|
|
11767
|
+
}
|
|
11768
|
+
if (await functoolsKit.not(bt.strategyCoreService.hasScheduledSignal(event.backtest, event.symbol, {
|
|
11769
|
+
strategyName: event.data.strategyName,
|
|
11770
|
+
exchangeName: event.data.exchangeName,
|
|
11771
|
+
frameName: event.data.frameName,
|
|
11772
|
+
}))) {
|
|
11773
|
+
return;
|
|
11767
11774
|
}
|
|
11775
|
+
return await self._target.pingScheduled(event);
|
|
11768
11776
|
}, {
|
|
11769
11777
|
fallback: (error) => {
|
|
11770
11778
|
const message = "ActionProxy.pingScheduled thrown";
|
|
@@ -11782,9 +11790,17 @@ const CALL_PING_SCHEDULED_FN = functoolsKit.trycatch(async (event, self) => {
|
|
|
11782
11790
|
* Wrapper to call pingActive method with error capture.
|
|
11783
11791
|
*/
|
|
11784
11792
|
const CALL_PING_ACTIVE_FN = functoolsKit.trycatch(async (event, self) => {
|
|
11785
|
-
if (self._target.pingActive) {
|
|
11786
|
-
return
|
|
11793
|
+
if (!self._target.pingActive) {
|
|
11794
|
+
return;
|
|
11795
|
+
}
|
|
11796
|
+
if (await functoolsKit.not(bt.strategyCoreService.hasPendingSignal(event.backtest, event.symbol, {
|
|
11797
|
+
strategyName: event.data.strategyName,
|
|
11798
|
+
exchangeName: event.data.exchangeName,
|
|
11799
|
+
frameName: event.data.frameName,
|
|
11800
|
+
}))) {
|
|
11801
|
+
return;
|
|
11787
11802
|
}
|
|
11803
|
+
return await self._target.pingActive(event);
|
|
11788
11804
|
}, {
|
|
11789
11805
|
fallback: (error) => {
|
|
11790
11806
|
const message = "ActionProxy.pingActive thrown";
|
|
@@ -35079,7 +35095,14 @@ function listenSignal(fn) {
|
|
|
35079
35095
|
*/
|
|
35080
35096
|
function listenSignalOnce(filterFn, fn) {
|
|
35081
35097
|
bt.loggerService.log(LISTEN_SIGNAL_ONCE_METHOD_NAME);
|
|
35082
|
-
|
|
35098
|
+
let disposeFn;
|
|
35099
|
+
const wrappedFn = async (event) => {
|
|
35100
|
+
if (filterFn(event)) {
|
|
35101
|
+
await fn(event);
|
|
35102
|
+
disposeFn && disposeFn();
|
|
35103
|
+
}
|
|
35104
|
+
};
|
|
35105
|
+
return disposeFn = listenSignal(wrappedFn);
|
|
35083
35106
|
}
|
|
35084
35107
|
/**
|
|
35085
35108
|
* Subscribes to live trading signal events with queued async processing.
|
|
@@ -35128,7 +35151,14 @@ function listenSignalLive(fn) {
|
|
|
35128
35151
|
*/
|
|
35129
35152
|
function listenSignalLiveOnce(filterFn, fn) {
|
|
35130
35153
|
bt.loggerService.log(LISTEN_SIGNAL_LIVE_ONCE_METHOD_NAME);
|
|
35131
|
-
|
|
35154
|
+
let disposeFn;
|
|
35155
|
+
const wrappedFn = async (event) => {
|
|
35156
|
+
if (filterFn(event)) {
|
|
35157
|
+
await fn(event);
|
|
35158
|
+
disposeFn && disposeFn();
|
|
35159
|
+
}
|
|
35160
|
+
};
|
|
35161
|
+
return disposeFn = listenSignalLive(wrappedFn);
|
|
35132
35162
|
}
|
|
35133
35163
|
/**
|
|
35134
35164
|
* Subscribes to backtest signal events with queued async processing.
|
|
@@ -35177,7 +35207,14 @@ function listenSignalBacktest(fn) {
|
|
|
35177
35207
|
*/
|
|
35178
35208
|
function listenSignalBacktestOnce(filterFn, fn) {
|
|
35179
35209
|
bt.loggerService.log(LISTEN_SIGNAL_BACKTEST_ONCE_METHOD_NAME);
|
|
35180
|
-
|
|
35210
|
+
let disposeFn;
|
|
35211
|
+
const wrappedFn = async (event) => {
|
|
35212
|
+
if (filterFn(event)) {
|
|
35213
|
+
await fn(event);
|
|
35214
|
+
disposeFn && disposeFn();
|
|
35215
|
+
}
|
|
35216
|
+
};
|
|
35217
|
+
return disposeFn = listenSignalBacktest(wrappedFn);
|
|
35181
35218
|
}
|
|
35182
35219
|
/**
|
|
35183
35220
|
* Subscribes to recoverable execution errors with queued async processing.
|
|
@@ -35294,7 +35331,14 @@ function listenDoneLive(fn) {
|
|
|
35294
35331
|
*/
|
|
35295
35332
|
function listenDoneLiveOnce(filterFn, fn) {
|
|
35296
35333
|
bt.loggerService.log(LISTEN_DONE_LIVE_ONCE_METHOD_NAME);
|
|
35297
|
-
|
|
35334
|
+
let disposeFn;
|
|
35335
|
+
const wrappedFn = async (event) => {
|
|
35336
|
+
if (filterFn(event)) {
|
|
35337
|
+
await fn(event);
|
|
35338
|
+
disposeFn && disposeFn();
|
|
35339
|
+
}
|
|
35340
|
+
};
|
|
35341
|
+
return disposeFn = listenDoneLive(wrappedFn);
|
|
35298
35342
|
}
|
|
35299
35343
|
/**
|
|
35300
35344
|
* Subscribes to backtest background execution completion events with queued async processing.
|
|
@@ -35357,7 +35401,14 @@ function listenDoneBacktest(fn) {
|
|
|
35357
35401
|
*/
|
|
35358
35402
|
function listenDoneBacktestOnce(filterFn, fn) {
|
|
35359
35403
|
bt.loggerService.log(LISTEN_DONE_BACKTEST_ONCE_METHOD_NAME);
|
|
35360
|
-
|
|
35404
|
+
let disposeFn;
|
|
35405
|
+
const wrappedFn = async (event) => {
|
|
35406
|
+
if (filterFn(event)) {
|
|
35407
|
+
await fn(event);
|
|
35408
|
+
disposeFn && disposeFn();
|
|
35409
|
+
}
|
|
35410
|
+
};
|
|
35411
|
+
return disposeFn = listenDoneBacktest(wrappedFn);
|
|
35361
35412
|
}
|
|
35362
35413
|
/**
|
|
35363
35414
|
* Subscribes to walker background execution completion events with queued async processing.
|
|
@@ -35416,7 +35467,14 @@ function listenDoneWalker(fn) {
|
|
|
35416
35467
|
*/
|
|
35417
35468
|
function listenDoneWalkerOnce(filterFn, fn) {
|
|
35418
35469
|
bt.loggerService.log(LISTEN_DONE_WALKER_ONCE_METHOD_NAME);
|
|
35419
|
-
|
|
35470
|
+
let disposeFn;
|
|
35471
|
+
const wrappedFn = async (event) => {
|
|
35472
|
+
if (filterFn(event)) {
|
|
35473
|
+
await fn(event);
|
|
35474
|
+
disposeFn && disposeFn();
|
|
35475
|
+
}
|
|
35476
|
+
};
|
|
35477
|
+
return disposeFn = listenDoneWalker(wrappedFn);
|
|
35420
35478
|
}
|
|
35421
35479
|
/**
|
|
35422
35480
|
* Subscribes to backtest progress events with queued async processing.
|
|
@@ -35597,7 +35655,14 @@ function listenWalker(fn) {
|
|
|
35597
35655
|
*/
|
|
35598
35656
|
function listenWalkerOnce(filterFn, fn) {
|
|
35599
35657
|
bt.loggerService.log(LISTEN_WALKER_ONCE_METHOD_NAME);
|
|
35600
|
-
|
|
35658
|
+
let disposeFn;
|
|
35659
|
+
const wrappedFn = async (event) => {
|
|
35660
|
+
if (filterFn(event)) {
|
|
35661
|
+
await fn(event);
|
|
35662
|
+
disposeFn && disposeFn();
|
|
35663
|
+
}
|
|
35664
|
+
};
|
|
35665
|
+
return disposeFn = listenWalker(wrappedFn);
|
|
35601
35666
|
}
|
|
35602
35667
|
/**
|
|
35603
35668
|
* Subscribes to walker completion events with queued async processing.
|
|
@@ -35722,7 +35787,14 @@ function listenPartialProfitAvailable(fn) {
|
|
|
35722
35787
|
*/
|
|
35723
35788
|
function listenPartialProfitAvailableOnce(filterFn, fn) {
|
|
35724
35789
|
bt.loggerService.log(LISTEN_PARTIAL_PROFIT_ONCE_METHOD_NAME);
|
|
35725
|
-
|
|
35790
|
+
let disposeFn;
|
|
35791
|
+
const wrappedFn = async (event) => {
|
|
35792
|
+
if (filterFn(event)) {
|
|
35793
|
+
await fn(event);
|
|
35794
|
+
disposeFn && disposeFn();
|
|
35795
|
+
}
|
|
35796
|
+
};
|
|
35797
|
+
return disposeFn = listenPartialProfitAvailable(wrappedFn);
|
|
35726
35798
|
}
|
|
35727
35799
|
/**
|
|
35728
35800
|
* Subscribes to partial loss level events with queued async processing.
|
|
@@ -35784,7 +35856,14 @@ function listenPartialLossAvailable(fn) {
|
|
|
35784
35856
|
*/
|
|
35785
35857
|
function listenPartialLossAvailableOnce(filterFn, fn) {
|
|
35786
35858
|
bt.loggerService.log(LISTEN_PARTIAL_LOSS_ONCE_METHOD_NAME);
|
|
35787
|
-
|
|
35859
|
+
let disposeFn;
|
|
35860
|
+
const wrappedFn = async (event) => {
|
|
35861
|
+
if (filterFn(event)) {
|
|
35862
|
+
await fn(event);
|
|
35863
|
+
disposeFn && disposeFn();
|
|
35864
|
+
}
|
|
35865
|
+
};
|
|
35866
|
+
return disposeFn = listenPartialLossAvailable(wrappedFn);
|
|
35788
35867
|
}
|
|
35789
35868
|
/**
|
|
35790
35869
|
* Subscribes to breakeven protection events with queued async processing.
|
|
@@ -35848,7 +35927,14 @@ function listenBreakevenAvailable(fn) {
|
|
|
35848
35927
|
*/
|
|
35849
35928
|
function listenBreakevenAvailableOnce(filterFn, fn) {
|
|
35850
35929
|
bt.loggerService.log(LISTEN_BREAKEVEN_ONCE_METHOD_NAME);
|
|
35851
|
-
|
|
35930
|
+
let disposeFn;
|
|
35931
|
+
const wrappedFn = async (event) => {
|
|
35932
|
+
if (filterFn(event)) {
|
|
35933
|
+
await fn(event);
|
|
35934
|
+
disposeFn && disposeFn();
|
|
35935
|
+
}
|
|
35936
|
+
};
|
|
35937
|
+
return disposeFn = listenBreakevenAvailable(wrappedFn);
|
|
35852
35938
|
}
|
|
35853
35939
|
/**
|
|
35854
35940
|
* Subscribes to risk rejection events with queued async processing.
|
|
@@ -35917,7 +36003,14 @@ function listenRisk(fn) {
|
|
|
35917
36003
|
*/
|
|
35918
36004
|
function listenRiskOnce(filterFn, fn) {
|
|
35919
36005
|
bt.loggerService.log(LISTEN_RISK_ONCE_METHOD_NAME);
|
|
35920
|
-
|
|
36006
|
+
let disposeFn;
|
|
36007
|
+
const wrappedFn = async (event) => {
|
|
36008
|
+
if (filterFn(event)) {
|
|
36009
|
+
await fn(event);
|
|
36010
|
+
disposeFn && disposeFn();
|
|
36011
|
+
}
|
|
36012
|
+
};
|
|
36013
|
+
return disposeFn = listenRisk(wrappedFn);
|
|
35921
36014
|
}
|
|
35922
36015
|
/**
|
|
35923
36016
|
* Subscribes to ping events during scheduled signal monitoring with queued async processing.
|
|
@@ -35944,7 +36037,16 @@ function listenRiskOnce(filterFn, fn) {
|
|
|
35944
36037
|
*/
|
|
35945
36038
|
function listenSchedulePing(fn) {
|
|
35946
36039
|
bt.loggerService.log(LISTEN_SCHEDULE_PING_METHOD_NAME);
|
|
35947
|
-
|
|
36040
|
+
const wrappedFn = async (event) => {
|
|
36041
|
+
if (await bt.strategyCoreService.hasScheduledSignal(event.backtest, event.symbol, {
|
|
36042
|
+
strategyName: event.data.strategyName,
|
|
36043
|
+
exchangeName: event.data.exchangeName,
|
|
36044
|
+
frameName: event.data.frameName,
|
|
36045
|
+
})) {
|
|
36046
|
+
await fn(event);
|
|
36047
|
+
}
|
|
36048
|
+
};
|
|
36049
|
+
return schedulePingSubject.subscribe(functoolsKit.queued(wrappedFn));
|
|
35948
36050
|
}
|
|
35949
36051
|
/**
|
|
35950
36052
|
* Subscribes to filtered ping events with one-time execution.
|
|
@@ -35978,7 +36080,14 @@ function listenSchedulePing(fn) {
|
|
|
35978
36080
|
*/
|
|
35979
36081
|
function listenSchedulePingOnce(filterFn, fn) {
|
|
35980
36082
|
bt.loggerService.log(LISTEN_SCHEDULE_PING_ONCE_METHOD_NAME);
|
|
35981
|
-
|
|
36083
|
+
let disposeFn;
|
|
36084
|
+
const wrappedFn = async (event) => {
|
|
36085
|
+
if (filterFn(event)) {
|
|
36086
|
+
await fn(event);
|
|
36087
|
+
disposeFn && disposeFn();
|
|
36088
|
+
}
|
|
36089
|
+
};
|
|
36090
|
+
return disposeFn = listenSchedulePing(wrappedFn);
|
|
35982
36091
|
}
|
|
35983
36092
|
/**
|
|
35984
36093
|
* Subscribes to active ping events with queued async processing.
|
|
@@ -36009,7 +36118,16 @@ function listenSchedulePingOnce(filterFn, fn) {
|
|
|
36009
36118
|
*/
|
|
36010
36119
|
function listenActivePing(fn) {
|
|
36011
36120
|
bt.loggerService.log(LISTEN_ACTIVE_PING_METHOD_NAME);
|
|
36012
|
-
|
|
36121
|
+
const wrappedFn = async (event) => {
|
|
36122
|
+
if (await bt.strategyCoreService.hasPendingSignal(event.backtest, event.symbol, {
|
|
36123
|
+
strategyName: event.data.strategyName,
|
|
36124
|
+
exchangeName: event.data.exchangeName,
|
|
36125
|
+
frameName: event.data.frameName,
|
|
36126
|
+
})) {
|
|
36127
|
+
await fn(event);
|
|
36128
|
+
}
|
|
36129
|
+
};
|
|
36130
|
+
return activePingSubject.subscribe(functoolsKit.queued(wrappedFn));
|
|
36013
36131
|
}
|
|
36014
36132
|
/**
|
|
36015
36133
|
* Subscribes to filtered active ping events with one-time execution.
|
|
@@ -36043,7 +36161,14 @@ function listenActivePing(fn) {
|
|
|
36043
36161
|
*/
|
|
36044
36162
|
function listenActivePingOnce(filterFn, fn) {
|
|
36045
36163
|
bt.loggerService.log(LISTEN_ACTIVE_PING_ONCE_METHOD_NAME);
|
|
36046
|
-
|
|
36164
|
+
let disposeFn;
|
|
36165
|
+
const wrappedFn = async (event) => {
|
|
36166
|
+
if (filterFn(event)) {
|
|
36167
|
+
await fn(event);
|
|
36168
|
+
disposeFn && disposeFn();
|
|
36169
|
+
}
|
|
36170
|
+
};
|
|
36171
|
+
return disposeFn = listenActivePing(wrappedFn);
|
|
36047
36172
|
}
|
|
36048
36173
|
/**
|
|
36049
36174
|
* Subscribes to strategy management events with queued async processing.
|
|
@@ -36115,7 +36240,14 @@ function listenStrategyCommit(fn) {
|
|
|
36115
36240
|
*/
|
|
36116
36241
|
function listenStrategyCommitOnce(filterFn, fn) {
|
|
36117
36242
|
bt.loggerService.log(LISTEN_STRATEGY_COMMIT_ONCE_METHOD_NAME);
|
|
36118
|
-
|
|
36243
|
+
let disposeFn;
|
|
36244
|
+
const wrappedFn = async (event) => {
|
|
36245
|
+
if (filterFn(event)) {
|
|
36246
|
+
await fn(event);
|
|
36247
|
+
disposeFn && disposeFn();
|
|
36248
|
+
}
|
|
36249
|
+
};
|
|
36250
|
+
return disposeFn = listenStrategyCommit(wrappedFn);
|
|
36119
36251
|
}
|
|
36120
36252
|
/**
|
|
36121
36253
|
* Subscribes to signal synchronization events with queued async processing.
|
|
@@ -36150,11 +36282,18 @@ function listenSyncOnce(filterFn, fn) {
|
|
|
36150
36282
|
{
|
|
36151
36283
|
console.error("listenSyncOnce is unwanted cause exchange integration should be implemented in Broker.useBrokerAdapter as an infrastructure domain layer");
|
|
36152
36284
|
console.error("If you need to implement custom logic on signal open/close, please use signal(), signalBacktest(), signalLive() in addActionSchema handler");
|
|
36153
|
-
console.error("If listenSyncOnce throws the exchange
|
|
36285
|
+
console.error("If listenSyncOnce throws the exchange will not execute the order!");
|
|
36154
36286
|
console.error("");
|
|
36155
36287
|
console.error("You have been warned!");
|
|
36156
36288
|
}
|
|
36157
|
-
|
|
36289
|
+
let disposeFn;
|
|
36290
|
+
const wrappedFn = async (event) => {
|
|
36291
|
+
if (filterFn(event)) {
|
|
36292
|
+
await fn(event);
|
|
36293
|
+
disposeFn && disposeFn();
|
|
36294
|
+
}
|
|
36295
|
+
};
|
|
36296
|
+
return disposeFn = listenSync(wrappedFn);
|
|
36158
36297
|
}
|
|
36159
36298
|
/**
|
|
36160
36299
|
* Subscribes to highest profit events with queued async processing.
|
|
@@ -36181,7 +36320,14 @@ function listenHighestProfit(fn) {
|
|
|
36181
36320
|
*/
|
|
36182
36321
|
function listenHighestProfitOnce(filterFn, fn) {
|
|
36183
36322
|
bt.loggerService.log(LISTEN_HIGHEST_PROFIT_ONCE_METHOD_NAME);
|
|
36184
|
-
|
|
36323
|
+
let disposeFn;
|
|
36324
|
+
const wrappedFn = async (event) => {
|
|
36325
|
+
if (filterFn(event)) {
|
|
36326
|
+
await fn(event);
|
|
36327
|
+
disposeFn && disposeFn();
|
|
36328
|
+
}
|
|
36329
|
+
};
|
|
36330
|
+
return disposeFn = listenHighestProfit(wrappedFn);
|
|
36185
36331
|
}
|
|
36186
36332
|
|
|
36187
36333
|
const BACKTEST_METHOD_NAME_RUN = "BacktestUtils.run";
|
package/build/index.mjs
CHANGED
|
@@ -11742,9 +11742,17 @@ const CALL_PARTIAL_LOSS_AVAILABLE_FN = trycatch(async (event, self) => {
|
|
|
11742
11742
|
* Wrapper to call pingScheduled method with error capture.
|
|
11743
11743
|
*/
|
|
11744
11744
|
const CALL_PING_SCHEDULED_FN = trycatch(async (event, self) => {
|
|
11745
|
-
if (self._target.pingScheduled) {
|
|
11746
|
-
return
|
|
11745
|
+
if (!self._target.pingScheduled) {
|
|
11746
|
+
return;
|
|
11747
|
+
}
|
|
11748
|
+
if (await not(bt.strategyCoreService.hasScheduledSignal(event.backtest, event.symbol, {
|
|
11749
|
+
strategyName: event.data.strategyName,
|
|
11750
|
+
exchangeName: event.data.exchangeName,
|
|
11751
|
+
frameName: event.data.frameName,
|
|
11752
|
+
}))) {
|
|
11753
|
+
return;
|
|
11747
11754
|
}
|
|
11755
|
+
return await self._target.pingScheduled(event);
|
|
11748
11756
|
}, {
|
|
11749
11757
|
fallback: (error) => {
|
|
11750
11758
|
const message = "ActionProxy.pingScheduled thrown";
|
|
@@ -11762,9 +11770,17 @@ const CALL_PING_SCHEDULED_FN = trycatch(async (event, self) => {
|
|
|
11762
11770
|
* Wrapper to call pingActive method with error capture.
|
|
11763
11771
|
*/
|
|
11764
11772
|
const CALL_PING_ACTIVE_FN = trycatch(async (event, self) => {
|
|
11765
|
-
if (self._target.pingActive) {
|
|
11766
|
-
return
|
|
11773
|
+
if (!self._target.pingActive) {
|
|
11774
|
+
return;
|
|
11775
|
+
}
|
|
11776
|
+
if (await not(bt.strategyCoreService.hasPendingSignal(event.backtest, event.symbol, {
|
|
11777
|
+
strategyName: event.data.strategyName,
|
|
11778
|
+
exchangeName: event.data.exchangeName,
|
|
11779
|
+
frameName: event.data.frameName,
|
|
11780
|
+
}))) {
|
|
11781
|
+
return;
|
|
11767
11782
|
}
|
|
11783
|
+
return await self._target.pingActive(event);
|
|
11768
11784
|
}, {
|
|
11769
11785
|
fallback: (error) => {
|
|
11770
11786
|
const message = "ActionProxy.pingActive thrown";
|
|
@@ -35059,7 +35075,14 @@ function listenSignal(fn) {
|
|
|
35059
35075
|
*/
|
|
35060
35076
|
function listenSignalOnce(filterFn, fn) {
|
|
35061
35077
|
bt.loggerService.log(LISTEN_SIGNAL_ONCE_METHOD_NAME);
|
|
35062
|
-
|
|
35078
|
+
let disposeFn;
|
|
35079
|
+
const wrappedFn = async (event) => {
|
|
35080
|
+
if (filterFn(event)) {
|
|
35081
|
+
await fn(event);
|
|
35082
|
+
disposeFn && disposeFn();
|
|
35083
|
+
}
|
|
35084
|
+
};
|
|
35085
|
+
return disposeFn = listenSignal(wrappedFn);
|
|
35063
35086
|
}
|
|
35064
35087
|
/**
|
|
35065
35088
|
* Subscribes to live trading signal events with queued async processing.
|
|
@@ -35108,7 +35131,14 @@ function listenSignalLive(fn) {
|
|
|
35108
35131
|
*/
|
|
35109
35132
|
function listenSignalLiveOnce(filterFn, fn) {
|
|
35110
35133
|
bt.loggerService.log(LISTEN_SIGNAL_LIVE_ONCE_METHOD_NAME);
|
|
35111
|
-
|
|
35134
|
+
let disposeFn;
|
|
35135
|
+
const wrappedFn = async (event) => {
|
|
35136
|
+
if (filterFn(event)) {
|
|
35137
|
+
await fn(event);
|
|
35138
|
+
disposeFn && disposeFn();
|
|
35139
|
+
}
|
|
35140
|
+
};
|
|
35141
|
+
return disposeFn = listenSignalLive(wrappedFn);
|
|
35112
35142
|
}
|
|
35113
35143
|
/**
|
|
35114
35144
|
* Subscribes to backtest signal events with queued async processing.
|
|
@@ -35157,7 +35187,14 @@ function listenSignalBacktest(fn) {
|
|
|
35157
35187
|
*/
|
|
35158
35188
|
function listenSignalBacktestOnce(filterFn, fn) {
|
|
35159
35189
|
bt.loggerService.log(LISTEN_SIGNAL_BACKTEST_ONCE_METHOD_NAME);
|
|
35160
|
-
|
|
35190
|
+
let disposeFn;
|
|
35191
|
+
const wrappedFn = async (event) => {
|
|
35192
|
+
if (filterFn(event)) {
|
|
35193
|
+
await fn(event);
|
|
35194
|
+
disposeFn && disposeFn();
|
|
35195
|
+
}
|
|
35196
|
+
};
|
|
35197
|
+
return disposeFn = listenSignalBacktest(wrappedFn);
|
|
35161
35198
|
}
|
|
35162
35199
|
/**
|
|
35163
35200
|
* Subscribes to recoverable execution errors with queued async processing.
|
|
@@ -35274,7 +35311,14 @@ function listenDoneLive(fn) {
|
|
|
35274
35311
|
*/
|
|
35275
35312
|
function listenDoneLiveOnce(filterFn, fn) {
|
|
35276
35313
|
bt.loggerService.log(LISTEN_DONE_LIVE_ONCE_METHOD_NAME);
|
|
35277
|
-
|
|
35314
|
+
let disposeFn;
|
|
35315
|
+
const wrappedFn = async (event) => {
|
|
35316
|
+
if (filterFn(event)) {
|
|
35317
|
+
await fn(event);
|
|
35318
|
+
disposeFn && disposeFn();
|
|
35319
|
+
}
|
|
35320
|
+
};
|
|
35321
|
+
return disposeFn = listenDoneLive(wrappedFn);
|
|
35278
35322
|
}
|
|
35279
35323
|
/**
|
|
35280
35324
|
* Subscribes to backtest background execution completion events with queued async processing.
|
|
@@ -35337,7 +35381,14 @@ function listenDoneBacktest(fn) {
|
|
|
35337
35381
|
*/
|
|
35338
35382
|
function listenDoneBacktestOnce(filterFn, fn) {
|
|
35339
35383
|
bt.loggerService.log(LISTEN_DONE_BACKTEST_ONCE_METHOD_NAME);
|
|
35340
|
-
|
|
35384
|
+
let disposeFn;
|
|
35385
|
+
const wrappedFn = async (event) => {
|
|
35386
|
+
if (filterFn(event)) {
|
|
35387
|
+
await fn(event);
|
|
35388
|
+
disposeFn && disposeFn();
|
|
35389
|
+
}
|
|
35390
|
+
};
|
|
35391
|
+
return disposeFn = listenDoneBacktest(wrappedFn);
|
|
35341
35392
|
}
|
|
35342
35393
|
/**
|
|
35343
35394
|
* Subscribes to walker background execution completion events with queued async processing.
|
|
@@ -35396,7 +35447,14 @@ function listenDoneWalker(fn) {
|
|
|
35396
35447
|
*/
|
|
35397
35448
|
function listenDoneWalkerOnce(filterFn, fn) {
|
|
35398
35449
|
bt.loggerService.log(LISTEN_DONE_WALKER_ONCE_METHOD_NAME);
|
|
35399
|
-
|
|
35450
|
+
let disposeFn;
|
|
35451
|
+
const wrappedFn = async (event) => {
|
|
35452
|
+
if (filterFn(event)) {
|
|
35453
|
+
await fn(event);
|
|
35454
|
+
disposeFn && disposeFn();
|
|
35455
|
+
}
|
|
35456
|
+
};
|
|
35457
|
+
return disposeFn = listenDoneWalker(wrappedFn);
|
|
35400
35458
|
}
|
|
35401
35459
|
/**
|
|
35402
35460
|
* Subscribes to backtest progress events with queued async processing.
|
|
@@ -35577,7 +35635,14 @@ function listenWalker(fn) {
|
|
|
35577
35635
|
*/
|
|
35578
35636
|
function listenWalkerOnce(filterFn, fn) {
|
|
35579
35637
|
bt.loggerService.log(LISTEN_WALKER_ONCE_METHOD_NAME);
|
|
35580
|
-
|
|
35638
|
+
let disposeFn;
|
|
35639
|
+
const wrappedFn = async (event) => {
|
|
35640
|
+
if (filterFn(event)) {
|
|
35641
|
+
await fn(event);
|
|
35642
|
+
disposeFn && disposeFn();
|
|
35643
|
+
}
|
|
35644
|
+
};
|
|
35645
|
+
return disposeFn = listenWalker(wrappedFn);
|
|
35581
35646
|
}
|
|
35582
35647
|
/**
|
|
35583
35648
|
* Subscribes to walker completion events with queued async processing.
|
|
@@ -35702,7 +35767,14 @@ function listenPartialProfitAvailable(fn) {
|
|
|
35702
35767
|
*/
|
|
35703
35768
|
function listenPartialProfitAvailableOnce(filterFn, fn) {
|
|
35704
35769
|
bt.loggerService.log(LISTEN_PARTIAL_PROFIT_ONCE_METHOD_NAME);
|
|
35705
|
-
|
|
35770
|
+
let disposeFn;
|
|
35771
|
+
const wrappedFn = async (event) => {
|
|
35772
|
+
if (filterFn(event)) {
|
|
35773
|
+
await fn(event);
|
|
35774
|
+
disposeFn && disposeFn();
|
|
35775
|
+
}
|
|
35776
|
+
};
|
|
35777
|
+
return disposeFn = listenPartialProfitAvailable(wrappedFn);
|
|
35706
35778
|
}
|
|
35707
35779
|
/**
|
|
35708
35780
|
* Subscribes to partial loss level events with queued async processing.
|
|
@@ -35764,7 +35836,14 @@ function listenPartialLossAvailable(fn) {
|
|
|
35764
35836
|
*/
|
|
35765
35837
|
function listenPartialLossAvailableOnce(filterFn, fn) {
|
|
35766
35838
|
bt.loggerService.log(LISTEN_PARTIAL_LOSS_ONCE_METHOD_NAME);
|
|
35767
|
-
|
|
35839
|
+
let disposeFn;
|
|
35840
|
+
const wrappedFn = async (event) => {
|
|
35841
|
+
if (filterFn(event)) {
|
|
35842
|
+
await fn(event);
|
|
35843
|
+
disposeFn && disposeFn();
|
|
35844
|
+
}
|
|
35845
|
+
};
|
|
35846
|
+
return disposeFn = listenPartialLossAvailable(wrappedFn);
|
|
35768
35847
|
}
|
|
35769
35848
|
/**
|
|
35770
35849
|
* Subscribes to breakeven protection events with queued async processing.
|
|
@@ -35828,7 +35907,14 @@ function listenBreakevenAvailable(fn) {
|
|
|
35828
35907
|
*/
|
|
35829
35908
|
function listenBreakevenAvailableOnce(filterFn, fn) {
|
|
35830
35909
|
bt.loggerService.log(LISTEN_BREAKEVEN_ONCE_METHOD_NAME);
|
|
35831
|
-
|
|
35910
|
+
let disposeFn;
|
|
35911
|
+
const wrappedFn = async (event) => {
|
|
35912
|
+
if (filterFn(event)) {
|
|
35913
|
+
await fn(event);
|
|
35914
|
+
disposeFn && disposeFn();
|
|
35915
|
+
}
|
|
35916
|
+
};
|
|
35917
|
+
return disposeFn = listenBreakevenAvailable(wrappedFn);
|
|
35832
35918
|
}
|
|
35833
35919
|
/**
|
|
35834
35920
|
* Subscribes to risk rejection events with queued async processing.
|
|
@@ -35897,7 +35983,14 @@ function listenRisk(fn) {
|
|
|
35897
35983
|
*/
|
|
35898
35984
|
function listenRiskOnce(filterFn, fn) {
|
|
35899
35985
|
bt.loggerService.log(LISTEN_RISK_ONCE_METHOD_NAME);
|
|
35900
|
-
|
|
35986
|
+
let disposeFn;
|
|
35987
|
+
const wrappedFn = async (event) => {
|
|
35988
|
+
if (filterFn(event)) {
|
|
35989
|
+
await fn(event);
|
|
35990
|
+
disposeFn && disposeFn();
|
|
35991
|
+
}
|
|
35992
|
+
};
|
|
35993
|
+
return disposeFn = listenRisk(wrappedFn);
|
|
35901
35994
|
}
|
|
35902
35995
|
/**
|
|
35903
35996
|
* Subscribes to ping events during scheduled signal monitoring with queued async processing.
|
|
@@ -35924,7 +36017,16 @@ function listenRiskOnce(filterFn, fn) {
|
|
|
35924
36017
|
*/
|
|
35925
36018
|
function listenSchedulePing(fn) {
|
|
35926
36019
|
bt.loggerService.log(LISTEN_SCHEDULE_PING_METHOD_NAME);
|
|
35927
|
-
|
|
36020
|
+
const wrappedFn = async (event) => {
|
|
36021
|
+
if (await bt.strategyCoreService.hasScheduledSignal(event.backtest, event.symbol, {
|
|
36022
|
+
strategyName: event.data.strategyName,
|
|
36023
|
+
exchangeName: event.data.exchangeName,
|
|
36024
|
+
frameName: event.data.frameName,
|
|
36025
|
+
})) {
|
|
36026
|
+
await fn(event);
|
|
36027
|
+
}
|
|
36028
|
+
};
|
|
36029
|
+
return schedulePingSubject.subscribe(queued(wrappedFn));
|
|
35928
36030
|
}
|
|
35929
36031
|
/**
|
|
35930
36032
|
* Subscribes to filtered ping events with one-time execution.
|
|
@@ -35958,7 +36060,14 @@ function listenSchedulePing(fn) {
|
|
|
35958
36060
|
*/
|
|
35959
36061
|
function listenSchedulePingOnce(filterFn, fn) {
|
|
35960
36062
|
bt.loggerService.log(LISTEN_SCHEDULE_PING_ONCE_METHOD_NAME);
|
|
35961
|
-
|
|
36063
|
+
let disposeFn;
|
|
36064
|
+
const wrappedFn = async (event) => {
|
|
36065
|
+
if (filterFn(event)) {
|
|
36066
|
+
await fn(event);
|
|
36067
|
+
disposeFn && disposeFn();
|
|
36068
|
+
}
|
|
36069
|
+
};
|
|
36070
|
+
return disposeFn = listenSchedulePing(wrappedFn);
|
|
35962
36071
|
}
|
|
35963
36072
|
/**
|
|
35964
36073
|
* Subscribes to active ping events with queued async processing.
|
|
@@ -35989,7 +36098,16 @@ function listenSchedulePingOnce(filterFn, fn) {
|
|
|
35989
36098
|
*/
|
|
35990
36099
|
function listenActivePing(fn) {
|
|
35991
36100
|
bt.loggerService.log(LISTEN_ACTIVE_PING_METHOD_NAME);
|
|
35992
|
-
|
|
36101
|
+
const wrappedFn = async (event) => {
|
|
36102
|
+
if (await bt.strategyCoreService.hasPendingSignal(event.backtest, event.symbol, {
|
|
36103
|
+
strategyName: event.data.strategyName,
|
|
36104
|
+
exchangeName: event.data.exchangeName,
|
|
36105
|
+
frameName: event.data.frameName,
|
|
36106
|
+
})) {
|
|
36107
|
+
await fn(event);
|
|
36108
|
+
}
|
|
36109
|
+
};
|
|
36110
|
+
return activePingSubject.subscribe(queued(wrappedFn));
|
|
35993
36111
|
}
|
|
35994
36112
|
/**
|
|
35995
36113
|
* Subscribes to filtered active ping events with one-time execution.
|
|
@@ -36023,7 +36141,14 @@ function listenActivePing(fn) {
|
|
|
36023
36141
|
*/
|
|
36024
36142
|
function listenActivePingOnce(filterFn, fn) {
|
|
36025
36143
|
bt.loggerService.log(LISTEN_ACTIVE_PING_ONCE_METHOD_NAME);
|
|
36026
|
-
|
|
36144
|
+
let disposeFn;
|
|
36145
|
+
const wrappedFn = async (event) => {
|
|
36146
|
+
if (filterFn(event)) {
|
|
36147
|
+
await fn(event);
|
|
36148
|
+
disposeFn && disposeFn();
|
|
36149
|
+
}
|
|
36150
|
+
};
|
|
36151
|
+
return disposeFn = listenActivePing(wrappedFn);
|
|
36027
36152
|
}
|
|
36028
36153
|
/**
|
|
36029
36154
|
* Subscribes to strategy management events with queued async processing.
|
|
@@ -36095,7 +36220,14 @@ function listenStrategyCommit(fn) {
|
|
|
36095
36220
|
*/
|
|
36096
36221
|
function listenStrategyCommitOnce(filterFn, fn) {
|
|
36097
36222
|
bt.loggerService.log(LISTEN_STRATEGY_COMMIT_ONCE_METHOD_NAME);
|
|
36098
|
-
|
|
36223
|
+
let disposeFn;
|
|
36224
|
+
const wrappedFn = async (event) => {
|
|
36225
|
+
if (filterFn(event)) {
|
|
36226
|
+
await fn(event);
|
|
36227
|
+
disposeFn && disposeFn();
|
|
36228
|
+
}
|
|
36229
|
+
};
|
|
36230
|
+
return disposeFn = listenStrategyCommit(wrappedFn);
|
|
36099
36231
|
}
|
|
36100
36232
|
/**
|
|
36101
36233
|
* Subscribes to signal synchronization events with queued async processing.
|
|
@@ -36130,11 +36262,18 @@ function listenSyncOnce(filterFn, fn) {
|
|
|
36130
36262
|
{
|
|
36131
36263
|
console.error("listenSyncOnce is unwanted cause exchange integration should be implemented in Broker.useBrokerAdapter as an infrastructure domain layer");
|
|
36132
36264
|
console.error("If you need to implement custom logic on signal open/close, please use signal(), signalBacktest(), signalLive() in addActionSchema handler");
|
|
36133
|
-
console.error("If listenSyncOnce throws the exchange
|
|
36265
|
+
console.error("If listenSyncOnce throws the exchange will not execute the order!");
|
|
36134
36266
|
console.error("");
|
|
36135
36267
|
console.error("You have been warned!");
|
|
36136
36268
|
}
|
|
36137
|
-
|
|
36269
|
+
let disposeFn;
|
|
36270
|
+
const wrappedFn = async (event) => {
|
|
36271
|
+
if (filterFn(event)) {
|
|
36272
|
+
await fn(event);
|
|
36273
|
+
disposeFn && disposeFn();
|
|
36274
|
+
}
|
|
36275
|
+
};
|
|
36276
|
+
return disposeFn = listenSync(wrappedFn);
|
|
36138
36277
|
}
|
|
36139
36278
|
/**
|
|
36140
36279
|
* Subscribes to highest profit events with queued async processing.
|
|
@@ -36161,7 +36300,14 @@ function listenHighestProfit(fn) {
|
|
|
36161
36300
|
*/
|
|
36162
36301
|
function listenHighestProfitOnce(filterFn, fn) {
|
|
36163
36302
|
bt.loggerService.log(LISTEN_HIGHEST_PROFIT_ONCE_METHOD_NAME);
|
|
36164
|
-
|
|
36303
|
+
let disposeFn;
|
|
36304
|
+
const wrappedFn = async (event) => {
|
|
36305
|
+
if (filterFn(event)) {
|
|
36306
|
+
await fn(event);
|
|
36307
|
+
disposeFn && disposeFn();
|
|
36308
|
+
}
|
|
36309
|
+
};
|
|
36310
|
+
return disposeFn = listenHighestProfit(wrappedFn);
|
|
36165
36311
|
}
|
|
36166
36312
|
|
|
36167
36313
|
const BACKTEST_METHOD_NAME_RUN = "BacktestUtils.run";
|