@tradejs/node 2.0.0 → 2.0.2

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/dist/backtest.js CHANGED
@@ -1838,11 +1838,13 @@ var enrichSignalWithCoinMarketCapContext = async (params) => {
1838
1838
 
1839
1839
  // src/strategyHelpers/derivativesContext.ts
1840
1840
  var import_indicators2 = require("@tradejs/core/indicators");
1841
+ var import_data = require("@tradejs/core/data");
1841
1842
  var import_strategies3 = require("@tradejs/core/strategies");
1842
1843
  var import_constants = require("@tradejs/core/constants");
1843
1844
  var import_timescale3 = require("@tradejs/infra/timescale");
1844
1845
  var import_logger5 = require("@tradejs/infra/logger");
1845
- var DEFAULT_INTERVALS = ["15m", "1h"];
1846
+ var STORED_INTERVALS = ["15m", "1h"];
1847
+ var CONTEXT_INTERVALS = ["15m", "1h"];
1846
1848
  var DEFAULT_LOOKBACK_HOURS = 48;
1847
1849
  var PRIMARY_DERIVATIVES_REFERENCE_SYMBOL = import_constants.DERIVATIVES_CONTEXT_BASE_REFERENCE_SYMBOLS[0];
1848
1850
  var SECONDARY_DERIVATIVES_REFERENCE_SYMBOL = import_constants.DERIVATIVES_CONTEXT_BASE_REFERENCE_SYMBOLS[1];
@@ -1867,12 +1869,13 @@ var parseLookbackMs = () => {
1867
1869
  const normalizedHours = Number.isFinite(hours) && hours > 0 ? hours : DEFAULT_LOOKBACK_HOURS;
1868
1870
  return normalizedHours * 60 * 60 * 1e3;
1869
1871
  };
1870
- var parseIntervals = () => {
1871
- const fromEnv = (0, import_indicators2.normalizeDerivativesIntervals)(
1872
- process.env.DERIVATIVES_CONTEXT_INTERVALS
1873
- );
1874
- return fromEnv.length ? fromEnv : DEFAULT_INTERVALS;
1875
- };
1872
+ var withHourlyFallbackRows = (rowsByInterval) => ({
1873
+ "15m": rowsByInterval["15m"] ?? [],
1874
+ "1h": (0, import_indicators2.buildCoinalyzeHourlyRowsWithFallback)({
1875
+ rows15m: rowsByInterval["15m"],
1876
+ fallbackRows1h: rowsByInterval["1h"]
1877
+ })
1878
+ });
1876
1879
  var getDerivativesContextReferenceSymbols = () => [
1877
1880
  ...(0, import_constants.resolveDerivativesContextReferenceSymbols)(
1878
1881
  process.env.DERIVATIVES_CONTEXT_EXTRA_REFERENCE_SYMBOLS
@@ -1992,16 +1995,20 @@ var enrichSignalWithDerivativesContext = async (params) => {
1992
1995
  return false;
1993
1996
  }
1994
1997
  try {
1995
- const intervals = parseIntervals();
1996
1998
  const referenceSymbols = getDerivativesContextReferenceSymbols();
1997
1999
  const targetSymbol = normalizeSymbol(signal.symbol);
1998
2000
  const lookbackMs = parseLookbackMs();
2001
+ const decisionTimeMs = signal.timestamp + (0, import_data.intervalToMs)(signal.interval);
2002
+ const derivativesEndMs = (0, import_indicators2.getLastClosedDerivativesBarStartMs)(
2003
+ decisionTimeMs,
2004
+ "15m"
2005
+ );
1999
2006
  const contexts = await Promise.all(
2000
2007
  referenceSymbols.map(async (symbol) => {
2001
2008
  const rowsByInterval = await (0, import_timescale3.getDerivativesWindow)({
2002
2009
  symbol,
2003
- intervals,
2004
- endMs: signal.timestamp,
2010
+ intervals: STORED_INTERVALS,
2011
+ endMs: derivativesEndMs,
2005
2012
  lookbackMs
2006
2013
  });
2007
2014
  return [
@@ -2009,10 +2016,10 @@ var enrichSignalWithDerivativesContext = async (params) => {
2009
2016
  (0, import_indicators2.buildDerivativesContext)({
2010
2017
  symbol,
2011
2018
  direction: signal.direction,
2012
- timestamp: signal.timestamp,
2013
- rowsByInterval,
2019
+ timestamp: derivativesEndMs,
2020
+ rowsByInterval: withHourlyFallbackRows(rowsByInterval),
2014
2021
  priceChangePct1h: getSignalPriceChangePct1h(signal),
2015
- intervals
2022
+ intervals: CONTEXT_INTERVALS
2016
2023
  })
2017
2024
  ];
2018
2025
  })
@@ -2028,17 +2035,17 @@ var enrichSignalWithDerivativesContext = async (params) => {
2028
2035
  const fetchedTargetContext = shouldFetchTargetContext ? await (async () => {
2029
2036
  const rowsByInterval = await (0, import_timescale3.getDerivativesWindow)({
2030
2037
  symbol: targetSymbol,
2031
- intervals,
2032
- endMs: signal.timestamp,
2038
+ intervals: STORED_INTERVALS,
2039
+ endMs: derivativesEndMs,
2033
2040
  lookbackMs
2034
2041
  });
2035
2042
  const context = (0, import_indicators2.buildDerivativesContext)({
2036
2043
  symbol: targetSymbol,
2037
2044
  direction: signal.direction,
2038
- timestamp: signal.timestamp,
2039
- rowsByInterval,
2045
+ timestamp: derivativesEndMs,
2046
+ rowsByInterval: withHourlyFallbackRows(rowsByInterval),
2040
2047
  priceChangePct1h: getSignalPriceChangePct1h(signal),
2041
- intervals
2048
+ intervals: CONTEXT_INTERVALS
2042
2049
  });
2043
2050
  return hasDerivativesSymbolData(context) ? context : void 0;
2044
2051
  })() : void 0;
package/dist/backtest.mjs CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  enrichSignalWithBinanceMarketContext,
8
8
  enrichSignalWithCoinMarketCapContext,
9
9
  enrichSignalWithDerivativesContext
10
- } from "./chunk-37VNDZVX.mjs";
10
+ } from "./chunk-2DZCHRP6.mjs";
11
11
  import {
12
12
  buildAiPayload
13
13
  } from "./chunk-IUZML4RK.mjs";
@@ -747,8 +747,10 @@ var enrichSignalWithCoinMarketCapContext = async (params) => {
747
747
  // src/strategyHelpers/derivativesContext.ts
748
748
  import {
749
749
  buildDerivativesContext,
750
- normalizeDerivativesIntervals
750
+ buildCoinalyzeHourlyRowsWithFallback,
751
+ getLastClosedDerivativesBarStartMs
751
752
  } from "@tradejs/core/indicators";
753
+ import { intervalToMs } from "@tradejs/core/data";
752
754
  import { refreshSignalBaseContextGateFeatures as refreshSignalBaseContextGateFeatures3 } from "@tradejs/core/strategies";
753
755
  import {
754
756
  DERIVATIVES_CONTEXT_BASE_REFERENCE_SYMBOLS,
@@ -756,7 +758,8 @@ import {
756
758
  } from "@tradejs/core/constants";
757
759
  import { getDerivativesWindow } from "@tradejs/infra/timescale";
758
760
  import { logger as logger3 } from "@tradejs/infra/logger";
759
- var DEFAULT_INTERVALS = ["15m", "1h"];
761
+ var STORED_INTERVALS = ["15m", "1h"];
762
+ var CONTEXT_INTERVALS = ["15m", "1h"];
760
763
  var DEFAULT_LOOKBACK_HOURS = 48;
761
764
  var PRIMARY_DERIVATIVES_REFERENCE_SYMBOL = DERIVATIVES_CONTEXT_BASE_REFERENCE_SYMBOLS[0];
762
765
  var SECONDARY_DERIVATIVES_REFERENCE_SYMBOL = DERIVATIVES_CONTEXT_BASE_REFERENCE_SYMBOLS[1];
@@ -781,12 +784,13 @@ var parseLookbackMs = () => {
781
784
  const normalizedHours = Number.isFinite(hours) && hours > 0 ? hours : DEFAULT_LOOKBACK_HOURS;
782
785
  return normalizedHours * 60 * 60 * 1e3;
783
786
  };
784
- var parseIntervals = () => {
785
- const fromEnv = normalizeDerivativesIntervals(
786
- process.env.DERIVATIVES_CONTEXT_INTERVALS
787
- );
788
- return fromEnv.length ? fromEnv : DEFAULT_INTERVALS;
789
- };
787
+ var withHourlyFallbackRows = (rowsByInterval) => ({
788
+ "15m": rowsByInterval["15m"] ?? [],
789
+ "1h": buildCoinalyzeHourlyRowsWithFallback({
790
+ rows15m: rowsByInterval["15m"],
791
+ fallbackRows1h: rowsByInterval["1h"]
792
+ })
793
+ });
790
794
  var getDerivativesContextReferenceSymbols = () => [
791
795
  ...resolveDerivativesContextReferenceSymbols(
792
796
  process.env.DERIVATIVES_CONTEXT_EXTRA_REFERENCE_SYMBOLS
@@ -906,16 +910,20 @@ var enrichSignalWithDerivativesContext = async (params) => {
906
910
  return false;
907
911
  }
908
912
  try {
909
- const intervals = parseIntervals();
910
913
  const referenceSymbols = getDerivativesContextReferenceSymbols();
911
914
  const targetSymbol = normalizeSymbol(signal.symbol);
912
915
  const lookbackMs = parseLookbackMs();
916
+ const decisionTimeMs = signal.timestamp + intervalToMs(signal.interval);
917
+ const derivativesEndMs = getLastClosedDerivativesBarStartMs(
918
+ decisionTimeMs,
919
+ "15m"
920
+ );
913
921
  const contexts = await Promise.all(
914
922
  referenceSymbols.map(async (symbol) => {
915
923
  const rowsByInterval = await getDerivativesWindow({
916
924
  symbol,
917
- intervals,
918
- endMs: signal.timestamp,
925
+ intervals: STORED_INTERVALS,
926
+ endMs: derivativesEndMs,
919
927
  lookbackMs
920
928
  });
921
929
  return [
@@ -923,10 +931,10 @@ var enrichSignalWithDerivativesContext = async (params) => {
923
931
  buildDerivativesContext({
924
932
  symbol,
925
933
  direction: signal.direction,
926
- timestamp: signal.timestamp,
927
- rowsByInterval,
934
+ timestamp: derivativesEndMs,
935
+ rowsByInterval: withHourlyFallbackRows(rowsByInterval),
928
936
  priceChangePct1h: getSignalPriceChangePct1h(signal),
929
- intervals
937
+ intervals: CONTEXT_INTERVALS
930
938
  })
931
939
  ];
932
940
  })
@@ -942,17 +950,17 @@ var enrichSignalWithDerivativesContext = async (params) => {
942
950
  const fetchedTargetContext = shouldFetchTargetContext ? await (async () => {
943
951
  const rowsByInterval = await getDerivativesWindow({
944
952
  symbol: targetSymbol,
945
- intervals,
946
- endMs: signal.timestamp,
953
+ intervals: STORED_INTERVALS,
954
+ endMs: derivativesEndMs,
947
955
  lookbackMs
948
956
  });
949
957
  const context = buildDerivativesContext({
950
958
  symbol: targetSymbol,
951
959
  direction: signal.direction,
952
- timestamp: signal.timestamp,
953
- rowsByInterval,
960
+ timestamp: derivativesEndMs,
961
+ rowsByInterval: withHourlyFallbackRows(rowsByInterval),
954
962
  priceChangePct1h: getSignalPriceChangePct1h(signal),
955
- intervals
963
+ intervals: CONTEXT_INTERVALS
956
964
  });
957
965
  return hasDerivativesSymbolData(context) ? context : void 0;
958
966
  })() : void 0;
@@ -7196,7 +7196,7 @@ var askAI = async (signal, options = {}) => {
7196
7196
  // src/strategyRuntime.ts
7197
7197
  var import_node_path2 = __toESM(require("path"));
7198
7198
  var import_constants4 = require("@tradejs/core/constants");
7199
- var import_data = require("@tradejs/core/data");
7199
+ var import_data2 = require("@tradejs/core/data");
7200
7200
  var import_strategies4 = require("@tradejs/core/strategies");
7201
7201
  var import_logger8 = require("@tradejs/infra/logger");
7202
7202
 
@@ -7424,11 +7424,13 @@ var markRuntimeTradeClosed = async (params) => {
7424
7424
 
7425
7425
  // src/strategyHelpers/derivativesContext.ts
7426
7426
  var import_indicators2 = require("@tradejs/core/indicators");
7427
+ var import_data = require("@tradejs/core/data");
7427
7428
  var import_strategies = require("@tradejs/core/strategies");
7428
7429
  var import_constants2 = require("@tradejs/core/constants");
7429
7430
  var import_timescale = require("@tradejs/infra/timescale");
7430
7431
  var import_logger4 = require("@tradejs/infra/logger");
7431
- var DEFAULT_INTERVALS = ["15m", "1h"];
7432
+ var STORED_INTERVALS = ["15m", "1h"];
7433
+ var CONTEXT_INTERVALS = ["15m", "1h"];
7432
7434
  var DEFAULT_LOOKBACK_HOURS = 48;
7433
7435
  var PRIMARY_DERIVATIVES_REFERENCE_SYMBOL = import_constants2.DERIVATIVES_CONTEXT_BASE_REFERENCE_SYMBOLS[0];
7434
7436
  var SECONDARY_DERIVATIVES_REFERENCE_SYMBOL = import_constants2.DERIVATIVES_CONTEXT_BASE_REFERENCE_SYMBOLS[1];
@@ -7453,12 +7455,13 @@ var parseLookbackMs = () => {
7453
7455
  const normalizedHours = Number.isFinite(hours) && hours > 0 ? hours : DEFAULT_LOOKBACK_HOURS;
7454
7456
  return normalizedHours * 60 * 60 * 1e3;
7455
7457
  };
7456
- var parseIntervals = () => {
7457
- const fromEnv = (0, import_indicators2.normalizeDerivativesIntervals)(
7458
- process.env.DERIVATIVES_CONTEXT_INTERVALS
7459
- );
7460
- return fromEnv.length ? fromEnv : DEFAULT_INTERVALS;
7461
- };
7458
+ var withHourlyFallbackRows = (rowsByInterval) => ({
7459
+ "15m": rowsByInterval["15m"] ?? [],
7460
+ "1h": (0, import_indicators2.buildCoinalyzeHourlyRowsWithFallback)({
7461
+ rows15m: rowsByInterval["15m"],
7462
+ fallbackRows1h: rowsByInterval["1h"]
7463
+ })
7464
+ });
7462
7465
  var getDerivativesContextReferenceSymbols = () => [
7463
7466
  ...(0, import_constants2.resolveDerivativesContextReferenceSymbols)(
7464
7467
  process.env.DERIVATIVES_CONTEXT_EXTRA_REFERENCE_SYMBOLS
@@ -7578,16 +7581,20 @@ var enrichSignalWithDerivativesContext = async (params) => {
7578
7581
  return false;
7579
7582
  }
7580
7583
  try {
7581
- const intervals = parseIntervals();
7582
7584
  const referenceSymbols = getDerivativesContextReferenceSymbols();
7583
7585
  const targetSymbol = normalizeSymbol(signal.symbol);
7584
7586
  const lookbackMs = parseLookbackMs();
7587
+ const decisionTimeMs = signal.timestamp + (0, import_data.intervalToMs)(signal.interval);
7588
+ const derivativesEndMs = (0, import_indicators2.getLastClosedDerivativesBarStartMs)(
7589
+ decisionTimeMs,
7590
+ "15m"
7591
+ );
7585
7592
  const contexts = await Promise.all(
7586
7593
  referenceSymbols.map(async (symbol) => {
7587
7594
  const rowsByInterval = await (0, import_timescale.getDerivativesWindow)({
7588
7595
  symbol,
7589
- intervals,
7590
- endMs: signal.timestamp,
7596
+ intervals: STORED_INTERVALS,
7597
+ endMs: derivativesEndMs,
7591
7598
  lookbackMs
7592
7599
  });
7593
7600
  return [
@@ -7595,10 +7602,10 @@ var enrichSignalWithDerivativesContext = async (params) => {
7595
7602
  (0, import_indicators2.buildDerivativesContext)({
7596
7603
  symbol,
7597
7604
  direction: signal.direction,
7598
- timestamp: signal.timestamp,
7599
- rowsByInterval,
7605
+ timestamp: derivativesEndMs,
7606
+ rowsByInterval: withHourlyFallbackRows(rowsByInterval),
7600
7607
  priceChangePct1h: getSignalPriceChangePct1h(signal),
7601
- intervals
7608
+ intervals: CONTEXT_INTERVALS
7602
7609
  })
7603
7610
  ];
7604
7611
  })
@@ -7614,17 +7621,17 @@ var enrichSignalWithDerivativesContext = async (params) => {
7614
7621
  const fetchedTargetContext = shouldFetchTargetContext ? await (async () => {
7615
7622
  const rowsByInterval = await (0, import_timescale.getDerivativesWindow)({
7616
7623
  symbol: targetSymbol,
7617
- intervals,
7618
- endMs: signal.timestamp,
7624
+ intervals: STORED_INTERVALS,
7625
+ endMs: derivativesEndMs,
7619
7626
  lookbackMs
7620
7627
  });
7621
7628
  const context = (0, import_indicators2.buildDerivativesContext)({
7622
7629
  symbol: targetSymbol,
7623
7630
  direction: signal.direction,
7624
- timestamp: signal.timestamp,
7625
- rowsByInterval,
7631
+ timestamp: derivativesEndMs,
7632
+ rowsByInterval: withHourlyFallbackRows(rowsByInterval),
7626
7633
  priceChangePct1h: getSignalPriceChangePct1h(signal),
7627
- intervals
7634
+ intervals: CONTEXT_INTERVALS
7628
7635
  });
7629
7636
  return hasDerivativesSymbolData(context) ? context : void 0;
7630
7637
  })() : void 0;
@@ -8985,7 +8992,7 @@ var resolveBacktestExecutionDelayMs = (value, fallbackDelayMs) => {
8985
8992
  };
8986
8993
  var safeIntervalToMs = (interval) => {
8987
8994
  try {
8988
- return (0, import_data.intervalToMs)(interval);
8995
+ return (0, import_data2.intervalToMs)(interval);
8989
8996
  } catch {
8990
8997
  return null;
8991
8998
  }
@@ -3,7 +3,7 @@ import {
3
3
  enrichSignalWithBinanceMarketContext,
4
4
  enrichSignalWithCoinMarketCapContext,
5
5
  enrichSignalWithDerivativesContext
6
- } from "./chunk-37VNDZVX.mjs";
6
+ } from "./chunk-2DZCHRP6.mjs";
7
7
  import {
8
8
  require_lodash
9
9
  } from "./chunk-KZDHZ56N.mjs";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tradejs/node",
3
- "version": "2.0.0",
3
+ "version": "2.0.2",
4
4
  "description": "Node-only runtime for the TradeJS TypeScript framework: strategies, backtests, Pine strategy loading, and plugin registries.",
5
5
  "keywords": [
6
6
  "tradejs",
@@ -67,9 +67,9 @@
67
67
  "dependencies": {
68
68
  "@langchain/core": "^1.1.42",
69
69
  "@langchain/openai": "^1.4.5",
70
- "@tradejs/core": "^2.0.0",
71
- "@tradejs/infra": "^2.0.0",
72
- "@tradejs/types": "^2.0.0",
70
+ "@tradejs/core": "^2.0.2",
71
+ "@tradejs/infra": "^2.0.2",
72
+ "@tradejs/types": "^2.0.2",
73
73
  "chalk": "4.1.2",
74
74
  "ioredis": "5.8.0",
75
75
  "pinets": "0.8.12",