Trading charts

A trading chart plots an instrument's price against time so that structure a price table hides — trend, range, the level a market keeps returning to — becomes visible at a glance. Chart analysis software is the tool that draws it: it subscribes to a market-data feed, aggregates raw trades into bars at the interval you choose, renders those bars in a style suited to what you are looking for, and computes indicators over them.

Vike Trader's chart is a native, GPU-accelerated window in a multi-window desktop app for Windows and Linux. It draws candles, bar styles, reindexing styles such as Renko, Kagi and Point & Figure, and an order-flow footprint substrate; it carries a stack of draggable panes below the price; and it computes 171 built-in indicators plus 8 two-series pair indicators from the same registry the backtester uses.

The chart window

The desktop app is a multi-window shell, not a single frame with docked tabs. Every window carries its own title toolbar — a chart-style menu, symbol and interval dropdowns, a LIVE badge and clone, minimize and maximize controls — and windows float, so you arrange them the way you work rather than the way a docking manager allows.

The chart is one window kind among a dozen. The others are the trade panel, the DOM ladder, an options chain, a greeks view, news, an economic calendar, the Data Manager, the Studio, the connections editor, a tearsheet and a Polymarket cockpit. Clone a chart and you get a second independent window on the same instrument — a different interval, a different style, its own indicators.

It reads a snapshot, it does not touch the engine

Market data flows from the feed threads into the trading core, which owns the bar cache and publishes an immutable snapshot the GUI converts into its render model whenever that snapshot changes. The chart is, in the source's own words, a lossy observer: it never mutates trading state, and every intent it produces leaves as a neutral action the frame loop turns into a command. That separation is why the chart engine is a standalone crate with no windowing layer, no GPU dependency and no execution core in its dependency tree — and therefore why its layout and geometry are covered by tests that run on every merge.

Chart types

The style menu is grouped, and the groups are the useful division:

Bars
Candles, hollow candles, Heikin Ashi, volume candles, bars, HLC bars and high-low. These plot the bar series as it arrives, on the ordinary time axis.
Lines
Line, line with markers, step line, area, baseline, HLC area and columns.
Special
Renko, range, line break, Kagi and Point & Figure. These are close-based, deterministic transforms that live on an ordinal axis rather than a time axis: the x-position becomes the unit index while each unit keeps its source bar's timestamp for approximate labels. Their default box or reversal size is derived from an ATR fold over the series, falling back to a fraction of the last price floored at one price unit — so a fresh Renko chart is sized to the instrument rather than to a constant somebody picked.
Order flow
Footprint. It is in its own group because it is not a reindexing transform: it is an alternate per-bar substrate — a column of per-price buy and sell cells — drawn on the same bar axis, and it falls back to plain candles when no footprint data has been aggregated for that chart.

The menu order is load-bearing rather than cosmetic: a saved workspace persists a style as its index into that list, so styles are appended and never inserted.

Panes

Below the price pane sit a volume pane, an optional cumulative-volume-delta pane, and one pane per oscillator study you add. Every pane gets a persisted fraction of the available height, and the key that fraction is stored under is the pane's identity — its kind plus the study's own stable id — never its position. Hiding a study, re-showing it or reordering the stack therefore cannot scramble which stored height belongs to which pane, which is the failure mode of an index-keyed layout.

The separator between two panes is a drag: it transfers height between exactly the two adjacent panes, clamped so neither crosses its minimum. A study can be merged into an existing pane or moved to a new pane above or below an anchor, and the indicator picker's Add to selector chooses the target at the moment you add it, so you are not left dragging a new pane into place every time.

Indicators

171built-in single-series indicators
9categories in the picker
8two-series pair indicators

The catalog is a registry, not a folder of files, and the categories below are the picker's own grouping with the registry's own row counts:

CategoryRows
overlap21
momentum36
volatility16
volume14
statistics13
pattern63
price4
structure4
user0

