backtest-kit 5.6.7 → 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
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;
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;
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;
11747
11770
  }
11771
+ return await self._target.partialLossAvailable(event);
11748
11772
  }, {
11749
11773
  fallback: (error) => {
11750
11774
  const message = "ActionProxy.partialLossAvailable thrown";
@@ -35753,7 +35777,16 @@ function listenValidation(fn) {
35753
35777
  */
35754
35778
  function listenPartialProfitAvailable(fn) {
35755
35779
  bt.loggerService.log(LISTEN_PARTIAL_PROFIT_METHOD_NAME);
35756
- 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));
35757
35790
  }
35758
35791
  /**
35759
35792
  * Subscribes to filtered partial profit level events with one-time execution.
@@ -35822,7 +35855,16 @@ function listenPartialProfitAvailableOnce(filterFn, fn) {
35822
35855
  */
35823
35856
  function listenPartialLossAvailable(fn) {
35824
35857
  bt.loggerService.log(LISTEN_PARTIAL_LOSS_METHOD_NAME);
35825
- 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));
35826
35868
  }
35827
35869
  /**
35828
35870
  * Subscribes to filtered partial loss level events with one-time execution.
@@ -35893,7 +35935,16 @@ function listenPartialLossAvailableOnce(filterFn, fn) {
35893
35935
  */
35894
35936
  function listenBreakevenAvailable(fn) {
35895
35937
  bt.loggerService.log(LISTEN_BREAKEVEN_METHOD_NAME);
35896
- 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));
35897
35948
  }
35898
35949
  /**
35899
35950
  * Subscribes to filtered breakeven protection events with one-time execution.
@@ -36206,7 +36257,24 @@ function listenActivePingOnce(filterFn, fn) {
36206
36257
  */
36207
36258
  function listenStrategyCommit(fn) {
36208
36259
  bt.loggerService.log(LISTEN_STRATEGY_COMMIT_METHOD_NAME);
36209
- 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));
36210
36278
  }
36211
36279
  /**
36212
36280
  * Subscribes to filtered strategy management events with one-time execution.
@@ -36307,7 +36375,16 @@ function listenSyncOnce(filterFn, fn) {
36307
36375
  */
36308
36376
  function listenHighestProfit(fn) {
36309
36377
  bt.loggerService.log(LISTEN_HIGHEST_PROFIT_METHOD_NAME);
36310
- 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));
36311
36388
  }
36312
36389
  /**
36313
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
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;
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;
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;
11727
11750
  }
11751
+ return await self._target.partialLossAvailable(event);
11728
11752
  }, {
11729
11753
  fallback: (error) => {
11730
11754
  const message = "ActionProxy.partialLossAvailable thrown";
@@ -35733,7 +35757,16 @@ function listenValidation(fn) {
35733
35757
  */
35734
35758
  function listenPartialProfitAvailable(fn) {
35735
35759
  bt.loggerService.log(LISTEN_PARTIAL_PROFIT_METHOD_NAME);
35736
- 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));
35737
35770
  }
35738
35771
  /**
35739
35772
  * Subscribes to filtered partial profit level events with one-time execution.
@@ -35802,7 +35835,16 @@ function listenPartialProfitAvailableOnce(filterFn, fn) {
35802
35835
  */
35803
35836
  function listenPartialLossAvailable(fn) {
35804
35837
  bt.loggerService.log(LISTEN_PARTIAL_LOSS_METHOD_NAME);
35805
- 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));
35806
35848
  }
35807
35849
  /**
35808
35850
  * Subscribes to filtered partial loss level events with one-time execution.
@@ -35873,7 +35915,16 @@ function listenPartialLossAvailableOnce(filterFn, fn) {
35873
35915
  */
35874
35916
  function listenBreakevenAvailable(fn) {
35875
35917
  bt.loggerService.log(LISTEN_BREAKEVEN_METHOD_NAME);
35876
- 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));
35877
35928
  }
35878
35929
  /**
35879
35930
  * Subscribes to filtered breakeven protection events with one-time execution.
@@ -36186,7 +36237,24 @@ function listenActivePingOnce(filterFn, fn) {
36186
36237
  */
36187
36238
  function listenStrategyCommit(fn) {
36188
36239
  bt.loggerService.log(LISTEN_STRATEGY_COMMIT_METHOD_NAME);
36189
- 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));
36190
36258
  }
36191
36259
  /**
36192
36260
  * Subscribes to filtered strategy management events with one-time execution.
@@ -36287,7 +36355,16 @@ function listenSyncOnce(filterFn, fn) {
36287
36355
  */
36288
36356
  function listenHighestProfit(fn) {
36289
36357
  bt.loggerService.log(LISTEN_HIGHEST_PROFIT_METHOD_NAME);
36290
- 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));
36291
36368
  }
36292
36369
  /**
36293
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.7",
3
+ "version": "5.6.8",
4
4
  "description": "A TypeScript library for trading system backtest",
5
5
  "author": {
6
6
  "name": "Petr Tripolsky",