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.
Files changed (261) hide show
  1. opencode_pyneruntime-6.6.4.dist-info/METADATA +281 -0
  2. opencode_pyneruntime-6.6.4.dist-info/RECORD +261 -0
  3. opencode_pyneruntime-6.6.4.dist-info/WHEEL +5 -0
  4. opencode_pyneruntime-6.6.4.dist-info/entry_points.txt +6 -0
  5. opencode_pyneruntime-6.6.4.dist-info/licenses/LICENSE +201 -0
  6. opencode_pyneruntime-6.6.4.dist-info/licenses/NOTICE +21 -0
  7. opencode_pyneruntime-6.6.4.dist-info/top_level.txt +1 -0
  8. pynecore/__init__.py +6 -0
  9. pynecore/cli/__init__.py +2 -0
  10. pynecore/cli/app.py +238 -0
  11. pynecore/cli/commands/__init__.py +343 -0
  12. pynecore/cli/commands/benchmark.py +186 -0
  13. pynecore/cli/commands/compile.py +198 -0
  14. pynecore/cli/commands/data.py +857 -0
  15. pynecore/cli/commands/debug.py +63 -0
  16. pynecore/cli/commands/optimize.py +956 -0
  17. pynecore/cli/commands/plugin.py +242 -0
  18. pynecore/cli/commands/run.py +2006 -0
  19. pynecore/cli/pluggable.py +132 -0
  20. pynecore/cli/utils/__init__.py +0 -0
  21. pynecore/cli/utils/api_error_handler.py +168 -0
  22. pynecore/cli/utils/broker_picker.py +330 -0
  23. pynecore/cli/utils/error_hook.py +28 -0
  24. pynecore/cli/utils/keyreader.py +178 -0
  25. pynecore/cli/utils/provider_picker.py +19 -0
  26. pynecore/cli/utils/symbol_browser.py +1149 -0
  27. pynecore/core/__init__.py +0 -0
  28. pynecore/core/aggregator.py +257 -0
  29. pynecore/core/bar_magnifier.py +168 -0
  30. pynecore/core/broker/__init__.py +64 -0
  31. pynecore/core/broker/defaults.py +113 -0
  32. pynecore/core/broker/disappearance.py +927 -0
  33. pynecore/core/broker/emulator.py +345 -0
  34. pynecore/core/broker/exceptions.py +346 -0
  35. pynecore/core/broker/idempotency.py +401 -0
  36. pynecore/core/broker/intent_builder.py +334 -0
  37. pynecore/core/broker/journal.py +1785 -0
  38. pynecore/core/broker/models.py +1600 -0
  39. pynecore/core/broker/native_failsafe_manager.py +1436 -0
  40. pynecore/core/broker/one_way_emulator.py +1128 -0
  41. pynecore/core/broker/position.py +787 -0
  42. pynecore/core/broker/run_identity.py +126 -0
  43. pynecore/core/broker/software_entry_stop_engine.py +351 -0
  44. pynecore/core/broker/software_partial_bracket_engine.py +1379 -0
  45. pynecore/core/broker/spot_inventory.py +1327 -0
  46. pynecore/core/broker/storage.py +2655 -0
  47. pynecore/core/broker/store_helpers.py +2161 -0
  48. pynecore/core/broker/sync_engine.py +16070 -0
  49. pynecore/core/broker/validation.py +382 -0
  50. pynecore/core/class_property.py +7 -0
  51. pynecore/core/config.py +392 -0
  52. pynecore/core/csv_file.py +547 -0
  53. pynecore/core/currency.py +262 -0
  54. pynecore/core/data_converter.py +1002 -0
  55. pynecore/core/datetime.py +296 -0
  56. pynecore/core/download_info.py +71 -0
  57. pynecore/core/download_runner.py +274 -0
  58. pynecore/core/htf_aggregator.py +181 -0
  59. pynecore/core/import_hook.py +358 -0
  60. pynecore/core/instance_state.py +494 -0
  61. pynecore/core/live_ltf_collector.py +442 -0
  62. pynecore/core/live_ltf_window.py +189 -0
  63. pynecore/core/live_runner.py +1347 -0
  64. pynecore/core/module_property.py +26 -0
  65. pynecore/core/ohlcv_file.py +1888 -0
  66. pynecore/core/overload.py +371 -0
  67. pynecore/core/pine_cast.py +113 -0
  68. pynecore/core/pine_export.py +95 -0
  69. pynecore/core/pine_method.py +244 -0
  70. pynecore/core/pine_range.py +86 -0
  71. pynecore/core/pine_udt.py +69 -0
  72. pynecore/core/plugin/__init__.py +394 -0
  73. pynecore/core/plugin/broker.py +781 -0
  74. pynecore/core/plugin/cli.py +96 -0
  75. pynecore/core/plugin/live_provider.py +208 -0
  76. pynecore/core/plugin/provider.py +331 -0
  77. pynecore/core/provider_string.py +148 -0
  78. pynecore/core/random.py +40 -0
  79. pynecore/core/resampler.py +686 -0
  80. pynecore/core/safe_convert.py +64 -0
  81. pynecore/core/script.py +1011 -0
  82. pynecore/core/script_runner.py +3202 -0
  83. pynecore/core/security.py +1749 -0
  84. pynecore/core/security_process.py +1253 -0
  85. pynecore/core/security_shm.py +456 -0
  86. pynecore/core/series.py +417 -0
  87. pynecore/core/strategy_stats.py +669 -0
  88. pynecore/core/symbol_map.py +134 -0
  89. pynecore/core/syminfo.py +505 -0
  90. pynecore/core/viz.py +591 -0
  91. pynecore/lib/__init__.py +1771 -0
  92. pynecore/lib/_fixnan.py +32 -0
  93. pynecore/lib/_math_stateful.py +202 -0
  94. pynecore/lib/_timeframe_change.py +101 -0
  95. pynecore/lib/adjustment.py +6 -0
  96. pynecore/lib/alert.py +39 -0
  97. pynecore/lib/alert.pyi +14 -0
  98. pynecore/lib/array.py +1051 -0
  99. pynecore/lib/barmerge.py +60 -0
  100. pynecore/lib/barstate.py +30 -0
  101. pynecore/lib/box.py +415 -0
  102. pynecore/lib/chart.py +128 -0
  103. pynecore/lib/color.py +152 -0
  104. pynecore/lib/color.pyi +50 -0
  105. pynecore/lib/currency.py +62 -0
  106. pynecore/lib/dayofweek.py +36 -0
  107. pynecore/lib/dayofweek.pyi +18 -0
  108. pynecore/lib/display.py +8 -0
  109. pynecore/lib/dividends.py +9 -0
  110. pynecore/lib/earnings.py +11 -0
  111. pynecore/lib/extend.py +6 -0
  112. pynecore/lib/font.py +5 -0
  113. pynecore/lib/footprint.py +79 -0
  114. pynecore/lib/format.py +11 -0
  115. pynecore/lib/hline.py +67 -0
  116. pynecore/lib/hline.pyi +24 -0
  117. pynecore/lib/label.py +409 -0
  118. pynecore/lib/line.py +433 -0
  119. pynecore/lib/linefill.py +93 -0
  120. pynecore/lib/location.py +11 -0
  121. pynecore/lib/log.py +362 -0
  122. pynecore/lib/map.py +150 -0
  123. pynecore/lib/math.py +385 -0
  124. pynecore/lib/matrix.py +708 -0
  125. pynecore/lib/order.py +8 -0
  126. pynecore/lib/pivotpointtype.py +8 -0
  127. pynecore/lib/plot.py +95 -0
  128. pynecore/lib/plot.pyi +33 -0
  129. pynecore/lib/polyline.py +91 -0
  130. pynecore/lib/position.py +15 -0
  131. pynecore/lib/request.py +281 -0
  132. pynecore/lib/runtime.py +5 -0
  133. pynecore/lib/scale.py +9 -0
  134. pynecore/lib/session.py +267 -0
  135. pynecore/lib/session.pyi +12 -0
  136. pynecore/lib/shape.py +18 -0
  137. pynecore/lib/size.py +12 -0
  138. pynecore/lib/splits.py +4 -0
  139. pynecore/lib/strategy/__init__.py +4778 -0
  140. pynecore/lib/strategy/closedtrades.py +347 -0
  141. pynecore/lib/strategy/closedtrades.pyi +53 -0
  142. pynecore/lib/strategy/commission.py +9 -0
  143. pynecore/lib/strategy/direction.py +9 -0
  144. pynecore/lib/strategy/oca.py +13 -0
  145. pynecore/lib/strategy/opentrades.py +281 -0
  146. pynecore/lib/strategy/opentrades.pyi +49 -0
  147. pynecore/lib/strategy/risk.py +109 -0
  148. pynecore/lib/string.py +649 -0
  149. pynecore/lib/syminfo.py +84 -0
  150. pynecore/lib/ta.py +2230 -0
  151. pynecore/lib/table.py +290 -0
  152. pynecore/lib/text.py +17 -0
  153. pynecore/lib/ticker.py +207 -0
  154. pynecore/lib/timeframe.py +293 -0
  155. pynecore/lib/volume_row.py +67 -0
  156. pynecore/lib/xloc.py +4 -0
  157. pynecore/lib/yloc.py +5 -0
  158. pynecore/providers/__init__.py +0 -0
  159. pynecore/providers/ccxt.py +664 -0
  160. pynecore/providers/replay.py +187 -0
  161. pynecore/pynesys/__init__.py +0 -0
  162. pynecore/pynesys/api.py +498 -0
  163. pynecore/pynesys/compiler.py +112 -0
  164. pynecore/standalone.py +99 -0
  165. pynecore/testing/__init__.py +1 -0
  166. pynecore/testing/broker_lab/__init__.py +41 -0
  167. pynecore/testing/broker_lab/__main__.py +5 -0
  168. pynecore/testing/broker_lab/cli.py +87 -0
  169. pynecore/testing/broker_lab/generate.py +47 -0
  170. pynecore/testing/broker_lab/model.py +84 -0
  171. pynecore/testing/broker_lab/reference.py +645 -0
  172. pynecore/testing/broker_lab/runner.py +372 -0
  173. pynecore/testing/broker_lab/scheduler.py +50 -0
  174. pynecore/testing/broker_lab/subprocess.py +73 -0
  175. pynecore/transformers/__init__.py +0 -0
  176. pynecore/transformers/builtin_shadow.py +136 -0
  177. pynecore/transformers/closure_arguments_transformer.py +428 -0
  178. pynecore/transformers/display_rewrite.py +140 -0
  179. pynecore/transformers/dynamic_default.py +147 -0
  180. pynecore/transformers/function_isolation.py +757 -0
  181. pynecore/transformers/import_lifter.py +61 -0
  182. pynecore/transformers/import_normalizer.py +328 -0
  183. pynecore/transformers/inline_series_hoist.py +178 -0
  184. pynecore/transformers/input_transformer.py +175 -0
  185. pynecore/transformers/lib_series.py +201 -0
  186. pynecore/transformers/locations.py +70 -0
  187. pynecore/transformers/module_properties.json +3387 -0
  188. pynecore/transformers/module_property.py +221 -0
  189. pynecore/transformers/ne_guard.py +70 -0
  190. pynecore/transformers/persistent.py +320 -0
  191. pynecore/transformers/persistent_series.py +76 -0
  192. pynecore/transformers/safe_convert_transformer.py +97 -0
  193. pynecore/transformers/safe_division_transformer.py +95 -0
  194. pynecore/transformers/script_requirements.py +308 -0
  195. pynecore/transformers/security.py +752 -0
  196. pynecore/transformers/security_instantiation.py +274 -0
  197. pynecore/transformers/series.py +275 -0
  198. pynecore/transformers/slot_layout.py +381 -0
  199. pynecore/transformers/type_checking_stripper.py +25 -0
  200. pynecore/transformers/unused_series_detector.py +267 -0
  201. pynecore/types/__init__.py +21 -0
  202. pynecore/types/alert.py +5 -0
  203. pynecore/types/barmerge.py +5 -0
  204. pynecore/types/base.py +39 -0
  205. pynecore/types/box.py +37 -0
  206. pynecore/types/chart.py +17 -0
  207. pynecore/types/color.py +107 -0
  208. pynecore/types/currency.py +5 -0
  209. pynecore/types/datetime.py +6 -0
  210. pynecore/types/display.py +5 -0
  211. pynecore/types/dividends.py +5 -0
  212. pynecore/types/earnings.py +5 -0
  213. pynecore/types/extend.py +5 -0
  214. pynecore/types/font.py +5 -0
  215. pynecore/types/footprint.py +41 -0
  216. pynecore/types/format.py +5 -0
  217. pynecore/types/hline.py +24 -0
  218. pynecore/types/ib_persistent.py +8 -0
  219. pynecore/types/ib_persistent.pyi +10 -0
  220. pynecore/types/label.py +35 -0
  221. pynecore/types/line.py +32 -0
  222. pynecore/types/linefill.py +13 -0
  223. pynecore/types/location.py +5 -0
  224. pynecore/types/matrix.py +999 -0
  225. pynecore/types/na.py +237 -0
  226. pynecore/types/na.pyi +83 -0
  227. pynecore/types/ohlcv.py +12 -0
  228. pynecore/types/order.py +5 -0
  229. pynecore/types/persistent.py +8 -0
  230. pynecore/types/persistent.pyi +13 -0
  231. pynecore/types/pine_types.py +11 -0
  232. pynecore/types/pine_types.pyi +15 -0
  233. pynecore/types/pivotpointtype.py +5 -0
  234. pynecore/types/plot.py +12 -0
  235. pynecore/types/plot_meta.py +60 -0
  236. pynecore/types/polyline.py +40 -0
  237. pynecore/types/position.py +5 -0
  238. pynecore/types/scale.py +5 -0
  239. pynecore/types/script_type.py +15 -0
  240. pynecore/types/series.py +23 -0
  241. pynecore/types/series.pyi +19 -0
  242. pynecore/types/session.py +35 -0
  243. pynecore/types/shape.py +5 -0
  244. pynecore/types/size.py +5 -0
  245. pynecore/types/source.py +33 -0
  246. pynecore/types/splits.py +5 -0
  247. pynecore/types/strategy.py +45 -0
  248. pynecore/types/table.py +87 -0
  249. pynecore/types/text.py +13 -0
  250. pynecore/types/type_checker.py +7 -0
  251. pynecore/types/type_checker.pyi +48 -0
  252. pynecore/types/volume_row.py +36 -0
  253. pynecore/types/weekdays.py +11 -0
  254. pynecore/types/xloc.py +5 -0
  255. pynecore/types/yloc.py +5 -0
  256. pynecore/utils/__init__.py +0 -0
  257. pynecore/utils/file_utils.py +50 -0
  258. pynecore/utils/rich/__init__.py +0 -0
  259. pynecore/utils/rich/date_column.py +25 -0
  260. pynecore/utils/sequence_view.py +92 -0
  261. 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)
@@ -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)