<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[QuantForge]]></title><description><![CDATA[This blog is where I write about building real software systems in Rust — from protocol and backend engineering to open-source developer tools and quantitative research infrastructure.

I use it to document projects, design decisions, implementation details, and lessons learned while working on systems that value correctness, performance, and maintainability.

Topics will include Rust, Solana, protocol engineering, CLI tools, market data pipelines, deterministic backtesting, infrastructure, and open-source project building.]]></description><link>https://quantforge.blog</link><generator>RSS for Node</generator><lastBuildDate>Tue, 09 Jun 2026 23:29:32 GMT</lastBuildDate><atom:link href="https://quantforge.blog/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[QuantForge v0.2.0]]></title><description><![CDATA[GitHub: formaldehid/quantforgecrates.io: quantforge

QuantForge is research tooling, not investment advice.

Today I’m releasing QuantForge v0.2.0.
This release moves the project from an early researc]]></description><link>https://quantforge.blog/quantforge-v0-2-0</link><guid isPermaLink="true">https://quantforge.blog/quantforge-v0-2-0</guid><category><![CDATA[Rust]]></category><category><![CDATA[trading, ]]></category><category><![CDATA[algorithmic trading]]></category><category><![CDATA[Open Source]]></category><category><![CDATA[open source]]></category><category><![CDATA[cli]]></category><dc:creator><![CDATA[Marko Sabec]]></dc:creator><pubDate>Sat, 28 Mar 2026 00:02:47 GMT</pubDate><content:encoded><![CDATA[<p>GitHub: <a href="https://github.com/formaldehid/quantforge">formaldehid/quantforge</a><br />crates.io: <a href="https://crates.io/crates/quantforge">quantforge</a></p>
<blockquote>
<p>QuantForge is research tooling, not investment advice.</p>
</blockquote>
<p>Today I’m releasing QuantForge v0.2.0.</p>
<p>This release moves the project from an early research/backtesting CLI into a more complete single-crate trading workflow focused on data ingestion, live bot execution, and monitoring.</p>
<p>The direction is still the same:</p>
<ul>
<li><p>Rust-first</p>
</li>
<li><p>CLI only</p>
</li>
<li><p>no UI</p>
</li>
<li><p>code-driven strategy development</p>
</li>
<li><p>small, incremental open-source progress</p>
</li>
</ul>
<h2>What is new in v0.2.0</h2>
<p>QuantForge v0.2.0 now includes three major command groups:</p>
<h3><code>data</code></h3>
<p>The new <code>data</code> command feeds market data into a local SQLite database.</p>
<p>This makes the workflow much cleaner than pulling raw data ad hoc for every task. Data becomes a first-class local resource that can be reused for validation, research, and live bot execution.</p>
<p>Example:</p>
<pre><code class="language-plaintext">quantforge \
  --db data/market.sqlite \
  data sync \
  --symbol BTCUSDT \
  --interval 1m
</code></pre>
<p>The current sync behavior is designed to be practical for ongoing usage:</p>
<ul>
<li><p>if <code>start</code> is omitted, syncing starts from now</p>
</li>
<li><p>if <code>end</code> is omitted, syncing continues indefinitely</p>
</li>
</ul>
<p>That makes <code>data sync</code> useful as a simple long-running feeder process.</p>
<h3><code>trade</code></h3>
<p>The new <code>trade</code> command runs the bot against live-updating data stored in SQLite.</p>
<p>For v0.2.0, the goal was not to build a huge execution framework, but to establish the first end-to-end path:</p>
<p>market data -&gt; database -&gt; strategy -&gt; order execution -&gt; trade lifecycle tracking</p>
<p>The current implementation supports:</p>
<ul>
<li><p>dry-run mode</p>
</li>
<li><p>live mode</p>
</li>
<li><p>strategy-driven entry and exit</p>
</li>
<li><p>market-order execution flow</p>
</li>
<li><p>position close support</p>
</li>
<li><p>persisted bot run state</p>
</li>
</ul>
<p>Example:</p>
<pre><code class="language-plaintext">quantforge \
  --db data/market.sqlite \
  trade run \
  --symbol BTCUSDT \
  --interval 1m \
  --fast 20 \
  --slow 50 \
  --quote-order-qty 100 \
  --mode dry-run
</code></pre>
<p>This is still intentionally conservative. The project is aiming for clarity and correctness first.</p>
<h3><code>monitor</code></h3>
<p>The new <code>monitor</code> command is for observing and manually managing the trading side when needed.</p>
<p>This includes visibility into:</p>
<ul>
<li><p>bot status</p>
</li>
<li><p>recent trades</p>
</li>
<li><p>open orders</p>
</li>
<li><p>manual order cancellation</p>
</li>
<li><p>manual position closing</p>
</li>
</ul>
<p>Example:</p>
<pre><code class="language-plaintext">quantforge \
  --db data/market.sqlite \
  monitor status \
  --symbol BTCUSDT
