opencode-pyneruntime 6.6.4__py3-none-any.whl
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.
- opencode_pyneruntime-6.6.4.dist-info/METADATA +281 -0
- opencode_pyneruntime-6.6.4.dist-info/RECORD +261 -0
- opencode_pyneruntime-6.6.4.dist-info/WHEEL +5 -0
- opencode_pyneruntime-6.6.4.dist-info/entry_points.txt +6 -0
- opencode_pyneruntime-6.6.4.dist-info/licenses/LICENSE +201 -0
- opencode_pyneruntime-6.6.4.dist-info/licenses/NOTICE +21 -0
- opencode_pyneruntime-6.6.4.dist-info/top_level.txt +1 -0
- pynecore/__init__.py +6 -0
- pynecore/cli/__init__.py +2 -0
- pynecore/cli/app.py +238 -0
- pynecore/cli/commands/__init__.py +343 -0
- pynecore/cli/commands/benchmark.py +186 -0
- pynecore/cli/commands/compile.py +198 -0
- pynecore/cli/commands/data.py +857 -0
- pynecore/cli/commands/debug.py +63 -0
- pynecore/cli/commands/optimize.py +956 -0
- pynecore/cli/commands/plugin.py +242 -0
- pynecore/cli/commands/run.py +2006 -0
- pynecore/cli/pluggable.py +132 -0
- pynecore/cli/utils/__init__.py +0 -0
- pynecore/cli/utils/api_error_handler.py +168 -0
- pynecore/cli/utils/broker_picker.py +330 -0
- pynecore/cli/utils/error_hook.py +28 -0
- pynecore/cli/utils/keyreader.py +178 -0
- pynecore/cli/utils/provider_picker.py +19 -0
- pynecore/cli/utils/symbol_browser.py +1149 -0
- pynecore/core/__init__.py +0 -0
- pynecore/core/aggregator.py +257 -0
- pynecore/core/bar_magnifier.py +168 -0
- pynecore/core/broker/__init__.py +64 -0
- pynecore/core/broker/defaults.py +113 -0
- pynecore/core/broker/disappearance.py +927 -0
- pynecore/core/broker/emulator.py +345 -0
- pynecore/core/broker/exceptions.py +346 -0
- pynecore/core/broker/idempotency.py +401 -0
- pynecore/core/broker/intent_builder.py +334 -0
- pynecore/core/broker/journal.py +1785 -0
- pynecore/core/broker/models.py +1600 -0
- pynecore/core/broker/native_failsafe_manager.py +1436 -0
- pynecore/core/broker/one_way_emulator.py +1128 -0
- pynecore/core/broker/position.py +787 -0
- pynecore/core/broker/run_identity.py +126 -0
- pynecore/core/broker/software_entry_stop_engine.py +351 -0
- pynecore/core/broker/software_partial_bracket_engine.py +1379 -0
- pynecore/core/broker/spot_inventory.py +1327 -0
- pynecore/core/broker/storage.py +2655 -0
- pynecore/core/broker/store_helpers.py +2161 -0
- pynecore/core/broker/sync_engine.py +16070 -0
- pynecore/core/broker/validation.py +382 -0
- pynecore/core/class_property.py +7 -0
- pynecore/core/config.py +392 -0
- pynecore/core/csv_file.py +547 -0
- pynecore/core/currency.py +262 -0
- pynecore/core/data_converter.py +1002 -0
- pynecore/core/datetime.py +296 -0
- pynecore/core/download_info.py +71 -0
- pynecore/core/download_runner.py +274 -0
- pynecore/core/htf_aggregator.py +181 -0
- pynecore/core/import_hook.py +358 -0
- pynecore/core/instance_state.py +494 -0
- pynecore/core/live_ltf_collector.py +442 -0
- pynecore/core/live_ltf_window.py +189 -0
- pynecore/core/live_runner.py +1347 -0
- pynecore/core/module_property.py +26 -0
- pynecore/core/ohlcv_file.py +1888 -0
- pynecore/core/overload.py +371 -0
- pynecore/core/pine_cast.py +113 -0
- pynecore/core/pine_export.py +95 -0
- pynecore/core/pine_method.py +244 -0
- pynecore/core/pine_range.py +86 -0
- pynecore/core/pine_udt.py +69 -0
- pynecore/core/plugin/__init__.py +394 -0
- pynecore/core/plugin/broker.py +781 -0
- pynecore/core/plugin/cli.py +96 -0
- pynecore/core/plugin/live_provider.py +208 -0
- pynecore/core/plugin/provider.py +331 -0
- pynecore/core/provider_string.py +148 -0
- pynecore/core/random.py +40 -0
- pynecore/core/resampler.py +686 -0
- pynecore/core/safe_convert.py +64 -0
- pynecore/core/script.py +1011 -0
- pynecore/core/script_runner.py +3202 -0
- pynecore/core/security.py +1749 -0
- pynecore/core/security_process.py +1253 -0
- pynecore/core/security_shm.py +456 -0
- pynecore/core/series.py +417 -0
- pynecore/core/strategy_stats.py +669 -0
- pynecore/core/symbol_map.py +134 -0
- pynecore/core/syminfo.py +505 -0
- pynecore/core/viz.py +591 -0
- pynecore/lib/__init__.py +1771 -0
- pynecore/lib/_fixnan.py +32 -0
- pynecore/lib/_math_stateful.py +202 -0
- pynecore/lib/_timeframe_change.py +101 -0
- pynecore/lib/adjustment.py +6 -0
- pynecore/lib/alert.py +39 -0
- pynecore/lib/alert.pyi +14 -0
- pynecore/lib/array.py +1051 -0
- pynecore/lib/barmerge.py +60 -0
- pynecore/lib/barstate.py +30 -0
- pynecore/lib/box.py +415 -0
- pynecore/lib/chart.py +128 -0
- pynecore/lib/color.py +152 -0
- pynecore/lib/color.pyi +50 -0
- pynecore/lib/currency.py +62 -0
- pynecore/lib/dayofweek.py +36 -0
- pynecore/lib/dayofweek.pyi +18 -0
- pynecore/lib/display.py +8 -0
- pynecore/lib/dividends.py +9 -0
- pynecore/lib/earnings.py +11 -0
- pynecore/lib/extend.py +6 -0
- pynecore/lib/font.py +5 -0
- pynecore/lib/footprint.py +79 -0
- pynecore/lib/format.py +11 -0
- pynecore/lib/hline.py +67 -0
- pynecore/lib/hline.pyi +24 -0
- pynecore/lib/label.py +409 -0
- pynecore/lib/line.py +433 -0
- pynecore/lib/linefill.py +93 -0
- pynecore/lib/location.py +11 -0
- pynecore/lib/log.py +362 -0
- pynecore/lib/map.py +150 -0
- pynecore/lib/math.py +385 -0
- pynecore/lib/matrix.py +708 -0
- pynecore/lib/order.py +8 -0
- pynecore/lib/pivotpointtype.py +8 -0
- pynecore/lib/plot.py +95 -0
- pynecore/lib/plot.pyi +33 -0
- pynecore/lib/polyline.py +91 -0
- pynecore/lib/position.py +15 -0
- pynecore/lib/request.py +281 -0
- pynecore/lib/runtime.py +5 -0
- pynecore/lib/scale.py +9 -0
- pynecore/lib/session.py +267 -0
- pynecore/lib/session.pyi +12 -0
- pynecore/lib/shape.py +18 -0
- pynecore/lib/size.py +12 -0
- pynecore/lib/splits.py +4 -0
- pynecore/lib/strategy/__init__.py +4778 -0
- pynecore/lib/strategy/closedtrades.py +347 -0
- pynecore/lib/strategy/closedtrades.pyi +53 -0
- pynecore/lib/strategy/commission.py +9 -0
- pynecore/lib/strategy/direction.py +9 -0
- pynecore/lib/strategy/oca.py +13 -0
- pynecore/lib/strategy/opentrades.py +281 -0
- pynecore/lib/strategy/opentrades.pyi +49 -0
- pynecore/lib/strategy/risk.py +109 -0
- pynecore/lib/string.py +649 -0
- pynecore/lib/syminfo.py +84 -0
- pynecore/lib/ta.py +2230 -0
- pynecore/lib/table.py +290 -0
- pynecore/lib/text.py +17 -0
- pynecore/lib/ticker.py +207 -0
- pynecore/lib/timeframe.py +293 -0
- pynecore/lib/volume_row.py +67 -0
- pynecore/lib/xloc.py +4 -0
- pynecore/lib/yloc.py +5 -0
- pynecore/providers/__init__.py +0 -0
- pynecore/providers/ccxt.py +664 -0
- pynecore/providers/replay.py +187 -0
- pynecore/pynesys/__init__.py +0 -0
- pynecore/pynesys/api.py +498 -0
- pynecore/pynesys/compiler.py +112 -0
- pynecore/standalone.py +99 -0
- pynecore/testing/__init__.py +1 -0
- pynecore/testing/broker_lab/__init__.py +41 -0
- pynecore/testing/broker_lab/__main__.py +5 -0
- pynecore/testing/broker_lab/cli.py +87 -0
- pynecore/testing/broker_lab/generate.py +47 -0
- pynecore/testing/broker_lab/model.py +84 -0
- pynecore/testing/broker_lab/reference.py +645 -0
- pynecore/testing/broker_lab/runner.py +372 -0
- pynecore/testing/broker_lab/scheduler.py +50 -0
- pynecore/testing/broker_lab/subprocess.py +73 -0
- pynecore/transformers/__init__.py +0 -0
- pynecore/transformers/builtin_shadow.py +136 -0
- pynecore/transformers/closure_arguments_transformer.py +428 -0
- pynecore/transformers/display_rewrite.py +140 -0
- pynecore/transformers/dynamic_default.py +147 -0
- pynecore/transformers/function_isolation.py +757 -0
- pynecore/transformers/import_lifter.py +61 -0
- pynecore/transformers/import_normalizer.py +328 -0
- pynecore/transformers/inline_series_hoist.py +178 -0
- pynecore/transformers/input_transformer.py +175 -0
- pynecore/transformers/lib_series.py +201 -0
- pynecore/transformers/locations.py +70 -0
- pynecore/transformers/module_properties.json +3387 -0
- pynecore/transformers/module_property.py +221 -0
- pynecore/transformers/ne_guard.py +70 -0
- pynecore/transformers/persistent.py +320 -0
- pynecore/transformers/persistent_series.py +76 -0
- pynecore/transformers/safe_convert_transformer.py +97 -0
- pynecore/transformers/safe_division_transformer.py +95 -0
- pynecore/transformers/script_requirements.py +308 -0
- pynecore/transformers/security.py +752 -0
- pynecore/transformers/security_instantiation.py +274 -0
- pynecore/transformers/series.py +275 -0
- pynecore/transformers/slot_layout.py +381 -0
- pynecore/transformers/type_checking_stripper.py +25 -0
- pynecore/transformers/unused_series_detector.py +267 -0
- pynecore/types/__init__.py +21 -0
- pynecore/types/alert.py +5 -0
- pynecore/types/barmerge.py +5 -0
- pynecore/types/base.py +39 -0
- pynecore/types/box.py +37 -0
- pynecore/types/chart.py +17 -0
- pynecore/types/color.py +107 -0
- pynecore/types/currency.py +5 -0
- pynecore/types/datetime.py +6 -0
- pynecore/types/display.py +5 -0
- pynecore/types/dividends.py +5 -0
- pynecore/types/earnings.py +5 -0
- pynecore/types/extend.py +5 -0
- pynecore/types/font.py +5 -0
- pynecore/types/footprint.py +41 -0
- pynecore/types/format.py +5 -0
- pynecore/types/hline.py +24 -0
- pynecore/types/ib_persistent.py +8 -0
- pynecore/types/ib_persistent.pyi +10 -0
- pynecore/types/label.py +35 -0
- pynecore/types/line.py +32 -0
- pynecore/types/linefill.py +13 -0
- pynecore/types/location.py +5 -0
- pynecore/types/matrix.py +999 -0
- pynecore/types/na.py +237 -0
- pynecore/types/na.pyi +83 -0
- pynecore/types/ohlcv.py +12 -0
- pynecore/types/order.py +5 -0
- pynecore/types/persistent.py +8 -0
- pynecore/types/persistent.pyi +13 -0
- pynecore/types/pine_types.py +11 -0
- pynecore/types/pine_types.pyi +15 -0
- pynecore/types/pivotpointtype.py +5 -0
- pynecore/types/plot.py +12 -0
- pynecore/types/plot_meta.py +60 -0
- pynecore/types/polyline.py +40 -0
- pynecore/types/position.py +5 -0
- pynecore/types/scale.py +5 -0
- pynecore/types/script_type.py +15 -0
- pynecore/types/series.py +23 -0
- pynecore/types/series.pyi +19 -0
- pynecore/types/session.py +35 -0
- pynecore/types/shape.py +5 -0
- pynecore/types/size.py +5 -0
- pynecore/types/source.py +33 -0
- pynecore/types/splits.py +5 -0
- pynecore/types/strategy.py +45 -0
- pynecore/types/table.py +87 -0
- pynecore/types/text.py +13 -0
- pynecore/types/type_checker.py +7 -0
- pynecore/types/type_checker.pyi +48 -0
- pynecore/types/volume_row.py +36 -0
- pynecore/types/weekdays.py +11 -0
- pynecore/types/xloc.py +5 -0
- pynecore/types/yloc.py +5 -0
- pynecore/utils/__init__.py +0 -0
- pynecore/utils/file_utils.py +50 -0
- pynecore/utils/rich/__init__.py +0 -0
- pynecore/utils/rich/date_column.py +25 -0
- pynecore/utils/sequence_view.py +92 -0
- pynecore/utils/stdlib_checker.py +17 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Dynamic Default Transformer
|
|
3
|
+
|
|
4
|
+
Rewrites function-parameter defaults that reference per-bar runtime state
|
|
5
|
+
(any ``lib.*`` expression — ``lib.hl2``, ``lib.close``, ...) so they are
|
|
6
|
+
evaluated per CALL instead of at ``def`` time.
|
|
7
|
+
|
|
8
|
+
Why: Pine semantics. ``export ao(series float source = hl2)`` means "the
|
|
9
|
+
caller omitted the argument, use the CURRENT bar's hl2". A Python def-time
|
|
10
|
+
default freezes one value. Per-bar redefinition of the function does not
|
|
11
|
+
save the day either: an anchored call site (see ``instance_state``) binds
|
|
12
|
+
the callee closure once — an ``Exported`` library proxy keeps a stable
|
|
13
|
+
identity across bars, so the hot-path identity check keeps reusing the
|
|
14
|
+
FIRST bar's closure and with it the first bar's frozen default.
|
|
15
|
+
|
|
16
|
+
Transformation::
|
|
17
|
+
|
|
18
|
+
# Before
|
|
19
|
+
def ao(source: float = lib.hl2, shortLength: int = 5):
|
|
20
|
+
...
|
|
21
|
+
|
|
22
|
+
# After
|
|
23
|
+
def ao(source: float = __dyn_default__, shortLength: int = 5):
|
|
24
|
+
if source is __dyn_default__:
|
|
25
|
+
source = lib.hl2
|
|
26
|
+
...
|
|
27
|
+
|
|
28
|
+
Only defaults containing a ``lib`` reference are rewritten — plain constants
|
|
29
|
+
(``5``, ``'x'``) keep the zero-cost def-time path. Script entry points
|
|
30
|
+
(``@lib.script.indicator/strategy/library``) are skipped: their defaults are
|
|
31
|
+
``input.*()`` calls consumed by the input machinery at def time. Class bodies
|
|
32
|
+
(compiled Protocol stubs) are skipped too.
|
|
33
|
+
|
|
34
|
+
Must run after ImportNormalizerTransformer (references are ``lib.*``-
|
|
35
|
+
qualified) and before the series/isolation passes (the moved expressions
|
|
36
|
+
must participate in them like any other body statement).
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
import ast
|
|
40
|
+
|
|
41
|
+
__all__ = ['DynamicDefaultTransformer']
|
|
42
|
+
|
|
43
|
+
_SCRIPT_ENTRY_DECORATORS = frozenset({'indicator', 'strategy', 'library'})
|
|
44
|
+
_SENTINEL_NAME = '__dyn_default__'
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class DynamicDefaultTransformer(ast.NodeTransformer):
|
|
48
|
+
"""Move ``lib.*``-referencing parameter defaults into per-call prologues."""
|
|
49
|
+
|
|
50
|
+
def __init__(self):
|
|
51
|
+
self._changed = False
|
|
52
|
+
|
|
53
|
+
@staticmethod
|
|
54
|
+
def _is_script_entry(node: ast.FunctionDef | ast.AsyncFunctionDef) -> bool:
|
|
55
|
+
"""Whether the function is a ``@script.indicator/strategy/library`` entry."""
|
|
56
|
+
for dec in node.decorator_list:
|
|
57
|
+
target = dec.func if isinstance(dec, ast.Call) else dec
|
|
58
|
+
if not (isinstance(target, ast.Attribute)
|
|
59
|
+
and target.attr in _SCRIPT_ENTRY_DECORATORS):
|
|
60
|
+
continue
|
|
61
|
+
parent = target.value
|
|
62
|
+
if isinstance(parent, ast.Name) and parent.id == 'script':
|
|
63
|
+
return True
|
|
64
|
+
if isinstance(parent, ast.Attribute) and parent.attr == 'script':
|
|
65
|
+
return True
|
|
66
|
+
return False
|
|
67
|
+
|
|
68
|
+
@staticmethod
|
|
69
|
+
def _is_dynamic(expr: ast.expr) -> bool:
|
|
70
|
+
"""Whether the default expression references runtime ``lib`` state."""
|
|
71
|
+
return any(isinstance(n, ast.Name) and n.id == 'lib' for n in ast.walk(expr))
|
|
72
|
+
|
|
73
|
+
def _prologue_if(self, param_name: str, default: ast.expr) -> ast.If:
|
|
74
|
+
"""Build ``if <param> is __dyn_default__: <param> = <default>``."""
|
|
75
|
+
return ast.If(
|
|
76
|
+
test=ast.Compare(
|
|
77
|
+
left=ast.Name(id=param_name, ctx=ast.Load()),
|
|
78
|
+
ops=[ast.Is()],
|
|
79
|
+
comparators=[ast.Name(id=_SENTINEL_NAME, ctx=ast.Load())],
|
|
80
|
+
),
|
|
81
|
+
body=[ast.Assign(
|
|
82
|
+
targets=[ast.Name(id=param_name, ctx=ast.Store())],
|
|
83
|
+
value=default,
|
|
84
|
+
)],
|
|
85
|
+
orelse=[],
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
def visit_ClassDef(self, node: ast.ClassDef) -> ast.ClassDef:
|
|
89
|
+
# Protocol stubs in compiled libraries carry the same dynamic defaults
|
|
90
|
+
# in their signatures, but they are never called — leave them alone.
|
|
91
|
+
return node
|
|
92
|
+
|
|
93
|
+
def _process_func(self, node: ast.FunctionDef | ast.AsyncFunctionDef):
|
|
94
|
+
if self._is_script_entry(node):
|
|
95
|
+
# Entry defaults are input.*() calls consumed at def time by the
|
|
96
|
+
# input machinery — but inner functions still need the rewrite.
|
|
97
|
+
self.generic_visit(node)
|
|
98
|
+
return node
|
|
99
|
+
|
|
100
|
+
prologue: list[ast.If] = []
|
|
101
|
+
|
|
102
|
+
positional = node.args.posonlyargs + node.args.args
|
|
103
|
+
defaults = node.args.defaults
|
|
104
|
+
offset = len(positional) - len(defaults)
|
|
105
|
+
for i, default in enumerate(defaults):
|
|
106
|
+
if not self._is_dynamic(default):
|
|
107
|
+
continue
|
|
108
|
+
pname = positional[offset + i].arg
|
|
109
|
+
prologue.append(self._prologue_if(pname, default))
|
|
110
|
+
defaults[i] = ast.Name(id=_SENTINEL_NAME, ctx=ast.Load())
|
|
111
|
+
|
|
112
|
+
for i, default in enumerate(node.args.kw_defaults):
|
|
113
|
+
if default is None or not self._is_dynamic(default):
|
|
114
|
+
continue
|
|
115
|
+
pname = node.args.kwonlyargs[i].arg
|
|
116
|
+
prologue.append(self._prologue_if(pname, default))
|
|
117
|
+
node.args.kw_defaults[i] = ast.Name(id=_SENTINEL_NAME, ctx=ast.Load())
|
|
118
|
+
|
|
119
|
+
if prologue:
|
|
120
|
+
self._changed = True
|
|
121
|
+
# Keep a leading docstring first
|
|
122
|
+
insert_at = 0
|
|
123
|
+
if (node.body and isinstance(node.body[0], ast.Expr)
|
|
124
|
+
and isinstance(node.body[0].value, ast.Constant)
|
|
125
|
+
and isinstance(node.body[0].value.value, str)):
|
|
126
|
+
insert_at = 1
|
|
127
|
+
node.body[insert_at:insert_at] = prologue
|
|
128
|
+
|
|
129
|
+
self.generic_visit(node)
|
|
130
|
+
return node
|
|
131
|
+
|
|
132
|
+
def visit_FunctionDef(self, node: ast.FunctionDef) -> ast.FunctionDef:
|
|
133
|
+
return self._process_func(node) # type: ignore[return-value]
|
|
134
|
+
|
|
135
|
+
def visit_AsyncFunctionDef(self, node: ast.AsyncFunctionDef) -> ast.AsyncFunctionDef:
|
|
136
|
+
return self._process_func(node) # type: ignore[return-value]
|
|
137
|
+
|
|
138
|
+
def visit_Module(self, node: ast.Module) -> ast.Module:
|
|
139
|
+
self._changed = False
|
|
140
|
+
node = self.generic_visit(node) # type: ignore[assignment]
|
|
141
|
+
if self._changed:
|
|
142
|
+
node.body.insert(0, ast.ImportFrom(
|
|
143
|
+
module='pynecore.core.instance_state',
|
|
144
|
+
names=[ast.alias(name=_SENTINEL_NAME, asname=None)],
|
|
145
|
+
level=0,
|
|
146
|
+
))
|
|
147
|
+
return node
|