Output formats
Fourteen targets, in detail — what each file contains and where it drops in.
Every format is written per contract under outRoot\<formatId>\…, and you can
ask for several in one pass. Text formats share the same conventions: UTF-8, invariant-culture
prices with no trailing zeros, and wall-clock timestamps in the time zone you pick. Open any
format below for the full picture.
nt8 — NinjaTrader 8 tick import
Trade prints in exactly the shape NT8's historical-data import expects, in its mandated folder layout — drop the folder in and import. Bid and ask columns carry the prevailing quotes at each trade.
20250609 093000 1250000;21918.25;21918;21918.25;3
mt4 — MetaTrader 4 History Center bars
Trades aggregated to time bars — M1 by default, or any standard size (M1–M30, H1–H12), several at once if you like. History Center imports per-timeframe files, so an M5 export drops straight into an M5 chart. No header, because History Center rejects one.
2025.06.09,09:30,21918.25,21920,21917.5,21919.75,847
mt5 — MetaTrader 5 custom-symbol ticks
All top-of-book events, tab-separated with MT5's change-flag column, ready for a custom symbol's tick import. The header row MT5 requires is always present.
<DATE> <TIME> <BID> <ASK> <LAST> <VOLUME> <FLAGS> 2025.06.09 09:30:00.125 21918 21918.25 21918.25 3 24
ts — TradeStation ASCII bars
The same bar aggregation in TradeStation's ASCII layout, with its quoted header available when you want it.
"Date","Time","Open","High","Low","Close","Vol" 06/09/2025,09:30,21918.25,21920,21917.5,21919.75,847
ohlcv — platform-neutral time bars new
The same bar aggregation with nothing platform-specific about it: one ISO timestamp and the five values, straight into a spreadsheet, script, or database loader. Any standard size (M1–M30, H1–H12), several in one pass, optional header.
time,open,high,low,close,volume 2025-06-09 09:30,21918.25,21920,21917.5,21919.75,847
nc — Canonical full fidelity
Nrdvana's own schema: every event the replay stream contains, one row per event — quotes, trades, and full market depth. The straightest path from raw stream to spreadsheet or script.
Kind,Side,Op,Pos,Timestamp,Price,Size L1,T,,,2025-06-09 09:30:00.125000,21918.25,3 L2,B,Update,4,2025-06-09 09:30:00.125000,21917.25,12
Kind is L1 or L2 · Side is ask / bid / trade ·
Op/Pos describe depth-book changes · timestamps carry microseconds.
Optional header row and a per-row contract column are available.
n2c — Community
The layout the NinjaTrader community's export tooling established: semicolon-delimited, one
L1;/L2; row per event, sub-second time carried as a 100-nanosecond
offset within the second. If your existing scripts parse community exports, they parse this.
It's also our ground-truth format — the one we verify row-by-row against independent
reference exports.
L1;2;20250609093000;1250000;21918.25;3 L2;1;20250609093000;1250000;1;4;;21917.25;12
parquet — Apache Parquet ticks research
Columnar tick + depth output for research: loads in one line from DuckDB, pandas, polars, or R, at a fraction of CSV's size and parse time. The schema is flat — no nesting, no nulls.
| Column | Type | Meaning |
|---|---|---|
ts | timestamp (µs) | UTC instant of the event |
kind | int32 | 0 = L1, 1 = L2 |
side | int32 | L1: 0 ask · 1 bid · 2 trade — L2: 0 ask · 1 bid |
op, pos | int32 | depth-book operation and 0-based position (−1 on L1 rows) |
price, bid, ask, last | double | event price and the prevailing top-of-book state |
size | int64 | event size |
Timestamps are stored in UTC — naive local times are ambiguous during DST
fall-back, so your --tz choice names the files but never distorts the instants.
Output is byte-identical across Windows and Linux.
scid — Sierra Chart Intraday ticks new
Sierra Chart's native tick file, ready for its Data folder: one 40-byte record per trade with the prevailing bid and ask, volume split by aggressor, and UTC-microsecond timestamps. Name the file for your chart symbol and Sierra picks it up.
Trades only, like nt8; times are stored in UTC regardless of your
--tz, exactly as Sierra expects.
feather — Arrow IPC ticks research
The Apache Arrow IPC file format (Feather v2): pandas.read_feather,
polars.read_ipc, and R's arrow load it zero-copy. Same columns,
order, and UTC-microsecond timestamps as our Parquet — the two are interchangeable
row-for-row; Feather trades Parquet's compression for the fastest possible load.
sl2 & sbd — SquidEyes binary containers
sl2 carries the full L1 + depth event stream; sbd is its twin for
M1 bars. Both are open, MIT-licensed formats from the public
SquidEyes.MarketData library, with a published reader — compact, CRC-checked, and built for
backtesting engines that would rather memory-map a stream than parse CSV.
Their headers carry a typed instrument and session, which brings constraints the open formats don't have — each surfaces as a clear error or a per-contract skip, never silence:
- CME families only — ES, NQ, RTY, YM, GC, CL and their micros. Other roots skip these two formats (with a warning) while every other requested format still writes.
- Windowed sessions only — RTH-style windows; ETH and custom windows can't be represented in the header, so the run tells you up front.
- One trade date per file — weekly/monthly grouping doesn't apply to them.
File names follow the library's mandated stems
(ESH26_20260312_L2_RTH_ET.sl2) so downstream tooling can parse identity straight
from the name.
ndjson — newline-delimited JSON
One JSON object per event — made for jq, scripts, and log pipelines. L1 rows
carry the prevailing bid/ask/last; depth rows carry the book operation and position.
Gzip-friendly (.ndjson.gz).
{"utc":"2025-06-09T13:30:00.125000Z","time":"2025-06-09 09:30:00.125000","kind":"L1","side":"T","price":21918.25,"size":3,"bid":21918,"ask":21918.25,"last":21918.25}custom — your columns, your order new
Pick exactly the columns you want — from
contract kind side op pos date time utc price size bid ask last — in any order,
with your choice of delimiter (comma, semicolon, tab, pipe, or any character). A typo in the
column list fails up front with the full list of valid names, never a silently wrong file.
nrdvana convert ... -f custom --csv-columns utc,price,size,bid,ask --csv-delim tab --header
Depth-capable and gzip-friendly, like nc — but shaped for whatever
your pipeline already parses.
Cross-cutting options
Bar sizes
M1–M30 and H1–H12 in the standard MetaTrader sets, clock-aligned so bars label exactly like your platform's. Ask for several sizes in one pass — each writes its own file.
Compression & bundling
--gzip wraps the data formats in .csv.gz (DuckDB and pandas read
it transparently); Parquet compresses internally; --zip bundles a whole run
into one archive for handoff.
Grouping
One file per day, week, month, or the whole range — split on natural date boundaries so no row is ever divided.
Naming
Sensible default file names carrying contract, range, session, and zone — or take full control with a name template, including subfolders.
Need another format?
The conversion pipeline was built to grow new targets — the custom format covers
most column-layout needs, and if your stack wants something structurally different,
tell us what reads it and what the rows should look like, and we'll talk it
through.