Skip to content
Plume Visuals
← Back
Core range

Candlestick chart for Power BI Candle Plume

A real stock chart in Power BI: candles with no weekend gaps, from one minute to one year, volume, moving averages and 60+ indicators.

Tutorials ↓
Get it on Microsoft MarketplaceThe visual's official Microsoft listing · free to install

Interactive demo

The real Power BI visual, running in your browser with the sample report's fictitious data. Switch scenario, style or year: the visual updates as it does in Power BI. Premium ★ features are shown here without the watermark; in Power BI, without a license, they show “Plume Visuals · Premium preview”.

Power BI has no candlestick chart. Candle Plume draws one the way a trading platform does: one bar per session, without the gaps of weekends and holidays, timeframes from one minute to one year computed inside the visual, volume under the prices and a legend that follows the mouse. A single price measure is enough (purchase prices, readings): the visual builds the candles. Indicators are computed on the bars received, never on the calendar; a full history feeds the calculation even when the window shows three months. With premium: Bollinger, RSI, MACD and 50+ more indicators, separate panes, buy and sell positions with their results and statistics, click-to-add annotations, Heikin-Ashi and comparison of several symbols.

Use cases

  • Stock, crypto or commodity prices, with their indicators
  • Purchase price of a raw material (copper, energy) as monthly candles for a buyer
  • Minute readings (spot prices, sensors) grouped into 15-minute or hourly bars
  • Strategy review: entries, exits, result and equity curve

FreeIncluded for free

  • Candles, hollow candles, OHLC bars, line, area; one bar per session, no weekend gaps (real-time axis as an option)
  • Timeframes from 1 minute to 1 year computed in the visual, market session (“09:00-17:30”), adjustable weeks and fiscal years
  • A single “Price” measure is enough: the visual builds each candle (open, high, low, close)
  • Volume under the prices or overlaid, with its average; legend and crosshair at the hovered bar
  • SMA and EMA moving averages, median, typical and average price; indicator manager inside the visual
  • Range buttons (1M, 3M, YTD, 1Y, All) that keep the history for the calculation; wheel, drag, double-click
  • Events from a measure (flag, buy / sell arrows, letter); log, percent or indexed scale; several symbols with the Symbol field
  • Price axis minimum and maximum (also from a measure: scale kept under filters), axis title; several tickers with no 1,000-point limit
  • Dynamic formats: fx button on colors and texts, any option driven by DAX

PremiumPremium features

  • Bollinger, RSI, MACD and 55 more indicators (Ichimoku, SuperTrend, VWAP, Stochastic, ATR, OBV…), up to 4 panes, crossover signals
  • Long and short positions from a measure or by clicking: result, %, risk / reward, statistics, equity curve
  • Click-to-add annotations, saved in the report
  • Heikin-Ashi, baseline, HLC columns, line with markers; several symbols compared in %; navigator
  • Catalog-wide styles (Neon, Newspaper, Nordic…), palettes, theme JSON

Usable without a key to try them, with a watermark.

Tutorials

Start with Getting started, then pick from the how-to guides. The Fields and settings page describes every option of the Format pane.

  1. Getting startedBeginner7 min readA real stock chart in Power BI, with no weekend gapsGet started with Candle Plume: prepare a price table, create the measures, insert the visual, change the timeframe, zoom and add two moving averages.
  2. How-to guidesIntermediate5 min readCandle Plume: 10 how-to guidesStep by step: weeks or months without changing the table, a 200-day average from the first candle, purchase prices as candles, minute sessions, indicators, positions.
  3. Fields and settingsIntermediate14 min readCandle Plume: every field and setting explainedEvery field well and every Format pane setting of Candle Plume: what it does, its possible values and its default value.
  4. BasicsGetting started with Plume visualsInstallation, license, styles and the settings shared by every visual.

Fields to drop into the visual

FieldContent
Date / timeDate or date-time column (not the automatic hierarchy): one row per barRequired
Symbol (series)Ticker, product: picker buttons, comparison in % ★Optional
Open, High, Low, CloseFour price measures for each barOptional
Price (single value)Instead of the four: one price per row, the visual builds the candlesOptional
VolumePane under the prices, volume averageOptional
Lines on pricesUp to 5 measures: target, benchmark, forecastOptional
Event text and typeA marker on each bar where the measure is not emptyOptional
Position state+1 long, −1 short, 0 out; optional entry and exit pricesOptionalPremium
Entry price, Exit pricePrices of opened and closed positions (with Position state)OptionalPremium
TooltipsExtra measuresOptional
Dynamic formatMeasures renamed card.setting (e.g. title.text): the Format pane driven by DAXOptional

Missing a feature? We adapt our visuals or build custom ones. Request a custom visual

Found a bug in Candle Plume, or have an idea to improve it? Report a bug · Suggest an idea

Technical reference for AI assistants

This section is meant for AI assistants (ChatGPT, Claude, Copilot…): every field, every Format pane option with its internal name, the expected data shape and DAX examples. Generated from the visual's code, version 1.1.0.0. Paste it into your assistant so it can guide you.

Raw Markdown version (/ai/visuals/candle-chart.md)
# Candle Plume: technical reference for AI assistants

> Power BI custom visual by Plume Studio (Plume Visuals). Visual version **1.1.0.0**. This page is generated from the visual's source code at each site build: field names, option names and defaults are exact for this version.

Use it to help someone build a report with Candle Plume: which fields to drag, how to shape the data, which Format pane option to change, or how to write the visual's settings in a PBIP `visual.json` file.

- Product page: https://plumevisuals.com/en/visuals/candle-chart (French: https://plumevisuals.com/fr/visuels/candle-chart)
- Summary: A real stock chart in Power BI: candles with no weekend gaps, from one minute to one year, volume, moving averages and 60+ indicators.
- Power BI visual GUID (`visualType`): `plumeCandleChart4DCBF4C29CE24C99BB068D8F6EC07CA0`
- Power BI visuals API: 5.11.1
- Support: https://plumevisuals.com/support · contact@plumevisuals.com
- Index of everything on the site for AI assistants: https://plumevisuals.com/llms.txt

## What the visual does

Candle Plume (identifier `candle-chart`) is a Power BI custom visual (version 1.1.0.0, installed from its `.pbiviz` file; AppSource submission in progress) that draws **candlestick (OHLC) stock charts**. Power BI Desktop has no native candlestick chart (only paginated reports have one).

**New in version 1.1.0.0 (30/10/2026):** Format pane reorganized (`chartType` → `layout`, `priceAxis` → `yAxis`, gridlines in **Gridlines**, crosshair legend in **Legend**); Symbol read as a second category (no more 1,000-point limit), automatic chart type (line with the Price field only), position labels without overlap, wrapped annotations; free price-axis min / max (fixed or measures) and title.

