programgarden-community 2.3.1__tar.gz → 2.3.2__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_community-2.3.1 → programgarden_community-2.3.2}/PKG-INFO +1 -1
- programgarden_community-2.3.2/programgarden_community/plugins/_replay_clock.py +30 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/roll_management/__init__.py +3 -1
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/time_based_exit/__init__.py +4 -1
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/pyproject.toml +1 -1
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/README.md +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/nodes/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/nodes/analysis/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/nodes/analysis/performance_report.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/nodes/messaging/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/nodes/messaging/telegram.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/nodes_registry.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/_position_qty.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/_ta_common.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/adx/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/aroon/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/atr/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/beta_hedge/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/bollinger_bands/README.md +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/bollinger_bands/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/breakout_retest/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/calendar_spread/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/calmar_ratio/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/cci/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/cmf/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/cmo/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/connors_rsi/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/contango_backwardation/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/coppock_curve/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/correlation_analysis/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/correlation_guard/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/dcf_fair_value/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/doji/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/drawdown_protection/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/dual_momentum/README.md +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/dual_momentum/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/dynamic_stop_loss/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/elder_ray/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/engulfing/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/ev_ebitda_screen/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/fisher_transform/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/golden_ratio/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/graham_number/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/hammer_shooting_star/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/heikin_ashi/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/hurst_exponent/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/ichimoku_cloud/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/kdj/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/kelly_criterion/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/keltner_channel/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/level_touch/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/ma_cross/README.md +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/ma_cross/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/macd/README.md +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/macd/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/magic_formula/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/market_internals/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/max_position_limit/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/mean_reversion/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/mfi/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/momentum_rank/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/morning_evening_star/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/multi_timeframe_confirmation/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/obv/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/pair_trading/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/parabolic_sar/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/partial_take_profit/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/piotroski_f_score/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/pivot_point/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/portfolio_optimizer/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/price_channel/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/profit_target/README.md +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/profit_target/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/qqe/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/regime_detection/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/relative_strength/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/risk_parity/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/rsi/README.md +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/rsi/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/rsi_divergence/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/schaff_trend_cycle/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/seasonal_filter/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/sharpe_ratio_monitor/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/sortino_ratio/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/squeeze_momentum/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/stochastic/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/stop_loss/README.md +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/stop_loss/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/supertrend/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/support_resistance_levels/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/tactical_asset_allocation/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/three_line_strike/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/time_series_momentum/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/trailing_stop/README.md +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/trailing_stop/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/trix/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/turtle_breakout/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/ultimate_oscillator/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/var_cvar_monitor/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/volatility_breakout/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/volatility_position_sizing/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/volume_spike/README.md +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/volume_spike/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/vortex_indicator/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/vwap/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/williams_r/__init__.py +0 -0
- {programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/plugins/z_score/__init__.py +0 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"""The replay fixture clock for plugins that read the current date or time.
|
|
2
|
+
|
|
3
|
+
A credential-free replay (programgarden ``validation_replay``) runs a workflow
|
|
4
|
+
at one fixed instant, ``context.validation_as_of`` (an ISO-8601 string with a
|
|
5
|
+
timezone). A plugin that compares a stored or parsed date with "now" reads that
|
|
6
|
+
instant instead of the wall clock, so the same replay always takes the same
|
|
7
|
+
branch. Live contexts have no ``validation_as_of`` and keep the wall clock.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from datetime import datetime
|
|
11
|
+
from typing import Any, Optional
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def fixture_now(context: Any) -> Optional[datetime]:
|
|
15
|
+
"""The replay instant as a naive datetime in its own offset, or None live.
|
|
16
|
+
|
|
17
|
+
Same rule as ``programgarden_core.expression.evaluator.DateNamespace``: the
|
|
18
|
+
instant keeps the wall time of the offset it was written in.
|
|
19
|
+
"""
|
|
20
|
+
value = getattr(context, "validation_as_of", None) if context is not None else None
|
|
21
|
+
if not isinstance(value, str) or not value:
|
|
22
|
+
return None
|
|
23
|
+
try:
|
|
24
|
+
instant = datetime.fromisoformat(value.replace("Z", "+00:00"))
|
|
25
|
+
except ValueError:
|
|
26
|
+
return None
|
|
27
|
+
if instant.tzinfo is None or instant.utcoffset() is None:
|
|
28
|
+
return None
|
|
29
|
+
return instant.replace(tzinfo=None)
|
|
30
|
+
|
|
@@ -32,6 +32,7 @@ from programgarden_core.registry import PluginSchema
|
|
|
32
32
|
from programgarden_core.registry.plugin_registry import PluginCategory, ProductType
|
|
33
33
|
|
|
34
34
|
from .._position_qty import coerce_number, preserve_qty
|
|
35
|
+
from .._replay_clock import fixture_now
|
|
35
36
|
|
|
36
37
|
logger = logging.getLogger(__name__)
|
|
37
38
|
|
|
@@ -174,7 +175,8 @@ async def roll_management_condition(
|
|
|
174
175
|
"analysis": {"error": "No positions data"},
|
|
175
176
|
}
|
|
176
177
|
|
|
177
|
-
|
|
178
|
+
# A replay judges the expiry distance at its fixture instant (live: wall clock).
|
|
179
|
+
now = fixture_now(context) or datetime.now()
|
|
178
180
|
passed, failed, symbol_results = [], [], []
|
|
179
181
|
|
|
180
182
|
# strategy_state 접근 — 메서드 이름·호출 규약은 **실제 트래커**(WorkflowRiskTracker)에
|
|
@@ -64,6 +64,7 @@ from programgarden_core.registry import PluginSchema
|
|
|
64
64
|
from programgarden_core.registry.plugin_registry import PluginCategory, ProductType
|
|
65
65
|
|
|
66
66
|
from .._position_qty import preserve_qty
|
|
67
|
+
from .._replay_clock import fixture_now
|
|
67
68
|
|
|
68
69
|
logger = logging.getLogger(__name__)
|
|
69
70
|
|
|
@@ -227,7 +228,9 @@ async def time_based_exit_condition(
|
|
|
227
228
|
"analysis": {"error": "No positions data", "stale_state_cleared": stale},
|
|
228
229
|
}
|
|
229
230
|
|
|
230
|
-
|
|
231
|
+
# A replay counts holding days at its fixture date (live: wall clock).
|
|
232
|
+
_fixture_instant = fixture_now(context)
|
|
233
|
+
today = _fixture_instant.date() if _fixture_instant is not None else date.today()
|
|
231
234
|
today_str = today.isoformat()
|
|
232
235
|
|
|
233
236
|
passed, failed, symbol_results = [], [], []
|
|
@@ -5,7 +5,7 @@ authors = [
|
|
|
5
5
|
homepage = "https://programgarden.com"
|
|
6
6
|
requires-python = ">=3.12"
|
|
7
7
|
name = "programgarden-community"
|
|
8
|
-
version = "2.3.
|
|
8
|
+
version = "2.3.2"
|
|
9
9
|
license = "AGPL-3.0-or-later"
|
|
10
10
|
description = "ProgramGarden Community - 전략 플러그인 모음"
|
|
11
11
|
readme = "README.md"
|
|
File without changes
|
{programgarden_community-2.3.1 → programgarden_community-2.3.2}/programgarden_community/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|