programgarden 1.25.0__tar.gz → 1.27.0__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-1.25.0 → programgarden-1.27.0}/PKG-INFO +2 -2
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/__init__.py +1 -1
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/deep_fixtures.py +57 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/executor.py +689 -196
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/resolver.py +194 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/pyproject.toml +2 -2
- {programgarden-1.25.0 → programgarden-1.27.0}/README.md +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/binding_validator.py +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/client.py +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/code_worker.py +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/context.py +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/database/__init__.py +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/database/checkpoint_manager.py +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/database/query_builder.py +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/database/workflow_position_tracker.py +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/database/workflow_risk_tracker.py +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/node_runner.py +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/plugin/__init__.py +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/plugin/sandbox.py +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/providers/__init__.py +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/providers/llm_errors.py +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/providers/llm_provider.py +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/reconnect_handler.py +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/resource/__init__.py +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/resource/context.py +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/resource/limiter.py +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/resource/monitor.py +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/resource/throttle.py +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/semantic_rules.py +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/tools/__init__.py +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/tools/credential_tools.py +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/tools/definition_tools.py +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/tools/event_tools.py +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/tools/job_tools.py +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/tools/registry_tools.py +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/tools/sqlite_tools.py +0 -0
- {programgarden-1.25.0 → programgarden-1.27.0}/programgarden/validation_recommender.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: programgarden
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.27.0
|
|
4
4
|
Summary: ProgramGarden - 노드 기반 자동매매 DSL 실행 엔진
|
|
5
5
|
License-Expression: AGPL-3.0-or-later
|
|
6
6
|
Author: 프로그램동산
|
|
@@ -16,7 +16,7 @@ Requires-Dist: croniter (>=6.0.0,<7.0.0)
|
|
|
16
16
|
Requires-Dist: litellm (>=1.40.0)
|
|
17
17
|
Requires-Dist: lxml (>=6.0.2,<7.0.0)
|
|
18
18
|
Requires-Dist: programgarden-community (>=1.13.11,<2.0.0)
|
|
19
|
-
Requires-Dist: programgarden-core (>=1.
|
|
19
|
+
Requires-Dist: programgarden-core (>=1.18.0,<2.0.0)
|
|
20
20
|
Requires-Dist: programgarden-finance (>=1.6.14,<2.0.0)
|
|
21
21
|
Requires-Dist: psutil (>=6.0.0,<7.0.0)
|
|
22
22
|
Requires-Dist: psycopg2-binary (>=2.9.11,<3.0.0)
|
|
@@ -318,6 +318,63 @@ def real_order_event_fixture(config: Dict[str, Any]) -> Dict[str, Any]:
|
|
|
318
318
|
}
|
|
319
319
|
|
|
320
320
|
|
|
321
|
+
def futures_contract_fixture(config: Dict[str, Any]) -> Dict[str, Any]:
|
|
322
|
+
"""FuturesContractNode deep fixture (no o3101 master query).
|
|
323
|
+
|
|
324
|
+
Real shape: ``{"symbols": [{exchange, symbol}], "contracts": [...], "count": int}``.
|
|
325
|
+
|
|
326
|
+
The month code is derived from the fixture anchor, not the wall clock, so a deep
|
|
327
|
+
run is reproducible. The *symbol string* is therefore not a real listed contract —
|
|
328
|
+
that is fine and deliberate: deep_validate checks field/type/flow integrity, and
|
|
329
|
+
downstream fixtures key off the symbol string only as an opaque identifier.
|
|
330
|
+
"""
|
|
331
|
+
raw = config.get("base_products") or []
|
|
332
|
+
if isinstance(raw, str):
|
|
333
|
+
raw = [p.strip() for p in raw.split(",") if p.strip()]
|
|
334
|
+
products = [str(p).strip().upper() for p in raw if str(p).strip()] or ["HMH"]
|
|
335
|
+
|
|
336
|
+
# 거래소는 ExchCd 로 정규화한다. config 값을 그대로 되뱉으면, 형제 노드의 enum('6')을
|
|
337
|
+
# 넣은 워크플로우가 게이트를 통과한 뒤 첫 라이브 실행에서만 죽는다 — 게이트의 존재 이유가 없어진다.
|
|
338
|
+
_ENUM_TO_EXCHCD = {"1": "", "2": "CME", "3": "SGX", "4": "EUREX", "5": "ICE", "6": "HKEX", "7": "OSE"}
|
|
339
|
+
exchange = str(config.get("futures_exchange") or "").strip().upper()
|
|
340
|
+
exchange = _ENUM_TO_EXCHCD.get(exchange, exchange) or "HKEX"
|
|
341
|
+
|
|
342
|
+
# 월물 문자 코드 (F=1월 … Z=12월) — 실제 노드와 같은 표기를 쓴다.
|
|
343
|
+
# contract_selection 을 실제 노드와 같은 규칙으로 반영한다(front=당월, next=익월,
|
|
344
|
+
# quarterly=3·6·9·12월 중 최근접). fixture 가 이걸 무시하면 세 설정이 같은 심볼을 내
|
|
345
|
+
# 배선 검증이 selection 오류를 못 잡는다.
|
|
346
|
+
month_letters = "FGHJKMNQUVXZ"
|
|
347
|
+
selection = str(config.get("contract_selection") or "front").strip().lower()
|
|
348
|
+
month = _FIXTURE_ANCHOR.month
|
|
349
|
+
if selection == "next":
|
|
350
|
+
month += 1
|
|
351
|
+
elif selection == "quarterly":
|
|
352
|
+
while month % 3:
|
|
353
|
+
month += 1
|
|
354
|
+
year = _FIXTURE_ANCHOR.year + (month - 1) // 12
|
|
355
|
+
month = (month - 1) % 12 + 1
|
|
356
|
+
letter = month_letters[month - 1]
|
|
357
|
+
yy = f"{year % 100:02d}"
|
|
358
|
+
|
|
359
|
+
contracts: List[Dict[str, Any]] = []
|
|
360
|
+
for product in products:
|
|
361
|
+
contracts.append(
|
|
362
|
+
{
|
|
363
|
+
"symbol": f"{product}{letter}{yy}",
|
|
364
|
+
"exchange": exchange,
|
|
365
|
+
"base_product": product,
|
|
366
|
+
"base_product_name": product,
|
|
367
|
+
"name": f"{product}({year}.{month:02d})",
|
|
368
|
+
"contract_month": f"{year:04d}-{month:02d}",
|
|
369
|
+
}
|
|
370
|
+
)
|
|
371
|
+
return {
|
|
372
|
+
"symbols": [{"exchange": c["exchange"], "symbol": c["symbol"]} for c in contracts],
|
|
373
|
+
"contracts": contracts,
|
|
374
|
+
"count": len(contracts),
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
|
|
321
378
|
def market_status_fixture(config: Dict[str, Any]) -> Dict[str, Any]:
|
|
322
379
|
"""MarketStatusNode deep fixture (markets open).
|
|
323
380
|
|