# QuantForge v0.1.0

GitHub: [formaldehid/quantforge](https://github.com/formaldehid/quantforge)  
crates.io: [quantforge](https://crates.io/crates/quantforge)

> QuantForge is research tooling, not investment advice.

Today I'm releasing **QuantForge v0.1.0**, an open-source Rust project for market data ingestion, strict normalization, and reproducible backtesting.

My goal was simple: build something that feels closer to a TradingView/PineScript-style workflow, but with the guarantees and ergonomics I want as an engineer — source control, explicit interfaces, deterministic rules, and a real programming language.

This first release is intentionally small and opinionated.

## What ships in v0.1.0

- Binance Spot OHLCV download over public REST endpoints
- SQLite candle storage with idempotent upserts
- validation for gaps, duplicates, ordering, and OHLC sanity
- deterministic event-driven backtesting
- a built-in SMA crossover example strategy
- a CLI with three core commands: `download`, `validate`, and `backtest`

There is **no UI**.

The **CLI is the product**.

## Why I built it

I wanted a foundation for open-source quant research in Rust that prioritizes correctness before dashboards.

A lot of trading tools start with charts and a convenient surface area, but leave critical details vague:

- how data is normalized
- how missing or malformed candles are handled
- when a strategy is allowed to act
- when an order is assumed to fill
- what arithmetic is used for portfolio calculations

For this project, I wanted the reverse:

- normalized data first
- explicit validation
- reproducible runs
- boring, inspectable rules for fills and accounting
- code-first strategies

That’s also why the first public release is a **single crate**. Versioning, publishing, installation, and contributor onboarding stay simple, while the internal boundaries are still clear:

- `model`
- `exchange`
- `storage`
- `sdk`
- `backtest`

## Determinism is a feature

QuantForge v0.1.0 follows a strict contract:

- timestamps are stored as UTC epoch milliseconds
- prices and volumes use decimal arithmetic, not floating-point math
- strategies observe a completed bar and submit intent
- the engine executes that intent at the **next bar open**
- data validation is explicit, not best-effort

That probably sounds conservative, and it is.

But for backtesting, conservative and explainable beats clever and ambiguous every time.

## Quickstart

Install from crates.io:

```bash
cargo install quantforge --locked
