opencode-pyneruntime 6.8.5__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 (295) hide show
  1. opencode_pyneruntime-6.9.1/MANIFEST.in +3 -0
  2. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/PKG-INFO +16 -9
  3. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/README.md +15 -8
  4. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/build/opencode_pyneruntime.egg-info/SOURCES.txt +17 -0
  5. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/pyproject.toml +3 -3
  6. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/__init__.py +1 -1
  7. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/commands/benchmark.py +2 -1
  8. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/commands/run.py +35 -2
  9. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/aggregator.py +4 -4
  10. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/bar_magnifier.py +8 -2
  11. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/defaults.py +1 -1
  12. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/disappearance.py +51 -1
  13. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/exceptions.py +2 -2
  14. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/intent_builder.py +7 -1
  15. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/models.py +331 -6
  16. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/native_failsafe_manager.py +12 -0
  17. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/one_way_emulator.py +103 -9
  18. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/position.py +119 -20
  19. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/software_partial_bracket_engine.py +35 -0
  20. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/spot_inventory.py +232 -111
  21. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/storage.py +77 -9
  22. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/store_helpers.py +115 -1
  23. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/sync_engine.py +4047 -287
  24. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/validation.py +26 -0
  25. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/csv_file.py +20 -18
  26. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/currency.py +22 -14
  27. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/data_converter.py +2 -2
  28. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/datetime.py +63 -1
  29. opencode_pyneruntime-6.9.1/src/pynecore/core/fdlibm.py +540 -0
  30. opencode_pyneruntime-6.9.1/src/pynecore/core/import_hook.py +944 -0
  31. opencode_pyneruntime-6.9.1/src/pynecore/core/instance_state.py +1043 -0
  32. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/live_runner.py +373 -37
  33. opencode_pyneruntime-6.9.1/src/pynecore/core/lookahead.py +33 -0
  34. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/ohlcv.py +62 -2
  35. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/overload.py +125 -6
  36. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/pine_cast.py +4 -3
  37. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/pine_compare.py +3 -2
  38. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/pine_export.py +62 -7
  39. opencode_pyneruntime-6.9.1/src/pynecore/core/pine_import.py +39 -0
  40. opencode_pyneruntime-6.9.1/src/pynecore/core/pine_math.py +716 -0
  41. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/pine_method.py +13 -6
  42. opencode_pyneruntime-6.9.1/src/pynecore/core/pine_range.py +154 -0
  43. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/plugin/live_provider.py +49 -0
  44. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/random.py +3 -1
  45. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/resampler.py +2 -2
  46. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/safe_convert.py +26 -6
  47. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/script.py +45 -4
  48. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/script_runner.py +671 -112
  49. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/security.py +195 -74
  50. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/security_process.py +104 -31
  51. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/security_shm.py +4 -0
  52. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/series.py +158 -99
  53. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/strategy_stats.py +15 -5
  54. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/__init__.py +561 -139
  55. opencode_pyneruntime-6.9.1/src/pynecore/lib/_drawing.py +37 -0
  56. opencode_pyneruntime-6.9.1/src/pynecore/lib/_math_stateful.py +337 -0
  57. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/_timeframe_change.py +6 -0
  58. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/array.py +138 -63
  59. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/barmerge.py +12 -7
  60. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/box.py +27 -26
  61. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/chart.py +11 -10
  62. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/color.py +10 -6
  63. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/color.pyi +4 -3
  64. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/dayofweek.py +8 -3
  65. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/dayofweek.pyi +2 -1
  66. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/earnings.py +4 -3
  67. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/label.py +11 -11
  68. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/line.py +19 -20
  69. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/linefill.py +12 -0
  70. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/log.py +3 -3
  71. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/map.py +4 -2
  72. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/math.py +161 -54
  73. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/matrix.py +18 -13
  74. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/polyline.py +2 -2
  75. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/request.py +15 -12
  76. opencode_pyneruntime-6.9.1/src/pynecore/lib/runtime.py +17 -0
  77. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/session.py +32 -26
  78. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/strategy/__init__.py +2798 -798
  79. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/strategy/closedtrades.py +71 -16
  80. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/strategy/closedtrades.pyi +7 -1
  81. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/strategy/opentrades.py +43 -11
  82. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/strategy/opentrades.pyi +1 -1
  83. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/string.py +16 -9
  84. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/syminfo.py +13 -13
  85. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/ta.py +643 -184
  86. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/table.py +17 -17
  87. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/timeframe.py +20 -4
  88. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/standalone.py +2 -1
  89. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/broker_lab/runner.py +6 -5
  90. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/closure_arguments_transformer.py +12 -1
  91. opencode_pyneruntime-6.9.1/src/pynecore/transformers/const_fold.py +578 -0
  92. opencode_pyneruntime-6.9.1/src/pynecore/transformers/dynamic_default.py +338 -0
  93. opencode_pyneruntime-6.9.1/src/pynecore/transformers/edge_rules.json +135 -0
  94. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/float_tolerance.py +7 -1
  95. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/function_isolation.py +240 -174
  96. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/import_normalizer.py +68 -27
  97. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/input_transformer.py +11 -2
  98. opencode_pyneruntime-6.9.1/src/pynecore/transformers/lib_types.json +9258 -0
  99. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/module_properties.json +116 -11
  100. opencode_pyneruntime-6.9.1/src/pynecore/transformers/node_ids.py +50 -0
  101. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/persistent.py +35 -1
  102. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/persistent_series.py +6 -0
  103. opencode_pyneruntime-6.9.1/src/pynecore/transformers/pine_edge_gate.py +607 -0
  104. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/pine_truthiness.py +6 -1
  105. opencode_pyneruntime-6.9.1/src/pynecore/transformers/pine_type_artifact.py +1026 -0
  106. opencode_pyneruntime-6.9.1/src/pynecore/transformers/pine_type_infer.py +4789 -0
  107. opencode_pyneruntime-6.9.1/src/pynecore/transformers/pine_type_report.py +384 -0
  108. opencode_pyneruntime-6.9.1/src/pynecore/transformers/pine_type_rules.py +1900 -0
  109. opencode_pyneruntime-6.9.1/src/pynecore/transformers/pine_type_table.py +411 -0
  110. opencode_pyneruntime-6.9.1/src/pynecore/transformers/pine_type_transformer.py +76 -0
  111. opencode_pyneruntime-6.9.1/src/pynecore/transformers/safe_convert_transformer.py +220 -0
  112. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/safe_division_transformer.py +7 -3
  113. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/security.py +16 -2
  114. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/series.py +80 -18
  115. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/slot_layout.py +49 -10
  116. opencode_pyneruntime-6.9.1/src/pynecore/transformers/ta_variable_hoist.py +181 -0
  117. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/matrix.py +18 -9
  118. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/na.py +76 -14
  119. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/na.pyi +14 -2
  120. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/pine_types.py +4 -1
  121. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/pine_types.pyi +2 -1
  122. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/strategy.py +15 -0
  123. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/utils/sequence_view.py +12 -23
  124. opencode_pyneruntime-6.8.5/MANIFEST.in +0 -3
  125. opencode_pyneruntime-6.8.5/src/pynecore/core/import_hook.py +0 -454
  126. opencode_pyneruntime-6.8.5/src/pynecore/core/instance_state.py +0 -599
  127. opencode_pyneruntime-6.8.5/src/pynecore/core/pine_range.py +0 -86
  128. opencode_pyneruntime-6.8.5/src/pynecore/lib/_math_stateful.py +0 -255
  129. opencode_pyneruntime-6.8.5/src/pynecore/lib/runtime.py +0 -5
  130. opencode_pyneruntime-6.8.5/src/pynecore/transformers/dynamic_default.py +0 -147
  131. opencode_pyneruntime-6.8.5/src/pynecore/transformers/safe_convert_transformer.py +0 -97
  132. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/LICENSE +0 -0
  133. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/NOTICE +0 -0
  134. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/setup.cfg +0 -0
  135. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/__init__.py +0 -0
  136. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/app.py +0 -0
  137. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/commands/__init__.py +0 -0
  138. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/commands/compile.py +0 -0
  139. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/commands/data.py +0 -0
  140. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/commands/debug.py +0 -0
  141. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/commands/optimize.py +0 -0
  142. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/commands/plugin.py +0 -0
  143. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/pluggable.py +0 -0
  144. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/utils/__init__.py +0 -0
  145. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/utils/api_error_handler.py +0 -0
  146. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/utils/broker_picker.py +0 -0
  147. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/utils/error_hook.py +0 -0
  148. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/utils/keyreader.py +0 -0
  149. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/utils/provider_picker.py +0 -0
  150. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/utils/symbol_browser.py +0 -0
  151. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/__init__.py +0 -0
  152. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/_file_io.py +0 -0
  153. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/__init__.py +0 -0
  154. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/emulator.py +0 -0
  155. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/idempotency.py +0 -0
  156. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/journal.py +0 -0
  157. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/run_identity.py +0 -0
  158. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/software_entry_stop_engine.py +0 -0
  159. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/class_property.py +0 -0
  160. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/config.py +0 -0
  161. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/download_info.py +0 -0
  162. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/download_runner.py +0 -0
  163. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/drawing_snapshot.py +0 -0
  164. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/htf_aggregator.py +0 -0
  165. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/live_ltf_collector.py +0 -0
  166. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/live_ltf_window.py +0 -0
  167. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/module_property.py +0 -0
  168. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/ohlcv_importers.py +0 -0
  169. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/ohlcv_legacy.py +0 -0
  170. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/pine_udt.py +0 -0
  171. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/plugin/__init__.py +0 -0
  172. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/plugin/broker.py +0 -0
  173. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/plugin/cli.py +0 -0
  174. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/plugin/provider.py +0 -0
  175. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/provider_string.py +0 -0
  176. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/rolling_sum.py +0 -0
  177. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/session.py +0 -0
  178. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/symbol_map.py +0 -0
  179. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/syminfo.py +0 -0
  180. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/core/viz.py +0 -0
  181. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/_fixnan.py +0 -0
  182. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/adjustment.py +0 -0
  183. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/alert.py +0 -0
  184. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/alert.pyi +0 -0
  185. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/barstate.py +0 -0
  186. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/currency.py +0 -0
  187. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/display.py +0 -0
  188. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/dividends.py +0 -0
  189. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/extend.py +0 -0
  190. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/font.py +0 -0
  191. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/footprint.py +0 -0
  192. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/format.py +0 -0
  193. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/hline.py +0 -0
  194. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/hline.pyi +0 -0
  195. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/location.py +0 -0
  196. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/order.py +0 -0
  197. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/pivotpointtype.py +0 -0
  198. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/plot.py +0 -0
  199. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/plot.pyi +0 -0
  200. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/position.py +0 -0
  201. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/scale.py +0 -0
  202. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/session.pyi +0 -0
  203. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/shape.py +0 -0
  204. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/size.py +0 -0
  205. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/splits.py +0 -0
  206. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/strategy/commission.py +0 -0
  207. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/strategy/direction.py +0 -0
  208. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/strategy/oca.py +0 -0
  209. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/strategy/risk.py +0 -0
  210. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/text.py +0 -0
  211. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/ticker.py +0 -0
  212. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/volume_row.py +0 -0
  213. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/xloc.py +0 -0
  214. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/yloc.py +0 -0
  215. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/providers/__init__.py +0 -0
  216. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/providers/ccxt.py +0 -0
  217. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/providers/replay.py +0 -0
  218. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/pynesys/__init__.py +0 -0
  219. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/pynesys/api.py +0 -0
  220. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/pynesys/compiler.py +0 -0
  221. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/__init__.py +0 -0
  222. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/broker_lab/__init__.py +0 -0
  223. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/broker_lab/__main__.py +0 -0
  224. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/broker_lab/cli.py +0 -0
  225. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/broker_lab/generate.py +0 -0
  226. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/broker_lab/model.py +0 -0
  227. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/broker_lab/reference.py +0 -0
  228. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/broker_lab/scheduler.py +0 -0
  229. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/broker_lab/subprocess.py +0 -0
  230. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/__init__.py +0 -0
  231. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/builtin_shadow.py +0 -0
  232. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/display_rewrite.py +0 -0
  233. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/import_lifter.py +0 -0
  234. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/inline_series_hoist.py +0 -0
  235. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/lib_series.py +0 -0
  236. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/locations.py +0 -0
  237. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/module_property.py +0 -0
  238. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/script_requirements.py +0 -0
  239. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/security_instantiation.py +0 -0
  240. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/type_checking_stripper.py +0 -0
  241. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/unused_series_detector.py +0 -0
  242. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/__init__.py +0 -0
  243. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/alert.py +0 -0
  244. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/barmerge.py +0 -0
  245. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/base.py +0 -0
  246. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/box.py +0 -0
  247. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/chart.py +0 -0
  248. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/color.py +0 -0
  249. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/currency.py +0 -0
  250. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/datetime.py +0 -0
  251. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/display.py +0 -0
  252. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/dividends.py +0 -0
  253. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/earnings.py +0 -0
  254. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/extend.py +0 -0
  255. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/font.py +0 -0
  256. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/footprint.py +0 -0
  257. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/format.py +0 -0
  258. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/hline.py +0 -0
  259. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/ib_persistent.py +0 -0
  260. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/ib_persistent.pyi +0 -0
  261. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/label.py +0 -0
  262. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/line.py +0 -0
  263. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/linefill.py +0 -0
  264. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/location.py +0 -0
  265. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/ohlcv.py +0 -0
  266. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/order.py +0 -0
  267. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/persistent.py +0 -0
  268. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/persistent.pyi +0 -0
  269. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/pivotpointtype.py +0 -0
  270. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/plot.py +0 -0
  271. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/plot_meta.py +0 -0
  272. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/polyline.py +0 -0
  273. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/position.py +0 -0
  274. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/scale.py +0 -0
  275. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/script_type.py +0 -0
  276. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/series.py +0 -0
  277. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/series.pyi +0 -0
  278. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/session.py +0 -0
  279. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/shape.py +0 -0
  280. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/size.py +0 -0
  281. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/source.py +0 -0
  282. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/splits.py +0 -0
  283. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/table.py +0 -0
  284. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/text.py +0 -0
  285. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/type_checker.py +0 -0
  286. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/type_checker.pyi +0 -0
  287. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/volume_row.py +0 -0
  288. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/weekdays.py +0 -0
  289. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/xloc.py +0 -0
  290. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/types/yloc.py +0 -0
  291. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/utils/__init__.py +0 -0
  292. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/utils/file_utils.py +0 -0
  293. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/utils/rich/__init__.py +0 -0
  294. {opencode_pyneruntime-6.8.5 → opencode_pyneruntime-6.9.1}/src/pynecore/utils/rich/date_column.py +0 -0
  295. {opencode_pyneruntime-6.8.5 → 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.5
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
@@ -224,15 +224,22 @@ auto-discovered through the `pyne.plugin` entry-point group:
224
224
  | **DNSE** — [`plugins/dnse`](plugins/dnse) | `dnse` (data) · `dnse_broker` (broker) | Vietnamese derivatives & stocks: OHLCV history + **native STOP/OCO conditional orders** on DNSE's OpenAPI, built on the vendored `openapi-sdk` 2.0.0. REST-only. |
225
225
 
226
226
  ```bash
227
- # historical / live data feed
228
- pyne run my_strategy.py dnse:VN30F1M@5 --from -500
227
+ # historical / live data feed (no --from: it truncates the shared .ohlcv cache;
228
+ # the built-in -500-real-bars default is both safe and deep enough)
229
+ pyne run my_strategy.py dnse:VN30F1M@5
229
230
 
230
231
  # live broker — places REAL orders (implies --live)
231
232
  pyne run my_strategy.py dnse_broker:VN30F1M@5 --broker
232
233
  ```
233
234
 
234
- Unit tests: `pytest plugins/dnse/tests/`. The vendored SDK, a mirror of DNSE's
235
- OpenAPI docs (`docs/dnse-openapi-documentation/`) with a sync/verify tool, and the
235
+ Testing: `pytest plugins/dnse/tests/` (unit + offline e2e against a fake venue that
236
+ reproduces DNSE's measured quirks), plus a live-test suite a session-independent
237
+ venue-semantics gate and two staged live probes (no-fill place/amend/cancel/OCA cases
238
+ and a fill matrix whose backtest mode doubles as the oracle). Procedures, safety rules
239
+ and the measured venue facts: [`plugins/dnse/testing/live_test/README.md`](plugins/dnse/testing/live_test/README.md).
240
+
241
+ The vendored SDK, a mirror of DNSE's OpenAPI docs
242
+ (`docs/dnse-openapi-documentation/`) with a sync/verify tool, and the
236
243
  error-handling plan (`docs/plan/`) live alongside the plugin.
237
244
 
238
245
  **Reference plugins** — the DNSE plugin follows PyneSys's official broker-plugin
@@ -253,10 +260,10 @@ examples, kept as workspace siblings for pattern reference:
253
260
  ## Pine Script Migration Made Easy
254
261
 
255
262
  Have existing Pine Script code you want to run in Python? **PyneSys now offers automatic Pine
256
- 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).
257
264
 
258
265
  ### 🚀 Get Started Instantly
259
- - **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!
260
267
  - **Full service**: Visit [pynesys.io](https://pynesys.io) for subscriptions and higher limits
261
268
 
262
269
  ### 💡 Support the Ecosystem
@@ -274,7 +281,7 @@ Love PyneCore and want to see it grow? Consider a **Seed subscription or higher*
274
281
  ### Community
275
282
 
276
283
  - **Discussions**: [GitHub Discussions](https://github.com/pynesys/pynecore/discussions)
277
- - **Discord**: [discord.com/invite/jegnhtq6gy](https://discord.com/invite/jegnhtq6gy)
284
+ - **Discord**: [discord.pynesys.io](https://discord.pynesys.io)
278
285
  - **X**: [x.com/pynesys](https://x.com/pynesys)
279
286
  - **Website**: [pynecore.org](https://pynecore.org)
280
287
 
@@ -179,15 +179,22 @@ auto-discovered through the `pyne.plugin` entry-point group:
179
179
  | **DNSE** — [`plugins/dnse`](plugins/dnse) | `dnse` (data) · `dnse_broker` (broker) | Vietnamese derivatives & stocks: OHLCV history + **native STOP/OCO conditional orders** on DNSE's OpenAPI, built on the vendored `openapi-sdk` 2.0.0. REST-only. |
180
180
 
181
181
  ```bash
182
- # historical / live data feed
183
- pyne run my_strategy.py dnse:VN30F1M@5 --from -500
182
+ # historical / live data feed (no --from: it truncates the shared .ohlcv cache;
183
+ # the built-in -500-real-bars default is both safe and deep enough)
184
+ pyne run my_strategy.py dnse:VN30F1M@5
184
185
 
185
186
  # live broker — places REAL orders (implies --live)
186
187
  pyne run my_strategy.py dnse_broker:VN30F1M@5 --broker
187
188
  ```
188
189
 
189
- Unit tests: `pytest plugins/dnse/tests/`. The vendored SDK, a mirror of DNSE's
190
- OpenAPI docs (`docs/dnse-openapi-documentation/`) with a sync/verify tool, and the
190
+ Testing: `pytest plugins/dnse/tests/` (unit + offline e2e against a fake venue that
191
+ reproduces DNSE's measured quirks), plus a live-test suite a session-independent
192
+ venue-semantics gate and two staged live probes (no-fill place/amend/cancel/OCA cases
193
+ and a fill matrix whose backtest mode doubles as the oracle). Procedures, safety rules
194
+ and the measured venue facts: [`plugins/dnse/testing/live_test/README.md`](plugins/dnse/testing/live_test/README.md).
195
+
196
+ The vendored SDK, a mirror of DNSE's OpenAPI docs
197
+ (`docs/dnse-openapi-documentation/`) with a sync/verify tool, and the
191
198
  error-handling plan (`docs/plan/`) live alongside the plugin.
192
199
 
193
200
  **Reference plugins** — the DNSE plugin follows PyneSys's official broker-plugin
@@ -208,10 +215,10 @@ examples, kept as workspace siblings for pattern reference:
208
215
  ## Pine Script Migration Made Easy
209
216
 
210
217
  Have existing Pine Script code you want to run in Python? **PyneSys now offers automatic Pine
211
- 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).
212
219
 
213
220
  ### 🚀 Get Started Instantly
214
- - **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!
215
222
  - **Full service**: Visit [pynesys.io](https://pynesys.io) for subscriptions and higher limits
216
223
 
217
224
  ### 💡 Support the Ecosystem
@@ -229,7 +236,7 @@ Love PyneCore and want to see it grow? Consider a **Seed subscription or higher*
229
236
  ### Community
230
237
 
231
238
  - **Discussions**: [GitHub Discussions](https://github.com/pynesys/pynecore/discussions)
232
- - **Discord**: [discord.com/invite/jegnhtq6gy](https://discord.com/invite/jegnhtq6gy)
239
+ - **Discord**: [discord.pynesys.io](https://discord.pynesys.io)
233
240
  - **X**: [x.com/pynesys](https://x.com/pynesys)
234
241
  - **Website**: [pynecore.org](https://pynecore.org)
235
242
 
@@ -260,4 +267,4 @@ PyneCore is part of the PyneSys ecosystem. For commercial support, custom develo
260
267
  - **Website**: [pynesys.com/contact](https://pynesys.com/contact)
261
268
 
262
269
  ---
263
- <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.5" # 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
 
@@ -1005,8 +1030,12 @@ def _print_data_requirements(requirements: DataRequirements, script_name: str) -
1005
1030
  lines.append("")
1006
1031
  lines.append("Same symbol, other timeframe (resampled from the chart base data):")
1007
1032
  for r in requirements.same_symbol_other_tf:
1008
- suffix = (" [mapping present]" if r.has_security_mapping
1009
- else f" [needs --security '{r.timeframe}=<base file>' in backtest]")
1033
+ if r.has_security_mapping:
1034
+ suffix = " [mapping present]"
1035
+ elif r.derived_from_chart:
1036
+ suffix = " [served from the chart data, nothing to supply]"
1037
+ else:
1038
+ suffix = f" [needs --security '{r.timeframe}=<base file>' in backtest]"
1010
1039
  lines.append(f" -> {r.symbol} @ {r.timeframe}{_tags(r)}{suffix}")
1011
1040
 
1012
1041
  if requirements.cross_symbol:
@@ -1411,6 +1440,7 @@ def run(
1411
1440
  else:
1412
1441
  ohlcv_iter = reader.read_from(time_from_ts, time_to_ts)
1413
1442
  lossless_volume = reader.lossless_volume
1443
+ lossless_prices = reader.lossless_prices
1414
1444
 
1415
1445
  # --broker implies --live.
1416
1446
  if broker:
@@ -1639,6 +1669,8 @@ def run(
1639
1669
  from pynecore import lib as _lib
1640
1670
  _lib._is_live = True
1641
1671
  _lib._strategy_suppressed = True
1672
+ else:
1673
+ _pin_timenow(last_bar_time)
1642
1674
 
1643
1675
  # Show loading spinner while importing
1644
1676
  with Progress(
@@ -1674,6 +1706,7 @@ def run(
1674
1706
  time_from=time_from_dt,
1675
1707
  chart_data_path=data_path,
1676
1708
  lossless_volume=lossless_volume,
1709
+ lossless_prices=lossless_prices,
1677
1710
  config_dir=app_state.config_dir)
1678
1711
  finally:
1679
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`
@@ -123,6 +123,11 @@ def build_entry_intent(order: Order, symbol: str) -> EntryIntent:
123
123
  exactly once per fresh intent — folding here would make a stale
124
124
  retained order's qty flap with the net position and re-trigger the
125
125
  diff (measured on the Capital.com demo E2E, 2026-07-10).
126
+
127
+ ``Order.skip_flip`` rides along so that fold can be suppressed for an entry
128
+ re-placed on its own bar: TV modifies the standing order with the raw
129
+ quantity and never recomputes the flip, so folding it at dispatch would
130
+ reverse a position the script only meant to reduce.
126
131
  """
127
132
  oca_name, oca_type_str = _coerce_oca(order)
128
133
  return EntryIntent(
@@ -138,6 +143,7 @@ def build_entry_intent(order: Order, symbol: str) -> EntryIntent:
138
143
  comment=_na_to_none(order.comment),
139
144
  alert_message=_na_to_none(order.alert_message),
140
145
  is_strategy_order=(order.order_type == _order_type_normal),
146
+ skip_flip=order.skip_flip,
141
147
  )
142
148
 
143
149