backtest-kit 5.6.6 → 5.6.8

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
@@ -11702,9 +11702,17 @@ const CALL_SIGNAL_BACKTEST_FN = functoolsKit.trycatch(async (event, self) => {
11702
11702
  * Wrapper to call breakevenAvailable method with error capture.
11703
11703
  */
11704
11704
  const CALL_BREAKEVEN_AVAILABLE_FN = functoolsKit.trycatch(async (event, self) => {
11705
- if (self._target.breakevenAvailable) {
11706
- return await self._target.breakevenAvailable(event);
11705
+ if (!self._target.breakevenAvailable) {
11706
+ return;
11707
+ }
11708
+ if (await functoolsKit.not(bt.strategyCoreService.hasPendingSignal(event.backtest, event.symbol, {
11709
+ strategyName: event.strategyName,
11710
+ exchangeName: event.exchangeName,
11711
+ frameName: event.frameName,
11712
+ }))) {
11713
+ return;
11707
11714
  }
11715
+ return await self._target.breakevenAvailable(event);
11708
11716
  }, {
11709
11717
  fallback: (error) => {
11710
11718
  const message = "ActionProxy.breakevenAvailable thrown";
@@ -11722,9 +11730,17 @@ const CALL_BREAKEVEN_AVAILABLE_FN = functoolsKit.trycatch(async (event, self) =>
11722
11730
  * Wrapper to call partialProfitAvailable method with error capture.
11723
11731
  */
11724
11732
  const CALL_PARTIAL_PROFIT_AVAILABLE_FN = functoolsKit.trycatch(async (event, self) => {
11725
- if (self._target.partialProfitAvailable) {
11726
- return await self._target.partialProfitAvailable(event);
11733
+ if (!self._target.partialProfitAvailable) {
11734
+ return;
11727
11735
  }
11736
+ if (await functoolsKit.not(bt.strategyCoreService.hasPendingSignal(event.backtest, event.symbol, {
11737
+ strategyName: event.strategyName,
11738
+ exchangeName: event.exchangeName,
11739
+ frameName: event.frameName,
11740
+ }))) {
11741
+ return;
11742
+ }
11743
+ return await self._target.partialProfitAvailable(event);
11728
11744
  }, {
11729
11745
  fallback: (error) => {
11730
11746
  const message = "ActionProxy.partialProfitAvailable thrown";
@@ -11742,9 +11758,17 @@ const CALL_PARTIAL_PROFIT_AVAILABLE_FN = functoolsKit.trycatch(async (event, sel
11742
11758
  * Wrapper to call partialLossAvailable method with error capture.
11743
11759
  */
11744
11760
  const CALL_PARTIAL_LOSS_AVAILABLE_FN = functoolsKit.trycatch(async (event, self) => {
11745
- if (self._target.partialLossAvailable) {
11746
- return await self._target.partialLossAvailable(event);
11761
+ if (!self._target.partialLossAvailable) {
11762
+ return;
11747
11763
  }
11764
+ if (await functoolsKit.not(bt.strategyCoreService.hasPendingSignal(event.backtest, event.symbol, {
11765
+ strategyName: event.strategyName,
11766
+ exchangeName: event.exchangeName,
11767
+ frameName: event.frameName,
11768
+ }))) {
11769
+ return;
11770
+ }
11771
+ return await self._target.partialLossAvailable(event);
11748
11772
  }, {
11749
11773
  fallback: (error) => {
11750
11774
  const message = "ActionProxy.partialLossAvailable thrown";
@@ -11762,9 +11786,17 @@ const CALL_PARTIAL_LOSS_AVAILABLE_FN = functoolsKit.trycatch(async (event, self)
11762
11786
  * Wrapper to call pingScheduled method with error capture.
11763
11787
  */
11764
11788
  const CALL_PING_SCHEDULED_FN = functoolsKit.trycatch(async (event, self) => {
11765
- if (self._target.pingScheduled) {
11766
- return await self._target.pingScheduled(event);
11789
+ if (!self._target.pingScheduled) {
11790
+ return;
11767
11791
  }
11792
+ if (await functoolsKit.not(bt.strategyCoreService.hasScheduledSignal(event.backtest, event.symbol, {
11793
+ strategyName: event.data.strategyName,
11794
+ exchangeName: event.data.exchangeName,
11795
+ frameName: event.data.frameName,
11796
+ }))) {
11797
+ return;
11798
+ }
11799
+ return await self._target.pingScheduled(event);
11768
11800
  }, {
11769
11801
  fallback: (error) => {
11770
11802
  const message = "ActionProxy.pingScheduled thrown";
@@ -11782,9 +11814,17 @@ const CALL_PING_SCHEDULED_FN = functoolsKit.trycatch(async (event, self) => {
11782
11814
  * Wrapper to call pingActive method with error capture.
11783
11815
  */
11784
11816
  const CALL_PING_ACTIVE_FN = functoolsKit.trycatch(async (event, self) => {
11785
- if (self._target.pingActive) {
11786
- return await self._target.pingActive(event);
11817
+ if (!self._target.pingActive) {
11818
+ return;
11787
11819
  }
11820
+ if (await functoolsKit.not(bt.strategyCoreService.hasPendingSignal(event.backtest, event.symbol, {
11821
+ strategyName: event.data.strategyName,
11822
+ exchangeName: event.data.exchangeName,
11823
+ frameName: event.data.frameName,
11824
+ }))) {
11825
+ return;
11826
+ }
11827
+ return await self._target.pingActive(event);
11788
11828
  }, {
11789
11829
  fallback: (error) => {
11790
11830
  const message = "ActionProxy.pingActive thrown";
@@ -35737,7 +35777,16 @@ function listenValidation(fn) {
35737
35777
  */
35738
35778
  function listenPartialProfitAvailable(fn) {
35739
35779
  bt.loggerService.log(LISTEN_PARTIAL_PROFIT_METHOD_NAME);
35740
- return partialProfitSubject.subscribe(functoolsKit.queued(async (event) => fn(event)));
35780
+ const wrappedFn = async (event) => {
35781
+ if (await bt.strategyCoreService.hasPendingSignal(event.backtest, event.symbol, {
35782
+ strategyName: event.strategyName,
35783
+ exchangeName: event.exchangeName,
35784
+ frameName: event.frameName,
35785
+ })) {
35786
+ await fn(event);
35787
+ }
35788
+ };
35789
+ return partialProfitSubject.subscribe(functoolsKit.queued(wrappedFn));
35741
35790
  }
35742
35791
  /**
35743
35792
  * Subscribes to filtered partial profit level events with one-time execution.
@@ -35806,7 +35855,16 @@ function listenPartialProfitAvailableOnce(filterFn, fn) {
35806
35855
  */
35807
35856
  function listenPartialLossAvailable(fn) {
35808
35857
  bt.loggerService.log(LISTEN_PARTIAL_LOSS_METHOD_NAME);
35809
- return partialLossSubject.subscribe(functoolsKit.queued(async (event) => fn(event)));
35858
+ const wrappedFn = async (event) => {
35859
+ if (await bt.strategyCoreService.hasPendingSignal(event.backtest, event.symbol, {
35860
+ strategyName: event.strategyName,
35861
+ exchangeName: event.exchangeName,
35862
+ frameName: event.frameName,
35863
+ })) {
35864
+ await fn(event);
35865
+ }
35866
+ };
35867
+ return partialLossSubject.subscribe(functoolsKit.queued(wrappedFn));
35810
35868
  }
35811
35869
  /**
35812
35870
  * Subscribes to filtered partial loss level events with one-time execution.
@@ -35877,7 +35935,16 @@ function listenPartialLossAvailableOnce(filterFn, fn) {
35877
35935
  */
35878
35936
  function listenBreakevenAvailable(fn) {
35879
35937
  bt.loggerService.log(LISTEN_BREAKEVEN_METHOD_NAME);
35880
- return breakevenSubject.subscribe(functoolsKit.queued(async (event) => fn(event)));
35938
+ const wrappedFn = async (event) => {
35939
+ if (await bt.strategyCoreService.hasPendingSignal(event.backtest, event.symbol, {
35940
+ strategyName: event.strategyName,
35941
+ exchangeName: event.exchangeName,
35942
+ frameName: event.frameName,
35943
+ })) {
35944
+ await fn(event);
35945
+ }
35946
+ };
35947
+ return breakevenSubject.subscribe(functoolsKit.queued(wrappedFn));
35881
35948
  }
35882
35949
  /**
35883
35950
  * Subscribes to filtered breakeven protection events with one-time execution.
@@ -36190,7 +36257,24 @@ function listenActivePingOnce(filterFn, fn) {
36190
36257
  */
36191
36258
  function listenStrategyCommit(fn) {
36192
36259
  bt.loggerService.log(LISTEN_STRATEGY_COMMIT_METHOD_NAME);
36193
- return strategyCommitSubject.subscribe(functoolsKit.queued(async (event) => fn(event)));
36260
+ const wrappedFn = async (event) => {
36261
+ if (event.action === "cancel-scheduled") {
36262
+ await fn(event);
36263
+ return;
36264
+ }
36265
+ if (event.action === "close-pending") {
36266
+ await fn(event);
36267
+ return;
36268
+ }
36269
+ if (await bt.strategyCoreService.hasPendingSignal(event.backtest, event.symbol, {
36270
+ strategyName: event.strategyName,
36271
+ exchangeName: event.exchangeName,
36272
+ frameName: event.frameName,
36273
+ })) {
36274
+ await fn(event);
36275
+ }
36276
+ };
36277
+ return strategyCommitSubject.subscribe(functoolsKit.queued(wrappedFn));
36194
36278
  }
36195
36279
  /**
36196
36280
  * Subscribes to filtered strategy management events with one-time execution.
@@ -36291,7 +36375,16 @@ function listenSyncOnce(filterFn, fn) {
36291
36375
  */
36292
36376
  function listenHighestProfit(fn) {
36293
36377
  bt.loggerService.log(LISTEN_HIGHEST_PROFIT_METHOD_NAME);
36294
- return highestProfitSubject.subscribe(functoolsKit.queued(async (event) => fn(event)));
36378
+ const wrappedFn = async (event) => {
36379
+ if (await bt.strategyCoreService.hasPendingSignal(event.backtest, event.symbol, {
36380
+ strategyName: event.strategyName,
36381
+ exchangeName: event.exchangeName,
36382
+ frameName: event.frameName,
36383
+ })) {
36384
+ await fn(event);
36385
+ }
36386
+ };
36387
+ return highestProfitSubject.subscribe(functoolsKit.queued(wrappedFn));
36295
36388
  }
36296
36389
  /**
36297
36390
  * Subscribes to filtered highest profit events with one-time execution.
package/build/index.mjs CHANGED
@@ -11682,9 +11682,17 @@ const CALL_SIGNAL_BACKTEST_FN = trycatch(async (event, self) => {
11682
11682
  * Wrapper to call breakevenAvailable method with error capture.
11683
11683
  */
11684
11684
  const CALL_BREAKEVEN_AVAILABLE_FN = trycatch(async (event, self) => {
11685
- if (self._target.breakevenAvailable) {
11686
- return await self._target.breakevenAvailable(event);
11685
+ if (!self._target.breakevenAvailable) {
11686
+ return;
11687
+ }
11688
+ if (await not(bt.strategyCoreService.hasPendingSignal(event.backtest, event.symbol, {
11689
+ strategyName: event.strategyName,
11690
+ exchangeName: event.exchangeName,
11691
+ frameName: event.frameName,
11692
+ }))) {
11693
+ return;
11687
11694
  }
11695
+ return await self._target.breakevenAvailable(event);
11688
11696
  }, {
11689
11697
  fallback: (error) => {
11690
11698
  const message = "ActionProxy.breakevenAvailable thrown";
@@ -11702,9 +11710,17 @@ const CALL_BREAKEVEN_AVAILABLE_FN = trycatch(async (event, self) => {
11702
11710
  * Wrapper to call partialProfitAvailable method with error capture.
11703
11711
  */
11704
11712
  const CALL_PARTIAL_PROFIT_AVAILABLE_FN = trycatch(async (event, self) => {
11705
- if (self._target.partialProfitAvailable) {
11706
- return await self._target.partialProfitAvailable(event);
11713
+ if (!self._target.partialProfitAvailable) {
11714
+ return;
11707
11715
  }
11716
+ if (await not(bt.strategyCoreService.hasPendingSignal(event.backtest, event.symbol, {
11717
+ strategyName: event.strategyName,
11718
+ exchangeName: event.exchangeName,
11719
+ frameName: event.frameName,
11720
+ }))) {
11721
+ return;
11722
+ }
11723
+ return await self._target.partialProfitAvailable(event);
11708
11724
  }, {
11709
11725
  fallback: (error) => {
11710
11726
  const message = "ActionProxy.partialProfitAvailable thrown";
@@ -11722,9 +11738,17 @@ const CALL_PARTIAL_PROFIT_AVAILABLE_FN = trycatch(async (event, self) => {
11722
11738
  * Wrapper to call partialLossAvailable method with error capture.
11723
11739
  */
11724
11740
  const CALL_PARTIAL_LOSS_AVAILABLE_FN = trycatch(async (event, self) => {
11725
- if (self._target.partialLossAvailable) {
11726
- return await self._target.partialLossAvailable(event);
11741
+ if (!self._target.partialLossAvailable) {
11742
+ return;
11727
11743
  }
11744
+ if (await not(bt.strategyCoreService.hasPendingSignal(event.backtest, event.symbol, {
11745
+ strategyName: event.strategyName,
11746
+ exchangeName: event.exchangeName,
11747
+ frameName: event.frameName,
11748
+ }))) {
11749
+ return;
11750
+ }
11751
+ return await self._target.partialLossAvailable(event);
11728
11752
  }, {
11729
11753
  fallback: (error) => {
11730
11754
  const message = "ActionProxy.partialLossAvailable thrown";
@@ -11742,9 +11766,17 @@ const CALL_PARTIAL_LOSS_AVAILABLE_FN = trycatch(async (event, self) => {
11742
11766
  * Wrapper to call pingScheduled method with error capture.
11743
11767
  */
11744
11768
  const CALL_PING_SCHEDULED_FN = trycatch(async (event, self) => {
11745
- if (self._target.pingScheduled) {
11746
- return await self._target.pingScheduled(event);
11769
+ if (!self._target.pingScheduled) {
11770
+ return;
11747
11771
  }
11772
+ if (await not(bt.strategyCoreService.hasScheduledSignal(event.backtest, event.symbol, {
11773
+ strategyName: event.data.strategyName,
11774
+ exchangeName: event.data.exchangeName,
11775
+ frameName: event.data.frameName,
11776
+ }))) {
11777
+ return;
11778
+ }
11779
+ return await self._target.pingScheduled(event);
11748
11780
  }, {
11749
11781
  fallback: (error) => {
11750
11782
  const message = "ActionProxy.pingScheduled thrown";
@@ -11762,9 +11794,17 @@ const CALL_PING_SCHEDULED_FN = trycatch(async (event, self) => {
11762
11794
  * Wrapper to call pingActive method with error capture.
11763
11795
  */
11764
11796
  const CALL_PING_ACTIVE_FN = trycatch(async (event, self) => {
11765
- if (self._target.pingActive) {
11766
- return await self._target.pingActive(event);
11797
+ if (!self._target.pingActive) {
11798
+ return;
11767
11799
  }
11800
+ if (await not(bt.strategyCoreService.hasPendingSignal(event.backtest, event.symbol, {
11801
+ strategyName: event.data.strategyName,
11802
+ exchangeName: event.data.exchangeName,
11803
+ frameName: event.data.frameName,
11804
+ }))) {
11805
+ return;
11806
+ }
11807
+ return await self._target.pingActive(event);
11768
11808
  }, {
11769
11809
  fallback: (error) => {
11770
11810
  const message = "ActionProxy.pingActive thrown";
@@ -35717,7 +35757,16 @@ function listenValidation(fn) {
35717
35757
  */
35718
35758
  function listenPartialProfitAvailable(fn) {
35719
35759
  bt.loggerService.log(LISTEN_PARTIAL_PROFIT_METHOD_NAME);
35720
- return partialProfitSubject.subscribe(queued(async (event) => fn(event)));
35760
+ const wrappedFn = async (event) => {
35761
+ if (await bt.strategyCoreService.hasPendingSignal(event.backtest, event.symbol, {
35762
+ strategyName: event.strategyName,
35763
+ exchangeName: event.exchangeName,
35764
+ frameName: event.frameName,
35765
+ })) {
35766
+ await fn(event);
35767
+ }
35768
+ };
35769
+ return partialProfitSubject.subscribe(queued(wrappedFn));
35721
35770
  }
35722
35771
  /**
35723
35772
  * Subscribes to filtered partial profit level events with one-time execution.
@@ -35786,7 +35835,16 @@ function listenPartialProfitAvailableOnce(filterFn, fn) {
35786
35835
  */
35787
35836
  function listenPartialLossAvailable(fn) {
35788
35837
  bt.loggerService.log(LISTEN_PARTIAL_LOSS_METHOD_NAME);
35789
- return partialLossSubject.subscribe(queued(async (event) => fn(event)));
35838
+ const wrappedFn = async (event) => {
35839
+ if (await bt.strategyCoreService.hasPendingSignal(event.backtest, event.symbol, {
35840
+ strategyName: event.strategyName,
35841
+ exchangeName: event.exchangeName,
35842
+ frameName: event.frameName,
35843
+ })) {
35844
+ await fn(event);
35845
+ }
35846
+ };
35847
+ return partialLossSubject.subscribe(queued(wrappedFn));
35790
35848
  }
35791
35849
  /**
35792
35850
  * Subscribes to filtered partial loss level events with one-time execution.
@@ -35857,7 +35915,16 @@ function listenPartialLossAvailableOnce(filterFn, fn) {
35857
35915
  */
35858
35916
  function listenBreakevenAvailable(fn) {
35859
35917
  bt.loggerService.log(LISTEN_BREAKEVEN_METHOD_NAME);
35860
- return breakevenSubject.subscribe(queued(async (event) => fn(event)));
35918
+ const wrappedFn = async (event) => {
35919
+ if (await bt.strategyCoreService.hasPendingSignal(event.backtest, event.symbol, {
35920
+ strategyName: event.strategyName,
35921
+ exchangeName: event.exchangeName,
35922
+ frameName: event.frameName,
35923
+ })) {
35924
+ await fn(event);
35925
+ }
35926
+ };
35927
+ return breakevenSubject.subscribe(queued(wrappedFn));
35861
35928
  }
35862
35929
  /**
35863
35930
  * Subscribes to filtered breakeven protection events with one-time execution.
@@ -36170,7 +36237,24 @@ function listenActivePingOnce(filterFn, fn) {
36170
36237
  */
36171
36238
  function listenStrategyCommit(fn) {
36172
36239
  bt.loggerService.log(LISTEN_STRATEGY_COMMIT_METHOD_NAME);
36173
- return strategyCommitSubject.subscribe(queued(async (event) => fn(event)));
36240
+ const wrappedFn = async (event) => {
36241
+ if (event.action === "cancel-scheduled") {
36242
+ await fn(event);
36243
+ return;
36244
+ }
36245
+ if (event.action === "close-pending") {
36246
+ await fn(event);
36247
+ return;
36248
+ }
36249
+ if (await bt.strategyCoreService.hasPendingSignal(event.backtest, event.symbol, {
36250
+ strategyName: event.strategyName,
36251
+ exchangeName: event.exchangeName,
36252
+ frameName: event.frameName,
36253
+ })) {
36254
+ await fn(event);
36255
+ }
36256
+ };
36257
+ return strategyCommitSubject.subscribe(queued(wrappedFn));
36174
36258
  }
36175
36259
  /**
36176
36260
  * Subscribes to filtered strategy management events with one-time execution.
@@ -36271,7 +36355,16 @@ function listenSyncOnce(filterFn, fn) {
36271
36355
  */
36272
36356
  function listenHighestProfit(fn) {
36273
36357
  bt.loggerService.log(LISTEN_HIGHEST_PROFIT_METHOD_NAME);
36274
- return highestProfitSubject.subscribe(queued(async (event) => fn(event)));
36358
+ const wrappedFn = async (event) => {
36359
+ if (await bt.strategyCoreService.hasPendingSignal(event.backtest, event.symbol, {
36360
+ strategyName: event.strategyName,
36361
+ exchangeName: event.exchangeName,
36362
+ frameName: event.frameName,
36363
+ })) {
36364
+ await fn(event);
36365
+ }
36366
+ };
36367
+ return highestProfitSubject.subscribe(queued(wrappedFn));
36275
36368
  }
36276
36369
  /**
36277
36370
  * Subscribes to filtered highest profit events with one-time execution.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "backtest-kit",
3
- "version": "5.6.6",
3
+ "version": "5.6.8",
4
4
  "description": "A TypeScript library for trading system backtest",
5
5
  "author": {
6
6
  "name": "Petr Tripolsky",