Pular para o conteúdo principal

API Bookmap

Módulos da API

O Bookmap suporta dois tipos de API: a API de Add-ons (também chamada de API L1 ou Camada 1) e a API de Conexão (também chamada de API L0 ou Camada 0). Veja a tabela abaixo para as diferenças.

API L1 / Add-onsAPI L0 / Conexão
UsoCriar add-ons personalizados (indicadores, estratégias de negociação)Criar dados de mercado e conexões de negociação personalizados
DetalhesDesenvolver add-ons como indicadores, alertas, estratégias de negociação, etc. Tais add-ons podem ser usados em tempo real e em replay, e em geral não dependem do tipo de fonte de dados (a menos que use um conhecimento específico para alguma fonte de dados)Desenvolver adaptadores que conectam o Bookmap a dados de mercado adicionais e/ou serviços de negociação, como exchanges digitais/cripto, fornecedores de dados de mercado, corretoras, sistemas de gerenciamento de ordens (OMS), etc.
ExtensõesModo “Interceptar / Injetar” - substituir mensagens de dados de mercado e negociação upstream e downstream. Veja abaixo alguns dos casos de uso. Outra extensão desta API é uma estrutura de desenvolvimento “Simplificada” que facilita o desenvolvimento de add-ons. Em estágio alfa está também nossa nova API Python.Solução Quant - Permite conectar o Bookmap a dados de mercado proprietários e sessões de negociação para debriefing, desenvolvimento, monitoramento em tempo real de sistemas de negociação. Também inclui uma coleção de ferramentas úteis para a indústria de finanças quantitativas, especialmente HFT.

API de Conexão (L0)

Para desenvolver adaptadores usando a API L0, você deve se qualificar na categoria de solução Quant. Após a aprovação, você pode implementar seus adaptadores de API L0 personalizados no Bookmap.

Começando com a API L0:

API de Add-ons (L1)

Dependendo da complexidade do código e dos recursos, existem dois tipos de API L1:

API Simplificada

  • Ideal para iniciantes com muitos exemplos.
  • Não possui suporte aos modos "inject" e "data editor".
  • Disponível em Java e Python.

Começando:

API Core:

  • Mais intrincada com menos exemplos.
  • Suporta os modos "inject" e "data editor" para modificar dados enviados ao Bookmap.
  • Experiência prévia com a API Simplificada é aconselhável.

Começando:

  • Leia o readme do projeto DemoStrategies.
  • Veja exemplos no subpacote simple-demo do DemoStrategies.

Recursos da API L0 e API L1:

API de Transmissão (BrAPI)

A API de Transmissão é um protocolo que permite que os dados sejam transmitidos de um add-on para outro. Ela também serve como uma biblioteca para add-ons que usam a API Java e é integrada à API Python, mas apenas para consumir eventos ao vivo. Existem dois tipos de add-ons na Transmissão:

  • Provedores são add-ons que transmitem dados.
  • Consumidores são add-ons que recebem dados de provedores.

screenshot

Visão Geral da BrAPI

Depois que o add-on consumidor e o add-on provedor são iniciados, o consumidor deve se conectar ao provedor. Se a conexão for bem-sucedida, o consumidor pode se inscrever em eventos ao vivo de um dos geradores do provedor e receber todos os seus eventos ao vivo, ou solicitar dados históricos por um determinado período (somente API Java).

Geradores

Um provedor pode ter muitos geradores. Muitas vezes, eles funcionam como um gerador por alias, mas nem sempre, e pode ser que um alias possa ter mais de um gerador, e um gerador pode trabalhar em mais de um alias. No exemplo abaixo, o provedor tem dois geradores para dois instrumentos diferentes. O consumidor se conecta ao provedor e se inscreve em um dos geradores. Uma vez inscrito, o consumidor receberá todos os eventos ao vivo desse gerador. Além disso, o consumidor pode solicitar dados históricos por um período específico usando a DataStructureInterface do provedor.

screenshot

Filtro e Configurações

O gerador pode ter um filtro e configurações. Ou seja, se você é um provedor, as configurações de transmissão e o filtro são opcionais. O filtro é usado para filtrar eventos sem importância e manter apenas eventos importantes. Geralmente, o gerador transmite todos os eventos (eventos brutos), mas, por exemplo, ele apenas visualiza ou envia um alerta para eventos que cruzaram seu limite (eventos filtrados). Então, se você quiser receber apenas dados importantes, um filtro o ajudará. Ao passar eventos brutos ao vivo pelo filtro, você obterá dados que o gerador considera importantes.

