Commit Graph

638 Commits

Author SHA1 Message Date
Miha Kralj db6bb86fe6 feat(rrsi): add PineScript reference implementation
Ehlers TASC May 2018 algorithm: Momentum → Super Smoother (2-pole
Butterworth IIR) → Ehlers RSI (summation CU/CD) → Fisher Transform.
Inputs: smoothLength=10, rsiLength=10, source=close.
2026-03-17 09:44:16 -07:00
Miha Kralj 4cc4c1a0c4 feat(rrsi): add validation tests — manual Ehlers algorithm cross-check
- Manual step-by-step reference implementation of Ehlers TASC May 2018
- Theory tests across 5 parameter combinations (5/5, 8/10, 10/10, 10/20, 20/10)
- arctanh mathematical identity verification
- Streaming/batch/span consistency validation
- Event-based vs streaming agreement check
- All-outputs-finite verification across 4 parameter sets
- Super Smoother coefficient unity DC gain validation
- 18 new tests, 15981 total passing, 0 warnings
2026-03-17 09:38:18 -07:00
Miha Kralj eb9e41fc2e feat: add RRSI (Rocket RSI) — Ehlers TASC May 2018
Algorithm: SuperSmoother-filtered momentum → Ehlers RSI → Fisher Transform
- 2-pole Butterworth IIR pre-filter removes noise
- Ehlers RSI (raw summation, not Wilder) outputs [-1,1]
- arctanh produces Gaussian-distributed zero-mean oscillator

Files: Rrsi.cs, Rrsi.Quantower.cs, Rrsi.md, 31+7 tests
Integration: sidebar, indices, Python bridge (Exports, _bridge, oscillators, SPEC)
Build: 0 warnings, 0 errors | Tests: 15,963 passed, 0 failed
2026-03-17 09:25:32 -07:00
Miha Kralj 15f4bb90f3 feat: add 8 new indicators with full integration
New indicators:
- HWC (Holt-Winters Channel) — channels, 27 tests
- VWMACD (Volume-Weighted MACD) — momentum, 38 tests
- Squeeze Pro — oscillators, 69 tests
- BW_MFI (Bill Williams MFI) — oscillators
- DSTOCH (Double Stochastic) — oscillators
- ATRSTOP (ATR Trailing Stop) — reversals
- VSTOP (Volatility Stop) — reversals
- Convexity (Beta Convexity) — statistics, 23 tests

Integration:
- Python bridge: Exports.cs, _bridge.py, wrapper modules
- Documentation: _sidebar.md, _index.md pages, SPEC.md
- All analyzer warnings fixed (MA0074, xUnit2013, S2699)

