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