Squidly, the Nrdvana mascot

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.

ColumnTypeMeaning
tstimestamp (µs)UTC instant of the event
kindint320 = L1, 1 = L2
sideint32L1: 0 ask · 1 bid · 2 trade — L2: 0 ask · 1 bid
op, posint32depth-book operation and 0-based position (−1 on L1 rows)
price, bid, ask, lastdoubleevent price and the prevailing top-of-book state
sizeint64event 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.

louis@squideyes.com