- **No weekend gaps**: by default the time axis has one bar per step (`data.axis` = `bars`), so weekends, holidays and nights without data take no room; `time` spaces bars by real time.
- **Timeframes computed in the visual**: the granularity of the data is detected (median gap), then bars are grouped **up only** into 1m, 5m, 15m, 30m, 1H, 4H, 1D, 1W, 1M, 3M (quarter) or 1Y (open = first, high = max, low = min, close = last, volume = sum, events concatenated with their count, position state = last). Weeks start on Monday, Sunday or Saturday; quarters and years can follow a fiscal year; a market session (`data.session` = `09:00-17:30`) drops rows outside it and aligns 1H / 4H bars on its start.
- **A single price measure is enough**: the `price` role ("Price (single value)") replaces Open, High, Low and Close; the visual builds each bar (e.g. daily copper purchase prices shown as monthly candles).
- **Indicators computed on the bars received, never on the calendar** (a 5-bar average skips weekends). Range buttons (1M, 3M, 6M, YTD, 1Y, 5Y, All) and `data.displayFrom` move the window **without filtering**, so the full history warms up long averages. When history is missing, the visual shows e.g. "SMA 200: 143 / 200 bars".
- Volume pane (or overlay) with its average, legend with OHLC, change and indicator values at the hovered bar, crosshair across panes, mouse wheel zoom, drag to scroll, drag the price axis to stretch it, double-click to reset; the window and timeframe are kept after a filter.
- Several symbols with the `series` role: buttons to switch, or a comparison in % ★.
- Events from measures (`eventText`, `eventType`), click-to-add annotations ★, long / short / neutral positions ★ with result, %, duration, risk / reward, MAE / MFE, statistics panel and equity curve.

## Free vs premium (★)

- Every feature works without a key and nothing is ever blocked. Free features never show a watermark.
- Shared Style card (the same in every Plume visual): the styles `none`, `minimal` and `blackWhite`, the two Plume gradient palettes (`crest`, `crestDiverging`), "Follow report theme" and all custom colors are **free**; every other `style.preset`, the other gradient palettes (`style.palette`) and `style.themeJson` ("Theme JSON ★") are **premium**.
- Free in Candle Plume: candles, hollow candles, OHLC bars, line, area; every timeframe, session, fiscal and week setting; Price (single value); volume and its average; **SMA, EMA** (moving average shortcuts with type `sma` or `ema`) and the price indicators **hl2, hlc3, ohlc4**; the in-visual indicator manager; range buttons and Display from; events from measures; log, percent and indexed scales; series buttons; legend, crosshair, zoom; label backgrounds and "Keep room for the legend".
- Premium features of Candle Plume:
  - `layout.type` = `heikinAshi`, `baseline`, `hlc` or `lineMarkers`;
  - every other indicator: **Bollinger Bands, RSI, MACD** (shortcuts `indicators.bbShow`, `rsiShow`, `macdShow`) and 55 more (list below); moving average types `wma`, `vwma`, `rma`, `dema`, `tema`, `hma`; crossover `signals`; more than one indicator pane;
  - `annotations.list` (manual annotations, also written by the Annotate button);
  - positions: the `position` role (and `entryPrice`, `exitPrice`) or `positions.list` (also written by the Position button);
  - `data.compare` with at least two series; `navigation.navigator`.
- Without a valid key, a premium feature in use shows, in edit mode, a "Premium preview" note in the footer; in reading view, **"Plume Visuals · Premium preview"** (French « Plume Visuals · Aperçu premium ») is repeated lightly across the whole visual, without catching the mouse. It disappears once a key is pasted in **Format › Plume Studio License › License key** (`license.key`), the **first card** of the Format pane. Premium options and list values have " ★" appended to their label.
- Accepted keys: only keys starting with `PLUM1.` shown in the buyer's account on plumevisuals.com, checked offline (Ed25519 signature), covering `candle-chart` or the whole catalog. In edit mode, a wrong key shows "Invalid license key", "License expired (date)" or "This key does not cover this visual".
- Licenses last one year (one-time payment, no automatic renewal, key accepted for 30 more days, reminders 30 and 7 days before the end). Prices: 39 € personal, 99 € SME, 299 € enterprise per year, or the catalog pack (199 € / 399 € / 1,199 € per year; tiers by number of users: personal 1–10, SME 11–200, enterprise more than 200).

## Expected data shape

One row per bar of the source data (per date and, with several symbols, per symbol), with measures for the prices.

| Date / time (`time`) | Symbol (`series`) | Open (`open`) | High (`high`) | Low (`low`) | Close (`close`) | Volume (`volume`) |
|---|---|---|---|---|---|---|
| 2025-01-02 | PLUME | 48.10 | 48.90 | 47.80 | 48.60 | 1,210,000 |
| 2025-01-03 | PLUME | 48.60 | 49.40 | 48.20 | 49.10 | 980,000 |

- **Date / time** (`time`, « Date / heure », one column, required): a date or date-time **column**, not the automatic date hierarchy (with the hierarchy you get one bar per year). Text in YYYY-MM-DD is read as a date; any other text gives a category axis in data order, with no grouping.
- **Symbol (series)** (`series`, « Symbole (série) », one column): one series per value; buttons to switch; `data.series` forces one; `data.compare` ★ draws the others as % lines. Up to 30 series.
- **Open, High, Low, Close** (`open`, `high`, `low`, `close`, « Ouverture », « Plus haut », « Plus bas », « Clôture », one measure each). Close (or Price) is required; give all four for real candles.
- **Price (single value)** (`price`, « Prix (valeur unique) », one measure): instead of the four; one price per row (readings, ticks), the visual builds each bar.
- **Volume** (`volume`): volume pane and volume indicators (VWMA, VWAP, OBV, MFI…).
- **Lines on prices** (`overlay`, « Courbes sur les prix », up to 5 measures): target, benchmark, forecast drawn over the prices.
- **Event text** (`eventText`) and **Event type** (`eventType`, text: `buy`, `sell`, `flag`, `circle`, `star`, `diamond` or a letter): a marker on each bar where the text is not empty.
- **Position state ★** (`position`): +1 long, −1 short, 0 out of the market per bar; each change opens or closes a position. **Entry price ★**, **Exit price ★** (`entryPrice`, `exitPrice`): actual execution prices, otherwise the close.
- **Tooltips** (`tooltips`) and **Dynamic format** (`format`, see below).
- Volume of data: windows of 30,000 rows, more fetched with `fetchMoreData` up to Power BI's limit; "Data truncated from …" when Power BI stops. 100,000 minute rows render in about 2.5 s with indicators.

## DAX recipes

```dax
// One row per date and per symbol: a simple sum returns the value
Open price = SUM ( Prices[Open] )
High price = SUM ( Prices[High] )
Low price = SUM ( Prices[Low] )
Close price = SUM ( Prices[Close] )
Traded volume = SUM ( Prices[Volume] )

// Raw ticks: OHLC of each date (or simply use the Price role)
Open = VAR _first = MIN ( Ticks[Timestamp] ) RETURN CALCULATE ( MAX ( Ticks[Price] ), Ticks[Timestamp] = _first )
Close = VAR _last = MAX ( Ticks[Timestamp] ) RETURN CALCULATE ( MAX ( Ticks[Price] ), Ticks[Timestamp] = _last )

// Event text
Event = SWITCH ( MAX ( Prices[Date] ), DATE ( 2025, 3, 14 ), "Supplier price increase", BLANK () )

// Position state ★: long when the 20-day average is above the 50-day average (computed in the model)
Position state = MAX ( Prices[Position] )
```

Do not filter dates with a slicer to zoom: long indicators would start empty. Use the range buttons, `data.range` or `data.displayFrom`.

## Indicator list syntax

`indicators.list` (« Indicateurs (une ligne chacun) », also written by the in-visual **Indicators** manager in edit mode): one line per indicator, `name params [source] [#RRGGBB] [signal=N] [levels=a/b] [from=YYYY-MM-DD] [signals] [hidden]`, e.g. `sma 50`, `ema 200 #C0392B`, `rsi 14 signal=9 levels=80/20 signals`, `bb 20 2 hlc3`, `vwap from=2025-03-03`, `macd 12 26 9`, `ichimoku`, `supertrend 10 3`. Lines starting with `//` are comments; an unreadable line is reported in edit mode and ignored. The same indicator can be added several times.

