rangebar 11.6.1__cp313-cp313-macosx_11_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- rangebar/CLAUDE.md +327 -0
- rangebar/__init__.py +227 -0
- rangebar/__init__.pyi +1089 -0
- rangebar/_core.cpython-313-darwin.so +0 -0
- rangebar/checkpoint.py +472 -0
- rangebar/cli.py +298 -0
- rangebar/clickhouse/CLAUDE.md +139 -0
- rangebar/clickhouse/__init__.py +100 -0
- rangebar/clickhouse/bulk_operations.py +309 -0
- rangebar/clickhouse/cache.py +734 -0
- rangebar/clickhouse/client.py +121 -0
- rangebar/clickhouse/config.py +141 -0
- rangebar/clickhouse/mixin.py +120 -0
- rangebar/clickhouse/preflight.py +504 -0
- rangebar/clickhouse/query_operations.py +345 -0
- rangebar/clickhouse/schema.sql +187 -0
- rangebar/clickhouse/tunnel.py +222 -0
- rangebar/constants.py +288 -0
- rangebar/conversion.py +177 -0
- rangebar/exceptions.py +207 -0
- rangebar/exness.py +364 -0
- rangebar/hooks.py +311 -0
- rangebar/logging.py +171 -0
- rangebar/notify/__init__.py +15 -0
- rangebar/notify/pushover.py +155 -0
- rangebar/notify/telegram.py +271 -0
- rangebar/orchestration/__init__.py +20 -0
- rangebar/orchestration/count_bounded.py +797 -0
- rangebar/orchestration/helpers.py +412 -0
- rangebar/orchestration/models.py +76 -0
- rangebar/orchestration/precompute.py +498 -0
- rangebar/orchestration/range_bars.py +736 -0
- rangebar/orchestration/tick_fetcher.py +226 -0
- rangebar/ouroboros.py +454 -0
- rangebar/processors/__init__.py +22 -0
- rangebar/processors/api.py +383 -0
- rangebar/processors/core.py +522 -0
- rangebar/resource_guard.py +567 -0
- rangebar/storage/__init__.py +22 -0
- rangebar/storage/checksum_registry.py +218 -0
- rangebar/storage/parquet.py +728 -0
- rangebar/streaming.py +300 -0
- rangebar/validation/__init__.py +69 -0
- rangebar/validation/cache_staleness.py +277 -0
- rangebar/validation/continuity.py +664 -0
- rangebar/validation/gap_classification.py +294 -0
- rangebar/validation/post_storage.py +317 -0
- rangebar/validation/tier1.py +175 -0
- rangebar/validation/tier2.py +261 -0
- rangebar-11.6.1.dist-info/METADATA +308 -0
- rangebar-11.6.1.dist-info/RECORD +54 -0
- rangebar-11.6.1.dist-info/WHEEL +4 -0
- rangebar-11.6.1.dist-info/entry_points.txt +2 -0
- rangebar-11.6.1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: rangebar
|
|
3
|
+
Version: 11.6.1
|
|
4
|
+
Classifier: Development Status :: 4 - Beta
|
|
5
|
+
Classifier: Intended Audience :: Financial and Insurance Industry
|
|
6
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
7
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
8
|
+
Classifier: Programming Language :: Rust
|
|
9
|
+
Classifier: Topic :: Office/Business :: Financial :: Investment
|
|
10
|
+
Requires-Dist: pandas>=2.0
|
|
11
|
+
Requires-Dist: numpy>=1.24
|
|
12
|
+
Requires-Dist: polars>=1.0
|
|
13
|
+
Requires-Dist: pyarrow>=14.0
|
|
14
|
+
Requires-Dist: platformdirs>=4.0
|
|
15
|
+
Requires-Dist: clickhouse-connect>=0.8
|
|
16
|
+
Requires-Dist: arro3-core>=0.6.5
|
|
17
|
+
Requires-Dist: click>=8.0
|
|
18
|
+
Requires-Dist: requests>=2.28
|
|
19
|
+
Requires-Dist: loguru>=0.7.0
|
|
20
|
+
Requires-Dist: backtesting>=0.3 ; extra == 'backtesting'
|
|
21
|
+
Requires-Dist: pytest>=7.0 ; extra == 'dev'
|
|
22
|
+
Requires-Dist: pytest-benchmark>=4.0 ; extra == 'dev'
|
|
23
|
+
Requires-Dist: mypy>=1.0 ; extra == 'dev'
|
|
24
|
+
Requires-Dist: black>=23.0 ; extra == 'dev'
|
|
25
|
+
Requires-Dist: ruff>=0.1 ; extra == 'dev'
|
|
26
|
+
Provides-Extra: backtesting
|
|
27
|
+
Provides-Extra: dev
|
|
28
|
+
Provides-Extra: exness
|
|
29
|
+
License-File: LICENSE
|
|
30
|
+
Summary: Python bindings for rangebar: Non-lookahead range bar construction for cryptocurrency trading
|
|
31
|
+
Keywords: trading,cryptocurrency,range-bars,backtesting,technical-analysis
|
|
32
|
+
Author: Terry Li
|
|
33
|
+
License: MIT
|
|
34
|
+
Requires-Python: >=3.13
|
|
35
|
+
Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
|
|
36
|
+
Project-URL: Documentation, https://github.com/terrylica/rangebar-py#readme
|
|
37
|
+
Project-URL: Repository, https://github.com/terrylica/rangebar-py
|
|
38
|
+
Project-URL: Upstream (Rust), https://github.com/terrylica/rangebar
|
|
39
|
+
|
|
40
|
+
# rangebar-py
|
|
41
|
+
|
|
42
|
+
Python bindings for the [rangebar](https://github.com/terrylica/rangebar-py/tree/main/crates) Rust crates via PyO3/maturin.
|
|
43
|
+
|
|
44
|
+
[](https://pypi.org/project/rangebar/)
|
|
45
|
+
[](https://github.com/terrylica/rangebar-py/blob/main/LICENSE)
|
|
46
|
+
[](https://pypi.org/project/rangebar/)
|
|
47
|
+
|
|
48
|
+
## Links
|
|
49
|
+
|
|
50
|
+
| Resource | URL |
|
|
51
|
+
| --------------------- | ----------------------------------------------------------- |
|
|
52
|
+
| PyPI | <https://pypi.org/project/rangebar/> |
|
|
53
|
+
| Repository | <https://github.com/terrylica/rangebar-py> |
|
|
54
|
+
| Performance Dashboard | <https://terrylica.github.io/rangebar-py/> |
|
|
55
|
+
| Rust Crates | <https://github.com/terrylica/rangebar-py/tree/main/crates> |
|
|
56
|
+
| Issues | <https://github.com/terrylica/rangebar-py/issues> |
|
|
57
|
+
|
|
58
|
+
## Installation
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
pip install rangebar
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Pre-built wheels: Linux (x86_64), macOS (ARM64), Python 3.13
|
|
65
|
+
|
|
66
|
+
Source build requires Rust toolchain and maturin.
|
|
67
|
+
|
|
68
|
+
## Overview
|
|
69
|
+
|
|
70
|
+
Converts trade tick data into range bars for backtesting. Range bars close when price moves a fixed percentage from the opening price, adapting to market volatility rather than fixed time intervals.
|
|
71
|
+
|
|
72
|
+
**Output format**: pandas DataFrame with DatetimeIndex and OHLCV columns, compatible with [backtesting.py](https://github.com/kernc/backtesting.py).
|
|
73
|
+
|
|
74
|
+
## Quick Start
|
|
75
|
+
|
|
76
|
+
```python
|
|
77
|
+
from rangebar import get_range_bars
|
|
78
|
+
|
|
79
|
+
# Fetch data and generate range bars in one call
|
|
80
|
+
df = get_range_bars("BTCUSDT", "2024-01-01", "2024-06-30")
|
|
81
|
+
|
|
82
|
+
# Use with backtesting.py
|
|
83
|
+
from backtesting import Backtest, Strategy
|
|
84
|
+
bt = Backtest(df, MyStrategy, cash=10000, commission=0.0002)
|
|
85
|
+
stats = bt.run()
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## API Reference
|
|
89
|
+
|
|
90
|
+
### get_range_bars (Date-Bounded)
|
|
91
|
+
|
|
92
|
+
The entry point for date-bounded range bar generation with automatic data fetching and caching.
|
|
93
|
+
|
|
94
|
+
```python
|
|
95
|
+
from rangebar import get_range_bars
|
|
96
|
+
|
|
97
|
+
# Basic usage - Binance spot
|
|
98
|
+
df = get_range_bars("BTCUSDT", "2024-01-01", "2024-06-30")
|
|
99
|
+
|
|
100
|
+
# Using threshold presets
|
|
101
|
+
df = get_range_bars("BTCUSDT", "2024-01-01", "2024-03-31", threshold_decimal_bps="tight")
|
|
102
|
+
|
|
103
|
+
# Binance USD-M Futures
|
|
104
|
+
df = get_range_bars("BTCUSDT", "2024-01-01", "2024-03-31", market="futures-um")
|
|
105
|
+
|
|
106
|
+
# With microstructure data (vwap, buy_volume, sell_volume)
|
|
107
|
+
df = get_range_bars("BTCUSDT", "2024-01-01", "2024-01-31", include_microstructure=True)
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**Parameters**:
|
|
111
|
+
|
|
112
|
+
- `symbol`: Trading symbol (e.g., "BTCUSDT", "ETHUSDT")
|
|
113
|
+
- `start_date`: Start date in YYYY-MM-DD format
|
|
114
|
+
- `end_date`: End date in YYYY-MM-DD format
|
|
115
|
+
- `threshold_decimal_bps`: Threshold in decimal basis points or preset name (default: 250 = 25bps = 0.25%)
|
|
116
|
+
- `source`: Data source - "binance" or "exness" (default: "binance")
|
|
117
|
+
- `market`: Market type - "spot", "futures-um"/"um", "futures-cm"/"cm" (default: "spot")
|
|
118
|
+
- `include_microstructure`: Include vwap, buy_volume, sell_volume columns (default: False)
|
|
119
|
+
- `use_cache`: Cache tick data locally (default: True)
|
|
120
|
+
|
|
121
|
+
**Returns**: pandas DataFrame with DatetimeIndex and columns `Open`, `High`, `Low`, `Close`, `Volume`
|
|
122
|
+
|
|
123
|
+
### get_n_range_bars (Count-Bounded)
|
|
124
|
+
|
|
125
|
+
Get exactly N range bars - useful for ML training, walk-forward optimization, and consistent backtest comparisons.
|
|
126
|
+
|
|
127
|
+
```python
|
|
128
|
+
from rangebar import get_n_range_bars
|
|
129
|
+
|
|
130
|
+
# Get last 10,000 bars for ML training
|
|
131
|
+
df = get_n_range_bars("BTCUSDT", n_bars=10000)
|
|
132
|
+
assert len(df) == 10000
|
|
133
|
+
|
|
134
|
+
# Get 5,000 bars ending at specific date
|
|
135
|
+
df = get_n_range_bars("BTCUSDT", n_bars=5000, end_date="2024-06-01")
|
|
136
|
+
|
|
137
|
+
# With safety limit (won't fetch more than 30 days of data)
|
|
138
|
+
df = get_n_range_bars("BTCUSDT", n_bars=1000, max_lookback_days=30)
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
**Parameters**:
|
|
142
|
+
|
|
143
|
+
- `symbol`: Trading symbol (e.g., "BTCUSDT")
|
|
144
|
+
- `n_bars`: Number of bars to retrieve (must be > 0)
|
|
145
|
+
- `threshold_decimal_bps`: Threshold in decimal basis points or preset name (default: 250)
|
|
146
|
+
- `end_date`: End date (YYYY-MM-DD) or None for most recent data
|
|
147
|
+
- `source`: Data source - "binance" or "exness" (default: "binance")
|
|
148
|
+
- `market`: Market type (default: "spot")
|
|
149
|
+
- `use_cache`: Use ClickHouse cache (default: True)
|
|
150
|
+
- `fetch_if_missing`: Fetch data if cache doesn't have enough bars (default: True)
|
|
151
|
+
- `max_lookback_days`: Safety limit for data fetching (default: 90)
|
|
152
|
+
- `warn_if_fewer`: Emit warning if returning fewer bars than requested (default: True)
|
|
153
|
+
|
|
154
|
+
**Returns**: pandas DataFrame with exactly `n_bars` rows (or fewer if insufficient data), sorted chronologically
|
|
155
|
+
|
|
156
|
+
**Cache behavior**:
|
|
157
|
+
|
|
158
|
+
- **Fast path**: If ClickHouse cache has >= n_bars, returns immediately (~50ms)
|
|
159
|
+
- **Slow path**: Fetches additional data, computes bars, stores in cache
|
|
160
|
+
|
|
161
|
+
### Threshold Presets
|
|
162
|
+
|
|
163
|
+
Use string presets for common threshold values:
|
|
164
|
+
|
|
165
|
+
| Preset | Value | Percentage | Use Case |
|
|
166
|
+
| ------------ | ----- | ------------- | ---------------- |
|
|
167
|
+
| `"micro"` | 10 | 0.01% (1bps) | Scalping |
|
|
168
|
+
| `"tight"` | 50 | 0.05% (5bps) | Day trading |
|
|
169
|
+
| `"standard"` | 100 | 0.1% (10bps) | Swing trading |
|
|
170
|
+
| `"medium"` | 250 | 0.25% (25bps) | Default |
|
|
171
|
+
| `"wide"` | 500 | 0.5% (50bps) | Position trading |
|
|
172
|
+
| `"macro"` | 1000 | 1% (100bps) | Long-term |
|
|
173
|
+
|
|
174
|
+
```python
|
|
175
|
+
from rangebar import get_range_bars, THRESHOLD_PRESETS
|
|
176
|
+
|
|
177
|
+
# Using preset string
|
|
178
|
+
df = get_range_bars("BTCUSDT", "2024-01-01", "2024-01-31", threshold_decimal_bps="tight")
|
|
179
|
+
|
|
180
|
+
# Or numeric value
|
|
181
|
+
df = get_range_bars("BTCUSDT", "2024-01-01", "2024-01-31", threshold_decimal_bps=50)
|
|
182
|
+
|
|
183
|
+
# View all presets
|
|
184
|
+
print(THRESHOLD_PRESETS)
|
|
185
|
+
# {'micro': 10, 'tight': 50, 'standard': 100, 'medium': 250, 'wide': 500, 'macro': 1000}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Configuration Constants
|
|
189
|
+
|
|
190
|
+
```python
|
|
191
|
+
from rangebar import TIER1_SYMBOLS, THRESHOLD_PRESETS, THRESHOLD_DECIMAL_MIN, THRESHOLD_DECIMAL_MAX
|
|
192
|
+
|
|
193
|
+
# 18 high-liquidity symbols available on all Binance markets
|
|
194
|
+
print(TIER1_SYMBOLS)
|
|
195
|
+
# ('AAVE', 'ADA', 'AVAX', 'BCH', 'BNB', 'BTC', 'DOGE', 'ETH', 'FIL',
|
|
196
|
+
# 'LINK', 'LTC', 'NEAR', 'SOL', 'SUI', 'UNI', 'WIF', 'WLD', 'XRP')
|
|
197
|
+
|
|
198
|
+
# Valid threshold range
|
|
199
|
+
print(f"Min: {THRESHOLD_DECIMAL_MIN}, Max: {THRESHOLD_DECIMAL_MAX}")
|
|
200
|
+
# Min: 1, Max: 100000
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Advanced APIs
|
|
204
|
+
|
|
205
|
+
For users with existing tick data (not fetching from Binance):
|
|
206
|
+
|
|
207
|
+
#### process_trades_to_dataframe
|
|
208
|
+
|
|
209
|
+
```python
|
|
210
|
+
import pandas as pd
|
|
211
|
+
from rangebar import process_trades_to_dataframe
|
|
212
|
+
|
|
213
|
+
# Load your own trade data
|
|
214
|
+
trades = pd.read_csv("BTCUSDT-aggTrades.csv")
|
|
215
|
+
|
|
216
|
+
# Convert to range bars
|
|
217
|
+
df = process_trades_to_dataframe(trades, threshold_decimal_bps=250)
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
#### process_trades_polars (Recommended for Polars Users)
|
|
221
|
+
|
|
222
|
+
**2-3x faster** than `process_trades_to_dataframe()` with lazy evaluation and predicate pushdown:
|
|
223
|
+
|
|
224
|
+
```python
|
|
225
|
+
import polars as pl
|
|
226
|
+
from rangebar import process_trades_polars
|
|
227
|
+
|
|
228
|
+
# LazyFrame - predicates pushed to I/O layer (10-100x memory reduction)
|
|
229
|
+
lazy_df = pl.scan_parquet("trades/*.parquet").filter(pl.col("timestamp") >= start_ts)
|
|
230
|
+
bars = process_trades_polars(lazy_df, threshold_decimal_bps=250)
|
|
231
|
+
|
|
232
|
+
# Or with eager DataFrame
|
|
233
|
+
df = pl.read_parquet("trades.parquet")
|
|
234
|
+
bars = process_trades_polars(df)
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
**Performance benefits**:
|
|
238
|
+
|
|
239
|
+
- Predicate pushdown: filters applied at Parquet read, not after
|
|
240
|
+
- Minimal conversion: only required columns extracted
|
|
241
|
+
- Chunked processing: 100K records per batch
|
|
242
|
+
- Memory efficient: avoids materializing full dataset
|
|
243
|
+
|
|
244
|
+
#### process_trades_chunked
|
|
245
|
+
|
|
246
|
+
Memory-safe processing for large datasets:
|
|
247
|
+
|
|
248
|
+
```python
|
|
249
|
+
from rangebar import process_trades_chunked
|
|
250
|
+
|
|
251
|
+
# Process 10M+ trades without OOM
|
|
252
|
+
for bars_df in process_trades_chunked(iter(trades), chunk_size=50_000):
|
|
253
|
+
process_batch(bars_df)
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
## Requirements
|
|
257
|
+
|
|
258
|
+
**Runtime**: Python >= 3.13, pandas >= 2.0, numpy >= 1.24, polars >= 1.0
|
|
259
|
+
|
|
260
|
+
**Optional**: backtesting >= 0.3 (for backtesting integration)
|
|
261
|
+
|
|
262
|
+
**Build**: Rust toolchain, maturin >= 1.7
|
|
263
|
+
|
|
264
|
+
## Architecture
|
|
265
|
+
|
|
266
|
+
```
|
|
267
|
+
rangebar (Rust crate)
|
|
268
|
+
↓ Cargo dependency
|
|
269
|
+
rangebar-py (this package)
|
|
270
|
+
├── src/lib.rs (PyO3 bindings)
|
|
271
|
+
└── python/rangebar/ (Python API)
|
|
272
|
+
↓ pip install
|
|
273
|
+
Python applications
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
## Development
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
git clone https://github.com/terrylica/rangebar-py.git
|
|
280
|
+
cd rangebar-py
|
|
281
|
+
pip install maturin
|
|
282
|
+
maturin develop --features data-providers
|
|
283
|
+
pytest tests/
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
## Documentation
|
|
287
|
+
|
|
288
|
+
| Document | Description |
|
|
289
|
+
| ------------------------------------------------------------------------------------------------------- | --------------------- |
|
|
290
|
+
| [Examples](https://github.com/terrylica/rangebar-py/tree/main/examples) | Usage examples |
|
|
291
|
+
| [CLAUDE.md](https://github.com/terrylica/rangebar-py/blob/main/CLAUDE.md) | Project context |
|
|
292
|
+
| [Architecture](https://github.com/terrylica/rangebar-py/blob/main/docs/ARCHITECTURE.md) | System design |
|
|
293
|
+
| [Performance Guide](https://github.com/terrylica/rangebar-py/blob/main/docs/development/PERFORMANCE.md) | Benchmark methodology |
|
|
294
|
+
|
|
295
|
+
## License
|
|
296
|
+
|
|
297
|
+
MIT License. See [LICENSE](https://github.com/terrylica/rangebar-py/blob/main/LICENSE).
|
|
298
|
+
|
|
299
|
+
## Citation
|
|
300
|
+
|
|
301
|
+
```bibtex
|
|
302
|
+
@software{rangebar-py,
|
|
303
|
+
title = {rangebar-py: Python bindings for range bar construction},
|
|
304
|
+
author = {Terry Li},
|
|
305
|
+
url = {https://github.com/terrylica/rangebar-py}
|
|
306
|
+
}
|
|
307
|
+
```
|
|
308
|
+
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
rangebar/CLAUDE.md,sha256=a93bvlk4hGcPydRDBbfzMUro5hX01j4jQV8WmDWy6DQ,9680
|
|
2
|
+
rangebar/__init__.py,sha256=tYLjvpehB-BcnOcLSGqtppqMuzposfZegp_KVR8_ZR0,7407
|
|
3
|
+
rangebar/__init__.pyi,sha256=cbSe-uoWZFviCu1owiZUCH0G5picol3bcNFo4FeRZI8,39531
|
|
4
|
+
rangebar/_core.cpython-313-darwin.so,sha256=n0F_Vx7jvRW9K6i9DXrq6nV3cqOu51Lxom0aMNb8U9k,7440176
|
|
5
|
+
rangebar/checkpoint.py,sha256=dbtjV6R09q2vXovwHKXYZLUueTXBbV1Jg0RXaA19wy0,13055
|
|
6
|
+
rangebar/cli.py,sha256=kJdZvPIOTudQCrlyP6GBJqJNXyW_jPkuau5HUx463sc,8948
|
|
7
|
+
rangebar/clickhouse/CLAUDE.md,sha256=b8YtpHrAZBhYEC5EYJNEIcks2_M-VNttfOd-_T0l4ek,4390
|
|
8
|
+
rangebar/clickhouse/__init__.py,sha256=6enwJRjxxRBTg_GigRd7xTaRAuKQaM-Y7NZL-iDB4Q0,3021
|
|
9
|
+
rangebar/clickhouse/bulk_operations.py,sha256=IDgJiG49axaDgiMIMs8Te8YeMpFXxjygfb0UFjBSK4A,10725
|
|
10
|
+
rangebar/clickhouse/cache.py,sha256=mnwboxwyhX_yrTzOCvRAsWMX_ZUnezzK-x8A1T7ca4A,23381
|
|
11
|
+
rangebar/clickhouse/client.py,sha256=Aij6k2-odeoLe75KpP11rk5AwhWsybsqZ1cLEtA_QAM,2841
|
|
12
|
+
rangebar/clickhouse/config.py,sha256=RzWruoY6lRMxgnisE8iI30RPwaJkXm5gxiG6ZdJfMlo,4050
|
|
13
|
+
rangebar/clickhouse/mixin.py,sha256=7py8EMt4tx5gwIcKnpTaFCRa0fVMs1SzZGJ108ZuG9U,3473
|
|
14
|
+
rangebar/clickhouse/preflight.py,sha256=1BcHN-xDy0XPFlT0022-zAoV2i6uBVJObvPaIokq0GQ,17070
|
|
15
|
+
rangebar/clickhouse/query_operations.py,sha256=qnOR-YYUQdGuX_liIigE6VPesAHd0lAhPw4_ZJeC5RM,12000
|
|
16
|
+
rangebar/clickhouse/schema.sql,sha256=Pq8BDvytm5XhQDq-W1hMEzWoDbG3n7mELFIw0n5J0bA,8549
|
|
17
|
+
rangebar/clickhouse/tunnel.py,sha256=sb4mNh5sLk7P36HO1lzx1E9u42a_fakwa1OSnqcFLy8,6609
|
|
18
|
+
rangebar/constants.py,sha256=bFmaX6o5NdiCUE3ouzo3Kf_1wXGKuKrhMPFL0uc7kw8,9674
|
|
19
|
+
rangebar/conversion.py,sha256=3XPZuHLheZ-9XgVc0a8Kj4ElDcutQVmJ1ESvYvA_Jw8,5065
|
|
20
|
+
rangebar/exceptions.py,sha256=07WO9ZYNJsowkEe6sqVrPpaGqr0dpJkmoyUq7N82vGE,5819
|
|
21
|
+
rangebar/exness.py,sha256=IluUL_PZkOXIBg4jsBl2t5Nii8rrG6KXpchgwCYrJBM,12370
|
|
22
|
+
rangebar/hooks.py,sha256=Zc8hv9jGMbvYqcrWy_uuTh3B-2YDdH7jF2DV8aXwk_4,8555
|
|
23
|
+
rangebar/logging.py,sha256=HOkFj7JmsXW-AJJnxuSR75xpMRiWecffgRLgoysY9ZE,4516
|
|
24
|
+
rangebar/notify/__init__.py,sha256=J6HMJQ4ejryHntnJH6QsiuQ4E7AAzooD3NRDa6DtKR8,380
|
|
25
|
+
rangebar/notify/pushover.py,sha256=ZOZCYlsPPf8EfMp4ZomAl44svVxfCb94hxteUHiFLng,4715
|
|
26
|
+
rangebar/notify/telegram.py,sha256=-LeaZ7lsBdSAuFKXKUU7u4pq-cOfOxhWzi813lXemIM,7641
|
|
27
|
+
rangebar/orchestration/__init__.py,sha256=fk3-pYAUADGpBxk6S7gmsu9ccLFwYEUqaEPWK4GBifE,645
|
|
28
|
+
rangebar/orchestration/count_bounded.py,sha256=VXZc-Gm3YDwAltz6YBXQnQ4jYPThAx6uwgk4qXcc5jE,29224
|
|
29
|
+
rangebar/orchestration/helpers.py,sha256=b7S_t1e4Rvv84UBrF78dmYMGgpoYPMRsV2iJESdwZzg,13544
|
|
30
|
+
rangebar/orchestration/models.py,sha256=_gw5RH0iojCymanDgGvwPG1nJHy05cS5SEYf91mKElw,2059
|
|
31
|
+
rangebar/orchestration/precompute.py,sha256=LT1_LDuoUkyrhYcaCnicDdyxmBLFeB6PMASVFuNxcZI,20210
|
|
32
|
+
rangebar/orchestration/range_bars.py,sha256=w3SnkfUQwsk2fJQYJIdXvU0cwEROuuLCrfRMW9kR_5Q,30016
|
|
33
|
+
rangebar/orchestration/tick_fetcher.py,sha256=iMYtwT9EWmiylBTK1Q4UOF2DAakw186p0tGribDtzqA,7463
|
|
34
|
+
rangebar/ouroboros.py,sha256=hfCxtaoEPNip25NsPEpWWNf6vy08KoW-G4PVup-jrX8,14231
|
|
35
|
+
rangebar/processors/__init__.py,sha256=IpPdEIpLzA-dIytR1rGv4img8GxQa65RnEv2g0R6VRk,635
|
|
36
|
+
rangebar/processors/api.py,sha256=2i0txl5-VVk76i4CuErOPIaW3TKExpvF1W3FaWX3rjk,12540
|
|
37
|
+
rangebar/processors/core.py,sha256=svA2tZTVj0tapesmCDVsDBdsV-_6r4NDmpM5gE3YExg,18782
|
|
38
|
+
rangebar/resource_guard.py,sha256=FZS91LBYEvijldpOnAzuwOLWFLa2M8ZqEJOYRXPlkgc,18768
|
|
39
|
+
rangebar/storage/__init__.py,sha256=HLfTiyih939NN3GtoVon8wUNAN32VyqhAi18r6pAkvw,719
|
|
40
|
+
rangebar/storage/checksum_registry.py,sha256=V9Zc8Iy8K5K5ceg5C93USEIbla5ta2JToJWNz_vfRRY,6965
|
|
41
|
+
rangebar/storage/parquet.py,sha256=RjYC8w57zlmOJbo6kvhgHtF3MQ6LHrudfTOZIUwOy_I,23346
|
|
42
|
+
rangebar/streaming.py,sha256=k_5_AABRPymAVWx8Pa1O55RycfCUaLKsD-mwqE2l850,9726
|
|
43
|
+
rangebar/validation/__init__.py,sha256=HFzJJPgOFwA213KkKhRJuOGyNWJvoBIo7cgeYpmJ8XY,1939
|
|
44
|
+
rangebar/validation/cache_staleness.py,sha256=Dj2tftNzqU4Jb6jR1aCC85mvrHvJBzkztg4vWW5uVYI,8869
|
|
45
|
+
rangebar/validation/continuity.py,sha256=e3M5-0fRECi-EdjEwhZQ1rEg9vbOg0D3GP5BA9lkV6g,21332
|
|
46
|
+
rangebar/validation/gap_classification.py,sha256=9WLKwsQUi8JJT1nAjkphwWLn13MCQRsHiD4TstgbOZE,9894
|
|
47
|
+
rangebar/validation/post_storage.py,sha256=kWgraWeKhDwAFlWxlzEGb0de3RzKk7-nlrJ7t5FyKSo,9696
|
|
48
|
+
rangebar/validation/tier1.py,sha256=3KkXiIQjz7U6HJmgFiuwPSOdIF6JoJTWlj6AuTIoZ70,5591
|
|
49
|
+
rangebar/validation/tier2.py,sha256=PUtT9q8Pe_VbBm25EdHDR6bxFJkq7tUQQJE7iXfUy4A,8970
|
|
50
|
+
rangebar-11.6.1.dist-info/METADATA,sha256=HvZJI_UVNsq5EjM8Axu42H_Hd_MAgrP_gPhXTxQRHpE,10955
|
|
51
|
+
rangebar-11.6.1.dist-info/WHEEL,sha256=V0PyzvBcSARU334gfbMpVsvFu6xR7hFdhQVohqdzf7E,105
|
|
52
|
+
rangebar-11.6.1.dist-info/entry_points.txt,sha256=NRIcb9BtRf3_wr5MBmOJSykOGa6BDcnapRmEQ3QPQyI,45
|
|
53
|
+
rangebar-11.6.1.dist-info/licenses/LICENSE,sha256=QStVwwVTxSvPQ6LIaG7LwxymOexwcbrbgxIJQasda-4,1081
|
|
54
|
+
rangebar-11.6.1.dist-info/RECORD,,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 rangebar-py contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|