Graphique en bougies pour Power BI Candle Plume
Un vrai graphique boursier dans Power BI : bougies sans trous de week-end, de la minute à l'année, volume, moyennes mobiles et plus de 60 indicateurs.
Démo interactive
Le vrai visuel Power BI, exécuté dans votre navigateur avec les données fictives du rapport d'exemple. Changez de scénario, de style ou d'année : le visuel se met à jour comme dans Power BI. Fonctions premium ★ montrées ici sans filigrane ; dans Power BI, sans licence, elles affichent « Plume Visuals · Aperçu premium ».
Power BI n'a pas de graphique en bougies. Candle Plume en dessine un comme sur une plateforme de trading : une barre par séance, sans les trous des week-ends et des jours fériés, des unités de temps de la minute à l'année calculées dans le visuel, le volume sous les prix et une légende qui suit la souris. Une seule mesure de prix suffit (prix d'achat, relevés) : le visuel construit les bougies. Les indicateurs se calculent sur les barres reçues, jamais sur le calendrier ; un historique complet sert au calcul même quand la fenêtre affiche trois mois. En premium : Bollinger, RSI, MACD et plus de 50 autres indicateurs, panneaux séparés, positions d'achat et de vente avec leurs résultats et statistiques, annotations au clic, Heikin-Ashi et comparaison de plusieurs titres.
Cas d'usage
- Cours d'actions, de cryptomonnaies ou de matières premières, avec leurs indicateurs
- Prix d'achat d'une matière (cuivre, énergie) en bougies mensuelles pour un acheteur
- Relevés à la minute (prix spot, capteurs) regroupés en barres de 15 minutes ou d'une heure
- Retour sur une stratégie : entrées, sorties, résultat et courbe de capital
GratuitInclus gratuitement
- Bougies, bougies creuses, barres OHLC, ligne, zone ; une barre par séance, sans trous de week-end (axe temps réel en option)
- Unités de temps 1 minute à 1 an calculées dans le visuel, séance de marché (« 09:00-17:30 »), semaines et exercices réglables
- Une seule mesure « Prix » suffit : le visuel construit chaque bougie (ouverture, plus haut, plus bas, clôture)
- Volume sous les prix ou superposé, avec sa moyenne ; légende et réticule à la barre survolée
- Moyennes mobiles SMA et EMA, prix médian, typique et moyen ; gestionnaire d'indicateurs dans le visuel
- Boutons de plage (1M, 3M, AAJ, 1A, Tout) qui gardent l'historique pour le calcul ; molette, glisser, double-clic
- Événements par mesure (drapeau, flèches achat / vente, lettre) ; échelle log, % ou base 100 ; plusieurs titres avec le champ Symbole
- Minimum et maximum de l'axe des prix (aussi par mesure : échelle gardée sous un filtre), titre de l'axe ; plusieurs titres sans limite de 1 000 points
- Formats dynamiques : bouton fx sur les couleurs et les textes, tout réglage piloté en DAX
PremiumFonctions premium
- Bollinger, RSI, MACD et 55 autres indicateurs (Ichimoku, SuperTrend, VWAP, Stochastique, ATR, OBV…), jusqu'à 4 panneaux, signaux de croisement
- Positions longues et courtes par mesure ou au clic : résultat, %, risque / rendement, statistiques, courbe de capital
- Annotations au clic, enregistrées dans le rapport
- Heikin-Ashi, ligne de base, colonnes HLC, ligne à marqueurs ; comparaison de plusieurs titres en % ; navigateur
- Styles communs au catalogue (Néon, Journal, Nordique…), palettes, thème JSON
Utilisables sans clé pour les essayer, avec un filigrane.
Tutoriels
Commencez par la prise en main, puis piochez dans les cas pratiques. La page « Champs et réglages » décrit chaque option du volet Format.
- Prise en mainDébutant7 min de lectureUn vrai graphique boursier dans Power BI, sans trous de week-endPrise en main de Candle Plume : préparer une table de cours, créer les mesures, insérer le visuel, changer d'unité de temps, zoomer et ajouter deux moyennes mobiles.
- Cas pratiquesIntermédiaire6 min de lectureCandle Plume : 10 cas pratiquesPas à pas : semaines ou mois sans changer de table, moyenne sur 200 jours dès la première bougie, prix d'achat en bougies, séance à la minute, indicateurs, positions.
- Champs et réglagesIntermédiaire15 min de lectureCandle Plume : tous les champs et réglages expliquésChaque zone de champ et chaque réglage du volet Format de Candle Plume : à quoi il sert, ses valeurs possibles et sa valeur par défaut.
- Bases communesBien démarrer avec les visuels PlumeInstallation, licence, styles et réglages communs à tous les visuels.
Champs à glisser dans le visuel
| Champ | Contenu | |
|---|---|---|
| Date / heure | Colonne date ou date-heure (pas la hiérarchie automatique) : une ligne par barre | Obligatoire |
| Symbole (série) | Titre, produit : boutons de choix, comparaison en % ★ | Facultatif |
| Ouverture, Plus haut, Plus bas, Clôture | Quatre mesures de prix de chaque barre | Facultatif |
| Prix (valeur unique) | À la place des quatre : un prix par ligne, le visuel construit les bougies | Facultatif |
| Volume | Panneau sous les prix, moyenne du volume | Facultatif |
| Courbes sur les prix | Jusqu'à 5 mesures : objectif, indice, prévision | Facultatif |
| Texte et type d'événement | Un repère par barre où la mesure n'est pas vide | Facultatif |
| État de position | +1 acheté, −1 vendu, 0 hors marché ; prix d'entrée et de sortie facultatifs | FacultatifPremium |
| Prix d'entrée, Prix de sortie | Prix des positions ouvertes et fermées (avec État de position) | FacultatifPremium |
| Infobulles | Mesures supplémentaires | Facultatif |
| Format dynamique | Mesures renommées carte.réglage (ex. title.text) : le volet Format piloté en DAX | Facultatif |
Il vous manque une fonction ? Nous adaptons nos visuels ou en créons sur mesure. Demander un visuel sur mesure
Un bug dans Candle Plume, ou une idée pour l'améliorer ? Signaler un bug · Proposer une idée
Référence technique pour assistants IA
Section destinée aux assistants IA (ChatGPT, Claude, Copilot…) : tous les champs, toutes les options du volet Format avec leurs noms internes, le format des données et des exemples DAX. Générée depuis le code du visuel, version 1.1.0.0. Vous pouvez la copier dans votre assistant pour qu'il vous guide.
Version Markdown brute (/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).