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,148 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Parse provider strings used in ``pyne run`` and ``request.security()``.
|
|
3
|
+
|
|
4
|
+
Format::
|
|
5
|
+
|
|
6
|
+
<provider>:<symbol>@<timeframe>
|
|
7
|
+
|
|
8
|
+
Examples::
|
|
9
|
+
|
|
10
|
+
ccxt:BYBIT:BTC/USDT:USDT@1D # CCXT, Bybit futures, daily
|
|
11
|
+
ccxt:BINANCE:ETH/USDT@240 # CCXT, Binance spot, 4-hour
|
|
12
|
+
capitalcom:EURUSD@60 # Capital.com, EURUSD, 1-hour
|
|
13
|
+
|
|
14
|
+
The ``@timeframe`` suffix is only required in ``pyne run`` (the main data
|
|
15
|
+
source). In ``request.security()`` the timeframe is a separate parameter,
|
|
16
|
+
so the provider string contains only ``<provider>:<symbol>``.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
from dataclasses import dataclass
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@dataclass(frozen=True)
|
|
25
|
+
class ProviderString:
|
|
26
|
+
"""Parsed components of a provider string."""
|
|
27
|
+
|
|
28
|
+
provider: str
|
|
29
|
+
"""Plugin entry point name (e.g. ``"ccxt"``, ``"capitalcom"``)."""
|
|
30
|
+
|
|
31
|
+
symbol: str
|
|
32
|
+
"""Symbol in provider-specific format (e.g. ``"BTC/USDT:USDT"``).
|
|
33
|
+
|
|
34
|
+
For multi-broker providers the broker prefix is split off into
|
|
35
|
+
:attr:`broker`, so this holds only the instrument; for single-broker
|
|
36
|
+
providers the whole symbol is kept verbatim. May be an empty string
|
|
37
|
+
for a broker-only string such as ``"ccxt:BYBIT"``.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
timeframe: str | None = None
|
|
41
|
+
"""Timeframe in TradingView format (e.g. ``"1D"``), or None if not specified."""
|
|
42
|
+
|
|
43
|
+
broker: str | None = None
|
|
44
|
+
"""Broker / exchange selector for multi-broker providers (e.g. ``"BYBIT"``),
|
|
45
|
+
or ``None`` for single-broker providers."""
|
|
46
|
+
|
|
47
|
+
@property
|
|
48
|
+
def provider_symbol(self) -> str:
|
|
49
|
+
"""Symbol in the form the provider plugin expects.
|
|
50
|
+
|
|
51
|
+
Multi-broker providers receive the broker folded back into the
|
|
52
|
+
symbol (``"BYBIT:BTC/USDT:USDT"``) and split it off internally; a
|
|
53
|
+
broker-only string yields just the broker so the provider can list
|
|
54
|
+
that broker's symbols. Single-broker providers get :attr:`symbol`
|
|
55
|
+
unchanged.
|
|
56
|
+
"""
|
|
57
|
+
if self.broker:
|
|
58
|
+
return f"{self.broker}:{self.symbol}" if self.symbol else self.broker
|
|
59
|
+
return self.symbol
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def is_provider_string(value: str) -> bool:
|
|
63
|
+
"""
|
|
64
|
+
Check whether a string looks like a provider string rather than a file path.
|
|
65
|
+
|
|
66
|
+
A provider string contains ``:`` and its first segment (before the first ``:``)
|
|
67
|
+
does not look like a drive letter or path component.
|
|
68
|
+
|
|
69
|
+
:param value: The string to check.
|
|
70
|
+
:return: True if it looks like a provider string.
|
|
71
|
+
"""
|
|
72
|
+
if ':' not in value:
|
|
73
|
+
return False
|
|
74
|
+
first_segment = value.split(':', 1)[0]
|
|
75
|
+
if len(first_segment) == 1 and first_segment.isalpha():
|
|
76
|
+
return False
|
|
77
|
+
return True
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def parse_provider_string(value: str, *, require_timeframe: bool = False,
|
|
81
|
+
multi_broker: bool = False) -> ProviderString:
|
|
82
|
+
"""
|
|
83
|
+
Parse a provider string into its components.
|
|
84
|
+
|
|
85
|
+
:param value: The provider string (e.g. ``"ccxt:BYBIT:BTC/USDT:USDT@1D"``).
|
|
86
|
+
:param require_timeframe: If True, raise ValueError when ``@timeframe`` is missing.
|
|
87
|
+
:param multi_broker: If True, treat the first segment after the provider name
|
|
88
|
+
as the broker/exchange selector (e.g. ``"BYBIT"``) and split it into
|
|
89
|
+
:attr:`ProviderString.broker`; the remainder is the symbol (which may be
|
|
90
|
+
empty for a broker-only string such as ``"ccxt:BYBIT"``). Callers learn
|
|
91
|
+
whether a provider is multi-broker from its ``multi_broker`` class
|
|
92
|
+
attribute.
|
|
93
|
+
:return: A :class:`ProviderString` with the parsed components.
|
|
94
|
+
:raises ValueError: If the string is malformed or timeframe is required but missing.
|
|
95
|
+
"""
|
|
96
|
+
if ':' not in value:
|
|
97
|
+
raise ValueError(
|
|
98
|
+
f"Invalid provider string: '{value}'. "
|
|
99
|
+
f"Expected format: provider:symbol[@timeframe]"
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
provider, rest = value.split(':', 1)
|
|
103
|
+
|
|
104
|
+
if not provider:
|
|
105
|
+
raise ValueError(
|
|
106
|
+
f"Invalid provider string: '{value}'. "
|
|
107
|
+
f"Provider name is empty."
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
if not rest:
|
|
111
|
+
raise ValueError(
|
|
112
|
+
f"Invalid provider string: '{value}'. "
|
|
113
|
+
f"Symbol is missing after '{provider}:'."
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
timeframe = None
|
|
117
|
+
if '@' in rest:
|
|
118
|
+
symbol_part, timeframe = rest.rsplit('@', 1)
|
|
119
|
+
if not timeframe:
|
|
120
|
+
raise ValueError(
|
|
121
|
+
f"Invalid provider string: '{value}'. "
|
|
122
|
+
f"Timeframe is empty after '@'."
|
|
123
|
+
)
|
|
124
|
+
if not symbol_part:
|
|
125
|
+
raise ValueError(
|
|
126
|
+
f"Invalid provider string: '{value}'. "
|
|
127
|
+
f"Symbol is missing before '@'."
|
|
128
|
+
)
|
|
129
|
+
rest = symbol_part
|
|
130
|
+
|
|
131
|
+
broker: str | None = None
|
|
132
|
+
symbol = rest
|
|
133
|
+
if multi_broker:
|
|
134
|
+
broker, _, symbol = rest.partition(':')
|
|
135
|
+
if not broker:
|
|
136
|
+
raise ValueError(
|
|
137
|
+
f"Invalid provider string: '{value}'. "
|
|
138
|
+
f"Broker name is empty."
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
if require_timeframe and timeframe is None:
|
|
142
|
+
raise ValueError(
|
|
143
|
+
f"Timeframe is required. Use '@' to specify it: "
|
|
144
|
+
f"'{value}@<timeframe>' (e.g. '{value}@1D')"
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
return ProviderString(provider=provider, symbol=symbol,
|
|
148
|
+
timeframe=timeframe, broker=broker)
|
pynecore/core/random.py
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import time
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class PineRandom:
|
|
5
|
+
"""
|
|
6
|
+
A Pine random generator reimplementation in Python, mimicking Java's nextDouble().
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
def __init__(self, seed=None):
|
|
10
|
+
"""
|
|
11
|
+
:param seed: int, the initial seed
|
|
12
|
+
"""
|
|
13
|
+
self.a = 25214903917
|
|
14
|
+
self.c = 11
|
|
15
|
+
self.m = 1 << 48
|
|
16
|
+
# If seed not given, use current time
|
|
17
|
+
if seed is None:
|
|
18
|
+
seed = int(time.time() * 1000)
|
|
19
|
+
self.state = (seed ^ 0x5DEECE66D) & (self.m - 1)
|
|
20
|
+
|
|
21
|
+
def _next_bits(self, bits):
|
|
22
|
+
"""
|
|
23
|
+
:param bits: int, number of bits
|
|
24
|
+
:return: int, that many bits from updated state
|
|
25
|
+
"""
|
|
26
|
+
self.state = (self.a * self.state + self.c) & (self.m - 1)
|
|
27
|
+
return self.state >> (48 - bits)
|
|
28
|
+
|
|
29
|
+
def random(self, lower=0.0, upper=1.0):
|
|
30
|
+
"""
|
|
31
|
+
Generate a random number in [lower, upper]
|
|
32
|
+
|
|
33
|
+
:param lower: float, lower bound
|
|
34
|
+
:param upper: float, upper bound
|
|
35
|
+
:return: float, random number in [lower, upper]
|
|
36
|
+
"""
|
|
37
|
+
hi = self._next_bits(26) # top 26 bits
|
|
38
|
+
lo = self._next_bits(27) # next 27 bits
|
|
39
|
+
rnd_double = ((hi << 27) + lo) / float(1 << 53)
|
|
40
|
+
return lower + rnd_double * (upper - lower)
|