The user category ships empty and always will. It exists because it is the one honest answer for a kernel the catalog has never seen: filing your own indicator under statistics would claim a classification nobody made.

Every indicator is two implementations of one series

Each one has a streaming form — feed the next bar, advance, get this bar's output line or lines, with no lookahead — and a batch form that computes the whole series at once. They are held equal bit for bit: a merge gate folds the streaming form over a series and compares it to the batch form through the raw floating-point bit pattern, never through a tolerance. Three indicators are declared exceptions in the registry itself, because their batch form legitimately reads bars ahead of the one being computed — Ichimoku's lagging span, ZigZag and Williams fractal. They are flagged as batch-only in data, not discovered by a reader.

That matters on a chart for a practical reason: the line you are looking at live is computed by the streaming path, and the line in your backtest report is computed by the batch path. If the two could disagree, every signal you eyeballed on the chart would be a different signal in the test.

What the chart does per frame

Each active indicator keeps a persistent streaming instance folded over the closed prefix of the series, and the renderer does the cheapest correct thing available: nothing at all when the closed series has not changed, exactly one step when one bar closed, and a full refold only on a structural change such as a history reload. The still-forming bar is previewed on a throwaway clone so the preview can never contaminate the committed fold.

Your own indicators

Scripts dropped into the project's indicator directory load into a second registry beside the built-in catalog. The picker gives them their own section, a workspace restores one by name exactly as it restores a built-in, and a file that has since been deleted is skipped silently rather than failing the whole layout. The picker itself carries search, category tabs, a favourites section that is global across every chart window, and an on this chart list with per-study settings and a menu for pointing a study at a different source symbol.

Price scales

The price axis carries four scale modes plus an orthogonal invert flag, reachable from a right-click menu on the axis itself and from a keyboard toggle:

Linear
Equal price distances get equal screen distances. The default.
Logarithmic
Equal percentage moves get equal screen distances — the honest way to read a series that has multiplied over the window. Restricted to strictly positive prices, because the transform is undefined otherwise.
Percent
Every series expressed as a percentage change from the left edge of the visible range.
Indexed
Every series rebased to a common starting index, which is what makes two instruments of wildly different price levels comparable on one pane.
Invert
A flag rather than a mode: it flips the axis under whichever scale is active, which is how an inverse pair is read against its counterpart.

Every transcendental function in the scale code is called through a single pinned maths library rather than the platform's own, so a tick step never depends on which C runtime rounded the last bit. Two boxes running the same build draw the same gridlines.

Follow-live, autofit and level of detail

Follow-live pins the view to the right edge while it is engaged; panning or zooming away disengages it, and Reset, the Auto button or panning back re-engages it — so you are never left wondering why the chart stopped tracking. A separate visible-range autofit refits the y bounds every frame and makes interactions x-only while engaged; dragging the right gutter disengages it, and a double-click on the price gutter, the Auto button, a reset or a history reload brings it back. At far zoom the renderer collapses the visible slice to roughly one min-max bar per screen column; at normal zoom it returns the slice untouched, so the ordinary render path is unchanged by the optimisation.

Appearance

The chart-settings dialog is tabbed Symbol, Canvas and Scales, and it edits a working copy with live preview until you commit: candle, wick and border colours, the canvas background including a vertical gradient, grid toggles, autofit margins, the last-price line, a price-precision override and the volume pane.

Compare series and window sync

Any number of other symbols can be overlaid on the price pane as percentage-normalized lines. A compare series can also be moved into its own pane and pinned to its own absolute right axis, which is the difference between "these two moved together" and "read this one's actual level".

Cross-window sync is keyed on timestamps, not on bar indices — indices do not align across symbols or across intervals, and a chart that pretends they do will silently show you the wrong bar. Windows are assigned to a sync group, and a group broadcasts a ghost crosshair and a sticky-leader visible range to every window in it. Display timezone is one global setting drawn from a curated list, defaulting to your local zone.