As configurações são uma classe de provedor com todos os parâmetros do gerador ou add-on. Ela pode conter tanto parâmetros, com base nos quais o gerador calcula os dados, quanto parâmetros não relacionados ao gerador, por exemplo, a cor para o indicador. Este objeto é passado apenas para que o consumidor saiba com quais parâmetros o provedor está trabalhando.

Visão Geral da BrAPI Java

Aqui está uma descrição passo a passo de como o gerador funciona e o papel do filtro e das configurações.

screenshot

  1. Configurações. Uma classe com todos os parâmetros de um gerador ou add-on.
  2. Criação do Gerador. Crie uma implementação de StrategyUpdateGenerator e registre-a no BM usando Layer1ApiUserMessageAddStrategyUpdateGenerator.
  3. O provedor registra o gerador, as configurações e o filtro na BrAPI.
  4. O consumidor se inscreve no gerador, e agora pode obter o filtro e as configurações do GeneratorInfo.
  5. O gerador recebe dados do Bookmap, por exemplo, eventos de negociação ou profundidade, a partir dos quais ele gera seus eventos.
  6. O gerador envia eventos brutos gerados para o Bookmap.
  7. O Bookmap envia eventos brutos para o provedor do add-on.
  8. O provedor envia eventos brutos para o filtro. Para obter eventos filtrados, por exemplo, que cruzaram um limite, o add-on desenhará em eventos importantes ou reagirá a eles com uma notificação sonora.
  9. O provedor envia eventos filtrados para o Indicador.
  10. O indicador visualiza os eventos filtrados.
  11. O provedor envia eventos brutos para a BrAPI.
  12. O consumidor recebe eventos brutos da BrAPI.
  13. O consumidor envia eventos brutos para o filtro.
  14. O consumidor envia eventos filtrados para o Indicador.
  15. O indicador visualiza os eventos filtrados.

Como usá-lo como consumidor.

Temos dois add-ons de demonstração que são projetados para mostrar como trabalhar com a BrAPI como consumidor: Simple Demo Consumer e Demo Consumer. Você deve começar com o Simple Demo Consumer para entender os conceitos básicos mais facilmente.

Inscrição em eventos ao vivo

Aqui está um detalhamento passo a passo do que você deve fazer para obter eventos ao vivo de um provedor.

screenshot

  1. Iniciar: No primeiro passo, obtemos uma instância de BroadcasterConsumer de BroadcastFactory.getBroadcasterConsumer(). Iremos interagir com a BrAPI através desta interface. Em seguida, iniciamos a BrAPI com o método broadcaster.start(). É melhor fazer isso depois de receber UserMessageLayersChainCreatedTargeted em onUserMessage().
  2. Provedor se torna disponível: O provedor deve estar disponível para que você possa se conectar a ele. Por exemplo, um usuário carregará um add-on de provedor no Bookmap mais tarde do que o seu add-on, então você pode descobrir quando o provedor se torna disponível usando ProviderStatusListener. Você pode registrar ProviderStatusListener em BroadcasterConsumer, quando qualquer provedor se tornar disponível, o método providerBecameAvailable será chamado.
  3. Conectar: Use o método connectToProvider de BroadcasterConsumer para se conectar ao provedor. Use o nome completo do provedor, por exemplo "velox.indicators.absorption.AbsorptionIndicator", você pode obter o nome completo do provedor no método getAvailableProviders() que retornará uma lista de todos os provedores disponíveis.
  4. Resposta de conexão recebida: Você precisará definir o ConnectionStatusListener no método connectToProvider. Este listener receberá o resultado da conexão. Se recebermos true neste listener, saberemos que estamos conectados e podemos continuar trabalhando.
  5. Inscrever: Podemos obter uma lista de todos os geradores disponíveis do provedor a partir do método getGeneratorsInfo. Em seguida, pegue o nome do gerador que precisamos e inscreva-se nele usando o método subscribeToLiveData. Neste método, precisaremos definir o nome do provedor, o nome do gerador, LiveEventListener para receber eventos ao vivo e LiveConnectionStatusListener (opcional, pode ser definido como null) para receber o status de nossa inscrição.
  6. Resposta de inscrição recebida: Se definirmos o LiveConnectionStatusListener quando nos inscrevemos, então obter true neste listener nos informará que nos inscrevemos com sucesso.
  7. Evento ao vivo recebido: Depois de nos inscrevermos com sucesso, receberemos eventos ao vivo em LiveEventListener. Receberemos um Objeto que precisa ser convertido para a classe de provedor de evento correta usando CastUtilities.
