pineforge-codegen 0.10.3__tar.gz → 0.10.4__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.
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/PKG-INFO +1 -1
- pineforge_codegen-0.10.4/VERSION +1 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/analyzer/base.py +13 -1
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/analyzer/call_handlers.py +8 -2
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/codegen/base.py +11 -3
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/codegen/emit_top.py +15 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/codegen/ta.py +10 -1
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/codegen/tables.py +12 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/codegen/types.py +195 -6
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/codegen/visit_call.py +9 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/codegen/visit_expr.py +28 -7
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/codegen/visit_stmt.py +15 -3
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/symbols.py +4 -2
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_anchor_vwap.py +4 -2
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_codegen_new.py +1 -1
- pineforge_codegen-0.10.4/tests/test_sparse_atr_prev_close.py +65 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_transpile_tr_handle_na.py +1 -1
- pineforge_codegen-0.10.4/tests/test_vwap_property_source.py +127 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_vwap_tuple_unpack.py +3 -2
- pineforge_codegen-0.10.4/tests/test_wide_int_arrays_and_literals.py +84 -0
- pineforge_codegen-0.10.3/VERSION +0 -1
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/.claude/settings.json +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/.github/dependabot.yml +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/.github/workflows/gate.yml +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/.github/workflows/promote-baseline.yml +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/.github/workflows/publish-pyodide.yml +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/.github/workflows/release.yml +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/.github/workflows/test.yml +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/.gitignore +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/AGENTS.md +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/CLAUDE.md +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/LEGAL.md +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/LICENSE +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/PYODIDE_TARGET +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/README.md +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/docs/codegen-coverage-gaps.md +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/gate/compare.mjs +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/gate/glue.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/gate/oracle.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/gate/run-gate.mjs +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/gate/selftest.mjs +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/npm/README.md +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/npm/index.mjs +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/npm/package.json +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/package-lock.json +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/package.json +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/__init__.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/analyzer/__init__.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/analyzer/contracts.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/analyzer/diagnostics.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/analyzer/tables.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/analyzer/types.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/ast_nodes.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/codegen/__init__.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/codegen/drawing.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/codegen/helpers.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/codegen/helpers_syminfo.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/codegen/input.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/codegen/security.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/errors.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/finite_ta_length.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/lexer.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/method_binding.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/parser.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/pragmas.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/signatures.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/support_checker.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/tokens.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/tv_input_choices.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pyproject.toml +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/scripts/build-npm-package.mjs +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/scripts/dump-tables.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/scripts/worker-template.mjs +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/__init__.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/_compile.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/fixtures/matrix_eigen_pca.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/err/const_ns_plot_style_free.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/err/const_ns_shape_free.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/err/export_func.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/err/footprint_new.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/err/hard_reject_dividends.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/err/matrix_unknown_elem.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/err/multi_error_one_line.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/err/sec_tf_invalid.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/err/unknown_color.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/err/unknown_math.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/err/unknown_str.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/err/unknown_strategy_fn.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/err/unknown_syminfo.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/err/unknown_ta.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/AAPL__session-ismarket-nyse-rth-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/AAPL__time-tradingday-daily-reset-counter-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/QQQ__session-ispremarket-nasdaq-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/SPY__session-firstbar-vwap-anchor-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/SPY__session-lastbar-flatten-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/chart_bg_color.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/crypto-htf__mtf-htf-monthly-ema-cross-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/crypto-leverage__leverage-margin-call-perp-5x-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/divergent_last_bar_index.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/forex__symbol-fx-5dp-eurusd-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/futures__symbol-futures-pointvalue-es-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/tutorial__macd__strategy.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/tutorial__mtf__strategy_htf.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/tutorial__mtf__strategy_ltf.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/us-equity__symbol-equity-rth-gaps-aapl-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/us-equity__us-equity-exchange-tz-intraday-cap-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__analyzer-parity-choch-bos-isolator-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__analyzer-parity-edge-margin-50-pct-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__analyzer-parity-percent-of-equity-sizing-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__analyzer-parity-small-equity-fraction-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__analyzer-parity-stop-limit-timing-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__analyzer-self-test-multi-mode-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__anomaly-equity-mirror-strategy-equity-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__barstate-isconfirmed-magnifier-off-01b.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__barstate-isconfirmed-magnifier-on-01a.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__bracket-atr-trail-series-int-points-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__bracket-atr-trailing-stop-state-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__bracket-entry-exit-same-pass-attach-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__bracket-exit-stop-limit-trail-same-bar-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__bracket-exit-three-way-set-once-entry-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__bracket-exit-tp-sl-fixed-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__bracket-narrow-stop-limit-with-trail8-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__bracket-partial-exit-qty-percent-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__bracket-same-id-exit-replace-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__bracket-tp-sl-oca-reduce-isolate-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__bracket-trail-points-no-offset-explicit-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__bracket-trail-points-with-offset-only-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__bracket-trailing-activation-offset-path-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__cap-max-intraday-filled-orders-isolate-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__cap-risk-gates-allow-max-intraday-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-4emarsi-integration-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-4emarsi-quad-ema-stack-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-4emarsi-rsi-pullback-latch-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-4emarsi-session-window-nbar-exit-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-boscurv-integration-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-boscurv-linreg-slope-channel-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-boscurv-pivot-bos-trigger-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-bracket-cap-range-pending-stop-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-ies-adx-regime-classify-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-ies-bb-kc-squeeze-release-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-ies-cooldown-daily-cap-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-ies-equity-feedback-sizing-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-ies-integration-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-ies-pivot-liquidity-sweep-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-ies-pressure-gauge-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-ies-rsi-macd-momentum-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-ies-three-ema-bias-score-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-kanuck-calc-on-every-tick-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-kanuck-integration-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-kanuck-kama-state-recurrence-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-kanuck-max-bars-back-500-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-kkb-ema-atr-breakout-band-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-kkb-integration-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-kkb-kalman-filter-1d-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-kkb-margin-100-pct-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-liqsweep-integration-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-liqsweep-pivot-hh-ll-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-liqsweep-wait-one-continuation-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-liqsweep-wick-pierce-close-back-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-marketshift-integration-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-marketshift-pivot-state-machine-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-marketshift-rolling-highest-lowest-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-marketshift-state-edge-detector-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-scalping-fast-ma-cross-trigger-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-scalping-integration-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-scalping-tight-tp-sl-points-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-trendmaster-integration-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-trendmaster-line-new-projection-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-trendmaster-pivot-anchored-bracket-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-trendmaster-three-tier-ema-state-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-trendmaster-trend-momentum-structure-gate-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-vcp-cumulative-volume-delta-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-vcp-fvg-active-zones-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-vcp-integration-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-vcp-manual-adx-regime-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-vcp-pivot-strength-5-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-vcp-rsi-smooth-divergence-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-vcp-session-tz-newyork-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-vcp-vol-zscore-anomaly-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-wunderscalper-alert-templates-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-wunderscalper-explicit-reverse-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__composite-wunderscalper-integration-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__input-source-runtime-override-high-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__input-source-subscript-hl2-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ltf-bool-array-bull-majority-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ltf-numeric-float-ratio15-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__magnifier-tick-dist-endpoints-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__magnifier-tick-dist-endpoints-rsi-cross-08a.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__magnifier-tick-dist-volume-weighted-on-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__matrix-bool-mask-explicit-utc-tz-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__matrix-bool-mask-no-transpose-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__matrix-bool-mask-transpose-roundtrip-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__matrix-bool-regime-mask-24x7-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__matrix-covariance-eigen-pca-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__matrix-eigen-rank-deficient-cov-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__max-bars-back-function-call-deep-history-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__mtf-daily-array-median-percentrank-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__mtf-daily-ema26-warmup-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__mtf-daily-prev-high-break-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__mtf-dual-tf-60-240-rising-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__mtf-htf-60-close-change-baseline-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__mtf-htf-60-close-roll-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__mtf-htf-60-gaps-on-roll-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__mtf-htf-60-rsi14-inside-security-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__mtf-htf-60-sma20-inside-security-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__mtf-htf-60-volume-spike-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__mtf-htf-confluence-manual-trail-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__mtf-htf-confluence-static-bracket-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__mtf-htf-weekly-sma-cross-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__mtf-roll-state-60-240-d-minimal-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__mtf-triple-tf-close-confluence-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__mtf-triple-tf-macd-hist-confluence-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__na-deep-history-int-na-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__na-nz-fixnan-history-chain-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__oca-exit-bracket-internal-cancel-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__oca-multi-bracket-isolation-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__oca-raw-strategy-order-reduce-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-close-all-cancel-all-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-close-immediate-vs-next-bar-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-cross-entry-cancel-same-pass-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-cross-entry-close-same-pass-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-cross-exit-close-same-pass-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-deferred-flip-guaranteed-gap-stops-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-deferred-flip-pooc-cross-bar-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-dual-four-bar-stop-no-close-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-dual-side-same-id-stop-no-cancel-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-dual-stop-both-touch-priority-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-dual-stop-cancel-rotation-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-dual-stop-far-only-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-dual-stop-near-only-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-dual-stop-open-high-first-path-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-dual-stop-open-low-first-path-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-dual-stop-open-tie-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-dual-stop-source-order-long-first-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-dual-stop-source-order-short-first-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-entry-implicit-reversal-exit-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-flip-stop-no-paired-close-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-market-close-fill-basis-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-one-side-four-bar-far-opposite-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-opposite-entry-close-same-pass-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-percent-equity-cash-commission-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-process-on-close-false-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-process-on-close-true-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-range-expansion-pending-stop-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-same-id-entry-close-same-bar-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-same-id-market-entry-repeat-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-same-id-stop-after-flat-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-same-id-stop-cross-before-modify-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-same-id-stop-minute-zero-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-same-id-stop-modification-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-same-id-stop-raise-only-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-same-id-stop-window-four-bars-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-stale-stop-after-close-no-cancel-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-stop-cancel-no-regime-close-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-stop-entry-cancel-opposite-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-stop-entry-reversal-grouping-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__order-stop-entry-touch-boundary-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__pyramid-cash-fractional-commission-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__pyramid-close-id-grouping-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__pyramid-deferred-flip-close-all-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__pyramid-flip-stop-pyramiding-2-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__recompute-alma-sar-corr-magnifier-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__recompute-mtf-rsi-macd-bb-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__risk-max-contracts-held-gate-pyramid-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__session-hour-minute-pulse-filter-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__session-ny-spring-forward-dst-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__stats-eventrades-zero-pnl-count-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-accdist-ema-cross-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-bb-kc-squeeze-breakout-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-bb-rsi-mean-reversion-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-cci-threshold-cross-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-chandelier-exit-direction-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-closedtrades-risk-introspection-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-cmo-9-zero-cross-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-cog-10-signal-cross-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-dmi-adx-di-cross-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-donchian-channel-breakout-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-dual-ma-switch-dispatch-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-dual-thrust-open-anchored-range-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-elder-ray-bull-bear-power-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-ema-ribbon-stack-transition-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-engulfing-candle-pattern-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-highestbars-lowestbars-breakout-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-hma-55-close-cross-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-hma-fast-slow-cross-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-inside-bar-engulfing-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-kama-style-efficiency-ratio-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-keltner-channel-break-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-linreg-stdev-channel-revert-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-macd-12-26-9-line-signal-cross-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-macd-histogram-reversal-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-macd-line-gt-signal-continuous-state-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-map-regime-threshold-lookup-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-median-vs-ema-cross-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-mfi-14-bands-20-80-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-momentum-roc-zero-cross-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-multi-indicator-score-composite-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-nvi-pvi-cross-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-obv-ema-cross-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-percentrank-mean-reversion-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-pivot-array-unshift-pop-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-pivot-atr-stop-target-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-pivot-confirmed-break-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-pivot-point-levels-break-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-pvt-ema-cross-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-range-filter-var-band-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-rci-14-zero-cross-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-rsi-bb-self-bands-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-rsi-ema-signal-cross-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-rsi-macd-and-continuous-state-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-rsi14-bands-30-70-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-rsi14-cross-50-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-rsi14-gt-50-continuous-state-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-rsi14-gt60-lt45-no-matrix-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-sar-flip-entry-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-sma-152-close-cross-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-sma-dual-cross-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-stdev-sma-expansion-break-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-stoch-slow-k-d-cross-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-stochastic-rsi-cross-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-str-match-regex-filter-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-supertrend-adx-filter-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-supertrend-direction-flip-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-triple-sma-stack-latch-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-tsi-25-13-signal-cross-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-volume-spike-atr-breakout-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-vwma-vs-sma-divergence-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__ta-wpr-14-bands-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__timeframe-main-period-self-adaptive-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__udt-method-calls-sibling-cumulative-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__udt-method-default-param-kwargs-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__udt-method-drives-strategy-entry-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__udt-method-extra-primitive-args-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__udt-method-feeds-strategy-exit-prices-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__udt-method-in-for-loop-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__udt-method-in-if-else-branch-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__udt-method-in-switch-arms-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__udt-method-in-while-loop-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__udt-method-mutating-self-ref-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__udt-method-on-array-element-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__udt-method-reads-strategy-state-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__udt-method-receives-ta-series-param-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__udt-method-scalar-return-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__udt-method-tuple-return-destructure-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__udt-method-udt-return-from-func-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__udt-method-uses-history-globals-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__udt-method-uses-math-funcs-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__udt-method-uses-na-nz-fixnan-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__udt-method-var-instance-streak-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__udt-method-windowed-method-chain-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__udt-regime-stack-stress-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__vwap-bands-breakout-1sigma-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/gate-corpus/ok/validation__vwap-bands-mean-reversion-2sigma-01.pine +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/golden/matrix_eigen_pca.cpp +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_analyzer.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_analyzer_matrix_inference.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_analyzer_ta_return_types.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_anchor_tf_change.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_anchor_time.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_array_bounds_insert_fill_slice.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_array_checked_access.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_array_empty_aggregates.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_array_terminal_returns.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_calc_on_order_fills_codegen.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_callable_series_param_types.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_callable_ta_forwarded_length.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_callable_var_first_reach.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_codegen_audit_fixes.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_codegen_determinism.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_codegen_drawing_data.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_codegen_drawing_handles.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_codegen_fallthrough_guards.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_codegen_golden.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_codegen_input_getters.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_codegen_matrix_typed.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_codegen_string_escape.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_codegen_ta_derived_length.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_codegen_ta_finite_choice_length.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_codegen_ta_stable_var_literal.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_codegen_validation_fixes.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_collection_scope_isolation.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_compile_corpus.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_compile_smoke.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_errors.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_extract_inputs.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_float_relational_runtime.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_glue_smoke.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_hungpixi_regressions.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_import_all.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_input_time_int64.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_int64_reassign_promotion.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_int64_time_storage.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_lazy_edge_ta_every_bar.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_lazy_source_clock.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_lazy_source_clock_runtime.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_lexer.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_map_call_diagnostics.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_map_param_methods.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_map_terminal_returns.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_math_sign_na_codegen.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_matrix_identity_checkpoint.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_matrix_na_lifecycle.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_matrix_void_method_return.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_method_receiver_types.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_method_written_callsite_lifecycle.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_na_reassign_retype.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_na_relational_lowering.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_official_surface.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_parser.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_persistent_callable_owner_state.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_pinemap_boundaries_and_order.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_pinemap_cold_followups_history.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_pinemap_semantics.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_pinemap_temp_receiver_var.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_runtime_var_initialization.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_security_helper_local_var.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_security_lazy_ta_under_conditionals.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_security_math_reducer.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_security_ohlc_hist_is_complete.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_security_ta_input_history_offset.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_security_tf_input_derived.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_security_tf_literal.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_security_tuple_interactions.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_signatures.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_strategy_close_callsite_tokens.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_support_checker.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_support_checker_chart_visible_bar_time.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_support_checker_color_cast.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_support_checker_const_namespaces.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_support_checker_dividends_earnings.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_support_checker_footprint.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_support_checker_input_color.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_support_checker_input_source.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_support_checker_matrix.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_support_checker_security_adjustment.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_support_checker_syminfo_gap_fields.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_support_checker_timeframe_from_seconds.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_support_checker_varip.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_support_checker_volume_row.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_symbols.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_ta_official_surface.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_transpile_division.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_transpile_enum_order.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_transpile_pf_trace.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_transpiler_matrix_kwargs.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_typed_void_method_precedence.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_typespec_matrix.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_udf_series_parameter_history.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_udt_drawing_field_cleanup.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_udt_lvalue_alias.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_udt_na_lifecycle.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_udt_object_identity.py +0 -0
- {pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/tests/test_unsupported_reporting.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: pineforge-codegen
|
|
3
|
-
Version: 0.10.
|
|
3
|
+
Version: 0.10.4
|
|
4
4
|
Summary: PineScript v6 to C++ transpiler that targets the pineforge-engine runtime.
|
|
5
5
|
Project-URL: Homepage, https://github.com/pineforge-4pass/pineforge-codegen-oss
|
|
6
6
|
Project-URL: Issues, https://github.com/pineforge-4pass/pineforge-codegen-oss/issues
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.10.4
|
|
@@ -5973,7 +5973,19 @@ class Analyzer(CallHandlers, DiagnosticsHelper, TypeHelper):
|
|
|
5973
5973
|
callee=MemberAccess(object=Identifier(name="ta"), member=node.member),
|
|
5974
5974
|
args=[], kwargs={},
|
|
5975
5975
|
)
|
|
5976
|
-
|
|
5976
|
+
before = len(self._ta_call_sites)
|
|
5977
|
+
result = self._handle_ta_call(node.member, synthetic_call)
|
|
5978
|
+
# The site belongs to THIS read: key it on the AST node the
|
|
5979
|
+
# codegen will meet (the MemberAccess), not on the synthetic
|
|
5980
|
+
# call nobody else holds. Without this a bare ``ta.vwap``
|
|
5981
|
+
# inside request.security() could not find its own site and
|
|
5982
|
+
# was lowered to the first live CHART member (advanced by the
|
|
5983
|
+
# chart bar AND every requested sub-bar, read through
|
|
5984
|
+
# history_advances_new_bar()); a second top-level read bound
|
|
5985
|
+
# to the first read's member as well.
|
|
5986
|
+
if len(self._ta_call_sites) > before:
|
|
5987
|
+
self._ta_call_sites[-1].node = node
|
|
5988
|
+
return result
|
|
5977
5989
|
return PineType.FLOAT
|
|
5978
5990
|
|
|
5979
5991
|
# math.* properties
|
{pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/analyzer/call_handlers.py
RENAMED
|
@@ -437,9 +437,15 @@ class CallHandlers:
|
|
|
437
437
|
all_args = [default_arg]
|
|
438
438
|
|
|
439
439
|
if func_name == "vwap" and not all_args:
|
|
440
|
-
|
|
440
|
+
# The bare ``ta.vwap`` property is the VWAP of hlc3 (Pine v6
|
|
441
|
+
# reference: "It uses hlc3 as its source series"); TradingView's
|
|
442
|
+
# own read equals hlc3 on a daily bar (lab tv
|
|
443
|
+
# notrade-session-vwap-f1d, NYSE:F 1D 2025-07-01..08-31, 42/42,
|
|
444
|
+
# 2026-09-05), where the engine used to read the bar's close.
|
|
445
|
+
default_src = Identifier(name="hlc3")
|
|
441
446
|
self._visit(default_src)
|
|
442
|
-
|
|
447
|
+
for field in ("high", "low", "close"):
|
|
448
|
+
self._series_bar_fields.add(field)
|
|
443
449
|
all_args = [default_src]
|
|
444
450
|
|
|
445
451
|
# Handle ta.highest(length) / ta.lowest(length) with 1 arg:
|
|
@@ -1914,7 +1914,10 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
1914
1914
|
self._collection_types[name] = spec
|
|
1915
1915
|
elif ns == "array" and fn in ({"new", "from"} | set(ARRAY_NEW_CTORS)):
|
|
1916
1916
|
self._array_vars.add(name)
|
|
1917
|
-
spec = self.
|
|
1917
|
+
spec = self._widen_array_spec_for_name(
|
|
1918
|
+
name,
|
|
1919
|
+
self._type_spec_from_expr(expr) or self._array_spec_for_name(name),
|
|
1920
|
+
)
|
|
1918
1921
|
self._collection_types[name] = spec
|
|
1919
1922
|
elif ns == "map" and fn == "new":
|
|
1920
1923
|
self._map_vars.add(name)
|
|
@@ -1934,7 +1937,10 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
1934
1937
|
fn2, ns2 = self._resolve_callee(expr.callee)
|
|
1935
1938
|
if ns2 == "array" and fn2 in ({"new", "from"} | set(ARRAY_NEW_CTORS)):
|
|
1936
1939
|
self._array_vars.add(name)
|
|
1937
|
-
spec2 = self.
|
|
1940
|
+
spec2 = self._widen_array_spec_for_name(
|
|
1941
|
+
name,
|
|
1942
|
+
self._type_spec_from_expr(expr) or self._array_spec_for_name(name),
|
|
1943
|
+
)
|
|
1938
1944
|
self._collection_types[name] = spec2
|
|
1939
1945
|
continue
|
|
1940
1946
|
if name in self._matrix_specs:
|
|
@@ -4275,7 +4281,9 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
4275
4281
|
)
|
|
4276
4282
|
):
|
|
4277
4283
|
self._array_vars.add(name)
|
|
4278
|
-
array_spec =
|
|
4284
|
+
array_spec = self._widen_array_spec_for_name(
|
|
4285
|
+
name, exact_member_spec or self._array_spec_for_name(name)
|
|
4286
|
+
)
|
|
4279
4287
|
lines.append(
|
|
4280
4288
|
f" {self._type_spec_to_cpp(array_spec)} {safe};"
|
|
4281
4289
|
)
|
|
@@ -89,6 +89,7 @@ from ..analyzer import FuncInfo
|
|
|
89
89
|
from ..symbols import PineType, method_receiver_cpp_token
|
|
90
90
|
from .tables import (
|
|
91
91
|
BAR_SERIES_PUSH,
|
|
92
|
+
TA_CHART_PREV_CLOSE_ARG,
|
|
92
93
|
DRAWING_TYPE_TO_CPP,
|
|
93
94
|
PINE_TYPE_TO_CPP,
|
|
94
95
|
RUNTIME_REGISTER_SECURITY_EVAL_FN,
|
|
@@ -1035,6 +1036,11 @@ class TopLevelEmitter:
|
|
|
1035
1036
|
# declaration statements, not in the global on_bar preamble.
|
|
1036
1037
|
if name in getattr(self, "_func_local_var_names", ()):
|
|
1037
1038
|
continue
|
|
1039
|
+
# A wide int array member (``std::vector<int64_t>``, see
|
|
1040
|
+
# ``_wide_int_array_names``) needs its first-bar constructor
|
|
1041
|
+
# spelled with the same element type: name the target for
|
|
1042
|
+
# visit_call's ``array.new_*`` / ``array.from`` lowering.
|
|
1043
|
+
self._array_ctor_target_name = name
|
|
1038
1044
|
safe = self._safe_name(name)
|
|
1039
1045
|
runtime_info = self._runtime_scalar_var_init_by_member.get(name)
|
|
1040
1046
|
if (runtime_info is not None
|
|
@@ -1131,6 +1137,7 @@ class TopLevelEmitter:
|
|
|
1131
1137
|
if cloned not in init_emitted:
|
|
1132
1138
|
init_emitted.add(cloned)
|
|
1133
1139
|
lines.append(f" {cloned}.push({cpp_val});")
|
|
1140
|
+
self._array_ctor_target_name = None
|
|
1134
1141
|
lines.append(" _var_initialized = true;")
|
|
1135
1142
|
lines.append(" } else {")
|
|
1136
1143
|
for name, _, _ in self.ctx.var_members:
|
|
@@ -1976,6 +1983,14 @@ class TopLevelEmitter:
|
|
|
1976
1983
|
if self._ta_site_uses_precalc(site):
|
|
1977
1984
|
compute_args = self._ta_compute_args_for_site(site)
|
|
1978
1985
|
compute_args_bars = compute_args.replace("current_bar_.", "bars[i].")
|
|
1986
|
+
# issue #178: the precalc pre-pass walks the bar array
|
|
1987
|
+
# itself, so the previous CHART close is bars[i - 1]
|
|
1988
|
+
# (the engine's prev_chart_close() tracker only advances
|
|
1989
|
+
# at on_bar dispatch).
|
|
1990
|
+
compute_args_bars = compute_args_bars.replace(
|
|
1991
|
+
TA_CHART_PREV_CLOSE_ARG,
|
|
1992
|
+
"(i > 0 ? bars[i - 1].close : na<double>())",
|
|
1993
|
+
)
|
|
1979
1994
|
lines.append(f" _precalc_{site.member_name}[i] = {site.member_name}.compute({compute_args_bars});")
|
|
1980
1995
|
finally:
|
|
1981
1996
|
self._precalc_loop_active = False
|
|
@@ -31,7 +31,12 @@ from ..ast_nodes import (
|
|
|
31
31
|
Ternary, TupleAssign, TupleLiteral, TypeDecl, TypeField, UnaryOp, VarDecl,
|
|
32
32
|
WhileStmt,
|
|
33
33
|
)
|
|
34
|
-
from .tables import
|
|
34
|
+
from .tables import (
|
|
35
|
+
TA_CHART_PREV_CLOSE,
|
|
36
|
+
TA_CHART_PREV_CLOSE_ARG,
|
|
37
|
+
TA_IMPLICIT_APPEND,
|
|
38
|
+
TA_IMPLICIT_COMPUTE_FULL,
|
|
39
|
+
)
|
|
35
40
|
|
|
36
41
|
if TYPE_CHECKING:
|
|
37
42
|
from ..analyzer import TACallSite
|
|
@@ -113,6 +118,10 @@ class TaSiteHelper:
|
|
|
113
118
|
|
|
114
119
|
if ta_name in TA_IMPLICIT_COMPUTE_FULL:
|
|
115
120
|
implicit = TA_IMPLICIT_COMPUTE_FULL[ta_name]
|
|
121
|
+
# issue #178: chart-context atr / tr take the previous CHART
|
|
122
|
+
# bar's close as a 4th argument (see TA_CHART_PREV_CLOSE).
|
|
123
|
+
if ta_name in TA_CHART_PREV_CLOSE:
|
|
124
|
+
implicit = f"{implicit}, {TA_CHART_PREV_CLOSE_ARG}"
|
|
116
125
|
if site.compute_args:
|
|
117
126
|
explicit = ", ".join(self._visit_expr(a) for a in site.compute_args)
|
|
118
127
|
if ta_name in self._TA_IMPLICIT_REPLACE:
|
|
@@ -222,6 +222,18 @@ TA_COMPUTE_ARGS = {
|
|
|
222
222
|
"max": [0], "min": [0], "rci": [0],
|
|
223
223
|
}
|
|
224
224
|
|
|
225
|
+
# issue #178: ta.atr / ta.tr read their true range against the previous
|
|
226
|
+
# CHART bar's close (close[1]) even when the call site executes sparsely —
|
|
227
|
+
# the RMA advances on the executions only (TradingView pin 2026-09-06,
|
|
228
|
+
# lab tv i178-sparse-atr-sense, BINANCE:BTCUSDT 60: 398/398 executions equal
|
|
229
|
+
# the chart-close model, 0/398 the previous-execution model). The chart
|
|
230
|
+
# context therefore passes ``BacktestEngine::prev_chart_close()`` as the
|
|
231
|
+
# 4th compute() argument (the engine's always-on tracker); the per-object
|
|
232
|
+
# prev_close (3-arg form) remains for request.security contexts, whose
|
|
233
|
+
# ``bar.`` rewrite has no chart-close tracker.
|
|
234
|
+
TA_CHART_PREV_CLOSE = {"atr", "tr"}
|
|
235
|
+
TA_CHART_PREV_CLOSE_ARG = "prev_chart_close()"
|
|
236
|
+
|
|
225
237
|
# TA functions whose ``.compute()`` always receives bar OHLC implicitly.
|
|
226
238
|
TA_IMPLICIT_COMPUTE_FULL = {
|
|
227
239
|
"atr": "current_bar_.high, current_bar_.low, current_bar_.close",
|
|
@@ -135,8 +135,9 @@ class TypeInferer:
|
|
|
135
135
|
if spec is None:
|
|
136
136
|
return "double"
|
|
137
137
|
if spec.kind == "primitive":
|
|
138
|
-
return {"float": "double", "int": "int", "
|
|
139
|
-
"
|
|
138
|
+
return {"float": "double", "int": "int", "int64": "int64_t",
|
|
139
|
+
"bool": "bool", "string": "std::string",
|
|
140
|
+
"color": "int"}.get(spec.name or "float", "double")
|
|
140
141
|
if spec.kind == "udt" and spec.name:
|
|
141
142
|
# Drawing handle structs (P1): map BEFORE the _udt_defs check so
|
|
142
143
|
# array<line> -> std::vector<Line> and scalar line -> Line instead
|
|
@@ -269,6 +270,175 @@ class TypeInferer:
|
|
|
269
270
|
return self._default_for_type(cpp_type)
|
|
270
271
|
|
|
271
272
|
def _collection_spec_for_name(self, name: str) -> TypeSpec | None:
|
|
273
|
+
"""``_collection_spec_for_name_raw`` with the wide-int element applied
|
|
274
|
+
(``_widen_array_spec_for_name``): an ``array<int>`` that stores epoch
|
|
275
|
+
milliseconds resolves as ``std::vector<int64_t>`` everywhere it is
|
|
276
|
+
read, declared or passed."""
|
|
277
|
+
return self._widen_array_spec_for_name(
|
|
278
|
+
name, self._collection_spec_for_name_raw(name)
|
|
279
|
+
)
|
|
280
|
+
|
|
281
|
+
# Element-returning array reads whose result carries the receiver's wide
|
|
282
|
+
# provenance (``_expr_returns_wide_int``).
|
|
283
|
+
_WIDE_ARRAY_ELEMENT_READS = frozenset({
|
|
284
|
+
"get", "first", "last", "pop", "shift", "remove", "max", "min",
|
|
285
|
+
})
|
|
286
|
+
# Writers whose VALUE argument decides whether an int array is wide:
|
|
287
|
+
# name -> (functional-form value index, method-form value index).
|
|
288
|
+
_ARRAY_ELEMENT_WRITERS = {
|
|
289
|
+
"push": (1, 0), "unshift": (1, 0), "set": (2, 1), "insert": (2, 1),
|
|
290
|
+
"fill": (1, 0),
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
@staticmethod
|
|
294
|
+
def _int_fits_int32(value: int) -> bool:
|
|
295
|
+
return -(1 << 31) <= value < (1 << 31)
|
|
296
|
+
|
|
297
|
+
def _pure_int_literal_value(self, node) -> int | None:
|
|
298
|
+
"""Exact value of an expression built only from int literals and
|
|
299
|
+
``+ - *`` / unary minus, else ``None``.
|
|
300
|
+
|
|
301
|
+
Pine ``int`` is 64-bit: ``90 * 24 * 60 * 60 * 1000`` (three months in
|
|
302
|
+
milliseconds) is 7 776 000 000 on TradingView. Emitted as C++ ``int``
|
|
303
|
+
literal arithmetic the same product overflows (wraps to -813 934 592),
|
|
304
|
+
so a ``(time - t0) > threeMonths`` expiry fires on every bar (round 8
|
|
305
|
+
family U: latibonit15 execution-signals-confluence, six lanes; lab tv
|
|
306
|
+
u-lati-levels-nq15 vs the engine, 2026-09-05). Folding the literal
|
|
307
|
+
subtree in Python keeps the exact value; the caller emits it as a
|
|
308
|
+
64-bit literal only when it does not fit ``int32`` so every in-range
|
|
309
|
+
expression is byte-identical to before.
|
|
310
|
+
"""
|
|
311
|
+
if isinstance(node, NumberLiteral):
|
|
312
|
+
return node.value if isinstance(node.value, int) and not isinstance(node.value, bool) else None
|
|
313
|
+
if isinstance(node, UnaryOp) and node.op == "-":
|
|
314
|
+
inner = self._pure_int_literal_value(node.operand)
|
|
315
|
+
return -inner if inner is not None else None
|
|
316
|
+
if isinstance(node, BinOp) and node.op in ("+", "-", "*"):
|
|
317
|
+
left = self._pure_int_literal_value(node.left)
|
|
318
|
+
if left is None:
|
|
319
|
+
return None
|
|
320
|
+
right = self._pure_int_literal_value(node.right)
|
|
321
|
+
if right is None:
|
|
322
|
+
return None
|
|
323
|
+
if node.op == "+":
|
|
324
|
+
return left + right
|
|
325
|
+
if node.op == "-":
|
|
326
|
+
return left - right
|
|
327
|
+
return left * right
|
|
328
|
+
return None
|
|
329
|
+
|
|
330
|
+
def _literal_overflows_int32(self, node) -> bool:
|
|
331
|
+
value = self._pure_int_literal_value(node)
|
|
332
|
+
return value is not None and not self._int_fits_int32(value)
|
|
333
|
+
|
|
334
|
+
def _array_receiver_and_value(self, call):
|
|
335
|
+
"""``(receiver_name, value_node)`` of an element-writing array call in
|
|
336
|
+
either form (``array.push(a, v)`` / ``a.push(v)``), else ``None``."""
|
|
337
|
+
if not isinstance(call, FuncCall):
|
|
338
|
+
return None
|
|
339
|
+
func_name, namespace = self._resolve_callee(call.callee)
|
|
340
|
+
if func_name not in self._ARRAY_ELEMENT_WRITERS:
|
|
341
|
+
return None
|
|
342
|
+
functional_idx, method_idx = self._ARRAY_ELEMENT_WRITERS[func_name]
|
|
343
|
+
if namespace == "array":
|
|
344
|
+
receiver = call.args[0] if call.args else call.kwargs.get("id")
|
|
345
|
+
value = (call.args[functional_idx]
|
|
346
|
+
if len(call.args) > functional_idx
|
|
347
|
+
else call.kwargs.get("value"))
|
|
348
|
+
elif (isinstance(call.callee, MemberAccess)
|
|
349
|
+
and isinstance(call.callee.object, Identifier)):
|
|
350
|
+
receiver = call.callee.object
|
|
351
|
+
value = (call.args[method_idx]
|
|
352
|
+
if len(call.args) > method_idx
|
|
353
|
+
else call.kwargs.get("value"))
|
|
354
|
+
else:
|
|
355
|
+
return None
|
|
356
|
+
if not isinstance(receiver, Identifier) or value is None:
|
|
357
|
+
return None
|
|
358
|
+
return receiver.name, value
|
|
359
|
+
|
|
360
|
+
def _wide_int_array_names(self) -> set[str]:
|
|
361
|
+
"""Names of int arrays that hold a wide integer: one that receives an
|
|
362
|
+
epoch-millisecond value (``time``, ``time_close``, ``timestamp(...)``,
|
|
363
|
+
a wide callable result, ...) through ``array.push`` / ``unshift`` /
|
|
364
|
+
``set`` / ``insert`` / ``fill``, or is built by ``array.new_int`` /
|
|
365
|
+
``array.new<int>`` / ``array.from`` from one. Their element type is
|
|
366
|
+
``int64_t`` (TypeSpec primitive ``int64``): Pine's ``int`` holds the
|
|
367
|
+
epoch, ``std::vector<int>`` truncates it. Cached on the instance."""
|
|
368
|
+
cached = getattr(self, "_wide_int_array_cache", None)
|
|
369
|
+
if cached is not None:
|
|
370
|
+
return cached
|
|
371
|
+
# The scan below asks ``_expr_returns_wide_int``, whose receiver typing
|
|
372
|
+
# resolves collection specs through ``_collection_spec_for_name`` and so
|
|
373
|
+
# back here: publish the (growing) set first so the recursion reads the
|
|
374
|
+
# partial answer instead of re-entering, then iterate to the fixpoint so
|
|
375
|
+
# an array filled from another wide array's elements widens too.
|
|
376
|
+
names: set[str] = set()
|
|
377
|
+
self._wide_int_array_cache = names
|
|
378
|
+
|
|
379
|
+
def scan(nodes, owner_info):
|
|
380
|
+
for child in nodes:
|
|
381
|
+
if isinstance(child, FuncCall):
|
|
382
|
+
pair = self._array_receiver_and_value(child)
|
|
383
|
+
if pair is not None and self._expr_returns_wide_int(
|
|
384
|
+
pair[1], owner_info, set(), None
|
|
385
|
+
):
|
|
386
|
+
names.add(pair[0])
|
|
387
|
+
continue
|
|
388
|
+
target = None
|
|
389
|
+
value = None
|
|
390
|
+
if isinstance(child, VarDecl):
|
|
391
|
+
target, value = child.name, child.value
|
|
392
|
+
elif (isinstance(child, Assignment)
|
|
393
|
+
and isinstance(child.target, Identifier)):
|
|
394
|
+
target, value = child.target.name, child.value
|
|
395
|
+
if target is None or not isinstance(value, FuncCall):
|
|
396
|
+
continue
|
|
397
|
+
fn, ns = self._resolve_callee(value.callee)
|
|
398
|
+
if ns != "array":
|
|
399
|
+
continue
|
|
400
|
+
candidates = []
|
|
401
|
+
if fn in ("new_int", "new"):
|
|
402
|
+
if fn == "new":
|
|
403
|
+
targs = (self._template_args_from_call(value)
|
|
404
|
+
if hasattr(value, "annotations") else [])
|
|
405
|
+
if not targs or targs[0] != "int":
|
|
406
|
+
continue
|
|
407
|
+
if len(value.args) > 1:
|
|
408
|
+
candidates.append(value.args[1])
|
|
409
|
+
if "initial_value" in value.kwargs:
|
|
410
|
+
candidates.append(value.kwargs["initial_value"])
|
|
411
|
+
elif fn == "from":
|
|
412
|
+
candidates = list(value.args)
|
|
413
|
+
if any(self._expr_returns_wide_int(c, owner_info, set(), None)
|
|
414
|
+
for c in candidates):
|
|
415
|
+
names.add(target)
|
|
416
|
+
|
|
417
|
+
ast = getattr(self.ctx, "ast", None)
|
|
418
|
+
for _round in range(8):
|
|
419
|
+
before = len(names)
|
|
420
|
+
if ast is not None:
|
|
421
|
+
scan(self._walk_ast(ast), None)
|
|
422
|
+
for info in getattr(self.ctx, "func_infos", ()):
|
|
423
|
+
node = getattr(info, "node", None)
|
|
424
|
+
if node is not None:
|
|
425
|
+
scan(self._walk_ast_list(node.body), info)
|
|
426
|
+
if len(names) == before:
|
|
427
|
+
break
|
|
428
|
+
return names
|
|
429
|
+
|
|
430
|
+
def _widen_array_spec_for_name(self, name, spec):
|
|
431
|
+
"""``array<int>`` -> ``array<int64>`` when ``name`` is a wide int
|
|
432
|
+
array; every other spec (and ``None``) passes through unchanged."""
|
|
433
|
+
if (spec is None or spec.kind != "array" or spec.element is None
|
|
434
|
+
or spec.element.kind != "primitive"
|
|
435
|
+
or spec.element.name != "int"):
|
|
436
|
+
return spec
|
|
437
|
+
if name in self._wide_int_array_names():
|
|
438
|
+
return TypeSpec.array(TypeSpec.primitive("int64"))
|
|
439
|
+
return spec
|
|
440
|
+
|
|
441
|
+
def _collection_spec_for_name_raw(self, name: str) -> TypeSpec | None:
|
|
272
442
|
"""Resolve collection metadata with lexical precedence.
|
|
273
443
|
|
|
274
444
|
Source-ordered callable locals shadow loop bindings and parameters once
|
|
@@ -417,7 +587,9 @@ class TypeInferer:
|
|
|
417
587
|
return TypeSpec.primitive("string")
|
|
418
588
|
if node.op == "/" or left.name == "float" or right.name == "float":
|
|
419
589
|
return TypeSpec.primitive("float")
|
|
420
|
-
if left.name
|
|
590
|
+
if left.name in ("int", "int64") and right.name in ("int", "int64"):
|
|
591
|
+
if "int64" in (left.name, right.name):
|
|
592
|
+
return TypeSpec.primitive("int64")
|
|
421
593
|
return TypeSpec.primitive("int")
|
|
422
594
|
return None
|
|
423
595
|
spec = self._type_spec_from_expr(node)
|
|
@@ -976,7 +1148,7 @@ class TypeInferer:
|
|
|
976
1148
|
"percentrank", "abs", "standardize", "covariance", "binary_search",
|
|
977
1149
|
"binary_search_leftmost", "binary_search_rightmost", "sort_indices",
|
|
978
1150
|
}
|
|
979
|
-
if method in numeric_only and elem_cpp not in ("double", "int"):
|
|
1151
|
+
if method in numeric_only and elem_cpp not in ("double", "int", "int64_t"):
|
|
980
1152
|
self._codegen_error(
|
|
981
1153
|
None,
|
|
982
1154
|
f"array.{method} requires a numeric array",
|
|
@@ -1187,7 +1359,7 @@ class TypeInferer:
|
|
|
1187
1359
|
# truly untyped slot may consult the per-callsite specialization map.
|
|
1188
1360
|
spec = declared_spec
|
|
1189
1361
|
if spec is not None and spec.kind == "primitive":
|
|
1190
|
-
if spec.name
|
|
1362
|
+
if spec.name in ("int", "int64"):
|
|
1191
1363
|
return "int64_t"
|
|
1192
1364
|
if spec.name == "bool":
|
|
1193
1365
|
return "bool"
|
|
@@ -1217,7 +1389,7 @@ class TypeInferer:
|
|
|
1217
1389
|
specs = list(getattr(func_info, "param_type_specs", ()) or ())
|
|
1218
1390
|
spec = specs[index] if index < len(specs) else None
|
|
1219
1391
|
if spec is not None and spec.kind == "primitive":
|
|
1220
|
-
if spec.name
|
|
1392
|
+
if spec.name in ("int", "int64"):
|
|
1221
1393
|
return "int64_t"
|
|
1222
1394
|
if spec.name == "bool":
|
|
1223
1395
|
return "bool"
|
|
@@ -1352,8 +1524,25 @@ class TypeInferer:
|
|
|
1352
1524
|
return self._expr_is_int64_builtin(expr)
|
|
1353
1525
|
if self._expr_is_int64_builtin(expr):
|
|
1354
1526
|
return True
|
|
1527
|
+
if isinstance(expr, (BinOp, UnaryOp)) and self._literal_overflows_int32(expr):
|
|
1528
|
+
# ``90 * 24 * 60 * 60 * 1000``: an int-literal product beyond
|
|
1529
|
+
# int32 is a 64-bit value in Pine (``_pure_int_literal_value``).
|
|
1530
|
+
return True
|
|
1355
1531
|
if isinstance(expr, FuncCall):
|
|
1356
1532
|
func_name, namespace = self._resolve_callee(expr.callee)
|
|
1533
|
+
if func_name in self._WIDE_ARRAY_ELEMENT_READS:
|
|
1534
|
+
# An element read off a wide int array (``array.get(times, i)``
|
|
1535
|
+
# / ``times.get(i)``) carries the epoch: the destination must
|
|
1536
|
+
# not narrow it (``_wide_int_array_names``).
|
|
1537
|
+
receiver = None
|
|
1538
|
+
if namespace == "array":
|
|
1539
|
+
receiver = expr.args[0] if expr.args else expr.kwargs.get("id")
|
|
1540
|
+
elif (isinstance(expr.callee, MemberAccess)
|
|
1541
|
+
and isinstance(expr.callee.object, Identifier)):
|
|
1542
|
+
receiver = expr.callee.object
|
|
1543
|
+
if (isinstance(receiver, Identifier)
|
|
1544
|
+
and receiver.name in self._wide_int_array_names()):
|
|
1545
|
+
return True
|
|
1357
1546
|
if namespace is None and func_name in {
|
|
1358
1547
|
"int",
|
|
1359
1548
|
"float",
|
{pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/codegen/visit_call.py
RENAMED
|
@@ -1555,6 +1555,12 @@ class CallVisitor:
|
|
|
1555
1555
|
if namespace == "array":
|
|
1556
1556
|
if func_name in ("new", "new_float", "new_int", "new_bool", "new_string") or func_name in ARRAY_DRAWING_NEW_CTORS:
|
|
1557
1557
|
spec = self._type_spec_from_expr(node) or TypeSpec.array(TypeSpec.primitive("float"))
|
|
1558
|
+
# The constructor of a wide int array (``_wide_int_array_names``)
|
|
1559
|
+
# must spell the declared ``std::vector<int64_t>``: the
|
|
1560
|
+
# declaration site names its target here.
|
|
1561
|
+
target = getattr(self, "_array_ctor_target_name", None)
|
|
1562
|
+
if target is not None:
|
|
1563
|
+
spec = self._widen_array_spec_for_name(target, spec)
|
|
1558
1564
|
cpp_type = self._type_spec_to_cpp(spec)
|
|
1559
1565
|
elem_spec = spec.element if spec.element is not None else TypeSpec.primitive("float")
|
|
1560
1566
|
init_default = self._default_for_spec(elem_spec)
|
|
@@ -1568,6 +1574,9 @@ class CallVisitor:
|
|
|
1568
1574
|
return f"{cpp_type}()"
|
|
1569
1575
|
if func_name == "from":
|
|
1570
1576
|
spec = self._type_spec_from_expr(node) or TypeSpec.array(TypeSpec.primitive("float"))
|
|
1577
|
+
target = getattr(self, "_array_ctor_target_name", None)
|
|
1578
|
+
if target is not None:
|
|
1579
|
+
spec = self._widen_array_spec_for_name(target, spec)
|
|
1571
1580
|
elems = ", ".join(self._visit_expr(a) for a in node.args)
|
|
1572
1581
|
return f"{self._type_spec_to_cpp(spec)}{{{elems}}}"
|
|
1573
1582
|
# Method calls: array.method(arr, args...)
|
{pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/codegen/visit_expr.py
RENAMED
|
@@ -673,26 +673,40 @@ class ExprVisitor:
|
|
|
673
673
|
# to dead ``f5``'s first-in-order ``_ta_vwap_10`` and emitted
|
|
674
674
|
# ``use of undeclared identifier '_ta_vwap_10'``. A live read
|
|
675
675
|
# must bind to a live site.
|
|
676
|
-
|
|
677
|
-
|
|
676
|
+
# The read's OWN site first (the analyzer keys the
|
|
677
|
+
# synthetic call-site on this MemberAccess node), so two
|
|
678
|
+
# bare reads are two sites, each advanced once per bar;
|
|
679
|
+
# the first-live-site scan below stays as the fallback.
|
|
680
|
+
_own = self._get_ta_site(node)
|
|
681
|
+
_candidates = (
|
|
682
|
+
[(self._ta_index_by_site_id.get(id(_own)), _own)]
|
|
683
|
+
if _own is not None else []
|
|
684
|
+
) + list(enumerate(self.ctx.ta_call_sites))
|
|
685
|
+
for _i, site in _candidates:
|
|
686
|
+
if _i is None or _i in self._dead_ta_indices:
|
|
678
687
|
continue
|
|
679
688
|
ta_short = site.class_name.split("::")[-1].lower()
|
|
680
689
|
if site.member_name.startswith(f"_ta_{node.member}_"):
|
|
681
690
|
if node.member == "vwap":
|
|
682
691
|
# Same implicit tail as TA_IMPLICIT_APPEND["vwap"]:
|
|
683
692
|
# the symbol clock keys the Daily anchor reset.
|
|
693
|
+
# The bare property is the VWAP of hlc3 (Pine
|
|
694
|
+
# v6 reference; lab tv notrade-session-vwap-f1d,
|
|
695
|
+
# 2026-09-05: TradingView's read equals hlc3 on
|
|
696
|
+
# a daily bar), never of the close.
|
|
697
|
+
_hlc3 = "((current_bar_.high + current_bar_.low + current_bar_.close) / 3.0)"
|
|
684
698
|
return (
|
|
685
|
-
f"(history_advances_new_bar() ? {site
|
|
686
|
-
"
|
|
699
|
+
f"(history_advances_new_bar() ? {self._ta_member_name(site)}.compute("
|
|
700
|
+
f"{_hlc3}, current_bar_.volume, current_bar_.timestamp"
|
|
687
701
|
" PF_VWAP_SESSION_ANCHOR_ARGS(syminfo_.timezone, syminfo_.session)) "
|
|
688
|
-
f": {site
|
|
702
|
+
f": {self._ta_member_name(site)}.recompute({_hlc3}, "
|
|
689
703
|
"current_bar_.volume, current_bar_.timestamp"
|
|
690
704
|
" PF_VWAP_SESSION_ANCHOR_ARGS(syminfo_.timezone, syminfo_.session)))"
|
|
691
705
|
)
|
|
692
706
|
return (
|
|
693
|
-
f"(history_advances_new_bar() ? {site
|
|
707
|
+
f"(history_advances_new_bar() ? {self._ta_member_name(site)}.compute("
|
|
694
708
|
f"{TA_IMPLICIT_COMPUTE_FULL[node.member]}) : "
|
|
695
|
-
f"{site
|
|
709
|
+
f"{self._ta_member_name(site)}.recompute("
|
|
696
710
|
f"{TA_IMPLICIT_COMPUTE_FULL[node.member]}))"
|
|
697
711
|
)
|
|
698
712
|
# No registered call site for this TA property read —
|
|
@@ -1037,6 +1051,13 @@ class ExprVisitor:
|
|
|
1037
1051
|
return f"({left_cpp} {op} {right_cpp})"
|
|
1038
1052
|
|
|
1039
1053
|
def _visit_binop(self, node: BinOp) -> str:
|
|
1054
|
+
# An int-literal-only ``+ - *`` tree whose exact value leaves int32 is
|
|
1055
|
+
# a 64-bit Pine int (``90 * 24 * 60 * 60 * 1000`` = 7 776 000 000);
|
|
1056
|
+
# C++ ``int`` literal arithmetic would wrap it. Fold it here and spell
|
|
1057
|
+
# the value as a 64-bit literal. In-range trees are emitted as before.
|
|
1058
|
+
folded = self._pure_int_literal_value(node)
|
|
1059
|
+
if folded is not None and not self._int_fits_int32(folded):
|
|
1060
|
+
return f"static_cast<int64_t>({folded}LL)"
|
|
1040
1061
|
left = self._visit_expr(node.left)
|
|
1041
1062
|
right = self._visit_expr(node.right)
|
|
1042
1063
|
cpp_ops = {"and": "&&", "or": "||"}
|
{pineforge_codegen-0.10.3 → pineforge_codegen-0.10.4}/pineforge_codegen/codegen/visit_stmt.py
RENAMED
|
@@ -495,6 +495,11 @@ class StmtVisitor:
|
|
|
495
495
|
)
|
|
496
496
|
previous_input_name = self._current_input_var_name
|
|
497
497
|
self._current_input_var_name = node.name
|
|
498
|
+
# A ``var`` int array that stores epoch milliseconds is declared
|
|
499
|
+
# ``std::vector<int64_t>``; its one-shot constructor here must
|
|
500
|
+
# spell the same type (visit_call array.new_* / array.from).
|
|
501
|
+
previous_ctor_target = getattr(self, "_array_ctor_target_name", None)
|
|
502
|
+
self._array_ctor_target_name = node.name
|
|
498
503
|
try:
|
|
499
504
|
type_spec = info.get("type_spec")
|
|
500
505
|
target_cpp_type = info.get("drawing_cpp")
|
|
@@ -535,6 +540,7 @@ class StmtVisitor:
|
|
|
535
540
|
init_cpp = self._visit_expr(node.value)
|
|
536
541
|
finally:
|
|
537
542
|
self._current_input_var_name = previous_input_name
|
|
543
|
+
self._array_ctor_target_name = previous_ctor_target
|
|
538
544
|
if info.get("drawing_cpp") is None:
|
|
539
545
|
init_cpp = self._typed_na_init(
|
|
540
546
|
init_cpp, member_name, info["ptype"]
|
|
@@ -618,13 +624,19 @@ class StmtVisitor:
|
|
|
618
624
|
func_name, namespace = self._resolve_callee(node.value.callee)
|
|
619
625
|
if namespace == "array" and func_name in ARRAY_NEW_CTORS | {"new", "from", "copy", "slice"}:
|
|
620
626
|
captured = self._callable_collection_bindings.get(id(node))
|
|
621
|
-
spec = (
|
|
627
|
+
spec = self._widen_array_spec_for_name(
|
|
628
|
+
node.name,
|
|
622
629
|
captured
|
|
623
630
|
if captured is not None and captured.kind == "array"
|
|
624
631
|
else self._type_spec_from_expr(node.value)
|
|
625
|
-
or self._array_spec_for_name(node.name)
|
|
632
|
+
or self._array_spec_for_name(node.name),
|
|
626
633
|
)
|
|
627
|
-
|
|
634
|
+
previous_target = getattr(self, "_array_ctor_target_name", None)
|
|
635
|
+
self._array_ctor_target_name = node.name
|
|
636
|
+
try:
|
|
637
|
+
init = self._visit_expr(node.value)
|
|
638
|
+
finally:
|
|
639
|
+
self._array_ctor_target_name = previous_target
|
|
628
640
|
self._array_vars.add(node.name)
|
|
629
641
|
self._collection_types.setdefault(node.name, spec)
|
|
630
642
|
cpp_type = self._type_spec_to_cpp(spec)
|
|
@@ -75,7 +75,9 @@ def method_receiver_type_name(spec: TypeSpec | None) -> str | None:
|
|
|
75
75
|
if spec is None:
|
|
76
76
|
return None
|
|
77
77
|
if spec.kind in {"primitive", "udt"}:
|
|
78
|
-
|
|
78
|
+
# A wide (epoch-millisecond) element is still Pine ``int`` to the
|
|
79
|
+
# source: a user method declared on ``array<int>`` binds to it.
|
|
80
|
+
return "int" if spec.name == "int64" else spec.name
|
|
79
81
|
if spec.kind == "array" and spec.element is not None:
|
|
80
82
|
element = method_receiver_type_name(spec.element)
|
|
81
83
|
return f"array<{element}>" if element is not None else None
|
|
@@ -106,7 +108,7 @@ def method_receiver_cpp_token(
|
|
|
106
108
|
|
|
107
109
|
if spec is not None:
|
|
108
110
|
if spec.kind in {"primitive", "udt"} and spec.name:
|
|
109
|
-
return spec.name
|
|
111
|
+
return "int" if spec.name == "int64" else spec.name
|
|
110
112
|
if spec.kind == "array" and spec.element is not None:
|
|
111
113
|
return f"array_{method_receiver_cpp_token(spec.element)}"
|
|
112
114
|
if spec.kind == "map" and spec.key is not None and spec.value is not None:
|
|
@@ -52,11 +52,13 @@ def test_ta_vwap_precalc_path_threads_symbol_clock():
|
|
|
52
52
|
|
|
53
53
|
|
|
54
54
|
def test_ta_vwap_bare_property_read_threads_symbol_clock():
|
|
55
|
+
# The bare property is the VWAP of hlc3 (tests/test_vwap_property_source.py).
|
|
55
56
|
cpp = transpile(_pine("v = ta.vwap\nw = ta.vwap"))
|
|
56
|
-
|
|
57
|
+
hlc3 = "((current_bar_.high + current_bar_.low + current_bar_.close) / 3.0)"
|
|
58
|
+
calls = [c for c in _calls(cpp, "compute") if hlc3 in c and "vwap" in c]
|
|
57
59
|
assert calls, cpp
|
|
58
60
|
for call in calls:
|
|
59
|
-
assert "
|
|
61
|
+
assert hlc3 + ", current_bar_.volume, current_bar_.timestamp " + SYM_TAIL in call, call
|
|
60
62
|
|
|
61
63
|
|
|
62
64
|
def test_ta_vwap_bands_form_threads_symbol_clock():
|
|
@@ -168,7 +168,7 @@ x = ta.tr(false)
|
|
|
168
168
|
assert re.search(r"_ta_tr_\d+\(false\)", cpp), cpp
|
|
169
169
|
# Compute is invoked with the bar OHLC implicitly threaded in.
|
|
170
170
|
assert (
|
|
171
|
-
"_ta_tr_1.compute(current_bar_.high, current_bar_.low, current_bar_.close)"
|
|
171
|
+
"_ta_tr_1.compute(current_bar_.high, current_bar_.low, current_bar_.close, prev_chart_close())"
|
|
172
172
|
in cpp
|
|
173
173
|
)
|
|
174
174
|
|