Solutions

Real-time market analytics

Apply custom technical indicators like Bollinger Bands to streaming price data, with no state to manage between events.

// Bollinger Bands — stateless analytic
pipeline:
  - analytic:
      class: BollingerBandAnalytic
      function: compute
      window size: 20
      window unit: EVENTS

emit:
  select: symbol, upper, middle, lower
group by:
  - symbol

Why it matters

From raw ticks to trading signals

Market data never stops moving. Custom, stateless analytics let you score every tick against your own indicators the moment it arrives.

No state to manage

Stateless analytics process each event using only its own window, no external store, no rebuild-on-restart headaches.

Bring your own formula

Implement any indicator. Bollinger Bands, RSI, VWAP and more as a reusable processor and drop it straight into a pipeline.

Runs on live market data

Applies continuously to streaming price ticks, so bands update the moment new data arrives.

How it works

A custom analytic, built once and applied continuously to every symbol in the stream.

  • Implement the analytic

    Extend Joule's AnalyticsFunction interface with your compute logic. Start from the provided template.

  • Register the processor

    Package it as a plugin so Joule can discover and load it at runtime.

  • Apply it in a pipeline

    Reference the processor from a stream definition, with a rolling window of recent price events.

  • Stream the results

    Upper, middle and lower bands emit continuously as new price ticks arrive.

FAQ

Common questions

Do I need to manage state myself?

No, stateless analytics process each event using only the data in its own window, so there's nothing to persist between runs.

What language do I write the analytic in?

Java, using Joule's AnalyticsFunction interface. Python and JavaScript processors are supported for other parts of a pipeline.

Can I use my own indicators, not just Bollinger Bands?

Yes, the Bollinger Band processor in the tutorial is one example. The same pattern works for any formula you can express in code, such as RSI or VWAP.

Go deeper in the docs

Step-by-step setup, the processor template, and full deployment instructions for the stateless analytics tutorial.