• Crypto
  • Futures
  • Forex
  • Stocks

Every market on one chart that keeps up.

tt Charts streams crypto, futures, forex and stocks from multiple data providers and draws them on your GPU. Read order flow, mark up levels, and write your own indicators and chart types in TypeScript.

BTCUSDT perpetual15mLive
Live BTCUSDT perpetual chart, 15 minute candles. Drag to pan, scroll to zoom.

Everything you read the market with, in one fast chart.

Price, volume and order flow side by side, on markets from several data providers.

Order flow

Footprint, TPO, volume profiles, session VWAP, delta and a liquidity heatmap show where volume traded, not only where price closed.

Every market

Crypto, futures, forex and stocks from multiple data providers, with the same tools on each.

Drawings

Trend lines, channels, Fibonacci tools, ranges and long or short positions, anchored to price and time.

Drawn on the GPU

WebGL2 renders candles, order flow and drawings. Panning and zooming stay smooth on long histories.

Your own indicators

Write indicators and whole chart types in TypeScript. They run next to the built-in ones.
No account neededTry it on a live market

Your indicator is a TypeScript file.

Build them with tradingthings Create. Scripts run next to the chart and draw with the same renderer. A script adds an indicator on top of the candles, or replaces them as a new chart type.

  • Inputs become a settings dialog, with no UI code.
  • Subscribe to bars, trades or your own API.
  • Draw lines, shapes and labels, or replace the candles with your own chart type.
moving-average.tsTypeScript
import { defineScript, input } from "@tradingthings/tt-create"

// Simple moving average of the chart's closes, as one line.
export default defineScript({
  name: "Moving average",
  surface: { kind: "ChartOverlay" },
  inputs: {
    length: input.int({ default: 20, min: 1, label: "Length" }),
    color: input.color({ default: "#f59e0b", label: "Color" }),
  },
  subscribe: (ctx) => ({ bars: ctx.market.bars({ warmup: 20 }) }),
  state: () => ({}),
  draw: (_s, frame, g, ctx) => {
    const { time, close, length: count } = ctx.streams.bars
    const { length, color } = ctx.inputs
    const xy: number[] = []
    let sum = 0

    for (let i = 0; i < count; i += 1) {
      sum += close[i]!
      if (i >= length) sum -= close[i - length]!
      if (i < length - 1) continue

      const x = frame.timeToX(time[i]!)
      if (x !== null) xy.push(x, frame.priceToY(sum / length))
    }

    g.polyline(xy, { color, width: 2 })
  },
})

Open a chart. No account, no install.

It runs in your browser. Pick a market and start reading it.

Open the chart