screamer 2.2.0__tar.gz → 2.3.0__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.
- {screamer-2.2.0 → screamer-2.3.0}/CMakeLists.txt +1 -1
- {screamer-2.2.0 → screamer-2.3.0}/PKG-INFO +1 -1
- {screamer-2.2.0 → screamer-2.3.0}/js/README.md +24 -1
- screamer-2.3.0/js/docs-guide/environments.md +80 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/docs-guide/getting-started.md +4 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/docs-guide/index.md +2 -1
- screamer-2.3.0/js/docs-guide/live-demo.md +59 -0
- screamer-2.3.0/js/examples/live-trades.html +441 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/package-lock.json +1 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/package.json +3 -1
- {screamer-2.2.0 → screamer-2.3.0}/js/src/codes.ts +3 -1
- {screamer-2.2.0 → screamer-2.3.0}/js/typedoc.json +3 -0
- {screamer-2.2.0 → screamer-2.3.0}/pyproject.toml +3 -3
- {screamer-2.2.0 → screamer-2.3.0}/screamer/__init__.py +1 -1
- {screamer-2.2.0 → screamer-2.3.0}/wasm/CMakeLists.txt +1 -1
- {screamer-2.2.0 → screamer-2.3.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/.github/workflows/build-wheels.yml +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/.github/workflows/docs.yml +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/.github/workflows/js-docs.yml +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/.github/workflows/js-publish.yml +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/.github/workflows/tests.yml +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/.gitignore +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/.readthedocs.yaml +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/AUTHORS.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/CHANGELOG.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/CODE_OF_CONDUCT.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/CONTRIBUTING.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/LICENSE +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/Makefile +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/README.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/SECURITY.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/benchmarks/__init__.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/benchmarks/_compare/COMPARISON.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/benchmarks/_compare/comparison.png +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/benchmarks/build_compiled.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/benchmarks/make_comparison_tables.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/benchmarks/make_plots.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/benchmarks/make_rank_plot.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/benchmarks/make_speed_chart.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/benchmarks/reference_impls.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/benchmarks/run_benchmarks.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/benchmarks/run_streaming_benchmarks.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/benchmarks/streaming_compiled.pyx +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/benchmarks/streaming_impls.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/bindings/bindings.cpp +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/bindings/bindings_core.cpp +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/bindings/bindings_dag.cpp +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/bindings/bindings_ew.cpp +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/bindings/bindings_expanding.cpp +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/bindings/bindings_fin.cpp +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/bindings/bindings_math.cpp +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/bindings/bindings_micro.cpp +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/bindings/bindings_misc.cpp +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/bindings/bindings_preprocessing.cpp +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/bindings/bindings_rolling.cpp +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/bindings/bindings_signal.cpp +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/bindings/bindings_streams.cpp +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/__init__.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/AD.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/ADOSC.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/ADX.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/ADXR.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/ATR.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Abs.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Acos.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Add.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/And.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Asin.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Atan.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Atan2.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/BOP.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Butter.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/ButterBandpass.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/ButterBandstop.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/ButterHighpass.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/CCI.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Cart2Polar.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Ceil.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Clip.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Cos.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Cube.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/CumMax.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/CumMin.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/CumProd.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/CumSum.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/DEMA.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/DX.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Decycler.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Detrend.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Diff.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Diff2.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Div.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Drawdown.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Elu.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Equal.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Erf.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Erfc.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/EwBeta.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/EwCorr.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/EwCov.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/EwGarmanKlassVar.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/EwKurt.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/EwMean.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/EwParkinsonVar.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/EwRms.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/EwRogersSatchellVar.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/EwSkew.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/EwStd.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/EwVar.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/EwZscore.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Exp.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/ExpandingKurt.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/ExpandingMax.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/ExpandingMean.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/ExpandingMin.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/ExpandingProd.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/ExpandingSkew.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/ExpandingSlope.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/ExpandingStd.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/ExpandingSum.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/ExpandingVar.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Ffill.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/FillNa.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/First.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Floor.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/FracDiff.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/GreaterEqual.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/GreaterThan.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/HawkesIntensity.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Hold.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/HullMA.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Hypot.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Identity.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/IsFinite.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/IsNan.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/KAMA.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/KalmanFilter.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Lag.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Last.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/LessEqual.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/LessThan.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Linear.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Linear2.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Log.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/LogReturn.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/MACD.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/MAMA.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/MFI.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/MaxDrawdown.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/MinusDI.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/MinusDM.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Momentum.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/MovingAverage.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Mul.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/NATR.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/NegPart.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Not.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/NotEqual.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/OBV.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Or.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/PlusDI.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/PlusDM.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Polar2Cart.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/PosPart.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Power.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/ROC.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/ROCP.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/ROCR.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Relu.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Return.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingArgmax.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingArgmin.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingBeta.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingCorr.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingCov.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingGarmanKlassVar.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingHitRate.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingIqr.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingKurt.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingMad.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingMax.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingMean.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingMedian.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingMedianAD.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingMin.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingOU.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingParkinsonVar.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingPoly1.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingPoly2.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingQuantile.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingRSI.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingRange.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingRms.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingRogersSatchellVar.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingSigmaClip.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingSkew.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingStd.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingSum.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingVWAP.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingVar.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingYangZhangVar.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RollingZscore.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/RoofingFilter.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Round.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/SchmittTrigger.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Selu.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Sigmoid.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Sign.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Sin.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Softsign.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Sqrt.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Square.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Stoch.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/StochRSI.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Sub.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/SuperSmoother.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/TEMA.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/TRIMA.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/TRIX.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Tanh.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/TrueRange.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/UltimateOscillator.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/WMA.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/Where.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/WilliamsR.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/__init__.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/_ohlc_vol.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/baselines/_windowing.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/build_function_index.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/build_help_registry.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/build_topic_pages.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/check_pure_headers.sh +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/data/deribit.trades.btc-perpetual.20230804T000000.20230805T000000.csv +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/data/deribit.trades.eth-perpetual.20230804T000000.20230805T000000.csv +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/data/deribit_trade_download.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/design_experiments/interface_v2.ipynb +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/generate_screamer__init__.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/inject_nan_footnote.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/prompts/template_baseline.txt +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/prompts/template_doc.txt +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/report_baselines.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/report_binding.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/report_class_args.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/report_docs.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/stream_diagrams.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/topics.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/wasm/gen_dag_oracle.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/wasm/gen_oracle.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/wasm/gen_ts_api.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/wasm/gen_wasm_bindings.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/wasm/gen_wasm_manifest.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/devtools/wasm/wasm_manifest.json +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/Makefile +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/_static/css/custom.css +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/_static/diagrams/combine_latest.svg +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/_static/diagrams/dropna.svg +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/_static/diagrams/filter.svg +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/_static/diagrams/merge.svg +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/by_group/backtesting-risk.rst +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/by_group/data-prep.rst +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/by_group/indicators.rst +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/by_group/machine-learning.rst +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/by_group/math-logic.rst +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/by_group/microstructure.rst +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/by_group/smoothing-filters.rst +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/by_group/statistics.rst +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/by_group/streaming.rst +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/by_group_index.rst +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/changelog.rst +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/choosing_an_operator.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/conf.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/conventions.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/function_index.txt +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_dag/Pipeline.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_ew/EwBeta.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_ew/EwCorr.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_ew/EwCov.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_ew/EwGarmanKlassVar.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_ew/EwGarmanKlassVol.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_ew/EwKurt.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_ew/EwMean.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_ew/EwParkinsonVar.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_ew/EwParkinsonVol.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_ew/EwRms.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_ew/EwRogersSatchellVar.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_ew/EwRogersSatchellVol.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_ew/EwSkew.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_ew/EwStd.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_ew/EwVar.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_ew/EwZscore.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_expanding/ExpandingKurt.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_expanding/ExpandingMax.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_expanding/ExpandingMean.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_expanding/ExpandingMin.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_expanding/ExpandingProd.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_expanding/ExpandingSkew.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_expanding/ExpandingSlope.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_expanding/ExpandingStd.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_expanding/ExpandingSum.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_expanding/ExpandingVar.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/BacktestL1Orders.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/BacktestL1Target.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/BacktestL1TradesOrders.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/BacktestOHLCOrders.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/BacktestOHLCTarget.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/BacktestPriceTarget.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/BacktestReport.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/BacktestTradesOrders.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/BacktestTradesTarget.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/BayesianRegression.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/Drawdown.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/LogReturn.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/MaxDrawdown.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/PortfolioReport.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/ROC.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/ROCP.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/ROCR.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/Return.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/RollingAlpha.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/RollingBeta.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/RollingCVaR.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/RollingCalmar.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/RollingCorr.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/RollingCov.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/RollingDownsideDeviation.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/RollingHitRate.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/RollingInfoRatio.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/RollingLinearRegression.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/RollingMaxDrawdown.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/RollingOmega.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/RollingPercentile.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/RollingRank.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/RollingResidualStd.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/RollingSharpe.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/RollingSortino.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/RollingSpread.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/RollingTSF.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/backtest_report.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_fin/choosing_a_backtest_engine.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Abs.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Acos.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Add.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/And.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Asin.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Atan.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Atan2.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Cart2Polar.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Ceil.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Cos.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Cube.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Div.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Elu.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Equal.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Erf.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Erfc.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Exp.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Floor.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/GreaterEqual.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/GreaterThan.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Hypot.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/IsFinite.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/IsNan.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/LessEqual.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/LessThan.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Linear.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Linear2.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Log.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Mul.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/NegPart.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Not.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/NotEqual.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Or.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Polar2Cart.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/PosPart.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Power.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Relu.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Round.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Selu.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Sigmoid.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Sign.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Sin.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Softsign.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Sqrt.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Square.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Sub.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Tanh.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_math/Where.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_micro/AmihudIlliquidity.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_micro/BulkVolumeClassifier.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_micro/ContOFI.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_micro/EffectiveSpread.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_micro/EwKyleLambda.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_micro/HawkesIntensity.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_micro/LeeReadySign.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_micro/MicroPrice.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_micro/OFI.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_micro/Propagator.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_micro/QueueImbalance.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_micro/RealizedSpread.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_micro/RollSpread.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_micro/RollingKyleLambda.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_micro/RollingOrderImbalance.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_micro/SignedVolume.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_micro/TickRuleSign.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_micro/VPIN.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_misc/CumMax.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_misc/CumMin.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_misc/CumProd.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_misc/CumSum.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_misc/Detrend.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_misc/Diff.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_misc/Diff2.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_misc/First.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_misc/Identity.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_misc/Lag.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_misc/Last.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_misc/Momentum.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_preprocessing/Clip.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_preprocessing/Ffill.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_preprocessing/FillNa.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/AD.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/ADOSC.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/ADX.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/ADXR.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/ATR.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/BOP.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/BollingerBands.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/CCI.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/DEMA.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/DX.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/DonchianChannels.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/Hampel.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/HullMA.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/ImpulseClip.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/KAMA.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/KeltnerChannels.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/MACD.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/MFI.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/MinusDI.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/MinusDM.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/NATR.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/OBV.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/PlusDI.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/PlusDM.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingArgmax.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingArgmin.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingGarmanKlassVar.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingGarmanKlassVol.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingHurst.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingIqr.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingKurt.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingMad.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingMax.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingMean.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingMedian.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingMedianAD.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingMin.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingMinMax.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingOU.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingParkinsonVar.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingParkinsonVol.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingPoly1.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingPoly2.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingQuantile.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingRSI.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingRange.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingRms.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingRogersSatchellVar.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingRogersSatchellVol.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingSigmaClip.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingSkew.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingStd.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingSum.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingVWAP.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingVar.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingYangZhangVar.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingYangZhangVol.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/RollingZscore.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/Stoch.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/StochRSI.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/TEMA.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/TRIMA.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/TRIX.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/TrueRange.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/UltimateOscillator.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/WMA.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_rolling/WilliamsR.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_signal/Butter.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_signal/ButterBandpass.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_signal/ButterBandstop.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_signal/ButterHighpass.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_signal/CycleAmplitude.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_signal/CycleFrequency.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_signal/CyclePhase.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_signal/CycleSine.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_signal/Decycler.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_signal/DominantCycle.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_signal/FracDiff.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_signal/HilbertPhasor.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_signal/Hold.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_signal/InstantaneousTrendline.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_signal/KalmanFilter.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_signal/MAMA.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_signal/MovingAverage.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_signal/RoofingFilter.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_signal/SchmittTrigger.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_signal/SuperSmoother.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_signal/TrendMode.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_streams/CombineLatest.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_streams/Delay.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_streams/Dropna.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_streams/Filter.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_streams/Merge.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_streams/Resample.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_streams/Select.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_streams/Stream.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_streams/from_pandas.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_streams/split.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_streams/to_pandas.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/functions_supervised/forecast_pairs.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/img/3lines.png +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/img/per_column.png +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/img/speed.png +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/img/speed_chart.png +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/index.rst +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/installation.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/make.bat +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/microstructure.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/multistream.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/nan_and_warmup.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/notebooks/01-quickstart-polymorphic-api.ipynb +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/notebooks/02-window-statistics.ipynb +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/notebooks/03-financial-indicators.ipynb +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/notebooks/04-signal-processing.ipynb +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/notebooks/05-nan-handling.ipynb +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/notebooks/06-streaming-live-events.ipynb +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/notebooks/07-multi-stream-operators.ipynb +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/notebooks/08-pipelines.ipynb +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/notebooks/09-bars-from-ticks.ipynb +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/notebooks/10-custom-and-multi-column-bars.ipynb +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/notebooks/11-microstructure-order-flow.ipynb +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/notebooks/12-microstructure-price-impact.ipynb +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/notebooks/13-microstructure-toxicity-and-book.ipynb +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/notebooks/14-backtesting-a-signal.ipynb +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/notebooks/15-event-driven-backtests.ipynb +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/notebooks/16-supervised-forecasting.ipynb +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/notebooks/17-filtering-and-forecasting-with-uncertainty.ipynb +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/notebooks/18-pairs-and-mean-reversion.ipynb +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/notebooks/19-cycle-and-spectral-analysis.ipynb +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/notebooks/README.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/notebooks/data/deribit_btc_perp_6h.csv +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/notebooks/data/deribit_eth_perp_6h.csv +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/notebooks/index.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/performance.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/pipelines.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/polymorphic_api.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/references_index.rst +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-05-20-help-json-structure-refactor.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-02-multistream-plan1-node-core.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-02-multistream-plan2-merge-pace.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-02-multistream-plan3-combine-latest.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-02-multistream-plan4-filter-split-api.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-02-multistream-plan5-docs-identity.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-03-dag1-definition.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-03-dag2a-evalop-arithmetic.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-03-dag2b1-bulk-evalop.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-03-dag2b2-wide-edge-functornode.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-03-dag2b3-combinelatest-fanout.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-03-dag2b4-compiler.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-03-dag2b5a-streaming.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-03-dag2b5b-cutover.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-03-demo-notebooks.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-04-stream-index-model-redesign.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-04-stream-shaping-dag-phaseA.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-04-stream-shaping-dag-phaseB-resample.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-08-windowed-aggregation-plan.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-09-unified-streaming-stage1-functor-core.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-10-unified-streaming-stage2-dag-lazy-callable.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-10-unified-streaming-stage3-single-input-operators.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-10-unified-streaming-stage3b-multi-input-operators.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-10-unified-streaming-stage4-resample-freq.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-11-node-core-step1-unify-node-contract.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-11-node-core-step2-operator-ports.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-11-node-core-step3a-filter-mask-gate.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-11-node-core-step3c-dropna-select-node-backing.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-11-node-core-step3e-api-collapse-camelcase.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-11-resample-redesign-implementation-plan.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-15-microstructure-flow-operators-plan.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-15-microstructure-flow-operators-tranche-1b-plan.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-18-backtest-fill-models.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-18-docs-navigation-redesign.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-20-backtest-engine-suite.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-20-unified-backtest-engine-api.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-22-bayesian-regression.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-22-delay-and-forecast-pairs.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-23-v1.0-api-hardening.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-23-v1.0-tier3-doc-examples.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-23-v1.0-tier4-onboarding.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-24-delay-watermark-reorder.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-28-resample-infobars-hold.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-30-adaptive-overlays.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-30-cycle-core.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-30-dmi-family.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-07-30-ehlers-filter-foundation.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-08-01-nanobind-migration.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-08-02-js-docs.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-08-02-wasm-phase1-base-class-split.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-08-02-wasm-phase2-embind-codegen.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-08-02-wasm-phase3-ts-api.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-08-02-wasm-phase5-dag-pipeline.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/plans/2026-08-02-wasm-phase6-packaging.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-05-20-help-json-structure-refactor-design.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-02-multistream-foundation-design.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-03-dag-definition-design.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-03-dag2-cpp-engine-design.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-03-demo-notebooks-design.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-04-notebook-docs-integration-design.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-04-stream-index-model-redesign.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-04-stream-shaping-dag-phaseA-design.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-04-stream-shaping-dag-phaseB-resample-design.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-06-dag-visualization-serialization-design.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-06-despiking-filters-design.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-06-topic-taxonomy-proposal.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-06-topic-taxonomy-unified-frontmatter-plan.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-06-topics.yml +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-08-multicolumn-bars-lazy-agg-design.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-08-windowed-aggregation-design.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-09-unified-streaming-model-design.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-11-node-core-step3-api-collapse-design.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-11-resample-redesign-freq-agg-functor-design.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-11-unified-cpp-node-core-architecture-design.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-15-microstructure-flow-operators-design.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-16-lazy-path-cpp-design.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-17-backtest-foundation-signal-design.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-18-backtest-fill-models-design.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-18-docs-navigation-redesign.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-20-backtest-engine-suite-design.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-20-schmitt-trigger-initial-state-design.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-20-unified-backtest-engine-api.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-22-bayesian-regression-design.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-22-delay-and-forecast-pairs-design.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-23-v1.0-readiness-assessment.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-24-delay-watermark-reorder-design.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-28-resample-infobars-hold-design.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-30-ehlers-cycle-and-dmi-tranche-design.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-07-30-fracdiff-design.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/specs/2026-08-02-wasm-js-binding-design.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/spikes/2026-08-01-nanobind/CMakeLists.txt +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/spikes/2026-08-01-nanobind/REPORT.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/spikes/2026-08-01-nanobind/nb_spike.cpp +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/spikes/2026-08-01-nanobind/smoke_test.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/spikes/2026-08-01-nanobind/spike_helper.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/spikes/2026-08-02-wasm/.gitignore +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/spikes/2026-08-02-wasm/REPORT.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/spikes/2026-08-02-wasm/build.sh +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/spikes/2026-08-02-wasm/driver.mjs +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/superpowers/spikes/2026-08-02-wasm/spike.cpp +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/topics.yml +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/docs/usage.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/examples/lag_example.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/ad.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/adosc.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/adx.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/adxr.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/amihud_illiquidity.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/arithmetic.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/atr.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/backtest_l1_orders.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/backtest_l1_target.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/backtest_l1trades_orders.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/backtest_ohlc_orders.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/backtest_ohlc_target.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/backtest_price_target.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/backtest_report.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/backtest_trades_orders.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/backtest_trades_target.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/bayesian_regression.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/bollinger_bands.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/bop.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/bulk_volume_classifier.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/butter.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/butter_bandpass.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/butter_bandstop.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/butter_highpass.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/cci.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/clip.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/common/async_generator.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/common/base.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/common/buffer.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/common/cast_double.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/common/dispatch.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/common/eval_op.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/common/float_info.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/common/function_traits.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/common/functor_base.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/common/lazy_eval_iterator.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/common/market_price.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/common/math.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/common/order_statistic_tree.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/common/transform.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/common/transform_4.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/cont_ofi.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/cum_max.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/cum_min.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/cum_prod.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/cum_sum.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/cycle_amplitude.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/cycle_frequency.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/cycle_phase.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/cycle_sine.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/dag/broadcast.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/dag/collector.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/dag/combine_latest_node.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/dag/compiled_graph.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/dag/delay_node.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/dag/driver.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/dag/dropna_node.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/dag/filter_node.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/dag/frame.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/dag/functor_node.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/dag/graph.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/dag/resample_generic_node.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/dag/resample_node.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/dag/resample_params.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/dag/resettable.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/dag/select_node.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/decycler.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/dema.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/detail/block_extremum.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/detail/delay_buffer.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/detail/dmi_core.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/detail/fir_core.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/detail/hilbert_cycle.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/detail/l1_fill.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/detail/monotonic_deque.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/detail/ohlc_fill.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/detail/pnl_account.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/detail/robust_window.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/detail/rolling_mean.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/detail/rolling_sum.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/detail/start_policy.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/detail/target_front.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/detail/trades_fill.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/detail/wilder_smoother.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/detrend.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/diff.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/diff2.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/dominant_cycle.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/donchian_channels.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/drawdown.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/dx.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/effective_spread.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/ew_beta.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/ew_corr.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/ew_cov.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/ew_kurt.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/ew_mean.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/ew_rms.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/ew_skew.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/ew_std.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/ew_var.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/ew_zscore.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/expanding_kurt.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/expanding_max.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/expanding_mean.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/expanding_min.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/expanding_prod.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/expanding_skew.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/expanding_slope.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/expanding_std.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/expanding_sum.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/expanding_var.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/ffill.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/fillna.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/first.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/frac_diff.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/garman_klass.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/geometry.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/hampel.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/hawkes_intensity.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/hilbert_phasor.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/hold.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/hull_ma.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/impulse_clip.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/instantaneous_trendline.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/kalman_filter.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/kama.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/keltner_channels.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/lag.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/last.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/lee_ready_sign.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/linear.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/linear2.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/log_return.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/logic.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/macd.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/mama.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/max_drawdown.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/mfi.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/micro_price.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/minus_di.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/minus_dm.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/momentum.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/moving_average.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/natr.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/obv.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/ofi.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/parkinson.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/plus_di.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/plus_dm.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/portfolio_report.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/power.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/propagator.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/realized_spread.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/return.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/roc.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rocp.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rocr.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rogers_satchell.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/roll_spread.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_alpha.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_argmax.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_argmin.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_beta.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_calmar.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_corr.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_cov.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_cvar.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_downside_deviation.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_hit_rate.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_hurst.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_info_ratio.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_iqr.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_kurt.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_linear_regression.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_mad.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_max.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_max_drawdown.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_mean.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_median.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_median_ad.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_min.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_min_max.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_omega.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_ou.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_percentile.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_poly1.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_poly2.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_quantile.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_range.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_rank.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_residual_std.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_rms.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_rsi.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_sharpe.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_sigma_clip.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_skew.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_sortino.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_spread.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_std.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_sum.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_tsf.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_var.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/rolling_zscore.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/roofing_filter.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/schmitt_trigger.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/signal/bessel.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/signal/butter.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/signal/ehlers.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/signal/signal.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/stoch.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/stoch_rsi.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/streams/collector_sink.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/streams/combine_latest.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/streams/driver.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/streams/event.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/streams/functor_node.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/streams/merge_source.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/streams/py_source.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/streams/vector_source.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/super_smoother.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/tema.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/tick_rule_sign.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/transform_functions.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/trend_mode.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/trima.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/trix.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/true_range.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/ultimate_oscillator.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/vpin.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/vwap.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/williams_r.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/wma.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/include/screamer/yang_zhang.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/.gitignore +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/docs-guide/lifecycle.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/docs-guide/parity.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/docs-guide/pipeline.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/docs-guide/regimes.md +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/scripts/pack-smoke.sh +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/src/combinators.ts +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/src/errors.ts +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/src/generated/ops.d.ts +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/src/generated/ops.ts +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/src/generated/screamer.d.mts +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/src/generated/screamer.mjs.d.ts +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/src/index.ts +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/src/loader.ts +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/src/ndarray.ts +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/src/node.ts +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/src/pipeline.ts +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/src/runtime.ts +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/test/combinators.test.ts +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/test/dag_lifetime.test.ts +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/test/dag_parity.test.ts +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/test/lifecycle.test.ts +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/test/live.test.ts +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/test/loader.test.ts +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/test/ops.test.ts +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/test/parity.test.ts +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/test/pipeline.test.ts +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/test/reducer.test.ts +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/test/regimes.test.ts +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/test/runtime.test.ts +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/tsconfig.cjs.json +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/js/tsconfig.json +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/poetry.lock +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/pytest.ini +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/screamer/_async.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/screamer/_functor_params.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/screamer/backtest.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/screamer/dag.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/screamer/dag_io.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/screamer/dag_viz.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/screamer/data/help.json +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/screamer/microstructure.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/screamer/streams.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/screamer/supervised.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/src/screamer/common/async_generator.cpp +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/src/screamer/common/base.cpp +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/src/screamer/common/dispatch.cpp +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/src/screamer/common/functor_base.cpp +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/src/screamer/common/math.cpp +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/src/screamer/detail/start_policy.cpp +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tasks.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/__init__.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/_dag_oracle.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/param_cases.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/regime_helpers.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_adx_and_volume.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_arithmetic.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_atr_family.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_backtest.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_baseline_coverage.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_baseline_defaults.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_baselines.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_bayesian_regression.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_build_help_registry.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_channels_and_yz.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_combine_latest_flush.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_contract_compliance.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_cumulative.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_cycle.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_dag_build.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_dag_codes_sync.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_dag_compile.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_dag_delay.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_dag_dropna.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_dag_engine.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_dag_exec.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_dag_identity.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_dag_io.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_dag_lazy.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_dag_public_api.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_dag_resample.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_dag_select.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_dag_stream.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_dag_viz.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_dag_watermark.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_diff2.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_dmi.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_doc_coverage.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_documented_defaults.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_dropna_node_backing.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_ehlers_filters.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_evalop.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_evalop_registry.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_ew_moments.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_ew_pair.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_expanding.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_extremum_worst_case.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_filter_gate.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_filter_node_graph.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_first_last.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_frac_diff.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_functor_params.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_geometry.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_hampel.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_hold.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_impulse_clip.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_input_dtypes.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_io_size.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_kama.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_lazy_iterator_lifetime.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_lazy_streaming.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_length1_rank_dispatch.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_linear2.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_logic_ops.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_macd.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_math_transforms.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_matrix.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_merge_lazy_cpp.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_microstructure.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_module_loader.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_momentum_family.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_moving_averages.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_multi_resample_dict.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_nan_input_compliance.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_nan_start_policy_compliance.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_nan_warmup.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_ntuple_input.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_ohlc_volatility.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_one_input_multi_output.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_op_config_shape.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_oscillators_hlc.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_overlays.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_parity_registration.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_performance_risk.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_pos_neg_part.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_pure_headers.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_range_volatility.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_regression_family.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_resample_advance.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_resample_bars.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_resample_clock.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_resample_cumulative.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_resample_dict_agg.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_resample_fill.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_resample_freq_window.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_resample_functor_agg.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_resample_ohlcv.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_risk_stats.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_rolling_argmin_argmax.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_rolling_corr.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_rolling_hurst.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_rolling_iqr.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_rolling_mad.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_rolling_median_ad.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_rolling_range.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_rolling_rsi.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_rolling_two_input.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_schmitt_trigger.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_select_node_backing.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_signal.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_start_policies.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_stoch.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_stream_columns.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_stream_type.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_stream_vs_batch.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_stream_vs_generator.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_streams_combine.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_streams_combine_latest.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_streams_core.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_streams_delay.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_streams_identity.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_streams_merge.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_streams_polymorphism.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_streams_public_api.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_streams_resample.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_streams_select.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_streams_shape.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_supervised_forecast_pairs.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_tensor.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_third_party_alignment.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_ts_api_fresh.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_v1_api_hardening.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_view.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_wasm_codegen_fresh.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_williams_r.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/tests/test_wma.py +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/wasm/.gitignore +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/wasm/build-wasm.sh +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/wasm/dag_bindings.cpp +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/wasm/dag_embind.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/wasm/embind_runtime.h +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/wasm/generated/bindings_wasm.cpp +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/wasm/smoke/dag_oracle.json +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/wasm/smoke/dag_smoke.mjs +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/wasm/smoke/oracle.json +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/wasm/smoke/oracle_reducer.json +0 -0
- {screamer-2.2.0 → screamer-2.3.0}/wasm/smoke/smoke.mjs +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: screamer
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.3.0
|
|
4
4
|
Summary: Screamingly fast financial technical indicators with C++ performance and Python simplicity, built for both time series analysis and real-time, event-driven streaming.
|
|
5
5
|
Keywords: streaming,indicators,real-time,algorithmic,trading,low-latency
|
|
6
6
|
Author-Email: Thijs van den Berg <thijs@sitmo.com>
|
|
@@ -25,6 +25,21 @@ await ready();
|
|
|
25
25
|
const op = RollingMean(3);
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
+
## Node, bundlers, and the browser
|
|
29
|
+
|
|
30
|
+
The import above works in Node (18+) and through any bundler (Vite, Next.js, webpack,
|
|
31
|
+
esbuild), which inlines the embedded-WASM module. In a plain browser with no build step,
|
|
32
|
+
import from a CDN URL instead (browser use needs 2.2.1 or newer):
|
|
33
|
+
|
|
34
|
+
```html
|
|
35
|
+
<script type="module">
|
|
36
|
+
import { ready, RollingMean }
|
|
37
|
+
from "https://cdn.jsdelivr.net/npm/@screamer-labs/screamer@2.2.1/dist/index.js";
|
|
38
|
+
await ready();
|
|
39
|
+
const sma = RollingMean(3);
|
|
40
|
+
</script>
|
|
41
|
+
```
|
|
42
|
+
|
|
28
43
|
## Calling an op: four input regimes
|
|
29
44
|
|
|
30
45
|
An op factory like `RollingMean(3)` returns a callable. That callable dispatches on its
|
|
@@ -94,8 +109,16 @@ package: same operators, same causal semantics, same numerics. Its outputs are
|
|
|
94
109
|
verified against the Python package's outputs, and batch and streaming calls on the
|
|
95
110
|
same data give identical results.
|
|
96
111
|
|
|
112
|
+
## Live demo
|
|
113
|
+
|
|
114
|
+
Watch the live trade dashboard in the browser:
|
|
115
|
+
[screamer-labs.github.io/screamer/live-trades.html](https://screamer-labs.github.io/screamer/live-trades.html).
|
|
116
|
+
It shows low-lag price, volume-weighted fair value, order-flow pressure, and an optional VPIN view. The self-contained source is [`examples/live-trades.html`](examples/live-trades.html).
|
|
117
|
+
|
|
97
118
|
## Learn more
|
|
98
119
|
|
|
99
|
-
|
|
120
|
+
The JavaScript reference and guide are at
|
|
121
|
+
[screamer-labs.github.io/screamer](https://screamer-labs.github.io/screamer/). Full documentation,
|
|
122
|
+
the function reference, and example notebooks are at
|
|
100
123
|
[screamer.readthedocs.io](https://screamer.readthedocs.io/en/latest/). Source and
|
|
101
124
|
issues live at [github.com/screamer-labs/screamer](https://github.com/screamer-labs/screamer).
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Node, bundlers, and the browser
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Node, bundlers, and the browser
|
|
6
|
+
|
|
7
|
+
screamer.js is one package that runs in Node and in the browser. The API is identical everywhere;
|
|
8
|
+
only how you point the runtime at the package differs. In every environment the rule is the same:
|
|
9
|
+
call `await ready()` once before constructing any operator, because the WebAssembly module loads
|
|
10
|
+
asynchronously.
|
|
11
|
+
|
|
12
|
+
Browser use (a bundler or a CDN) requires version **2.2.1 or newer**. Earlier versions load only
|
|
13
|
+
under Node.
|
|
14
|
+
|
|
15
|
+
## Node
|
|
16
|
+
|
|
17
|
+
Node 18 or newer. Install and import by name:
|
|
18
|
+
|
|
19
|
+
```js
|
|
20
|
+
// npm i @screamer-labs/screamer
|
|
21
|
+
import { ready, RollingMean } from "@screamer-labs/screamer";
|
|
22
|
+
|
|
23
|
+
await ready();
|
|
24
|
+
const sma = RollingMean(3);
|
|
25
|
+
console.log(sma([1, 2, 3, 4])); // [ NaN, NaN, 2, 3 ]
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
The package ships one self-contained module with the WebAssembly embedded, so there is no separate
|
|
29
|
+
`.wasm` file to resolve.
|
|
30
|
+
|
|
31
|
+
## Browser with a bundler
|
|
32
|
+
|
|
33
|
+
Vite, Next.js, webpack, Rollup, esbuild, and similar tools need no special configuration. Install
|
|
34
|
+
and import exactly as in Node; the bundler inlines the embedded-WASM module into your output:
|
|
35
|
+
|
|
36
|
+
```js
|
|
37
|
+
// npm i @screamer-labs/screamer
|
|
38
|
+
import { ready, RollingMean } from "@screamer-labs/screamer";
|
|
39
|
+
|
|
40
|
+
await ready();
|
|
41
|
+
const sma = RollingMean(3);
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
The bare specifier `@screamer-labs/screamer` resolves through the bundler (or an import map). A raw
|
|
45
|
+
browser cannot resolve a bare specifier, which is what the CDN form below handles.
|
|
46
|
+
|
|
47
|
+
## Browser without a build step (CDN)
|
|
48
|
+
|
|
49
|
+
Import from a full URL inside a module script. jsDelivr serves the published module directly:
|
|
50
|
+
|
|
51
|
+
```html
|
|
52
|
+
<script type="module">
|
|
53
|
+
import { ready, RollingMean }
|
|
54
|
+
from "https://cdn.jsdelivr.net/npm/@screamer-labs/screamer@2.2.1/dist/index.js";
|
|
55
|
+
|
|
56
|
+
await ready();
|
|
57
|
+
|
|
58
|
+
const sma = RollingMean(3);
|
|
59
|
+
console.log(Array.from(sma(new Float64Array([1, 2, 3, 4])))); // [ NaN, NaN, 2, 3 ]
|
|
60
|
+
</script>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Pin the version (`@2.2.1`) so loads are reproducible. The module embeds its WebAssembly, so nothing
|
|
64
|
+
else needs to be fetched or configured.
|
|
65
|
+
|
|
66
|
+
To avoid a third-party origin (for offline use, a strict Content-Security-Policy, or full control),
|
|
67
|
+
copy the package's `dist/` directory next to your page and import it with a relative URL. The
|
|
68
|
+
[Live demo](./live-demo.md) does this; its
|
|
69
|
+
[source](https://github.com/screamer-labs/screamer/blob/main/js/examples/live-trades.html) shows
|
|
70
|
+
the pattern.
|
|
71
|
+
|
|
72
|
+
## The rule in every environment
|
|
73
|
+
|
|
74
|
+
`await ready()` resolves the WebAssembly module once and caches it; a second call awaits the same
|
|
75
|
+
load. Construct operators after it, never before. Each op owns memory on the WASM side, so call
|
|
76
|
+
`.dispose()` when you are done with it (or use `using` where your runtime supports it). See
|
|
77
|
+
[Lifecycle](./lifecycle.md).
|
|
78
|
+
|
|
79
|
+
Requirements: Node 18+, or any browser with WebAssembly, which is every current browser on desktop
|
|
80
|
+
and mobile.
|
|
@@ -9,6 +9,10 @@ npm i @screamer-labs/screamer
|
|
|
9
9
|
The package ships one self-contained WASM module. There is no separate `.wasm` asset to fetch
|
|
10
10
|
and no build step on the consumer side.
|
|
11
11
|
|
|
12
|
+
The examples below use a bare import, which resolves under Node or a bundler. To load screamer in
|
|
13
|
+
the browser (through a bundler or straight from a CDN with no build step), see
|
|
14
|
+
[Node, bundlers, and the browser](./environments.md).
|
|
15
|
+
|
|
12
16
|
## Load the module once
|
|
13
17
|
|
|
14
18
|
screamer.js compiles to WebAssembly, and WebAssembly modules instantiate asynchronously
|
|
@@ -37,4 +37,5 @@ RollingMean(3)(new Float64Array([1, 2, 3, 4])); // Float64Array [NaN, NaN, 2, 3]
|
|
|
37
37
|
```
|
|
38
38
|
|
|
39
39
|
Start with [Getting started](./getting-started.md) for the async load step and your first
|
|
40
|
-
`Pipeline
|
|
40
|
+
`Pipeline`, or watch the operators run on a live trade feed in the
|
|
41
|
+
[Live demo](./live-demo.md).
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Live demo
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Live demo
|
|
6
|
+
|
|
7
|
+
**[Open the live demo](https://screamer-labs.github.io/screamer/live-trades.html)** to read a live
|
|
8
|
+
crypto tape with screamer, in your browser.
|
|
9
|
+
|
|
10
|
+
Live trades are noisy. The demo connects to a public exchange feed (Coinbase or Binance, no API
|
|
11
|
+
key) and turns the raw prints into three things a trader actually wants:
|
|
12
|
+
|
|
13
|
+
- **A low-lag price.** `RollingPoly1(window, 0)` is the endpoint of a rolling linear fit. It tracks
|
|
14
|
+
price with far less lag than a moving average, so it de-noises the tape without falling behind.
|
|
15
|
+
- **A volume-weighted fair value.** A VWMA built from `RollingSum(price * size) / RollingSum(size)`
|
|
16
|
+
shows where the volume actually traded, not just where the last print landed.
|
|
17
|
+
- **Order-flow pressure.** An EW-smoothed, normalized signed-volume imbalance shows whether buyers
|
|
18
|
+
are lifting offers or sellers are hitting bids right now. It is a leading read on short-term
|
|
19
|
+
direction (drawn as a green/red strip under the price), not a trade signal.
|
|
20
|
+
|
|
21
|
+
The **view** control switches the x-axis between a trade-count clock and a volume clock. On a
|
|
22
|
+
volume clock each bar is a fixed slice of traded volume, so a burst of micro-trades collapses into
|
|
23
|
+
a couple of bars instead of stretching across the chart.
|
|
24
|
+
|
|
25
|
+
The **signal** control switches the lower panel between the existing order-flow pressure view and
|
|
26
|
+
VPIN. VPIN uses 0.5 BTC volume buckets and reports how one-sided the recent signed flow has been.
|
|
27
|
+
|
|
28
|
+
Each operator is fed one trade at a time as it arrives:
|
|
29
|
+
|
|
30
|
+
```js
|
|
31
|
+
import { ready, RollingPoly1, RollingSum, EwMean } from "@screamer-labs/screamer";
|
|
32
|
+
|
|
33
|
+
await ready();
|
|
34
|
+
|
|
35
|
+
const lowLag = RollingPoly1(30, 0); // low-lag price
|
|
36
|
+
const sumPV = RollingSum(50), sumV = RollingSum(50); // volume-weighted fair value
|
|
37
|
+
const flowNet = EwMean(undefined, 50), flowAbs = EwMean(undefined, 50); // order-flow pressure
|
|
38
|
+
|
|
39
|
+
// sign: +1 when a buyer lifted the offer, -1 when a seller hit the bid
|
|
40
|
+
function onTrade(price, size, sign) {
|
|
41
|
+
const denoised = lowLag(price);
|
|
42
|
+
const fair = sumPV(price * size) / sumV(size);
|
|
43
|
+
const pressure = flowNet(sign * size) / flowAbs(size); // in [-1, 1], positive = buyers leaning
|
|
44
|
+
// ...draw denoised and fair over the trades, pressure as a green/red strip
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
The same operators run just as well on a stored array as on this live feed, so a study done on
|
|
49
|
+
history carries over to production unchanged. See [Getting started](./getting-started.md) for the
|
|
50
|
+
input regimes and [Node, bundlers, and the browser](./environments.md) for how to load screamer in
|
|
51
|
+
each environment.
|
|
52
|
+
|
|
53
|
+
## Running it yourself
|
|
54
|
+
|
|
55
|
+
The demo is a single self-contained HTML file at
|
|
56
|
+
[`js/examples/live-trades.html`](https://github.com/screamer-labs/screamer/blob/main/js/examples/live-trades.html).
|
|
57
|
+
It loads screamer from a CDN, so it needs internet access for both the module and the trade feed.
|
|
58
|
+
If the chart stays empty, the selected market may be restricted in your region; switch markets in
|
|
59
|
+
the demo.
|
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title>screamer.js — reading the live tape</title>
|
|
7
|
+
<style>
|
|
8
|
+
:root {
|
|
9
|
+
--bg: #0d1117; --panel: #161b22; --line: #232a33;
|
|
10
|
+
--fg: #e6edf3; --muted: #8b949e;
|
|
11
|
+
--raw: #6e7681;
|
|
12
|
+
--lowlag: #f5a623; --fair: #58a6ff;
|
|
13
|
+
--buy: #3fb950; --sell: #f85149;
|
|
14
|
+
--live: #3fb950; --warn: #d29922; --dead: #f85149;
|
|
15
|
+
}
|
|
16
|
+
* { box-sizing: border-box; }
|
|
17
|
+
html, body { margin: 0; height: 100%; }
|
|
18
|
+
body {
|
|
19
|
+
background: var(--bg); color: var(--fg);
|
|
20
|
+
font: 14px/1.45 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
21
|
+
display: flex; flex-direction: column; min-height: 100%;
|
|
22
|
+
}
|
|
23
|
+
header { padding: 16px 20px 8px; }
|
|
24
|
+
h1 { margin: 0; font-size: 17px; font-weight: 650; letter-spacing: .2px; }
|
|
25
|
+
h1 .mono { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; color: #58a6ff; }
|
|
26
|
+
.sub { color: var(--muted); font-size: 12.5px; margin-top: 3px; max-width: 760px; }
|
|
27
|
+
.bar { display: flex; flex-wrap: wrap; gap: 10px 14px; align-items: center; padding: 6px 20px 12px; }
|
|
28
|
+
.bar label { color: var(--muted); font-size: 12px; margin-right: 5px; }
|
|
29
|
+
select, button {
|
|
30
|
+
background: var(--panel); color: var(--fg); border: 1px solid var(--line);
|
|
31
|
+
border-radius: 6px; padding: 5px 9px; font-size: 12.5px; cursor: pointer;
|
|
32
|
+
}
|
|
33
|
+
button:hover, select:hover { border-color: #3d4653; }
|
|
34
|
+
.pill {
|
|
35
|
+
display: inline-flex; align-items: center; gap: 7px;
|
|
36
|
+
background: var(--panel); border: 1px solid var(--line);
|
|
37
|
+
border-radius: 999px; padding: 4px 11px; font-size: 12px; color: var(--muted);
|
|
38
|
+
}
|
|
39
|
+
.pill b { color: var(--fg); font-weight: 600; }
|
|
40
|
+
.dot { width: 8px; height: 8px; border-radius: 50%; background: var(--muted); }
|
|
41
|
+
.dot.live { background: var(--live); box-shadow: 0 0 0 3px rgba(63,185,80,.18); }
|
|
42
|
+
.dot.connecting { background: var(--warn); }
|
|
43
|
+
.dot.dead { background: var(--dead); }
|
|
44
|
+
.mono { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }
|
|
45
|
+
#bias.buy { color: var(--buy); border-color: rgba(63,185,80,.4); }
|
|
46
|
+
#bias.sell { color: var(--sell); border-color: rgba(248,81,73,.4); }
|
|
47
|
+
.grow { flex: 1; }
|
|
48
|
+
#wrap { flex: 1; padding: 0 12px 4px; min-height: 320px; position: relative; }
|
|
49
|
+
canvas { width: 100%; height: 100%; display: block; }
|
|
50
|
+
#overlay {
|
|
51
|
+
position: absolute; inset: 0; display: none; align-items: center; justify-content: center;
|
|
52
|
+
text-align: center; padding: 24px; color: var(--muted);
|
|
53
|
+
}
|
|
54
|
+
#overlay .box { max-width: 460px; }
|
|
55
|
+
#overlay code { color: #f0883e; font-family: ui-monospace, Menlo, monospace; }
|
|
56
|
+
.legend { display: flex; flex-wrap: wrap; gap: 8px 18px; padding: 8px 20px 4px; }
|
|
57
|
+
.lg { display: inline-flex; align-items: center; gap: 7px; font-size: 12.5px; }
|
|
58
|
+
.sw { width: 22px; height: 3px; border-radius: 2px; }
|
|
59
|
+
.sw.sq { width: 11px; height: 11px; border-radius: 2px; }
|
|
60
|
+
.lg .nm { color: var(--muted); }
|
|
61
|
+
.lg .vl { font-family: ui-monospace, Menlo, monospace; }
|
|
62
|
+
footer { color: var(--muted); font-size: 11.5px; padding: 4px 20px 14px; }
|
|
63
|
+
footer a { color: #58a6ff; text-decoration: none; }
|
|
64
|
+
</style>
|
|
65
|
+
</head>
|
|
66
|
+
<body>
|
|
67
|
+
<header>
|
|
68
|
+
<h1><span class="mono">screamer.js</span> · reading the live tape</h1>
|
|
69
|
+
<div class="sub">
|
|
70
|
+
Live trades are noisy. This reads the tape for you: a low-lag estimate of where price really
|
|
71
|
+
is, a volume-weighted fair value, and the order-flow pressure showing whether buyers or
|
|
72
|
+
sellers are leaning on the market right now.
|
|
73
|
+
</div>
|
|
74
|
+
</header>
|
|
75
|
+
|
|
76
|
+
<div class="bar">
|
|
77
|
+
<span><label>market</label>
|
|
78
|
+
<select id="source">
|
|
79
|
+
<option value="coinbase">Coinbase · BTC-USD</option>
|
|
80
|
+
<option value="binance">Binance · BTC/USDT</option>
|
|
81
|
+
</select>
|
|
82
|
+
</span>
|
|
83
|
+
<span><label>view</label>
|
|
84
|
+
<select id="window">
|
|
85
|
+
<option value="count:240" selected>240 trades</option>
|
|
86
|
+
<option value="count:480">480 trades</option>
|
|
87
|
+
<option value="vol:6">volume clock · fine</option>
|
|
88
|
+
<option value="vol:20">volume clock · coarse</option>
|
|
89
|
+
</select>
|
|
90
|
+
</span>
|
|
91
|
+
<span><label>signal</label>
|
|
92
|
+
<select id="signal">
|
|
93
|
+
<option value="flow" selected>order-flow pressure</option>
|
|
94
|
+
<option value="vpin">VPIN · 0.5 BTC buckets</option>
|
|
95
|
+
</select>
|
|
96
|
+
</span>
|
|
97
|
+
<button id="pause">Pause</button>
|
|
98
|
+
<button id="reset">Reset</button>
|
|
99
|
+
<span class="grow"></span>
|
|
100
|
+
<span class="pill"><span id="dot" class="dot"></span><span id="status">starting…</span></span>
|
|
101
|
+
<span class="pill">price <b id="last" class="mono">—</b></span>
|
|
102
|
+
<span class="pill" id="bias"><span id="signalLabel">flow</span> <b id="biastxt">—</b></span>
|
|
103
|
+
<span class="pill"><b id="rate">0</b> trades/s</span>
|
|
104
|
+
</div>
|
|
105
|
+
|
|
106
|
+
<div id="wrap">
|
|
107
|
+
<canvas id="chart"></canvas>
|
|
108
|
+
<div id="overlay"><div class="box"></div></div>
|
|
109
|
+
</div>
|
|
110
|
+
|
|
111
|
+
<div class="legend">
|
|
112
|
+
<span class="lg"><span class="sw" style="background:var(--lowlag)"></span><span class="nm">low-lag price</span> <span class="vl" id="v_lowlag">—</span></span>
|
|
113
|
+
<span class="lg"><span class="sw" style="background:var(--fair)"></span><span class="nm">fair value (volume-weighted)</span> <span class="vl" id="v_fair">—</span></span>
|
|
114
|
+
<span class="lg"><span class="sw" style="background:var(--raw)"></span><span class="nm">trades</span></span>
|
|
115
|
+
<span class="lg"><span class="sw sq" style="background:var(--buy)"></span><span class="sw sq" style="background:var(--sell)"></span><span class="nm" id="signalLegend">order-flow pressure (buy / sell)</span></span>
|
|
116
|
+
</div>
|
|
117
|
+
|
|
118
|
+
<footer>
|
|
119
|
+
Powered by <a href="https://www.npmjs.com/package/@screamer-labs/screamer" target="_blank" rel="noopener">@screamer-labs/screamer</a>.
|
|
120
|
+
Public trade feeds, no API key. Order flow is a leading read on short-term direction, not a
|
|
121
|
+
trade signal. If a market shows no data it may be geo-restricted, switch markets above.
|
|
122
|
+
</footer>
|
|
123
|
+
|
|
124
|
+
<script type="module">
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
// Load screamer.js. On the docs site a same-origin bundle sits next to this
|
|
127
|
+
// page (built to a broad target, most robust across browsers incl. mobile
|
|
128
|
+
// Safari); the CDN entries are fallbacks when the file is opened standalone.
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
const SOURCES = [
|
|
131
|
+
new URL("./vendor/screamer/index.js", import.meta.url).href, // same-origin (docs site)
|
|
132
|
+
"https://cdn.jsdelivr.net/npm/@screamer-labs/screamer@2.2.1/dist/index.js", // raw published ESM
|
|
133
|
+
"https://esm.sh/@screamer-labs/screamer@2.2.1", // transformed fallback
|
|
134
|
+
];
|
|
135
|
+
async function loadScreamer() {
|
|
136
|
+
const errs = [];
|
|
137
|
+
for (const url of SOURCES) {
|
|
138
|
+
try { return await import(url); }
|
|
139
|
+
catch (e) {
|
|
140
|
+
const where = url.startsWith("http") ? new URL(url).host : "same-origin";
|
|
141
|
+
errs.push(where + " — " + String((e && e.message) || e));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
throw new Error(errs.join("\n"));
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const overlay = document.getElementById("overlay");
|
|
148
|
+
function fail(html) { overlay.querySelector(".box").innerHTML = html; overlay.style.display = "flex"; }
|
|
149
|
+
|
|
150
|
+
let S;
|
|
151
|
+
try {
|
|
152
|
+
S = await loadScreamer();
|
|
153
|
+
await S.ready();
|
|
154
|
+
} catch (e) {
|
|
155
|
+
const detail = String((e && e.message) || e)
|
|
156
|
+
.replace(/&/g, "&").replace(/</g, "<").replace(/\n/g, "<br>");
|
|
157
|
+
fail(`Could not load <code>@screamer-labs/screamer</code>.<br><br>` +
|
|
158
|
+
`This page needs internet access for the module and the trade feed.<br><br>` +
|
|
159
|
+
`<small style="color:#f0883e">${detail}</small>`);
|
|
160
|
+
throw e;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// ---------------------------------------------------------------------------
|
|
164
|
+
// The signals, all screamer operators fed one trade at a time:
|
|
165
|
+
// low-lag price RollingPoly1(win, 0) endpoint of a rolling linear fit
|
|
166
|
+
// fair value RollingSum(pv)/RollingSum(v) volume-weighted price (VWMA)
|
|
167
|
+
// order flow EwMean(signed vol) / EwMean(|vol|) buy-vs-sell pressure in [-1,1]
|
|
168
|
+
// Rebuilt on reset / market change so state starts clean.
|
|
169
|
+
// ---------------------------------------------------------------------------
|
|
170
|
+
const POLY_WIN = 30, VWMA_WIN = 50, FLOW_SPAN = 50;
|
|
171
|
+
const VPIN_BUCKET = 0.5, VPIN_BUCKETS = 20;
|
|
172
|
+
let ops;
|
|
173
|
+
function buildOps() {
|
|
174
|
+
ops = {
|
|
175
|
+
poly: S.RollingPoly1(POLY_WIN, 0),
|
|
176
|
+
sumPV: S.RollingSum(VWMA_WIN),
|
|
177
|
+
sumV: S.RollingSum(VWMA_WIN),
|
|
178
|
+
ewS: S.EwMean(undefined, FLOW_SPAN),
|
|
179
|
+
ewA: S.EwMean(undefined, FLOW_SPAN),
|
|
180
|
+
vpin: S.VPIN(VPIN_BUCKET, VPIN_BUCKETS),
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
function disposeOps() { if (ops) for (const k in ops) ops[k].dispose(); }
|
|
184
|
+
|
|
185
|
+
let N = 240; // samples shown
|
|
186
|
+
let prices = [], lowlag = [], fair = [], flow = [], vpin = [];
|
|
187
|
+
let vpinLatest = NaN, signalName = "flow";
|
|
188
|
+
let paused = false, dirty = true;
|
|
189
|
+
const arrivals = [];
|
|
190
|
+
|
|
191
|
+
// The clock decides what one plotted sample is: a single trade (count clock), or
|
|
192
|
+
// a fixed slice of volume (volume clock). A volume clock collapses a burst of
|
|
193
|
+
// micro-trades into a few bars instead of a long stretch of near-flat prints.
|
|
194
|
+
let clock = { mode: "count", factor: 0 };
|
|
195
|
+
let bucket = null, avgSize = 0;
|
|
196
|
+
|
|
197
|
+
function reset() {
|
|
198
|
+
disposeOps(); buildOps();
|
|
199
|
+
prices = []; lowlag = []; fair = []; flow = []; vpin = [];
|
|
200
|
+
vpinLatest = NaN; bucket = null; avgSize = 0;
|
|
201
|
+
arrivals.length = 0; dirty = true;
|
|
202
|
+
}
|
|
203
|
+
buildOps();
|
|
204
|
+
|
|
205
|
+
function onTrade(price, size, sign) {
|
|
206
|
+
arrivals.push(performance.now()); // trades/sec always counts raw trades
|
|
207
|
+
document.getElementById("last").textContent = fmt(price);
|
|
208
|
+
avgSize = avgSize > 0 ? avgSize * 0.99 + size * 0.01 : size; // slow EWMA, burst-resistant
|
|
209
|
+
const buy = sign > 0 ? size : 0, sell = sign < 0 ? size : 0;
|
|
210
|
+
vpinLatest = ops.vpin(buy, sell);
|
|
211
|
+
|
|
212
|
+
if (clock.mode === "count") { addSample(price, size, sign * size); return; }
|
|
213
|
+
|
|
214
|
+
// Volume clock: accumulate into a bucket until it holds a target slice of
|
|
215
|
+
// volume, then emit one bar (its VWAP, its volume, its net signed flow).
|
|
216
|
+
if (!bucket) bucket = { vol: 0, signed: 0, pv: 0 };
|
|
217
|
+
bucket.vol += size; bucket.signed += sign * size; bucket.pv += price * size;
|
|
218
|
+
if (bucket.vol >= avgSize * clock.factor) {
|
|
219
|
+
addSample(bucket.pv / bucket.vol, bucket.vol, bucket.signed);
|
|
220
|
+
bucket = null;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// One plotted sample, fed through the operators. `signedVol` is net signed
|
|
225
|
+
// volume (sign*size for a single trade, the bucket's net for a volume bar).
|
|
226
|
+
function addSample(price, size, signedVol) {
|
|
227
|
+
const ll = ops.poly(price);
|
|
228
|
+
const pv = ops.sumPV(price * size), v = ops.sumV(size);
|
|
229
|
+
const vw = v > 0 ? pv / v : NaN;
|
|
230
|
+
const sv = ops.ewS(signedVol), av = ops.ewA(size);
|
|
231
|
+
const of = av > 0 ? Math.max(-1, Math.min(1, sv / av)) : 0;
|
|
232
|
+
|
|
233
|
+
prices.push(price); lowlag.push(ll); fair.push(vw); flow.push(of); vpin.push(vpinLatest);
|
|
234
|
+
while (prices.length > N) { prices.shift(); lowlag.shift(); fair.shift(); flow.shift(); vpin.shift(); }
|
|
235
|
+
dirty = true;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// ---------------------------------------------------------------------------
|
|
239
|
+
// Public trade feeds. Each yields { price, size, sign } where sign is the
|
|
240
|
+
// aggressor: +1 when a buyer lifted the offer, -1 when a seller hit the bid.
|
|
241
|
+
// ---------------------------------------------------------------------------
|
|
242
|
+
const FEEDS = {
|
|
243
|
+
coinbase: {
|
|
244
|
+
label: "Coinbase BTC-USD",
|
|
245
|
+
url: "wss://ws-feed.exchange.coinbase.com",
|
|
246
|
+
onopen: (ws) => ws.send(JSON.stringify({
|
|
247
|
+
type: "subscribe", product_ids: ["BTC-USD"], channels: ["matches"],
|
|
248
|
+
})),
|
|
249
|
+
parse: (m) => {
|
|
250
|
+
if (m.type !== "match" && m.type !== "last_match") return null;
|
|
251
|
+
const price = parseFloat(m.price), size = parseFloat(m.size);
|
|
252
|
+
if (!Number.isFinite(price) || !Number.isFinite(size)) return null;
|
|
253
|
+
// Coinbase `side` is the resting (maker) side; the aggressor is the opposite.
|
|
254
|
+
return { price, size, sign: m.side === "sell" ? 1 : -1 };
|
|
255
|
+
},
|
|
256
|
+
},
|
|
257
|
+
binance: {
|
|
258
|
+
label: "Binance BTC/USDT",
|
|
259
|
+
url: "wss://stream.binance.com:9443/ws/btcusdt@trade",
|
|
260
|
+
onopen: null,
|
|
261
|
+
parse: (m) => {
|
|
262
|
+
if (m.e !== "trade") return null;
|
|
263
|
+
const price = parseFloat(m.p), size = parseFloat(m.q);
|
|
264
|
+
if (!Number.isFinite(price) || !Number.isFinite(size)) return null;
|
|
265
|
+
// m.m = buyer is the maker, so the seller is the aggressor.
|
|
266
|
+
return { price, size, sign: m.m ? -1 : 1 };
|
|
267
|
+
},
|
|
268
|
+
},
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
let ws = null, source = "coinbase", retry = 0, reconnectTimer = null;
|
|
272
|
+
|
|
273
|
+
function setStatus(state, text) {
|
|
274
|
+
document.getElementById("dot").className = "dot " + (state || "");
|
|
275
|
+
document.getElementById("status").textContent = text;
|
|
276
|
+
}
|
|
277
|
+
function connect() {
|
|
278
|
+
clearTimeout(reconnectTimer);
|
|
279
|
+
const feed = FEEDS[source];
|
|
280
|
+
setStatus("connecting", "connecting to " + feed.label + "…");
|
|
281
|
+
let sock;
|
|
282
|
+
try { sock = new WebSocket(feed.url); } catch { scheduleReconnect(); return; }
|
|
283
|
+
ws = sock;
|
|
284
|
+
sock.onopen = () => { retry = 0; if (feed.onopen) feed.onopen(sock); setStatus("live", "live · " + feed.label); };
|
|
285
|
+
sock.onmessage = (ev) => {
|
|
286
|
+
if (paused) return;
|
|
287
|
+
let m; try { m = JSON.parse(ev.data); } catch { return; }
|
|
288
|
+
const t = feed.parse(m);
|
|
289
|
+
if (t) onTrade(t.price, t.size, t.sign);
|
|
290
|
+
};
|
|
291
|
+
sock.onerror = () => { try { sock.close(); } catch {} };
|
|
292
|
+
sock.onclose = () => { if (sock !== ws) return; setStatus("dead", "disconnected · retrying…"); scheduleReconnect(); };
|
|
293
|
+
}
|
|
294
|
+
function scheduleReconnect() { retry = Math.min(retry + 1, 6); reconnectTimer = setTimeout(connect, 400 * retry); }
|
|
295
|
+
function switchFeed(next) { source = next; if (ws) { ws.onclose = null; try { ws.close(); } catch {} ws = null; } reset(); connect(); }
|
|
296
|
+
|
|
297
|
+
// ---------------------------------------------------------------------------
|
|
298
|
+
// Rendering: a price panel (raw trades, low-lag price, fair value) over a slim
|
|
299
|
+
// order-flow strip (buy pressure green above zero, sell pressure red below).
|
|
300
|
+
// The price axis is scaled from the raw trades only.
|
|
301
|
+
// ---------------------------------------------------------------------------
|
|
302
|
+
const canvas = document.getElementById("chart");
|
|
303
|
+
const ctx = canvas.getContext("2d");
|
|
304
|
+
let cssW = 0, cssH = 0, dpr = 1;
|
|
305
|
+
function resize() {
|
|
306
|
+
const r = canvas.getBoundingClientRect();
|
|
307
|
+
cssW = Math.max(320, r.width); cssH = Math.max(300, r.height);
|
|
308
|
+
dpr = window.devicePixelRatio || 1;
|
|
309
|
+
canvas.width = Math.round(cssW * dpr); canvas.height = Math.round(cssH * dpr);
|
|
310
|
+
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
|
|
311
|
+
dirty = true;
|
|
312
|
+
}
|
|
313
|
+
window.addEventListener("resize", resize);
|
|
314
|
+
|
|
315
|
+
const PADL = 12, PADR = 74, PADT = 12, PADB = 18;
|
|
316
|
+
|
|
317
|
+
function fmt(v) {
|
|
318
|
+
return Number.isFinite(v) ? v.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) : "—";
|
|
319
|
+
}
|
|
320
|
+
function lastFinite(a) { for (let i = a.length - 1; i >= 0; i--) if (Number.isFinite(a[i])) return a[i]; return NaN; }
|
|
321
|
+
|
|
322
|
+
function render() {
|
|
323
|
+
requestAnimationFrame(render);
|
|
324
|
+
const now = performance.now();
|
|
325
|
+
while (arrivals.length && now - arrivals[0] > 1000) arrivals.shift();
|
|
326
|
+
document.getElementById("rate").textContent = arrivals.length;
|
|
327
|
+
|
|
328
|
+
if (!dirty) return;
|
|
329
|
+
dirty = false;
|
|
330
|
+
|
|
331
|
+
ctx.clearRect(0, 0, cssW, cssH);
|
|
332
|
+
const plotW = cssW - PADL - PADR, plotH = cssH - PADT - PADB;
|
|
333
|
+
const priceH = plotH * 0.70, gap = plotH * 0.07, flowH = plotH - priceH - gap;
|
|
334
|
+
const priceTop = PADT, flowTop = PADT + priceH + gap;
|
|
335
|
+
|
|
336
|
+
const finite = prices.filter(Number.isFinite);
|
|
337
|
+
if (finite.length < 2) {
|
|
338
|
+
ctx.fillStyle = "#8b949e"; ctx.font = "13px -apple-system, sans-serif"; ctx.textAlign = "center";
|
|
339
|
+
ctx.fillText("waiting for trades…", PADL + plotW / 2, priceTop + priceH / 2);
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
let lo = Math.min(...finite), hi = Math.max(...finite);
|
|
344
|
+
for (const v of fair) if (Number.isFinite(v)) { lo = Math.min(lo, v); hi = Math.max(hi, v); }
|
|
345
|
+
if (hi - lo < 1e-9) { hi += 1; lo -= 1; }
|
|
346
|
+
const pad = (hi - lo) * 0.08; lo -= pad; hi += pad;
|
|
347
|
+
|
|
348
|
+
const len = prices.length, step = plotW / (N - 1);
|
|
349
|
+
const X = (i) => PADL + plotW - (len - 1 - i) * step;
|
|
350
|
+
const Yp = (p) => priceTop + (1 - (p - lo) / (hi - lo)) * priceH;
|
|
351
|
+
const Yf = (v) => flowTop + (1 - (v + 1) / 2) * flowH;
|
|
352
|
+
const zeroY = Yf(0);
|
|
353
|
+
|
|
354
|
+
// price grid + right labels
|
|
355
|
+
ctx.strokeStyle = "#232a33"; ctx.fillStyle = "#8b949e"; ctx.lineWidth = 1;
|
|
356
|
+
ctx.font = "11px ui-monospace, Menlo, monospace"; ctx.textAlign = "left";
|
|
357
|
+
for (let k = 0; k <= 4; k++) {
|
|
358
|
+
const y = priceTop + (k / 4) * priceH;
|
|
359
|
+
ctx.beginPath(); ctx.moveTo(PADL, y); ctx.lineTo(PADL + plotW, y); ctx.stroke();
|
|
360
|
+
ctx.fillText(fmt(hi - (k / 4) * (hi - lo)), PADL + plotW + 8, y + 3);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// price lines, clipped to the price panel
|
|
364
|
+
ctx.save(); ctx.beginPath(); ctx.rect(PADL, priceTop, plotW, priceH); ctx.clip();
|
|
365
|
+
line(prices, "#6e7681", 1, 0.5, X, Yp);
|
|
366
|
+
line(fair, "#58a6ff", 1.4, 0.9, X, Yp);
|
|
367
|
+
line(lowlag, "#f5a623", 1.9, 1, X, Yp);
|
|
368
|
+
ctx.restore();
|
|
369
|
+
|
|
370
|
+
// The lower panel can show either the existing order-flow read or VPIN.
|
|
371
|
+
const nowFlow = lastFinite(flow), nowVpin = lastFinite(vpin);
|
|
372
|
+
document.getElementById("v_lowlag").textContent = fmt(lastFinite(lowlag));
|
|
373
|
+
document.getElementById("v_fair").textContent = fmt(lastFinite(fair));
|
|
374
|
+
const pill = document.getElementById("bias"), txt = document.getElementById("biastxt");
|
|
375
|
+
document.getElementById("signalLabel").textContent = signalName === "vpin" ? "VPIN" : "flow";
|
|
376
|
+
document.getElementById("signalLegend").textContent = signalName === "vpin" ? "VPIN (0–1, higher = more one-sided)" : "order-flow pressure (buy / sell)";
|
|
377
|
+
if (signalName === "vpin") {
|
|
378
|
+
const Yv = (v) => flowTop + (1 - v) * flowH;
|
|
379
|
+
ctx.strokeStyle = "#2c333d"; ctx.beginPath(); ctx.moveTo(PADL, Yv(0.5)); ctx.lineTo(PADL + plotW, Yv(0.5)); ctx.stroke();
|
|
380
|
+
ctx.fillStyle = "#8b949e"; ctx.textAlign = "left"; ctx.fillText("VPIN", PADL + 2, flowTop + 10);
|
|
381
|
+
ctx.font = "11px ui-monospace, Menlo, monospace"; ctx.fillText("1.00", PADL + plotW + 8, flowTop + 3); ctx.fillText("0.00", PADL + plotW + 8, flowTop + flowH + 3);
|
|
382
|
+
line(vpin, "#d29922", 1.8, 1, X, Yv);
|
|
383
|
+
pill.className = "pill"; txt.textContent = Number.isFinite(nowVpin) ? nowVpin.toFixed(2) : "warming up";
|
|
384
|
+
} else {
|
|
385
|
+
// order-flow strip: zero line, green fill above, red fill below
|
|
386
|
+
ctx.strokeStyle = "#2c333d"; ctx.beginPath(); ctx.moveTo(PADL, zeroY); ctx.lineTo(PADL + plotW, zeroY); ctx.stroke();
|
|
387
|
+
ctx.fillStyle = "#8b949e"; ctx.textAlign = "left"; ctx.fillText("order flow", PADL + 2, flowTop + 10);
|
|
388
|
+
fillFlow(flow, X, Yf, zeroY, "#3fb950", PADL, flowTop, plotW, zeroY - flowTop);
|
|
389
|
+
fillFlow(flow, X, Yf, zeroY, "#f85149", PADL, zeroY, plotW, flowTop + flowH - zeroY);
|
|
390
|
+
if (Number.isFinite(nowFlow) && nowFlow > 0.05) { pill.className = "pill buy"; txt.textContent = "buyers " + Math.round(nowFlow * 100) + "%"; }
|
|
391
|
+
else if (Number.isFinite(nowFlow) && nowFlow < -0.05) { pill.className = "pill sell"; txt.textContent = "sellers " + Math.round(-nowFlow * 100) + "%"; }
|
|
392
|
+
else { pill.className = "pill"; txt.textContent = "balanced"; }
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
function line(arr, color, w, alpha, X, Yp) {
|
|
397
|
+
ctx.strokeStyle = color; ctx.lineWidth = w; ctx.globalAlpha = alpha; ctx.lineJoin = "round";
|
|
398
|
+
ctx.beginPath(); let pen = false;
|
|
399
|
+
for (let i = 0; i < arr.length; i++) {
|
|
400
|
+
const v = arr[i];
|
|
401
|
+
if (!Number.isFinite(v)) { pen = false; continue; }
|
|
402
|
+
const x = X(i), y = Yp(v);
|
|
403
|
+
if (pen) ctx.lineTo(x, y); else { ctx.moveTo(x, y); pen = true; }
|
|
404
|
+
}
|
|
405
|
+
ctx.stroke(); ctx.globalAlpha = 1;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
// Fill the area between the flow line and the zero line, clipped to a rectangle
|
|
409
|
+
// so only the above-zero (green) or below-zero (red) part shows.
|
|
410
|
+
function fillFlow(arr, X, Yf, zeroY, color, cx, cy, cw, ch) {
|
|
411
|
+
const len = arr.length; if (len < 2) return;
|
|
412
|
+
ctx.save(); ctx.beginPath(); ctx.rect(cx, cy, cw, ch); ctx.clip();
|
|
413
|
+
ctx.fillStyle = color; ctx.globalAlpha = 0.55; ctx.beginPath();
|
|
414
|
+
ctx.moveTo(X(0), zeroY);
|
|
415
|
+
for (let i = 0; i < len; i++) ctx.lineTo(X(i), Yf(Number.isFinite(arr[i]) ? arr[i] : 0));
|
|
416
|
+
ctx.lineTo(X(len - 1), zeroY); ctx.closePath(); ctx.fill();
|
|
417
|
+
ctx.globalAlpha = 1; ctx.restore();
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
// ---------------------------------------------------------------------------
|
|
421
|
+
document.getElementById("source").addEventListener("change", (e) => switchFeed(e.target.value));
|
|
422
|
+
document.getElementById("signal").addEventListener("change", (e) => { signalName = e.target.value; dirty = true; });
|
|
423
|
+
document.getElementById("window").addEventListener("change", (e) => {
|
|
424
|
+
const [t, n] = e.target.value.split(":");
|
|
425
|
+
const next = t === "vol" ? { mode: "volume", factor: +n, N: 240 } : { mode: "count", factor: 0, N: +n };
|
|
426
|
+
const sameMode = next.mode === clock.mode && next.factor === clock.factor;
|
|
427
|
+
clock = { mode: next.mode, factor: next.factor }; N = next.N;
|
|
428
|
+
if (sameMode) {
|
|
429
|
+
while (prices.length > N) { prices.shift(); lowlag.shift(); fair.shift(); flow.shift(); vpin.shift(); }
|
|
430
|
+
dirty = true;
|
|
431
|
+
} else reset(); // clock type changed: the samples mean something different, start clean
|
|
432
|
+
});
|
|
433
|
+
document.getElementById("pause").addEventListener("click", (e) => { paused = !paused; e.target.textContent = paused ? "Resume" : "Pause"; });
|
|
434
|
+
document.getElementById("reset").addEventListener("click", reset);
|
|
435
|
+
|
|
436
|
+
resize();
|
|
437
|
+
connect();
|
|
438
|
+
requestAnimationFrame(render);
|
|
439
|
+
</script>
|
|
440
|
+
</body>
|
|
441
|
+
</html>
|