programgarden-core 2.6.0__tar.gz → 2.6.1__tar.gz

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.
Files changed (87) hide show
  1. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/PKG-INFO +5 -1
  2. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/README.md +4 -0
  3. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/i18n/locales/en.json +3 -2
  4. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/i18n/locales/ko.json +3 -2
  5. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/backtest_stock.py +10 -46
  6. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/pyproject.toml +1 -1
  7. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/__init__.py +0 -0
  8. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/bases/__init__.py +0 -0
  9. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/bases/client.py +0 -0
  10. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/bases/components.py +0 -0
  11. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/bases/listener.py +0 -0
  12. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/bases/mixins.py +0 -0
  13. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/bases/products.py +0 -0
  14. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/bases/sql.py +0 -0
  15. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/bases/storage.py +0 -0
  16. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/code_node.py +0 -0
  17. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/exceptions.py +0 -0
  18. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/expression/__init__.py +0 -0
  19. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/expression/evaluator.py +0 -0
  20. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/expression/reference.py +0 -0
  21. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/i18n/__init__.py +0 -0
  22. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/i18n/translator.py +0 -0
  23. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/korea_alias.py +0 -0
  24. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/market_calendar.py +0 -0
  25. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/models/__init__.py +0 -0
  26. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/models/connection_rule.py +0 -0
  27. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/models/credential.py +0 -0
  28. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/models/edge.py +0 -0
  29. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/models/event.py +0 -0
  30. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/models/exchange.py +0 -0
  31. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/models/field_binding.py +0 -0
  32. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/models/job.py +0 -0
  33. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/models/order_diagnostics.py +0 -0
  34. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/models/plugin_resource.py +0 -0
  35. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/models/resilience.py +0 -0
  36. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/models/resource.py +0 -0
  37. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/models/validation.py +0 -0
  38. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/models/workflow.py +0 -0
  39. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/__init__.py +0 -0
  40. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/account_futures.py +0 -0
  41. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/account_korea_stock.py +0 -0
  42. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/account_stock.py +0 -0
  43. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/ai.py +0 -0
  44. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/backtest.py +0 -0
  45. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/backtest_futures.py +0 -0
  46. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/backtest_korea_stock.py +0 -0
  47. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/base.py +0 -0
  48. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/broker.py +0 -0
  49. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/calculation.py +0 -0
  50. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/code.py +0 -0
  51. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/condition.py +0 -0
  52. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/contract_info_futures.py +0 -0
  53. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/data.py +0 -0
  54. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/data_futures.py +0 -0
  55. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/data_korea_stock.py +0 -0
  56. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/data_stock.py +0 -0
  57. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/display.py +0 -0
  58. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/event.py +0 -0
  59. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/fundamental_korea_stock.py +0 -0
  60. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/fundamental_stock.py +0 -0
  61. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/infra.py +0 -0
  62. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/open_orders_futures.py +0 -0
  63. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/open_orders_korea_stock.py +0 -0
  64. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/open_orders_stock.py +0 -0
  65. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/order.py +0 -0
  66. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/orderable_quantity_futures.py +0 -0
  67. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/portfolio.py +0 -0
  68. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/realtime_futures.py +0 -0
  69. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/realtime_korea_stock.py +0 -0
  70. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/realtime_stock.py +0 -0
  71. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/risk.py +0 -0
  72. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/session_gate.py +0 -0
  73. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/symbol.py +0 -0
  74. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/symbol_futures.py +0 -0
  75. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/symbol_korea_stock.py +0 -0
  76. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/symbol_stock.py +0 -0
  77. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/nodes/trigger.py +0 -0
  78. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/presets/__init__.py +0 -0
  79. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/presets/news_analyst.json +0 -0
  80. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/presets/risk_manager.json +0 -0
  81. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/presets/strategist.json +0 -0
  82. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/presets/technical_analyst.json +0 -0
  83. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/registry/__init__.py +0 -0
  84. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/registry/credential_registry.py +0 -0
  85. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/registry/node_registry.py +0 -0
  86. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/registry/plugin_registry.py +0 -0
  87. {programgarden_core-2.6.0 → programgarden_core-2.6.1}/programgarden_core/retry_executor.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: programgarden-core
