A pure engine, a data layer, and an Android shell
engine
pure Kotlin/JVM · 263 tests
Indicators, the trend template, RS, the bases, PAVA, overhead supply, the regime state machine, score, verdict, stops, sizing, the paper portfolio's sell rules, the backtest, the heat map layout. It has no Android imports, so it runs and is tested on the JVM.
marketdata
pure Kotlin/JVM · 67 tests
Data sources behind one interface, the symbol catalog, the nightly scan service, the cache refresh, SEC EDGAR's filings and the macro panel's sources.
learn
pure Kotlin/JVM
The course: 85 lessons in Markdown, links from lessons into the app, progress, tests and card review.
app
Android · Compose
Jetpack Compose with Material 3 and fixed brand colours, Room (schema v7) for the cache, lists, alerts and the paper portfolio, WorkManager for the nightly scan, manual dependency injection instead of Hilt, and Lightweight Charts in a WebView.
Data, all free
Daily bars from Yahoo's chart endpoint by default; US companies' filings and earnings dates from SEC EDGAR; macro figures from the ECB, the BLS, the US Treasury and the New York Fed. None of it needs a key or a subscription.
What this web demo ports
engine.js reproduces the Analyzer (H1-H6, B1-B5, score, plan), the four bases, PAVA with its weekly variant, overhead supply, the RS line, the regime state machine, the "what is missing" texts, the automatic lists, sizing and the squarified treemap. The tests in site/tests/la-pina.test.mjs run the Kotlin fixtures and get the same verdicts. The price series come from a bit-for-bit port of java.util.Random, the generator the app's screenshot tool uses.
Left out: gold, silver and bitcoin's adapted rules, the chart-pattern detector (flat bases from ranges and the B7 bearish-pattern block), the fundamentals layer, trading costs and the full backtest. Those stay in the app.
Notes
- La Piña is a learning tool. It places no orders and connects to no broker. The user decides and carries the risk.
- Until a setup has an out-of-sample test, the backtest labels it "Muestra insuficiente" against its index and shows the SPIVA base rate beside it.
- The method's defaults come from its written specification, and the code marks them as adjustable settings.
- The companies, prices and trades on this page are all simulated.