pineforge-codegen 0.7.3__tar.gz → 0.7.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pineforge-codegen might be problematic. Click here for more details.
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/PKG-INFO +1 -1
- pineforge_codegen-0.7.5/VERSION +1 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/gate/glue.py +3 -3
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/__init__.py +39 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/codegen/emit_top.py +21 -11
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/codegen/input.py +142 -1
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/golden/matrix_eigen_pca.cpp +2 -2
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_codegen_new.py +34 -0
- pineforge_codegen-0.7.5/tests/test_extract_inputs.py +107 -0
- pineforge_codegen-0.7.5/tests/test_glue_smoke.py +43 -0
- pineforge_codegen-0.7.3/VERSION +0 -1
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/.github/dependabot.yml +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/.github/workflows/gate.yml +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/.github/workflows/publish-pyodide.yml +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/.github/workflows/release.yml +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/.github/workflows/test.yml +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/.gitignore +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/CLAUDE.md +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/LEGAL.md +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/LICENSE +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/PYODIDE_TARGET +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/README.md +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/docs/codegen-coverage-gaps.md +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/gate/compare.mjs +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/gate/oracle.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/gate/run-gate.mjs +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/gate/selftest.mjs +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/npm/README.md +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/npm/index.mjs +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/npm/package.json +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/package-lock.json +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/package.json +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/analyzer/__init__.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/analyzer/base.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/analyzer/call_handlers.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/analyzer/contracts.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/analyzer/diagnostics.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/analyzer/tables.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/analyzer/types.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/ast_nodes.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/codegen/__init__.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/codegen/base.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/codegen/helpers.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/codegen/helpers_syminfo.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/codegen/security.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/codegen/ta.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/codegen/tables.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/codegen/types.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/codegen/visit_call.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/codegen/visit_expr.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/codegen/visit_stmt.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/errors.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/lexer.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/parser.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/pragmas.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/signatures.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/support_checker.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/symbols.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/tokens.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/tv_input_choices.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pyproject.toml +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/scripts/build-npm-package.mjs +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/scripts/dump-tables.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/scripts/worker-template.mjs +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/__init__.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/_compile.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/chart_bg_color.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/const_ns_plot_style_free.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/const_ns_shape_free.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/divergent_last_bar_index.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/divergent_time_close.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/export_func.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/footprint_new.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/hard_reject_dividends.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/matrix_unknown_elem.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/multi_error_one_line.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/sec_tf_invalid.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/unknown_color.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/unknown_math.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/unknown_str.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/unknown_strategy_fn.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/unknown_syminfo.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/unknown_ta.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/AAPL__session-ismarket-nyse-rth-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/AAPL__time-tradingday-daily-reset-counter-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/QQQ__session-ispremarket-nasdaq-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/SPY__session-firstbar-vwap-anchor-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/SPY__session-lastbar-flatten-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/crypto-htf__mtf-htf-monthly-ema-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/crypto-leverage__leverage-margin-call-perp-5x-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/forex__symbol-fx-5dp-eurusd-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/futures__symbol-futures-pointvalue-es-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/tutorial__macd__strategy.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/tutorial__mtf__strategy_htf.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/tutorial__mtf__strategy_ltf.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/us-equity__symbol-equity-rth-gaps-aapl-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/us-equity__us-equity-exchange-tz-intraday-cap-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__analyzer-parity-choch-bos-isolator-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__analyzer-parity-edge-margin-50-pct-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__analyzer-parity-percent-of-equity-sizing-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__analyzer-parity-small-equity-fraction-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__analyzer-parity-stop-limit-timing-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__analyzer-self-test-multi-mode-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__anomaly-equity-mirror-strategy-equity-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__barstate-isconfirmed-magnifier-off-01b.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__barstate-isconfirmed-magnifier-on-01a.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__bracket-atr-trail-series-int-points-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__bracket-atr-trailing-stop-state-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__bracket-entry-exit-same-pass-attach-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__bracket-exit-stop-limit-trail-same-bar-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__bracket-exit-three-way-set-once-entry-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__bracket-exit-tp-sl-fixed-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__bracket-narrow-stop-limit-with-trail8-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__bracket-partial-exit-qty-percent-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__bracket-same-id-exit-replace-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__bracket-tp-sl-oca-reduce-isolate-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__bracket-trail-points-no-offset-explicit-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__bracket-trail-points-with-offset-only-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__bracket-trailing-activation-offset-path-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__cap-max-intraday-filled-orders-isolate-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__cap-risk-gates-allow-max-intraday-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-4emarsi-integration-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-4emarsi-quad-ema-stack-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-4emarsi-rsi-pullback-latch-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-4emarsi-session-window-nbar-exit-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-boscurv-integration-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-boscurv-linreg-slope-channel-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-boscurv-pivot-bos-trigger-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-bracket-cap-range-pending-stop-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-ies-adx-regime-classify-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-ies-bb-kc-squeeze-release-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-ies-cooldown-daily-cap-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-ies-equity-feedback-sizing-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-ies-integration-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-ies-pivot-liquidity-sweep-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-ies-pressure-gauge-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-ies-rsi-macd-momentum-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-ies-three-ema-bias-score-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-kanuck-calc-on-every-tick-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-kanuck-integration-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-kanuck-kama-state-recurrence-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-kanuck-max-bars-back-500-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-kkb-ema-atr-breakout-band-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-kkb-integration-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-kkb-kalman-filter-1d-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-kkb-margin-100-pct-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-liqsweep-integration-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-liqsweep-pivot-hh-ll-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-liqsweep-wait-one-continuation-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-liqsweep-wick-pierce-close-back-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-marketshift-integration-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-marketshift-pivot-state-machine-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-marketshift-rolling-highest-lowest-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-marketshift-state-edge-detector-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-scalping-fast-ma-cross-trigger-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-scalping-integration-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-scalping-tight-tp-sl-points-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-trendmaster-integration-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-trendmaster-line-new-projection-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-trendmaster-pivot-anchored-bracket-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-trendmaster-three-tier-ema-state-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-trendmaster-trend-momentum-structure-gate-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-vcp-cumulative-volume-delta-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-vcp-fvg-active-zones-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-vcp-integration-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-vcp-manual-adx-regime-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-vcp-pivot-strength-5-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-vcp-rsi-smooth-divergence-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-vcp-session-tz-newyork-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-vcp-vol-zscore-anomaly-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-wunderscalper-alert-templates-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-wunderscalper-explicit-reverse-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-wunderscalper-integration-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__input-source-runtime-override-high-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__input-source-subscript-hl2-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ltf-bool-array-bull-majority-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ltf-numeric-float-ratio15-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__magnifier-tick-dist-endpoints-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__magnifier-tick-dist-endpoints-rsi-cross-08a.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__magnifier-tick-dist-volume-weighted-on-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__matrix-bool-mask-explicit-utc-tz-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__matrix-bool-mask-no-transpose-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__matrix-bool-mask-transpose-roundtrip-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__matrix-bool-regime-mask-24x7-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__matrix-covariance-eigen-pca-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__matrix-eigen-rank-deficient-cov-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__max-bars-back-function-call-deep-history-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-daily-array-median-percentrank-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-daily-ema26-warmup-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-daily-prev-high-break-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-dual-tf-60-240-rising-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-htf-60-close-change-baseline-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-htf-60-close-roll-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-htf-60-gaps-on-roll-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-htf-60-rsi14-inside-security-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-htf-60-sma20-inside-security-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-htf-60-volume-spike-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-htf-confluence-manual-trail-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-htf-confluence-static-bracket-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-htf-weekly-sma-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-roll-state-60-240-d-minimal-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-triple-tf-close-confluence-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-triple-tf-macd-hist-confluence-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__na-deep-history-int-na-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__na-nz-fixnan-history-chain-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__oca-exit-bracket-internal-cancel-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__oca-multi-bracket-isolation-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__oca-raw-strategy-order-reduce-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-close-all-cancel-all-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-close-immediate-vs-next-bar-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-cross-entry-cancel-same-pass-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-cross-entry-close-same-pass-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-cross-exit-close-same-pass-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-deferred-flip-guaranteed-gap-stops-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-deferred-flip-pooc-cross-bar-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-dual-four-bar-stop-no-close-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-dual-side-same-id-stop-no-cancel-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-dual-stop-both-touch-priority-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-dual-stop-cancel-rotation-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-dual-stop-far-only-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-dual-stop-near-only-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-dual-stop-open-high-first-path-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-dual-stop-open-low-first-path-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-dual-stop-open-tie-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-dual-stop-source-order-long-first-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-dual-stop-source-order-short-first-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-entry-implicit-reversal-exit-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-flip-stop-no-paired-close-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-market-close-fill-basis-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-one-side-four-bar-far-opposite-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-opposite-entry-close-same-pass-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-percent-equity-cash-commission-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-process-on-close-false-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-process-on-close-true-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-range-expansion-pending-stop-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-same-id-entry-close-same-bar-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-same-id-market-entry-repeat-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-same-id-stop-after-flat-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-same-id-stop-cross-before-modify-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-same-id-stop-minute-zero-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-same-id-stop-modification-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-same-id-stop-raise-only-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-same-id-stop-window-four-bars-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-stale-stop-after-close-no-cancel-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-stop-cancel-no-regime-close-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-stop-entry-cancel-opposite-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-stop-entry-reversal-grouping-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-stop-entry-touch-boundary-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__pyramid-cash-fractional-commission-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__pyramid-close-id-grouping-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__pyramid-deferred-flip-close-all-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__pyramid-flip-stop-pyramiding-2-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__recompute-alma-sar-corr-magnifier-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__recompute-mtf-rsi-macd-bb-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__risk-max-contracts-held-gate-pyramid-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__session-hour-minute-pulse-filter-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__session-ny-spring-forward-dst-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__stats-eventrades-zero-pnl-count-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-accdist-ema-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-bb-kc-squeeze-breakout-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-bb-rsi-mean-reversion-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-cci-threshold-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-chandelier-exit-direction-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-closedtrades-risk-introspection-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-cmo-9-zero-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-cog-10-signal-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-dmi-adx-di-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-donchian-channel-breakout-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-dual-ma-switch-dispatch-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-dual-thrust-open-anchored-range-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-elder-ray-bull-bear-power-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-ema-ribbon-stack-transition-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-engulfing-candle-pattern-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-highestbars-lowestbars-breakout-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-hma-55-close-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-hma-fast-slow-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-inside-bar-engulfing-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-kama-style-efficiency-ratio-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-keltner-channel-break-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-linreg-stdev-channel-revert-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-macd-12-26-9-line-signal-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-macd-histogram-reversal-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-macd-line-gt-signal-continuous-state-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-map-regime-threshold-lookup-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-median-vs-ema-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-mfi-14-bands-20-80-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-momentum-roc-zero-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-multi-indicator-score-composite-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-nvi-pvi-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-obv-ema-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-percentrank-mean-reversion-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-pivot-array-unshift-pop-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-pivot-atr-stop-target-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-pivot-confirmed-break-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-pivot-point-levels-break-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-pvt-ema-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-range-filter-var-band-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-rci-14-zero-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-rsi-bb-self-bands-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-rsi-ema-signal-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-rsi-macd-and-continuous-state-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-rsi14-bands-30-70-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-rsi14-cross-50-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-rsi14-gt-50-continuous-state-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-rsi14-gt60-lt45-no-matrix-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-sar-flip-entry-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-sma-152-close-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-sma-dual-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-stdev-sma-expansion-break-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-stoch-slow-k-d-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-stochastic-rsi-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-str-match-regex-filter-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-supertrend-adx-filter-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-supertrend-direction-flip-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-triple-sma-stack-latch-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-tsi-25-13-signal-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-volume-spike-atr-breakout-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-vwma-vs-sma-divergence-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-wpr-14-bands-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__timeframe-main-period-self-adaptive-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-calls-sibling-cumulative-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-default-param-kwargs-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-drives-strategy-entry-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-extra-primitive-args-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-feeds-strategy-exit-prices-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-in-for-loop-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-in-if-else-branch-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-in-switch-arms-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-in-while-loop-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-mutating-self-ref-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-on-array-element-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-reads-strategy-state-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-receives-ta-series-param-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-scalar-return-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-tuple-return-destructure-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-udt-return-from-func-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-uses-history-globals-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-uses-math-funcs-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-uses-na-nz-fixnan-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-var-instance-streak-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-windowed-method-chain-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-regime-stack-stress-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__vwap-bands-breakout-1sigma-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__vwap-bands-mean-reversion-2sigma-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_analyzer.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_analyzer_matrix_inference.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_analyzer_ta_return_types.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_codegen_audit_fixes.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_codegen_determinism.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_codegen_fallthrough_guards.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_codegen_golden.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_codegen_input_getters.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_codegen_matrix_typed.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_compile_corpus.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_compile_smoke.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_errors.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_import_all.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_input_time_int64.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_int64_time_storage.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_lexer.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_official_surface.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_parser.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_security_tf_literal.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_signatures.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_support_checker.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_support_checker_chart_visible_bar_time.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_support_checker_color_cast.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_support_checker_const_namespaces.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_support_checker_dividends_earnings.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_support_checker_footprint.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_support_checker_input_color.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_support_checker_input_source.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_support_checker_matrix.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_support_checker_security_adjustment.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_support_checker_syminfo_gap_fields.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_support_checker_timeframe_from_seconds.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_support_checker_varip.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_support_checker_volume_row.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_symbols.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_ta_official_surface.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_transpile_division.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_transpile_enum_order.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_transpile_pf_trace.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_transpile_tr_handle_na.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_transpiler_matrix_kwargs.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_typespec_matrix.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_udt_drawing_field_cleanup.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_unsupported_reporting.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_vwap_tuple_unpack.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pineforge-codegen
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.5
|
|
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.5
|
|
@@ -9,13 +9,13 @@ import sys
|
|
|
9
9
|
if "/codegen" not in sys.path:
|
|
10
10
|
sys.path.insert(0, "/codegen")
|
|
11
11
|
|
|
12
|
-
from pineforge_codegen import
|
|
12
|
+
from pineforge_codegen import transpile_full
|
|
13
13
|
from pineforge_codegen.errors import CompileError
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
def transpile_json(source: str) -> str:
|
|
17
17
|
try:
|
|
18
|
-
|
|
18
|
+
full = transpile_full(source)
|
|
19
19
|
except CompileError as e:
|
|
20
20
|
diags = []
|
|
21
21
|
for d in e.diagnostics:
|
|
@@ -32,4 +32,4 @@ def transpile_json(source: str) -> str:
|
|
|
32
32
|
entry["endCol"] = end_col
|
|
33
33
|
diags.append(entry)
|
|
34
34
|
return json.dumps({"ok": False, "error": str(e), "diagnostics": diags})
|
|
35
|
-
return json.dumps({"ok": True, "cpp": cpp})
|
|
35
|
+
return json.dumps({"ok": True, "cpp": full["cpp"], "inputs": full["inputs"], "strategyParams": full["strategyParams"]})
|
|
@@ -51,3 +51,42 @@ def transpile(pine_source: str, *, check_support: bool = True, filename: str = "
|
|
|
51
51
|
# ``if (trace_enabled_) { trace(...); ... }`` block.
|
|
52
52
|
ctx.pf_trace_pragmas = pragmas
|
|
53
53
|
return CodeGen(ctx).generate()
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def transpile_full(pine_source: str, *, check_support: bool = True,
|
|
57
|
+
filename: str = "<input>") -> dict:
|
|
58
|
+
"""Transpile like :func:`transpile`, plus the host-UI input manifest.
|
|
59
|
+
|
|
60
|
+
Runs ONE pipeline pass (Lexer -> Parser -> support check -> Analyzer ->
|
|
61
|
+
CodeGen.generate) and returns the generated C++ alongside the data the
|
|
62
|
+
cloud Studio needs to auto-build a backtest "override params" form:
|
|
63
|
+
|
|
64
|
+
- ``cpp``: the generated C++ source (identical to :func:`transpile`).
|
|
65
|
+
- ``inputs``: a list of ``InputDef`` dicts (one per top-level
|
|
66
|
+
``var = input.*(...)`` declaration). Each has ``title`` / ``type`` /
|
|
67
|
+
``default`` and optionally ``min`` / ``max`` / ``step`` / ``options``
|
|
68
|
+
(omitted when the corresponding signature argument is absent or
|
|
69
|
+
references a non-const value). See
|
|
70
|
+
:meth:`CodeGen.extract_input_manifest`.
|
|
71
|
+
- ``strategyParams``: the literal ``strategy(...)`` kwargs the analyzer
|
|
72
|
+
surfaced (e.g. ``initial_capital``, ``pyramiding``).
|
|
73
|
+
|
|
74
|
+
Args mirror :func:`transpile`.
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
``{"cpp": str, "inputs": list[dict], "strategyParams": dict}``.
|
|
78
|
+
"""
|
|
79
|
+
pragmas = extract_pf_trace_pragmas(pine_source)
|
|
80
|
+
tokens = Lexer(pine_source, filename=filename).tokenize()
|
|
81
|
+
ast = Parser(tokens, source=pine_source, filename=filename).parse()
|
|
82
|
+
if check_support:
|
|
83
|
+
check_support_or_raise(ast, filename=filename)
|
|
84
|
+
ctx = Analyzer(ast, filename=filename).analyze()
|
|
85
|
+
ctx.pf_trace_pragmas = pragmas
|
|
86
|
+
gen = CodeGen(ctx)
|
|
87
|
+
cpp = gen.generate()
|
|
88
|
+
return {
|
|
89
|
+
"cpp": cpp,
|
|
90
|
+
"inputs": gen.extract_input_manifest(),
|
|
91
|
+
"strategyParams": dict(ctx.strategy_params),
|
|
92
|
+
}
|
|
@@ -611,17 +611,27 @@ class TopLevelEmitter:
|
|
|
611
611
|
lines.append(" static_cast<MagnifierDistribution>(magnifier_dist));")
|
|
612
612
|
else:
|
|
613
613
|
# The magnifier-aware run() overload handles ratio=1 (no
|
|
614
|
-
# aggregation)
|
|
615
|
-
#
|
|
616
|
-
#
|
|
617
|
-
#
|
|
618
|
-
#
|
|
619
|
-
#
|
|
620
|
-
#
|
|
621
|
-
#
|
|
622
|
-
#
|
|
614
|
+
# aggregation), empty itf (auto-detect from bar timestamps),
|
|
615
|
+
# and empty stf (default-to-input) entirely on its own, so we
|
|
616
|
+
# route through it whenever ANY TF/magnifier knob is set. We
|
|
617
|
+
# only fall back to the simple ``run(bars, n)`` path when the
|
|
618
|
+
# caller passed NO magnifier AND NO timeframe at all.
|
|
619
|
+
#
|
|
620
|
+
# The previous guard ``(!itf.empty() && !stf.empty() && itf != stf)``
|
|
621
|
+
# required BOTH timeframes to be present before aggregating.
|
|
622
|
+
# The cloud caller passes ``input_tf=""`` (auto-detect) with a
|
|
623
|
+
# concrete ``script_tf="240"``; that made the guard false and
|
|
624
|
+
# the chosen ``script_tf`` was silently ignored — the strategy
|
|
625
|
+
# ran on raw 1m bars with no aggregation. It also dropped the
|
|
626
|
+
# bar_magnifier flag whenever the host passed empty TFs,
|
|
627
|
+
# producing 0.21% exit-price drift on the magnifier probes.
|
|
628
|
+
#
|
|
629
|
+
# Over-approximating to ``!itf.empty() || !stf.empty()`` is
|
|
630
|
+
# always correct: the TF-aware overload is a no-op when the
|
|
631
|
+
# ratio resolves to 1, so the only thing lost in that case is
|
|
632
|
+
# the precalc optimization — never correctness.
|
|
623
633
|
lines.append(" bool needs_full_run = (bar_magnifier != 0)")
|
|
624
|
-
lines.append(" ||
|
|
634
|
+
lines.append(" || !itf.empty() || !stf.empty();")
|
|
625
635
|
lines.append(" if (!needs_full_run) {")
|
|
626
636
|
lines.append(" strat->run(bars, n);")
|
|
627
637
|
lines.append(" } else {")
|
|
@@ -865,7 +875,7 @@ class TopLevelEmitter:
|
|
|
865
875
|
lines.append(" bool bar_magnifier = false,")
|
|
866
876
|
lines.append(" int magnifier_samples = 4,")
|
|
867
877
|
lines.append(" MagnifierDistribution magnifier_dist = MagnifierDistribution::ENDPOINTS) {")
|
|
868
|
-
lines.append(" bool needs_dynamic = bar_magnifier ||
|
|
878
|
+
lines.append(" bool needs_dynamic = bar_magnifier || !input_tf.empty() || !script_tf.empty();")
|
|
869
879
|
lines.append(" if (needs_dynamic) {")
|
|
870
880
|
lines.append(" _use_precalc = false;")
|
|
871
881
|
lines.append(" } else {")
|
|
@@ -15,13 +15,32 @@ Mixin contract — host class must provide:
|
|
|
15
15
|
|
|
16
16
|
from __future__ import annotations
|
|
17
17
|
|
|
18
|
-
from ..ast_nodes import
|
|
18
|
+
from ..ast_nodes import (
|
|
19
|
+
BoolLiteral,
|
|
20
|
+
FuncCall,
|
|
21
|
+
Identifier,
|
|
22
|
+
MemberAccess,
|
|
23
|
+
NumberLiteral,
|
|
24
|
+
StringLiteral,
|
|
25
|
+
VarDecl,
|
|
26
|
+
)
|
|
19
27
|
from .. import signatures as sigs
|
|
20
28
|
|
|
21
29
|
|
|
22
30
|
class InputHelper:
|
|
23
31
|
"""``input.*`` call analysis helpers — defaults, titles, getter dispatch, enum guard."""
|
|
24
32
|
|
|
33
|
+
# Maps the input function short-name -> the form-facing type tag emitted in
|
|
34
|
+
# the input manifest (consumed by the host UI's override form). ``price``
|
|
35
|
+
# is a float slider, ``time`` an int timestamp; everything string-like
|
|
36
|
+
# collapses to "string".
|
|
37
|
+
_FORM_TYPE = {
|
|
38
|
+
"int": "int", "float": "float", "bool": "bool", "string": "string",
|
|
39
|
+
"source": "source", "enum": "enum", "price": "float", "time": "int",
|
|
40
|
+
"color": "string", "timeframe": "string", "session": "string",
|
|
41
|
+
"symbol": "string", "text_area": "string",
|
|
42
|
+
}
|
|
43
|
+
|
|
25
44
|
def _is_input_call(self, node: FuncCall) -> bool:
|
|
26
45
|
"""True if ``node`` is an ``input(...)`` or ``input.<type>(...)`` call."""
|
|
27
46
|
func_name, namespace = self._resolve_callee(node.callee)
|
|
@@ -187,3 +206,125 @@ class InputHelper:
|
|
|
187
206
|
f"{ename}.{dv.member} is not a member of enum {ename} "
|
|
188
207
|
"(internal: Analyzer should reject this first)"
|
|
189
208
|
)
|
|
209
|
+
|
|
210
|
+
# ------------------------------------------------------------------
|
|
211
|
+
# Input manifest extraction (host UI override-form source of truth)
|
|
212
|
+
# ------------------------------------------------------------------
|
|
213
|
+
|
|
214
|
+
def _literal_or_none(self, node):
|
|
215
|
+
"""Return a JSON scalar for a *const* literal AST node, else None.
|
|
216
|
+
|
|
217
|
+
``None`` signals non-const (an identifier, computed expression, …) so
|
|
218
|
+
callers can omit a bound/option that references a runtime value.
|
|
219
|
+
Enum member refs (``Dir.Up``) collapse to the ``"Dir.Up"`` string tag.
|
|
220
|
+
"""
|
|
221
|
+
if isinstance(node, StringLiteral):
|
|
222
|
+
return node.value
|
|
223
|
+
# BoolLiteral must be checked before NumberLiteral: a Pine ``true`` is a
|
|
224
|
+
# BoolLiteral (not a NumberLiteral), but guarding the order keeps intent
|
|
225
|
+
# explicit and future-proof against bool/int node overlap.
|
|
226
|
+
if isinstance(node, BoolLiteral):
|
|
227
|
+
return node.value
|
|
228
|
+
if isinstance(node, NumberLiteral):
|
|
229
|
+
return node.value
|
|
230
|
+
# enum member ref like ``Dir.Up`` -> "Dir.Up" (string tag)
|
|
231
|
+
if isinstance(node, MemberAccess) and isinstance(node.object, Identifier):
|
|
232
|
+
return f"{node.object.name}.{node.member}"
|
|
233
|
+
return None
|
|
234
|
+
|
|
235
|
+
def _merged_args(self, node: FuncCall, func_name, namespace):
|
|
236
|
+
"""Merge positional args + kwargs into signature-positional order.
|
|
237
|
+
|
|
238
|
+
Returns ``(param_names | None, merged_list)``. Mirrors the merge logic
|
|
239
|
+
in :meth:`_get_input_title` / :meth:`_get_input_default` so manifest
|
|
240
|
+
extraction reads bounds/options off the same positions codegen does.
|
|
241
|
+
"""
|
|
242
|
+
if namespace == "input" and func_name in sigs.INPUT_FUNCTIONS:
|
|
243
|
+
names = sigs.get_param_names("input", func_name)
|
|
244
|
+
elif func_name == "input" and namespace is None:
|
|
245
|
+
names = sigs.get_param_names(None, "input")
|
|
246
|
+
else:
|
|
247
|
+
names = None
|
|
248
|
+
merged = list(node.args)
|
|
249
|
+
if names:
|
|
250
|
+
for i, pname in enumerate(names):
|
|
251
|
+
if pname in node.kwargs:
|
|
252
|
+
while len(merged) <= i:
|
|
253
|
+
merged.append(None)
|
|
254
|
+
if merged[i] is None:
|
|
255
|
+
merged[i] = node.kwargs[pname]
|
|
256
|
+
return names, merged
|
|
257
|
+
|
|
258
|
+
def extract_input_manifest(self) -> list[dict]:
|
|
259
|
+
"""Walk top-level ``var = input.*(...)`` decls into an InputDef list.
|
|
260
|
+
|
|
261
|
+
Each entry: ``{title, type, default[, min, max, step, options]}``. The
|
|
262
|
+
optional keys are emitted only when the corresponding signature
|
|
263
|
+
argument is a const literal; a bound/option referencing a non-literal
|
|
264
|
+
is omitted (never crashes). One pass over ``self.ctx.ast.body``.
|
|
265
|
+
"""
|
|
266
|
+
out: list[dict] = []
|
|
267
|
+
for stmt in self.ctx.ast.body:
|
|
268
|
+
if not (
|
|
269
|
+
isinstance(stmt, VarDecl)
|
|
270
|
+
and isinstance(stmt.value, FuncCall)
|
|
271
|
+
and self._is_input_call(stmt.value)
|
|
272
|
+
):
|
|
273
|
+
continue
|
|
274
|
+
node = stmt.value
|
|
275
|
+
func_name, namespace = self._resolve_callee(node.callee)
|
|
276
|
+
names, merged = self._merged_args(node, func_name, namespace)
|
|
277
|
+
title = self._get_input_title(node, var_name=stmt.name)
|
|
278
|
+
default_node = self._get_input_default(node)
|
|
279
|
+
default_val = (
|
|
280
|
+
self._literal_or_none(default_node)
|
|
281
|
+
if default_node is not None
|
|
282
|
+
else None
|
|
283
|
+
)
|
|
284
|
+
if namespace == "input":
|
|
285
|
+
form_type = self._FORM_TYPE.get(func_name, "string")
|
|
286
|
+
else:
|
|
287
|
+
# Plain ``input(...)``: Pine types the result by its defval.
|
|
288
|
+
# The codegen already emits the matching scalar getter, so the
|
|
289
|
+
# manifest must mirror that — infer from the resolved default's
|
|
290
|
+
# Python type. ``bool`` MUST be tested before ``int`` because
|
|
291
|
+
# ``isinstance(True, int)`` is True. A None/non-literal default
|
|
292
|
+
# falls back to "string".
|
|
293
|
+
if isinstance(default_val, bool):
|
|
294
|
+
form_type = "bool"
|
|
295
|
+
elif isinstance(default_val, int):
|
|
296
|
+
form_type = "int"
|
|
297
|
+
elif isinstance(default_val, float):
|
|
298
|
+
form_type = "float"
|
|
299
|
+
elif isinstance(default_val, str):
|
|
300
|
+
form_type = "string"
|
|
301
|
+
else:
|
|
302
|
+
form_type = "string"
|
|
303
|
+
entry: dict = {
|
|
304
|
+
"title": title,
|
|
305
|
+
"type": form_type,
|
|
306
|
+
"default": default_val,
|
|
307
|
+
}
|
|
308
|
+
# Pull min/max/step/options by signature param name; emit only
|
|
309
|
+
# const literals so the override form never references a runtime
|
|
310
|
+
# value it can't reproduce.
|
|
311
|
+
if names:
|
|
312
|
+
idx = {n: i for i, n in enumerate(names)}
|
|
313
|
+
for key, pname in (("min", "minval"), ("max", "maxval"), ("step", "step")):
|
|
314
|
+
i = idx.get(pname)
|
|
315
|
+
if i is not None and i < len(merged) and merged[i] is not None:
|
|
316
|
+
v = self._literal_or_none(merged[i])
|
|
317
|
+
# bool is an int subclass — exclude it from numeric bounds
|
|
318
|
+
if isinstance(v, (int, float)) and not isinstance(v, bool):
|
|
319
|
+
entry[key] = v
|
|
320
|
+
oi = idx.get("options")
|
|
321
|
+
if oi is not None and oi < len(merged) and merged[oi] is not None:
|
|
322
|
+
opts_node = merged[oi]
|
|
323
|
+
elems = getattr(opts_node, "elements", None)
|
|
324
|
+
if elems is not None:
|
|
325
|
+
vals = [self._literal_or_none(e) for e in elems]
|
|
326
|
+
# any non-const element -> omit the whole options list
|
|
327
|
+
if vals and all(isinstance(v, str) for v in vals):
|
|
328
|
+
entry["options"] = vals
|
|
329
|
+
out.append(entry)
|
|
330
|
+
return out
|
|
@@ -233,7 +233,7 @@ public:
|
|
|
233
233
|
bool bar_magnifier = false,
|
|
234
234
|
int magnifier_samples = 4,
|
|
235
235
|
MagnifierDistribution magnifier_dist = MagnifierDistribution::ENDPOINTS) {
|
|
236
|
-
bool needs_dynamic = bar_magnifier ||
|
|
236
|
+
bool needs_dynamic = bar_magnifier || !input_tf.empty() || !script_tf.empty();
|
|
237
237
|
if (needs_dynamic) {
|
|
238
238
|
_use_precalc = false;
|
|
239
239
|
} else {
|
|
@@ -262,7 +262,7 @@ extern "C" {
|
|
|
262
262
|
std::string itf = input_tf ? input_tf : "";
|
|
263
263
|
std::string stf = script_tf ? script_tf : "";
|
|
264
264
|
bool needs_full_run = (bar_magnifier != 0)
|
|
265
|
-
||
|
|
265
|
+
|| !itf.empty() || !stf.empty();
|
|
266
266
|
if (!needs_full_run) {
|
|
267
267
|
strat->run(bars, n);
|
|
268
268
|
} else {
|
|
@@ -43,6 +43,40 @@ strategy("Test")
|
|
|
43
43
|
assert "run_backtest" in cpp # backward compat
|
|
44
44
|
|
|
45
45
|
|
|
46
|
+
def test_run_backtest_full_routes_to_tf_aware_run_when_only_script_tf_set():
|
|
47
|
+
"""Regression: a chosen script_tf must not be silently ignored.
|
|
48
|
+
|
|
49
|
+
The cloud caller passes ``input_tf=""`` (auto-detect) with a concrete
|
|
50
|
+
``script_tf`` (e.g. "240"). The old ``run_backtest_full`` guard required
|
|
51
|
+
BOTH timeframes present (``!itf.empty() && !stf.empty() && itf != stf``),
|
|
52
|
+
so an empty input_tf made ``needs_full_run`` false and the strategy ran
|
|
53
|
+
on raw 1m bars — the chosen script_tf was dropped and no aggregation
|
|
54
|
+
happened. The fix over-approximates: route through the TF-aware overload
|
|
55
|
+
whenever ANY TF/magnifier knob is set.
|
|
56
|
+
|
|
57
|
+
This pins the emitted guard so the regression cannot silently return.
|
|
58
|
+
``run_backtest_full`` is emitted for every strategy (no security calls
|
|
59
|
+
needed), so a bare strategy exercises the shim guard. The precalc-gating
|
|
60
|
+
``run(...)`` overload is only emitted when there is a static TA call
|
|
61
|
+
site (``ta.sma`` here), so the body uses one to cover both guards.
|
|
62
|
+
"""
|
|
63
|
+
cpp = _generate('//@version=6\nstrategy("T")\nx = ta.sma(close, 14)\nplot(x)\n')
|
|
64
|
+
|
|
65
|
+
# The C ABI shim guard must fire on a non-empty script_tf alone.
|
|
66
|
+
assert "bool needs_full_run = (bar_magnifier != 0)" in cpp
|
|
67
|
+
assert "|| !itf.empty() || !stf.empty();" in cpp
|
|
68
|
+
# The old AND-of-both-TFs guard must be gone.
|
|
69
|
+
assert "!itf.empty() && !stf.empty() && itf != stf" not in cpp
|
|
70
|
+
|
|
71
|
+
# The run(...) overload that gates precalc must also route dynamically
|
|
72
|
+
# whenever either TF is set (not only when both differ).
|
|
73
|
+
assert (
|
|
74
|
+
"bool needs_dynamic = bar_magnifier || !input_tf.empty() || !script_tf.empty();"
|
|
75
|
+
in cpp
|
|
76
|
+
)
|
|
77
|
+
assert "!input_tf.empty() && !script_tf.empty() && input_tf != script_tf" not in cpp
|
|
78
|
+
|
|
79
|
+
|
|
46
80
|
# === Task 9: Basic structure and translations ===
|
|
47
81
|
|
|
48
82
|
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
from pineforge_codegen import transpile_full
|
|
2
|
+
|
|
3
|
+
PREAMBLE = "//@version=6\nstrategy(\"T\")\n"
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def _full(body: str):
|
|
7
|
+
return transpile_full(PREAMBLE + body)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def test_int_input_manifest():
|
|
11
|
+
r = _full("length = input.int(14, \"Length\", minval=2, maxval=200, step=2)\n")
|
|
12
|
+
inp = next(i for i in r["inputs"] if i["title"] == "Length")
|
|
13
|
+
assert inp["type"] == "int"
|
|
14
|
+
assert inp["default"] == 14
|
|
15
|
+
assert inp["min"] == 2
|
|
16
|
+
assert inp["max"] == 200
|
|
17
|
+
assert inp["step"] == 2
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def test_float_omits_absent_bounds():
|
|
21
|
+
r = _full("mult = input.float(2.0, \"Mult\")\n")
|
|
22
|
+
inp = next(i for i in r["inputs"] if i["title"] == "Mult")
|
|
23
|
+
assert inp["type"] == "float"
|
|
24
|
+
assert inp["default"] == 2.0
|
|
25
|
+
assert "min" not in inp and "max" not in inp
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def test_bool_and_title_fallback_to_var_name():
|
|
29
|
+
r = _full("use_x = input.bool(true)\n")
|
|
30
|
+
inp = next(i for i in r["inputs"] if i["title"] == "use_x")
|
|
31
|
+
assert inp["type"] == "bool"
|
|
32
|
+
assert inp["default"] is True
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def test_string_options():
|
|
36
|
+
r = _full("mode = input.string(\"a\", \"Mode\", options=[\"a\", \"b\", \"c\"])\n")
|
|
37
|
+
inp = next(i for i in r["inputs"] if i["title"] == "Mode")
|
|
38
|
+
assert inp["type"] == "string"
|
|
39
|
+
assert inp["options"] == ["a", "b", "c"]
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def test_non_const_options_omitted():
|
|
43
|
+
# options referencing a non-literal must be omitted, not crash
|
|
44
|
+
r = _full("v = \"x\"\nmode = input.string(\"a\", \"Mode\", options=[v, \"b\"])\n")
|
|
45
|
+
inp = next(i for i in r["inputs"] if i["title"] == "Mode")
|
|
46
|
+
assert "options" not in inp
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def test_source_type():
|
|
50
|
+
r = _full("src = input.source(close, \"Source\")\n")
|
|
51
|
+
inp = next(i for i in r["inputs"] if i["title"] == "Source")
|
|
52
|
+
assert inp["type"] == "source"
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def test_plain_input_int_form_type():
|
|
56
|
+
r = _full("len = input(10, \"Xi\")\n")
|
|
57
|
+
inp = next(i for i in r["inputs"] if i["title"] == "Xi")
|
|
58
|
+
assert inp["type"] == "int"
|
|
59
|
+
assert inp["default"] == 10
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def test_plain_input_float_form_type():
|
|
63
|
+
r = _full("f = input(1.5, \"Xf\")\n")
|
|
64
|
+
inp = next(i for i in r["inputs"] if i["title"] == "Xf")
|
|
65
|
+
assert inp["type"] == "float"
|
|
66
|
+
assert inp["default"] == 1.5
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def test_plain_input_bool_form_type():
|
|
70
|
+
r = _full("b = input(true, \"Xb\")\n")
|
|
71
|
+
inp = next(i for i in r["inputs"] if i["title"] == "Xb")
|
|
72
|
+
assert inp["type"] == "bool"
|
|
73
|
+
assert inp["default"] is True
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def test_plain_input_string_form_type():
|
|
77
|
+
r = _full("s = input(\"a\", \"Xs\")\n")
|
|
78
|
+
inp = next(i for i in r["inputs"] if i["title"] == "Xs")
|
|
79
|
+
assert inp["type"] == "string"
|
|
80
|
+
assert inp["default"] == "a"
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def test_non_const_minval_bound_omitted():
|
|
84
|
+
# minval bound referencing a prior const-assigned identifier is non-literal
|
|
85
|
+
# at the call site -> "min" omitted, no crash, other facets unaffected.
|
|
86
|
+
r = _full("somevar = 2\nlen = input.int(14, \"Len\", minval=somevar, maxval=200, step=2)\n")
|
|
87
|
+
inp = next(i for i in r["inputs"] if i["title"] == "Len")
|
|
88
|
+
assert inp["default"] == 14
|
|
89
|
+
assert "min" not in inp
|
|
90
|
+
assert inp["max"] == 200
|
|
91
|
+
assert inp["step"] == 2
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def test_zero_inputs():
|
|
95
|
+
r = _full("a = close + 1\n")
|
|
96
|
+
assert r["inputs"] == []
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def test_strategy_params_surfaced():
|
|
100
|
+
r = transpile_full("//@version=6\nstrategy(\"T\", initial_capital=5000, pyramiding=2)\na = close\n")
|
|
101
|
+
assert r["strategyParams"]["initial_capital"] == 5000
|
|
102
|
+
assert r["strategyParams"]["pyramiding"] == 2
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def test_cpp_still_returned():
|
|
106
|
+
r = _full("length = input.int(14, \"Length\")\n")
|
|
107
|
+
assert 'get_input_int("Length", 14)' in r["cpp"]
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""Glue contract smoke test for gate/glue.py.
|
|
2
|
+
|
|
3
|
+
Loads gate/glue.py directly (it carries a `sys.path.insert(0, "/codegen")`
|
|
4
|
+
preamble; `pineforge_codegen` still resolves because the repo root is on
|
|
5
|
+
sys.path when pytest runs from there) and asserts the transpile_json envelope:
|
|
6
|
+
|
|
7
|
+
- valid source -> ok:true with inputs[] and strategyParams (the new manifest)
|
|
8
|
+
- invalid source -> ok:false with a diagnostics key (error branch untouched)
|
|
9
|
+
"""
|
|
10
|
+
import importlib.util
|
|
11
|
+
import json
|
|
12
|
+
import os
|
|
13
|
+
|
|
14
|
+
_REPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
15
|
+
_GLUE_PATH = os.path.join(_REPO_ROOT, "gate", "glue.py")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _load_glue():
|
|
19
|
+
spec = importlib.util.spec_from_file_location("pineforge_glue_under_test", _GLUE_PATH)
|
|
20
|
+
module = importlib.util.module_from_spec(spec)
|
|
21
|
+
spec.loader.exec_module(module)
|
|
22
|
+
return module
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def test_valid_source_emits_manifest():
|
|
26
|
+
glue = _load_glue()
|
|
27
|
+
src = (
|
|
28
|
+
"//@version=6\n"
|
|
29
|
+
'strategy("T", initial_capital=5000)\n'
|
|
30
|
+
'length = input.int(14, "Length")\n'
|
|
31
|
+
"plot(close)\n"
|
|
32
|
+
)
|
|
33
|
+
d = json.loads(glue.transpile_json(src))
|
|
34
|
+
assert d["ok"] is True
|
|
35
|
+
assert any(i["title"] == "Length" for i in d["inputs"])
|
|
36
|
+
assert d["strategyParams"]["initial_capital"] == 5000
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def test_invalid_source_still_returns_error_envelope():
|
|
40
|
+
glue = _load_glue()
|
|
41
|
+
d = json.loads(glue.transpile_json("strategy("))
|
|
42
|
+
assert d["ok"] is False
|
|
43
|
+
assert "diagnostics" in d
|
pineforge_codegen-0.7.3/VERSION
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
0.7.3
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/analyzer/call_handlers.py
RENAMED
|
File without changes
|
|
File without changes
|
{pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/analyzer/diagnostics.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/codegen/helpers_syminfo.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|