Indicator IDs (63). Free: `sma`, `ema`, `hl2`, `hlc3`, `ohlc4`. Premium ★: moving averages `wma`, `vwma`, `rma` (SMMA), `dema`, `tema`, `hma`, `lsma`, `alma`, `kama`, `mcginley`, `macross`; bands `bb`, `keltner`, `donchian`, `envelope`; trend `psar`, `supertrend`, `vwap`, `hl52`, `ichimoku`, `alligator`, `fractals`, `zigzag`; momentum panes `rsi`, `macd`, `stoch`, `stochrsi`, `cci`, `willr`, `mom`, `roc`, `ppo`, `ao`, `uo`, `trix`, `tsi`, `cmo`, `dpo`, `fisher`, `bop`, `efi`; strength `adx`, `aroon`, `vortex`, `chop`; volatility `atr`, `stdev`, `bbpct`, `bbw`, `hv`; volume `obv`, `cmf`, `mfi`, `adl`, `chaikin`, `pvt`, `eom`, `volosc`. Aliases: `smma`, `bollinger`, `bbands`, `kc`, `dc`, `sar`, `st`, `williams`, `%r`, `dmi`, `52w`, `ad`, `a/d`, `ichi`, `zz`, `stochastic`, `momentum`. Conventions as TradingView and TA-Lib (Wilder smoothing for RSI, ATR, ADX; EMA seeded by the SMA; population standard deviation).

Manual annotations ★ (`annotations.list`): `date | text | icon | color | position`, e.g. `2025-03-14 | Supplier price increase | flag | #C0392B | below`. Manual positions ★ (`positions.list`): `long|short|neutral | entry date | exit date (empty or open = open position) | entry= | exit= | stop= | target= | qty= | fees= | label=`, e.g. `long | 2025-03-03 | 2025-05-12 | stop=95 | target=120 | qty=10 | fees=0.1%`. Everything is anchored on dates, never on bar numbers.

## Interactions with the report

- Click a bar: cross-filter on every row of the bar (all source rows when bars are grouped); Ctrl for several; click a position = all its bars. Cross-highlighting from other visuals dims the other bars. Context menu everywhere.
- Hover: legend and Power BI tooltip (OHLC, change, volume, Tooltips measures, event, hovered position); report-page tooltips are supported.
- Edit mode only: **Indicators**, **Annotate ★** and **Position ★** buttons; they save to `indicators.list`, `annotations.list`, `positions.list` (persistProperties). Zoom, timeframe, symbol and indicators hidden with the eye icon are per session.
- Keyboard: Tab, ← → bar by bar, Home / End, Page Up / Page Down, + / − zoom, Enter selects, Esc clears. High contrast, ARIA labels, French and English.

## Dynamic formats

- **fx button** (Power BI conditional formatting) on colors and texts of the Format pane.
- **"Dynamic format" well** (`format`): measures renamed `card.setting` (e.g. `data.displayFrom`, `title.text`, `layout.type`) drive any setting and win over the fixed value. Driving a ★ setting by DAX still shows the watermark without a key.

```dax
// renamed data.displayFrom
Display from = FORMAT ( EDATE ( TODAY (), -6 ), "yyyy-MM-dd" )
// renamed indicators.list
Indicators = "sma 20" & UNICHAR ( 10 ) & "ema 50"
```

## Format pane: option IDs

