opencode-pyneruntime 6.6.4__tar.gz → 6.8.5__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 (279) hide show
  1. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/PKG-INFO +28 -1
  2. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/README.md +27 -0
  3. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/build/opencode_pyneruntime.egg-info/SOURCES.txt +10 -2
  4. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/pyproject.toml +1 -1
  5. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/cli/commands/__init__.py +52 -25
  6. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/cli/commands/benchmark.py +3 -2
  7. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/cli/commands/data.py +5 -9
  8. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/cli/commands/optimize.py +4 -3
  9. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/cli/commands/run.py +107 -75
  10. opencode_pyneruntime-6.8.5/src/pynecore/core/_file_io.py +296 -0
  11. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/aggregator.py +37 -32
  12. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/bar_magnifier.py +7 -6
  13. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/broker/position.py +15 -2
  14. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/csv_file.py +231 -92
  15. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/currency.py +82 -30
  16. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/data_converter.py +177 -141
  17. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/datetime.py +15 -8
  18. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/download_runner.py +36 -12
  19. opencode_pyneruntime-6.8.5/src/pynecore/core/drawing_snapshot.py +58 -0
  20. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/htf_aggregator.py +3 -2
  21. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/import_hook.py +125 -29
  22. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/instance_state.py +126 -21
  23. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/live_ltf_collector.py +4 -4
  24. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/live_runner.py +117 -90
  25. opencode_pyneruntime-6.8.5/src/pynecore/core/ohlcv.py +2868 -0
  26. opencode_pyneruntime-6.8.5/src/pynecore/core/ohlcv_importers.py +960 -0
  27. opencode_pyneruntime-6.8.5/src/pynecore/core/ohlcv_legacy.py +387 -0
  28. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/overload.py +186 -65
  29. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/pine_cast.py +14 -4
  30. opencode_pyneruntime-6.8.5/src/pynecore/core/pine_compare.py +96 -0
  31. opencode_pyneruntime-6.8.5/src/pynecore/core/pine_udt.py +148 -0
  32. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/plugin/provider.py +35 -11
  33. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/resampler.py +168 -26
  34. opencode_pyneruntime-6.8.5/src/pynecore/core/rolling_sum.py +54 -0
  35. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/safe_convert.py +1 -1
  36. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/script_runner.py +294 -125
  37. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/security.py +145 -73
  38. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/security_process.py +87 -54
  39. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/series.py +117 -23
  40. opencode_pyneruntime-6.8.5/src/pynecore/core/session.py +100 -0
  41. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/syminfo.py +47 -3
  42. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/__init__.py +293 -150
  43. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/_fixnan.py +3 -4
  44. opencode_pyneruntime-6.8.5/src/pynecore/lib/_math_stateful.py +255 -0
  45. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/array.py +463 -196
  46. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/box.py +2 -3
  47. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/color.py +15 -10
  48. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/color.pyi +2 -1
  49. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/dayofweek.py +12 -1
  50. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/label.py +26 -15
  51. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/line.py +2 -3
  52. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/map.py +3 -3
  53. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/math.py +76 -43
  54. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/matrix.py +60 -19
  55. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/plot.py +12 -2
  56. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/request.py +33 -9
  57. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/session.py +2 -94
  58. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/strategy/__init__.py +500 -195
  59. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/strategy/opentrades.py +32 -18
  60. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/strategy/opentrades.pyi +6 -7
  61. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/string.py +319 -123
  62. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/ta.py +756 -423
  63. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/ticker.py +2 -2
  64. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/timeframe.py +2 -2
  65. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/providers/ccxt.py +27 -23
  66. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/providers/replay.py +2 -2
  67. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/standalone.py +3 -2
  68. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/transformers/closure_arguments_transformer.py +9 -7
  69. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/transformers/display_rewrite.py +3 -3
  70. opencode_pyneruntime-6.8.5/src/pynecore/transformers/float_tolerance.py +246 -0
  71. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/transformers/function_isolation.py +166 -40
  72. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/transformers/module_properties.json +30 -9
  73. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/transformers/persistent.py +8 -65
  74. opencode_pyneruntime-6.8.5/src/pynecore/transformers/pine_truthiness.py +159 -0
  75. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/transformers/slot_layout.py +27 -20
  76. opencode_pyneruntime-6.8.5/src/pynecore/types/base.py +67 -0
  77. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/box.py +2 -2
  78. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/color.py +33 -7
  79. opencode_pyneruntime-6.8.5/src/pynecore/types/ib_persistent.pyi +26 -0
  80. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/label.py +3 -4
  81. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/line.py +2 -3
  82. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/linefill.py +2 -1
  83. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/matrix.py +26 -16
  84. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/na.py +2 -1
  85. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/na.pyi +5 -0
  86. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/ohlcv.py +1 -1
  87. opencode_pyneruntime-6.8.5/src/pynecore/types/persistent.pyi +24 -0
  88. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/polyline.py +2 -1
  89. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/series.py +6 -2
  90. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/series.pyi +19 -0
  91. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/session.py +4 -3
  92. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/table.py +2 -1
  93. opencode_pyneruntime-6.8.5/src/pynecore/types/type_checker.pyi +86 -0
  94. opencode_pyneruntime-6.8.5/src/pynecore/utils/sequence_view.py +138 -0
  95. opencode_pyneruntime-6.6.4/src/pynecore/core/ohlcv_file.py +0 -1888
  96. opencode_pyneruntime-6.6.4/src/pynecore/core/pine_udt.py +0 -69
  97. opencode_pyneruntime-6.6.4/src/pynecore/lib/_math_stateful.py +0 -202
  98. opencode_pyneruntime-6.6.4/src/pynecore/transformers/ne_guard.py +0 -70
  99. opencode_pyneruntime-6.6.4/src/pynecore/types/base.py +0 -39
  100. opencode_pyneruntime-6.6.4/src/pynecore/types/ib_persistent.pyi +0 -10
  101. opencode_pyneruntime-6.6.4/src/pynecore/types/persistent.pyi +0 -13
  102. opencode_pyneruntime-6.6.4/src/pynecore/types/type_checker.pyi +0 -48
  103. opencode_pyneruntime-6.6.4/src/pynecore/utils/sequence_view.py +0 -92
  104. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/LICENSE +0 -0
  105. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/MANIFEST.in +0 -0
  106. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/NOTICE +0 -0
  107. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/setup.cfg +0 -0
  108. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/__init__.py +0 -0
  109. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/cli/__init__.py +0 -0
  110. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/cli/app.py +0 -0
  111. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/cli/commands/compile.py +0 -0
  112. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/cli/commands/debug.py +0 -0
  113. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/cli/commands/plugin.py +0 -0
  114. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/cli/pluggable.py +0 -0
  115. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/cli/utils/__init__.py +0 -0
  116. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/cli/utils/api_error_handler.py +0 -0
  117. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/cli/utils/broker_picker.py +0 -0
  118. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/cli/utils/error_hook.py +0 -0
  119. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/cli/utils/keyreader.py +0 -0
  120. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/cli/utils/provider_picker.py +0 -0
  121. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/cli/utils/symbol_browser.py +0 -0
  122. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/__init__.py +0 -0
  123. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/broker/__init__.py +0 -0
  124. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/broker/defaults.py +0 -0
  125. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/broker/disappearance.py +0 -0
  126. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/broker/emulator.py +0 -0
  127. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/broker/exceptions.py +0 -0
  128. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/broker/idempotency.py +0 -0
  129. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/broker/intent_builder.py +0 -0
  130. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/broker/journal.py +0 -0
  131. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/broker/models.py +0 -0
  132. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/broker/native_failsafe_manager.py +0 -0
  133. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/broker/one_way_emulator.py +0 -0
  134. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/broker/run_identity.py +0 -0
  135. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/broker/software_entry_stop_engine.py +0 -0
  136. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/broker/software_partial_bracket_engine.py +0 -0
  137. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/broker/spot_inventory.py +0 -0
  138. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/broker/storage.py +0 -0
  139. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/broker/store_helpers.py +0 -0
  140. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/broker/sync_engine.py +0 -0
  141. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/broker/validation.py +0 -0
  142. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/class_property.py +0 -0
  143. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/config.py +0 -0
  144. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/download_info.py +0 -0
  145. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/live_ltf_window.py +0 -0
  146. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/module_property.py +0 -0
  147. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/pine_export.py +0 -0
  148. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/pine_method.py +0 -0
  149. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/pine_range.py +0 -0
  150. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/plugin/__init__.py +0 -0
  151. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/plugin/broker.py +0 -0
  152. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/plugin/cli.py +0 -0
  153. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/plugin/live_provider.py +0 -0
  154. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/provider_string.py +0 -0
  155. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/random.py +0 -0
  156. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/script.py +0 -0
  157. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/security_shm.py +0 -0
  158. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/strategy_stats.py +0 -0
  159. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/symbol_map.py +0 -0
  160. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/core/viz.py +0 -0
  161. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/_timeframe_change.py +0 -0
  162. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/adjustment.py +0 -0
  163. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/alert.py +0 -0
  164. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/alert.pyi +0 -0
  165. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/barmerge.py +0 -0
  166. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/barstate.py +0 -0
  167. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/chart.py +0 -0
  168. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/currency.py +0 -0
  169. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/dayofweek.pyi +0 -0
  170. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/display.py +0 -0
  171. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/dividends.py +0 -0
  172. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/earnings.py +0 -0
  173. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/extend.py +0 -0
  174. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/font.py +0 -0
  175. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/footprint.py +0 -0
  176. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/format.py +0 -0
  177. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/hline.py +0 -0
  178. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/hline.pyi +0 -0
  179. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/linefill.py +0 -0
  180. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/location.py +0 -0
  181. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/log.py +0 -0
  182. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/order.py +0 -0
  183. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/pivotpointtype.py +0 -0
  184. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/plot.pyi +0 -0
  185. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/polyline.py +0 -0
  186. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/position.py +0 -0
  187. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/runtime.py +0 -0
  188. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/scale.py +0 -0
  189. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/session.pyi +0 -0
  190. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/shape.py +0 -0
  191. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/size.py +0 -0
  192. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/splits.py +0 -0
  193. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/strategy/closedtrades.py +0 -0
  194. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/strategy/closedtrades.pyi +0 -0
  195. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/strategy/commission.py +0 -0
  196. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/strategy/direction.py +0 -0
  197. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/strategy/oca.py +0 -0
  198. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/strategy/risk.py +0 -0
  199. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/syminfo.py +0 -0
  200. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/table.py +0 -0
  201. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/text.py +0 -0
  202. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/volume_row.py +0 -0
  203. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/xloc.py +0 -0
  204. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/lib/yloc.py +0 -0
  205. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/providers/__init__.py +0 -0
  206. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/pynesys/__init__.py +0 -0
  207. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/pynesys/api.py +0 -0
  208. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/pynesys/compiler.py +0 -0
  209. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/testing/__init__.py +0 -0
  210. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/testing/broker_lab/__init__.py +0 -0
  211. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/testing/broker_lab/__main__.py +0 -0
  212. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/testing/broker_lab/cli.py +0 -0
  213. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/testing/broker_lab/generate.py +0 -0
  214. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/testing/broker_lab/model.py +0 -0
  215. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/testing/broker_lab/reference.py +0 -0
  216. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/testing/broker_lab/runner.py +0 -0
  217. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/testing/broker_lab/scheduler.py +0 -0
  218. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/testing/broker_lab/subprocess.py +0 -0
  219. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/transformers/__init__.py +0 -0
  220. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/transformers/builtin_shadow.py +0 -0
  221. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/transformers/dynamic_default.py +0 -0
  222. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/transformers/import_lifter.py +0 -0
  223. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/transformers/import_normalizer.py +0 -0
  224. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/transformers/inline_series_hoist.py +0 -0
  225. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/transformers/input_transformer.py +0 -0
  226. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/transformers/lib_series.py +0 -0
  227. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/transformers/locations.py +0 -0
  228. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/transformers/module_property.py +0 -0
  229. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/transformers/persistent_series.py +0 -0
  230. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/transformers/safe_convert_transformer.py +0 -0
  231. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/transformers/safe_division_transformer.py +0 -0
  232. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/transformers/script_requirements.py +0 -0
  233. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/transformers/security.py +0 -0
  234. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/transformers/security_instantiation.py +0 -0
  235. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/transformers/series.py +0 -0
  236. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/transformers/type_checking_stripper.py +0 -0
  237. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/transformers/unused_series_detector.py +0 -0
  238. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/__init__.py +0 -0
  239. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/alert.py +0 -0
  240. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/barmerge.py +0 -0
  241. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/chart.py +0 -0
  242. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/currency.py +0 -0
  243. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/datetime.py +0 -0
  244. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/display.py +0 -0
  245. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/dividends.py +0 -0
  246. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/earnings.py +0 -0
  247. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/extend.py +0 -0
  248. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/font.py +0 -0
  249. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/footprint.py +0 -0
  250. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/format.py +0 -0
  251. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/hline.py +0 -0
  252. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/ib_persistent.py +0 -0
  253. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/location.py +0 -0
  254. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/order.py +0 -0
  255. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/persistent.py +0 -0
  256. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/pine_types.py +0 -0
  257. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/pine_types.pyi +0 -0
  258. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/pivotpointtype.py +0 -0
  259. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/plot.py +0 -0
  260. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/plot_meta.py +0 -0
  261. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/position.py +0 -0
  262. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/scale.py +0 -0
  263. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/script_type.py +0 -0
  264. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/shape.py +0 -0
  265. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/size.py +0 -0
  266. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/source.py +0 -0
  267. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/splits.py +0 -0
  268. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/strategy.py +0 -0
  269. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/text.py +0 -0
  270. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/type_checker.py +0 -0
  271. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/volume_row.py +0 -0
  272. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/weekdays.py +0 -0
  273. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/xloc.py +0 -0
  274. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/types/yloc.py +0 -0
  275. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/utils/__init__.py +0 -0
  276. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/utils/file_utils.py +0 -0
  277. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/utils/rich/__init__.py +0 -0
  278. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/utils/rich/date_column.py +0 -0
  279. {opencode_pyneruntime-6.6.4 → opencode_pyneruntime-6.8.5}/src/pynecore/utils/stdlib_checker.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opencode-pyneruntime
