pineforge-codegen 0.7.2__tar.gz → 0.7.3__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.7.3/.github/dependabot.yml +20 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/PKG-INFO +1 -1
- pineforge_codegen-0.7.3/VERSION +1 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/base.py +87 -10
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/visit_call.py +5 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/support_checker.py +62 -19
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/scripts/worker-template.mjs +21 -0
- pineforge_codegen-0.7.3/tests/gate-corpus/err/divergent_last_bar_index.pine +7 -0
- pineforge_codegen-0.7.3/tests/gate-corpus/err/divergent_time_close.pine +9 -0
- pineforge_codegen-0.7.3/tests/gate-corpus/ok/validation__max-bars-back-function-call-deep-history-01.pine +23 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_official_surface.py +40 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_support_checker.py +78 -8
- pineforge_codegen-0.7.3/tests/test_support_checker_syminfo_gap_fields.py +120 -0
- pineforge_codegen-0.7.2/.github/dependabot.yml +0 -8
- pineforge_codegen-0.7.2/VERSION +0 -1
- pineforge_codegen-0.7.2/tests/test_support_checker_syminfo_gap_fields.py +0 -71
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/.github/workflows/gate.yml +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/.github/workflows/publish-pyodide.yml +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/.github/workflows/release.yml +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/.github/workflows/test.yml +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/.gitignore +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/CLAUDE.md +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/LEGAL.md +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/LICENSE +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/PYODIDE_TARGET +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/README.md +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/docs/codegen-coverage-gaps.md +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/gate/compare.mjs +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/gate/glue.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/gate/oracle.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/gate/run-gate.mjs +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/gate/selftest.mjs +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/npm/README.md +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/npm/index.mjs +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/npm/package.json +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/package-lock.json +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/package.json +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/__init__.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/analyzer/__init__.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/analyzer/base.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/analyzer/call_handlers.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/analyzer/contracts.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/analyzer/diagnostics.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/analyzer/tables.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/analyzer/types.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/ast_nodes.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/__init__.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/emit_top.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/helpers.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/helpers_syminfo.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/input.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/security.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/ta.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/tables.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/types.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/visit_expr.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/visit_stmt.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/errors.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/lexer.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/parser.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/pragmas.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/signatures.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/symbols.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/tokens.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pineforge_codegen/tv_input_choices.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/pyproject.toml +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/scripts/build-npm-package.mjs +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/scripts/dump-tables.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/__init__.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/_compile.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/chart_bg_color.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/const_ns_plot_style_free.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/const_ns_shape_free.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/export_func.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/footprint_new.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/hard_reject_dividends.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/matrix_unknown_elem.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/multi_error_one_line.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/sec_tf_invalid.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/unknown_color.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/unknown_math.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/unknown_str.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/unknown_strategy_fn.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/unknown_syminfo.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/unknown_ta.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/AAPL__session-ismarket-nyse-rth-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/AAPL__time-tradingday-daily-reset-counter-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/QQQ__session-ispremarket-nasdaq-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/SPY__session-firstbar-vwap-anchor-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/SPY__session-lastbar-flatten-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/crypto-htf__mtf-htf-monthly-ema-cross-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/crypto-leverage__leverage-margin-call-perp-5x-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/forex__symbol-fx-5dp-eurusd-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/futures__symbol-futures-pointvalue-es-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/tutorial__macd__strategy.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/tutorial__mtf__strategy_htf.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/tutorial__mtf__strategy_ltf.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/us-equity__symbol-equity-rth-gaps-aapl-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/us-equity__us-equity-exchange-tz-intraday-cap-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__analyzer-parity-choch-bos-isolator-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__analyzer-parity-edge-margin-50-pct-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__analyzer-parity-percent-of-equity-sizing-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__analyzer-parity-small-equity-fraction-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__analyzer-parity-stop-limit-timing-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__analyzer-self-test-multi-mode-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__anomaly-equity-mirror-strategy-equity-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__barstate-isconfirmed-magnifier-off-01b.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__barstate-isconfirmed-magnifier-on-01a.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-atr-trail-series-int-points-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-atr-trailing-stop-state-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-entry-exit-same-pass-attach-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-exit-stop-limit-trail-same-bar-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-exit-three-way-set-once-entry-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-exit-tp-sl-fixed-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-narrow-stop-limit-with-trail8-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-partial-exit-qty-percent-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-same-id-exit-replace-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-tp-sl-oca-reduce-isolate-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-trail-points-no-offset-explicit-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-trail-points-with-offset-only-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-trailing-activation-offset-path-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__cap-max-intraday-filled-orders-isolate-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__cap-risk-gates-allow-max-intraday-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-4emarsi-integration-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-4emarsi-quad-ema-stack-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-4emarsi-rsi-pullback-latch-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-4emarsi-session-window-nbar-exit-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-boscurv-integration-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-boscurv-linreg-slope-channel-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-boscurv-pivot-bos-trigger-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-bracket-cap-range-pending-stop-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-ies-adx-regime-classify-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-ies-bb-kc-squeeze-release-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-ies-cooldown-daily-cap-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-ies-equity-feedback-sizing-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-ies-integration-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-ies-pivot-liquidity-sweep-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-ies-pressure-gauge-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-ies-rsi-macd-momentum-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-ies-three-ema-bias-score-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-kanuck-calc-on-every-tick-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-kanuck-integration-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-kanuck-kama-state-recurrence-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-kanuck-max-bars-back-500-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-kkb-ema-atr-breakout-band-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-kkb-integration-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-kkb-kalman-filter-1d-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-kkb-margin-100-pct-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-liqsweep-integration-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-liqsweep-pivot-hh-ll-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-liqsweep-wait-one-continuation-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-liqsweep-wick-pierce-close-back-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-marketshift-integration-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-marketshift-pivot-state-machine-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-marketshift-rolling-highest-lowest-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-marketshift-state-edge-detector-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-scalping-fast-ma-cross-trigger-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-scalping-integration-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-scalping-tight-tp-sl-points-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-trendmaster-integration-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-trendmaster-line-new-projection-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-trendmaster-pivot-anchored-bracket-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-trendmaster-three-tier-ema-state-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-trendmaster-trend-momentum-structure-gate-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-vcp-cumulative-volume-delta-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-vcp-fvg-active-zones-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-vcp-integration-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-vcp-manual-adx-regime-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-vcp-pivot-strength-5-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-vcp-rsi-smooth-divergence-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-vcp-session-tz-newyork-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-vcp-vol-zscore-anomaly-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-wunderscalper-alert-templates-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-wunderscalper-explicit-reverse-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-wunderscalper-integration-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__input-source-runtime-override-high-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__input-source-subscript-hl2-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ltf-bool-array-bull-majority-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ltf-numeric-float-ratio15-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__magnifier-tick-dist-endpoints-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__magnifier-tick-dist-endpoints-rsi-cross-08a.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__magnifier-tick-dist-volume-weighted-on-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__matrix-bool-mask-explicit-utc-tz-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__matrix-bool-mask-no-transpose-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__matrix-bool-mask-transpose-roundtrip-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__matrix-bool-regime-mask-24x7-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__matrix-covariance-eigen-pca-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__matrix-eigen-rank-deficient-cov-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-daily-array-median-percentrank-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-daily-ema26-warmup-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-daily-prev-high-break-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-dual-tf-60-240-rising-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-htf-60-close-change-baseline-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-htf-60-close-roll-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-htf-60-gaps-on-roll-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-htf-60-rsi14-inside-security-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-htf-60-sma20-inside-security-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-htf-60-volume-spike-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-htf-confluence-manual-trail-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-htf-confluence-static-bracket-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-htf-weekly-sma-cross-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-roll-state-60-240-d-minimal-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-triple-tf-close-confluence-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-triple-tf-macd-hist-confluence-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__na-deep-history-int-na-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__na-nz-fixnan-history-chain-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__oca-exit-bracket-internal-cancel-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__oca-multi-bracket-isolation-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__oca-raw-strategy-order-reduce-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-close-all-cancel-all-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-close-immediate-vs-next-bar-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-cross-entry-cancel-same-pass-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-cross-entry-close-same-pass-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-cross-exit-close-same-pass-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-deferred-flip-guaranteed-gap-stops-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-deferred-flip-pooc-cross-bar-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-four-bar-stop-no-close-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-side-same-id-stop-no-cancel-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-stop-both-touch-priority-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-stop-cancel-rotation-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-stop-far-only-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-stop-near-only-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-stop-open-high-first-path-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-stop-open-low-first-path-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-stop-open-tie-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-stop-source-order-long-first-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-stop-source-order-short-first-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-entry-implicit-reversal-exit-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-flip-stop-no-paired-close-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-market-close-fill-basis-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-one-side-four-bar-far-opposite-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-opposite-entry-close-same-pass-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-percent-equity-cash-commission-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-process-on-close-false-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-process-on-close-true-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-range-expansion-pending-stop-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-same-id-entry-close-same-bar-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-same-id-market-entry-repeat-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-same-id-stop-after-flat-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-same-id-stop-cross-before-modify-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-same-id-stop-minute-zero-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-same-id-stop-modification-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-same-id-stop-raise-only-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-same-id-stop-window-four-bars-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-stale-stop-after-close-no-cancel-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-stop-cancel-no-regime-close-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-stop-entry-cancel-opposite-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-stop-entry-reversal-grouping-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-stop-entry-touch-boundary-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__pyramid-cash-fractional-commission-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__pyramid-close-id-grouping-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__pyramid-deferred-flip-close-all-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__pyramid-flip-stop-pyramiding-2-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__recompute-alma-sar-corr-magnifier-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__recompute-mtf-rsi-macd-bb-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__risk-max-contracts-held-gate-pyramid-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__session-hour-minute-pulse-filter-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__session-ny-spring-forward-dst-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__stats-eventrades-zero-pnl-count-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-accdist-ema-cross-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-bb-kc-squeeze-breakout-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-bb-rsi-mean-reversion-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-cci-threshold-cross-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-chandelier-exit-direction-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-closedtrades-risk-introspection-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-cmo-9-zero-cross-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-cog-10-signal-cross-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-dmi-adx-di-cross-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-donchian-channel-breakout-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-dual-ma-switch-dispatch-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-dual-thrust-open-anchored-range-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-elder-ray-bull-bear-power-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-ema-ribbon-stack-transition-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-engulfing-candle-pattern-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-highestbars-lowestbars-breakout-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-hma-55-close-cross-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-hma-fast-slow-cross-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-inside-bar-engulfing-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-kama-style-efficiency-ratio-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-keltner-channel-break-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-linreg-stdev-channel-revert-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-macd-12-26-9-line-signal-cross-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-macd-histogram-reversal-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-macd-line-gt-signal-continuous-state-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-map-regime-threshold-lookup-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-median-vs-ema-cross-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-mfi-14-bands-20-80-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-momentum-roc-zero-cross-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-multi-indicator-score-composite-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-nvi-pvi-cross-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-obv-ema-cross-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-percentrank-mean-reversion-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-pivot-array-unshift-pop-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-pivot-atr-stop-target-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-pivot-confirmed-break-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-pivot-point-levels-break-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-pvt-ema-cross-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-range-filter-var-band-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-rci-14-zero-cross-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-rsi-bb-self-bands-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-rsi-ema-signal-cross-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-rsi-macd-and-continuous-state-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-rsi14-bands-30-70-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-rsi14-cross-50-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-rsi14-gt-50-continuous-state-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-rsi14-gt60-lt45-no-matrix-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-sar-flip-entry-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-sma-152-close-cross-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-sma-dual-cross-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-stdev-sma-expansion-break-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-stoch-slow-k-d-cross-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-stochastic-rsi-cross-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-str-match-regex-filter-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-supertrend-adx-filter-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-supertrend-direction-flip-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-triple-sma-stack-latch-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-tsi-25-13-signal-cross-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-volume-spike-atr-breakout-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-vwma-vs-sma-divergence-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-wpr-14-bands-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__timeframe-main-period-self-adaptive-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-calls-sibling-cumulative-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-default-param-kwargs-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-drives-strategy-entry-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-extra-primitive-args-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-feeds-strategy-exit-prices-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-in-for-loop-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-in-if-else-branch-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-in-switch-arms-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-in-while-loop-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-mutating-self-ref-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-on-array-element-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-reads-strategy-state-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-receives-ta-series-param-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-scalar-return-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-tuple-return-destructure-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-udt-return-from-func-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-uses-history-globals-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-uses-math-funcs-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-uses-na-nz-fixnan-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-var-instance-streak-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-windowed-method-chain-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-regime-stack-stress-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__vwap-bands-breakout-1sigma-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__vwap-bands-mean-reversion-2sigma-01.pine +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/golden/matrix_eigen_pca.cpp +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_analyzer.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_analyzer_matrix_inference.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_analyzer_ta_return_types.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_codegen_audit_fixes.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_codegen_determinism.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_codegen_fallthrough_guards.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_codegen_golden.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_codegen_input_getters.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_codegen_matrix_typed.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_codegen_new.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_compile_corpus.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_compile_smoke.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_errors.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_import_all.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_input_time_int64.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_int64_time_storage.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_lexer.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_parser.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_security_tf_literal.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_signatures.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_support_checker_chart_visible_bar_time.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_support_checker_color_cast.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_support_checker_const_namespaces.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_support_checker_dividends_earnings.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_support_checker_footprint.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_support_checker_input_color.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_support_checker_input_source.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_support_checker_matrix.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_support_checker_security_adjustment.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_support_checker_timeframe_from_seconds.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_support_checker_varip.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_support_checker_volume_row.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_symbols.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_ta_official_surface.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_transpile_division.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_transpile_enum_order.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_transpile_pf_trace.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_transpile_tr_handle_na.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_transpiler_matrix_kwargs.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_typespec_matrix.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_udt_drawing_field_cleanup.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_unsupported_reporting.py +0 -0
- {pineforge_codegen-0.7.2 → pineforge_codegen-0.7.3}/tests/test_vwap_tuple_unpack.py +0 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
# Keep the SHA-pinned GitHub Actions in workflows up to date with
|
|
4
|
+
# reviewable PRs (security review: pinned actions need a bump path).
|
|
5
|
+
- package-ecosystem: "github-actions"
|
|
6
|
+
directory: "/"
|
|
7
|
+
schedule:
|
|
8
|
+
interval: "weekly"
|
|
9
|
+
# The conformance-gate / npm-package tooling (pyodide pinned to PYODIDE_TARGET,
|
|
10
|
+
# tar caret range) — get reviewable bump PRs. NOTE: a pyodide bump must move
|
|
11
|
+
# PYODIDE_TARGET in lockstep (the gate validates against it), so review these.
|
|
12
|
+
- package-ecosystem: "npm"
|
|
13
|
+
directory: "/"
|
|
14
|
+
schedule:
|
|
15
|
+
interval: "weekly"
|
|
16
|
+
# Python dev deps (pytest).
|
|
17
|
+
- package-ecosystem: "pip"
|
|
18
|
+
directory: "/"
|
|
19
|
+
schedule:
|
|
20
|
+
interval: "weekly"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pineforge-codegen
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.3
|
|
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.7.3
|
|
@@ -469,6 +469,79 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
469
469
|
self._register_global_aggregate_member_types()
|
|
470
470
|
self._uses_matrix = self._detect_matrix_usage()
|
|
471
471
|
|
|
472
|
+
# max_bars_back: the per-variable history depth the engine's Series<T>
|
|
473
|
+
# ring buffer should retain. Pine exposes this two ways — the
|
|
474
|
+
# ``strategy(..., max_bars_back=N)`` kwarg (global) and the
|
|
475
|
+
# ``max_bars_back(var, N)`` function (per-var). The engine's
|
|
476
|
+
# ``Series<T>(int max_len)`` ctor (default 500, include/pineforge/
|
|
477
|
+
# series.hpp) is the wiring point: reads past the retained depth return
|
|
478
|
+
# na, so honoring the directive means constructing each Series with a
|
|
479
|
+
# capacity >= the requested depth. We take the MAX requested N and apply
|
|
480
|
+
# it (via ``_series_decl_suffix`` -> ``{N}``) to the directly-declared
|
|
481
|
+
# ``Series<T>`` members — a safe superset of Pine's per-var semantics
|
|
482
|
+
# (it never retains LESS than Pine, so any history access that succeeds
|
|
483
|
+
# in Pine succeeds here). ``None`` => no directive => keep the engine
|
|
484
|
+
# default 500 (emit a bare ``Series<T>`` with no ctor arg, so
|
|
485
|
+
# directive-free output is byte-identical to before).
|
|
486
|
+
#
|
|
487
|
+
# KNOWN LIMITATION: the lazily-constructed security-helper map series
|
|
488
|
+
# (``_security_helper_series_``, the ``std::unordered_map<std::string,
|
|
489
|
+
# Series<double>>`` ~line 971) do NOT pick up the cap. Their entries are
|
|
490
|
+
# default-constructed on first ``operator[]`` access, so they always use
|
|
491
|
+
# the engine default 500 regardless of the requested ``N``. A
|
|
492
|
+
# max_bars_back directive larger than 500 is therefore not honored for
|
|
493
|
+
# history reads off security-helper series.
|
|
494
|
+
self._max_bars_back_cap: int | None = self._compute_max_bars_back_cap()
|
|
495
|
+
|
|
496
|
+
@staticmethod
|
|
497
|
+
def _int_literal_value(node: ASTNode | None) -> int | None:
|
|
498
|
+
"""Return the integer value of a (possibly unary-minus) NumberLiteral,
|
|
499
|
+
or None if ``node`` is not an integer literal expression."""
|
|
500
|
+
if isinstance(node, UnaryOp) and node.op == "-":
|
|
501
|
+
inner = CodeGen._int_literal_value(node.operand)
|
|
502
|
+
return -inner if inner is not None else None
|
|
503
|
+
if isinstance(node, NumberLiteral) and isinstance(node.value, int):
|
|
504
|
+
return node.value
|
|
505
|
+
if isinstance(node, NumberLiteral) and isinstance(node.value, float):
|
|
506
|
+
# Pine accepts ``max_bars_back=5e2`` style; accept integral floats.
|
|
507
|
+
return int(node.value) if node.value.is_integer() else None
|
|
508
|
+
return None
|
|
509
|
+
|
|
510
|
+
def _compute_max_bars_back_cap(self) -> int | None:
|
|
511
|
+
"""Scan the AST for max_bars_back directives (strategy() kwarg AND the
|
|
512
|
+
bare function call) and return the largest positive integer requested,
|
|
513
|
+
or None if none is present / none is a usable literal."""
|
|
514
|
+
ast = getattr(self.ctx, "ast", None)
|
|
515
|
+
if ast is None:
|
|
516
|
+
return None
|
|
517
|
+
caps: list[int] = []
|
|
518
|
+
for node in self._walk_ast(ast):
|
|
519
|
+
if isinstance(node, StrategyDecl):
|
|
520
|
+
val = self._int_literal_value(node.kwargs.get("max_bars_back"))
|
|
521
|
+
if val is not None and val > 0:
|
|
522
|
+
caps.append(val)
|
|
523
|
+
elif (
|
|
524
|
+
isinstance(node, FuncCall)
|
|
525
|
+
and isinstance(node.callee, Identifier)
|
|
526
|
+
and node.callee.name == "max_bars_back"
|
|
527
|
+
):
|
|
528
|
+
# max_bars_back(var, num) — second positional arg, or the
|
|
529
|
+
# ``num=`` kwarg, is the depth.
|
|
530
|
+
num_node = None
|
|
531
|
+
if len(node.args) >= 2:
|
|
532
|
+
num_node = node.args[1]
|
|
533
|
+
elif "num" in node.kwargs:
|
|
534
|
+
num_node = node.kwargs["num"]
|
|
535
|
+
val = self._int_literal_value(num_node)
|
|
536
|
+
if val is not None and val > 0:
|
|
537
|
+
caps.append(val)
|
|
538
|
+
return max(caps) if caps else None
|
|
539
|
+
|
|
540
|
+
def _series_decl_suffix(self) -> str:
|
|
541
|
+
"""C++ constructor-arg suffix for Series<T> member declarations. Empty
|
|
542
|
+
(engine default 500) unless a max_bars_back directive raised the cap."""
|
|
543
|
+
return f"{{{self._max_bars_back_cap}}}" if self._max_bars_back_cap else ""
|
|
544
|
+
|
|
472
545
|
def _register_global_aggregate_member_types(self) -> None:
|
|
473
546
|
"""Infer matrix/array/map class members for global non-var declarations from RHS AST.
|
|
474
547
|
|
|
@@ -802,6 +875,10 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
802
875
|
|
|
803
876
|
lines: list[str] = []
|
|
804
877
|
|
|
878
|
+
# Series<T> ctor-arg suffix from any max_bars_back directive (empty when
|
|
879
|
+
# absent, so directive-free output is byte-identical to before).
|
|
880
|
+
_mbb = self._series_decl_suffix()
|
|
881
|
+
|
|
805
882
|
# 1. Includes
|
|
806
883
|
self._emit_includes(lines)
|
|
807
884
|
|
|
@@ -875,7 +952,7 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
875
952
|
self._security_ohlc_hist_fields_by_sec.get(sec_id, ())
|
|
876
953
|
):
|
|
877
954
|
lines.append(
|
|
878
|
-
f" Series<double> {self._security_ohlc_hist_series_cpp(sec_id, field)};"
|
|
955
|
+
f" Series<double> {self._security_ohlc_hist_series_cpp(sec_id, field)}{_mbb};"
|
|
879
956
|
)
|
|
880
957
|
continue
|
|
881
958
|
if returns_tuple and tuple_size and tuple_size > 0 and isinstance(expr_node, TupleLiteral):
|
|
@@ -896,7 +973,7 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
896
973
|
lines.append(f" double _req_sec_{sec_id} = na<double>();")
|
|
897
974
|
for field in sorted(self._security_ohlc_hist_fields_by_sec.get(sec_id, ())):
|
|
898
975
|
lines.append(
|
|
899
|
-
f" Series<double> {self._security_ohlc_hist_series_cpp(sec_id, field)};"
|
|
976
|
+
f" Series<double> {self._security_ohlc_hist_series_cpp(sec_id, field)}{_mbb};"
|
|
900
977
|
)
|
|
901
978
|
|
|
902
979
|
if self._security_calls:
|
|
@@ -911,7 +988,7 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
911
988
|
state_name = self._security_state_name(info["sec_id"], name)
|
|
912
989
|
cpp_type = self._security_cpp_type_for_mutable(name, ginfo)
|
|
913
990
|
if getattr(ginfo, "is_series", False):
|
|
914
|
-
lines.append(f" Series<{cpp_type}> {state_name};")
|
|
991
|
+
lines.append(f" Series<{cpp_type}> {state_name}{_mbb};")
|
|
915
992
|
else:
|
|
916
993
|
default = self._default_for_type(cpp_type)
|
|
917
994
|
lines.append(f" {cpp_type} {state_name} = {default};")
|
|
@@ -938,7 +1015,7 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
938
1015
|
|
|
939
1016
|
# 4. Series members for bar field history
|
|
940
1017
|
for field_name in sorted(self.ctx.series_bar_fields):
|
|
941
|
-
lines.append(f" Series<double> _s_{field_name};")
|
|
1018
|
+
lines.append(f" Series<double> _s_{field_name}{_mbb};")
|
|
942
1019
|
|
|
943
1020
|
# 5. var/varip members (deduplicate by name)
|
|
944
1021
|
seen_var_members: set[str] = set()
|
|
@@ -987,7 +1064,7 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
987
1064
|
if cpp_type == "int" and self._is_int64_builtin_init(name):
|
|
988
1065
|
cpp_type = "int64_t"
|
|
989
1066
|
if name in self.ctx.series_vars:
|
|
990
|
-
lines.append(f" Series<{cpp_type}> {safe};")
|
|
1067
|
+
lines.append(f" Series<{cpp_type}> {safe}{_mbb};")
|
|
991
1068
|
else:
|
|
992
1069
|
lines.append(f" {cpp_type} {safe};")
|
|
993
1070
|
|
|
@@ -996,7 +1073,7 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
996
1073
|
if name not in self._var_names:
|
|
997
1074
|
safe = self._safe_name(name)
|
|
998
1075
|
cpp_type = self._series_type_for(name)
|
|
999
|
-
lines.append(f" Series<{cpp_type}> {safe};")
|
|
1076
|
+
lines.append(f" Series<{cpp_type}> {safe}{_mbb};")
|
|
1000
1077
|
|
|
1001
1078
|
# 7. Fixnan members
|
|
1002
1079
|
for site in self.ctx.fixnan_sites:
|
|
@@ -1009,9 +1086,9 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
1009
1086
|
# Determine type: int for count vars, double for float vars
|
|
1010
1087
|
if member in ("closedtrades", "opentrades", "wintrades", "losstrades",
|
|
1011
1088
|
"eventrades"):
|
|
1012
|
-
lines.append(f" Series<int> {svar};")
|
|
1089
|
+
lines.append(f" Series<int> {svar}{_mbb};")
|
|
1013
1090
|
else:
|
|
1014
|
-
lines.append(f" Series<double> {svar};")
|
|
1091
|
+
lines.append(f" Series<double> {svar}{_mbb};")
|
|
1015
1092
|
|
|
1016
1093
|
# 8b. Global-scope non-var declarations as class members
|
|
1017
1094
|
# (so user-defined functions can reference them)
|
|
@@ -1063,7 +1140,7 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
1063
1140
|
if self._safe_name(vname) == orig_safe:
|
|
1064
1141
|
cpp_type = PINE_TYPE_TO_CPP.get(ptype, "double")
|
|
1065
1142
|
if vname in self.ctx.series_vars:
|
|
1066
|
-
lines.append(f" Series<{cpp_type}> {cloned_safe};")
|
|
1143
|
+
lines.append(f" Series<{cpp_type}> {cloned_safe}{_mbb};")
|
|
1067
1144
|
elif vname in self._matrix_specs:
|
|
1068
1145
|
lines.append(f" {self._type_spec_to_cpp(self._matrix_specs[vname])} {cloned_safe};")
|
|
1069
1146
|
elif vname in self._array_vars:
|
|
@@ -1078,7 +1155,7 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
1078
1155
|
# Non-var series var
|
|
1079
1156
|
if orig_safe in [self._safe_name(n) for n in self.ctx.series_vars]:
|
|
1080
1157
|
cpp_type = self._series_type_for(orig_safe)
|
|
1081
|
-
lines.append(f" Series<{cpp_type}> {cloned_safe};")
|
|
1158
|
+
lines.append(f" Series<{cpp_type}> {cloned_safe}{_mbb};")
|
|
1082
1159
|
else:
|
|
1083
1160
|
lines.append(f" double {cloned_safe} = 0.0;")
|
|
1084
1161
|
|
|
@@ -444,6 +444,11 @@ class CallVisitor:
|
|
|
444
444
|
return "0"
|
|
445
445
|
if func_name in SKIP_FUNC_NAMES and namespace is None:
|
|
446
446
|
return "0"
|
|
447
|
+
# max_bars_back(var, num): a history-depth DIRECTIVE, not a value.
|
|
448
|
+
# Its effect is captured in CodeGen._compute_max_bars_back_cap (which
|
|
449
|
+
# sizes every Series<T> ring buffer), so the call itself emits nothing.
|
|
450
|
+
if func_name == "max_bars_back" and namespace is None:
|
|
451
|
+
return "0"
|
|
447
452
|
|
|
448
453
|
# request.* calls
|
|
449
454
|
if namespace == "request":
|
|
@@ -10,9 +10,14 @@ Buckets:
|
|
|
10
10
|
* HARD_REJECT_FUNC / HARD_REJECT_NAMESPACE - calls that have no PineForge
|
|
11
11
|
semantics at all (e.g. ``request.financial``, ``ticker.*``).
|
|
12
12
|
* DIVERGENT_VARS - built-in variables whose PineForge value diverges from
|
|
13
|
-
TradingView (e.g. ``bar_index`` depends on
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
TradingView. Most are reported as WARNING (e.g. ``bar_index`` depends on the
|
|
14
|
+
data window, ``timenow`` is not wall-clock) — these often appear in visual or
|
|
15
|
+
logging code that does not affect trade outcomes. A subset
|
|
16
|
+
(DIVERGENT_VARS_ERROR: ``last_bar_index`` aliased to the *current* bar index,
|
|
17
|
+
``time_close`` aliased to the bar *open* timestamp) are silent MIS-ALIASES:
|
|
18
|
+
they produce a plausible-looking but wrong value that flows straight into
|
|
19
|
+
trade logic, so a backtest would be silently wrong. Those are escalated to
|
|
20
|
+
ERROR (rejected) rather than merely warned.
|
|
16
21
|
* NOT_YET - calls the runtime could support but the transpiler does not yet
|
|
17
22
|
emit (e.g. ``max_bars_back``, bare ``barssince``).
|
|
18
23
|
* request.security - only ``symbol`` / ``timeframe`` / ``expression`` allowed,
|
|
@@ -131,16 +136,25 @@ HARD_REJECT_NAMESPACE: dict[str, str] = {
|
|
|
131
136
|
}
|
|
132
137
|
|
|
133
138
|
# Built-in variables whose PineForge value diverges from TradingView semantics.
|
|
134
|
-
#
|
|
135
|
-
# logging or visual logic that does not affect trade outcomes. The checker
|
|
136
|
-
#
|
|
139
|
+
# Most are reported as WARNING — many real strategies use bar_index / timenow in
|
|
140
|
+
# logging or visual logic that does not affect trade outcomes. The checker still
|
|
141
|
+
# flags divergence so users see the risk.
|
|
142
|
+
#
|
|
143
|
+
# DIVERGENT_VARS_ERROR is a SUBSET that is escalated to ERROR (rejected): these
|
|
144
|
+
# are silent MIS-ALIASES, not merely data-window divergences. They return a
|
|
145
|
+
# plausible value that is the WRONG quantity (last_bar_index -> current bar
|
|
146
|
+
# index; time_close -> bar OPEN timestamp) and that value flows directly into
|
|
147
|
+
# trade logic, so the backtest would be silently wrong. A WARNING is not enough.
|
|
137
148
|
DIVERGENT_VARS: dict[str, str] = {
|
|
138
149
|
"bar_index": "bar_index depends on the data window; PineForge and TradingView produce different values for the same script.",
|
|
139
|
-
"last_bar_index": "last_bar_index is
|
|
150
|
+
"last_bar_index": "last_bar_index is aliased to the CURRENT bar index in PineForge codegen (not the index of the last bar); backtest would be silently wrong — rejected.",
|
|
140
151
|
"timenow": "timenow is aliased to the current bar timestamp in PineForge; it is not real wall-clock time.",
|
|
141
|
-
"time_close": "time_close is aliased to the bar
|
|
152
|
+
"time_close": "time_close is aliased to the bar OPEN timestamp in PineForge; it does not represent the bar close time; backtest would be silently wrong — rejected.",
|
|
142
153
|
}
|
|
143
154
|
|
|
155
|
+
# Subset of DIVERGENT_VARS escalated from WARNING to ERROR (see comment above).
|
|
156
|
+
DIVERGENT_VARS_ERROR: frozenset[str] = frozenset({"last_bar_index", "time_close"})
|
|
157
|
+
|
|
144
158
|
BARSTATE_APPROX_VARS: dict[str, str] = {
|
|
145
159
|
"barstate.islast": "barstate.islast is always false in PineForge batch backtests.",
|
|
146
160
|
"barstate.ishistory": "barstate.ishistory is always true in PineForge batch backtests.",
|
|
@@ -191,8 +205,12 @@ STRATEGY_EXIT_PRICE_PARAMS: frozenset[str] = frozenset({
|
|
|
191
205
|
})
|
|
192
206
|
|
|
193
207
|
# Implementable but currently silent in codegen -> reject loudly.
|
|
208
|
+
#
|
|
209
|
+
# max_bars_back was here ("silently dropped") but is now WIRED: codegen sizes
|
|
210
|
+
# every Series<T> ring buffer to the requested depth via the engine's
|
|
211
|
+
# ``Series<T>(int max_len)`` ctor (include/pineforge/series.hpp). It is no
|
|
212
|
+
# longer rejected — see CodeGen._compute_max_bars_back_cap.
|
|
194
213
|
NOT_YET_FUNC: dict[str, str] = {
|
|
195
|
-
"max_bars_back": "max_bars_back is silently dropped by the codegen.",
|
|
196
214
|
"timeframe.from_seconds": "timeframe.from_seconds is not yet implemented; codegen would emit 'false' and silently produce wrong TF strings.",
|
|
197
215
|
}
|
|
198
216
|
|
|
@@ -386,6 +404,12 @@ class SupportChecker:
|
|
|
386
404
|
# request.security (barmerge.* gaps/lookahead values). While > 0 the
|
|
387
405
|
# UNSUPPORTED_CONST_NAMESPACES rejection is suppressed.
|
|
388
406
|
self._const_arg_ctx_depth: int = 0
|
|
407
|
+
# id()s of Identifier/MemberAccess nodes that are the *callee* of a
|
|
408
|
+
# FuncCall. A divergent built-in NAME used as a call target (e.g. the
|
|
409
|
+
# session-aware ``time_close("D")`` function, which is distinct from the
|
|
410
|
+
# bare ``time_close`` variable) must NOT be flagged as a divergent
|
|
411
|
+
# variable read. Populated as _visit_FuncCall descends into children.
|
|
412
|
+
self._callee_node_ids: set[int] = set()
|
|
389
413
|
|
|
390
414
|
# -- Public API --
|
|
391
415
|
|
|
@@ -629,6 +653,12 @@ class SupportChecker:
|
|
|
629
653
|
def _visit_FuncCall(self, node: FuncCall) -> None:
|
|
630
654
|
ns, name = _qualified_name(node.callee)
|
|
631
655
|
|
|
656
|
+
# Mark the callee so the generic child-walk does not treat a divergent
|
|
657
|
+
# built-in *function* name (e.g. ``time_close("D")``) as a divergent
|
|
658
|
+
# *variable* read. The call's own semantics are validated here.
|
|
659
|
+
if node.callee is not None:
|
|
660
|
+
self._callee_node_ids.add(id(node.callee))
|
|
661
|
+
|
|
632
662
|
if ns is None and name is None:
|
|
633
663
|
self._visit_children(node)
|
|
634
664
|
return
|
|
@@ -918,8 +948,9 @@ class SupportChecker:
|
|
|
918
948
|
"code into the strategy script).",
|
|
919
949
|
)
|
|
920
950
|
return
|
|
921
|
-
if node.name in DIVERGENT_VARS:
|
|
922
|
-
self._warn
|
|
951
|
+
if node.name in DIVERGENT_VARS and id(node) not in self._callee_node_ids:
|
|
952
|
+
emit = self._err if node.name in DIVERGENT_VARS_ERROR else self._warn
|
|
953
|
+
emit(
|
|
923
954
|
node,
|
|
924
955
|
f"{node.name} diverges from TradingView semantics in PineForge.",
|
|
925
956
|
hint=DIVERGENT_VARS[node.name],
|
|
@@ -945,8 +976,13 @@ class SupportChecker:
|
|
|
945
976
|
|
|
946
977
|
def _visit_MemberAccess(self, node: MemberAccess) -> None:
|
|
947
978
|
chain = _resolve_member_chain(node)
|
|
948
|
-
if
|
|
949
|
-
|
|
979
|
+
if (
|
|
980
|
+
chain is not None
|
|
981
|
+
and chain in DIVERGENT_VARS
|
|
982
|
+
and id(node) not in self._callee_node_ids
|
|
983
|
+
):
|
|
984
|
+
emit = self._err if chain in DIVERGENT_VARS_ERROR else self._warn
|
|
985
|
+
emit(
|
|
950
986
|
node,
|
|
951
987
|
f"{chain} diverges from TradingView semantics in PineForge.",
|
|
952
988
|
hint=DIVERGENT_VARS[chain],
|
|
@@ -1004,14 +1040,21 @@ class SupportChecker:
|
|
|
1004
1040
|
if isinstance(node.object, Identifier) and node.object.name == "syminfo":
|
|
1005
1041
|
if node.member not in SUPPORTED_SYMINFO:
|
|
1006
1042
|
self._err(node, f"syminfo.{node.member} is not implemented in PineForge runtime.")
|
|
1007
|
-
elif
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1043
|
+
elif node.member in self._SYMINFO_SILENT_GAP_FIELDS:
|
|
1044
|
+
# These fields silently return na in current PineForge. Warn on
|
|
1045
|
+
# EVERY read — not just inside an if/ternary condition — because
|
|
1046
|
+
# a field used directly in a plain expression (e.g. ``x =
|
|
1047
|
+
# syminfo.pricescale * 2``) slips out as na with no signal too.
|
|
1048
|
+
# The conditional phrasing is kept where it applies.
|
|
1049
|
+
extra = (
|
|
1050
|
+
" condition will always be false."
|
|
1051
|
+
if self._in_conditional_depth > 0
|
|
1052
|
+
else " any expression using it will be na."
|
|
1053
|
+
)
|
|
1011
1054
|
self._warn(
|
|
1012
1055
|
node,
|
|
1013
|
-
f"syminfo.{node.member} returns na in current PineForge;
|
|
1014
|
-
"
|
|
1056
|
+
f"syminfo.{node.member} returns na in current PineForge;"
|
|
1057
|
+
f"{extra} "
|
|
1015
1058
|
"Will be backfilled by pineforge-data product.",
|
|
1016
1059
|
)
|
|
1017
1060
|
self._visit_children(node)
|
|
@@ -12,6 +12,14 @@ const GLUE = `__GLUE__`;
|
|
|
12
12
|
const post = (m) => self.postMessage(m);
|
|
13
13
|
let transpileJson = null;
|
|
14
14
|
|
|
15
|
+
// Hex-encode the SHA-256 of an ArrayBuffer using the worker's WebCrypto.
|
|
16
|
+
async function sha256Hex(buf) {
|
|
17
|
+
const digest = await crypto.subtle.digest("SHA-256", buf);
|
|
18
|
+
return Array.from(new Uint8Array(digest))
|
|
19
|
+
.map((b) => b.toString(16).padStart(2, "0"))
|
|
20
|
+
.join("");
|
|
21
|
+
}
|
|
22
|
+
|
|
15
23
|
async function init() {
|
|
16
24
|
try {
|
|
17
25
|
const pyodide = await loadPyodide({ indexURL: "/pyodide/" });
|
|
@@ -21,6 +29,19 @@ async function init() {
|
|
|
21
29
|
const archiveRes = await fetch(`/pyodide/${manifest.archive}`);
|
|
22
30
|
if (!archiveRes.ok) throw new Error(`fetch /pyodide/${manifest.archive}: ${archiveRes.status}`);
|
|
23
31
|
const buf = await archiveRes.arrayBuffer();
|
|
32
|
+
// Defensive integrity check: verify the archive bytes against the manifest's
|
|
33
|
+
// sha256 BEFORE unpacking/running. Verify-if-present — older manifests that
|
|
34
|
+
// predate the sha256 field are accepted unchanged (forward/backward compat).
|
|
35
|
+
if (manifest.sha256) {
|
|
36
|
+
const actual = await sha256Hex(buf);
|
|
37
|
+
if (actual !== manifest.sha256) {
|
|
38
|
+
post({
|
|
39
|
+
type: "init-error",
|
|
40
|
+
error: `codegen archive sha256 mismatch — expected ${manifest.sha256} got ${actual}`,
|
|
41
|
+
});
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
24
45
|
pyodide.unpackArchive(buf, "gztar", { extractDir: "/codegen" });
|
|
25
46
|
pyodide.runPython(GLUE);
|
|
26
47
|
const fn = pyodide.globals.get("transpile_json");
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
//@version=6
|
|
2
|
+
strategy("T")
|
|
3
|
+
// The bare ``time_close`` variable is aliased to the bar OPEN timestamp in
|
|
4
|
+
// PineForge codegen, so a backtest comparing against it would be silently
|
|
5
|
+
// wrong -> hard reject (ERROR). (The session-aware time_close(...) FUNCTION is
|
|
6
|
+
// a separate, supported builtin and is not rejected.)
|
|
7
|
+
expired = time >= time_close
|
|
8
|
+
if expired
|
|
9
|
+
strategy.close_all()
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
//@version=6
|
|
2
|
+
// Purpose: anchor the now-WIRED max_bars_back(var, num) FUNCTION-call form in
|
|
3
|
+
// the conformance gate. The directive sizes the engine's Series<T> ring buffer
|
|
4
|
+
// (Series<T>(int max_len), include/pineforge/series.hpp) so the deep-history
|
|
5
|
+
// reference close[300] retains real data instead of slipping out as na.
|
|
6
|
+
strategy("Max Bars Back Function Call", overlay=true, max_bars_back=200)
|
|
7
|
+
|
|
8
|
+
// Function-call form: raise the per-var retention well past the default 500
|
|
9
|
+
// AND past the kwarg above, so codegen must take the MAX (1000).
|
|
10
|
+
max_bars_back(close, 1000)
|
|
11
|
+
|
|
12
|
+
deepRef = close[300]
|
|
13
|
+
sma = ta.sma(close, 50)
|
|
14
|
+
|
|
15
|
+
longCond = not na(deepRef) and close > sma and close > deepRef
|
|
16
|
+
shortCond = not na(deepRef) and close < sma and close < deepRef
|
|
17
|
+
|
|
18
|
+
if longCond
|
|
19
|
+
strategy.entry("L", strategy.long)
|
|
20
|
+
if shortCond
|
|
21
|
+
strategy.close("L")
|
|
22
|
+
|
|
23
|
+
plot(sma)
|
|
@@ -396,6 +396,46 @@ def test_intentionally_rejected_cases_raise_compile_error(body):
|
|
|
396
396
|
transpile(_pine(body))
|
|
397
397
|
|
|
398
398
|
|
|
399
|
+
# ---------------------------------------------------------------------------
|
|
400
|
+
# max_bars_back: now a SUPPORTED directive (was NOT_YET / silently dropped).
|
|
401
|
+
# The engine's Series<T>(int max_len) ring buffer (include/pineforge/series.hpp)
|
|
402
|
+
# is the wiring point: codegen sizes every Series<T> to the requested depth.
|
|
403
|
+
# ---------------------------------------------------------------------------
|
|
404
|
+
|
|
405
|
+
def test_max_bars_back_strategy_kwarg_sizes_series():
|
|
406
|
+
"""strategy(..., max_bars_back=N) sizes the Series ring buffers to N."""
|
|
407
|
+
cpp = transpile(
|
|
408
|
+
'//@version=6\nstrategy("T", max_bars_back=1234)\nx = close[400]\nplot(x)\n'
|
|
409
|
+
)
|
|
410
|
+
assert "Series<double> _s_close{1234};" in cpp, (
|
|
411
|
+
"max_bars_back kwarg must size the bar-field Series ring buffer"
|
|
412
|
+
)
|
|
413
|
+
|
|
414
|
+
|
|
415
|
+
def test_max_bars_back_function_call_sizes_series():
|
|
416
|
+
"""The bare max_bars_back(var, N) function is accepted and sizes Series."""
|
|
417
|
+
cpp = transpile(
|
|
418
|
+
'//@version=6\nstrategy("T")\nmax_bars_back(close, 2048)\nx = close[400]\nplot(x)\n'
|
|
419
|
+
)
|
|
420
|
+
assert "Series<double> _s_close{2048};" in cpp
|
|
421
|
+
|
|
422
|
+
|
|
423
|
+
def test_max_bars_back_takes_max_across_directives():
|
|
424
|
+
cpp = transpile(
|
|
425
|
+
'//@version=6\nstrategy("T", max_bars_back=300)\n'
|
|
426
|
+
'max_bars_back(close, 5000)\nx = close[400]\nplot(x)\n'
|
|
427
|
+
)
|
|
428
|
+
assert "Series<double> _s_close{5000};" in cpp
|
|
429
|
+
|
|
430
|
+
|
|
431
|
+
def test_no_max_bars_back_leaves_series_at_engine_default():
|
|
432
|
+
"""Absent the directive, Series declarations keep the bare form (engine
|
|
433
|
+
default 500) so directive-free output is byte-identical to before."""
|
|
434
|
+
cpp = transpile('//@version=6\nstrategy("T")\nx = close[10]\nplot(x)\n')
|
|
435
|
+
assert "Series<double> _s_close;" in cpp
|
|
436
|
+
assert "_s_close{" not in cpp
|
|
437
|
+
|
|
438
|
+
|
|
399
439
|
# ---------------------------------------------------------------------------
|
|
400
440
|
# Hard-reject table sanity
|
|
401
441
|
# ---------------------------------------------------------------------------
|
|
@@ -16,6 +16,7 @@ from pineforge_codegen.support_checker import (
|
|
|
16
16
|
HARD_REJECT_FUNC,
|
|
17
17
|
HARD_REJECT_NAMESPACE,
|
|
18
18
|
DIVERGENT_VARS,
|
|
19
|
+
DIVERGENT_VARS_ERROR,
|
|
19
20
|
NOT_YET_FUNC,
|
|
20
21
|
SECURITY_ALLOWED_PARAMS,
|
|
21
22
|
)
|
|
@@ -63,10 +64,13 @@ def test_indicator_decl_rejected():
|
|
|
63
64
|
|
|
64
65
|
|
|
65
66
|
# ---------------------------------------------------------------------------
|
|
66
|
-
# Divergent built-in variables —
|
|
67
|
+
# Divergent built-in variables — most WARN; the mis-alias subset ERRORs
|
|
67
68
|
# ---------------------------------------------------------------------------
|
|
68
69
|
|
|
69
|
-
|
|
70
|
+
_DIVERGENT_WARN_ONLY = sorted(set(DIVERGENT_VARS) - DIVERGENT_VARS_ERROR)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
@pytest.mark.parametrize("var_name", _DIVERGENT_WARN_ONLY)
|
|
70
74
|
def test_divergent_variables_warn(var_name: str):
|
|
71
75
|
src = PRELUDE + f"x = {var_name}\n"
|
|
72
76
|
assert _errors(src) == [], f"{var_name} should warn, not error"
|
|
@@ -75,6 +79,62 @@ def test_divergent_variables_warn(var_name: str):
|
|
|
75
79
|
f"expected divergence warning for {var_name}, got {[d.message for d in warns]}"
|
|
76
80
|
|
|
77
81
|
|
|
82
|
+
@pytest.mark.parametrize("var_name", sorted(DIVERGENT_VARS_ERROR))
|
|
83
|
+
def test_divergent_mis_alias_variables_error(var_name: str):
|
|
84
|
+
"""last_bar_index / time_close are silent mis-aliases -> ERROR (rejected)."""
|
|
85
|
+
src = PRELUDE + f"x = {var_name}\n"
|
|
86
|
+
errs = _errors(src)
|
|
87
|
+
assert errs, f"{var_name} is a silent mis-alias and must ERROR, not warn"
|
|
88
|
+
assert any("diverges" in d.message for d in errs), \
|
|
89
|
+
f"expected divergence error for {var_name}, got {[d.message for d in errs]}"
|
|
90
|
+
# and it must NOT also be a warning (single diagnostic, escalated)
|
|
91
|
+
assert not any("diverges" in d.message for d in _warnings(src)), \
|
|
92
|
+
f"{var_name} should be ERROR-only, not also WARNING"
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def test_last_bar_index_errors():
|
|
96
|
+
_expect_error(PRELUDE + "x = last_bar_index\n", "last_bar_index")
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def test_time_close_errors():
|
|
100
|
+
_expect_error(PRELUDE + "x = time_close\n", "time_close")
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def test_bar_index_still_warns():
|
|
104
|
+
src = PRELUDE + "x = bar_index\n"
|
|
105
|
+
assert _errors(src) == [], "bar_index must remain a WARNING, not ERROR"
|
|
106
|
+
assert any("diverges" in d.message for d in _warnings(src))
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def test_timenow_still_warns():
|
|
110
|
+
src = PRELUDE + "x = timenow\n"
|
|
111
|
+
assert _errors(src) == [], "timenow must remain a WARNING, not ERROR"
|
|
112
|
+
assert any("diverges" in d.message for d in _warnings(src))
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def test_divergent_error_subset_is_subset():
|
|
116
|
+
assert DIVERGENT_VARS_ERROR <= set(DIVERGENT_VARS)
|
|
117
|
+
assert "bar_index" not in DIVERGENT_VARS_ERROR
|
|
118
|
+
assert "timenow" not in DIVERGENT_VARS_ERROR
|
|
119
|
+
assert {"last_bar_index", "time_close"} == set(DIVERGENT_VARS_ERROR)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def test_time_close_function_call_not_flagged_as_divergent_var():
|
|
123
|
+
"""The session-aware ``time_close(...)`` FUNCTION is distinct from the
|
|
124
|
+
bare ``time_close`` variable and must not trip the divergent-var ERROR."""
|
|
125
|
+
src = PRELUDE + 'tc = time_close("D")\n'
|
|
126
|
+
assert _errors(src) == [], (
|
|
127
|
+
"time_close(...) is a supported function; only the bare variable "
|
|
128
|
+
"should be rejected"
|
|
129
|
+
)
|
|
130
|
+
assert not any("diverges" in d.message for d in _warnings(src))
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def test_time_close_session_function_call_not_flagged():
|
|
134
|
+
src = PRELUDE + 'int tc = time_close(timeframe.period, "0930-1600", "UTC")\n'
|
|
135
|
+
assert _errors(src) == []
|
|
136
|
+
|
|
137
|
+
|
|
78
138
|
# ---------------------------------------------------------------------------
|
|
79
139
|
# Hard-reject functions / namespaces
|
|
80
140
|
# ---------------------------------------------------------------------------
|
|
@@ -167,9 +227,15 @@ def test_str_format_time_supported():
|
|
|
167
227
|
assert _errors(src) == []
|
|
168
228
|
|
|
169
229
|
|
|
170
|
-
def
|
|
230
|
+
def test_max_bars_back_accepted():
|
|
231
|
+
"""max_bars_back is WIRED now (sizes the Series<T> ring buffer via the
|
|
232
|
+
engine's Series<T>(int max_len) ctor) — it is no longer rejected."""
|
|
171
233
|
src = PRELUDE + "max_bars_back(close, 500)\n"
|
|
172
|
-
|
|
234
|
+
assert _errors(src) == [], "max_bars_back is wired and must not be rejected"
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
def test_max_bars_back_not_in_not_yet():
|
|
238
|
+
assert "max_bars_back" not in NOT_YET_FUNC
|
|
173
239
|
|
|
174
240
|
|
|
175
241
|
def test_bare_barssince_rejected():
|
|
@@ -608,12 +674,16 @@ def test_syminfo_isin_conditional_warns():
|
|
|
608
674
|
assert any("isin" in d.message and "returns na" in d.message for d in warns)
|
|
609
675
|
|
|
610
676
|
|
|
611
|
-
def
|
|
612
|
-
"""
|
|
677
|
+
def test_syminfo_sector_non_conditional_warns():
|
|
678
|
+
"""A silent-gap field used OUTSIDE a conditional must ALSO warn now — the
|
|
679
|
+
field still slips out as na, so the read deserves the same signal as a
|
|
680
|
+
conditional use (previously it was silently dropped)."""
|
|
613
681
|
src = PRELUDE + 'x = syminfo.sector\n'
|
|
614
682
|
warns = _warnings(src)
|
|
615
|
-
assert
|
|
616
|
-
f"
|
|
683
|
+
assert any("sector" in d.message and "returns na" in d.message for d in warns), \
|
|
684
|
+
f"Expected silent-gap warning for plain syminfo.sector, got: {[d.message for d in warns]}"
|
|
685
|
+
# Stays a WARNING, never escalated to ERROR.
|
|
686
|
+
assert _errors(src) == []
|
|
617
687
|
|
|
618
688
|
|
|
619
689
|
# ---------------------------------------------------------------------------
|