programgarden-core 1.14.2__tar.gz → 1.14.3__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.
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/PKG-INFO +3 -2
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/order.py +54 -18
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/pyproject.toml +1 -1
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/README.md +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/__init__.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/bases/__init__.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/bases/client.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/bases/components.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/bases/listener.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/bases/mixins.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/bases/products.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/bases/sql.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/bases/storage.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/exceptions.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/expression/__init__.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/expression/evaluator.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/i18n/__init__.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/i18n/locales/en.json +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/i18n/locales/ko.json +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/i18n/translator.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/korea_alias.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/models/__init__.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/models/connection_rule.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/models/credential.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/models/edge.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/models/event.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/models/exchange.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/models/field_binding.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/models/job.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/models/plugin_resource.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/models/resilience.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/models/resource.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/models/validation.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/models/workflow.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/__init__.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/account_futures.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/account_korea_stock.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/account_stock.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/ai.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/backtest.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/backtest_futures.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/backtest_korea_stock.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/backtest_stock.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/base.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/broker.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/calculation.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/condition.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/data.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/data_futures.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/data_korea_stock.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/data_stock.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/display.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/event.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/fundamental_korea_stock.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/fundamental_stock.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/infra.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/market_external.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/market_status.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/open_orders_futures.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/open_orders_korea_stock.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/open_orders_stock.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/portfolio.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/realtime_futures.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/realtime_korea_stock.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/realtime_stock.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/risk.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/symbol.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/symbol_futures.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/symbol_korea_stock.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/symbol_stock.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/trigger.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/presets/__init__.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/presets/news_analyst.json +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/presets/risk_manager.json +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/presets/strategist.json +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/presets/technical_analyst.json +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/registry/__init__.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/registry/credential_registry.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/registry/dynamic_node_registry.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/registry/node_registry.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/registry/plugin_registry.py +0 -0
- {programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/retry_executor.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: programgarden-core
|
|
3
|
-
Version: 1.14.
|
|
3
|
+
Version: 1.14.3
|
|
4
4
|
Summary: ProgramGarden Core - 노드 기반 DSL 핵심 타입 정의
|
|
5
5
|
Author: 프로그램동산
|
|
6
6
|
Author-email: coding@programgarden.com
|
|
@@ -8,6 +8,7 @@ Requires-Python: >=3.12
|
|
|
8
8
|
Classifier: Programming Language :: Python :: 3
|
|
9
9
|
Classifier: Programming Language :: Python :: 3.12
|
|
10
10
|
Classifier: Programming Language :: Python :: 3.13
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
11
12
|
Requires-Dist: pydantic (>=2.0.0,<3.0.0)
|
|
12
13
|
Description-Content-Type: text/markdown
|
|
13
14
|
|
|
@@ -652,6 +652,11 @@ class OverseasStockModifyOrderNode(BaseModifyOrderNode):
|
|
|
652
652
|
"reason": "Every tick would fire a modify request, hitting rate limits immediately and causing order rejections.",
|
|
653
653
|
"alternative": "Insert a ThrottleNode between the realtime source and the modify node.",
|
|
654
654
|
},
|
|
655
|
+
{
|
|
656
|
+
"pattern": "Submitting a modify outside trading hours and assuming it succeeded",
|
|
657
|
+
"reason": "LS may accept an out-of-hours modify without an error_msg yet never apply it (silent no-op); an empty modified_order_id is the tell.",
|
|
658
|
+
"alternative": "Confirm modify_result.success is True and modified_order_id is populated; only submit modifications inside the symbol's trading hours.",
|
|
659
|
+
},
|
|
655
660
|
]
|
|
656
661
|
_examples: ClassVar[List[Dict[str, Any]]] = [
|
|
657
662
|
{
|
|
@@ -747,6 +752,7 @@ class OverseasStockModifyOrderNode(BaseModifyOrderNode):
|
|
|
747
752
|
"Cannot modify a fully filled order — query OpenOrdersNode first to verify the order is still open",
|
|
748
753
|
"Omitting both new_price and new_quantity makes the call a no-op (the broker may return an error)",
|
|
749
754
|
"The 5-second rate-limit guard applies — rapid sequential modifications will be silently skipped",
|
|
755
|
+
"Out-of-hours modifications can silent no-op (LS returns no error but applies nothing); the executor now reports success=False, so always check modify_result.success and modified_order_id",
|
|
750
756
|
],
|
|
751
757
|
}
|
|
752
758
|
|
|
@@ -792,9 +798,9 @@ class OverseasStockModifyOrderNode(BaseModifyOrderNode):
|
|
|
792
798
|
),
|
|
793
799
|
]
|
|
794
800
|
|
|
795
|
-
_version: ClassVar[str] = "1.0.
|
|
796
|
-
_updated_at: ClassVar[str] = "2026-
|
|
797
|
-
_change_note: ClassVar[Optional[str]] =
|
|
801
|
+
_version: ClassVar[str] = "1.0.1"
|
|
802
|
+
_updated_at: ClassVar[str] = "2026-06-01"
|
|
803
|
+
_change_note: ClassVar[Optional[str]] = "Document out-of-hours modify silent no-op risk in AI metadata."
|
|
798
804
|
|
|
799
805
|
@classmethod
|
|
800
806
|
def get_field_schema(cls) -> Dict[str, "FieldSchema"]:
|
|
@@ -932,6 +938,11 @@ class OverseasStockCancelOrderNode(BaseModifyOrderNode):
|
|
|
932
938
|
"reason": "Each tick would fire a cancel request and exhaust rate limits immediately.",
|
|
933
939
|
"alternative": "Use ThrottleNode or IfNode to gate the cancel trigger.",
|
|
934
940
|
},
|
|
941
|
+
{
|
|
942
|
+
"pattern": "Treating a cancel response with no error as a confirmed cancellation",
|
|
943
|
+
"reason": "LS may return no error while not actually cancelling the order (e.g. out-of-hours); the absence of an error is not proof of cancellation.",
|
|
944
|
+
"alternative": "Re-query OverseasStockOpenOrdersNode after the cancel to confirm the order is gone before acting on it.",
|
|
945
|
+
},
|
|
935
946
|
]
|
|
936
947
|
_examples: ClassVar[List[Dict[str, Any]]] = [
|
|
937
948
|
{
|
|
@@ -1028,6 +1039,7 @@ class OverseasStockCancelOrderNode(BaseModifyOrderNode):
|
|
|
1028
1039
|
"Cancelling an already-filled order returns a broker error; check order status via OpenOrdersNode before cancelling",
|
|
1029
1040
|
"fallback.mode='error' (default) will halt the workflow on a failed cancel — set to 'skip' for best-effort cancel-all patterns",
|
|
1030
1041
|
"The 5-second rate-limit guard means large cancel batches take at minimum 5s per order",
|
|
1042
|
+
"LS can return no error while leaving the order uncancelled (e.g. out-of-hours), so do not trust a clean response alone — confirm cancellation by re-querying OpenOrdersNode afterward",
|
|
1031
1043
|
],
|
|
1032
1044
|
}
|
|
1033
1045
|
|
|
@@ -1057,9 +1069,9 @@ class OverseasStockCancelOrderNode(BaseModifyOrderNode):
|
|
|
1057
1069
|
),
|
|
1058
1070
|
]
|
|
1059
1071
|
|
|
1060
|
-
_version: ClassVar[str] = "1.0.
|
|
1061
|
-
_updated_at: ClassVar[str] = "2026-
|
|
1062
|
-
_change_note: ClassVar[Optional[str]] =
|
|
1072
|
+
_version: ClassVar[str] = "1.0.1"
|
|
1073
|
+
_updated_at: ClassVar[str] = "2026-06-01"
|
|
1074
|
+
_change_note: ClassVar[Optional[str]] = "Document out-of-hours cancel silent no-op risk in AI metadata."
|
|
1063
1075
|
|
|
1064
1076
|
@classmethod
|
|
1065
1077
|
def get_field_schema(cls) -> Dict[str, "FieldSchema"]:
|
|
@@ -1421,6 +1433,11 @@ class OverseasFuturesModifyOrderNode(BaseModifyOrderNode):
|
|
|
1421
1433
|
"reason": "Each tick fires a modify attempt, saturating the rate limit and causing cascading rejections.",
|
|
1422
1434
|
"alternative": "Insert ThrottleNode between realtime source and modify node.",
|
|
1423
1435
|
},
|
|
1436
|
+
{
|
|
1437
|
+
"pattern": "Submitting a modify outside the contract's trading hours and assuming it succeeded",
|
|
1438
|
+
"reason": "LS may accept an out-of-hours futures modify without an error_msg yet never apply it (silent no-op); an empty modified_order_id is the tell. Futures trading hours differ per exchange (CME/EUREX/SGX/HKEX).",
|
|
1439
|
+
"alternative": "Confirm modify_result.success is True and modified_order_id is populated; only modify within the exchange's trading hours.",
|
|
1440
|
+
},
|
|
1424
1441
|
]
|
|
1425
1442
|
_examples: ClassVar[List[Dict[str, Any]]] = [
|
|
1426
1443
|
{
|
|
@@ -1516,6 +1533,7 @@ class OverseasFuturesModifyOrderNode(BaseModifyOrderNode):
|
|
|
1516
1533
|
"Cannot modify a fully filled futures order — verify order status first via OpenOrdersNode",
|
|
1517
1534
|
"Omitting both new_price and new_quantity sends a no-op that the broker may reject with an error",
|
|
1518
1535
|
"Futures contract codes include expiry month (e.g. NQM25) — make sure symbol matches the exact open order",
|
|
1536
|
+
"Out-of-hours modifications can silent no-op (LS returns no error but applies nothing); the executor now reports success=False, so always check modify_result.success / modified_order_id (futures trading hours vary by exchange: CME/EUREX/SGX/HKEX)",
|
|
1519
1537
|
],
|
|
1520
1538
|
}
|
|
1521
1539
|
|
|
@@ -1555,9 +1573,9 @@ class OverseasFuturesModifyOrderNode(BaseModifyOrderNode):
|
|
|
1555
1573
|
),
|
|
1556
1574
|
]
|
|
1557
1575
|
|
|
1558
|
-
_version: ClassVar[str] = "1.0.
|
|
1559
|
-
_updated_at: ClassVar[str] = "2026-
|
|
1560
|
-
_change_note: ClassVar[Optional[str]] =
|
|
1576
|
+
_version: ClassVar[str] = "1.0.1"
|
|
1577
|
+
_updated_at: ClassVar[str] = "2026-06-01"
|
|
1578
|
+
_change_note: ClassVar[Optional[str]] = "Document out-of-hours modify silent no-op risk in AI metadata."
|
|
1561
1579
|
|
|
1562
1580
|
@classmethod
|
|
1563
1581
|
def get_field_schema(cls) -> Dict[str, "FieldSchema"]:
|
|
@@ -1679,6 +1697,11 @@ class OverseasFuturesCancelOrderNode(BaseModifyOrderNode):
|
|
|
1679
1697
|
"reason": "Every tick fires a cancel attempt, exhausting rate limits and generating spurious rejections.",
|
|
1680
1698
|
"alternative": "Use ThrottleNode or IfNode to gate the cancel trigger.",
|
|
1681
1699
|
},
|
|
1700
|
+
{
|
|
1701
|
+
"pattern": "Treating a cancel response with no error as a confirmed cancellation",
|
|
1702
|
+
"reason": "LS may return no error while not actually cancelling the futures order (e.g. out-of-hours); the absence of an error is not proof of cancellation. Futures trading hours differ per exchange (CME/EUREX/SGX/HKEX).",
|
|
1703
|
+
"alternative": "Re-query OverseasFuturesOpenOrdersNode after the cancel to confirm the order is gone before acting on it.",
|
|
1704
|
+
},
|
|
1682
1705
|
]
|
|
1683
1706
|
_examples: ClassVar[List[Dict[str, Any]]] = [
|
|
1684
1707
|
{
|
|
@@ -1775,6 +1798,7 @@ class OverseasFuturesCancelOrderNode(BaseModifyOrderNode):
|
|
|
1775
1798
|
"Cancelling an already-filled futures order returns a broker error — check order status first via OpenOrdersNode",
|
|
1776
1799
|
"fallback.mode='error' (default) halts workflow on cancel failure — use 'skip' for best-effort cancel-all loops",
|
|
1777
1800
|
"The 5-second rate-limit guard means a 10-order cancel batch takes at least 50 seconds",
|
|
1801
|
+
"LS can return no error while leaving the futures order uncancelled (e.g. out-of-hours; trading hours vary by exchange CME/EUREX/SGX/HKEX), so confirm cancellation by re-querying OpenOrdersNode afterward rather than trusting a clean response",
|
|
1778
1802
|
],
|
|
1779
1803
|
}
|
|
1780
1804
|
|
|
@@ -1804,9 +1828,9 @@ class OverseasFuturesCancelOrderNode(BaseModifyOrderNode):
|
|
|
1804
1828
|
),
|
|
1805
1829
|
]
|
|
1806
1830
|
|
|
1807
|
-
_version: ClassVar[str] = "1.0.
|
|
1808
|
-
_updated_at: ClassVar[str] = "2026-
|
|
1809
|
-
_change_note: ClassVar[Optional[str]] =
|
|
1831
|
+
_version: ClassVar[str] = "1.0.1"
|
|
1832
|
+
_updated_at: ClassVar[str] = "2026-06-01"
|
|
1833
|
+
_change_note: ClassVar[Optional[str]] = "Document out-of-hours cancel silent no-op risk in AI metadata."
|
|
1810
1834
|
|
|
1811
1835
|
@classmethod
|
|
1812
1836
|
def get_field_schema(cls) -> Dict[str, "FieldSchema"]:
|
|
@@ -2177,6 +2201,11 @@ class KoreaStockModifyOrderNode(BaseModifyOrderNode):
|
|
|
2177
2201
|
"reason": "Each tick fires a modify request, exhausting rate limits and causing rejection cascades.",
|
|
2178
2202
|
"alternative": "Insert ThrottleNode between the realtime source and the modify node.",
|
|
2179
2203
|
},
|
|
2204
|
+
{
|
|
2205
|
+
"pattern": "Submitting a modify outside KRX trading hours and assuming it succeeded",
|
|
2206
|
+
"reason": "LS may accept an out-of-hours modify without an error_msg yet never apply it (silent no-op); an empty modified_order_id is the tell.",
|
|
2207
|
+
"alternative": "Confirm modify_result.success is True and modified_order_id is populated; only modify during KRX regular hours (09:00-15:30 KST).",
|
|
2208
|
+
},
|
|
2180
2209
|
]
|
|
2181
2210
|
_examples: ClassVar[List[Dict[str, Any]]] = [
|
|
2182
2211
|
{
|
|
@@ -2271,6 +2300,7 @@ class KoreaStockModifyOrderNode(BaseModifyOrderNode):
|
|
|
2271
2300
|
"Cannot modify a fully filled Korean stock order — verify status via KoreaStockOpenOrdersNode first",
|
|
2272
2301
|
"KRW prices must be valid tick sizes for the stock; invalid tick sizes will be rejected by KRX",
|
|
2273
2302
|
"Paper trading is NOT supported for Korean stocks — the broker node enforces real-market mode only",
|
|
2303
|
+
"Out-of-hours modifications can silent no-op (LS returns no error but applies nothing); the executor now reports success=False, so always check modify_result.success / modified_order_id (KRX regular hours 09:00-15:30 KST)",
|
|
2274
2304
|
],
|
|
2275
2305
|
}
|
|
2276
2306
|
|
|
@@ -2310,9 +2340,9 @@ class KoreaStockModifyOrderNode(BaseModifyOrderNode):
|
|
|
2310
2340
|
),
|
|
2311
2341
|
]
|
|
2312
2342
|
|
|
2313
|
-
_version: ClassVar[str] = "1.0.
|
|
2314
|
-
_updated_at: ClassVar[str] = "2026-
|
|
2315
|
-
_change_note: ClassVar[Optional[str]] =
|
|
2343
|
+
_version: ClassVar[str] = "1.0.1"
|
|
2344
|
+
_updated_at: ClassVar[str] = "2026-06-01"
|
|
2345
|
+
_change_note: ClassVar[Optional[str]] = "Document out-of-hours modify silent no-op risk in AI metadata."
|
|
2316
2346
|
|
|
2317
2347
|
@classmethod
|
|
2318
2348
|
def get_field_schema(cls) -> Dict[str, "FieldSchema"]:
|
|
@@ -2424,6 +2454,11 @@ class KoreaStockCancelOrderNode(BaseModifyOrderNode):
|
|
|
2424
2454
|
"reason": "Every tick would fire a cancel request, exhausting the rate limit and generating spurious rejections.",
|
|
2425
2455
|
"alternative": "Use ThrottleNode or IfNode to gate the cancel trigger.",
|
|
2426
2456
|
},
|
|
2457
|
+
{
|
|
2458
|
+
"pattern": "Treating a cancel response with no error as a confirmed cancellation",
|
|
2459
|
+
"reason": "LS may return no error while not actually cancelling the order (e.g. outside KRX trading hours); the absence of an error is not proof of cancellation.",
|
|
2460
|
+
"alternative": "Re-query KoreaStockOpenOrdersNode after the cancel to confirm the order is gone before acting on it.",
|
|
2461
|
+
},
|
|
2427
2462
|
]
|
|
2428
2463
|
_examples: ClassVar[List[Dict[str, Any]]] = [
|
|
2429
2464
|
{
|
|
@@ -2519,6 +2554,7 @@ class KoreaStockCancelOrderNode(BaseModifyOrderNode):
|
|
|
2519
2554
|
"Cancelling an already-filled Korean stock order returns a KRX error — check status via OpenOrdersNode first",
|
|
2520
2555
|
"Paper trading is NOT supported for Korean domestic stocks — do not configure KoreaStockBrokerNode in paper mode",
|
|
2521
2556
|
"fallback.mode='error' (default) halts workflow on cancel failure — use 'skip' for best-effort cancel-all loops",
|
|
2557
|
+
"LS can return no error while leaving the order uncancelled (e.g. outside KRX trading hours 09:00-15:30 KST), so confirm cancellation by re-querying OpenOrdersNode afterward rather than trusting a clean response",
|
|
2522
2558
|
],
|
|
2523
2559
|
}
|
|
2524
2560
|
|
|
@@ -2548,9 +2584,9 @@ class KoreaStockCancelOrderNode(BaseModifyOrderNode):
|
|
|
2548
2584
|
),
|
|
2549
2585
|
]
|
|
2550
2586
|
|
|
2551
|
-
_version: ClassVar[str] = "1.0.
|
|
2552
|
-
_updated_at: ClassVar[str] = "2026-
|
|
2553
|
-
_change_note: ClassVar[Optional[str]] =
|
|
2587
|
+
_version: ClassVar[str] = "1.0.1"
|
|
2588
|
+
_updated_at: ClassVar[str] = "2026-06-01"
|
|
2589
|
+
_change_note: ClassVar[Optional[str]] = "Document out-of-hours cancel silent no-op risk in AI metadata."
|
|
2554
2590
|
|
|
2555
2591
|
@classmethod
|
|
2556
2592
|
def get_field_schema(cls) -> Dict[str, "FieldSchema"]:
|
|
File without changes
|
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/bases/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/bases/components.py
RENAMED
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/bases/listener.py
RENAMED
|
File without changes
|
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/bases/products.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/expression/__init__.py
RENAMED
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/expression/evaluator.py
RENAMED
|
File without changes
|
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/i18n/locales/en.json
RENAMED
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/i18n/locales/ko.json
RENAMED
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/i18n/translator.py
RENAMED
|
File without changes
|
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/models/__init__.py
RENAMED
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/models/connection_rule.py
RENAMED
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/models/credential.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/models/exchange.py
RENAMED
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/models/field_binding.py
RENAMED
|
File without changes
|
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/models/plugin_resource.py
RENAMED
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/models/resilience.py
RENAMED
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/models/resource.py
RENAMED
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/models/validation.py
RENAMED
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/models/workflow.py
RENAMED
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/__init__.py
RENAMED
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/account_futures.py
RENAMED
|
File without changes
|
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/account_stock.py
RENAMED
|
File without changes
|
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/backtest.py
RENAMED
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/backtest_futures.py
RENAMED
|
File without changes
|
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/backtest_stock.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/calculation.py
RENAMED
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/condition.py
RENAMED
|
File without changes
|
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/data_futures.py
RENAMED
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/data_korea_stock.py
RENAMED
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/data_stock.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/market_external.py
RENAMED
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/market_status.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/portfolio.py
RENAMED
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/realtime_futures.py
RENAMED
|
File without changes
|
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/realtime_stock.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/symbol_futures.py
RENAMED
|
File without changes
|
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/nodes/symbol_stock.py
RENAMED
|
File without changes
|
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/presets/__init__.py
RENAMED
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/presets/news_analyst.json
RENAMED
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/presets/risk_manager.json
RENAMED
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/presets/strategist.json
RENAMED
|
File without changes
|
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/registry/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/registry/node_registry.py
RENAMED
|
File without changes
|
|
File without changes
|
{programgarden_core-1.14.2 → programgarden_core-1.14.3}/programgarden_core/retry_executor.py
RENAMED
|
File without changes
|