# ninety47/dukascopy architecture

> Architecture diagram of the GitHub repository ninety47/dukascopy, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/ninety47/dukascopy
- Repository: https://github.com/ninety47/dukascopy

## Overview

lib-dukascopy is a C++ library for extracting tick records from Dukascopy raw binary and LZMA-compressed BI5 files. A caller supplies a filename, epoch, and price point value to `n47::read`; it loads the file, detects compression, and dispatches to decompression and/or binary parsing before returning tick data. The parser converts 20-byte records into timestamped ask/bid prices and volumes. The README documents both file formats; the sampled implementation confirms the dispatch and decoding path. The graph omits uncertain details beyond those sources.

Main entry points: [`src/dukascopy.cpp`](https://github.com/ninety47/dukascopy/blob/master/src/dukascopy.cpp) (Read API), [`src/lzma.cpp`](https://github.com/ninety47/dukascopy/blob/master/src/lzma.cpp) (LZMA decompressor), [`include/ninety47/dukascopy/io.hpp`](https://github.com/ninety47/dukascopy/blob/master/include/ninety47/dukascopy/io.hpp) (File loader), [`include/ninety47/dukascopy.h`](https://github.com/ninety47/dukascopy/blob/master/include/ninety47/dukascopy.h) (Tick data model)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_entry["Library entry"]
  node_read_api["Read API<br/>[dukascopy.cpp]"]
  node_file_loader["File loader<br/>[io.hpp]"]
end

subgraph group_decode["File decoding"]
  node_format_check["LZMA detection<br/>[lzma.cpp]"]
  node_lzma_decode["LZMA decompressor<br/>[lzma.cpp]"]
  node_easylzma["EasyLZMA"]
  node_binary_parser["Binary parser<br/>[dukascopy.cpp]"]
end

subgraph group_records["Tick records"]
  node_tick_model["Tick data model<br/>[dukascopy.h]"]
  node_tick_result["Tick data result<br/>[dukascopy.h]"]
end

node_caller(("Library caller"))

node_caller -->|"calls"| node_read_api
node_read_api -->|"loads file"| node_file_loader
node_read_api -->|"checks format"| node_format_check
node_read_api -->|"parses raw"| node_binary_parser
node_read_api -->|"decompresses BI5"| node_lzma_decode
node_lzma_decode -->|"calls"| node_easylzma
node_read_api -->|"parses decompressed"| node_binary_parser
node_binary_parser -->|"creates ticks"| node_tick_model
node_read_api -->|"returns"| node_tick_result

click node_read_api "https://github.com/ninety47/dukascopy/blob/master/src/dukascopy.cpp"
click node_file_loader "https://github.com/ninety47/dukascopy/blob/master/include/ninety47/dukascopy/io.hpp"
click node_format_check "https://github.com/ninety47/dukascopy/blob/master/src/lzma.cpp"
click node_lzma_decode "https://github.com/ninety47/dukascopy/blob/master/src/lzma.cpp"
click node_binary_parser "https://github.com/ninety47/dukascopy/blob/master/src/dukascopy.cpp"
click node_tick_model "https://github.com/ninety47/dukascopy/blob/master/include/ninety47/dukascopy.h"
click node_tick_result "https://github.com/ninety47/dukascopy/blob/master/include/ninety47/dukascopy.h"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_read_api,node_file_loader toneBlue
class node_format_check,node_lzma_decode,node_easylzma,node_binary_parser toneAmber
class node_tick_model,node_tick_result toneMint
class node_caller toneIndigo
```

## Components

### Library entry

- [Read API](https://github.com/ninety47/dukascopy/blob/master/src/dukascopy.cpp): `src/dukascopy.cpp`
- [File loader](https://github.com/ninety47/dukascopy/blob/master/include/ninety47/dukascopy/io.hpp): `include/ninety47/dukascopy/io.hpp`

### File decoding

- [LZMA detection](https://github.com/ninety47/dukascopy/blob/master/src/lzma.cpp): `src/lzma.cpp`
- [LZMA decompressor](https://github.com/ninety47/dukascopy/blob/master/src/lzma.cpp): `src/lzma.cpp`
- **EasyLZMA**
- [Binary parser](https://github.com/ninety47/dukascopy/blob/master/src/dukascopy.cpp): `src/dukascopy.cpp`

### Tick records

- [Tick data model](https://github.com/ninety47/dukascopy/blob/master/include/ninety47/dukascopy.h): `include/ninety47/dukascopy.h`
- [Tick data result](https://github.com/ninety47/dukascopy/blob/master/include/ninety47/dukascopy.h): `include/ninety47/dukascopy.h`

### Other components

- **Library caller**

## Connections

- Library caller → Read API: calls
- Read API → File loader: loads file
- Read API → LZMA detection: checks format
- Read API → Binary parser: parses raw
- Read API → LZMA decompressor: decompresses BI5
- LZMA decompressor → EasyLZMA: calls
- Read API → Binary parser: parses decompressed
- Binary parser → Tick data model: creates ticks
- Read API → Tick data result: returns