Build: 0 warnings, 0 errors | Tests: 15,933 passed, 0 failed
2026-03-17 08:35:29 -07:00
Miha Kralj 6f0a339c9b fix: resolve build and test errors
- Sar.Quantower.Tests.cs: add missing opening quote on string literal (line 48)
- Exports.cs: rename Correlation.Batch → Correl.Batch (CS0103)
- Ad.Validation.Tests.cs: fix Ooples OutputValues key "Ad" → "Adl"
2026-03-16 12:45:13 -07:00
Miha Kralj 3b0cdca567 fix: add mermaid rendering support to Docsify site
- Add mermaid@11 library with dark theme configuration
- Add custom markdown renderer to convert ```mermaid blocks to <div>
- Add doneEach plugin hook to run mermaid after page navigation
- Fix code fence syntax in architecture.md (remove space before 'mermaid')
2026-03-15 21:10:07 -07:00
Miha Kralj 57e69721f5 fix: relax BBB streaming/batch tolerance for cross-platform FP precision 2026-03-15 18:15:47 -07:00
Miha Kralj e3bd07aa87 feat: add ADF (Augmented Dickey-Fuller) indicator
- Core implementation with Cholesky OLS, MacKinnon p-value, AIC lag selection
- Three regression models: NoConstant, Constant, ConstantAndTrend
- NormCdf via Abramowitz & Stegun 7.1.26 erf approximation
- Quantower adapter, Python bridge (NativeAOT export + ctypes + wrapper)
- 69 tests (41 unit + 12 validation + 14 Quantower + 2 consistency)
- Documentation with Schwert table, MacKinnon coefficients, PineScript ref
- All 19,095 tests pass, zero warnings
2026-03-15 17:56:54 -07:00
Miha Kralj 0468283d45 Add Python benchmark: quantalib NativeAOT vs pandas-ta comparison
- New python/tests/benchmark.py mirrors C# perf/Benchmark.cs indicators
  (SMA, EMA, WMA, HMA, ADOSC, CORRELATION, SKEW) at 500K bars
- quantalib NativeAOT via ctypes FFI: 2-68x faster than pandas-ta
- Updated docs/benchmarks.md with Python benchmark results section
2026-03-13 22:40:59 -07:00
Miha Kralj d3f5fbf4e6 fix: restrict StampReadmeVersion to single project to prevent parallel race corruption 2026-03-13 22:08:37 -07:00
Miha Kralj 8201d3c20e fix: deduplicate README.md header badges and update version to 0.8.7 2026-03-13 22:05:59 -07:00
Miha Kralj 67ad6f0cba v0.8.7: Replace periodic ResyncInterval with Kahan compensated summation
Comprehensive refactor across all indicators replacing the periodic
ResyncInterval-based drift correction (every 1000 ticks recalculate
from scratch) with Kahan compensated summation for running sums.

Key changes:
- Remove ResyncInterval constants and TickCount fields from all State records
- Add Kahan compensation fields (SumComp, SumSqComp, etc.) to State records
- Replace naive sum += val - removed with Kahan delta pattern
- Remove Resync()/RecalculateSum() methods that did O(N) recalculation
- Update batch/SIMD paths to use Kahan compensation instead of resync loops
- IIR filters (EMA, REMA, RGMA) simplified: inherently self-correcting
- Version bump to 0.8.7
- Build system: README version stamping via Directory.Build.props
- Minor doc/test tolerance adjustments for new numerical characteristics

Affected modules: channels, core, cycles, dynamics, errors, momentum,
oscillators, statistics, trends_FIR, trends_IIR, volatility, volume
2026-03-13 22:01:31 -07:00
Miha Kralj c75135ab14 v0.8.6: update indicator docs, ndepend tooling, ALMA refactor, gitignore cleanup 2026-03-13 13:46:52 -07:00
Miha Kralj e3e9555fc1 feat(python): add pure-Python EMA fallback per PYTHON_FALLBACK_SPEC
Single-function API: ema(source, period=10, *, alpha=None)
- Bias-compensated EMA matching C# Ema.Batch exactly
- NaN/Inf safe with last-valid substitution
- 65 lines, pseudocode-readable reference implementation
- Co-located ema_test.py (15 tests) + tests/test_ema.py (37 tests)
- All 50 tests pass, 2 cross-validation skipped (no native lib)
2026-03-12 21:02:52 -07:00
Miha Kralj 107f64c7c6 docs: rewrite pinescript.md with all 396 .pine indicators
Complete rewrite of docs/pinescript.md to include every .pine file
organized by category (core, FIR trends, IIR trends, filters,
oscillators, dynamics, momentum, volatility, volume, channels,
cycles, reversals, forecasts, statistics, numerics, errors).
Previously listed ~120 indicators with many missing categories.
2026-03-12 14:20:41 -07:00
Miha Kralj 8f387e72b8 docs: rewrite README, add docsify search, reorder sidebar, fix license refs 2026-03-12 14:07:03 -07:00
Miha Kralj 060649192f docs: remove C# Implementation Considerations sections, clean up temp scripts, reorganize test files
- Remove 'C# Implementation Considerations' sections from 34 indicator .md files
- Delete 29 temp PowerShell scripts (_fix_mojibake.ps1, _hex_scan.ps1, etc.)
- Move test files into tests/ subdirectories for consistent project structure
- Add trader-focused bullet points to indicator documentation
2026-03-12 12:34:16 -07:00
Miha Kralj 8937b0c0fa fix: CI checkout auth + Wrmse test failure
- Publish.yml: Change workflow permissions from {} to contents:read
  to fix GITHUB_TOKEN having no scopes for actions/checkout@v4
- Wrmse.cs: Use DateTime.UtcNow instead of DateTime.MinValue in
  Update(double,double,double) to match Beta/Covariance pattern
- Bump version to 0.8.5
2026-03-11 20:54:16 -07:00
Miha Kralj b9783f7c03 docs: sweep all indicator references — fix paths, add missing entries, sort alphabetically
_sidebar.md:
- Fix 4 wrong DI/DM paths (minus_di→minusdi, minus_dm→minusdm, plus_di→plusdi, plus_dm→plusdm)
- Sort Dynamics section alphabetically
- Add DECAY and EDECAY to Numerics section

lib/dynamics/_index.md:
- Fix HT_TRENDMODE link (Httrendmode.md→HtTrendmode.md)
- Sort all 25 indicators alphabetically

lib/core/_index.md:
- Sort all 8 indicators alphabetically (HA was out of order)

docs/indicators.md:
- FIR: Replace with all 33 entries sorted
- IIR: Replace with all 36 entries sorted
- Filters: Add SAK (now 37 entries)
- Oscillators: Add 17 missing (BBI, BRAR, COPPOCK, CRSI, CTI, DOSC, ER, ERI, FI, KRI, KST, MSTOCH, PSL, QQE, RVGI, SQUEEZE, TD_SEQ) — now 48 entries
- Dynamics: Sort all 25 entries alphabetically
- Statistics: Add POLYFIT, TRIM, WAVG, WINS — now 35 entries sorted
- Numerics: Add FFT, IFFT — now 31 entries sorted
- Core: Add HA — now 8 entries sorted

Total: 402 indicators across 16 categories, all cross-referenced.
2026-03-11 20:36:36 -07:00
Miha Kralj 33d20f2a18 feat(dynamics): add PlusDI, MinusDI, PlusDM, MinusDM indicators
Complete thin Dx-composition wrapper indicators with full test coverage:

- PlusDi/MinusDi: Directional Indicator wrappers (DiPlus/DiMinus from Dx)
- PlusDm/MinusDm: Directional Movement wrappers (DmPlus/DmMinus from Dx)
- Individual validation tests per indicator directory (TALib, Skender, bounds)
- Combined unit tests (DiDm.Tests.cs) and validation tests (DiDm.Validation.Tests.cs)
- Quantower wrappers + tests for all 4 indicators
- PineScript v6 implementations with compensated RMA
- Normalized .md documentation for all indicators and categories
- 182 tests passing, 0 failures
2026-03-11 20:21:52 -07:00
Miha Kralj 56b86bebfb fix: use matched[1] for route capture group to prevent duplicated path in .pine fetch 2026-03-11 18:41:17 -07:00
Miha Kralj b048786547 fix: use docsify routes config for .pine files to prevent 404
Replace beforeEach hook with docsify's routes config that intercepts
.pine URL patterns before docsify attempts to fetch them as .md files.
The route handler fetches the actual .pine file and wraps it in a
markdown code fence, giving each .pine file a unique URL hash.
2026-03-11 18:39:40 -07:00
Miha Kralj c1abea0857 docs: give .pine files their own URL hash via docsify beforeEach hook
Replace manual click-interception plugin with a clean beforeEach hook
that detects .pine routes and wraps raw content in markdown code fences.
This gives each .pine file its own unique URL (e.g. #/lib/.../atr.pine),
supports direct linking, bookmarks, and browser back/forward navigation.
2026-03-11 18:34:58 -07:00
Miha Kralj 19f956521d docs: add PineScript links to all indicator .md files, docsify .pine renderer with comprehensive Prism v6 syntax highlighting
- Added PineScript row to property tables in 375 .md files linking to companion .pine files
- Docsify plugin intercepts .pine link clicks, fetches and renders content as syntax-highlighted code blocks
- Comprehensive Prism.languages.pine grammar covering 18 token categories: annotations, types, qualifiers, namespaces, OHLCV builtins, functions, keywords, operators
- Custom CSS tokens using GitHub dark palette for Pine-specific visual differentiation
2026-03-11 15:36:23 -07:00
codefactor-io 567fa89465 [CodeFactor] Apply fixes to commit 4a01f03 2026-03-11 03:35:12 +00:00
Miha Kralj 4a01f03cb4 Merge branch 'dev' 2026-03-10 20:34:18 -07:00
Miha Kralj 7ec79538aa refactor: move Decay/Edecay from trends_IIR to numerics; update filter signatures
- Move lib/trends_IIR/decay/ → lib/numerics/decay/
- Move lib/trends_IIR/edecay/ → lib/numerics/edecay/
- Update Category in Decay.md/Edecay.md from Trends (IIR) to Numerics
- Add DECAY/EDECAY entries to lib/numerics/_index.md and docs/indicators.md
- Update filter signature .md files and .svg assets
- Update trends_IIR signature docs (htit, mama, holt, etc.)
- All 163 tests passing, 0 warnings, 0 errors
2026-03-10 20:33:55 -07:00
Miha Kralj 35a6702b06 fix(docs): correct .md documentation across errors, dynamics, filters, forecasts, momentum, numerics, oscillators, reversals, statistics, trends, volatility, volume
Deep review of all indicator categories verified .md headers against .cs WarmupPeriod, parameters, inputs, and outputs. Fixes include warmup corrections, parameter documentation, output type accuracy, and Pine Script alignment.
2026-03-10 18:38:23 -07:00
Miha Kralj 8906c62dcf fix(docs): correct warmup values in cycles/channels .md files
Cycles:
- ebsw: warmup 1 bar → Math.Max(hpLength, ssfLength) + 3 (default 43)
- homod: warmup 1 bar → maxPeriod * 2 (default 100)

Channels:
- apchannel: warmup 1 bar → ⌈3/alpha⌉ (default 15); params None → alpha; outputs Single → Multiple
- jbands: warmup 1 bar → ⌈20 + 80 × period^0.36⌉
- uchannel: warmup 1 bar → Math.Max(strPeriod, centerPeriod)"
2026-03-10 18:37:19 -07:00
Miha Kralj 031f1b5fe6 feat: add new indicators (Decay, Edecay, MinusDi, MinusDm, PlusDi, PlusDm, Maxindex, Minindex, Sarext) and update pine scripts, core libs, validation tests, and python bindings 2026-03-09 13:45:46 -07:00
Miha Kralj 8e43d62cbb fix: move Roslyn SARIF upload from Sonar_Analysis to ReSharper_Analysis
SonarScanner wrapper overrides ErrorLog MSBuild property, preventing
Roslyn SARIF generation. ReSharper_Analysis already builds without
SonarScanner wrapping, so ErrorLog works correctly there.
development
2026-03-04 17:54:25 -08:00
Miha Kralj 4b3d4d188c Merge dev into main v0.8.4 2026-03-04 15:56:50 -08:00
Miha Kralj 935a5ab26c fix(python): align QtlEacp export params with Eacp.Batch signature
The NativeAOT export had stale parameter names (period, minPeriod,
maxPeriod, useMedian) from an older API. Renamed to match the actual
Eacp.Batch(minPeriod, maxPeriod, avgLength, enhance) signature.
ABI preserved — same 7 params, same types, no Python-side changes needed.
2026-03-04 11:59:42 -08:00
Miha Kralj 0d85d820cd suppress S1192 in Directory.Build.props NoWarn for build-time silence 2026-03-04 10:31:31 -08:00
Miha Kralj 37eea8761b suppress S1192: guard clause exception messages are inline by convention 2026-03-04 10:29:51 -08:00
Miha Kralj ef330e527c fix: target quantalib.csproj instead of .slnx for inspectcode
Analysis of full .slnx (800+ files across 5 projects) still times out
even with --no-build. Target lib/quantalib.csproj directly to scope
analysis to the main library (~400 files). Consistent with proven
local inspectcode approach.
2026-03-04 10:03:50 -08:00
Miha Kralj 0868f20820 refactor: use --include=**.cs instead of --exclude for inspectcode
Per JetBrains docs, --exclude only filters report output, not scanning.
Switch to --include="**/*.cs" for cleaner SARIF with only C# results.
2026-03-04 10:01:37 -08:00
Miha Kralj 92ccb7e53a fix: resolve ReSharper InspectCode CI timeout
- Pre-build solution before inspectcode to avoid redundant 4-min internal build
- Add --no-build flag to jb inspectcode
- Add --exclude patterns for bin/obj/TestResults and binary artifacts
- Bump timeout-minutes from 15 to 20 as safety margin
2026-03-04 09:52:09 -08:00
Miha Kralj f192b6d014 merge: bump version to 0.8.4 2026-03-04 08:50:31 -08:00
Miha Kralj 4f22062f78 chore: bump version to 0.8.4 2026-03-04 08:50:29 -08:00
Miha Kralj 9e8af76de1 merge: move sonar-suppressions.json to .github/ 2026-03-04 08:49:12 -08:00
Miha Kralj 0d94b4df52 refactor: move sonar-suppressions.json to .github/ directory
Keeps CI config files consolidated under .github/.
Updated Publish.yml references accordingly.
2026-03-04 08:49:10 -08:00
Miha Kralj fc45768f66 merge: restore sonar-suppressions.json for CI fix 2026-03-04 08:40:15 -08:00
Miha Kralj 7e72b0760e fix: restore sonar-suppressions.json for CI pipeline
File was accidentally deleted in repo cleanup (1910fdca).
Required by Codacy_Rule_Sync and Sonar_Analysis jobs.
2026-03-04 08:40:07 -08:00
Miha Kralj 6ae79525f6 merge: dev into main - license docs, Python/PineScript guides, API updates 2026-03-03 22:12:25 -08:00
Miha Kralj 56602c725d docs: fix README formatting 2026-03-03 22:12:23 -08:00
Miha Kralj f10baa6dfb docs: add license rationale, Python/PineScript guides, API updates
- Add docs/license.md with Apache 2.0 rationale and patent protection analysis
- Add docs/python.md and docs/pinescript.md platform guides
- Expand README license section with disclosure and link to rationale
- Update docs/api.md and docs/architecture.md
- Update Python bindings: helpers, all indicator modules, pyproject.toml
- Add Python tests for Arrow and Polars integration
- Update TValue core type and documentation
- Add fix_length_to_period tooling script
2026-03-03 22:11:35 -08:00
Miha Kralj 9d8cd22ae6 fix: add environment 'pypi' to Publish_Package job for trusted publishing
PyPI trusted publisher OIDC token exchange failed because the workflow
job did not declare a GitHub environment. PyPI's trusted publisher config
requires environment claim to match. Added environment: pypi to the
Publish_Package job in Release.yml.
v0.8.2
2026-03-03 13:15:48 -08:00
Miha Kralj 6f4e083811 fix: add environment 'pypi' to Publish_Package job for trusted publishing
PyPI trusted publisher OIDC token exchange failed because the workflow
job did not declare a GitHub environment. PyPI's trusted publisher config
requires environment claim to match. Added environment: pypi to the
Publish_Package job in Release.yml.
2026-03-03 13:15:17 -08:00
codefactor-io 5957ef065c [CodeFactor] Apply fixes to commit 7737098 2026-03-03 20:43:16 +00:00