Mesa de opções
OptionDeskWidget apresenta uma série da cadeia de opções: à esquerda a call, à direita a put em espelho e, entre elas, o strike e o valor intrínseco. O volume, o interesse em aberto e as volatilidades são apresentados não só como número, mas também como barra, pelo que a cadeia se lê pela forma e não apenas pelos valores.

Criação e atualização
import {
OptionDeskWidget,
type TradingHost,
} from '@stocksharp/trading-controls';
declare const host: TradingHost;
const desk = OptionDeskWidget.create(
document.querySelector<HTMLElement>('#option-desk')!,
{},
{ host },
);
desk.update(
[{
strike: 68_000,
call: {
symbol: 'BTC-68000-C',
bid: 1_240,
ask: 1_265,
last: 1_250,
theoretical: 1_248,
volume: 320,
openInterest: 1_480,
ivBid: 0.42,
ivAsk: 0.44,
ivLast: 0.43,
historicalVolatility: 0.39,
},
put: {
symbol: 'BTC-68000-P',
bid: 820,
ask: 845,
volume: 210,
openInterest: 960,
ivLast: 0.47,
},
}],
{
assetPrice: 68_420,
timeToExpiry: 0.08,
riskFree: 0.05,
dividend: 0,
},
);
A única dependência é host; o controlo não tem dependências opcionais. O segundo argumento de create é o estado do painel, que o controlo não utiliza.
update(strikes, context) substitui toda a cadeia. Os dois argumentos são passados em conjunto: a cadeia e o preço do ativo subjacente são uma única observação, e uma atualização em separado mostraria gregas calculadas a partir de um preço já deslocado. context é opcional e por predefinição está vazio.
Contexto da cadeia
OptionChainContext descreve aquilo em relação a que a série é avaliada: assetPrice é o preço do ativo subjacente, timeToExpiry é o tempo até à expiração em anos, riskFree e dividend são taxas em fração (0.05 são cinco por cento). Sem assetPrice a mesa continua a mostrar as cotações, mas o valor intrínseco é zero e as linhas não se dividem entre «dentro do dinheiro» e «fora do dinheiro». Sem assetPrice ou sem timeToExpiry as gregas não são calculadas e a célula fica vazia, em vez de ficar a zero.
Gregas
As gregas chegam por uma de duas vias. Se o anfitrião as calcula, envia um objeto greeks já pronto no lado do strike e a mesa mostra o que recebeu. Se o anfitrião envia a volatilidade, as gregas são calculadas no momento por Black-Scholes a partir do primeiro valor disponível pela ordem ivLast, ivBid, ivAsk, historicalVolatility. Nenhuma das vias é alternativa de recurso da outra — são duas formas de o anfitrião fornecer os dados.
O número de casas decimais é escolhido a partir dos dados: quatro algarismos significativos para o menor valor da coluna, mas nunca menos de duas nem mais de oito casas. A contagem é única para toda a coluna e comum aos dois lados, pelo que o delta não se transforma em 0.0000 e a gama e a sua coluna em espelho são escritas da mesma forma.
Colunas e apresentação
A ordem das colunas parte do strike para fora: as volatilidades e as cotações ficam mais perto do meio e as gregas nas extremidades; o lado da put repete o mesmo pela ordem inversa. A ordenação é por strike ascendente: a cadeia lê-se como uma escada.
Por predefinição estão ocultas as colunas callRho, callTheta, callHv, callTheor e as suas espelhadas putRho, putTheta, putHv, putTheor — o menu de contexto da tabela devolve-as.
As barras são escaladas de formas diferentes. O volume e o interesse em aberto são escalados separadamente em cada lado, porque as calls e as puts negoceiam em tamanhos diferentes. As volatilidades usam uma única escala para ambos os lados, caso contrário o desvio entre os lados desapareceria. A barra é desenhada com a largura do elemento, sem canvas.
À linha é atribuída a classe option-itm-call nos strikes abaixo do preço do ativo e option-itm-put nos restantes; na ausência de assetPrice fica apenas option-row. As volatilidades são apresentadas em percentagem com duas casas decimais e os preços com o formato de preço geral do pacote.
A mesa não guarda definições: não faz acessos a host.preferences nem a host.cache, e o conjunto de colunas e a ordenação vivem na instância atual.
O que faz o anfitrião
Todo o texto visível vem de host.t — o título do painel, os títulos das colunas, a mensagem de tabela vazia e as entradas do menu de contexto. O botão de fecho invoca host.close(): o painel não se remove a si próprio. Ao ser criado, o controlo chama host.register(this) e, em dispose(), host.unregister(this). Um botão na barra lateral exporta a cadeia para XLSX.
O controlo não subscreve dados nem envia ordens: a cadeia e o contexto são-lhe entregues pelo anfitrião através do método update.
Métodos públicos
OptionDeskWidget.create(hostEl, state, deps)— construir o painel e adicioná-lo ao contentor.update(strikes, context)— substituir a cadeia e o contexto de avaliação.rows()— devolver as linhas tal como a mesa as guarda: com as escalas das barras e o valor intrínseco já calculados.dispose()— libertar os recursos e cancelar o registo no anfitrião.OptionDeskWidget.TYPE— identificador do tipo de controlo,ControlTypes.OptionDesk.
Funções exportadas
A parte de cálculo está disponível separadamente do painel:
scaleChain(strikes, context)— numa única passagem pela cadeia, calcula os máximos das barras e o valor intrínseco de cada strike.sideGreeks(row, which, context)— as gregas de um lado do strike: as fornecidas pelo anfitrião ou as calculadas a partir da sua volatilidade;nullquando nenhuma das duas é possível.greekPlaces(values)— o número de casas decimais para uma coluna de valores.greekScales(rows, context)— o número de casas para cada grega, medido de uma só vez sobre os dois lados da cadeia.