3
- Version: 2.6.0
3
+ Version: 2.6.1
4
4
  Summary: ProgramGarden Core - 노드 기반 DSL 핵심 타입 정의
5
5
  License-Expression: AGPL-3.0-or-later
6
6
  Author: 프로그램동산
@@ -19,6 +19,10 @@ US regular-session requests can opt into SessionGateNode.exchange_calendar (XNYS
19
19
 
20
20
  # ProgramGarden Core
21
21
 
22
+ An unreleased [stock history interval correction](../../docs/stock-history-interval-contract.md)
23
+ limits the overseas-stock catalog to its implemented g3204 periods and rejects
24
+ unsupported intraday requests before execution. Package adoption is pending.
25
+
22
26
  Unreleased schema additions: OverseasFuturesContractInfoNode, SQLiteNode's opt-in
23
27
  storage_scope=execution, and SessionGateNode's XHKG calendar. See the
24
28
  [runtime contract](../../docs/futures-contract-details-and-rollover-state.md).
@@ -2,6 +2,10 @@ US regular-session requests can opt into SessionGateNode.exchange_calendar (XNYS
2
2
 
3
3
  # ProgramGarden Core
4
4
 
5
+ An unreleased [stock history interval correction](../../docs/stock-history-interval-contract.md)
6
+ limits the overseas-stock catalog to its implemented g3204 periods and rejects
7
+ unsupported intraday requests before execution. Package adoption is pending.
8
+
5
9
  Unreleased schema additions: OverseasFuturesContractInfoNode, SQLiteNode's opt-in
6
10
  storage_scope=execution, and SessionGateNode's XHKG calendar. See the
7
11
  [runtime contract](../../docs/futures-contract-details-and-rollover-state.md).
@@ -140,7 +140,7 @@
140
140
  "nodes.OverseasStockBrokerNode.name": "Stock Broker",
141
141
  "nodes.OverseasStockCancelOrderNode.description": "Cancels a pending US stock order by its original order ID. Requires original_order_id from OverseasStockOpenOrdersNode or OverseasStockRealOrderEventNode. Outputs cancel result and cancelled order ID. Rate-limited to 5-second minimum interval. Typical connection: StockOpenOrdersNode → StockCancelOrderNode, or StockRealOrderEventNode → StockCancelOrderNode.",
142
142
  "nodes.OverseasStockCancelOrderNode.name": "Stock Cancel Order",
143
- "nodes.OverseasStockHistoricalDataNode.description": "Fetches historical OHLCV (Open, High, Low, Close, Volume) chart data for overseas stocks over a specified date range. Supports bar intervals: 1-minute, 5-minute, 15-minute, 1-hour, daily, weekly, and monthly. Enable 'adjust' for split/dividend-adjusted prices (recommended for backtesting). Auto-iterates when previous node outputs multiple symbols. Requires an upstream OverseasStockBrokerNode. Typical connection: WatchlistNode → StockHistoricalDataNode → ConditionNode or → BacktestEngineNode. Supported exchanges: NYSE, NASDAQ, AMEX. Can be used as an AI Agent tool.",
143
+ "nodes.OverseasStockHistoricalDataNode.description": "Fetches historical OHLCV (Open, High, Low, Close, Volume) chart data for overseas stocks over a specified date range. Uses LS g3204 for daily, weekly, monthly and yearly bars. Intraday g3203 is unsupported. Enable 'adjust' for split/dividend-adjusted prices (recommended for backtesting). Auto-iterates when previous node outputs multiple symbols. Requires an upstream OverseasStockBrokerNode. Typical connection: WatchlistNode → StockHistoricalDataNode → ConditionNode or → BacktestEngineNode. Supported exchanges: NYSE, NASDAQ, AMEX. Can be used as an AI Agent tool.",
144
144
  "nodes.OverseasStockHistoricalDataNode.name": "Stock Historical Data",
145
145
  "nodes.OverseasStockFundamentalNode.description": "Fetches fundamental financial data for overseas stocks via LS Securities API. Provides 16 metrics including PER, EPS, PBR, market capitalization, dividend yield, 52-week high/low, and more. Auto-iterates when previous node outputs multiple symbols. Requires an upstream OverseasStockBrokerNode. Typical connection: WatchlistNode → StockFundamentalNode → ConditionNode (for value-based screening). Supported exchanges: NYSE, NASDAQ, AMEX. Can be used as an AI Agent tool.",
146
146
  "nodes.OverseasStockFundamentalNode.name": "Stock Fundamentals",
@@ -420,7 +420,7 @@
420
420
  "fields.OverseasStockHistoricalDataNode.adjust.short": "Apply adjusted price",
421
421
  "fields.OverseasStockHistoricalDataNode.end_date": "End date (YYYYMMDD)",
422
422
  "fields.OverseasStockHistoricalDataNode.end_date.help_text": "e.g., 20241231. With binding: {{ date.today(format='yyyymmdd') }}",
423
- "fields.OverseasStockHistoricalDataNode.interval": "Bar interval (1m, 5m, 15m, 1h, 1d, 1w, 1M)",
423
+ "fields.OverseasStockHistoricalDataNode.interval": "LS g3204 interval (1d, 1w, 1M, 1Y); intraday is unsupported",
424
424
  "fields.OverseasStockHistoricalDataNode.start_date": "Start date (YYYYMMDD)",
425
425
  "fields.OverseasStockHistoricalDataNode.start_date.help_text": "e.g., 20240101. With binding: {{ date.ago(30, format='yyyymmdd') }}",
426
426
  "fields.OverseasStockHistoricalDataNode.symbol": "Enter the symbol code to query",
@@ -1032,6 +1032,7 @@
1032
1032
  "enums.kr_price_type.market": "Market",
1033
1033
  "enums.interval.15m": "15 Minutes",
1034
1034
  "enums.interval.1M": "1 Month",
1035
+ "enums.interval.1Y": "1 year",
1035
1036
  "enums.interval.1d": "1 Day",
1036
1037
  "enums.interval.1h": "1 Hour",
1037
1038
  "enums.interval.1m": "1 Minute",
@@ -140,7 +140,7 @@
140
140
  "nodes.OverseasStockBrokerNode.name": "해외주식 브로커",
141
141
  "nodes.OverseasStockCancelOrderNode.description": "미국 주식 미체결 주문을 원래 주문 ID로 취소합니다. OverseasStockOpenOrdersNode 또는 OverseasStockRealOrderEventNode에서 original_order_id를 받아야 합니다. 출력: 취소 결과, 취소된 주문 ID. 최소 5초 간격 제한 적용. 일반적인 연결: StockOpenOrdersNode → StockCancelOrderNode 또는 StockRealOrderEventNode → StockCancelOrderNode.",
142
142
  "nodes.OverseasStockCancelOrderNode.name": "해외주식 취소주문",
143
- "nodes.OverseasStockHistoricalDataNode.description": "지정 기간의 해외주식 과거 OHLCV(시가, 고가, 저가, 종가, 거래량) 차트 데이터를 조회합니다. 봉 종류: 1분, 5분, 15분, 1시간, 일봉, 주봉, 월봉. 수정주가(주식 분할/배당 반영) 활성화 권장(백테스트용). 이전 노드가 여러 종목을 출력하면 자동 반복 실행. 상위 OverseasStockBrokerNode 연결 필수. 일반적인 연결: WatchlistNode → StockHistoricalDataNode → ConditionNode 또는 → BacktestEngineNode. 지원 거래소: NYSE, NASDAQ, AMEX. AI Agent 도구로 사용 가능.",
143
+ "nodes.OverseasStockHistoricalDataNode.description": "지정 기간의 해외주식 과거 OHLCV(시가, 고가, 저가, 종가, 거래량) 차트 데이터를 조회합니다. LS g3204로 일봉·주봉·월봉·연봉을 조회합니다. 분봉·시간봉(g3203)은 지원하지 않습니다. 수정주가(주식 분할/배당 반영) 활성화 권장(백테스트용). 이전 노드가 여러 종목을 출력하면 자동 반복 실행. 상위 OverseasStockBrokerNode 연결 필수. 일반적인 연결: WatchlistNode → StockHistoricalDataNode → ConditionNode 또는 → BacktestEngineNode. 지원 거래소: NYSE, NASDAQ, AMEX. AI Agent 도구로 사용 가능.",
144
144
  "nodes.OverseasStockHistoricalDataNode.name": "해외주식 과거데이터",
145
145
  "nodes.OverseasStockFundamentalNode.description": "LS증권 API로 해외주식 펀더멘털 재무 데이터를 조회합니다. PER, EPS, PBR, 시가총액, 배당수익률, 52주 고/저가 등 16개 지표를 제공합니다. 이전 노드가 여러 종목을 출력하면 자동 반복 실행. 상위 OverseasStockBrokerNode 연결 필수. 일반적인 연결: WatchlistNode → StockFundamentalNode → ConditionNode (가치 기반 스크리닝). 지원 거래소: NYSE, NASDAQ, AMEX. AI Agent 도구로 사용 가능.",
146
146
  "nodes.OverseasStockFundamentalNode.name": "해외주식 종목정보",
@@ -420,7 +420,7 @@
420
420
  "fields.OverseasStockHistoricalDataNode.adjust.short": "수정주가 적용 여부",
421
421
  "fields.OverseasStockHistoricalDataNode.end_date": "조회 종료일 (YYYYMMDD)",
422
422
  "fields.OverseasStockHistoricalDataNode.end_date.help_text": "예: 20241231. 바인딩 시 {{ date.today(format='yyyymmdd') }} 사용 가능",
423
- "fields.OverseasStockHistoricalDataNode.interval": "봉 종류 (1m, 5m, 15m, 1h, 1d, 1w, 1M)",
423
+ "fields.OverseasStockHistoricalDataNode.interval": "LS g3204 봉 종류 (1d, 1w, 1M, 1Y). 분봉·시간봉 미지원",
424
424
  "fields.OverseasStockHistoricalDataNode.start_date": "조회 시작일 (YYYYMMDD)",
425
425
  "fields.OverseasStockHistoricalDataNode.start_date.help_text": "예: 20240101. 바인딩 시 {{ date.ago(30, format='yyyymmdd') }} 사용 가능",
426
426
  "fields.OverseasStockHistoricalDataNode.symbol": "조회할 종목 코드를 입력하세요",
@@ -1032,6 +1032,7 @@
1032
1032
  "enums.kr_price_type.market": "시장가 (Market)",
1033
1033
  "enums.interval.15m": "15분",
1034
1034
  "enums.interval.1M": "1개월",
1035
+ "enums.interval.1Y": "1년",
1035
1036
  "enums.interval.1d": "1일",
1036
1037
  "enums.interval.1h": "1시간",
1037
1038
  "enums.interval.1m": "1분",
@@ -65,9 +65,9 @@ class OverseasStockHistoricalDataNode(BaseNode):
65
65
  default="{{ date.today(format='yyyymmdd') }}",
66
66
  description="End date (YYYY-MM-DD or {{ date.today(format='yyyymmdd') }})",
67
67
  )
68
- interval: str = Field(
68
+ interval: Literal["1d", "1w", "1M", "1Y"] = Field(
69
69
  default="1d",
70
- description="Data interval (1m, 5m, 15m, 1h, 1d)",
70
+ description="LS g3204 interval: daily, weekly, monthly or yearly. Intraday is unsupported.",
71
71
  )
72
72
  adjust: bool = Field(
73
73
  default=False,
@@ -80,7 +80,7 @@ class OverseasStockHistoricalDataNode(BaseNode):
80
80
 
81
81
  _usage: ClassVar[Dict[str, Any]] = {
82
82
  "when_to_use": [
83
- "Retrieve daily (or intraday) OHLCV history for a US-listed stock to compute technical indicators or run backtests",
83
+ "Retrieve daily, weekly, monthly or yearly OHLCV history for a US-listed stock to compute technical indicators or run backtests",
84
84
  "Feed time-series data into ConditionNode plugins (RSI, MACD, Bollinger, etc.) that require a `data` list of candles",
85
85
  "Use `{{ date.ago(N, format='yyyymmdd') }}` for start_date to get a rolling lookback window without hardcoding dates",
86
86
  ],
@@ -97,7 +97,7 @@ class OverseasStockHistoricalDataNode(BaseNode):
97
97
  }
98
98
  _features: ClassVar[List[str]] = [
99
99
  "Returns a list of OHLCV candles in `value.time_series`: [{date, open, high, low, close, volume}, ...]",
100
- "Supports intervals: 1m, 5m, 15m, 1h, 1d, 1w, 1M — daily (1d) is the default for swing trading strategies",
100
+ "Supports intervals: 1d, 1w, 1M, 1Y through LS g3204; intraday history is unsupported",
101
101
  "start_date / end_date accept YYYYMMDD strings or expression namespace calls: `{{ date.ago(30, format='yyyymmdd') }}`",
102
102
  "adjust=True applies split/dividend-adjusted prices for accurate long-term backtesting",
103
103
  "is_tool_enabled=True — AI Agent can fetch historical data autonomously for technical analysis",
@@ -156,45 +156,12 @@ class OverseasStockHistoricalDataNode(BaseNode):
156
156
  },
157
157
  "expected_output": "value port: {symbol, exchange, time_series: [{date, open, high, low, close, volume}, ...]}. RSI is computed from time_series.",
158
158
  },
159
- {
160
- "title": "Intraday 5-minute data for MACD",
161
- "description": "Fetch 5-minute bars over the past 5 days for MSFT and compute MACD crossover signal.",
162
- "workflow_snippet": {
163
- "id": "overseas_stock_historical_macd_5m",
164
- "name": "Intraday MACD",
165
- "nodes": [
166
- {"id": "start", "type": "StartNode"},
167
- {"id": "broker", "type": "OverseasStockBrokerNode", "credential_id": "broker_cred", "paper_trading": False},
168
- {'id': 'split', 'type': 'SplitNode', 'array': [{'symbol': 'MSFT', 'exchange': 'NASDAQ'}]},
169
- {"id": "historical", "type": "OverseasStockHistoricalDataNode", "symbol": "{{ nodes.split.item }}", "start_date": "{{ date.ago(5, format='yyyymmdd') }}", "end_date": "{{ date.today(format='yyyymmdd') }}", "interval": "5m", "adjust": False},
170
- {"id": "condition", "type": "ConditionNode", "plugin": "MACD", "items": {"from": "{{ item.time_series }}", "extract": {"symbol": "{{ item.symbol }}", "exchange": "{{ item.exchange }}", "date": "{{ row.date }}", "close": "{{ row.close }}"}}, "fields": {"fast": 12, "slow": 26, "signal": 9, "direction": "bullish_cross"}},
171
- {'id': 'split_results', 'type': 'AggregateNode', 'mode': 'collect'}],
172
- "edges": [
173
- {"from": "start", "to": "broker"},
174
- {"from": "broker", "to": "split"},
175
- {"from": "split", "to": "historical"},
176
- {"from": "broker", "to": "historical"},
177
- {"from": "historical", "to": "condition"},
178
- {'from': 'condition', 'to': 'split_results'}],
179
- "credentials": [
180
- {
181
- "credential_id": "broker_cred",
182
- "type": "broker_ls_overseas_stock",
183
- "data": [
184
- {"key": "appkey", "value": "", "type": "password", "label": "App Key"},
185
- {"key": "appsecret", "value": "", "type": "password", "label": "App Secret"},
186
- ],
187
- }
188
- ],
189
- },
190
- "expected_output": "value.time_series contains 5-minute OHLCV bars; MACD ConditionNode emits signal/histogram on the result port.",
191
- },
192
159
  ]
193
160
  _node_guide: ClassVar[Dict[str, Any]] = {
194
161
  "input_handling": (
195
162
  "The `symbol` field takes a single {exchange, symbol} dict — bind to `{{ nodes.split.item }}` in a per-symbol loop. "
196
163
  "start_date / end_date accept 'YYYYMMDD' strings or `{{ date.ago(N, format='yyyymmdd') }}` expressions. "
197
- "interval options: 1m, 5m, 15m, 1h, 1d, 1w, 1M. Use adjust=True for long-term backtesting to remove split/dividend distortions."
164
+ "Supported intervals: 1d, 1w, 1M, 1Y through LS g3204. Intraday g3203 is not connected to this node."
198
165
  ),
199
166
  "output_consumption": (
200
167
  "The `value` port emits a dict: {symbol, exchange, time_series: [{date, open, high, low, close, volume}, ...]}. "
@@ -210,9 +177,9 @@ class OverseasStockHistoricalDataNode(BaseNode):
210
177
  "pitfalls": [
211
178
  "`symbol: {{ item }}` / `{{ nodes.<split>.item }}` resolves only inside a per-symbol loop (auto-iterate over an upstream array, or a SplitNode branch). If the upstream array is empty for this run the node logs `No symbols to fetch` and returns an empty series — normal no-signal, not a defect. A `No symbols provided` WARNING means the symbol source is missing or the binding did not resolve",
212
179
  "Access time_series via `{{ nodes.historical.value.time_series }}` — the value port is a dict, not a plain list",
213
- "Intraday intervals (1m/5m/15m/1h) may have limited history depth depending on LS Securities API availability",
180
+ "Intraday intervals (1m/5m/15m/1h) are unsupported; never substitute daily bars or invent a g3203 node connection",
214
181
  "adjust=False (default) returns unadjusted prices; set True when comparing long-term price levels across splits",
215
- "Large date ranges with 1m interval can return thousands of rows — set reasonable start_date to avoid memory pressure",
182
+ "The current executor requests one g3204 page; it does not expose response-time, continuation-completion or candle-finality evidence",
216
183
  ],
217
184
  }
218
185
 
@@ -333,15 +300,12 @@ class OverseasStockHistoricalDataNode(BaseNode):
333
300
  description="i18n:fields.OverseasStockHistoricalDataNode.interval",
334
301
  default="1d",
335
302
  required=True,
336
- enum_values=["1m", "5m", "15m", "1h", "1d", "1w", "1M"],
303
+ enum_values=["1d", "1w", "1M", "1Y"],
337
304
  enum_labels={
338
- "1m": "i18n:enums.interval.1m",
339
- "5m": "i18n:enums.interval.5m",
340
- "15m": "i18n:enums.interval.15m",
341
- "1h": "i18n:enums.interval.1h",
342
305
  "1d": "i18n:enums.interval.1d",
343
306
  "1w": "i18n:enums.interval.1w",
344
- "1M": "i18n:enums.interval.1M"
307
+ "1M": "i18n:enums.interval.1M",
308
+ "1Y": "i18n:enums.interval.1Y"
345
309
  },
346
310
  category=FieldCategory.PARAMETERS,
347
311
  expression_mode=ExpressionMode.FIXED_ONLY,
@@ -5,7 +5,7 @@ authors = [
5
5
  homepage = "https://programgarden.com"
6
6
  requires-python = ">=3.12"
7
7
  name = "programgarden-core"
8
- version = "2.6.0"
8
+ version = "2.6.1"
9
9
  license = "AGPL-3.0-or-later"
10
10
  description = "ProgramGarden Core - 노드 기반 DSL 핵심 타입 정의"
11
11
  readme = "README.md"