</code></pre>
<p>This is important because I do not want the project to become a “black box bot.” Even in a CLI-only workflow, operators need visibility and manual controls.</p>
<h2>Current shape of the project</h2>
<p>QuantForge is still not trying to be a polished end-user platform.</p>
<p>It is becoming a code-first foundation for:</p>
<ul>
<li><p>market data ingestion</p>
</li>
<li><p>backtesting</p>
</li>
<li><p>strategy experimentation</p>
</li>
<li><p>controlled live execution</p>
</li>
<li><p>operational monitoring</p>
</li>
</ul>
<p>That means the project remains best suited for developers who want a Rust-native CLI framework they can inspect, modify, and extend directly.</p>
<h2>What is next</h2>
<p>For the next iterations, I want to keep improving the reliability and ergonomics of the workflow:</p>
<ul>
<li><p>stronger reconciliation between local run state and exchange state</p>
</li>
<li><p>better safety rails around live execution</p>
</li>
<li><p>more built-in strategies and indicators</p>
</li>
<li><p>improved testing around exchange behavior and order lifecycle</p>
</li>
<li><p>clearer contributor workflows and release discipline</p>
</li>
</ul>
<p>If you want to follow the project or try it locally, take a look at the repository and feel free to open issues or ideas.</p>
<p>More updates soon.</p>
]]></content:encoded></item><item><title><![CDATA[QuantForge v0.1.0]]></title><description><![CDATA[GitHub: formaldehid/quantforgecrates.io: quantforge

QuantForge is research tooling, not investment advice.

Today I'm releasing QuantForge v0.1.0, an open-source Rust project for market data ingestio]]></description><link>https://quantforge.blog/quantforge-v0-1-0</link><guid isPermaLink="true">https://quantforge.blog/quantforge-v0-1-0</guid><category><![CDATA[Rust]]></category><category><![CDATA[Open Source]]></category><category><![CDATA[cli]]></category><category><![CDATA[Backtesting]]></category><category><![CDATA[quantitative finance]]></category><category><![CDATA[open source]]></category><dc:creator><![CDATA[Marko Sabec]]></dc:creator><pubDate>Wed, 18 Mar 2026 23:39:42 GMT</pubDate><content:encoded><![CDATA[<p>GitHub: <a href="https://github.com/formaldehid/quantforge">formaldehid/quantforge</a><br />crates.io: <a href="https://crates.io/crates/quantforge">quantforge</a></p>
<blockquote>
<p>QuantForge is research tooling, not investment advice.</p>
</blockquote>
<p>Today I'm releasing <strong>QuantForge v0.1.0</strong>, an open-source Rust project for market data ingestion, strict normalization, and reproducible backtesting.</p>
<p>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.</p>
<p>This first release is intentionally small and opinionated.</p>
<h2>What ships in v0.1.0</h2>
<ul>
<li>Binance Spot OHLCV download over public REST endpoints</li>
<li>SQLite candle storage with idempotent upserts</li>
<li>validation for gaps, duplicates, ordering, and OHLC sanity</li>
<li>deterministic event-driven backtesting</li>
<li>a built-in SMA crossover example strategy</li>
<li>a CLI with three core commands: <code>download</code>, <code>validate</code>, and <code>backtest</code></li>
</ul>
<p>There is <strong>no UI</strong>.</p>
<p>The <strong>CLI is the product</strong>.</p>
<h2>Why I built it</h2>
<p>I wanted a foundation for open-source quant research in Rust that prioritizes correctness before dashboards.</p>
<p>A lot of trading tools start with charts and a convenient surface area, but leave critical details vague:</p>
<ul>
<li>how data is normalized</li>
<li>how missing or malformed candles are handled</li>
<li>when a strategy is allowed to act</li>
<li>when an order is assumed to fill</li>
<li>what arithmetic is used for portfolio calculations</li>
</ul>
<p>For this project, I wanted the reverse:</p>
<ul>
<li>normalized data first</li>
<li>explicit validation</li>
<li>reproducible runs</li>
<li>boring, inspectable rules for fills and accounting</li>
<li>code-first strategies</li>
</ul>
<p>That’s also why the first public release is a <strong>single crate</strong>. Versioning, publishing, installation, and contributor onboarding stay simple, while the internal boundaries are still clear:</p>
<ul>
<li><code>model</code></li>
<li><code>exchange</code></li>
<li><code>storage</code></li>
<li><code>sdk</code></li>
<li><code>backtest</code></li>
</ul>
<h2>Determinism is a feature</h2>
<p>QuantForge v0.1.0 follows a strict contract:</p>
<ul>
<li>timestamps are stored as UTC epoch milliseconds</li>
<li>prices and volumes use decimal arithmetic, not floating-point math</li>
<li>strategies observe a completed bar and submit intent</li>
<li>the engine executes that intent at the <strong>next bar open</strong></li>
<li>data validation is explicit, not best-effort</li>
</ul>
<p>That probably sounds conservative, and it is.</p>
<p>But for backtesting, conservative and explainable beats clever and ambiguous every time.</p>
<h2>Quickstart</h2>
<p>Install from crates.io:</p>
<pre><code class="language-bash">cargo install quantforge --locked
</code></pre>
]]></content:encoded></item></channel></rss>