Solicitação de eventos históricos.

Depois de se conectar com sucesso a um provedor, você pode solicitar o histórico por um período para um gerador específico.

Você precisa prestar muita atenção que BrDataStructureInterface tem 4 métodos, 2 dos quais retornam dados agregados e 2 dados não agregados. Alguns provedores retornam apenas dados agregados, outros apenas dados não agregados. Você pode descobrir com quais dados seu provedor trabalha na descrição dos provedores.

Para fazer isso, obtenha BrDataStructureInterface do método getDataStructureInterface(String providerName). Em seguida, use um de seus métodos:

  1. List<BrDataStructureInterface.TreeResponseInterval> get(Class<?> strategyClass, String generatorName, long t0, long intervalWidth, int intervalNumber, String alias, Class<?>[] customEvents). Dados agregados. Retorna uma lista com eventos agregados, onde número de eventos = intervalWidth, tempo do primeiro evento = t0, quanto tempo um evento agregado cobre = intervalWidth.
  2. BrDataStructureInterface.TreeResponseInterval get(Class<?> strategyClass, String generatorName, long t1, String alias, Class<?>[] customEvents). Dados agregados. Retorna um único evento agregado do primeiro evento até t1.
  3. List<Object> get(Class<?> strategyClass, String generatorName, long t0, long t1, String alias). Dados não agregados. Retorna todos os eventos de t0 a t1.
  4. List<? extends Event> get(Class<?> strategyClass, String generatorName, long t1, String alias). Dados não agregados. Retorna todos os eventos do primeiro evento até t1.

O resultado da consulta de eventos históricos também deve ser convertido usando CastUtilities.

Listeners

Você pode usar essas interfaces de listener para criar uma implementação delas e instalá-las na BrAPI. Então, quando um determinado evento acontecer, o método do listener será chamado.

  1. ProviderStatusListener, pode ser definido em BroadcasterConsumer. Este listener possui os seguintes métodos:
  • providerBecameAvailable(String providerName, String providerId), será chamado quando o provedor se tornar disponível.
  • providerBecameUnavailable(String providerName, String providerId), será chamado quando o provedor se tornar indisponível.
  • providerUpdateGenerator(String providerName, String providerId, GeneratorInfo generator, boolean isOnline), será chamado quando um gerador do provedor se tornar disponível ou indisponível.
  1. ConnectionStatusListener, pode ser definido no método connectToProvider() em BroadcasterConsumer. O listener será chamado quando a conexão for estabelecida ou interrompida.
  2. LiveConnectionStatusListener, pode ser definido no método subscribeToLiveData() em BroadcasterConsumer. O listener será chamado quando a inscrição for estabelecida ou interrompida.
  3. LiveEventListener, pode ser definido no método subscribeToLiveData() em BroadcasterConsumer. O listener receberá cada evento ao vivo gerado pelo gerador do provedor.
  4. UpdateFilterListener, pode ser definido no método setFilterListener() em GeneratorInfo. O listener receberá o filtro depois que o gerador do provedor o atualizar.
  5. UpdateSettingsListener, pode ser definido no método setSettingsListener() em GeneratorInfo. O listener receberá as configurações depois que o gerador do provedor as atualizar.
CastUtilities

Receberemos Object em listeners como LiveEventListener, UpdateFilterListener e UpdateSettingsListener. Você tem duas opções para o que fazer com esses objetos:

  • Adicione o módulo do provedor às suas dependências. Esses módulos contêm todas as classes que o provedor transmite, e você pode encontrar o módulo do provedor na seção de provedores. Agora você tem uma classe e pode usar CastUtilities. Um exemplo onde convertemos Object para evento do Indicador de Absorção:

screenshot

  • Você não precisa adicionar um módulo às suas dependências; saiba quais campos a classe possui e obtenha-os usando a Reflection API.