- Card order: `license`, `style`, `data`, `layout`, `candles`, `yAxis`, `timeAxis`, `volume`, `indicators`, `panes`, `annotations`, `positions`, `crosshair`, `navigation`, `grid`, `tooltip`, `interaction`, then `title`, `source`, `container`, `texts`. Format pane in version 1.1.0.0 (30/10/2026), top to bottom: `license`, `style`, `layout`, `data`, `candles`, `volume`, `indicators`, `panes`, `positions`, `timeAxis`, `yAxis`, `gridlines`, `legend`, `annotations`, `crosshair`, `navigation`, `tooltip`, `interaction`, `title`, `source`, `container`, `texts`. Settings moved or renamed in this version keep working in older reports (the old names are still read).
- `data`: `timeframe` (`auto` | `1m` | `5m` | `15m` | `30m` | `1H` | `4H` | `1D` | `1W` | `1M` | `3M` | `1Y`), `timeframes` (text, e.g. `1D 1W 1M`), `axis` (`bars` | `time`), `weekStart` (`1` | `0` | `6`), `fiscalStart` (1–12), `session` (text), `tzOffset` (−14–14), `range` (`auto` | `1M` | `3M` | `6M` | `YTD` | `1Y` | `5Y` | `all`), `displayFrom` (YYYY-MM-DD), `series`, `compare` ★.
- `layout`: `type` (`candles` | `hollow` | `bars` | `line` | `area` | `heikinAshi` ★ | `baseline` ★ | `hlc` ★ | `lineMarkers` ★), `baseline`, `lineWidth` (0.5–6, 1.5).
- `candles`: `upColor` (#2E7D4F), `downColor` (#C0392B), `neutralColor`, `upBorder`, `downBorder`, `upWick`, `downWick`, `width` (10–100 % of spacing, 70), `volumeShade`.
- `yAxis`: `show`, `position` (`right` | `left`), `fontSize`, `color`, `units` (`auto` | `none` | `k` | `m` | `b`), `decimals` (−1–6), `prefix`, `suffix`, `scale` (`linear` | `log` | `percent` | `base100`), `invert`, `marginTop`, `marginBottom` (0–40 %, 8), `lastLine`, `lastLabel`.
- `timeAxis`: `show`, `fontSize`, `color`, `spacing` (40–300 px, 90), `separators`.
- `volume`: `show`, `mode` (`pane` | `overlay`), `height` (5–50 %, 18), `upColor`, `downColor`, `opacity` (5–100, 45), `ma`, `maLength` (20).
- `indicators`: `list`; `ma1Show` / `ma1Type` / `ma1Length` (20) / `ma1Color`, same for `ma2` (EMA 50) and `ma3` (SMA 200), types `sma` | `ema` | `wma` ★ | `vwma` ★ | `rma` ★ | `dema` ★ | `tema` ★ | `hma` ★; `bbShow` ★, `bbLength` (20), `bbMult` (2), `bbColor`; `rsiShow` ★, `rsiLength` (14), `rsiUpper` (70), `rsiLower` (30); `macdShow` ★, `macdFast` (12), `macdSlow` (26), `macdSignal` (9).
- `panes`: `height` (8–45 %, 22), `separators`, `levels`.
- `annotations`: `show`, `labels` (`label` | `tooltip`), `place` (`auto` | `above` | `below`), `vline`, `color`, `fontSize`, `labelBg` (`surface` | `none` = transparent), `list` ★.
- `positions`: `show`, `winColor`, `lossColor`, `neutralColor`, `labels` (`full` | `result` | `none`), `labelBg` (`surface` | `none`), `qty` (1), `fees` (amount or %), `stats`, `equity`, `list`.
- `crosshair`: `legend.show`, `legend.fontSize` (7–18, 11), `legend.reserve` (on: the price scale keeps the legend's height free), `show`, `magnet` (`magnet` | `free`), `style` (`solid` | `dashed` | `dotted`), `color`.
- `navigation`: `timeframes`, `ranges`, `wheel`, `navigator` ★, `barSpacing` (2–40 px, 8), `rightOffset` (0–50 bars, 3).
- `gridlines`: `horizontal`, `vertical`, `style`, `color`, `sessions`, `layout.watermark`. `tooltip`: `show`, `change`, `volume`. `interaction`: `hover`, `dim` (5–80, 25).

## Editing a PBIP report (visual.json)

`visualType` is the visual GUID, `queryState` keys are the data role names, `objects` keys are the option IDs. Booleans `true` / `false`, numbers suffixed with `D`, strings and enumeration values in single quotes.

```json
{
  "visualType": "plumeCandleChart4DCBF4C29CE24C99BB068D8F6EC07CA0",
  "query": {
    "queryState": {
      "time":   { "projections": [ { "field": { "Column":  { "Expression": { "SourceRef": { "Entity": "Prices" } }, "Property": "Date" } }, "queryRef": "Prices.Date", "nativeQueryRef": "Date" } ] },
      "series": { "projections": [ { "field": { "Column":  { "Expression": { "SourceRef": { "Entity": "Prices" } }, "Property": "Symbol" } }, "queryRef": "Prices.Symbol", "nativeQueryRef": "Symbol" } ] },
      "open":   { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Prices" } }, "Property": "Open price" } }, "queryRef": "Prices.Open price", "nativeQueryRef": "Open price" } ] },
      "high":   { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Prices" } }, "Property": "High price" } }, "queryRef": "Prices.High price", "nativeQueryRef": "High price" } ] },
      "low":    { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Prices" } }, "Property": "Low price" } }, "queryRef": "Prices.Low price", "nativeQueryRef": "Low price" } ] },
      "close":  { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Prices" } }, "Property": "Close price" } }, "queryRef": "Prices.Close price", "nativeQueryRef": "Close price" } ] },
      "volume": { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Prices" } }, "Property": "Traded volume" } }, "queryRef": "Prices.Traded volume", "nativeQueryRef": "Traded volume" } ] }
    }
  },
  "objects": {
    "data":       [ { "properties": { "range": { "expr": { "Literal": { "Value": "'1Y'" } } } } } ],
    "indicators": [ { "properties": { "ma1Show": { "expr": { "Literal": { "Value": "true" } } },
                                       "ma2Show": { "expr": { "Literal": { "Value": "true" } } },
                                       "list": { "expr": { "Literal": { "Value": "'rsi 14'" } } } } } ],
    "license":    [ { "properties": { "key": { "expr": { "Literal": { "Value": "'PLUM1.…'" } } } } } ]
  }
}
```

The custom visual package must also be embedded in the report (Power BI does this when the visual is imported from the `.pbiviz` file).

## Styles and theme JSON

- `style.preset` takes one of the 20 style IDs shared by every Plume visual: `none`, `minimal`, `blackWhite`, `press`, `vintage`, `earth`, `nordic`, `executive`, `accessible`, `pastel`, `bauhaus`, `climate`, `blueprint`, `unknownPleasures`, `dark`, `neon`, `terminal`, `infographic`, `cockpit`, `hologram`. Candle colors set in the Candles card win over the style.
- `style.themeJson` (Theme JSON ★): a JSON theme as plain text (format v2 with optional `extends` and groups `colors`, `palettes`, `typography`, `shape`, `table`, `marks`, `effects`). Full reference: https://plumevisuals.com/ai/tutorials/en/themes-json.md.

## Common pitfalls

- One bar per year, or a single bar: the date hierarchy is used instead of the date column.
- "Add the Close measure (or Price)": no Close or Price field.
- Flat candles: the four measures return the same value (e.g. an average of a single price); use Price (single value).
- A long average starts in the middle: dates are filtered; use range buttons or Display from.
- The 1m or 1H button is missing: the data is daily; bars are only grouped upward.
- The legend hides the top of the candles: `legend.reserve` turned off.
- Labels hide the candles: `annotations.labelBg` / `positions.labelBg` = `none`.
- Watermark visible: a ★ chart type, Bollinger, RSI, MACD or any indicator other than SMA, EMA, hl2, hlc3, ohlc4, signals, two indicator panes, manual annotations, positions, comparison, navigator, a ★ style or a theme JSON, without a valid key.
- An ignored line reported at the bottom: typo in a list (indicator name, date YYYY-MM-DD).
- The visual makes no network request: data and license key stay in the report; no R or Python.

## Features that do NOT exist (do not suggest them)

Drawing tools (trend lines, Fibonacci, channels, rectangles, measuring), Renko, Kagi, Point & Figure, Line Break, volume profiles, bars projected into the future (Ichimoku's leading spans stop at the last bar), an indicator computed on another indicator's output (except the `signal=N` average), annotations created by readers in reading view, exporting the chart as an image, live market data feeds (the visual only shows the report's data).

## Data fields (wells)

Internal name = data role name (PBIP `queryState` key). Labels as shown in Power BI (English / French). ★ = premium.

| Internal name | Label (EN) | Label (FR) | Kind | Max fields | Description |
|---|---|---|---|---|---|
| `time` | Date / time | Date / heure | column | 1 | Date or date-time column (not the automatic date hierarchy): one row per source bar. |
| `series` | Symbol (series) | Symbole (série) | column | 1 |  |
| `open` | Open | Ouverture | measure | 1 |  |
| `high` | High | Plus haut | measure | 1 |  |
| `low` | Low | Plus bas | measure | 1 |  |
| `close` | Close | Clôture | measure | 1 |  |
| `price` | Price (single value) | Prix (valeur unique) | measure | 1 | Instead of Open, High, Low and Close: one price per row (ticks, readings); the visual builds each bar. |
| `volume` | Volume | Volume | measure | 1 |  |
| `overlay` | Lines on prices | Courbes sur les prix | measure | 5 | Measures drawn over the prices: target, benchmark, forecast. |
| `eventText` | Event text | Texte d'événement | measure | 1 | Text measure: a marker with this text on each bar where it is not empty. |
| `eventType` | Event type | Type d'événement | measure | 1 | Chooses the icon: buy, sell, flag, circle, star, diamond, or a letter. |
| `position` | Position state ★ | État de position ★ | measure | 1 | Measure returning +1 (long), -1 (short) or 0 (out of the market) per bar: each change opens or closes a position. |
| `entryPrice` | Entry price ★ | Prix d'entrée ★ | measure | 1 |  |
| `exitPrice` | Exit price ★ | Prix de sortie ★ | measure | 1 |  |
| `tooltips` | Tooltips | Infobulles | measure | several |  |
| `format` | Dynamic format | Format dynamique | measure | several | Measures named card.setting (e.g. title.fontSize): drive any Format option with DAX |

Data view: categorical, categories = `time` + `series` (one row per combination), 30,000 rows per data window (more fetched automatically); measures = `open`, `high`, `low`, `close`, `price`, `volume`, `overlay`, `eventText`, `eventType`, `position`, `entryPrice`, `exitPrice`, `tooltips`, `format`.
Capabilities: supportsHighlight, supportsKeyboardFocus, supportsMultiVisualSelection, supportsLandingPage, supportsEmptyDataView.
Network access: none (no privileges requested, no external request).

## Format pane options (197)

Columns: option ID (`object.property`), labels EN / FR as shown in Power BI, control type, PBIP literal type, default value, allowed values, notes.

### Plume Studio License / Licence Plume Studio (`license`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `license.buy` | Get a license | Obtenir une licence | info | text | `plumevisuals.com` |  |  |
| `license.key` | License key | Clé de licence | text | text | (empty) |  | Paste the key received after purchase on plumevisuals.com (starts with PLUM1.). Checked offline. |
| `license.showOwner` | Show license holder (edit mode) | Afficher le titulaire (mode édition) | toggle | bool | `true` | true / false |  |

### Style (`style`, Format pane)

**Style**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `style.preset` | Style | Style | dropdown | enumeration | `none` | `none` None; `minimal` Minimal; `blackWhite` Black & White; `press` Newspaper ★; `vintage` Vintage (antique plate) ★; `earth` Earth ★; `nordic` Nordic ★; `executive` Executive ★; `accessible` Accessible (high legibility) ★; `pastel` Pastel ★; `bauhaus` Bauhaus (pop) ★; `climate` Climate ★; `blueprint` Blueprint ★; `unknownPleasures` Unknown Pleasures ★; `dark` Graphite (dark) ★; `neon` Neon ★; `terminal` Terminal (Matrix) ★; `infographic` Infographic ★; `cockpit` Cockpit (HUD) ★; `hologram` Hologram ★ | Complete look shared by all Plume visuals: colors, three palettes, fonts, frame, table header, marks and effects. Customize colors below. |
| `style.themeJson` | Theme JSON ★ | Thème JSON ★ | textarea | text | (empty) |  | Paste a JSON theme: see the 'JSON themes' tutorial on plumevisuals.com |
| `style.followTheme` | Follow report theme | Suivre le thème du rapport | toggle | bool | `false` | true / false | Text, background, accent and data colors come from the Power BI report theme. |
| `style.reverse` | Reverse gradients | Inverser les dégradés | toggle | bool | `false` | true / false |  |

**Custom colors / Couleurs personnalisées**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `style.customColors` | Customize colors | Personnaliser les couleurs | toggle | bool | `false` | true / false | Start from the style and pick your own colors. A color left empty keeps the style's color. |
| `style.colorBackground` | Background | Fond | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.colorText` | Text | Texte | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.colorMuted` | Secondary text | Texte secondaire | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.colorGrid` | Lines and grid | Traits et grille | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.colorAccent` | Accent | Accent | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.colorPositive` | Favorable | Favorable | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.colorNegative` | Unfavorable | Défavorable | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series1` | Series 1 | Série 1 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series2` | Series 2 | Série 2 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series3` | Series 3 | Série 3 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series4` | Series 4 | Série 4 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series5` | Series 5 | Série 5 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series6` | Series 6 | Série 6 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series7` | Series 7 | Série 7 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series8` | Series 8 | Série 8 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.palette` | Gradient palette | Palette du dégradé | dropdown | enumeration | `auto` | `auto` Style or theme palette; `crest` Plume (sequential); `crestDiverging` Plume (diverging); `viridis` Viridis ★; `magma` Magma ★; `inferno` Inferno ★; `cividis` Cividis (colorblind-safe) ★; `warmingStripes` Warming stripes ★; `rdYlBu` Red–Yellow–Blue ★; `brBG` Brown–Teal (drought) ★; `spectral` Spectral ★; `blues` Blues ★; `reds` Reds ★; `grays` Grays ★; `press` Press (ink and paper) ★; `nordic` Nordic ★; `earth` Earth (ochre to umber) ★; `pastel` Pastel ★; `okabeIto` Okabe-Ito (colorblind-safe) ★ | Visible when `style.customColors` = `true`. Gradient from the catalog (Viridis, Magma…). The start, middle and end colors below replace it. |
| `style.scaleLow` | Gradient: start | Dégradé : début | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.scaleMid` | Gradient: middle (diverging) | Dégradé : milieu (écarts) | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.scaleHigh` | Gradient: end | Dégradé : fin | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |

**Text / Texte**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `style.fontFamily` | Font | Police | font | formatting | `Segoe UI, wf_segoe-ui_normal, helvetica, arial, sans-serif` |  | Used by every text of the visual (title, axes, labels, cells). |

**Animations**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `style.animate` | Animations | Animations | toggle | bool | `true` | true / false | Smooth transitions when data changes. Automatically disabled when the system asks to reduce motion. |

### Layout / Disposition (`layout`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `layout.type` | Chart type | Type de graphique | dropdown | enumeration | `auto` | `auto` Automatic (candles; line with the Price field alone); `candles` Candles; `hollow` Hollow candles; `bars` OHLC bars; `line` Line; `area` Area; `heikinAshi` Heikin-Ashi ★; `baseline` Baseline ★; `hlc` HLC columns ★; `lineMarkers` Line with markers ★ | Automatic: candles with Open, High, Low and Close; a line when only the Price field is filled and each bar has a single price. |
| `layout.baseline` | Baseline value | Valeur de base | text | text | (empty) |  | Visible when `layout.type` = `baseline` |
| `layout.lineWidth` | Line width | Épaisseur de la ligne | number | numeric | `1.5` | 0.5 to 6 | Visible when `layout.type` = `auto` or `line` or `area` or `baseline` or `lineMarkers` |
| `layout.watermark` | Symbol watermark | Symbole en filigrane | toggle | bool | `false` | true / false |  |

### Data and timeframe / Données et unité de temps (`data`, Format pane)

**Timeframe / Unité de temps**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `data.timeframe` | Default timeframe | Unité par défaut | dropdown | enumeration | `auto` | `auto` Same as the data; `1m` 1 minute; `5m` 5 minutes; `15m` 15 minutes; `30m` 30 minutes; `1H` 1 hour; `4H` 4 hours; `1D` 1 day; `1W` 1 week; `1M` 1 month; `3M` 1 quarter; `1Y` 1 year | Bars are aggregated up only (minutes to hours, never the reverse): open = first open, high = highest, low = lowest, close = last close, volume = sum. |
| `data.timeframes` | Timeframes offered to readers | Unités proposées au lecteur | text | text | (empty) |  | Buttons of the timeframe selector, separated by spaces: 1m 5m 15m 30m 1H 4H 1D 1W 1M 3M 1Y. Only units at least as long as the data are shown. |
| `data.axis` | Time axis | Axe du temps | dropdown | enumeration | `bars` | `bars` One bar per step (no weekend gaps); `time` Real time (gaps shown) |  |
| `data.weekStart` | Week starts on | Début de semaine | dropdown | enumeration | `1` | `1` Monday; `0` Sunday; `6` Saturday |  |
| `data.fiscalStart` | First month of the fiscal year (quarters, years) | Premier mois de l'exercice (trimestres, années) | number | integer | `1` | 1 to 12 |  |

**Session and time zone / Séance et fuseau**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `data.session` | Market session (intraday) | Séance (intrajournalier) | text | text | (empty) |  | Intraday rows outside this session are ignored; 1H and 4H bars start at the session start. |
| `data.tzOffset` | Time zone offset (hours) | Décalage horaire (heures) | number | numeric | `0` | -14 to 14 |  |

**Visible window / Fenêtre affichée**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `data.range` | Initial range | Plage au démarrage | dropdown | enumeration | `auto` | `auto` Automatic (readable bars); `1M` 1 month; `3M` 3 months; `6M` 6 months; `YTD` Year to date; `1Y` 1 year; `5Y` 5 years; `all` All |  |
| `data.displayFrom` | Display from | Afficher à partir du | text | text | (empty) |  | Earlier bars are only used to warm up the indicators (a 200-bar average starts at once). Drive it with a DAX measure through the fx button. |

**Series (Symbol field) / Séries (champ Symbole)**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `data.series` | Series shown | Série affichée | text | text | (empty) |  |  |
| `data.compare` | Compare series in % ★ | Comparer les séries en % ★ | toggle | bool | `false` | true / false | The other series are drawn as lines, in % from the first visible bar. |

### Candles / Bougies (`candles`, Format pane)

**Colors / Couleurs**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `candles.upColor` | Up | Haussière | color | fill | `#2E7D4F` | hex color |  |
| `candles.downColor` | Down | Baissière | color | fill | `#C0392B` | hex color |  |
| `candles.neutralColor` | Unchanged (empty = secondary) | Neutre (vide = secondaire) | color | fill | (empty) | hex color |  |
| `candles.upBorder` | Up border (empty = body) | Bordure haussière (vide = corps) | color | fill | (empty) | hex color |  |
| `candles.downBorder` | Down border (empty = body) | Bordure baissière (vide = corps) | color | fill | (empty) | hex color |  |
| `candles.upWick` | Up wick (empty = body) | Mèche haussière (vide = corps) | color | fill | (empty) | hex color |  |
| `candles.downWick` | Down wick (empty = body) | Mèche baissière (vide = corps) | color | fill | (empty) | hex color |  |

**Shape / Forme**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `candles.width` | Body width (% of spacing) | Largeur du corps (% du pas) | number | integer | `70` | 10 to 100 |  |
| `candles.volumeShade` | Shade by volume | Opacité selon le volume | toggle | bool | `false` | true / false | Bars with a low volume are paler. |

### Volume (`volume`, Format pane)

The card header toggle is `volume.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `volume.show` | Show (with the Volume field) | Afficher (avec le champ Volume) | toggle | bool | `true` | true / false |  |
| `volume.mode` | Placement | Placement | dropdown | enumeration | `pane` | `pane` Pane below prices; `overlay` Overlay at the bottom of prices |  |
| `volume.height` | Height (%) | Hauteur (%) | number | integer | `18` | 5 to 50 |  |
| `volume.upColor` | Up (empty = candles) | Haussier (vide = bougies) | color | fill | (empty) | hex color |  |
| `volume.downColor` | Down (empty = candles) | Baissier (vide = bougies) | color | fill | (empty) | hex color |  |
| `volume.opacity` | Opacity (%) | Opacité (%) | number | integer | `45` | 5 to 100 |  |
| `volume.ma` | Volume average | Moyenne du volume | toggle | bool | `false` | true / false |  |
| `volume.maLength` | Average length | Période de la moyenne | number | integer | `20` | 1 to 500 | Visible when `volume.ma` = `true` |

### Indicators / Indicateurs (`indicators`, Format pane)

**Indicator list / Liste des indicateurs**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `indicators.list` | Indicators (one per line) | Indicateurs (une ligne chacun) | textarea | text | (empty) |  | Written by the Indicators button of the visual (edit mode), or by hand: name, parameters, then optionally a source (close, hl2, hlc3…), a color #RRGGBB, signal=9, levels=70/30, signals, hidden. |

**Moving average 1 / Moyenne mobile 1**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `indicators.ma1Show` | Moving average 1 | Moyenne mobile 1 | toggle | bool | `false` | true / false |  |
| `indicators.ma1Type` | Type | Type | dropdown | enumeration | `sma` | `sma` Simple (SMA); `ema` Exponential (EMA); `wma` Weighted (WMA) ★; `vwma` Volume-weighted (VWMA) ★; `rma` Smoothed (SMMA) ★; `dema` Double EMA (DEMA) ★; `tema` Triple EMA (TEMA) ★; `hma` Hull (HMA) ★ | Visible when `indicators.ma1Show` = `true` |
| `indicators.ma1Length` | Length (bars) | Période (barres) | number | integer | `20` | 1 to 500 | Visible when `indicators.ma1Show` = `true` |
| `indicators.ma1Color` | Color (empty = palette) | Couleur (vide = palette) | color | fill | (empty) | hex color | Visible when `indicators.ma1Show` = `true` |

**Moving average 2 / Moyenne mobile 2**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `indicators.ma2Show` | Moving average 2 | Moyenne mobile 2 | toggle | bool | `false` | true / false |  |
| `indicators.ma2Type` | Type | Type | dropdown | enumeration | `ema` | `sma` Simple (SMA); `ema` Exponential (EMA); `wma` Weighted (WMA) ★; `vwma` Volume-weighted (VWMA) ★; `rma` Smoothed (SMMA) ★; `dema` Double EMA (DEMA) ★; `tema` Triple EMA (TEMA) ★; `hma` Hull (HMA) ★ | Visible when `indicators.ma2Show` = `true` |
| `indicators.ma2Length` | Length (bars) | Période (barres) | number | integer | `50` | 1 to 500 | Visible when `indicators.ma2Show` = `true` |
| `indicators.ma2Color` | Color (empty = palette) | Couleur (vide = palette) | color | fill | (empty) | hex color | Visible when `indicators.ma2Show` = `true` |

**Moving average 3 / Moyenne mobile 3**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `indicators.ma3Show` | Moving average 3 | Moyenne mobile 3 | toggle | bool | `false` | true / false |  |
| `indicators.ma3Type` | Type | Type | dropdown | enumeration | `sma` | `sma` Simple (SMA); `ema` Exponential (EMA); `wma` Weighted (WMA) ★; `vwma` Volume-weighted (VWMA) ★; `rma` Smoothed (SMMA) ★; `dema` Double EMA (DEMA) ★; `tema` Triple EMA (TEMA) ★; `hma` Hull (HMA) ★ | Visible when `indicators.ma3Show` = `true` |
| `indicators.ma3Length` | Length (bars) | Période (barres) | number | integer | `200` | 1 to 500 | Visible when `indicators.ma3Show` = `true` |
| `indicators.ma3Color` | Color (empty = palette) | Couleur (vide = palette) | color | fill | (empty) | hex color | Visible when `indicators.ma3Show` = `true` |

**Bollinger Bands ★ / Bandes de Bollinger ★**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `indicators.bbShow` | Bollinger Bands ★ | Bandes de Bollinger ★ | toggle | bool | `false` | true / false |  |
| `indicators.bbLength` | Length | Période | number | integer | `20` | 2 to 500 |  |
| `indicators.bbMult` | Standard deviations | Écarts types | number | numeric | `2` | 0.1 to 10 |  |
| `indicators.bbColor` | Color (empty = palette) | Couleur (vide = palette) | color | fill | (empty) | hex color |  |

**RSI ★**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `indicators.rsiShow` | RSI ★ | RSI ★ | toggle | bool | `false` | true / false |  |
| `indicators.rsiLength` | Length | Période | number | integer | `14` | 2 to 500 |  |
| `indicators.rsiUpper` | Upper level | Seuil haut | number | numeric | `70` | 0 to 100 |  |
| `indicators.rsiLower` | Lower level | Seuil bas | number | numeric | `30` | 0 to 100 |  |

**MACD ★**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `indicators.macdShow` | MACD ★ | MACD ★ | toggle | bool | `false` | true / false |  |
| `indicators.macdFast` | Fast length | Période rapide | number | integer | `12` | 1 to 500 |  |
| `indicators.macdSlow` | Slow length | Période lente | number | integer | `26` | 1 to 500 |  |
| `indicators.macdSignal` | Signal | Signal | number | integer | `9` | 1 to 500 |  |

### Panes / Panneaux (`panes`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `panes.height` | Height of each indicator pane (%) | Hauteur de chaque panneau d'indicateur (%) | number | integer | `22` | 8 to 45 |  |
| `panes.separators` | Separator lines | Traits de séparation | toggle | bool | `true` | true / false |  |
| `panes.levels` | Levels and band between them | Seuils et zone entre les seuils | toggle | bool | `true` | true / false |  |

### Positions ★ (`positions`, Format pane)

This card controls premium features (★): they work without a license key but show the watermark while in use.

The card header toggle is `positions.show`.

**Display / Affichage**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `positions.show` | Show | Afficher | toggle | bool | `true` | true / false | Positions come from the Position state field (+1 long, -1 short, 0 out of the market) or from the Position button of the visual. |
| `positions.winColor` | Profit | Gain | color | fill | `#2E7D4F` | hex color |  |
| `positions.lossColor` | Loss | Perte | color | fill | `#C0392B` | hex color |  |
| `positions.neutralColor` | Neutral period (empty = accent) | Période neutre (vide = accent) | color | fill | (empty) | hex color |  |
| `positions.labels` | Label | Étiquette | dropdown | enumeration | `full` | `full` Result, %, duration, risk / reward; `result` Result in %; `none` None |  |
| `positions.labelBg` | Label background | Fond des étiquettes | dropdown | enumeration | `surface` | `surface` Visual background color; `none` Transparent |  |

**Calculation / Calcul**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `positions.qty` | Default quantity | Quantité par défaut | number | numeric | `1` | 0 to … |  |
| `positions.fees` | Default fees (amount or %) | Frais par défaut (montant ou %) | text | text | (empty) |  |  |
| `positions.stats` | Statistics panel | Panneau de statistiques | toggle | bool | `false` | true / false |  |
| `positions.equity` | Equity curve | Courbe de capital | toggle | bool | `false` | true / false |  |

**Manual positions / Positions manuelles**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `positions.list` | Positions (one per line) | Positions (une ligne chacune) | textarea | text | (empty) |  | Written by the Position button (edit mode) or by hand: long, short or neutral \| entry date \| exit date (empty = open) \| entry= exit= stop= target= qty= fees= label=. |

### Time axis / Axe du temps (`timeAxis`, Format pane)

The card header toggle is `timeAxis.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `timeAxis.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `timeAxis.fontSize` | Size | Taille | number | formatting | `9` | 6 to 24 |  |
| `timeAxis.color` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color |  |
| `timeAxis.spacing` | Label spacing (px) | Écart entre les libellés (px) | number | integer | `90` | 40 to 300 |  |
| `timeAxis.separators` | Day / month / year separators | Séparateurs de jour / mois / année | toggle | bool | `false` | true / false |  |

### Price axis / Axe des prix (`yAxis`, Format pane)

The card header toggle is `yAxis.show`.

**Labels / Étiquettes**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `yAxis.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `yAxis.position` | Position | Position | dropdown | enumeration | `right` | `right` Right; `left` Left |  |
| `yAxis.fontSize` | Size | Taille | number | formatting | `9` | 6 to 24 |  |
| `yAxis.color` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color |  |
| `yAxis.units` | Display units | Unités d'affichage | dropdown | enumeration | `none` | `auto` Auto; `none` None; `k` Thousands; `m` Millions; `b` Billions |  |
| `yAxis.decimals` | Decimals (-1 = auto) | Décimales (-1 = auto) | number | integer | `-1` | -1 to 6 |  |
| `yAxis.prefix` | Prefix | Préfixe | text | text | (empty) |  |  |
| `yAxis.suffix` | Suffix (e.g. €) | Suffixe (ex. €) | text | text | (empty) |  |  |

**Scale / Échelle**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `yAxis.scale` | Scale | Échelle | dropdown | enumeration | `linear` | `linear` Linear; `log` Logarithmic; `percent` Percent (from the first visible bar); `base100` Indexed to 100 |  |
| `yAxis.min` | Minimum | Minimum | text | text | (empty) |  | Fixed bottom of the price scale (prices). Keep it under a filter with a DAX measure in the Dynamic format field named yAxis.min, e.g. CALCULATE(MIN(Prices[Low]), REMOVEFILTERS()). |
| `yAxis.max` | Maximum | Maximum | text | text | (empty) |  | Fixed top of the price scale. DAX: a yAxis.max measure, e.g. CALCULATE(MAX(Prices[High]), REMOVEFILTERS()). |
| `yAxis.invert` | Invert axis | Inverser l'axe | toggle | bool | `false` | true / false |  |
| `yAxis.marginTop` | Top margin (%) | Marge haute (%) | number | integer | `8` | 0 to 40 |  |
| `yAxis.marginBottom` | Bottom margin (%) | Marge basse (%) | number | integer | `8` | 0 to 40 |  |

**Last price / Dernier prix**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `yAxis.lastLine` | Last price line | Ligne du dernier prix | toggle | bool | `true` | true / false |  |
| `yAxis.lastLabel` | Label on the axis | Étiquette sur l'axe | toggle | bool | `true` | true / false |  |

**Axis title / Titre de l'axe**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `yAxis.showTitle` | Axis title | Titre de l'axe | toggle | bool | `false` | true / false |  |
| `yAxis.titleText` | Title text | Texte du titre | text | text | (empty) |  | Visible when `yAxis.showTitle` = `true` |

### Gridlines / Quadrillage (`gridlines`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `gridlines.horizontal` | Horizontal | Horizontal | toggle | bool | `true` | true / false |  |
| `gridlines.vertical` | Vertical | Vertical | toggle | bool | `true` | true / false |  |
| `gridlines.style` | Line style | Style du trait | dropdown | enumeration | `solid` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `gridlines.color` | Color (empty = lines) | Couleur (vide = traits) | color | fill | (empty) | hex color |  |
| `gridlines.width` | Width | Épaisseur | number | numeric | `1` | 0.5 to 4 |  |
| `gridlines.sessions` | Alternate session bands | Bandes de séances alternées | toggle | bool | `false` | true / false |  |

### Legend / Légende (`legend`, Format pane)

The card header toggle is `legend.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `legend.show` | Show (OHLC and indicators) | Afficher (OHLC et indicateurs) | toggle | bool | `true` | true / false |  |
| `legend.fontSize` | Size | Taille | number | formatting | `11` | 7 to 18 |  |
| `legend.color` | Color (empty = text) | Couleur (vide = texte) | color | fill | (empty) | hex color |  |
| `legend.reserve` | Keep room for the legend | Réserver la place de la légende | toggle | bool | `true` | true / false | The price scale leaves the height of the legend free at the top: candles never run under the legend text. |

### Annotations (`annotations`, Format pane)

The card header toggle is `annotations.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `annotations.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `annotations.labels` | Text | Texte | dropdown | enumeration | `label` | `label` Label on the chart; `tooltip` Tooltip only |  |
| `annotations.place` | Marker position | Position du repère | dropdown | enumeration | `auto` | `auto` Automatic (buy below, sell above); `above` Above the high; `below` Below the low |  |
| `annotations.vline` | Vertical line across panes | Ligne verticale sur tous les panneaux | toggle | bool | `false` | true / false |  |
| `annotations.color` | Color (empty = accent) | Couleur (vide = accent) | color | fill | (empty) | hex color |  |
| `annotations.fontSize` | Size | Taille | number | formatting | `9` | 6 to 20 |  |
| `annotations.labelWidth` | Label width (px) | Largeur des étiquettes (px) | number | integer | `180` | 60 to 600 | A longer text goes to the next line (up to the maximum number of lines) instead of being cut. |
| `annotations.maxLines` | Maximum lines | Lignes au plus | number | integer | `3` | 1 to 10 |  |
| `annotations.labelBg` | Label background | Fond des étiquettes | dropdown | enumeration | `surface` | `surface` Visual background color; `none` Transparent |  |
| `annotations.list` | Manual annotations ★ | Annotations manuelles ★ | textarea | text | (empty) |  | Written by the Annotate button (edit mode) or by hand: date \| text \| icon (flag, up, down, circle, star, diamond, or a letter) \| color \| above, below or a price. Copy it to another report. |

### Crosshair / Réticule (`crosshair`, Format pane)

The card header toggle is `crosshair.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `crosshair.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `crosshair.magnet` | Mode | Mode | dropdown | enumeration | `magnet` | `magnet` Snapped to the close; `free` Free |  |
| `crosshair.style` | Line style | Style du trait | dropdown | enumeration | `dashed` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `crosshair.color` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color |  |

### Navigation (`navigation`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `navigation.timeframes` | Timeframe selector | Sélecteur d'unité de temps | toggle | bool | `true` | true / false |  |
| `navigation.ranges` | Range buttons (1M, 3M… All) | Boutons de plage (1M, 3M… Tout) | toggle | bool | `true` | true / false |  |
| `navigation.wheel` | Mouse wheel zoom | Zoom à la molette | toggle | bool | `true` | true / false |  |
| `navigation.navigator` | Navigator (mini chart) ★ | Navigateur (mini-graphique) ★ | toggle | bool | `false` | true / false |  |
| `navigation.barSpacing` | Initial bar spacing (px) | Écart entre les barres au démarrage (px) | number | integer | `8` | 2 to 40 |  |
| `navigation.rightOffset` | Right margin (bars) | Espace à droite (barres) | number | integer | `3` | 0 to 50 |  |

### Interactions (`interaction`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `interaction.hover` | Highlight on hover | Mettre en avant au survol | toggle | bool | `true` | true / false |  |
| `interaction.dim` | Dimmed items opacity (%) | Opacité des éléments estompés (%) | number | integer | `25` | 5 to 80 |  |

### Tooltips / Infobulles (`tooltip`, Format pane)

The card header toggle is `tooltip.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `tooltip.show` | Show | Afficher | toggle | bool | `true` | true / false | Tooltip on hover (with the fields of the "Tooltips" well and report page tooltips). |
| `tooltip.change` | Change and % | Variation et % | toggle | bool | `true` | true / false |  |
| `tooltip.volume` | Volume | Volume | toggle | bool | `true` | true / false |  |

### Title / Titre (`title`, Format pane)

The card header toggle is `title.show`.

**Title / Titre**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `title.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `title.text` | Text | Texte | text | text | (empty) |  | Leave empty for an automatic title built from the fields. |
| `title.fontSize` | Size | Taille | number | formatting | `14` | 7 to 40 |  |
| `title.bold` | Bold | Gras | toggle | bool | `true` | true / false |  |
| `title.italic` | Italic | Italique | toggle | bool | `false` | true / false |  |
| `title.underline` | Underline | Souligné | toggle | bool | `false` | true / false |  |
| `title.color` | Color (empty = text) | Couleur (vide = texte) | color | fill | (empty) | hex color |  |
| `title.bgColor` | Background color | Couleur d'arrière-plan | color | fill | (empty) | hex color |  |
| `title.align` | Horizontal alignment | Alignement horizontal | dropdown | enumeration | `left` | `left` Left; `center` Center; `right` Right |  |
| `title.wrap` | Text wrap | Retour automatique à la ligne | toggle | bool | `true` | true / false |  |

**Subtitle / Sous-titre**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `title.subtitle` | Subtitle | Sous-titre | text | text | (empty) |  | Several lines allowed: type \n to go to the next line. |
| `title.subFontSize` | Size | Taille | number | formatting | `11` | 7 to 30 | Visible when `title.subtitle` =  |
| `title.subColor` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color | Visible when `title.subtitle` =  |
| `title.subItalic` | Italic | Italique | toggle | bool | `false` | true / false | Visible when `title.subtitle` =  |

**Divider / Séparateur**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `title.divider` | Show divider | Afficher le séparateur | toggle | bool | `false` | true / false |  |
| `title.dividerColor` | Color (empty = lines) | Couleur (vide = traits) | color | fill | (empty) | hex color | Visible when `title.divider` = `true` |
| `title.dividerStyle` | Line style | Style de trait | dropdown | enumeration | `solid` | `solid` Solid; `dashed` Dashed; `dotted` Dotted | Visible when `title.divider` = `true` |
| `title.dividerWidth` | Width | Épaisseur | number | integer | `1` | 1 to 6 | Visible when `title.divider` = `true` |

**Spacing / Espacement**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `title.spaceBelow` | Space below the title (px) | Espace sous le titre (px) | number | integer | `4` | 0 to 40 |  |

### Source note / Note de source (`source`, Format pane)

The card header toggle is `source.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `source.show` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `source.text` | Text | Texte | text | text | (empty) |  |  |
| `source.fontSize` | Size | Taille | number | formatting | `9` | 6 to 20 |  |
| `source.italic` | Italic | Italique | toggle | bool | `false` | true / false |  |
| `source.color` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color |  |
| `source.align` | Alignment | Alignement | dropdown | enumeration | `left` | `left` Left; `center` Center; `right` Right |  |

### Frame / Cadre (`container`, Format pane)

**Background / Arrière-plan**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `container.bgShow` | Background | Arrière-plan | toggle | bool | `false` | true / false |  |
| `container.bgColor` | Color | Couleur | color | fill | `#FFFFFF` | hex color | Visible when `container.bgShow` = `true` |
| `container.bgColor2` | Gradient end (optional) | Fin du dégradé (optionnel) | color | fill | (empty) | hex color | Visible when `container.bgShow` = `true` |
| `container.bgTransparency` | Transparency (%) | Transparence (%) | slider | numeric | `0` | 0 to 100 | Visible when `container.bgShow` = `true` |

**Border / Bordure**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `container.border` | Border | Bordure | toggle | bool | `false` | true / false |  |
| `container.borderColor` | Color (empty = lines) | Couleur (vide = traits) | color | fill | (empty) | hex color | Visible when `container.border` = `true` |
| `container.borderWidth` | Width | Épaisseur | number | integer | `1` | 0 to 6 | Visible when `container.border` = `true` |
| `container.radius` | Rounded corners | Coins arrondis | number | integer | `8` | 0 to 24 |  |

**Shadow / Ombre**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `container.shadow` | Shadow | Ombre | toggle | bool | `false` | true / false |  |
| `container.shadowColor` | Color (empty = soft) | Couleur (vide = douce) | color | fill | (empty) | hex color | Visible when `container.shadow` = `true` |
| `container.shadowSize` | Blur (px) | Flou (px) | number | integer | `12` | 0 to 40 | Visible when `container.shadow` = `true` |

**Spacing / Marges**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `container.padding` | Inner padding | Marge intérieure | number | integer | `8` | 0 to 40 |  |

### Language and numbers / Langue et nombres (`texts`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `texts.language` | Interface language | Langue de l'interface | dropdown | enumeration | `auto` | `auto` Same as Power BI; `fr` French; `en` English |  |
| `texts.numberLocale` | Number format locale (e.g. en-GB) | Format des nombres (ex. fr-FR) | text | text | (empty) |  | Thousands and decimal separators. Empty: same as Power BI. |

### Other objects (not in the Format pane cards above)

- `chartType`: `chartType.type` (enumeration), `chartType.baseline` (text), `chartType.lineWidth` (numeric).
- `grid`: `grid.watermark` (bool), `grid.horizontal` (bool), `grid.vertical` (bool), `grid.style` (enumeration), `grid.color` (fill), `grid.sessions` (bool).
- `priceAxis`: `priceAxis.show` (bool), `priceAxis.position` (enumeration), `priceAxis.fontSize` (formatting), `priceAxis.color` (fill), `priceAxis.units` (enumeration), `priceAxis.decimals` (integer), `priceAxis.prefix` (text), `priceAxis.suffix` (text), `priceAxis.scale` (enumeration), `priceAxis.invert` (bool), `priceAxis.marginTop` (integer), `priceAxis.marginBottom` (integer), `priceAxis.lastLine` (bool), `priceAxis.lastLabel` (bool).