Interface do gráfico
createChartUi monta em torno do motor uma interface pronta a usar: títulos dos painéis, legenda com cursor em cruz, menu de contexto, menu do tipo de gráfico e diálogo de indicadores. O motor limita-se a desenhar; tudo o que o rodeia vive num ponto de entrada separado, @stocksharp/chart/ui — uma página com um único gráfico em miniatura não paga por isso.
Ligação
A camada é distribuída num subcaminho próprio do pacote e exige a sua folha de estilos:
import { createChartUi, standaloneHost } from '@stocksharp/chart/ui';
import '@stocksharp/chart/ui.css';
Sem um empacotador, ligue o pacote para navegador dist/sschartui.js — publica o objeto global SSChartUI. Tem de ser carregado depois de dist/sschart.js: a camada lê o motor a partir do objeto global publicado por esse ficheiro, em vez de transportar uma segunda cópia dele.
Criação e atualização
A camada precisa do elemento onde o gráfico foi criado, do anfitrião da página, de uma origem de preço para o menu de contexto e da lista de tipos de gráfico para o menu da legenda:
import { createChart, CandlestickSeries } from '@stocksharp/chart';
import {
ChartType,
createChartUi,
localChartUiStorage,
standaloneHost,
type ChartUi,
} from '@stocksharp/chart/ui';
import '@stocksharp/chart/ui.css';
declare const candles: { time: number; open: number; high: number; low: number; close: number; volume?: number }[];
const container = document.querySelector<HTMLElement>('#chart')!;
const chart = createChart(container, { timeScale: { timeVisible: true } });
const series = chart.addSeries(CandlestickSeries, { upColor: '#26a69a', downColor: '#ef5350' });
series.setData(candles);
const ui: ChartUi = createChartUi(chart, {
container,
host: standaloneHost,
priceSource: series,
chartTypes: [
{ value: ChartType.Candle, label: 'Candles', icon: 'bi bi-bar-chart-fill' },
{ value: ChartType.Line, label: 'Line', icon: 'bi bi-graph-up' },
],
storage: localChartUiStorage('sschart'),
});
ui.setCandles(candles);
setCandles é chamado de novo sempre que muda a janela de velas — outro instrumento, outro tipo de gráfico, uma página de histórico que acabou de chegar. Uma única chamada atualiza tanto o motor de indicadores como a legenda.
Opções de createChartUi:
| Opção | Finalidade |
|---|---|
container |
Elemento onde o gráfico foi criado; é à volta dele que os painéis são construídos. |
host |
Tradução, formatação e mensagens. |
priceSource |
Píxel → preço para o menu de contexto. |
chartTypes |
Entradas do menu de tipo de gráfico pela ordem de apresentação; uma lista vazia não desenha o menu. |
storage |
Onde ficam guardados os indicadores favoritos e os modelos. Por predefinição, em memória. |
dialogRoot |
Estrutura própria para o diálogo de indicadores. Sem ela, a estrutura é construída e acrescentada ao body. |
modal |
Implementação própria da abertura e do fecho do diálogo. |
provideItems |
Entradas da página no menu de contexto — acima das entradas da própria camada. |
O que devolve createChartUi
O resultado são esses mesmos objetos, já ligados entre si; qualquer um deles pode ser alcançado diretamente.
| Campo | O que é |
|---|---|
engine |
IndicatorEngine — cálculo e ciclo de vida dos indicadores. |
renderer |
IndicatorRenderer — as séries com que as saídas dos indicadores são desenhadas. |
paneManager |
ChartPaneManager — títulos dos painéis, os seus menus e a sua reposição. |
legend |
ChartLegend — a linha OHLCV e os valores dos indicadores sob o cursor em cruz. |
dialog |
IndicatorDialog — catálogo, pesquisa, parâmetros e indicadores ativos. |
menu |
ChartContextMenu — o menu do botão direito. |
indicators |
IndicatorController — edição anulável dos indicadores já adicionados. |
templates |
IndicatorTemplateController — modelos transferíveis de definições de indicador. |
Métodos públicos
setCandles(candles)— entregar a janela de velas atual ao motor de indicadores e à legenda.showIndicators()— abrir o diálogo de indicadores.dispose()— retirar o menu, o diálogo, a legenda e os painéis; a estrutura de diálogo criada pela camada é removida.
Anfitrião da página
Nenhum módulo da camada recorre a objetos globais: as palavras, os números e as mensagens vêm de ChartUiHost — um objeto com os campos translate, formatters e notify.
import { consoleNotify, createTranslate, defaultChartFormatters, type ChartUiHost } from '@stocksharp/chart/ui';
const host: ChartUiHost = {
translate: createTranslate({ 'Indicators': 'Indicadores', 'Add indicator…': 'Adicionar indicador…' }),
formatters: { ...defaultChartFormatters, price: value => value.toFixed(2) },
notify: consoleNotify,
};
O dicionário é plano e indexado pelo texto original em inglês: uma chave sem resposta devolve-se a si própria, ou seja, uma cadeia inglesa legível e não um marcador de tradução em falta. A substituição é posicional — {0}, {1}.
standaloneHost— um anfitrião que trata de tudo sozinho: texto em inglês, formatação pela grandeza do número, mensagens na consola.identityTranslate— tradução para uma página com um único idioma; a substituição dos marcadores é preservada.defaultChartFormatters—price,volumeetime(segundos Unix, formatoYYYY-MM-DD HH:MM).consoleNotify— envio de mensagens para a consola do navegador; níveissuccess,info,warning,error.createPlainModalController(root)— abertura e fecho do diálogo para uma página sem biblioteca modal própria: fundo escurecido e fecho porEscape. Um clique fora da janela não fecha o diálogo.
Armazenamento
Os indicadores favoritos e os modelos são guardados através de ChartUiStorage — duas funções, load(key) e save(key, value).
inMemoryChartUiStorage— o valor predefinido: os dados vivem tanto quanto a página.localChartUiStorage(prefix)— invólucro sobrelocalStoragecom um prefixo, para que dois gráficos na mesma página não sobreponham os favoritos um do outro.
Tipo de gráfico
ChartTypeSwitcher redesenha a mesma janela de barras como velas, barras, linha, área, Heikin-Ashi, Renko ou Point & Figure. Mudar de tipo é usar outro desenhador, pelo que a série é criada de novo e a instância anterior fica inválida:
import {
ChartType,
ChartTypeSwitcher,
allChartTypes,
defaultChartTypePalette,
parseChartType,
} from '@stocksharp/chart/ui';
const switcher = new ChartTypeSwitcher({
chart,
series,
initialType: ChartType.Candle,
availableTypes: allChartTypes,
palette: defaultChartTypePalette,
host: standaloneHost,
});
switcher.setRawCandles(candles);
switcher.onSeriesChanged(next => ui.menu.setPriceSource(next));
ui.legend.onChartTypeChange = value => {
const type = parseChartType(value);
if (type === null) return;
switcher.switchType(type);
ui.setCandles(switcher.getIndicatorCandles());
};
parseChartType lê o tipo a partir de uma cadeia que a página guardou por si — uma disposição gravada ou o atributo de um botão — e devolve null se esse tipo não existir. getIndicatorCandles entrega as barras sobre as quais os indicadores são calculados depois da mudança: Renko e Point & Figure reconstroem as barras originais em barras próprias, e isDerivedChartType(type) responde se foi esse o caso — essas barras também não têm volume. Os restantes métodos: getCurrentSeries, getCurrentType, getAvailableTypes, updatePrice.
Menu de contexto
ChartContextMenu não acrescenta entradas próprias — quem as dá é a página, através de provideItems, devolvendo grupos de entradas; entre grupos é desenhado um separador e os grupos vazios não custam nada. Uma entrada é descrita pela chave key, pelo texto label, pelos opcionais icon, tone e disabled e pelo método invoke. O tom é definido pelos valores de ChartContextMenuTone: Neutral, Positive, Negative.
import { ChartContextMenuTone, createChartUi, standaloneHost } from '@stocksharp/chart/ui';
const ui = createChartUi(chart, {
container,
host: standaloneHost,
priceSource: series,
chartTypes: [],
provideItems: context => [[
{
key: 'buy',
label: `Comprar a ${context.priceText}`,
icon: 'bi bi-arrow-up-circle',
tone: ChartContextMenuTone.Positive,
invoke: () => placeOrder('buy', context.price),
},
]],
});
A estas entradas createChartUi acrescenta o seu próprio grupo — Add indicator… e Add pane…, ambos através de host.translate. ChartContextMenuMode distingue o menu sobre o gráfico de preços (Chart, existe preço sob o cursor) do menu sobre o título de um subpainel (Pane, não existe preço). Métodos: init, setPriceSource, openAt, close, dispose.
Restantes exportações
ChartLegendefullscreenMenuLayer— a legenda e a camada onde o seu menu flutuante abre (o elemento em ecrã inteiro, se existir, caso contrário obody). Métodos da legenda:init,setRawCandles,setChartType,setIndicatorEngine,refresh,dispose; retornos de chamadaonEditIndicatoreonChartTypeChange.ChartPaneManager— camada sobre os painéis internos do motor:init,addPane,removePane,restorePane,getChart,getPanes,getPaneByMeasure,setPaneTitle,getValuesElement,legendLayer,resize,dispose.IndicatorDialogecreateIndicatorCatalogController— o diálogo de indicadores e o modelo do seu catálogo. Métodos do diálogo:show,showForPane,showEdit,hide,dispose.IndicatorEngine,IndicatorRenderer,IndicatorSettings— a mecânica dos indicadores comandada pelo diálogo. É publicada tanto aqui como em@stocksharp/chart/indicators.- Os tipos
LegendBar,LegendChartType,LegendChart,LegendPaneHost,LegendIndicatorEngine,IndicatorPaneChart,IndicatorPaneHost,ChartContextMenuProvider,PriceCoordinateSource,ChartTypePalette,ModalController— contratos estruturais: uma página que disponha os painéis ou calcule os indicadores por si implementa-os com os seus próprios objetos.