53 lines
1.4 KiB
Markdown
53 lines
1.4 KiB
Markdown
# paracas-fetch
|
|
|
|
HTTP client and data fetching for the paracas tick data downloader.
|
|
|
|
## Features
|
|
|
|
- Concurrent HTTP downloads with connection pooling
|
|
- LZMA decompression for bi5 files
|
|
- Binary tick data parsing
|
|
- Streaming async API with backpressure
|
|
|
|
## Architecture
|
|
|
|
The fetch pipeline consists of:
|
|
|
|
1. **URL Builder** - Constructs Dukascopy data URLs
|
|
2. **HTTP Client** - Downloads bi5 files with retries
|
|
3. **Decompressor** - LZMA decompression
|
|
4. **Parser** - Binary tick data parsing
|
|
|
|
## Usage
|
|
|
|
```rust,ignore
|
|
use paracas_fetch::{DownloadClient, ClientConfig, tick_stream};
|
|
use paracas_instruments::InstrumentRegistry;
|
|
use paracas_types::DateRange;
|
|
use futures::StreamExt;
|
|
|
|
#[tokio::main]
|
|
async fn main() {
|
|
let client = DownloadClient::new(ClientConfig::default()).unwrap();
|
|
let registry = InstrumentRegistry::global();
|
|
let instrument = registry.get("eurusd").unwrap();
|
|
|
|
let range = DateRange::new(
|
|
chrono::NaiveDate::from_ymd_opt(2024, 1, 1).unwrap(),
|
|
chrono::NaiveDate::from_ymd_opt(2024, 1, 1).unwrap(),
|
|
).unwrap();
|
|
|
|
let mut stream = tick_stream(&client, instrument, range);
|
|
while let Some(result) = stream.next().await {
|
|
match result {
|
|
Ok(tick) => println!("{:?}", tick),
|
|
Err(e) => eprintln!("Error: {}", e),
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## License
|
|
|
|
MIT License - see [LICENSE](../../LICENSE) for details.
|