@tradejs/core 2.0.18 → 2.0.20

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.
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  createIndicators,
3
3
  getRequiredControllerSeedWindow
4
- } from "./chunk-NN7Z3GIK.mjs";
4
+ } from "./chunk-Q3OFPRVV.mjs";
5
5
  import "./chunk-AYC2QVKI.mjs";
6
6
  import "./chunk-M7QGVZ3J.mjs";
7
7
  import {
8
8
  uuid
9
- } from "./chunk-AJK4NS7Y.mjs";
9
+ } from "./chunk-U3GDILUZ.mjs";
10
10
  import {
11
11
  getTimestamp
12
- } from "./chunk-BOETNABM.mjs";
12
+ } from "./chunk-S4KHOAXM.mjs";
13
13
  import {
14
14
  FEE_PERCENT
15
15
  } from "./chunk-MKCQSB4H.mjs";
@@ -380,23 +380,46 @@ var getDirectionalTpSlPrices = ({
380
380
  };
381
381
 
382
382
  // src/utils/strategyHelpers/state.ts
383
- var createLastTradeController = ({
383
+ var resolveLastTradeControllerParams = ({
384
384
  env,
385
385
  enabled = env ? env === "BACKTEST" : true,
386
386
  cooldownMs = 864e5
387
+ }) => ({
388
+ enabled,
389
+ cooldownMs
390
+ });
391
+ var createStateBackedLastTradeController = ({
392
+ state,
393
+ enabled,
394
+ cooldownMs
387
395
  }) => {
388
- let lastTradeTimestamp = null;
396
+ const getLastTradeTimestamp = () => state.get().lastTradeTimestamp;
389
397
  return {
390
- isInCooldown: (timestamp) => Boolean(
391
- enabled && lastTradeTimestamp != null && timestamp <= lastTradeTimestamp + cooldownMs
392
- ),
398
+ isInCooldown: (timestamp) => {
399
+ const lastTradeTimestamp = getLastTradeTimestamp();
400
+ return Boolean(
401
+ enabled && lastTradeTimestamp != null && timestamp <= lastTradeTimestamp + cooldownMs
402
+ );
403
+ },
393
404
  markTrade: (timestamp) => {
394
405
  if (!enabled) return;
395
- lastTradeTimestamp = timestamp;
406
+ state.update((current) => {
407
+ current.lastTradeTimestamp = timestamp;
408
+ });
396
409
  },
397
- getLastTradeTimestamp: () => lastTradeTimestamp
410
+ getLastTradeTimestamp
398
411
  };
399
412
  };
413
+ var createLastTradeController = (params) => {
414
+ const state = { lastTradeTimestamp: null };
415
+ return createStateBackedLastTradeController({
416
+ ...resolveLastTradeControllerParams(params),
417
+ state: {
418
+ get: () => state,
419
+ update: (fn) => fn(state)
420
+ }
421
+ });
422
+ };
400
423
  var stableStringify = (value, seen = /* @__PURE__ */ new WeakSet()) => {
401
424
  if (value == null) {
402
425
  return String(value);
@@ -1219,13 +1242,14 @@ var buildEntrySignalDecision = ({
1219
1242
  additionalIndicators,
1220
1243
  signalId,
1221
1244
  orderPlan,
1222
- runtime
1245
+ runtime,
1246
+ generateId = uuid
1223
1247
  }) => ({
1224
1248
  kind: "entry",
1225
1249
  code,
1226
1250
  entryContext,
1227
1251
  signal: buildStrategySignal({
1228
- signalId: signalId ?? uuid(),
1252
+ signalId: signalId ?? generateId(),
1229
1253
  strategy: entryContext.strategy,
1230
1254
  symbol: entryContext.symbol,
1231
1255
  interval: entryContext.interval,
@@ -1268,6 +1292,7 @@ var createStrategyAPI = ({
1268
1292
  isConfigFromBacktest,
1269
1293
  sharedReplayKey,
1270
1294
  getSharedReplayState,
1295
+ generateId,
1271
1296
  loadDecisionBaseContext
1272
1297
  }) => {
1273
1298
  const isBacktestEnv = env === "BACKTEST";
@@ -1325,6 +1350,7 @@ var createStrategyAPI = ({
1325
1350
  sharedReplayKey,
1326
1351
  getSharedReplayState
1327
1352
  });
1353
+ let lastTradeControllerIndex = 0;
1328
1354
  const getBaseContextFromIndicators = (indicators) => isRecordLike(indicators) && isRecordLike(indicators.baseContext) ? indicators.baseContext : void 0;
1329
1355
  const getCurrentIndicatorsContext = () => {
1330
1356
  ensureBarCache();
@@ -1450,7 +1476,8 @@ var createStrategyAPI = ({
1450
1476
  additionalIndicators,
1451
1477
  signalId,
1452
1478
  orderPlan,
1453
- runtime
1479
+ runtime,
1480
+ generateId
1454
1481
  });
1455
1482
  },
1456
1483
  exit: async ({ code, direction }) => {
@@ -1476,10 +1503,26 @@ var createStrategyAPI = ({
1476
1503
  getDecisionPriceContext,
1477
1504
  getCurrentPosition,
1478
1505
  getDirectionalTpSlPrices: (params) => getDirectionalTpSlPrices(params),
1479
- createLastTradeController: (params) => createLastTradeController({
1480
- env,
1481
- ...params
1482
- }),
1506
+ createLastTradeController: (params) => {
1507
+ const resolvedParams = resolveLastTradeControllerParams({
1508
+ env,
1509
+ ...params
1510
+ });
1511
+ const controllerIndex = lastTradeControllerIndex;
1512
+ lastTradeControllerIndex += 1;
1513
+ const state = createStateController(
1514
+ `__tradejs:last-trade:${controllerIndex}`,
1515
+ () => ({ lastTradeTimestamp: null }),
1516
+ {
1517
+ configKey: JSON.stringify(resolvedParams),
1518
+ sharedReplay: env === "CRON"
1519
+ }
1520
+ );
1521
+ return createStateBackedLastTradeController({
1522
+ ...resolvedParams,
1523
+ state
1524
+ });
1525
+ },
1483
1526
  createStateController
1484
1527
  };
1485
1528
  };
package/dist/time.js CHANGED
@@ -33,7 +33,6 @@ module.exports = __toCommonJS(time_exports);
33
33
 
34
34
  // src/utils/timestamp.ts
35
35
  var import_date_fns = require("date-fns");
36
- var import_date_fns2 = require("date-fns");
37
36
 
38
37
  // src/constants/index.ts
39
38
  var BACKTEST_EXECUTION_DELAY_MS = 5 * 6e4;
@@ -59,9 +58,9 @@ var RUNTIME_STORAGE_DAY_OFFSET_MS = 6 * 60 * 60 * 1e3;
59
58
  var toMs = (ts) => ts < 1e12 ? ts * 1e3 : ts;
60
59
  var getTimestamp = (days = 0) => {
61
60
  if (days > 0) {
62
- return (0, import_date_fns2.getUnixTime)((0, import_date_fns2.subDays)(/* @__PURE__ */ new Date(), days)) * 1e3;
61
+ return (0, import_date_fns.getUnixTime)((0, import_date_fns.subDays)(/* @__PURE__ */ new Date(), days)) * 1e3;
63
62
  }
64
- return (0, import_date_fns2.getUnixTime)(/* @__PURE__ */ new Date()) * 1e3;
63
+ return (0, import_date_fns.getUnixTime)(/* @__PURE__ */ new Date()) * 1e3;
65
64
  };
66
65
  var getItemTimestamp = (item) => item.timestamp;
67
66
  var getDataTimestamp = (data) => {
package/dist/time.mjs CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  getRuntimeStorageDayKeys,
8
8
  getTimestamp,
9
9
  toMs
10
- } from "./chunk-BOETNABM.mjs";
10
+ } from "./chunk-S4KHOAXM.mjs";
11
11
  import "./chunk-MKCQSB4H.mjs";
12
12
  export {
13
13
  formatUnix,
@@ -0,0 +1,3 @@
1
+ type IdGenerator = (length?: number) => string;
2
+
3
+ export type { IdGenerator as I };
@@ -0,0 +1,3 @@
1
+ type IdGenerator = (length?: number) => string;
2
+
3
+ export type { IdGenerator as I };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tradejs/core",
3
- "version": "2.0.18",
3
+ "version": "2.0.20",
4
4
  "description": "MIT-licensed browser-safe API for TradeJS config, strategy authoring, figures, and shared helpers.",
5
5
  "keywords": [
6
6
  "tradejs",
@@ -100,7 +100,7 @@
100
100
  }
101
101
  },
102
102
  "dependencies": {
103
- "@tradejs/types": "^2.0.18",
103
+ "@tradejs/types": "^2.0.20",
104
104
  "date-fns": "^3.6.0",
105
105
  "fast-technical-indicators": "^1.1.4",
106
106
  "klinecharts": "10.0.0-alpha9",
@@ -1,10 +0,0 @@
1
- // src/utils/uuid.ts
2
- import { randomUUID } from "crypto";
3
- var uuid = (len = 12) => {
4
- const uuid2 = randomUUID();
5
- return uuid2.slice(-len);
6
- };
7
-
8
- export {
9
- uuid
10
- };