Order-flow rendering

Three order-flow views ride on one substrate. The app aggregates the drained trade tape into per-bar footprint cells, and the renderer derives all three views from that single structure: the Footprint style paints the per-price buy and sell cells with an imbalance tint and outlines each bar's point of control; the volume profile is a visible-range volume-at-price histogram with its point of control and value-area band, pinned to the right edge of the visible range; and the cumulative volume delta pane plots the running total of buy minus sell volume across the whole substrate.

Order-flow aggregation is off on a fresh window and subscribes lazily — the trade feed is only opened once you turn a view on, or select the Footprint style on a time-based interval. Both toggles and the bucket-size override persist per window. The bucket width defaults to a round value derived from the price itself, computed through the same pinned maths library the scales use, so a price sitting on a decade boundary cannot bucket ten times finer on one machine than on another. The full mechanics are on depth of market and order flow.

Workspaces and saved layouts

Windows are arranged by hand or by command: cascade, tile horizontally, tile vertically, grid, minimize all and restore all, plus per-window maximize and restore. Minimized windows collapse into a left rail of vertical tabs, one per window, and a click restores it.

A saved workspace captures the chart windows and what they were showing: symbol, interval, the data venue the live feed is subscribed to, the instrument's asset class, style, geometry, minimized and maximized state, follow-live flags, the price-scale mode and invert flag, the full appearance settings, per-pane heights, pane membership and order, the sync group, the order-flow toggles and bucket override, the compare series with their panes and axis pins, and every indicator's parameters, line colour and width. Globals travel with it: display timezone, order-flow backfill hours, the GPU candle-layer toggle and your indicator favourites. Tool windows are skipped deliberately — they are recreatable from the launcher and carry runtime state a file should not pretend to restore.

One workspace is the default and loads automatically; any number of named layouts can be saved beside it and loaded from the menu, and the app remembers which one was last active so a restart reopens it. A corrupt or old file never bricks startup: an unparseable workspace is treated as "no saved workspace" with a warning, and a file written by an older build still loads, because every field added since carries its own default rather than collapsing to a type zero.

Why the chart's numbers are the engine's numbers

A chart is only as useful as its agreement with everything else you run. Three properties hold that together here, and each is a merge gate rather than an intention.

  • One indicator registry. The chart, the Studio, the command-line backtester and a strategy running live all resolve an indicator by name out of the same registry, with the same parameter coercion, so an indicator's defaults are one set of values rather than four.
  • Streaming equals batch, bitwise. The line drawn from the live streaming fold and the line computed in a batch backtest are the same numbers, compared as raw bit patterns in CI.
  • Transcendentals are pinned. Floating-point maths libraries are not required to round logarithms and exponentials identically, and two platforms measurably disagreed in the last bit on several kernels here. The crate calls one pinned implementation instead of the platform's, and two gates hold it — one pinning the values across platforms, one refusing the platform spellings outright in production code.

What the chart does not have. There are no drawing tools: no trendlines, rays, channels or Fibonacci retracements. Analysis here is indicators, studies, compare series and the reindexing styles. If hand-drawn geometry is central to how you work, that gap is real and stated here rather than left for you to find.

Run it yourself.

Every venue mounts paper by default. Nothing below trades anything until you say so.

Free. Source-available under FSL-1.1; every release becomes Apache-2.0 two years on.

Trading involves substantial risk of loss and is not suitable for every investor. Nothing on this page is investment, financial or trading advice, and no result shown or described — backtested, simulated, paper or live — is a promise of future performance. Backtested and simulated results in particular have inherent limitations: they are produced with hindsight, do not reflect every real-market condition, and no representation is made that any account will achieve results similar to them. Vike Trader is software; orders sent from your accounts, the credentials that authorize them and the decisions behind them remain yours. Consider your circumstances, and never trade money you cannot afford to lose.