opencode-pyneruntime 6.8.7__tar.gz → 6.9.1__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.
Files changed (294) hide show
  1. opencode_pyneruntime-6.9.1/MANIFEST.in +3 -0
  2. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/PKG-INFO +5 -5
  3. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/README.md +4 -4
  4. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/build/opencode_pyneruntime.egg-info/SOURCES.txt +17 -0
  5. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/pyproject.toml +3 -3
  6. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/__init__.py +1 -1
  7. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/commands/benchmark.py +2 -1
  8. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/commands/run.py +29 -0
  9. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/aggregator.py +4 -4
  10. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/bar_magnifier.py +8 -2
  11. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/defaults.py +1 -1
  12. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/disappearance.py +51 -1
  13. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/exceptions.py +2 -2
  14. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/intent_builder.py +1 -1
  15. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/models.py +60 -2
  16. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/native_failsafe_manager.py +12 -0
  17. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/position.py +119 -20
  18. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/software_partial_bracket_engine.py +35 -0
  19. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/spot_inventory.py +232 -111
  20. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/storage.py +77 -9
  21. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/sync_engine.py +2951 -740
  22. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/validation.py +26 -0
  23. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/csv_file.py +20 -18
  24. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/currency.py +22 -14
  25. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/data_converter.py +2 -2
  26. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/datetime.py +16 -1
  27. opencode_pyneruntime-6.9.1/src/pynecore/core/fdlibm.py +540 -0
  28. opencode_pyneruntime-6.9.1/src/pynecore/core/import_hook.py +944 -0
  29. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/instance_state.py +440 -144
  30. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/live_runner.py +2 -2
  31. opencode_pyneruntime-6.9.1/src/pynecore/core/lookahead.py +33 -0
  32. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/ohlcv.py +62 -2
  33. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/overload.py +125 -6
  34. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/pine_cast.py +4 -3
  35. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/pine_compare.py +3 -2
  36. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/pine_export.py +62 -7
  37. opencode_pyneruntime-6.9.1/src/pynecore/core/pine_import.py +39 -0
  38. opencode_pyneruntime-6.9.1/src/pynecore/core/pine_math.py +716 -0
  39. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/pine_method.py +13 -6
  40. opencode_pyneruntime-6.9.1/src/pynecore/core/pine_range.py +154 -0
  41. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/random.py +3 -1
  42. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/resampler.py +2 -2
  43. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/safe_convert.py +26 -6
  44. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/script.py +45 -4
  45. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/script_runner.py +349 -53
  46. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/security.py +172 -67
  47. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/security_process.py +104 -31
  48. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/security_shm.py +4 -0
  49. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/series.py +158 -99
  50. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/strategy_stats.py +15 -5
  51. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/__init__.py +137 -99
  52. opencode_pyneruntime-6.9.1/src/pynecore/lib/_drawing.py +37 -0
  53. opencode_pyneruntime-6.9.1/src/pynecore/lib/_math_stateful.py +337 -0
  54. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/array.py +138 -63
  55. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/barmerge.py +12 -7
  56. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/box.py +27 -26
  57. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/chart.py +8 -7
  58. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/color.py +10 -6
  59. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/color.pyi +4 -3
  60. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/dayofweek.py +8 -3
  61. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/dayofweek.pyi +2 -1
  62. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/earnings.py +4 -3
  63. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/label.py +11 -11
  64. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/line.py +19 -20
  65. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/log.py +3 -3
  66. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/map.py +4 -2
  67. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/math.py +155 -65
  68. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/matrix.py +18 -13
  69. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/request.py +15 -12
  70. opencode_pyneruntime-6.9.1/src/pynecore/lib/runtime.py +17 -0
  71. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/strategy/__init__.py +1937 -613
  72. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/strategy/closedtrades.py +71 -16
  73. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/strategy/closedtrades.pyi +7 -1
  74. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/strategy/opentrades.py +42 -10
  75. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/strategy/opentrades.pyi +1 -1
  76. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/string.py +16 -9
  77. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/syminfo.py +13 -13
  78. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/ta.py +533 -138
  79. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/table.py +16 -16
  80. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/timeframe.py +20 -4
  81. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/standalone.py +2 -1
  82. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/broker_lab/runner.py +6 -5
  83. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/closure_arguments_transformer.py +12 -1
  84. opencode_pyneruntime-6.9.1/src/pynecore/transformers/const_fold.py +578 -0
  85. opencode_pyneruntime-6.9.1/src/pynecore/transformers/dynamic_default.py +338 -0
  86. opencode_pyneruntime-6.9.1/src/pynecore/transformers/edge_rules.json +135 -0
  87. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/float_tolerance.py +7 -1
  88. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/function_isolation.py +227 -182
  89. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/import_normalizer.py +68 -27
  90. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/input_transformer.py +11 -2
  91. opencode_pyneruntime-6.9.1/src/pynecore/transformers/lib_types.json +9258 -0
  92. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/module_properties.json +102 -3
  93. opencode_pyneruntime-6.9.1/src/pynecore/transformers/node_ids.py +50 -0
  94. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/persistent.py +35 -1
  95. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/persistent_series.py +6 -0
  96. opencode_pyneruntime-6.9.1/src/pynecore/transformers/pine_edge_gate.py +607 -0
  97. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/pine_truthiness.py +6 -1
  98. opencode_pyneruntime-6.9.1/src/pynecore/transformers/pine_type_artifact.py +1026 -0
  99. opencode_pyneruntime-6.9.1/src/pynecore/transformers/pine_type_infer.py +4789 -0
  100. opencode_pyneruntime-6.9.1/src/pynecore/transformers/pine_type_report.py +384 -0
  101. opencode_pyneruntime-6.9.1/src/pynecore/transformers/pine_type_rules.py +1900 -0
  102. opencode_pyneruntime-6.9.1/src/pynecore/transformers/pine_type_table.py +411 -0
  103. opencode_pyneruntime-6.9.1/src/pynecore/transformers/pine_type_transformer.py +76 -0
  104. opencode_pyneruntime-6.9.1/src/pynecore/transformers/safe_convert_transformer.py +220 -0
  105. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/safe_division_transformer.py +7 -3
  106. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/security.py +16 -2
  107. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/series.py +80 -18
  108. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/slot_layout.py +49 -10
  109. opencode_pyneruntime-6.9.1/src/pynecore/transformers/ta_variable_hoist.py +181 -0
  110. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/matrix.py +18 -9
  111. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/na.py +76 -14
  112. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/na.pyi +14 -2
  113. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/pine_types.py +4 -1
  114. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/pine_types.pyi +2 -1
  115. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/utils/sequence_view.py +12 -23
  116. opencode_pyneruntime-6.8.7/MANIFEST.in +0 -3
  117. opencode_pyneruntime-6.8.7/src/pynecore/core/import_hook.py +0 -454
  118. opencode_pyneruntime-6.8.7/src/pynecore/core/pine_range.py +0 -86
  119. opencode_pyneruntime-6.8.7/src/pynecore/lib/_math_stateful.py +0 -255
  120. opencode_pyneruntime-6.8.7/src/pynecore/lib/runtime.py +0 -5
  121. opencode_pyneruntime-6.8.7/src/pynecore/transformers/dynamic_default.py +0 -147
  122. opencode_pyneruntime-6.8.7/src/pynecore/transformers/safe_convert_transformer.py +0 -97
  123. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/LICENSE +0 -0
  124. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/NOTICE +0 -0
  125. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/setup.cfg +0 -0
  126. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/__init__.py +0 -0
  127. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/app.py +0 -0
  128. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/commands/__init__.py +0 -0
  129. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/commands/compile.py +0 -0
  130. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/commands/data.py +0 -0
  131. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/commands/debug.py +0 -0
  132. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/commands/optimize.py +0 -0
  133. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/commands/plugin.py +0 -0
  134. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/pluggable.py +0 -0
  135. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/utils/__init__.py +0 -0
  136. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/utils/api_error_handler.py +0 -0
  137. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/utils/broker_picker.py +0 -0
  138. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/utils/error_hook.py +0 -0
  139. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/utils/keyreader.py +0 -0
  140. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/utils/provider_picker.py +0 -0
  141. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/utils/symbol_browser.py +0 -0
  142. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/__init__.py +0 -0
  143. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/_file_io.py +0 -0
  144. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/__init__.py +0 -0
  145. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/emulator.py +0 -0
  146. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/idempotency.py +0 -0
  147. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/journal.py +0 -0
  148. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/one_way_emulator.py +0 -0
  149. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/run_identity.py +0 -0
  150. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/software_entry_stop_engine.py +0 -0
  151. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/store_helpers.py +0 -0
  152. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/class_property.py +0 -0
  153. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/config.py +0 -0
  154. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/download_info.py +0 -0
  155. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/download_runner.py +0 -0
  156. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/drawing_snapshot.py +0 -0
  157. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/htf_aggregator.py +0 -0
  158. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/live_ltf_collector.py +0 -0
  159. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/live_ltf_window.py +0 -0
  160. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/module_property.py +0 -0
  161. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/ohlcv_importers.py +0 -0
  162. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/ohlcv_legacy.py +0 -0
  163. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/pine_udt.py +0 -0
  164. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/plugin/__init__.py +0 -0
  165. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/plugin/broker.py +0 -0
  166. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/plugin/cli.py +0 -0
  167. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/plugin/live_provider.py +0 -0
  168. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/plugin/provider.py +0 -0
  169. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/provider_string.py +0 -0
  170. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/rolling_sum.py +0 -0
  171. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/session.py +0 -0
  172. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/symbol_map.py +0 -0
  173. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/syminfo.py +0 -0
  174. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/viz.py +0 -0
  175. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/_fixnan.py +0 -0
  176. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/_timeframe_change.py +0 -0
  177. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/adjustment.py +0 -0
  178. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/alert.py +0 -0
  179. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/alert.pyi +0 -0
  180. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/barstate.py +0 -0
  181. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/currency.py +0 -0
  182. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/display.py +0 -0
  183. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/dividends.py +0 -0
  184. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/extend.py +0 -0
  185. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/font.py +0 -0
  186. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/footprint.py +0 -0
  187. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/format.py +0 -0
  188. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/hline.py +0 -0
  189. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/hline.pyi +0 -0
  190. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/linefill.py +0 -0
  191. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/location.py +0 -0
  192. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/order.py +0 -0
  193. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/pivotpointtype.py +0 -0
  194. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/plot.py +0 -0
  195. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/plot.pyi +0 -0
  196. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/polyline.py +0 -0
  197. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/position.py +0 -0
  198. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/scale.py +0 -0
  199. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/session.py +0 -0
  200. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/session.pyi +0 -0
  201. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/shape.py +0 -0
  202. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/size.py +0 -0
  203. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/splits.py +0 -0
  204. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/strategy/commission.py +0 -0
  205. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/strategy/direction.py +0 -0
  206. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/strategy/oca.py +0 -0
  207. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/strategy/risk.py +0 -0
  208. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/text.py +0 -0
  209. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/ticker.py +0 -0
  210. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/volume_row.py +0 -0
  211. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/xloc.py +0 -0
  212. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/yloc.py +0 -0
  213. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/providers/__init__.py +0 -0
  214. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/providers/ccxt.py +0 -0
  215. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/providers/replay.py +0 -0
  216. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/pynesys/__init__.py +0 -0
  217. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/pynesys/api.py +0 -0
  218. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/pynesys/compiler.py +0 -0
  219. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/__init__.py +0 -0
  220. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/broker_lab/__init__.py +0 -0
  221. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/broker_lab/__main__.py +0 -0
  222. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/broker_lab/cli.py +0 -0
  223. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/broker_lab/generate.py +0 -0
  224. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/broker_lab/model.py +0 -0
  225. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/broker_lab/reference.py +0 -0
  226. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/broker_lab/scheduler.py +0 -0
  227. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/broker_lab/subprocess.py +0 -0
  228. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/__init__.py +0 -0
  229. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/builtin_shadow.py +0 -0
  230. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/display_rewrite.py +0 -0
  231. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/import_lifter.py +0 -0
  232. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/inline_series_hoist.py +0 -0
  233. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/lib_series.py +0 -0
  234. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/locations.py +0 -0
  235. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/module_property.py +0 -0
  236. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/script_requirements.py +0 -0
  237. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/security_instantiation.py +0 -0
  238. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/type_checking_stripper.py +0 -0
  239. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/unused_series_detector.py +0 -0
  240. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/__init__.py +0 -0
  241. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/alert.py +0 -0
  242. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/barmerge.py +0 -0
  243. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/base.py +0 -0
  244. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/box.py +0 -0
  245. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/chart.py +0 -0
  246. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/color.py +0 -0
  247. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/currency.py +0 -0
  248. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/datetime.py +0 -0
  249. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/display.py +0 -0
  250. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/dividends.py +0 -0
  251. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/earnings.py +0 -0
  252. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/extend.py +0 -0
  253. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/font.py +0 -0
  254. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/footprint.py +0 -0
  255. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/format.py +0 -0
  256. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/hline.py +0 -0
  257. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/ib_persistent.py +0 -0
  258. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/ib_persistent.pyi +0 -0
  259. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/label.py +0 -0
  260. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/line.py +0 -0
  261. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/linefill.py +0 -0
  262. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/location.py +0 -0
  263. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/ohlcv.py +0 -0
  264. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/order.py +0 -0
  265. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/persistent.py +0 -0
  266. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/persistent.pyi +0 -0
  267. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/pivotpointtype.py +0 -0
  268. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/plot.py +0 -0
  269. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/plot_meta.py +0 -0
  270. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/polyline.py +0 -0
  271. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/position.py +0 -0
  272. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/scale.py +0 -0
  273. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/script_type.py +0 -0
  274. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/series.py +0 -0
  275. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/series.pyi +0 -0
  276. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/session.py +0 -0
  277. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/shape.py +0 -0
  278. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/size.py +0 -0
  279. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/source.py +0 -0
  280. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/splits.py +0 -0
  281. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/strategy.py +0 -0
  282. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/table.py +0 -0
  283. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/text.py +0 -0
  284. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/type_checker.py +0 -0
  285. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/type_checker.pyi +0 -0
  286. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/volume_row.py +0 -0
  287. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/weekdays.py +0 -0
  288. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/xloc.py +0 -0
  289. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/yloc.py +0 -0
  290. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/utils/__init__.py +0 -0
  291. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/utils/file_utils.py +0 -0
  292. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/utils/rich/__init__.py +0 -0
  293. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/utils/rich/date_column.py +0 -0
  294. {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/utils/stdlib_checker.py +0 -0
@@ -0,0 +1,3 @@
1
+ recursive-include src/pynecore *.json
2
+ include NOTICE
3
+ include LICENSE
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opencode-pyneruntime
3
- Version: 6.8.7
3
+ Version: 6.9.1
4
4
  Summary: PyneCore runtime (rubycell fork of PyneSys/pynecore) — Pine Script-like runtime and API
5
5
  Author-email: PYNESYS LLC <hello@pynesys.com>
6
6
  Maintainer: rubycell
@@ -10,7 +10,7 @@ Project-URL: Repository, https://github.com/pynesys/pynecore
10
10
  Project-URL: Documentation, https://pynecore.org/docs
11
11
  Project-URL: Issues, https://github.com/pynesys/pynecore/issues
12
12
  Project-URL: X, https://x.com/pynesys
13
- Project-URL: Discord, https://discord.com/invite/jegnhtq6gy
13
+ Project-URL: Discord, https://discord.pynesys.io
14
14
  Project-URL: Discussions, https://github.com/PyneSys/pynecore/discussions
15
15
  Classifier: Programming Language :: Python :: 3
16
16
  Classifier: Operating System :: OS Independent
@@ -260,10 +260,10 @@ examples, kept as workspace siblings for pattern reference:
260
260
  ## Pine Script Migration Made Easy
261
261
 
262
262
  Have existing Pine Script code you want to run in Python? **PyneSys now offers automatic Pine
263
- Script to PyneCore translation** through our [web platform](https://pynesys.io) and [Discord bot](https://discord.com/invite/jegnhtq6gy).
263
+ Script to PyneCore translation** through our [web platform](https://pynesys.io) and [Discord bot](https://discord.pynesys.io).
264
264
 
265
265
  ### 🚀 Get Started Instantly
266
- - **Try for free on Discord**: Use `/pine-help` in our [Discord](https://discord.com/invite/jegnhtq6gy) for instant conversion - 3 free translations!
266
+ - **Try for free on Discord**: Use `/pine-help` in our [Discord](https://discord.pynesys.io) for instant conversion - 3 free translations!
267
267
  - **Full service**: Visit [pynesys.io](https://pynesys.io) for subscriptions and higher limits
268
268
 
269
269
  ### 💡 Support the Ecosystem
@@ -281,7 +281,7 @@ Love PyneCore and want to see it grow? Consider a **Seed subscription or higher*
281
281
  ### Community
282
282
 
283
283
  - **Discussions**: [GitHub Discussions](https://github.com/pynesys/pynecore/discussions)
284
- - **Discord**: [discord.com/invite/jegnhtq6gy](https://discord.com/invite/jegnhtq6gy)
284
+ - **Discord**: [discord.pynesys.io](https://discord.pynesys.io)
285
285
  - **X**: [x.com/pynesys](https://x.com/pynesys)
286
286
  - **Website**: [pynecore.org](https://pynecore.org)
287
287
 
@@ -215,10 +215,10 @@ examples, kept as workspace siblings for pattern reference:
215
215
  ## Pine Script Migration Made Easy
216
216
 
217
217
  Have existing Pine Script code you want to run in Python? **PyneSys now offers automatic Pine
218
- Script to PyneCore translation** through our [web platform](https://pynesys.io) and [Discord bot](https://discord.com/invite/jegnhtq6gy).
218
+ Script to PyneCore translation** through our [web platform](https://pynesys.io) and [Discord bot](https://discord.pynesys.io).
219
219
 
220
220
  ### 🚀 Get Started Instantly
221
- - **Try for free on Discord**: Use `/pine-help` in our [Discord](https://discord.com/invite/jegnhtq6gy) for instant conversion - 3 free translations!
221
+ - **Try for free on Discord**: Use `/pine-help` in our [Discord](https://discord.pynesys.io) for instant conversion - 3 free translations!
222
222
  - **Full service**: Visit [pynesys.io](https://pynesys.io) for subscriptions and higher limits
223
223
 
224
224
  ### 💡 Support the Ecosystem
@@ -236,7 +236,7 @@ Love PyneCore and want to see it grow? Consider a **Seed subscription or higher*
236
236
  ### Community
237
237
 
238
238
  - **Discussions**: [GitHub Discussions](https://github.com/pynesys/pynecore/discussions)
239
- - **Discord**: [discord.com/invite/jegnhtq6gy](https://discord.com/invite/jegnhtq6gy)
239
+ - **Discord**: [discord.pynesys.io](https://discord.pynesys.io)
240
240
  - **X**: [x.com/pynesys](https://x.com/pynesys)
241
241
  - **Website**: [pynecore.org](https://pynecore.org)
242
242
 
@@ -267,4 +267,4 @@ PyneCore is part of the PyneSys ecosystem. For commercial support, custom develo
267
267
  - **Website**: [pynesys.com/contact](https://pynesys.com/contact)
268
268
 
269
269
  ---
270
- <strong>Elevate Your Trading with the Power of Python & Pine Script</strong>
270
+ <strong>Elevate Your Trading with the Power of Python & Pine Script</strong>
@@ -36,12 +36,14 @@ src/pynecore/core/datetime.py
36
36
  src/pynecore/core/download_info.py
37
37
  src/pynecore/core/download_runner.py
38
38
  src/pynecore/core/drawing_snapshot.py
39
+ src/pynecore/core/fdlibm.py
39
40
  src/pynecore/core/htf_aggregator.py
40
41
  src/pynecore/core/import_hook.py
41
42
  src/pynecore/core/instance_state.py
42
43
  src/pynecore/core/live_ltf_collector.py
43
44
  src/pynecore/core/live_ltf_window.py
44
45
  src/pynecore/core/live_runner.py
46
+ src/pynecore/core/lookahead.py
45
47
  src/pynecore/core/module_property.py
46
48
  src/pynecore/core/ohlcv.py
47
49
  src/pynecore/core/ohlcv_importers.py
@@ -50,6 +52,8 @@ src/pynecore/core/overload.py
50
52
  src/pynecore/core/pine_cast.py
51
53
  src/pynecore/core/pine_compare.py
52
54
  src/pynecore/core/pine_export.py
55
+ src/pynecore/core/pine_import.py
56
+ src/pynecore/core/pine_math.py
53
57
  src/pynecore/core/pine_method.py
54
58
  src/pynecore/core/pine_range.py
55
59
  src/pynecore/core/pine_udt.py
@@ -95,6 +99,7 @@ src/pynecore/core/plugin/cli.py
95
99
  src/pynecore/core/plugin/live_provider.py
96
100
  src/pynecore/core/plugin/provider.py
97
101
  src/pynecore/lib/__init__.py
102
+ src/pynecore/lib/_drawing.py
98
103
  src/pynecore/lib/_fixnan.py
99
104
  src/pynecore/lib/_math_stateful.py
100
105
  src/pynecore/lib/_timeframe_change.py
@@ -180,8 +185,10 @@ src/pynecore/testing/broker_lab/subprocess.py
180
185
  src/pynecore/transformers/__init__.py
181
186
  src/pynecore/transformers/builtin_shadow.py
182
187
  src/pynecore/transformers/closure_arguments_transformer.py
188
+ src/pynecore/transformers/const_fold.py
183
189
  src/pynecore/transformers/display_rewrite.py
184
190
  src/pynecore/transformers/dynamic_default.py
191
+ src/pynecore/transformers/edge_rules.json
185
192
  src/pynecore/transformers/float_tolerance.py
186
193
  src/pynecore/transformers/function_isolation.py
187
194
  src/pynecore/transformers/import_lifter.py
@@ -189,12 +196,21 @@ src/pynecore/transformers/import_normalizer.py
189
196
  src/pynecore/transformers/inline_series_hoist.py
190
197
  src/pynecore/transformers/input_transformer.py
191
198
  src/pynecore/transformers/lib_series.py
199
+ src/pynecore/transformers/lib_types.json
192
200
  src/pynecore/transformers/locations.py
193
201
  src/pynecore/transformers/module_properties.json
194
202
  src/pynecore/transformers/module_property.py
203
+ src/pynecore/transformers/node_ids.py
195
204
  src/pynecore/transformers/persistent.py
196
205
  src/pynecore/transformers/persistent_series.py
206
+ src/pynecore/transformers/pine_edge_gate.py
197
207
  src/pynecore/transformers/pine_truthiness.py
208
+ src/pynecore/transformers/pine_type_artifact.py
209
+ src/pynecore/transformers/pine_type_infer.py
210
+ src/pynecore/transformers/pine_type_report.py
211
+ src/pynecore/transformers/pine_type_rules.py
212
+ src/pynecore/transformers/pine_type_table.py
213
+ src/pynecore/transformers/pine_type_transformer.py
198
214
  src/pynecore/transformers/safe_convert_transformer.py
199
215
  src/pynecore/transformers/safe_division_transformer.py
200
216
  src/pynecore/transformers/script_requirements.py
@@ -202,6 +218,7 @@ src/pynecore/transformers/security.py
202
218
  src/pynecore/transformers/security_instantiation.py
203
219
  src/pynecore/transformers/series.py
204
220
  src/pynecore/transformers/slot_layout.py
221
+ src/pynecore/transformers/ta_variable_hoist.py
205
222
  src/pynecore/transformers/type_checking_stripper.py
206
223
  src/pynecore/transformers/unused_series_detector.py
207
224
  src/pynecore/types/__init__.py
@@ -9,7 +9,7 @@ include-package-data = true
9
9
  zip-safe = false # Critical for import hooks
10
10
 
11
11
  [tool.setuptools.package-data]
12
- "pynecore" = ["*.pyi"]
12
+ "pynecore" = ["*.pyi", "*.json"]
13
13
 
14
14
  [tool.distutils]
15
15
  egg_info.egg_base = "build"
@@ -20,7 +20,7 @@ egg_info.egg_base = "build"
20
20
  # `pynecore` so transpiler-generated code runs unchanged. Upstream authorship and
21
21
  # the Apache-2.0 NOTICE ("Powered by PyneSys") are retained per Section 4(d).
22
22
  name = "opencode-pyneruntime"
23
- version = "6.8.7" # PineVersion.Major.Minor — tracks upstream
23
+ version = "6.9.1" # PineVersion.Major.Minor — tracks upstream
24
24
  description = "PyneCore runtime (rubycell fork of PyneSys/pynecore) — Pine Script-like runtime and API"
25
25
  authors = [{ name = "PYNESYS LLC", email = "hello@pynesys.com" }]
26
26
  maintainers = [{ name = "rubycell" }]
@@ -87,5 +87,5 @@ replay = "pynecore.providers.replay:ReplayProvider"
87
87
 
88
88
  # Social
89
89
  "X" = "https://x.com/pynesys"
90
- "Discord" = "https://discord.com/invite/jegnhtq6gy"
90
+ "Discord" = "https://discord.pynesys.io"
91
91
  "Discussions" = "https://github.com/PyneSys/pynecore/discussions"
@@ -3,4 +3,4 @@
3
3
  # init, and those must already load through the transforming loader.
4
4
  from .core import import_hook
5
5
  from .types import Series, Persistent, PersistentSeries
6
- from .core.pine_range import pine_range
6
+ from .core.pine_range import pine_range, pine_loop
@@ -127,7 +127,8 @@ def benchmark(
127
127
  syminfo,
128
128
  last_bar_index=len(ohlcv_list) - 1,
129
129
  plot_path=None if no_output else app_state.output_dir / f"benchmark_{i}.csv",
130
- lossless_volume=reader.lossless_volume
130
+ lossless_volume=reader.lossless_volume,
131
+ lossless_prices=reader.lossless_prices
131
132
  )
132
133
 
133
134
  import_time = time.perf_counter() - import_start
@@ -961,6 +961,31 @@ def _download_provider_data_resilient(
961
961
  delay = min(delay * 2.0, _PROVIDER_RETRY_MAX_DELAY)
962
962
 
963
963
 
964
+ def _pin_timenow(last_bar_time: int | None) -> None:
965
+ """Pin ``timenow`` to the final bar of a bounded historical replay.
966
+
967
+ A backtest that reads the real clock is not reproducible: a script gating
968
+ its entries on ``time >= timenow - N days`` measures a different bar set on
969
+ every run, so its result changes from one day to the next and can never be
970
+ matched against a stored reference again. Anchoring the clock to the last
971
+ bar of the replayed window makes the run deterministic — the instant that
972
+ run's world ends. Live runs never call this and keep the system clock.
973
+
974
+ Both channels are needed: the environment variable reaches the
975
+ ``request.security`` subprocesses, which import ``pynecore.lib`` fresh under
976
+ the ``spawn`` start method, while the attribute covers this process, which
977
+ imported it long before the data window was known.
978
+
979
+ :param last_bar_time: UNIX time (ms) of the window's last bar; ``None``
980
+ (an empty window) leaves the clock alone.
981
+ """
982
+ if last_bar_time is None:
983
+ return
984
+ from pynecore import lib as _lib
985
+ os.environ['PYNE_TIMENOW_MS'] = str(last_bar_time)
986
+ _lib._timenow_ms = last_bar_time
987
+
988
+
964
989
  def _print_data_requirements(requirements: DataRequirements, script_name: str) -> None:
965
990
  """Print a plain, human-readable summary of a script's data dependencies.
966
991
 
@@ -1415,6 +1440,7 @@ def run(
1415
1440
  else:
1416
1441
  ohlcv_iter = reader.read_from(time_from_ts, time_to_ts)
1417
1442
  lossless_volume = reader.lossless_volume
1443
+ lossless_prices = reader.lossless_prices
1418
1444
 
1419
1445
  # --broker implies --live.
1420
1446
  if broker:
@@ -1643,6 +1669,8 @@ def run(
1643
1669
  from pynecore import lib as _lib
1644
1670
  _lib._is_live = True
1645
1671
  _lib._strategy_suppressed = True
1672
+ else:
1673
+ _pin_timenow(last_bar_time)
1646
1674
 
1647
1675
  # Show loading spinner while importing
1648
1676
  with Progress(
@@ -1678,6 +1706,7 @@ def run(
1678
1706
  time_from=time_from_dt,
1679
1707
  chart_data_path=data_path,
1680
1708
  lossless_volume=lossless_volume,
1709
+ lossless_prices=lossless_prices,
1681
1710
  config_dir=app_state.config_dir)
1682
1711
  finally:
1683
1712
  # Remove lib directory from Python path
@@ -18,7 +18,7 @@ from .resampler import (
18
18
  Resampler, ObservedDayCounter, grid_mode, overnight_opens, trading_day,
19
19
  )
20
20
  # noinspection PyProtectedMember
21
- from ..lib.timeframe import in_seconds, _process_tf
21
+ from ..lib.timeframe import _in_seconds, _process_tf
22
22
  from ..types.ohlcv import OHLCV
23
23
 
24
24
 
@@ -30,8 +30,8 @@ def validate_aggregation(source_tf: str, target_tf: str) -> None:
30
30
  :param target_tf: Target timeframe string (e.g., '60', '1W')
31
31
  :raises ValueError: If timeframes are incompatible
32
32
  """
33
- source_sec = in_seconds(source_tf)
34
- target_sec = in_seconds(target_tf)
33
+ source_sec = _in_seconds(source_tf)
34
+ target_sec = _in_seconds(target_tf)
35
35
 
36
36
  if target_sec <= source_sec:
37
37
  raise ValueError(
@@ -123,7 +123,7 @@ def aggregate_ohlcv(
123
123
  # noinspection PyProtectedMember
124
124
  src_mod, _ = _process_tf(source_tf)
125
125
  if src_mod in ('', 'S'):
126
- src_off = in_seconds(source_tf) - 1
126
+ src_off = _in_seconds(source_tf) - 1
127
127
  # An intraday source carries the per-bar end instants the observed
128
128
  # holiday half-day fold needs (a daily source is already folded).
129
129
  fold = True
@@ -18,7 +18,7 @@ from .aggregator import _merge_candles
18
18
  from .resampler import (
19
19
  Resampler, ObservedDayCounter, grid_mode, overnight_opens, trading_day,
20
20
  )
21
- from ..lib.timeframe import in_seconds, _process_tf
21
+ from ..lib.timeframe import _in_seconds, _process_tf
22
22
  from ..types.ohlcv import OHLCV
23
23
 
24
24
  __all__ = ['BarMagnifier', 'MagnifiedWindow']
@@ -30,6 +30,10 @@ class MagnifiedWindow:
30
30
  sub_bars: list[OHLCV]
31
31
  aggregated: OHLCV
32
32
  is_last_window: bool
33
+ # Open time (ms) of the NEXT chart-timeframe window, 0 for the last one.
34
+ # The peek-ahead below already holds it; HTF security confirmation reads it
35
+ # to recognize a session that ended early (see ``lib._next_time``).
36
+ next_time: int = 0
33
37
 
34
38
 
35
39
  class BarMagnifier:
@@ -87,7 +91,7 @@ class BarMagnifier:
87
91
  # noinspection PyProtectedMember
88
92
  src_mod, _ = _process_tf(source_tf)
89
93
  if src_mod in ('', 'S'):
90
- self._src_off = in_seconds(source_tf) - 1
94
+ self._src_off = _in_seconds(source_tf) - 1
91
95
  # Intraday sub-bars carry the end instants the holiday half-day
92
96
  # fold needs (a daily source stream is already folded).
93
97
  self._fold = True
@@ -142,6 +146,7 @@ class BarMagnifier:
142
146
 
143
147
  # Peek-ahead: yield the previous window (now we know it's not the last)
144
148
  if next_window is not None:
149
+ next_window.next_time = new_window.aggregated.timestamp
145
150
  yield next_window
146
151
  next_window = new_window
147
152
  window = []
@@ -161,6 +166,7 @@ class BarMagnifier:
161
166
  )
162
167
 
163
168
  if next_window is not None:
169
+ next_window.next_time = last_window.aggregated.timestamp
164
170
  yield next_window
165
171
  yield last_window
166
172
  elif next_window is not None:
@@ -72,7 +72,7 @@ class BrokerDefaults:
72
72
 
73
73
  Only used by plugins that opt into the core spot inventory layer.
74
74
  ``"quarantine"`` (default) — trading stops, the process stays alive
75
- as an observer; recovery is an operator rebaseline plus restart.
75
+ as an observer; a restart recovers on a fresh venue-balance baseline.
76
76
  ``"halt"`` — exit via the graceful manual-intervention path.
77
77
  The set is deliberately narrower than ``on_unexpected_cancel``:
78
78
  an attribution conflict has no safe ``re_place`` or ``ignore``
@@ -117,6 +117,11 @@ UNEXPECTED_CANCEL_POLICIES = (
117
117
  _QTY_EPS = 1e-9
118
118
 
119
119
 
120
+ def _is_fully_filled(row: 'OrderRow') -> bool:
121
+ """``True`` when the row's cumulative fill consumed its full quantity."""
122
+ return row.qty > 0.0 and row.filled_qty >= row.qty - _QTY_EPS
123
+
124
+
120
125
  def resolve_unexpected_cancel_policy(
121
126
  policy: str,
122
127
  *,
@@ -144,10 +149,18 @@ def resolve_unexpected_cancel_policy(
144
149
  ``stop_and_cancel`` sibling sweep — it is async and shaped differently
145
150
  per path.
146
151
 
152
+ :param policy: The configured ``on_unexpected_cancel`` policy name
153
+ (one of :data:`UNEXPECTED_CANCEL_POLICIES`).
154
+ :param reason: Human-readable description of the confirmed cancel,
155
+ carried into the halt / quarantine request.
156
+ :param context: Structured payload passed to the quarantine sink.
147
157
  :param request_quarantine: Quarantine latch sink; ``None`` (an unwired
148
158
  sink under a quarantining policy) triggers the fail-closed halt.
149
159
  :param log_event: Audit sink (``RunContext.log_event``); ``None`` skips
150
160
  audit persistence (a store-less engine on the push path).
161
+ :param client_order_id: The affected row's COID, stamped on audit events.
162
+ :param exchange_order_id: The affected row's venue ref, stamped on
163
+ audit events.
151
164
  """
152
165
  def _log(kind: str) -> None:
153
166
  if log_event is not None:
@@ -450,7 +463,12 @@ class DisappearanceTracker:
450
463
  "register_executions hook failed for %r",
451
464
  row.client_order_id,
452
465
  )
453
- if applied and confirmation.resolution is MissingResolution.CANCELLED:
466
+ if (applied
467
+ and confirmation.resolution is MissingResolution.CANCELLED
468
+ and not _is_fully_filled(hook_row)):
469
+ # A fully filled row was retired as a benign post-fill
470
+ # close by ``_apply_confirmation`` (same predicate) — the
471
+ # unexpected-cancel policy must not fire for it.
454
472
  await self._apply_policy(hook_row)
455
473
  for event in events:
456
474
  yield event
@@ -694,6 +712,38 @@ class DisappearanceTracker:
694
712
  # a replayed copy of the evidence cannot re-book after the
695
713
  # retire.
696
714
  register_ids = confirmation.execution_ids
715
+ if _is_fully_filled(updated):
716
+ # A fully filled row's ref vanishing is NOT an external
717
+ # cancel: the full quantity already executed and was
718
+ # booked, so there was nothing working left to cancel.
719
+ # Venues can still surface a late CANCELLED for such an
720
+ # order — e.g. Capital.com netting an in-flight entry
721
+ # into an opposite deal's close and reporting the
722
+ # consumed order CANCELLED minutes later. Applying the
723
+ # ``on_unexpected_cancel`` policy here would quarantine
724
+ # a healthy run over a bookkeeping echo. Retire the row
725
+ # as a benign post-fill close instead: no cancelled
726
+ # event, and :meth:`observe` skips ``_apply_policy`` on
727
+ # the same predicate.
728
+ DispatchJournal(self._store).apply_reconcile_outcome(
729
+ updated.client_order_id,
730
+ ReconcileOutcome(
731
+ kind='terminal_close',
732
+ reason='missing_pending_grace_expired',
733
+ new_state='closed',
734
+ audit_event='reconcile_cancel_after_full_fill_retired',
735
+ close_row=True,
736
+ audit_payload={'missing_since': since,
737
+ 'grace': self._grace_s,
738
+ 'filled_qty': updated.filled_qty,
739
+ 'qty': updated.qty},
740
+ exchange_order_id=updated.exchange_order_id,
741
+ ),
742
+ )
743
+ if fill_event is not None:
744
+ events.append(fill_event)
745
+ self._forget_deferred(updated.client_order_id)
746
+ return events, True, register_ids, updated
697
747
  DispatchJournal(self._store).apply_reconcile_outcome(
698
748
  updated.client_order_id,
699
749
  ReconcileOutcome(
@@ -327,8 +327,8 @@ class SpotInventoryConflictError(BrokerManualInterventionError):
327
327
  or foreign ledger row, an inconclusive execution catch-up, or a
328
328
  lost asset-ownership lease. External intervention in the bot's
329
329
  inventory is not supported — there is no adoption path, so the safe
330
- terminal signal is manual intervention followed by an operator
331
- ``rebaseline``.
330
+ terminal signal is manual intervention followed by a restart, whose
331
+ startup recovery re-anchors on the venue's measured balance.
332
332
  """
333
333
 
334
334
 
@@ -6,7 +6,7 @@ of pending Pine orders created by ``strategy.entry``, ``strategy.order``,
6
6
  ``strategy.exit``, ``strategy.close`` and ``strategy.close_all``:
7
7
 
8
8
  - ``position.entry_orders[pine_id]`` — entries and strategy-order adds
9
- - ``position.exit_orders[(exit_id, from_entry)]`` — exits, closes and
9
+ - ``position.exit_orders`` keyed by ``_exit_order_key`` — exits, closes and
10
10
  close-all (composite key disambiguates multiple exits per entry)
11
11
 
12
12
  For live trading the :class:`~pynecore.core.broker.sync_engine.OrderSyncEngine`
@@ -32,6 +32,10 @@ __all__ = [
32
32
  'CapabilityLevel',
33
33
  'ExchangeOrder',
34
34
  'OrderEvent',
35
+ 'CANCEL_REASON_VENUE_REDUCE_ONLY',
36
+ 'CANCEL_REASON_VENUE_OCA',
37
+ 'CANCEL_REASON_VENUE_POSITION_CLEARED',
38
+ 'VENUE_DRIVEN_CANCEL_REASONS',
35
39
  'ExchangePosition',
36
40
  'PositionLeg',
37
41
  'ExchangeCapabilities',
@@ -230,6 +234,27 @@ class ExchangeOrder:
230
234
  client_order_id: str | None = None
231
235
 
232
236
 
237
+ #: Venue-side cancel reasons a plugin may stamp on a ``cancelled``
238
+ #: :class:`OrderEvent` when the venue itself terminated the order as a
239
+ #: deterministic consequence of the position / sibling orders it protects —
240
+ #: never an operator or foreign actor. The sync engine trims such a leg and
241
+ #: keeps running; an unclassified cancel of a bot-owned order still routes
242
+ #: through the ``on_unexpected_cancel`` policy.
243
+ CANCEL_REASON_VENUE_REDUCE_ONLY = 'venue_reduce_only'
244
+ """A reduce-only order shrunk to nothing because the net position it could
245
+ reduce fell below the summed reduce-only quantity (Bybit
246
+ ``CancelByReduceOnly``)."""
247
+ CANCEL_REASON_VENUE_OCA = 'venue_oca'
248
+ """The sibling leg of a venue-linked TP/SL pair triggered."""
249
+ CANCEL_REASON_VENUE_POSITION_CLEARED = 'venue_position_cleared'
250
+ """Position-attached protection dropped because the position was cleared."""
251
+ VENUE_DRIVEN_CANCEL_REASONS = frozenset({
252
+ CANCEL_REASON_VENUE_REDUCE_ONLY,
253
+ CANCEL_REASON_VENUE_OCA,
254
+ CANCEL_REASON_VENUE_POSITION_CLEARED,
255
+ })
256
+
257
+
233
258
  @dataclass
234
259
  class OrderEvent:
235
260
  """
@@ -284,6 +309,11 @@ class OrderEvent:
284
309
  # the handler OFF for the tracker's own events — re-applying would double
285
310
  # the audit / sibling sweep and raise the ``halt`` from the wrong place.
286
311
  from_disappearance_tracker: bool = False
312
+ # Why the venue terminated the order, when the plugin can tell and the
313
+ # cause is one of :data:`VENUE_DRIVEN_CANCEL_REASONS`; ``None`` for an
314
+ # engine-requested cancel or an unclassified one. Only meaningful on
315
+ # ``cancelled`` events.
316
+ cancel_reason: str | None = None
287
317
 
288
318
  def __str__(self) -> str:
289
319
  parts = [
@@ -398,6 +428,18 @@ class ExchangeCapabilities:
398
428
  # last extreme and amends the SL each tick / bar.
399
429
  trailing_stop: CapabilityLevel = CapabilityLevel.UNSUPPORTED
400
430
 
431
+ # #82: True when the venue's exit/bracket orders are STANDALONE working
432
+ # orders that can EXECUTE with no position behind them (DNSE: a
433
+ # protective stop is a conditional-book order that fires and fills
434
+ # regardless of position — measured live 2026-09-07, a pre-entry-fill
435
+ # protection opened a naked short). When True the engine withholds a
436
+ # protective exit until its parent entry has filled and clamps its qty
437
+ # to the live position. False (default) = attach-semantics venues
438
+ # (Capital.com/Bybit position brackets): a naked attach is rejected by
439
+ # the venue and owned by the bracket-reject recovery path, so the
440
+ # pre-fill dispatch contract is preserved there.
441
+ exit_orders_execute_standalone: bool = False
442
+
401
443
  # === Exit bracket (TP+SL with OCA reduce semantics) ===
402
444
  # NATIVE = single atomic exchange call attaches both legs (Bybit V5
403
445
  # attached TP/SL, Capital.com position-attribute bracket). The sync
@@ -625,8 +667,8 @@ class ExitIntent:
625
667
  # :meth:`__eq__` / :meth:`__hash__`: it is a *route selector* derived
626
668
  # from the intent, not state that needs to be diff-synced to the
627
669
  # broker. The sync engine's qty-cap reconciliation
628
- # (``_sync_pine_exit_qty``) mutates ``exit_orders[(exit_id, from_entry
629
- # )].size`` after a partial entry fill so the next ``build_intents``
670
+ # (``_sync_pine_exit_qty``) mutates the ``exit_orders`` entry (keyed by
671
+ # ``_exit_order_key``) ``.size`` after a partial entry fill so the next ``build_intents``
630
672
  # produces an ExitIntent with the capped qty; including the derived
631
673
  # flag in equality would let that cap mutation flip the flag and
632
674
  # trigger a spurious second ``modify_exit`` dispatch even though
@@ -715,10 +757,26 @@ class CloseIntent:
715
757
  return
716
758
  if self.synthetic_kind not in {
717
759
  'partial_trigger', 'marketable_exit', 'defensive_close',
760
+ 'reversal_close',
718
761
  }:
719
762
  raise ValueError(
720
763
  f"CloseIntent.synthetic_kind is invalid: {self.synthetic_kind!r}"
721
764
  )
765
+ if self.synthetic_kind == 'reversal_close':
766
+ # The close leg of a MARKET stop-and-reverse consumes the WHOLE
767
+ # symbol position (every Pine entry id, pyramids included), so
768
+ # it is symbol-wide by design and takes no targets. Plugins must
769
+ # dispatch it in a form that cannot open opposite exposure — a
770
+ # targeted position close or an exchange-native reduce-only
771
+ # order — because the engine deliberately does NOT wait for the
772
+ # old position's protective legs to confirm-cancel first.
773
+ if (self.target_entry_id is not None
774
+ or self.target_position_coid is not None
775
+ or self.target_exchange_id is not None):
776
+ raise ValueError(
777
+ "CloseIntent reversal_close is symbol-wide and takes no targets."
778
+ )
779
+ return
722
780
  if self.synthetic_kind in {'partial_trigger', 'marketable_exit'}:
723
781
  if (not self.target_entry_id
724
782
  or self.target_position_coid is not None
@@ -392,6 +392,18 @@ class NativeFailsafeManager:
392
392
  def get_state(self, parent_entry_dispatch_ref: str) -> NativeStopState | None:
393
393
  return self._states.get(parent_entry_dispatch_ref)
394
394
 
395
+ def pop_pending(
396
+ self, parent_entry_dispatch_ref: str,
397
+ ) -> NativeBracketSnapshot | None:
398
+ """Remove and return one parent's queued snapshot, if any.
399
+
400
+ Used by callers that dispatch a single parent's PUT synchronously
401
+ (the reversal pre-clear) instead of waiting for the next
402
+ :meth:`pending_dispatch` drain; the pop keeps the drain from
403
+ re-dispatching the same snapshot afterwards.
404
+ """
405
+ return self._pending.pop(parent_entry_dispatch_ref, None)
406
+
395
407
  def iter_states(self) -> Iterable[NativeStopState]:
396
408
  return self._states.values()
397
409