# Indicator Go: A Channel-Based Technical Analysis Library for Go

> Indicator Go is a Go module with 80+ technical indicators, a backtesting framework, and MCP support for AI tools. Its channel-based design and AGPL license shape who should adopt it.

**cinar/indicator** — Indicator Go delivers a rich set of technical analysis indicators, customizable strategies, and a powerful backtesting framework. No dependencies, just pure simplicity. ✨ See how! 👀

- Repository: https://github.com/cinar/indicator
- Stars: 1,899 · Forks: 283
- Language: Go
- License: AGPL-3.0
- Published: 2026-08-22 · Updated: 2026-08-22 · Language: en
- Canonical page: https://hysenlabs.com/projects/cinar-indicator

## What Indicator Go Solves for Go Developers

Most technical analysis libraries target Python or JavaScript. Go developers often end up writing their own moving averages or RSI implementations, which is error-prone and time-consuming. Indicator Go addresses this by providing a single module with over 80 indicators, covering trend, momentum, and volatility categories. The intended user is a Go developer building an algorithmic trading system, a research tool, or a backtesting environment. The library also includes a backtesting framework and real-time strategy execution, so you can move from indicator calculation to strategy testing without switching languages. The README positions it as a comprehensive toolkit, and the v2 rewrite emphasizes code quality with a stated goal of at least 90% test coverage.

## Channel-Based Data Flow: The Core Design Choice

The most distinctive architectural decision in v2 is that every indicator and strategy operates on Go channels for both input and output. This is a streaming model: you feed price data into a channel, and the indicator emits results as they are computed. This differs from the more common slice-based approach where you pass an array and get an array back. The README acknowledges that this may not suit everyone and provides helper functions like helper.SliceToChan and helper.ChanToSlice for conversion. The v1 version remains available for those who prefer the old API. This design favors real-time processing where data arrives incrementally, but it adds overhead if you only need to compute an indicator on a static dataset. The channel model also aligns with Go's concurrency idioms, making it natural to pipe indicators together in a data pipeline.

## Getting Started: Commands and Configuration

The README does not include explicit installation commands, but as a Go module, you would fetch it with go get github.com/cinar/indicator/v2. The package is importable per subpackage, such as trend for moving averages or momentum for RSI. Each indicator and strategy is configurable with no preset values, meaning you must supply parameters like period lengths. For example, to compute an SMA, you would create an SMA instance with a window size and feed it a channel of floats. The helper package provides SliceToChan and ChanToSlice to bridge between slices and channels. The MCP support is integrated, but the README does not detail the exact server startup command or configuration keys. You would need to inspect the repository's source or documentation for that.

## Backtesting and Strategy Execution

Beyond indicators, Indicator Go includes a backtesting framework and support for real-time strategy execution. This means you can define a strategy using the library's primitives, run it against historical data to evaluate performance, and then potentially deploy it in a live environment. The README mentions this as a core feature, but it does not describe the strategy API or how to define entry and exit rules. The fact that strategies are also channel-based suggests that backtesting is event-driven, processing bars as they arrive. This is a different model from vectorized backtesting, where you compute all signals at once. The trade-off is that channel-based backtesting may be slower for large datasets but more faithful to real-time behavior. The repository includes dedicated test data in CSV format for each indicator and strategy, which is useful for validating your own implementations.

## Where the Library Falls Short

The most obvious limitation is the AGPL-3.0 license. If you are building a proprietary trading system, this license imposes strong copyleft obligations that may be unacceptable. The README includes a risk disclosure and disclaimer, stating the software is provided AS IS, but that does not address licensing. Another limitation is the lack of built-in data sources. The library computes indicators from channels you provide, but it does not fetch market data from exchanges or APIs. You must handle data ingestion yourself. The channel-based API is also a barrier: if you are used to calling sma(prices, 20) and getting a slice back, you need to adapt. The README suggests v1 for slice-based users, but v1 is an older version that may lack the v2 improvements. Finally, the MCP support is mentioned but not documented in the README excerpt, so its setup and capabilities are unclear.

## Alternative: Indicator TS and Other Libraries

The author also maintains Indicator TS, a TypeScript version of the same module. This is a direct alternative if you work in a JavaScript or TypeScript environment. The approach is identical in design, but the language differs, so you would use it in Node.js or a browser. For Go specifically, other libraries exist, but none are named in the README. The key difference with Indicator TS is the language ecosystem: TypeScript integrates naturally with web-based charting libraries and front-end dashboards, while Go is better suited for backend services and high-concurrency processing. If you need a permissive license or a slice-based API, you might consider other open-source libraries like ta-lib, but they are not Go-native. The choice often comes down to your deployment target and licensing constraints.

## Maintenance and Upgrade Considerations

The repository is active, with recent releases in August 2026, including v2.1.37. This suggests ongoing maintenance. The v2 rewrite was a major change, and the author provides a v1 branch for backward compatibility. When upgrading from v1 to v2, you must adapt to the channel-based API, which is not a drop-in replacement. The README states that v2 achieves at least 90% code coverage, which is a positive sign for reliability, but it also warns that software can contain bugs. The AGPL license means that if you modify the library, you may need to release your modifications under the same license. There is no mention of a migration guide, so upgrading requires reading the source and documentation. The test data in CSV format is a useful resource for verifying that your code produces expected outputs after an upgrade.

## Conclusion

Adopt Indicator Go if you write trading logic in Go, need a wide indicator set with no preset values, and value streaming data via channels. Avoid it if you require a permissive license, prefer slice-based APIs, or need built-in data feeds and broker integrations. Before using it, verify that the channel-based model fits your data pipeline, confirm the AGPL-3.0 terms are acceptable for your use case, and check the MCP server's configuration if you plan AI integration.

## FAQ

### What does cinar/indicator provide to a Go developer?

A module with 80 or more technical analysis indicators, strategies and a backtesting framework, with no third party dependencies. The source declares the module as github.com/cinar/indicator/v2 with go 1.22, and go.mod carries no require block.

### How does the cinar/indicator v2 API pass data around?

Through Go channels for both inputs and outputs. helper.SliceToChan and helper.ChanToSlice convert for callers who prefer slices, and the v1 version of the library is still kept in the same repository.

### What does the cinar/indicator container image build?

Two binaries, indicator-sync and indicator-backtest, from the cmd directories, in a multi-stage build from golang:1.22-alpine to alpine:3.19. It runs as a non-root indicator user with docker-entrypoint.sh as its entry point.

### Which license does cinar/indicator use?

AGPL-3.0, stored in a file named LICENSE.md. The Dockerfile carries the same AGPLv3 notice in its header with a 2021 to 2026 copyright range.

### What do the disclaimers in the cinar/indicator documentation cover?

Five numbered clauses: educational and research use only, non advisory and non fiduciary status with no SEC, CFTC or FINRA registration, substantial loss and leverage risk, a CFTC Rule 4.41 style disclosure on hypothetical and backtested performance, and an AS IS liability limitation.

### Is there a TypeScript version of cinar/indicator?

Yes, maintained as a separate repository called Indicator TS. It shares the project name and strategy concepts with the Go module but is a separate codebase.

## Sources

- [Official README](https://github.com/cinar/indicator#readme)
- [Project repository](https://github.com/cinar/indicator)
- [Release notes](https://github.com/cinar/indicator/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/cinar-indicator