Como usá-lo como provedor.

Temos um add-on Demo Simple Provider que implementa a BrAPI como provedor. O Demo Simple Provider cria um gerador em cada alias, calcula a média móvel com base nas negociações e transmite esses eventos ao vivo.

Aqui está uma descrição passo a passo de como um provedor pode transmitir eventos.

screenshot

  1. Iniciar: No primeiro passo, obtemos uma instância de BroadcasterProvider de BroadcastFactory.getBroadcasterProvider(layer1ApiProvider, providerName, providerMainClass). Iremos interagir com a BrAPI através desta interface. Em seguida, iniciamos a BrAPI com o método broadcaster.start(). Ele
  • alertTemplate - modelo do alerta sonoro
  • priceMatters - parâmetro legado, sempre definido como true para Absorção e como false para o indicador Sweep
  • autoMode - mostra que o sizeLimit é calculado automaticamente quando true
  • sdIntervalMinutes - intervalo de leitura de dados de preenchimento para calcular sizeLimit no modo automático
  • sdMultiplier - multiplicador usado na fórmula para cálculo de sizeLimit no modo automático

Filtro:

  • O objeto Filter contém um único campo sizeLimit. Se trade.maxChainSIze >= sizeLimit, consideramos a negociação como parte de uma cadeia de negociações de absorção/varredura.

Stops&Icebergs On-Chart

SI On-Chart transmite eventos relacionados a stops e icebergs detectados, e cada instrumento tem um gerador separado. O nome do gerador é igual ao alias do instrumento.

Eventos:

  • StopEvent - indica uma negociação de stop incluindo o orderID de uma ordem de stop, seu preço, tamanho e tempo. O parâmetro isBid indica se é compra ou venda, totalSize indica o tamanho total de todas as negociações na cadeia de negociações de stop.
  • IcebergEvent - o mesmo para icebergs, mas os eventos podem ser de um tipo diferente (detecção, negociação, movimento, execução, cancelamento). O tamanho pode ser diferente de zero apenas para negociações e detecções. Para o evento de detecção, o tamanho inclui os tamanhos de todas as negociações que o iceberg teve antes de ser detectado. O evento de execução indica que o iceberg foi totalmente executado, o cancelamento significa que o iceberg foi cancelado após a execução parcial. Ambos os eventos têm um parâmetro totalSize que mostra o volume total de negociações para este iceberg no momento em que o evento ocorreu. O evento de movimento indica que o iceberg foi movido para outro nível de preço.

Configurações:

  • SitSettings - objeto com todas as configurações do add-on

Filtro:

  • Filtro de Limite - contém valores de limites de tamanho para exibir icebergs e stops no gráfico no momento.

Market Pulse

Market Pulse transmite o valor dos widgets. No Market Pulse, cada widget em execução é um gerador separado. Se for um widget com duas barras, o gerador é transmitido - MPDoubleBarEvent, se for um widget com uma barra, o gerador é transmitido - MPSingleBarEvent. O nome do gerador consiste no nome do algoritmo e em um identificador de gerador exclusivo, por exemplo, absorptionPressure;1685189706.

Eventos:

  • MPSingleBarEvent: contém valor - valor absoluto e estimativa - com valor relativo ao valor máximo para o período de treinamento.
  • MPDoubleBarEvent: contém valores absolutos de compradores e vendedores e valores estimados de compradores e vendedores - com valor relativo ao máximo, MaxValue - valor máximo para o período de treinamento.

Configurações:

  • MPWidgetSettings: um objeto com todas as configurações do widget, incluindo: id - id exclusivo do widget, name - nome do widget, modelId - nome do algoritmo, params - parâmetros do widget (como período de meia-vida, período de treinamento, etc.), aliases, classe de evento (MPSingleBarEvent ou MPDoubleBarEvent).

Filtro:

  • MPFilter: filtra o valor com base no limite especificado no widget. Se o valor do evento for maior que o limite, este evento é retornado, se for menor, null é retornado.

Dados históricos: dados agregados.

Ponto de Equilíbrio

Ponto de Equilíbrio transmite o preço de equilíbrio com base em ordens abertas.

