More than 80 indicators share a channel-first Go API
Indicator v2 covers trend, momentum, volatility, volume, and valuation calculations, then builds trading strategies over many of the same components. Inputs and outputs travel through typed Go channels. Generics allow several numeric types, and helper functions convert slices to channels and back. That model suits a service already consuming a stream of OHLCV snapshots, where each calculation can be connected to the next without inventing another event shape.
The catalog is genuinely broad. The README lists more than 80 indicators, from common moving averages and RSI to KST, Ichimoku Cloud, Ulcer Index, and volume-flow measures. Strategy packages add crossovers, compound decisions, stop-loss decoration, and buy-and-hold. Breadth raises the verification burden, though. A familiar indicator name does not prove identical warm-up periods, zero handling, or output alignment with another charting package. Compare the exact series your application relies on.
What happened when we ran it
Our sandbox installed 1 package in 11 seconds and built commit 35bd387 in 26 seconds. The test step completed in 13 seconds: Go reported 30 passed and 0 failed out of 30. The repository occupied 2.5 MB at checkout and contained 685 files with about 35,485 source lines. This was the cleanest result among the four projects in this review batch.
The scan found 4 CI workflow files and a Dockerfile. There was no separate tests directory because Go tests sit next to implementation files throughout packages such as helper, momentum, strategy, and backtest. Our passing count reports the packages exercised by the supplied lab command. It does not establish indicator accuracy against every vendor, profitable strategies, market-data quality, or trading performance, none of which we benchmarked in the sandbox.
Backtests produce reports, not evidence of a profitable system
Indicator includes file-system, memory, SQL, and Tiingo-backed asset repositories. Its sync command can pull snapshots into local storage, while the backtest command applies registered strategies and writes an HTML report. Docker packages both binaries and runs as a non-root indicator user. The documented container example requests 365 days of data, mounts an output directory, and requires a Tiingo API key.
The project itself warns that historical indicators do not guarantee future results. Its public backtest documentation describes actions, outcomes, workers, date ranges, and HTML output, but it does not document brokerage fills, commissions, slippage, spread, or corporate-action handling. If those factors matter to your decision, put them in an execution-aware layer and test them there. Treat the built-in report as research output, not a broker simulator or a reason to risk capital.
MCP exposes 1 backtest tool, not the whole catalog
The MCP module uses mark3labs/mcp-go and registers one tool named backtest. A call supplies a strategy name plus arrays for date, open, close, high, low, and volume. The result contains numeric buy, hold, and sell actions plus an outcome. The server's strategy factory includes a useful subset across trend, momentum, volume, and buy-and-hold categories, but it does not let an agent request an arbitrary named indicator.
Open issue 415 describes that limit precisely and proposes a name-based registry shared by a future indicator CLI and MCP. Issue 399 records another boundary: the MCP directory is its own Go module, was pinned to Indicator v2.1.12 at commit 35bd387, and was outside the root lint, test, and formatting tasks. The root release was v2.1.37, so an MCP user should test that module separately rather than assuming the root's 30 passing results cover it.
Channel streams cost more ceremony for batch arrays
The v2 rewrite makes channel composition the default even when all prices are already resident in memory. Slice conversion helpers make that usable, but they still introduce goroutines, scheduling, and channel handoffs. Open issue 371 asks for stateful Next and direct ComputeSlice methods for batch processing, specifically citing allocation and context-switch costs. No accepted project benchmark in our evidence quantifies that cost, so workload testing is the right way to decide.
Channels also bring cancellation and closure duties. Release v2.1.37 fixed an Aroon goroutine leak on cancellation and output channels that failed to close or dropped most values in STC, T3, and Fisher paths. The same release enabled the race detector and corrected races in reports and asset sync. Those fixes show active maintenance. They also tell reviewers to keep cancellation, short inputs, integer types, and concurrent reports in their own regression suite.
Version 2.1.37 is active, with 36 open issues
GitHub recorded the last push and v2.1.37 release on August 24, 2026. The repository had 1,556 stars, 239 forks, 36 open issues, and 2 open pull requests when fetched. Release notes cover divide-by-zero, floating-point drift, NaN and infinity persistence, concurrency, and documentation corrections. That is substantive maintenance rather than a cosmetic tag, though several of the fixed behaviors affect the numbers a trading application consumes.
AGPL-3.0 is the final fit check. Teams comfortable sharing covered modifications under its terms get a large native-Go catalog, a Docker backtest route, and an MCP starting point. Teams needing MIT or BSD dependencies should choose another library before integration. For everyone else, our 13-second passing test run earns Indicator a trial, followed by reference-series comparisons for every indicator and strategy that can influence money.

