Standard indicators library for the Coinrule X execution platform
Project description
Coinrule X Indicators
Standard library of trading indicators for the Coinrule X execution platform.
Installation
pip install crx-indicators
Usage Patterns
Coinrule X Indicators supports two main calculation patterns depending on your environment:
1. Stateless (Batch) Calculation
Ideal for backtesting or one-off analysis where you have a full history of candles.
indicator = RSI(period=14)
result = indicator.calculate(candles) # Processes entire history
2. Stateful (Incremental) Calculation
Optimized for live trading and minimized latency. Instead of recalculating the entire history on every tick, the indicator maintains internal state and updates in $O(1)$ time.
# Initialization (typically on startup)
indicator = RSI(period=14)
indicator.seed(historical_candles)
# Live update (on every new closed candle)
latest_value = indicator.update(new_candle)
Structure
Indicators are located in the coinrule_x_indicators/indicators directory.
Each indicator implements the standard interface CandleIndicator defined in coinrule_x_indicators.core.
Contributing
We welcome contributions of new indicators! Please follow these guidelines to ensure consistency and quality.
Adding a New Indicator
-
Create the Indicator File: Create a new file in
coinrule_x_indicators/indicators/(e.g.,ema.py). -
Implement the Class: Inherit from the
CandleIndicatorbase class and implement both thecalculate(stateless) andupdate(stateful) methods.from coinrule_x_indicators.core import CandleIndicator, Candle from typing import List, Union class EMA(CandleIndicator): def __init__(self, period: int = 8): self.period = period self.alpha = 2.0 / (period + 1.0) super().__init__(period=period) def calculate(self, candles: List[Candle]) -> float: # Batch implementation (e.g., using pandas) pass def update(self, candle: Candle) -> float: # Incremental implementation (O(1) update) # Update self._value and return it pass
-
Register the Indicator: Add your new class to
coinrule_x_indicators/indicators/__init__.pyto export it. -
Update Registry: Add your indicator to
coinrule_x_indicators/registry.yaml. This is used by the Coinrule X platform to discover available indicators.ema: latest: "1.0.0" versions: "1.0.0": class: "coinrule_x_indicators.indicators.ema.EMA" label: "EMA" description: "Exponential Moving Average" arguments: period: type: int default: 8 label: "Period" description: "Number of periods for EMA calculation"
-
Validate Registry: Ensure your registry entry is valid before submitting:
# Run validation script poetry run python coinrule_x_indicators/validation.py coinrule_x_indicators/registry.yaml
Versioning & Immutability Policy
To guarantee strategy reproducibility, Coinrule X Indicators follows a strict Add-Only policy for breaking changes. Strategies written today must produce the exact same signals 5 years from now.
1. Immutable Logic
Once an indicator version (e.g., ema v1.0.0) is published and used, its calculation logic MUST NOT change.
- Bug Fixes: Critical bugs in logic require a Patch version (e.g., v1.0.1).
- New Features: New arguments or logic require a New Version (e.g., v1.1.0 or v2.0.0).
2. Creating New Versions
If you need to change the behavior of an indicator:
- Do NOT edit definitions of existing released classes.
- Create a New Class: e.g.,
class EMAv2(Indicator). - Register New Version: Add the new version to
registry.yamlalongside the old one.
Example registry.yaml structure for multi-version support:
ema:
latest: "2.0.0"
label: "EMA"
versions:
"1.0.0":
class: "coinrule_x_indicators.indicators.ema.EMA"
description: "Standard Exponential Moving Average"
"2.0.0":
class: "coinrule_x_indicators.indicators.ema_v2.EMAv2"
description: "EMA with adjustable smoothing factor"
arguments:
period: { label: "Period", type: int, default: 14 }
smoothing: { label: "Smoothing", type: float, default: 2.0 }
3. Deprecation
Old versions remain in the codebase indefinitely unless they pose a security risk. They can be marked as deprecated: true in the registry to warn developers against using them for new strategies, but existing strategies will continue to function.
Testing Guidelines
Every indicator must have a corresponding test file in the tests/ directory.
-
Create Test File: Create
tests/test_<indicator_name>.py(e.g.,tests/test_ema.py). -
Use Standard Data: Use the provided
load_candlesutility to load the standardized test dataset (tests/data/candles.json). This dataset contains HYPE 1h candles, with the latest candle starting at 24 Dec 2025 15:00 UTC. This ensures all indicators are tested against the same market conditions.from tests.utils import load_candles from coinrule_x_indicators.indicators.ema import EMA def test_ema_calculation(): candles = load_candles("candles.json") ema = EMA(period=8) result = ema.calculate(candles) # Verify result against known valid value (e.g. from TradingView or known lib) assert round(result, 2) == <EXPECTED_VALUE>
-
Required Test Cases:
- Initialization: Verify arguments are stored correctly.
- Batch Calculation: Verify that
calculate()correctly processes a list of candles. - Precise Value: A test asserting the exact value (to 2 decimal places) against the provided dataset.
- Incremental Consistency: Verify that
update()produces the same result ascalculate()when processing the same sequence of candles.
Running Tests
Run the test suite using pytest:
poetry run pytest
Submission Process
- Fork the Repository: Create a fork of the repository to your own GitHub account.
- Create a Feature Branch: Create a new branch for your changes (e.g.,
feat/add-rsi-indicator). - Implement & Test: Apply your changes and ensure all tests pass.
- Create Pull Request: Submit a pull request to the main repository.
Note: Version numbers and the official CHANGELOG will be updated by maintainers upon release.
Development Guidelines
- Type Hinting: All methods must be fully type-hinted.
- Pandas/Numpy: Use vectorized operations where possible for performance.
- Zero Dependencies: Do not add new external dependencies without prior discussion.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file crx_indicators-1.2.0.tar.gz.
File metadata
- Download URL: crx_indicators-1.2.0.tar.gz
- Upload date:
- Size: 16.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.4.1 CPython/3.10.20 Linux/6.17.0-1010-azure
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a82d751068149afa0b8c42d0959da19a5888a5352332f088fb5dace42448fa64
|
|
| MD5 |
c94d13500e1c877ae144976e01e763fb
|
|
| BLAKE2b-256 |
f8c73bacb50d621a4a93469e2417a6067628b7b3ad807f645e1cff863bd51f5b
|
File details
Details for the file crx_indicators-1.2.0-py3-none-any.whl.
File metadata
- Download URL: crx_indicators-1.2.0-py3-none-any.whl
- Upload date:
- Size: 24.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.4.1 CPython/3.10.20 Linux/6.17.0-1010-azure
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3aecdc09b40af59704147a7d9de1f5ece19d100ae83b9aac54a0a7516efe09d5
|
|
| MD5 |
439c0fc3e9522ac3f326a065b07f8f05
|
|
| BLAKE2b-256 |
5d1216800af652a4d1fcdbce56b85b36b8b3bff19d46694f822348dd16286e12
|