Eventos:

  • BreakevenEvent: contém o preço de equilíbrio. O evento é enviado quando um consumidor se inscreve e quando o preço de equilíbrio muda.
  • PaidCommissionEvent: contém o tipo de comissão e quanto foi pago. O evento é enviado após cada ordem ser executada.

Configurações:

  • CommissionsSettings: esta classe de configurações descreve quantas comissões estão atualmente definidas e de que tipo.

Filtro:

  • Nenhum filtro necessário.

Dados históricos: dados agregados e dados não agregados.

Add-on de Nível de Força

Este usa um gerador para cada instrumento e transmite eventos BrIcebergEvent. O nome do gerador consiste no nome do add-on e no instrumento (por exemplo, 'Strength level addon::BTCUSDT@BN').

Evento:

  • BrIcebergEvent: contém os seguintes parâmetros: level - o preço do evento, size - o tamanho do evento e, consequentemente, isBid - indica o lado do evento, mode - detectamos eventos em dois modos ao mesmo tempo, então este campo é necessário para entender para qual modo o evento foi encontrado.

Configurações:

  • ProviderSettingsProxy: maxPostTradeIncreaseDelay e minPostTradeIncreaseSize - especificamos esses valores nas configurações do add-on (eles são usados para filtragem).

Filtro:

  • Filtra eventos com base no modo, atraso e tamanho. Se o modo do evento corresponder ao selecionado nas configurações, o atraso for menor que o especificado nas configurações e o tamanho for maior que o especificado nas configurações, este evento será retornado, caso contrário, null.

VWAP Ancorado

AVWAP transmite os valores de VWAP e banda (desvio padrão) de cada linha. Um novo gerador é registrado para cada nova linha VWAP. O nome do gerador consiste em uma sequência de 30 letras aleatórias, então para entender de quem é o gerador, veja as configurações (ProviderSettingsProxy).

Evento:

  • BrVwapEvent: contém o valor VWAP, desvio padrão e tempo. Configurações:
  • ProviderSettingsProxy: username - nome da linha, alias, anchor - tempo de início desta linha, brResetPointInfoList - uma lista com informações breves sobre resets, brBandInfoList - contém os coeficientes das bandas ativas.

Filtro:

  • Sem filtros.

FAQ

1. Como posso criar um add-on ou adaptador em outras linguagens além do Java?

  • Usando a API Python, você pode desenvolver add-ons L1 em Python. Outros métodos de comunicação entre processos do SO, incluindo web sockets e JNI, também são suportados. No entanto, você pode carregar um módulo Java mínimo como um agente proxy.

2. Como o Bookmap lida com o roteamento de ordens e dados de mercado?

  • O Bookmap não roteia ordens ou dados de mercado em tempo real através de seus servidores*, ele atua como um front-end conectando-se diretamente ao destino usando credenciais configuradas pelo usuário.
  • *A exceção são as conexões de dados do Bookmap, nossa solução personalizada.

3. Que estratégias de negociação podem ser projetadas usando a API Bookmap?

  • Não há restrições. Implemente qualquer lógica de trade ou gerenciamento complexo de ordens. No entanto, esteja sempre ciente dos riscos, especialmente aqueles associados à latência. Os traders devem sempre considerar os piores cenários em relação às suas ordens.

4. O que são estratégias de negociação semi-automáticas no Bookmap?

  • A API Bookmap permite que as estratégias de negociação “interceptem” e gerenciem/modifiquem ordens, enviadas pelo usuário a partir do gráfico. Este modo também pode aparecer como modo “inject”. Pode ser útil, por exemplo, para randomizar as distâncias de take-profit e stop-loss. Outro exemplo é um módulo de risco. Observe, no entanto, que o Bookmap espera um feedback válido sobre o status de todas as ordens enviadas do gráfico. É responsabilidade de tal estratégia fornecer esse feedback.

5. Posso usar dados em tempo real para desenvolvimento de API?

  • Para Cripto, dados em tempo real estão disponíveis. No entanto, para desenvolvimentos de API de ações e futuros, você deve usar dados atrasados devido a limitações do fornecedor e da exchange.

6. Posso usar os produtos desenvolvidos para fins não visuais?

  • Os desenvolvimentos de ações e futuros são exclusivamente para exibição. Para uso não visual de dados de ações ou futuros, adquira a licença necessária do fornecedor de dados relevante.

Para dúvidas adicionais, envie um e-mail para support@bookmap.com.