Contributing guidelines
Thanks for taking the time to contribute!
This project is simpler than most, so it’s a good place to start contributing to the open source community, even if you’re a newbie.
We are accepting these sorts of changes and requests:
- Bug reports and fixes
- Usability improvements
- Documentation updates
- New reputable “by the book” indicators and overlays
We are not accepting things that should be done in your own wrapper code:
- Personal customizations and preferences
- Modified or augmented outputs that are not intrinsic
If you have general interest in contributing, but are not sure where to start, please contact us and we can help to find work in an area of interest.
Reporting bugs and feature requests
If you suspect a problem, please report a bug Issue with a detailed description of the problem, steps to reproduce, code samples, and any reference materials. For enhancements, create a feature Issue.
Use the Discussions area for general ideation and help/usage questions.
Project management
- Planned work is managed in the backlog.
- Work items are primarily entered as Notes (not Issues), except where an issue or feature is user reported. With that said, Notes can be converted to Issues if in-progress and collaborative discussion is needed.
Developing
- Read this first: A Step by Step Guide to Making Your First GitHub Contribution. I also have a discussion on Forking if you have questions.
- If you want to work on something specific, please mention your intention on the related Issue. If an Issue does not exist for your contribution, please create one before starting. This will help us reserve that feature and avoid duplicative efforts.
- If you are adding a new indicator, the easiest way to do this is to copy the folder of an existing indicator and rename everything using the same naming conventions and taxonomy. All new indicators should include tests.
- Do not commingle multiple contributions on different topics. Please keep changes small and separate.
Testing
- Review the
tests/indicatorsfolder for examples of unit tests. Just copy one of these. - New indicators should be tested against manually calculated, proven, accurate results. It is helpful to include your manual calculations spreadsheet in the appropriate indicator test folder when submitting changes.
- Historical Stock Quotes are automatically added to unit test methods. A
Data.Quotes.xlsxExcel file is included in thetests/_commonfolder that is an exact copy of what is used in the unit tests. Use a copy of this file for your manual calculations to ensure that it is correct. Do not commit changes to the original file. - We expect all unit tests to execute successfully and all Errors and Warning resolved before you submit your code.
- Failed builds or unit testing will block acceptance of your Pull Request when submitting changes.
Performance benchmarking
Running the performance benchmark application in Release mode will produce benchmark performance data that we include on our documentation site.
# from /tests/performance folder
# run all performance benchmarks
dotnet run -c Release
# run individual performance benchmark
dotnet run -c Release --filter *.GetAdx
Documentation
This site uses Jekyll construction with Front Matter. Our documentation site code is in the docs folder. Build the site locally to test that it works properly. See Ruby Jekyll documentation for initial setup.
# from /docs folder
bundle install
bundle exec jekyll serve --livereload
The site will be available at http://127.0.0.1:4000.
When adding or updating indicators:
- Add or update the
/docs/_indicators/documentation files. - Page image assets go here:
/docs/assets/and can be optimized towebpformat using ImageMagick or the cwebp Encoder CLI and a command likecwebp -resize 832 0 -q 100 examples.png -o examples-832.webp
Accessibility testing
- use Lighthouse in Chrome, or
- build the site locally (see above), then:
# from /docs folder
npx pa11y-ci \
--yes
--sitemap http://127.0.0.1:4000/sitemap.xml \
--config ./.pa11yci
Submitting changes
By submitting changes to this repo you are also acknowledging and agree to the terms in both the Developer Certificate of Origin (DCO) 1.1 and the Apache 2.0 license. These are standard open-source terms and conditions.
When ready, submit a Pull Request with a clear description of what you’ve done and why it’s important.
Pull Request naming convention
Pull Request titles must follow the Conventional Commits format: type: Subject where:
typeis one of: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert (lowercase)Subjectstarts with an uppercase letter
Examples: feat: Add RSI indicator, fix: Resolve calculation error in MACD, docs: Update API documentation
Always write a clear log message for your commits. One-line messages are fine for most changes.
After a Pull Request is reviewed, accepted, and [squash] merged to the default branch, we may batch changes before publishing a new package version to the public NuGet repository. Please be patient with turnaround time.
Code reviews and administration
If you want to contribute administratively, do code reviews, or provide general user support, we’re also currently seeking a few core people to help. Please contact us if interested.
Standards and design guidelines
- Guiding principles for this project
- .NET Design Guidelines
- NuGet Best Practices
- Semantic Version 2.0
GitHub Copilot and AI development
This repository is optimized for GitHub Copilot and coding agents with:
- Custom agent instructions in
AGENTS.mdfiles (root and subdirectories) providing repository context, coding patterns, and domain knowledge - Scoped instruction files in
.github/instructions/for targeted guidance by file type and folder - Enhanced VS Code settings in
.vscode/settings.jsonwith Copilot-specific configurations for optimal suggestions - Development container in
.devcontainer/devcontainer.jsonfor consistent development environment setup - MCP server configurations in
.vscode/mcp.jsonfor extended AI tools for developing capabilities with financial mathematics and .NET performance analysis
When using GitHub Copilot:
- Follow the established patterns documented in the AGENTS.md files and instruction files
- Ensure all financial calculations maintain decimal precision
- Include comprehensive unit tests for any new indicators
- Validate mathematical accuracy against reference implementations
Versioning
We use GitVersion for automated semantic versioning. Version numbers are automatically generated based on branch names, commit messages, and Git history.
| Component | Format | Description |
|---|---|---|
| Major | x.-.- | Breaking changes. Use +semver: major in commit message. |
| Minor | -.x.- | New features, backward compatible. Use +semver: minor in commit message. |
| Patch | -.-.x | Bug fixes, documentation. Use +semver: patch (or default auto-increment). |
| Suffix | -label.N | Pre-release identifier. Automatically set based on branch and build type. |
Branch-based versioning
GitVersion automatically determines version suffixes based on the branch:
- main branch: Produces
2.x.xversions- CI builds:
2.7.1-ci.345(includes build metadata) - Production:
2.7.1(no suffix)
- CI builds:
- v3 branch: Produces
3.x.x-preview.Nversions (always has preview suffix) - Feature branches:
x.x.x-{branch-name}.N(branch name becomes suffix)
Controlling version increments
Add semver tags to PR merge commit messages to control version bumps:
+semver: major→ increments major version (breaking changes)+semver: minor→ increments minor version (new features)+semver: patch→ increments patch version (bug fixes, default behavior)+semver: none→ no version increment
Example merge commit: feat: Add new indicator (+semver: minor)
Creating preview releases from stable branches
To publish a preview/pre-release version from main or v2 (normally stable branches), create a Git tag with the desired suffix before triggering deployment:
# Create preview tag
git tag 2.8.0-preview.1
git push origin 2.8.0-preview.1
# Then trigger manual workflow deployment with preview=true
GitVersion will honor the tag’s pre-release suffix. This approach works for any pre-release label (preview, rc, beta, alpha).
Package deployment and tagging
Packages are deployed via two separate GitHub Actions workflows:
CI Package deploy (automatic)
Trigger: Push to main or v* branches
- Published to GitHub Packages only
- Version format:
{Major}.{Minor}.{Patch}-ci.{run_number} - Examples:
2.7.2-ci.1234,3.0.0-ci.567 - Idempotent: Each commit gets unique incrementing run number
- No Git tags created
Workflow: .github/workflows/deploy-package-github.yml
Production package deploy (manual)
Trigger: Creating a GitHub Release
- Published to
nuget.orgonly - Version comes directly from release tag (strips ‘v’ prefix)
- Examples:
- Tag
2.8.0→ deploys2.8.0(stable) - Tag
3.0.0-preview.2→ deploys3.0.0-preview.2(preview)
- Tag
- Draft releases: Dry-run mode (build only, no deploy)
- Published releases: Full deployment to nuget.org
- Git tag already exists (from release creation)
Workflow: .github/workflows/deploy-package-nuget.yml
Version examples
| Scenario | Trigger | Version | Registry | Notes |
|---|---|---|---|---|
| CI build | Push to main | 2.7.2-ci.1234 | GitHub Packages | Run 1234 |
| CI build | Push to main | 2.7.2-ci.1235 | GitHub Packages | Run 1235 (next commit) |
| CI build | Push to v3 | 3.0.0-ci.567 | GitHub Packages | Run 567 |
| Production | Release tag 2.8.0 | 2.8.0 | nuget.org | Stable version |
| Production | Release tag 3.0.0-preview.2 | 3.0.0-preview.2 | nuget.org | Preview version |
| Draft release | Release tag 2.8.1 (draft) | 2.8.1 | None (dry-run) | Build only, no deploy |
For technical details, see:
- GitVersion configuration:
src/gitversion.yml - CI workflow:
deploy-package-github.yml - Production workflow:
deploy-package-nuget.yml
License
This repository uses a standard Apache 2.0 open-source license. It enables open-source community development by protecting the project and contributors from certain legal risks while allowing the widest range of uses, including in closed source software. Please review the license before using or contributing to the software.
Contact info
Start a new discussion or submit an issue if it is publicly relevant. You can also direct message @daveskender.
Thanks, Dave Skender