3
- Version: 6.6.4
3
+ Version: 6.8.5
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
@@ -214,6 +214,33 @@ pyne run my_indicator.py ccxt_BYBIT_BTC_USDT_USDT_1D.ohlcv
214
214
 
215
215
  > **Note**: Pine Script compilation requires a PyneSys API key. Get yours at [pynesys.io](https://pynesys.io).
216
216
 
217
+ ## Broker Plugins (this fork)
218
+
219
+ This fork adds venue plugins under [`plugins/`](plugins/), editable-installed and
220
+ auto-discovered through the `pyne.plugin` entry-point group:
221
+
222
+ | Plugin | Entry points | What it does |
223
+ |---|---|---|
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
+
226
+ ```bash
227
+ # historical / live data feed
228
+ pyne run my_strategy.py dnse:VN30F1M@5 --from -500
229
+
230
+ # live broker — places REAL orders (implies --live)
231
+ pyne run my_strategy.py dnse_broker:VN30F1M@5 --broker
232
+ ```
233
+
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
236
+ error-handling plan (`docs/plan/`) live alongside the plugin.
237
+
238
+ **Reference plugins** — the DNSE plugin follows PyneSys's official broker-plugin
239
+ examples, kept as workspace siblings for pattern reference:
240
+ [`pynecore-plugin-bybit`](https://github.com/PyneSys/pynecore-plugin-bybit),
241
+ [`pynecore-plugin-capitalcom`](https://github.com/PyneSys/pynecore-plugin-capitalcom),
242
+ [`pynecore-plugin-ctrader`](https://github.com/PyneSys/pynecore-plugin-ctrader).
243
+
217
244
  ## Why Choose PyneCore?
218
245
 
219
246
  - **Beyond TradingView Limitations**: No more platform restrictions, code size limits, or subscription fees
@@ -169,6 +169,33 @@ pyne run my_indicator.py ccxt_BYBIT_BTC_USDT_USDT_1D.ohlcv
169
169
 
170
170
  > **Note**: Pine Script compilation requires a PyneSys API key. Get yours at [pynesys.io](https://pynesys.io).
171
171
 
172
+ ## Broker Plugins (this fork)
173
+
174
+ This fork adds venue plugins under [`plugins/`](plugins/), editable-installed and
175
+ auto-discovered through the `pyne.plugin` entry-point group:
176
+
177
+ | Plugin | Entry points | What it does |
178
+ |---|---|---|
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
+
181
+ ```bash
182
+ # historical / live data feed
183
+ pyne run my_strategy.py dnse:VN30F1M@5 --from -500
184
+
185
+ # live broker — places REAL orders (implies --live)
186
+ pyne run my_strategy.py dnse_broker:VN30F1M@5 --broker
187
+ ```
188
+
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
191
+ error-handling plan (`docs/plan/`) live alongside the plugin.
192
+
193
+ **Reference plugins** — the DNSE plugin follows PyneSys's official broker-plugin
194
+ examples, kept as workspace siblings for pattern reference:
195
+ [`pynecore-plugin-bybit`](https://github.com/PyneSys/pynecore-plugin-bybit),
196
+ [`pynecore-plugin-capitalcom`](https://github.com/PyneSys/pynecore-plugin-capitalcom),
197
+ [`pynecore-plugin-ctrader`](https://github.com/PyneSys/pynecore-plugin-ctrader).
198
+
172
199
  ## Why Choose PyneCore?
173
200
 
174
201
  - **Beyond TradingView Limitations**: No more platform restrictions, code size limits, or subscription fees
@@ -24,6 +24,7 @@ src/pynecore/cli/utils/keyreader.py
24
24
  src/pynecore/cli/utils/provider_picker.py
25
25
  src/pynecore/cli/utils/symbol_browser.py
26
26
  src/pynecore/core/__init__.py
27
+ src/pynecore/core/_file_io.py
27
28
  src/pynecore/core/aggregator.py
28
29
  src/pynecore/core/bar_magnifier.py
29
30
  src/pynecore/core/class_property.py
@@ -34,6 +35,7 @@ src/pynecore/core/data_converter.py
34
35
  src/pynecore/core/datetime.py
35
36
  src/pynecore/core/download_info.py
36
37
  src/pynecore/core/download_runner.py
38
+ src/pynecore/core/drawing_snapshot.py
37
39
  src/pynecore/core/htf_aggregator.py
38
40
  src/pynecore/core/import_hook.py
39
41
  src/pynecore/core/instance_state.py
@@ -41,9 +43,12 @@ src/pynecore/core/live_ltf_collector.py
41
43
  src/pynecore/core/live_ltf_window.py
42
44
  src/pynecore/core/live_runner.py
43
45
  src/pynecore/core/module_property.py
44
- src/pynecore/core/ohlcv_file.py
46
+ src/pynecore/core/ohlcv.py
47
+ src/pynecore/core/ohlcv_importers.py
48
+ src/pynecore/core/ohlcv_legacy.py
45
49
  src/pynecore/core/overload.py
46
50
  src/pynecore/core/pine_cast.py
51
+ src/pynecore/core/pine_compare.py
47
52
  src/pynecore/core/pine_export.py
48
53
  src/pynecore/core/pine_method.py
49
54
  src/pynecore/core/pine_range.py
@@ -51,6 +56,7 @@ src/pynecore/core/pine_udt.py
51
56
  src/pynecore/core/provider_string.py
52
57
  src/pynecore/core/random.py
53
58
  src/pynecore/core/resampler.py
59
+ src/pynecore/core/rolling_sum.py
54
60
  src/pynecore/core/safe_convert.py
55
61
  src/pynecore/core/script.py
56
62
  src/pynecore/core/script_runner.py
@@ -58,6 +64,7 @@ src/pynecore/core/security.py
58
64
  src/pynecore/core/security_process.py
59
65
  src/pynecore/core/security_shm.py
60
66
  src/pynecore/core/series.py
67
+ src/pynecore/core/session.py
61
68
  src/pynecore/core/strategy_stats.py
62
69
  src/pynecore/core/symbol_map.py
63
70
  src/pynecore/core/syminfo.py
@@ -175,6 +182,7 @@ src/pynecore/transformers/builtin_shadow.py
175
182
  src/pynecore/transformers/closure_arguments_transformer.py
176
183
  src/pynecore/transformers/display_rewrite.py
177
184
  src/pynecore/transformers/dynamic_default.py
185
+ src/pynecore/transformers/float_tolerance.py
178
186
  src/pynecore/transformers/function_isolation.py
179
187
  src/pynecore/transformers/import_lifter.py
180
188
  src/pynecore/transformers/import_normalizer.py
@@ -184,9 +192,9 @@ src/pynecore/transformers/lib_series.py
184
192
  src/pynecore/transformers/locations.py
185
193
  src/pynecore/transformers/module_properties.json
186
194
  src/pynecore/transformers/module_property.py
187
- src/pynecore/transformers/ne_guard.py
188
195
  src/pynecore/transformers/persistent.py
189
196
  src/pynecore/transformers/persistent_series.py
197
+ src/pynecore/transformers/pine_truthiness.py
190
198
  src/pynecore/transformers/safe_convert_transformer.py
191
199
  src/pynecore/transformers/safe_division_transformer.py
192
200
  src/pynecore/transformers/script_requirements.py
@@ -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.6.4" # PineVersion.Major.Minor
23
+ version = "6.8.5" # 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" }]
@@ -123,8 +123,8 @@ def main(
123
123
 
124
124
  # Create demo.ohlcv file only if we created the workdir in this run or recreate_demo is True
125
125
  if not workdir_existed or recreate_demo:
126
- from datetime import datetime, timedelta, time as dt_time
127
- from ...core.ohlcv_file import OHLCVWriter
126
+ from datetime import datetime, timedelta, time as dt_time, UTC
127
+ from ...core.ohlcv import OHLCVWriter
128
128
  from ...core.syminfo import SymInfo, SymInfoInterval, SymInfoSession
129
129
  from ...types.ohlcv import OHLCV
130
130
  import random
@@ -185,36 +185,63 @@ def main(
185
185
  toml_path = demo_file.with_suffix(".toml")
186
186
  syminfo.save_toml(toml_path)
187
187
 
188
- # Generate synthetic OHLCV data (2000 candles) with random walk
189
- start_time = datetime(2020, 1, 1, 0, 0, 0)
188
+ # Generate synthetic OHLCV data (2000 candles) with random walk.
189
+ # The anchor is UTC so the daily grid is an exact 86400000 ms step
190
+ # on every machine, matching the "1D" period declared below.
191
+ start_time = datetime(2020, 1, 1, 0, 0, 0, tzinfo=UTC)
190
192
  base_price = 100.0
193
+ base_volatility = 0.015 # Long-run standard deviation of the daily return
191
194
 
192
195
  # Use fixed seed for reproducibility
193
196
  random.seed(42)
194
197
 
195
- with OHLCVWriter(demo_file) as writer:
196
- current_price = base_price
198
+ with OHLCVWriter(demo_file, syminfo.period,
199
+ minmove=syminfo.minmove, pricescale=syminfo.pricescale) as writer:
200
+ close_price = base_price
201
+ volatility = base_volatility
202
+ bar_return = 0.0
203
+ trend = 0.0
197
204
 
198
205
  for i in range(2000):
199
- timestamp = int((start_time + timedelta(days=i)).timestamp())
200
-
201
- # Random walk with slight upward bias
202
- change_percent = random.gauss(0.0002, 0.02) # 0.02% mean, 2% std dev
203
- current_price *= (1 + change_percent)
204
-
205
- # Generate OHLC with some volatility
206
- daily_volatility = random.uniform(0.01, 0.03)
207
-
208
- open_price = current_price
209
- high_price = open_price * (1 + daily_volatility * random.random())
210
- low_price = open_price * (1 - daily_volatility * random.random())
211
- close_price = low_price + (high_price - low_price) * random.random()
212
-
213
- # Update current price for next candle
214
- current_price = close_price
215
-
216
- # Volume with some randomness
217
- volume = 1000000 * (1 + random.uniform(-0.5, 1.0))
206
+ bar_time = start_time + timedelta(days=i)
207
+ # OHLCV timestamps are Unix milliseconds.
208
+ timestamp = int(bar_time.timestamp() * 1000)
209
+
210
+ # Volatility clusters: it decays back towards the base level but is
211
+ # pushed up by the previous move, so calm and turbulent stretches alternate
212
+ volatility = min(0.85 * volatility + 0.07 * base_volatility
213
+ + 0.10 * abs(bar_return), 4 * base_volatility)
214
+ # Slowly drifting trend component, giving multi-month up and down legs
215
+ trend = 0.98 * trend + random.gauss(0.0, 0.0006)
216
+
217
+ # A 24/7 asset normally opens where the previous bar closed,
218
+ # a gap is a rare event
219
+ open_price = close_price
220
+ if random.random() < 0.02:
221
+ open_price *= 1 + random.gauss(0.0, 0.012)
222
+
223
+ # The move happens inside the bar, between its open and close
224
+ bar_return = random.gauss(0.0012 + trend, volatility)
225
+ close_price = open_price * (1 + bar_return)
226
+
227
+ # Wicks extend beyond the body, so the range always contains it
228
+ body_high = max(open_price, close_price)
229
+ body_low = min(open_price, close_price)
230
+ high_price = body_high * (1 + abs(random.gauss(0.0, 0.5)) * volatility)
231
+ low_price = body_low * (1 - abs(random.gauss(0.0, 0.5)) * volatility)
232
+
233
+ # Prices sit on the mintick grid declared in the .toml. Rounding is
234
+ # monotonic, so it cannot invalidate the OHLC ordering.
235
+ open_price = round(open_price / syminfo.mintick) * syminfo.mintick
236
+ high_price = round(high_price / syminfo.mintick) * syminfo.mintick
237
+ low_price = round(low_price / syminfo.mintick) * syminfo.mintick
238
+ close_price = round(close_price / syminfo.mintick) * syminfo.mintick
239
+
240
+ # Wide-range bars trade more, weekends are quieter even on a 24/7 market
241
+ bar_range = (high_price - low_price) / open_price
242
+ volume = 1_000_000 * (0.5 + 35 * bar_range) * random.uniform(0.75, 1.25)
243
+ if bar_time.weekday() >= 5:
244
+ volume *= 0.7
218
245
 
219
246
  ohlcv = OHLCV(
220
247
  timestamp=timestamp,
@@ -9,7 +9,7 @@ from rich.console import Console
9
9
  from rich.progress import Progress, SpinnerColumn, TextColumn, BarColumn
10
10
 
11
11
  from ..app import app, app_state
12
- from ...core.ohlcv_file import OHLCVReader
12
+ from ...core.ohlcv import OHLCVReader
13
13
  from ...core.syminfo import SymInfo
14
14
  from ...core.script_runner import ScriptRunner
15
15
 
@@ -126,7 +126,8 @@ def benchmark(
126
126
  iter(ohlcv_list),
127
127
  syminfo,
128
128
  last_bar_index=len(ohlcv_list) - 1,
129
- plot_path=None if no_output else app_state.output_dir / f"benchmark_{i}.csv"
129
+ plot_path=None if no_output else app_state.output_dir / f"benchmark_{i}.csv",
130
+ lossless_volume=reader.lossless_volume
130
131
  )
131
132
 
132
133
  import_time = time.perf_counter() - import_start
@@ -1,5 +1,5 @@
1
1
  import sys
2
- from typing import TYPE_CHECKING, TypeAlias, cast
2
+ from typing import TYPE_CHECKING, TypeAlias
3
3
  from pathlib import Path
4
4
  from enum import Enum
5
5
  from datetime import datetime, timedelta, UTC
@@ -19,7 +19,7 @@ from ...lib.timeframe import in_seconds
19
19
  from ...core.data_converter import DataConverter, SupportedFormats as InputFormats
20
20
  from ...core.download_runner import (download_to_file, ConflictAction, DownloadConflict,
21
21
  DownloadPlan, DownloadProgress, DownloadError)
22
- from ...core.ohlcv_file import OHLCVReader
22
+ from ...core.ohlcv import OHLCVReader
23
23
  from ...core.aggregator import validate_aggregation, aggregate_ohlcv
24
24
  from ...core.syminfo import SymInfo
25
25
 
@@ -84,7 +84,7 @@ def _resolve_provider_class(provider_name: str) -> type[ProviderPlugin]:
84
84
  raise ValueError(f"Unknown provider '{provider_name}'. Available providers: {names}")
85
85
  if not (isinstance(cls, type) and issubclass(cls, ProviderPlugin)):
86
86
  raise ValueError(f"Plugin '{provider_name}' is not a data provider.")
87
- return cast(type[ProviderPlugin], cls)
87
+ return cls
88
88
 
89
89
 
90
90
  # Available output formats
@@ -312,8 +312,8 @@ def download(
312
312
  slist: list[str] = []
313
313
  tdir: Path | None = None
314
314
  with Progress(SpinnerColumn(), TextColumn("{task.description}"),
315
- transient=True) as progress:
316
- progress.add_task(description="Fetching market data...", total=None)
315
+ transient=True) as fetch_progress:
316
+ fetch_progress.add_task(description="Fetching market data...", total=None)
317
317
  if sym is None:
318
318
  inst: ProviderPlugin = provider_class(symbol=None, timeframe=timeframe,
319
319
  config=config)
@@ -355,10 +355,6 @@ def download(
355
355
  browser.run()
356
356
  return browser.go_back
357
357
 
358
- provider_instance: ProviderPlugin | None = None
359
- symbols_list: list[str] = []
360
- tui_ohlcv_dir: Path | None = None
361
-
362
358
  # Multi-broker providers (CCXT, cTrader) need a broker chosen before a
363
359
  # symbol can be browsed. When none was given and we're interactive, drop
364
360
  # into a broker picker first, then the symbol browser. The two form a
@@ -26,7 +26,7 @@ from rich.text import Text
26
26
  from rich.console import Console
27
27
 
28
28
  from ..app import app, app_state
29
- from ...core.ohlcv_file import OHLCVReader
29
+ from ...core.ohlcv import OHLCVReader
30
30
  from ...core.syminfo import SymInfo
31
31
  from ...core.script_runner import ScriptRunner
32
32
  from ...core.strategy_stats import StrategyStatistics
@@ -667,10 +667,11 @@ def optimize(
667
667
 
668
668
  # --- Pre-compute data parameters ---
669
669
  with OHLCVReader(data) as reader:
670
+ # Timestamps are int64 milliseconds since the v2 OHLCV format.
670
671
  start_ts = (reader.start_timestamp if not time_from
671
- else int(time_from.replace(tzinfo=None).timestamp()))
672
+ else int(time_from.replace(tzinfo=None).timestamp() * 1000))
672
673
  end_ts = (reader.end_timestamp if not time_to
673
- else int(time_to.replace(tzinfo=None).timestamp()))
674
+ else int(time_to.replace(tzinfo=None).timestamp() * 1000))
674
675
  size = reader.get_size(start_ts, end_ts)
675
676
 
676
677
  # --- Print summary ---