opencode-pyneruntime 6.8.7__tar.gz → 6.9.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- opencode_pyneruntime-6.9.1/MANIFEST.in +3 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/PKG-INFO +5 -5
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/README.md +4 -4
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/build/opencode_pyneruntime.egg-info/SOURCES.txt +17 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/pyproject.toml +3 -3
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/__init__.py +1 -1
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/commands/benchmark.py +2 -1
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/commands/run.py +29 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/aggregator.py +4 -4
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/bar_magnifier.py +8 -2
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/defaults.py +1 -1
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/disappearance.py +51 -1
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/exceptions.py +2 -2
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/intent_builder.py +1 -1
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/models.py +60 -2
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/native_failsafe_manager.py +12 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/position.py +119 -20
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/software_partial_bracket_engine.py +35 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/spot_inventory.py +232 -111
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/storage.py +77 -9
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/sync_engine.py +2951 -740
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/validation.py +26 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/csv_file.py +20 -18
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/currency.py +22 -14
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/data_converter.py +2 -2
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/datetime.py +16 -1
- opencode_pyneruntime-6.9.1/src/pynecore/core/fdlibm.py +540 -0
- opencode_pyneruntime-6.9.1/src/pynecore/core/import_hook.py +944 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/instance_state.py +440 -144
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/live_runner.py +2 -2
- opencode_pyneruntime-6.9.1/src/pynecore/core/lookahead.py +33 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/ohlcv.py +62 -2
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/overload.py +125 -6
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/pine_cast.py +4 -3
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/pine_compare.py +3 -2
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/pine_export.py +62 -7
- opencode_pyneruntime-6.9.1/src/pynecore/core/pine_import.py +39 -0
- opencode_pyneruntime-6.9.1/src/pynecore/core/pine_math.py +716 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/pine_method.py +13 -6
- opencode_pyneruntime-6.9.1/src/pynecore/core/pine_range.py +154 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/random.py +3 -1
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/resampler.py +2 -2
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/safe_convert.py +26 -6
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/script.py +45 -4
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/script_runner.py +349 -53
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/security.py +172 -67
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/security_process.py +104 -31
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/security_shm.py +4 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/series.py +158 -99
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/strategy_stats.py +15 -5
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/__init__.py +137 -99
- opencode_pyneruntime-6.9.1/src/pynecore/lib/_drawing.py +37 -0
- opencode_pyneruntime-6.9.1/src/pynecore/lib/_math_stateful.py +337 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/array.py +138 -63
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/barmerge.py +12 -7
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/box.py +27 -26
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/chart.py +8 -7
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/color.py +10 -6
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/color.pyi +4 -3
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/dayofweek.py +8 -3
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/dayofweek.pyi +2 -1
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/earnings.py +4 -3
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/label.py +11 -11
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/line.py +19 -20
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/log.py +3 -3
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/map.py +4 -2
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/math.py +155 -65
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/matrix.py +18 -13
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/request.py +15 -12
- opencode_pyneruntime-6.9.1/src/pynecore/lib/runtime.py +17 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/strategy/__init__.py +1937 -613
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/strategy/closedtrades.py +71 -16
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/strategy/closedtrades.pyi +7 -1
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/strategy/opentrades.py +42 -10
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/strategy/opentrades.pyi +1 -1
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/string.py +16 -9
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/syminfo.py +13 -13
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/ta.py +533 -138
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/table.py +16 -16
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/timeframe.py +20 -4
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/standalone.py +2 -1
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/broker_lab/runner.py +6 -5
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/closure_arguments_transformer.py +12 -1
- opencode_pyneruntime-6.9.1/src/pynecore/transformers/const_fold.py +578 -0
- opencode_pyneruntime-6.9.1/src/pynecore/transformers/dynamic_default.py +338 -0
- opencode_pyneruntime-6.9.1/src/pynecore/transformers/edge_rules.json +135 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/float_tolerance.py +7 -1
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/function_isolation.py +227 -182
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/import_normalizer.py +68 -27
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/input_transformer.py +11 -2
- opencode_pyneruntime-6.9.1/src/pynecore/transformers/lib_types.json +9258 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/module_properties.json +102 -3
- opencode_pyneruntime-6.9.1/src/pynecore/transformers/node_ids.py +50 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/persistent.py +35 -1
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/persistent_series.py +6 -0
- opencode_pyneruntime-6.9.1/src/pynecore/transformers/pine_edge_gate.py +607 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/pine_truthiness.py +6 -1
- opencode_pyneruntime-6.9.1/src/pynecore/transformers/pine_type_artifact.py +1026 -0
- opencode_pyneruntime-6.9.1/src/pynecore/transformers/pine_type_infer.py +4789 -0
- opencode_pyneruntime-6.9.1/src/pynecore/transformers/pine_type_report.py +384 -0
- opencode_pyneruntime-6.9.1/src/pynecore/transformers/pine_type_rules.py +1900 -0
- opencode_pyneruntime-6.9.1/src/pynecore/transformers/pine_type_table.py +411 -0
- opencode_pyneruntime-6.9.1/src/pynecore/transformers/pine_type_transformer.py +76 -0
- opencode_pyneruntime-6.9.1/src/pynecore/transformers/safe_convert_transformer.py +220 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/safe_division_transformer.py +7 -3
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/security.py +16 -2
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/series.py +80 -18
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/slot_layout.py +49 -10
- opencode_pyneruntime-6.9.1/src/pynecore/transformers/ta_variable_hoist.py +181 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/matrix.py +18 -9
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/na.py +76 -14
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/na.pyi +14 -2
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/pine_types.py +4 -1
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/pine_types.pyi +2 -1
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/utils/sequence_view.py +12 -23
- opencode_pyneruntime-6.8.7/MANIFEST.in +0 -3
- opencode_pyneruntime-6.8.7/src/pynecore/core/import_hook.py +0 -454
- opencode_pyneruntime-6.8.7/src/pynecore/core/pine_range.py +0 -86
- opencode_pyneruntime-6.8.7/src/pynecore/lib/_math_stateful.py +0 -255
- opencode_pyneruntime-6.8.7/src/pynecore/lib/runtime.py +0 -5
- opencode_pyneruntime-6.8.7/src/pynecore/transformers/dynamic_default.py +0 -147
- opencode_pyneruntime-6.8.7/src/pynecore/transformers/safe_convert_transformer.py +0 -97
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/LICENSE +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/NOTICE +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/setup.cfg +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/__init__.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/app.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/commands/__init__.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/commands/compile.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/commands/data.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/commands/debug.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/commands/optimize.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/commands/plugin.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/pluggable.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/utils/__init__.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/utils/api_error_handler.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/utils/broker_picker.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/utils/error_hook.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/utils/keyreader.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/utils/provider_picker.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/utils/symbol_browser.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/__init__.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/_file_io.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/__init__.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/emulator.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/idempotency.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/journal.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/one_way_emulator.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/run_identity.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/software_entry_stop_engine.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/store_helpers.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/class_property.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/config.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/download_info.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/download_runner.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/drawing_snapshot.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/htf_aggregator.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/live_ltf_collector.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/live_ltf_window.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/module_property.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/ohlcv_importers.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/ohlcv_legacy.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/pine_udt.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/plugin/__init__.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/plugin/broker.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/plugin/cli.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/plugin/live_provider.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/plugin/provider.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/provider_string.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/rolling_sum.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/session.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/symbol_map.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/syminfo.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/viz.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/_fixnan.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/_timeframe_change.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/adjustment.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/alert.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/alert.pyi +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/barstate.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/currency.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/display.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/dividends.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/extend.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/font.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/footprint.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/format.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/hline.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/hline.pyi +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/linefill.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/location.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/order.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/pivotpointtype.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/plot.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/plot.pyi +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/polyline.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/position.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/scale.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/session.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/session.pyi +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/shape.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/size.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/splits.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/strategy/commission.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/strategy/direction.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/strategy/oca.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/strategy/risk.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/text.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/ticker.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/volume_row.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/xloc.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/lib/yloc.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/providers/__init__.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/providers/ccxt.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/providers/replay.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/pynesys/__init__.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/pynesys/api.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/pynesys/compiler.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/__init__.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/broker_lab/__init__.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/broker_lab/__main__.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/broker_lab/cli.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/broker_lab/generate.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/broker_lab/model.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/broker_lab/reference.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/broker_lab/scheduler.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/testing/broker_lab/subprocess.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/__init__.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/builtin_shadow.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/display_rewrite.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/import_lifter.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/inline_series_hoist.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/lib_series.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/locations.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/module_property.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/script_requirements.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/security_instantiation.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/type_checking_stripper.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/transformers/unused_series_detector.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/__init__.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/alert.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/barmerge.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/base.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/box.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/chart.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/color.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/currency.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/datetime.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/display.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/dividends.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/earnings.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/extend.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/font.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/footprint.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/format.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/hline.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/ib_persistent.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/ib_persistent.pyi +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/label.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/line.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/linefill.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/location.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/ohlcv.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/order.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/persistent.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/persistent.pyi +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/pivotpointtype.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/plot.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/plot_meta.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/polyline.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/position.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/scale.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/script_type.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/series.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/series.pyi +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/session.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/shape.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/size.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/source.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/splits.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/strategy.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/table.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/text.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/type_checker.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/type_checker.pyi +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/volume_row.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/weekdays.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/xloc.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/types/yloc.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/utils/__init__.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/utils/file_utils.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/utils/rich/__init__.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/utils/rich/date_column.py +0 -0
- {opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/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.
|
|
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.
|
|
13
|
+
Project-URL: Discord, https://discord.pynesys.io
|
|
14
14
|
Project-URL: Discussions, https://github.com/PyneSys/pynecore/discussions
|
|
15
15
|
Classifier: Programming Language :: Python :: 3
|
|
16
16
|
Classifier: Operating System :: OS Independent
|
|
@@ -260,10 +260,10 @@ examples, kept as workspace siblings for pattern reference:
|
|
|
260
260
|
## Pine Script Migration Made Easy
|
|
261
261
|
|
|
262
262
|
Have existing Pine Script code you want to run in Python? **PyneSys now offers automatic Pine
|
|
263
|
-
Script to PyneCore translation** through our [web platform](https://pynesys.io) and [Discord bot](https://discord.
|
|
263
|
+
Script to PyneCore translation** through our [web platform](https://pynesys.io) and [Discord bot](https://discord.pynesys.io).
|
|
264
264
|
|
|
265
265
|
### 🚀 Get Started Instantly
|
|
266
|
-
- **Try for free on Discord**: Use `/pine-help` in our [Discord](https://discord.
|
|
266
|
+
- **Try for free on Discord**: Use `/pine-help` in our [Discord](https://discord.pynesys.io) for instant conversion - 3 free translations!
|
|
267
267
|
- **Full service**: Visit [pynesys.io](https://pynesys.io) for subscriptions and higher limits
|
|
268
268
|
|
|
269
269
|
### 💡 Support the Ecosystem
|
|
@@ -281,7 +281,7 @@ Love PyneCore and want to see it grow? Consider a **Seed subscription or higher*
|
|
|
281
281
|
### Community
|
|
282
282
|
|
|
283
283
|
- **Discussions**: [GitHub Discussions](https://github.com/pynesys/pynecore/discussions)
|
|
284
|
-
- **Discord**: [discord.
|
|
284
|
+
- **Discord**: [discord.pynesys.io](https://discord.pynesys.io)
|
|
285
285
|
- **X**: [x.com/pynesys](https://x.com/pynesys)
|
|
286
286
|
- **Website**: [pynecore.org](https://pynecore.org)
|
|
287
287
|
|
|
@@ -215,10 +215,10 @@ examples, kept as workspace siblings for pattern reference:
|
|
|
215
215
|
## Pine Script Migration Made Easy
|
|
216
216
|
|
|
217
217
|
Have existing Pine Script code you want to run in Python? **PyneSys now offers automatic Pine
|
|
218
|
-
Script to PyneCore translation** through our [web platform](https://pynesys.io) and [Discord bot](https://discord.
|
|
218
|
+
Script to PyneCore translation** through our [web platform](https://pynesys.io) and [Discord bot](https://discord.pynesys.io).
|
|
219
219
|
|
|
220
220
|
### 🚀 Get Started Instantly
|
|
221
|
-
- **Try for free on Discord**: Use `/pine-help` in our [Discord](https://discord.
|
|
221
|
+
- **Try for free on Discord**: Use `/pine-help` in our [Discord](https://discord.pynesys.io) for instant conversion - 3 free translations!
|
|
222
222
|
- **Full service**: Visit [pynesys.io](https://pynesys.io) for subscriptions and higher limits
|
|
223
223
|
|
|
224
224
|
### 💡 Support the Ecosystem
|
|
@@ -236,7 +236,7 @@ Love PyneCore and want to see it grow? Consider a **Seed subscription or higher*
|
|
|
236
236
|
### Community
|
|
237
237
|
|
|
238
238
|
- **Discussions**: [GitHub Discussions](https://github.com/pynesys/pynecore/discussions)
|
|
239
|
-
- **Discord**: [discord.
|
|
239
|
+
- **Discord**: [discord.pynesys.io](https://discord.pynesys.io)
|
|
240
240
|
- **X**: [x.com/pynesys](https://x.com/pynesys)
|
|
241
241
|
- **Website**: [pynecore.org](https://pynecore.org)
|
|
242
242
|
|
|
@@ -267,4 +267,4 @@ PyneCore is part of the PyneSys ecosystem. For commercial support, custom develo
|
|
|
267
267
|
- **Website**: [pynesys.com/contact](https://pynesys.com/contact)
|
|
268
268
|
|
|
269
269
|
---
|
|
270
|
-
<strong>Elevate Your Trading with the Power of Python & Pine Script</strong>
|
|
270
|
+
<strong>Elevate Your Trading with the Power of Python & Pine Script</strong>
|
|
@@ -36,12 +36,14 @@ src/pynecore/core/datetime.py
|
|
|
36
36
|
src/pynecore/core/download_info.py
|
|
37
37
|
src/pynecore/core/download_runner.py
|
|
38
38
|
src/pynecore/core/drawing_snapshot.py
|
|
39
|
+
src/pynecore/core/fdlibm.py
|
|
39
40
|
src/pynecore/core/htf_aggregator.py
|
|
40
41
|
src/pynecore/core/import_hook.py
|
|
41
42
|
src/pynecore/core/instance_state.py
|
|
42
43
|
src/pynecore/core/live_ltf_collector.py
|
|
43
44
|
src/pynecore/core/live_ltf_window.py
|
|
44
45
|
src/pynecore/core/live_runner.py
|
|
46
|
+
src/pynecore/core/lookahead.py
|
|
45
47
|
src/pynecore/core/module_property.py
|
|
46
48
|
src/pynecore/core/ohlcv.py
|
|
47
49
|
src/pynecore/core/ohlcv_importers.py
|
|
@@ -50,6 +52,8 @@ src/pynecore/core/overload.py
|
|
|
50
52
|
src/pynecore/core/pine_cast.py
|
|
51
53
|
src/pynecore/core/pine_compare.py
|
|
52
54
|
src/pynecore/core/pine_export.py
|
|
55
|
+
src/pynecore/core/pine_import.py
|
|
56
|
+
src/pynecore/core/pine_math.py
|
|
53
57
|
src/pynecore/core/pine_method.py
|
|
54
58
|
src/pynecore/core/pine_range.py
|
|
55
59
|
src/pynecore/core/pine_udt.py
|
|
@@ -95,6 +99,7 @@ src/pynecore/core/plugin/cli.py
|
|
|
95
99
|
src/pynecore/core/plugin/live_provider.py
|
|
96
100
|
src/pynecore/core/plugin/provider.py
|
|
97
101
|
src/pynecore/lib/__init__.py
|
|
102
|
+
src/pynecore/lib/_drawing.py
|
|
98
103
|
src/pynecore/lib/_fixnan.py
|
|
99
104
|
src/pynecore/lib/_math_stateful.py
|
|
100
105
|
src/pynecore/lib/_timeframe_change.py
|
|
@@ -180,8 +185,10 @@ src/pynecore/testing/broker_lab/subprocess.py
|
|
|
180
185
|
src/pynecore/transformers/__init__.py
|
|
181
186
|
src/pynecore/transformers/builtin_shadow.py
|
|
182
187
|
src/pynecore/transformers/closure_arguments_transformer.py
|
|
188
|
+
src/pynecore/transformers/const_fold.py
|
|
183
189
|
src/pynecore/transformers/display_rewrite.py
|
|
184
190
|
src/pynecore/transformers/dynamic_default.py
|
|
191
|
+
src/pynecore/transformers/edge_rules.json
|
|
185
192
|
src/pynecore/transformers/float_tolerance.py
|
|
186
193
|
src/pynecore/transformers/function_isolation.py
|
|
187
194
|
src/pynecore/transformers/import_lifter.py
|
|
@@ -189,12 +196,21 @@ src/pynecore/transformers/import_normalizer.py
|
|
|
189
196
|
src/pynecore/transformers/inline_series_hoist.py
|
|
190
197
|
src/pynecore/transformers/input_transformer.py
|
|
191
198
|
src/pynecore/transformers/lib_series.py
|
|
199
|
+
src/pynecore/transformers/lib_types.json
|
|
192
200
|
src/pynecore/transformers/locations.py
|
|
193
201
|
src/pynecore/transformers/module_properties.json
|
|
194
202
|
src/pynecore/transformers/module_property.py
|
|
203
|
+
src/pynecore/transformers/node_ids.py
|
|
195
204
|
src/pynecore/transformers/persistent.py
|
|
196
205
|
src/pynecore/transformers/persistent_series.py
|
|
206
|
+
src/pynecore/transformers/pine_edge_gate.py
|
|
197
207
|
src/pynecore/transformers/pine_truthiness.py
|
|
208
|
+
src/pynecore/transformers/pine_type_artifact.py
|
|
209
|
+
src/pynecore/transformers/pine_type_infer.py
|
|
210
|
+
src/pynecore/transformers/pine_type_report.py
|
|
211
|
+
src/pynecore/transformers/pine_type_rules.py
|
|
212
|
+
src/pynecore/transformers/pine_type_table.py
|
|
213
|
+
src/pynecore/transformers/pine_type_transformer.py
|
|
198
214
|
src/pynecore/transformers/safe_convert_transformer.py
|
|
199
215
|
src/pynecore/transformers/safe_division_transformer.py
|
|
200
216
|
src/pynecore/transformers/script_requirements.py
|
|
@@ -202,6 +218,7 @@ src/pynecore/transformers/security.py
|
|
|
202
218
|
src/pynecore/transformers/security_instantiation.py
|
|
203
219
|
src/pynecore/transformers/series.py
|
|
204
220
|
src/pynecore/transformers/slot_layout.py
|
|
221
|
+
src/pynecore/transformers/ta_variable_hoist.py
|
|
205
222
|
src/pynecore/transformers/type_checking_stripper.py
|
|
206
223
|
src/pynecore/transformers/unused_series_detector.py
|
|
207
224
|
src/pynecore/types/__init__.py
|
|
@@ -9,7 +9,7 @@ include-package-data = true
|
|
|
9
9
|
zip-safe = false # Critical for import hooks
|
|
10
10
|
|
|
11
11
|
[tool.setuptools.package-data]
|
|
12
|
-
"pynecore" = ["*.pyi"]
|
|
12
|
+
"pynecore" = ["*.pyi", "*.json"]
|
|
13
13
|
|
|
14
14
|
[tool.distutils]
|
|
15
15
|
egg_info.egg_base = "build"
|
|
@@ -20,7 +20,7 @@ egg_info.egg_base = "build"
|
|
|
20
20
|
# `pynecore` so transpiler-generated code runs unchanged. Upstream authorship and
|
|
21
21
|
# the Apache-2.0 NOTICE ("Powered by PyneSys") are retained per Section 4(d).
|
|
22
22
|
name = "opencode-pyneruntime"
|
|
23
|
-
version = "6.
|
|
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.
|
|
90
|
+
"Discord" = "https://discord.pynesys.io"
|
|
91
91
|
"Discussions" = "https://github.com/PyneSys/pynecore/discussions"
|
{opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/cli/commands/benchmark.py
RENAMED
|
@@ -127,7 +127,8 @@ def benchmark(
|
|
|
127
127
|
syminfo,
|
|
128
128
|
last_bar_index=len(ohlcv_list) - 1,
|
|
129
129
|
plot_path=None if no_output else app_state.output_dir / f"benchmark_{i}.csv",
|
|
130
|
-
lossless_volume=reader.lossless_volume
|
|
130
|
+
lossless_volume=reader.lossless_volume,
|
|
131
|
+
lossless_prices=reader.lossless_prices
|
|
131
132
|
)
|
|
132
133
|
|
|
133
134
|
import_time = time.perf_counter() - import_start
|
|
@@ -961,6 +961,31 @@ def _download_provider_data_resilient(
|
|
|
961
961
|
delay = min(delay * 2.0, _PROVIDER_RETRY_MAX_DELAY)
|
|
962
962
|
|
|
963
963
|
|
|
964
|
+
def _pin_timenow(last_bar_time: int | None) -> None:
|
|
965
|
+
"""Pin ``timenow`` to the final bar of a bounded historical replay.
|
|
966
|
+
|
|
967
|
+
A backtest that reads the real clock is not reproducible: a script gating
|
|
968
|
+
its entries on ``time >= timenow - N days`` measures a different bar set on
|
|
969
|
+
every run, so its result changes from one day to the next and can never be
|
|
970
|
+
matched against a stored reference again. Anchoring the clock to the last
|
|
971
|
+
bar of the replayed window makes the run deterministic — the instant that
|
|
972
|
+
run's world ends. Live runs never call this and keep the system clock.
|
|
973
|
+
|
|
974
|
+
Both channels are needed: the environment variable reaches the
|
|
975
|
+
``request.security`` subprocesses, which import ``pynecore.lib`` fresh under
|
|
976
|
+
the ``spawn`` start method, while the attribute covers this process, which
|
|
977
|
+
imported it long before the data window was known.
|
|
978
|
+
|
|
979
|
+
:param last_bar_time: UNIX time (ms) of the window's last bar; ``None``
|
|
980
|
+
(an empty window) leaves the clock alone.
|
|
981
|
+
"""
|
|
982
|
+
if last_bar_time is None:
|
|
983
|
+
return
|
|
984
|
+
from pynecore import lib as _lib
|
|
985
|
+
os.environ['PYNE_TIMENOW_MS'] = str(last_bar_time)
|
|
986
|
+
_lib._timenow_ms = last_bar_time
|
|
987
|
+
|
|
988
|
+
|
|
964
989
|
def _print_data_requirements(requirements: DataRequirements, script_name: str) -> None:
|
|
965
990
|
"""Print a plain, human-readable summary of a script's data dependencies.
|
|
966
991
|
|
|
@@ -1415,6 +1440,7 @@ def run(
|
|
|
1415
1440
|
else:
|
|
1416
1441
|
ohlcv_iter = reader.read_from(time_from_ts, time_to_ts)
|
|
1417
1442
|
lossless_volume = reader.lossless_volume
|
|
1443
|
+
lossless_prices = reader.lossless_prices
|
|
1418
1444
|
|
|
1419
1445
|
# --broker implies --live.
|
|
1420
1446
|
if broker:
|
|
@@ -1643,6 +1669,8 @@ def run(
|
|
|
1643
1669
|
from pynecore import lib as _lib
|
|
1644
1670
|
_lib._is_live = True
|
|
1645
1671
|
_lib._strategy_suppressed = True
|
|
1672
|
+
else:
|
|
1673
|
+
_pin_timenow(last_bar_time)
|
|
1646
1674
|
|
|
1647
1675
|
# Show loading spinner while importing
|
|
1648
1676
|
with Progress(
|
|
@@ -1678,6 +1706,7 @@ def run(
|
|
|
1678
1706
|
time_from=time_from_dt,
|
|
1679
1707
|
chart_data_path=data_path,
|
|
1680
1708
|
lossless_volume=lossless_volume,
|
|
1709
|
+
lossless_prices=lossless_prices,
|
|
1681
1710
|
config_dir=app_state.config_dir)
|
|
1682
1711
|
finally:
|
|
1683
1712
|
# Remove lib directory from Python path
|
|
@@ -18,7 +18,7 @@ from .resampler import (
|
|
|
18
18
|
Resampler, ObservedDayCounter, grid_mode, overnight_opens, trading_day,
|
|
19
19
|
)
|
|
20
20
|
# noinspection PyProtectedMember
|
|
21
|
-
from ..lib.timeframe import
|
|
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 =
|
|
34
|
-
target_sec =
|
|
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 =
|
|
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
|
{opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/bar_magnifier.py
RENAMED
|
@@ -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
|
|
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 =
|
|
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:
|
{opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/defaults.py
RENAMED
|
@@ -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;
|
|
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``
|
{opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/disappearance.py
RENAMED
|
@@ -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
|
|
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(
|
{opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/exceptions.py
RENAMED
|
@@ -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
|
|
331
|
-
|
|
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
|
|
{opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/intent_builder.py
RENAMED
|
@@ -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
|
|
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`
|
{opencode_pyneruntime-6.8.7 → opencode_pyneruntime-6.9.1}/src/pynecore/core/broker/models.py
RENAMED
|
@@ -32,6 +32,10 @@ __all__ = [
|
|
|
32
32
|
'CapabilityLevel',
|
|
33
33
|
'ExchangeOrder',
|
|
34
34
|
'OrderEvent',
|
|
35
|
+
'CANCEL_REASON_VENUE_REDUCE_ONLY',
|
|
36
|
+
'CANCEL_REASON_VENUE_OCA',
|
|
37
|
+
'CANCEL_REASON_VENUE_POSITION_CLEARED',
|
|
38
|
+
'VENUE_DRIVEN_CANCEL_REASONS',
|
|
35
39
|
'ExchangePosition',
|
|
36
40
|
'PositionLeg',
|
|
37
41
|
'ExchangeCapabilities',
|
|
@@ -230,6 +234,27 @@ class ExchangeOrder:
|
|
|
230
234
|
client_order_id: str | None = None
|
|
231
235
|
|
|
232
236
|
|
|
237
|
+
#: Venue-side cancel reasons a plugin may stamp on a ``cancelled``
|
|
238
|
+
#: :class:`OrderEvent` when the venue itself terminated the order as a
|
|
239
|
+
#: deterministic consequence of the position / sibling orders it protects —
|
|
240
|
+
#: never an operator or foreign actor. The sync engine trims such a leg and
|
|
241
|
+
#: keeps running; an unclassified cancel of a bot-owned order still routes
|
|
242
|
+
#: through the ``on_unexpected_cancel`` policy.
|
|
243
|
+
CANCEL_REASON_VENUE_REDUCE_ONLY = 'venue_reduce_only'
|
|
244
|
+
"""A reduce-only order shrunk to nothing because the net position it could
|
|
245
|
+
reduce fell below the summed reduce-only quantity (Bybit
|
|
246
|
+
``CancelByReduceOnly``)."""
|
|
247
|
+
CANCEL_REASON_VENUE_OCA = 'venue_oca'
|
|
248
|
+
"""The sibling leg of a venue-linked TP/SL pair triggered."""
|
|
249
|
+
CANCEL_REASON_VENUE_POSITION_CLEARED = 'venue_position_cleared'
|
|
250
|
+
"""Position-attached protection dropped because the position was cleared."""
|
|
251
|
+
VENUE_DRIVEN_CANCEL_REASONS = frozenset({
|
|
252
|
+
CANCEL_REASON_VENUE_REDUCE_ONLY,
|
|
253
|
+
CANCEL_REASON_VENUE_OCA,
|
|
254
|
+
CANCEL_REASON_VENUE_POSITION_CLEARED,
|
|
255
|
+
})
|
|
256
|
+
|
|
257
|
+
|
|
233
258
|
@dataclass
|
|
234
259
|
class OrderEvent:
|
|
235
260
|
"""
|
|
@@ -284,6 +309,11 @@ class OrderEvent:
|
|
|
284
309
|
# the handler OFF for the tracker's own events — re-applying would double
|
|
285
310
|
# the audit / sibling sweep and raise the ``halt`` from the wrong place.
|
|
286
311
|
from_disappearance_tracker: bool = False
|
|
312
|
+
# Why the venue terminated the order, when the plugin can tell and the
|
|
313
|
+
# cause is one of :data:`VENUE_DRIVEN_CANCEL_REASONS`; ``None`` for an
|
|
314
|
+
# engine-requested cancel or an unclassified one. Only meaningful on
|
|
315
|
+
# ``cancelled`` events.
|
|
316
|
+
cancel_reason: str | None = None
|
|
287
317
|
|
|
288
318
|
def __str__(self) -> str:
|
|
289
319
|
parts = [
|
|
@@ -398,6 +428,18 @@ class ExchangeCapabilities:
|
|
|
398
428
|
# last extreme and amends the SL each tick / bar.
|
|
399
429
|
trailing_stop: CapabilityLevel = CapabilityLevel.UNSUPPORTED
|
|
400
430
|
|
|
431
|
+
# #82: True when the venue's exit/bracket orders are STANDALONE working
|
|
432
|
+
# orders that can EXECUTE with no position behind them (DNSE: a
|
|
433
|
+
# protective stop is a conditional-book order that fires and fills
|
|
434
|
+
# regardless of position — measured live 2026-09-07, a pre-entry-fill
|
|
435
|
+
# protection opened a naked short). When True the engine withholds a
|
|
436
|
+
# protective exit until its parent entry has filled and clamps its qty
|
|
437
|
+
# to the live position. False (default) = attach-semantics venues
|
|
438
|
+
# (Capital.com/Bybit position brackets): a naked attach is rejected by
|
|
439
|
+
# the venue and owned by the bracket-reject recovery path, so the
|
|
440
|
+
# pre-fill dispatch contract is preserved there.
|
|
441
|
+
exit_orders_execute_standalone: bool = False
|
|
442
|
+
|
|
401
443
|
# === Exit bracket (TP+SL with OCA reduce semantics) ===
|
|
402
444
|
# NATIVE = single atomic exchange call attaches both legs (Bybit V5
|
|
403
445
|
# attached TP/SL, Capital.com position-attribute bracket). The sync
|
|
@@ -625,8 +667,8 @@ class ExitIntent:
|
|
|
625
667
|
# :meth:`__eq__` / :meth:`__hash__`: it is a *route selector* derived
|
|
626
668
|
# from the intent, not state that needs to be diff-synced to the
|
|
627
669
|
# broker. The sync engine's qty-cap reconciliation
|
|
628
|
-
# (``_sync_pine_exit_qty``) mutates ``exit_orders
|
|
629
|
-
# )
|
|
670
|
+
# (``_sync_pine_exit_qty``) mutates the ``exit_orders`` entry (keyed by
|
|
671
|
+
# ``_exit_order_key``) ``.size`` after a partial entry fill so the next ``build_intents``
|
|
630
672
|
# produces an ExitIntent with the capped qty; including the derived
|
|
631
673
|
# flag in equality would let that cap mutation flip the flag and
|
|
632
674
|
# trigger a spurious second ``modify_exit`` dispatch even though
|
|
@@ -715,10 +757,26 @@ class CloseIntent:
|
|
|
715
757
|
return
|
|
716
758
|
if self.synthetic_kind not in {
|
|
717
759
|
'partial_trigger', 'marketable_exit', 'defensive_close',
|
|
760
|
+
'reversal_close',
|
|
718
761
|
}:
|
|
719
762
|
raise ValueError(
|
|
720
763
|
f"CloseIntent.synthetic_kind is invalid: {self.synthetic_kind!r}"
|
|
721
764
|
)
|
|
765
|
+
if self.synthetic_kind == 'reversal_close':
|
|
766
|
+
# The close leg of a MARKET stop-and-reverse consumes the WHOLE
|
|
767
|
+
# symbol position (every Pine entry id, pyramids included), so
|
|
768
|
+
# it is symbol-wide by design and takes no targets. Plugins must
|
|
769
|
+
# dispatch it in a form that cannot open opposite exposure — a
|
|
770
|
+
# targeted position close or an exchange-native reduce-only
|
|
771
|
+
# order — because the engine deliberately does NOT wait for the
|
|
772
|
+
# old position's protective legs to confirm-cancel first.
|
|
773
|
+
if (self.target_entry_id is not None
|
|
774
|
+
or self.target_position_coid is not None
|
|
775
|
+
or self.target_exchange_id is not None):
|
|
776
|
+
raise ValueError(
|
|
777
|
+
"CloseIntent reversal_close is symbol-wide and takes no targets."
|
|
778
|
+
)
|
|
779
|
+
return
|
|
722
780
|
if self.synthetic_kind in {'partial_trigger', 'marketable_exit'}:
|
|
723
781
|
if (not self.target_entry_id
|
|
724
782
|
or self.target_position_coid is not None
|
|
@@ -392,6 +392,18 @@ class NativeFailsafeManager:
|
|
|
392
392
|
def get_state(self, parent_entry_dispatch_ref: str) -> NativeStopState | None:
|
|
393
393
|
return self._states.get(parent_entry_dispatch_ref)
|
|
394
394
|
|
|
395
|
+
def pop_pending(
|
|
396
|
+
self, parent_entry_dispatch_ref: str,
|
|
397
|
+
) -> NativeBracketSnapshot | None:
|
|
398
|
+
"""Remove and return one parent's queued snapshot, if any.
|
|
399
|
+
|
|
400
|
+
Used by callers that dispatch a single parent's PUT synchronously
|
|
401
|
+
(the reversal pre-clear) instead of waiting for the next
|
|
402
|
+
:meth:`pending_dispatch` drain; the pop keeps the drain from
|
|
403
|
+
re-dispatching the same snapshot afterwards.
|
|
404
|
+
"""
|
|
405
|
+
return self._pending.pop(parent_entry_dispatch_ref, None)
|
|
406
|
+
|
|
395
407
|
def iter_states(self) -> Iterable[NativeStopState]:
|
|
396
408
|
return self._states.values()
|
|
397
409
|
|