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 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 await self._target.pingScheduled(event);
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 await self._target.pingActive(event);
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
- return signalEmitter.filter(filterFn).once(fn);
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
- return signalLiveEmitter.filter(filterFn).once(fn);
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
- return signalBacktestEmitter.filter(filterFn).once(fn);
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
- return doneLiveSubject.filter(filterFn).once(fn);
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
- return doneBacktestSubject.filter(filterFn).once(fn);
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
- return doneWalkerSubject.filter(filterFn).once(fn);
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
- return walkerEmitter.filter(filterFn).once(fn);
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
- return partialProfitSubject.filter(filterFn).once(fn);
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
- return partialLossSubject.filter(filterFn).once(fn);
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
- return breakevenSubject.filter(filterFn).once(fn);
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
- return riskSubject.filter(filterFn).once(fn);
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
- return schedulePingSubject.subscribe(functoolsKit.queued(async (event) => fn(event)));
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
- return schedulePingSubject.filter(filterFn).once(fn);
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
- return activePingSubject.subscribe(functoolsKit.queued(async (event) => fn(event)));
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
- return activePingSubject.filter(filterFn).once(fn);
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
- return strategyCommitSubject.filter(filterFn).once(fn);
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 WILL EXECUTE the order!");
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
- return syncSubject.filter(filterFn).once(fn);
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
- return highestProfitSubject.filter(filterFn).once(fn);
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 await self._target.pingScheduled(event);
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 await self._target.pingActive(event);
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
- return signalEmitter.filter(filterFn).once(fn);
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
- return signalLiveEmitter.filter(filterFn).once(fn);
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
- return signalBacktestEmitter.filter(filterFn).once(fn);
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
- return doneLiveSubject.filter(filterFn).once(fn);
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
- return doneBacktestSubject.filter(filterFn).once(fn);
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
- return doneWalkerSubject.filter(filterFn).once(fn);
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
- return walkerEmitter.filter(filterFn).once(fn);
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
- return partialProfitSubject.filter(filterFn).once(fn);
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
- return partialLossSubject.filter(filterFn).once(fn);
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
- return breakevenSubject.filter(filterFn).once(fn);
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
- return riskSubject.filter(filterFn).once(fn);
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
- return schedulePingSubject.subscribe(queued(async (event) => fn(event)));
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
- return schedulePingSubject.filter(filterFn).once(fn);
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
- return activePingSubject.subscribe(queued(async (event) => fn(event)));
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
- return activePingSubject.filter(filterFn).once(fn);
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
- return strategyCommitSubject.filter(filterFn).once(fn);
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 WILL EXECUTE the order!");
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
- return syncSubject.filter(filterFn).once(fn);
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
- return highestProfitSubject.filter(filterFn).once(fn);
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";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "backtest-kit",
3
- "version": "5.6.5",
3
+ "version": "5.6.7",
4
4
  "description": "A TypeScript library for trading system backtest",
5
5
  "author": {
6
6
  "name": "Petr Tripolsky",