Blockchain-websocket-api
https://exchange.blockchain.com/api/#websocket-api
# Simple python websocket client
# https://github.com/websocket-client/websocket-client
from websocket import create_connection
options = {}
options['origin'] = 'https://exchange.blockchain.com'
url = "wss://ws.blockchain.info/mercury-gateway/v1/ws"
ws = create_connection(url, **options)
msg = '{"token": "{API_SECRET}", "action": "subscribe", "channel": "auth"}'
ws.send(msg)
result = ws.recv()
print(result)
# { "seqnum":0,
# "event":"subscribed",
# "channel":"auth",
# "readOnly":false }
ws.close()
A interação com a API exigirá uma chave de API. Para gerar uma, vá para a seção API das configurações de usuário do Blockchain.com Exchange. Cada chave de API gerada será vinculada à sua conta. A única informação necessária é um nome de chave. Opcionalmente, você pode definir o acesso de negociação e a lista de permissões de endereço IP.
Depois que sua chave for criada, você verá uma API Key e uma API Secret . Guarde o segredo em um lugar seguro, pois ele só será exibido uma vez.
Conexão
O ponto final do websocket é,
Ambiente URI
prod wss://ws.blockchain.info/mercury-gateway/v1/ws
Para conectar você precisa adicionar os seguintes cabeçalhos à solicitação de conexão
Ambiente Cabeçalhos
prod Origin: https://exchange.blockchain.com
Pedidos
Cada mensagem enviada ao servidor terá pelo menos 2 campos: ação e canal.
Canal
Um canal fornece contexto sobre o tipo de dados que estão sendo comunicados entre o cliente e o servidor. Há vários canais disponíveis:
Canal Visibilidade Descrição
batimento cardíaco anônimo Receber mensagens de pulsação
l2 anônimo Receba dados do livro de ordens de nível 2 (agregados)
l3 anônimo Receba dados do livro de ordens de nível 3 (agregados)
preços anônimo Receba dados do mercado de velas
símbolos anônimo Receber mensagens de símbolos
relógio anônimo Receber mensagens de ticker
negócios anônimo Receber mensagens de execução de negociação
autorização autenticado Para autenticar uma conexão de web socket
saldos autenticado Para receber atualizações de saldo
negociação autenticado Envie e cancele pedidos, receba instantâneos e atualizações de pedidos
Ação
actiondescreve qual ação tomar para o canal fornecido. As seguintes ações padrão são suportadas por todos os canais (com exceção do canal auth):
Ação Descrição
inscrever-se Inscreva-se no canal e atributos fornecidos
cancelar inscrição Cancelar inscrição do canal e atributos fornecidos
Um canal pode expor outras ações personalizadas.
Resposta
Números de sequência
Cada mensagem enviada do servidor conterá um número de sequência seqnumque será incrementado em 1 com cada mensagem. Se o cliente receber um seqnumque pulou uma ou mais sequências, isso indica que uma mensagem foi perdida e o cliente é recomendado a reiniciar a conexão websocket.
Evento
Além disso, cada campo de resposta conterá um campo de evento com o canal correspondente para indicar o propósito da mensagem. Os seguintes eventos são suportados:
Evento Tipo Descrição
inscrito administrador O canal foi inscrito com sucesso
não inscrito administrador O canal foi cancelado com sucesso
rejeitado administrador a última ação para o canal foi rejeitada. Um campo de texto será fornecido sobre o motivo da rejeição
instantâneo aplicativo Um instantâneo do canal foi fornecido
atualizado aplicativo Ocorreu uma atualização correspondente ao canal
Cada vez que um actioné aplicado a um canal, um evento administrativo é enviado do servidor para notificar se actionfoi aplicado com sucesso.
Tipos de dados
Todas as mensagens usam o formato JSON padrão. Os seguintes tipos de dados são suportados:
Tipo Descrição Exemplo
número Número decimal assinado 1234,45
corda Cadeia de caracteres unicode codificada em UTF-8 "Falha na autenticação"
carimbo de data/hora Carimbos de hora UTC seguindo a convenção YYYY-MM-DDTHH:MM:SS.ssssssZ ou YYYY-MM-DDTHH:MM:SS.000ssssssZ ou YYYY-MM-DDT00:00:00Z
Uso justo e limites de taxa
{
"event": "rejected",
"text": "Connection throttling enabled, your messages will be ignored."
}
Atualmente, há um limite de 1200 mensagens por minuto. Se o limite for excedido, você receberá um rejectedevento. Após esperar um minuto, a funcionalidade normal será retomada e você poderá enviar mensagens novamente.
Limitação e atrasos nos dados de resposta
As mensagens de resposta e atualização nunca são atrasadas, os clientes receberão todas as atualizações assim que elas acontecerem.
Canais Anônimos
Batimento cardíaco
Inscreva-se no canal:
{
"action": "subscribe",
"channel": "heartbeat"
}
Um heartbeat pode ser enviado pelo servidor ao se inscrever no heartbeatcanal.
Resposta do servidor:
{
"seqnum": 0,
"event": "subscribed",
"channel": "heartbeat"
}
O servidor enviará a confirmação da assinatura.
Exemplo de instantâneo:
{
"seqnum": 1,
"event": "updated",
"channel": "heartbeat",
"timestamp": "2019-05-31T08:36:45.666753Z"
}
As mensagens de instantâneo são enviadas a cada 5 segundos e têm o seguinte formato:
Livro de ordens L2
Inscreva-se no canal:
{
"action": "subscribe",
"channel": "l2",
"symbol": "BTC-USD"
}
Os dados do Order Book de nível 2 estão disponíveis por meio do l2canal. Este canal retorna o volume disponível a cada preço. Todos os níveis de preço são recuperados com este canal. A assinatura é feita por símbolo. Cada entrada em matrizes de lances e pedidos é um nível de preço, juntamente com seus atributos de preço ( px), quantidade ( qty) e número de pedidos ( num).
Resposta do servidor:
{
"seqnum": 1,
"event": "subscribed",
"channel": "l2",
"symbol": "BTC-USD"
}
Instantâneos:
{
"seqnum": 2,
"event": "snapshot",
"channel": "l2",
"symbol": "BTC-USD",
"bids": [
{
"px": 8723.45,
"qty": 1.45,
"num": 2
},
{
"px": 8124.45,
"qty": 123.45,
"num": 1
}
],
"asks": [
{
"px": 8730.0,
"qty": 1.55,
"num": 2
},
{
"px": 8904.45,
"qty": 13.66,
"num": 2
}
]
}
Não há garantia de ordem em entradas de lances e solicitações.
{
"seqnum": 3,
"event": "updated",
"channel": "l2",
"symbol": "BTC-USD",
"bids": [
{
"px": 8723.45,
"qty": 1.1,
"num": 1
}
],
"asks": []
}
Uma atualização com qtd igual a 0 significa que o preço deve ser removido.
{
"seqnum": 4,
"event": "updated",
"channel": "l2",
"symbol": "BTC-USD",
"bids": [
{
"px": 8723.45,
"qty": 0.0,
"num": 0
}
],
"asks": []
}
Livro de ordens L3
Inscreva-se no canal:
{
"action": "subscribe",
"channel": "l3",
"symbol": "BTC-USD"
}
Os dados do Order Book de nível 3 estão disponíveis por meio do l3canal. Este canal retorna todas as atualizações de pedidos que chegam à bolsa; aplicando as atualizações ao snapshot, você pode recriar o estado completo do orderbook. A assinatura é feita por símbolo. Cada entrada em matrizes bids e ask é um pedido, junto com seus atributos id ( id), price ( px) e quantity ( qty).
Resposta do servidor:
{
"seqnum": 1,
"event": "subscribed",
"channel": "l3",
"symbol": "BTC-USD"
}
Exemplo de instantâneo:
{
"seqnum": 2,
"event": "snapshot",
"channel": "l3",
"symbol": "BTC-USD",
"bids": [
{
"id": "1234",
"px": 8723.45,
"qty": 1.1
},
{
"id": "1235",
"px": 8723.45,
"qty": 0.35
},
{
"id": "234",
"px": 8124.45,
"qty": 123.45
}
],
"asks": [
{
"id": "2222",
"px": 8730.0,
"qty": 0.65
},
{
"id": "2225",
"px": 8730.0,
"qty": 0.9
},
{
"id": "2343",
"px": 8904.45,
"qty": 8.66
},
{
"id": "2353",
"px": 8904.45,
"qty": 5.0
}
]
}
Atualizações seguirão. Uma atualização com qty igual a 0 significa que o pedido deve ser removido.
{
"seqnum": 3,
"event": "updated",
"channel": "l3",
"symbol": "BTC-USD",
"bids": [
{
"id": "1234",
"px": 8723.45,
"qty": 0
}
],
"asks": []
}
Preços
Inscreva-se no canal:
{
"action": "subscribe",
"channel": "prices",
"symbol": "BTC-USD",
"granularity": 60
}
Para receber dados de mercado de candlestick, você pode assinar o canal de preços. As assinaturas são por symbole granularity(em segundos) tem que ser especificado. Os valores de granularidade suportados são:60, 300, 900, 3600, 21600, 86400
Você pode assinar vários símbolos, mas não várias granularidades por símbolo.
Resposta do servidor:
{
"seqnum": 0,
"event": "subscribed",
"channel": "prices",
"symbol": "BTC-USD"
}
O servidor enviará a confirmação da assinatura.
Evento atualizado no canal de preços:
{
"seqnum": 2,
"event": "updated",
"channel": "prices",
"symbol": "BTC-USD",
"price": [1559039640, 8697.24, 8700.98, 8697.27, 8700.98, 0.431]
}
Os dados de preço são uma matriz que consiste em [ timestamp, open, high, low, close, volume]
Símbolos
Para receber atualizações de símbolos, inscreva-se no symbolscanal. O servidor enviará a confirmação da inscrição. A próxima mensagem neste canal será um instantâneo do symbolstatus atual.
Quando o symbolleilão não é interrompido, os dados da mensagem podem estar em branco.
Quando um symbolestá em um estado de parada, os dados do leilão serão preenchidos conforme o livro é construído. Quando um horário de abertura for escolhido, o auction-timecampo mostrará o horário de abertura. Atualizações subsequentes serão enviadas somente se o symbolstatus mudar de alguma forma.
Descrição do campo
Campo Descrição
preço de leilão Se o símbolo for interrompido e for aberto em um leilão, este será o preço de abertura.
tamanho do leilão Tamanho da abertura
hora do leilão Horário de funcionamento no formato HHMM.
desequilíbrio Desequilíbrio do leilão. Se > 0, então haverá ordens de compra restantes no preço do leilão. Se < 0, então haverá ordens de venda restantes no preço do leilão.
status Status do símbolo: aberto, fechado, suspenso, parado, parado-congelado.
moeda_base As quantidades de moeda são expressas em
escala_de_moeda_base O número de decimais em que a moeda pode ser dividida
contra_moeda Os preços das moedas são expressos em
escala_contra_moeda O número de decimais em que a moeda pode ser dividida
min_preço_incremento O preço do instrumento deve ser um múltiplo de min_price_increment * (10^-min_price_increment_scale)
escala_de_incremento_de_preço_min O preço do instrumento deve ser um múltiplo de min_price_increment * (10^-min_price_increment_scale)
tamanho_min_pedido A quantidade mínima para um pedido deste instrumento deve ser min_order_size*(10^-min_order_size_scale)
escala_de_tamanho_do_pedido_mínimo A quantidade mínima para um pedido deste instrumento deve ser min_order_size*(10^-min_order_size_scale)
tamanho_máximo_do_pedido A quantidade máxima para um pedido para este instrumento é max_order_size*(10^-max_order_size_scale). Se for igual a zero, não há limite
escala_máx_de_tamanho_do_pedido A quantidade máxima para um pedido para este instrumento é max_order_size*(10^-max_order_size_scale). Se for igual a zero, não há limite
Inscreva-se no canal:
{
"action": "subscribe",
"channel": "symbols"
}
Resposta do servidor:
{
"seqnum": 0,
"event": "subscribed",
"channel": "symbols"
}
Exemplo de status do símbolo:
{
"seqnum": 1,
"event": "snapshot",
"channel": "symbols",
"symbols": {
"BTC-USD": {
"base_currency": "BTC",
"base_currency_scale": 8,
"counter_currency": "USD",
"counter_currency_scale": 2,
"min_price_increment": 10,
"min_price_increment_scale": 0,
"min_order_size": 50,
"min_order_size_scale": 2,
"max_order_size": 0,
"max_order_size_scale": 8,
"lot_size": 5,
"lot_size_scale": 2,
"status": "halt",
"id": 1,
"auction_price": 0.0,
"auction_size": 0.0,
"auction_time": "",
"imbalance": 0.0
},
"ETH-BTC": {
"base_currency": "ETH",
"base_currency_scale": 8,
"counter_currency": "BTC",
"counter_currency_scale": 8,
"min_price_increment": 100,
"min_price_increment_scale": 8,
"min_order_size": 220001,
"min_order_size_scale": 8,
"max_order_size": 0,
"max_order_size_scale": 8,
"lot_size": 0,
"lot_size_scale": 0,
"status": "open",
"id": 3,
"auction_price": 0.0,
"auction_size": 0.0,
"auction_time": "",
"imbalance": 0.0
},
"BTC-EUR": {
"base_currency": "BTC",
"base_currency_scale": 8,
"counter_currency": "EUR",
"counter_currency_scale": 2,
"min_price_increment": 10,
"min_price_increment_scale": 0,
"min_order_size": 50,
"min_order_size_scale": 2,
"max_order_size": 0,
"max_order_size_scale": 0,
"lot_size": 0,
"lot_size_scale": 0,
"status": "closed",
"id": 4,
"auction_price": 0.0,
"auction_size": 0.0,
"auction_time": "",
"imbalance": 0.0
},
"ETH-EUR": {
"base_currency": "ETH",
"base_currency_scale": 8,
"counter_currency": "EUR",
"counter_currency_scale": 2,
"min_price_increment": 10,
"min_price_increment_scale": 0,
"min_order_size": 50,
"min_order_size_scale": 2,
"max_order_size": 500,
"max_order_size_scale": 2,
"lot_size": 0,
"lot_size_scale": 0,
"status": "open",
"id": 5,
"auction_price": 0.0,
"auction_size": 0.0,
"auction_time": "",
"imbalance": 0.0
},
"ETH-USD": {
"base_currency": "ETH",
"base_currency_scale": 8,
"counter_currency": "USD",
"counter_currency_scale": 2,
"min_price_increment": 5,
"min_price_increment_scale": 0,
"min_order_size": 50,
"min_order_size_scale": 2,
"max_order_size": 0,
"max_order_size_scale": 0,
"lot_size": 0,
"lot_size_scale": 0,
"status": "open",
"id": 2,
"auction_price": 0.0,
"auction_size": 0.0,
"auction_time": "",
"imbalance": 0.0
}
}
}
Exemplo de símbolo não interrompido:
{
"seqnum": 1,
"event": "updated",
"channel": "symbols",
"symbol": "BTC-USD",
"auction-price": 0,
"auction-size": 0,
"auction-time": "",
"imbalance": 0,
"status": "open"
}
Exemplo de símbolo parado:
{
"seqnum": 1,
"event": "updated",
"channel": "symbols",
"symbol": "BTC-USD",
"auction-price": 4500.5,
"auction-size": 220.125,
"auction-time": "2230",
"imbalance": -0.5,
"status": "halt"
}
Marcador
Inscreva-se no canal:
{
"action": "subscribe",
"channel": "ticker",
"symbol": "BTC-USD"
}
Para receber atualizações do ticker, tickero canal está disponível. As assinaturas são novamente por símbolo. O servidor enviará a confirmação da assinatura.
Resposta do servidor:
{
"seqnum": 0,
"event": "subscribed",
"channel": "ticker"
}
Exemplo de instantâneo do ticker:
{
"seqnum": 8,
"event": "snapshot",
"channel": "ticker",
"symbol": "BTC-USD",
"price_24h": 4988.0,
"volume_24h": 0.3015,
"last_trade_price": 5000.0
}
Comércios
Para receber atualizações de negociações sobre execuções em cada mercado da Bolsa, você pode se inscrever no tradescanal.
As assinaturas são novamente por símbolo.
{
"action": "subscribe",
"channel": "trades",
"symbol": "ETH-USD"
}
O servidor enviará a confirmação da assinatura.
{
"seqnum": 0,
"event": "subscribed",
"channel": "trades",
"symbol": "ETH-USD"
}
Exemplo de atualização comercial:
{
"seqnum": 21,
"event": "updated",
"channel": "trades",
"symbol": "BTC-USD",
"timestamp": "2019-08-13T11:30:06.100140Z",
"side": "sell",
"qty": 8.5e-5,
"price": 11252.4,
"trade_id": "12884909920"
}
Canais Autenticados
Autenticado
Para autenticar uma conexão de web socket, o cliente deve assinar o authcanal passando um campo de token. Alternativamente, um cliente pode fornecer o cookie de cabeçalho auth_tokenem uma nova conexão e então a autenticação ocorrerá imediatamente sem a necessidade de assinar o authcanal.
Se a autenticação for bem-sucedida, o servidor enviará uma notificação inicial.
{
"seqnum": 0,
"event": "subscribed",
"channel": "auth"
}
Se a autenticação não for bem-sucedida, o servidor enviará a seguinte notificação:
{
"seqnum": 0,
"event": "rejected",
"channel": "auth",
"text": "Authentication Failed"
}
Negociação
O cliente pode enviar e cancelar ordens, bem como receber execuções de ordens, por meio do tradingcanal. As mensagens estão no formato JSON e os nomes dos atributos estão usando nomes de campo FIX 4.2 padronizados.
Abaixo está uma tabela mostrando os campos FIX permitidos usados como uma chave JSON para cancelar/criar um pedido:
Marcação Campo Tipo Obrigatório Descrição Exemplo
11 ID da Ordem corda SIM Campo de referência fornecido pelo cliente e não pode exceder 20 caracteres "ABC"
55 símbolo corda SIM Identificador de símbolo de blockchain "BTC-USD"
40 Tipo de ord corda SIM "mercado" para mercado "limite" para limite, "stop" para parar, "stopLimit" para stopLimit "limite"
59 tempoEmForça corda SIM "GTC" para bom até cancelamento, "IOC" para imediato ou cancelamento, "FOK" para preencher ou matar, "GTD" data de validade "GTC"
54 lado corda SIM "comprar" para comprar, "vender" para vender "comprar"
38 quantidade do pedido número SIM O tamanho do pedido em termos da moeda base 10.23
44 preço número necessário para tipos de ordens limit e stopLimit O preço limite para o pedido 0,12345
432 data de expiração número necessário para pedidos GTD data de validade no formato AAAAMMDD 20190318
99 parePx número necessário para tipos de ordens limit e stopLimit Preço para acionar a ordem de parada 3500,12
110 Quantidade mínima número Opcional para todas as ordens de mercado e para ordens limitadas com IOC timeInForce A quantidade mínima necessária para um preenchimento de COI 10.0
18 executarInst corda Opcional para ordens de limite A ordem é colocada com Add Liquidity Only (também conhecido como Post Only): ela não corresponderá à liquidez imediatamente. Ela será rejeitada em vez de corresponder à liquidez no mercado. "ALO"
Abaixo está uma tabela representando as diferentes permutações permitidas para os campos FIX, com X indicando o que pode ser adicionado e onde O não é necessário:
Mercado Limite Parar Limite de parada
ID da Ordem X X X X
símbolo X X X X
Tipo de ord X X X X
tempoEmForça O X X X
lado X X X X
quantidade do pedido X X X X
preço X X
data de expiração O
parePx X X
Quantidade mínima O O
O servidor pode incluir os seguintes campos FIX adicionais ao notificar uma atualização de pedido:
Marcação Campo Tipo Descrição Exemplo
35 Tipo de mensagem corda "8" para ExecutionReport, "9" para OrderCancelRejected "8"
150 Tipoexec corda "0" para novo, "4" para cancelado, "C" para expirado, "8" para rejeitado, "F" para preenchimento parcial, "A" para pendente, "H" para interrupção de negociação, "I" status do pedido "O"
39 status da ordem corda 'cancelado', 'expirado', ...
37 ID do pedido corda O ID de pedido exclusivo atribuído pela bolsa "11111111"
37 IDexec corda Identificador único para a execução "123456"
32 últimas ações número A quantidade executada para o último preenchimento do pedido 0,5678
31 últimoPx número O preço executado para o último preenchimento 3500,12
151 folhasQtd corda Para pedidos abertos e parcialmente preenchidos, esta é a quantidade restante aberta para execução. Para pedidos cancelados e expirados, esta é a quantidade que ainda estava aberta antes do cancelamento/expiração. Para pedidos rejeitados, é igual a orderQty. Para outros estados, é sempre zero. 10.0
14 Quantidade cumulativa número A quantidade do pedido que foi atendida 0,123345
60 Tempo de transação corda A hora em que a transação ocorreu "2019-08-13T13:15:35.000955868Z"
6 médiaPx número Calculou o preço médio ponderado por volume de todos os preenchimentos para este pedido 345,33
1004 ID comercial corda O ID exclusivo atribuído ao preenchimento do pedido, também conhecido como negociação "77309432596"
estado
Os campos enumerados são definidos da seguinte forma:
Nome Descrição Exemplo
pendente A ordem está pendente de aceitação. Aplicável somente a ordens stop e stop-limit
abrir O pedido foi aceito
rejeitado O pedido foi rejeitado Ordens limitadas e de mercado podem ser rejeitadas se você não tiver saldo para atender a ordem, mesmo que parcialmente.
cancelado O pedido foi cancelado Uma ordem de mercado pode entrar em estado cancelado se você não tiver saldo suficiente para preenchê-la ao preço de mercado. Tanto ordens de mercado quanto ordens limitadas com IOC podem ter ordStatus 'cancelado' se não houver mercado para elas, mesmo sem o usuário solicitar o cancelamento.
preenchido O pedido foi atendido Uma ordem de limite entra em estado cancelado após o usuário solicitar o cancelamento.
parcial O pedido foi parcialmente atendido
expirado O pedido expirou
tipo
Nome Descrição
limite pedido que tem um limite de preço
mercado ordem que corresponderá a qualquer preço disponível no mercado, partindo dos melhores preços e preenchendo até o saldo disponível
parar ordem que tem um preço de parada/gatilho e, quando esse preço é atingido, ele aciona uma ordem de mercado
pararLimite ordem que tem um preço de parada e um preço limite e, quando o preço de parada é atingido, ele aciona uma ordem limite no preço limite
tempoEmForça
Para assinar:
{
"action": "subscribe",
"channel": "trading"
}
Para enviar e cancelar pedidos, bem como receber atualizações de pedidos em tempo real, inscreva-se no tradingcanal autenticado.
Resposta do servidor:
{
"seqnum": 1,
"event": "subscribed",
"channel": "trading"
}
A próxima mensagem será um instantâneo dos pedidos ativos do usuário conectado"
{
"seqnum": 3,
"event": "snapshot",
"channel": "trading",
"orders": [
{
"orderID": "12891851020",
"clOrdID": "78502a08-c8f1-4eff-b",
"symbol": "BTC-USD",
"side": "sell",
"ordType": "limit",
"orderQty": 5.0e-4,
"leavesQty": 5.0e-4,
"cumQty": 0.0,
"avgPx": 0.0,
"ordStatus": "open",
"timeInForce": "GTC",
"text": "New order",
"execType": "0",
"execID": "11321871",
"transactTime": "2019-08-13T11:30:03.000593290Z",
"msgType": 8,
"lastPx": 0.0,
"lastShares": 0.0,
"tradeId": "0",
"price": 15000.0
}
]
}
Nome Descrição
Termos e Condições Gerais Bom até cancelar. O pedido permanecerá no livro de pedidos até ser cancelado ou preenchido
GTD Válido até a data. O pedido será redefinido no livro de pedidos até que seja cancelado, preenchido ou expirado
FOK Preencher ou Matar. O pedido é completamente preenchido ou cancelado. Nenhum Preenchimento Parcial é permitido.
COI Imediato ou Cancelar. O pedido é a) completamente preenchido, b) parcialmente preenchido e a quantidade restante cancelada, ou c) o pedido é cancelado.
Quais TIF são suportados. X para suportado
Mercado Limite Parar Limite de parada
Termos e Condições Gerais X X X
GTD X X X
COI X
FOK X
O tradingcanal suporta as seguintes ações adicionais:
Ação Descrição
Novo pedido único Cria uma ordem
CancelarPedidoSolicitar Cancela um pedido
OrderMassCancelRequest Cancelar vários pedidos
PedidoMassStatusRequest Instantâneo de pedidos ao vivo
Cancelar ao desconectar
Ao assinar este canal, os usuários podem habilitar o cancelamento na desconexão. Isso garante que, quando a conexão for desconectada, todos os pedidos ativos do usuário serão cancelados.
Para assinar:
{
"action": "subscribe",
"channel": "trading",
"cancelOnDisconnect": true
}
Resposta do servidor:
{
"seqnum": 1,
"event": "subscribed",
"channel": "trading",
"cancelOnDisconnect": true
}
Uma vez habilitado, o cancelamento na desconexão não pode ser desativado para esta conexão. Até mesmo cancelar a assinatura do canal de negociação acionará o cancelamento de todas as ordens ativas.
A próxima mensagem será um instantâneo dos pedidos ativos do usuário conectado"
{
"seqnum": 3,
"event": "snapshot",
"channel": "trading",
"orders": [
{
"orderID": "12891851020",
"clOrdID": "78502a08-c8f1-4eff-b",
"symbol": "BTC-USD",
"side": "sell",
"ordType": "limit",
"orderQty": 5.0e-4,
"leavesQty": 5.0e-4,
"cumQty": 0.0,
"avgPx": 0.0,
"ordStatus": "open",
"timeInForce": "GTC",
"text": "New order",
"execType": "0",
"execID": "11321871",
"transactTime": "2019-08-13T11:30:03.000593290Z",
"msgType": 8,
"lastPx": 0.0,
"lastShares": 0.0,
"tradeId": "0",
"price": 15000.0
}
]
}
Criar um novo pedido (NewOrderSingle)
Exemplo de criação de uma ordem de limite GTC:
{
"action": "NewOrderSingle",
"channel": "trading",
"clOrdID": "Client ID 3",
"symbol": "BTC-USD",
"ordType": "limit",
"timeInForce": "GTC",
"side": "sell",
"orderQty": 10.0,
"price": 3400.0,
"execInst": "ALO"
}
Esta ação cria um pedido usando os campos fornecidos, conforme descrito acima.
Cada vez que um pedido muda de estado ou tem uma correspondência, um evento será enviado do servidor:
{
"seqnum": 3,
"event": "updated",
"channel": "trading",
"msgType": "8",
"clOrdID": "Client ID 3",
"orderID": "999999878",
"ordStatus": "open",
"execType": "0",
"symbol": "BTC-USD",
"side": "sell",
"orderQty": 10.0,
"ordType": "limit",
"price": 3400.0,
"transactTime": "2019-08-13T13:09:34.000659345Z",
"leavesQty": 10.0,
"cumQty": 0.0,
"avgPx": 0.0
}
A próxima mensagem será um instantâneo dos pedidos ativos do usuário conectado:
{
"seqnum": 3,
"event": "snapshot",
"channel": "trading",
"orders": [
{
"orderID": "12891851020",
"clOrdID": "78502a08-c8f1-4eff-b",
"symbol": "BTC-USD",
"side": "sell",
"ordType": "limit",
"orderQty": 5.0e-4,
"leavesQty": 5.0e-4,
"cumQty": 0.0,
"avgPx": 0.0,
"ordStatus": "open",
"timeInForce": "GTC",
"text": "New order",
"execType": "0",
"execID": "11321871",
"transactTime": "2019-08-13T11:30:03.000593290Z",
"msgType": 8,
"lastPx": 0.0,
"lastShares": 0.0,
"tradeId": "0",
"price": 15000.0
}
]
}
Exemplos
Exemplo de uma resposta caso sua ordem de mercado seja atendida:
{
"seqnum": 5,
"event": "updated",
"channel": "trading",
"orderID": "12891915594",
"clOrdID": "b50112a2-9851-43ce-a",
"symbol": "BTC-USD",
"side": "sell",
"ordType": "market",
"orderQty": 0.001,
"leavesQty": 0.0,
"cumQty": 0.001,
"avgPx": 11142.7,
"ordStatus": "filled",
"timeInForce": "GTC",
"text": "Fill",
"execType": "F",
"execID": "11451022",
"transactTime": "2019-08-13T13:50:02.000027480Z",
"msgType": 8,
"lastPx": 11142.7,
"lastShares": 0.001,
"tradeId": "12884910084"
}
Exemplo de uma resposta onde sua ordem limitada é aceita e permanece no livro de ordens sem preenchimentos:
{
"seqnum": 3,
"event": "updated",
"channel": "trading",
"orderID": "12895385711",
"clOrdID": "ac3f50b0-ec1c-456f-9",
"symbol": "BTC-USD",
"side": "buy",
"ordType": "limit",
"orderQty": 0.001,
"leavesQty": 0.001,
"cumQty": 0.0,
"avgPx": 0.0,
"ordStatus": "open",
"timeInForce": "GTC",
"text": "New order",
"execType": "0",
"execID": "18389438",
"transactTime": "2019-08-16T11:07:55.000648119Z",
"msgType": 8,
"lastPx": 0.0,
"lastShares": 0.0,
"tradeId": "0",
"price": 10065.0
}
Se sua ordem de limite for rejeitada, você receberá:
{
"seqnum": 5,
"event": "rejected",
"channel": "trading",
"text": "Invalid price",
"clOrdID": "Client ID 3",
"ordStatus": "rejected",
"action": "NewOrderSingle"
}
ou:
{
"seqnum": 5,
"event": "updated",
"channel": "trading",
"orderID": "-1",
"clOrdID": "71bf645a-6619-499f-9",
"symbol": "BTC-USD",
"side": "sell",
"ordType": "limit",
"orderQty": 100.0,
"leavesQty": 0.0,
"cumQty": 100.0,
"avgPx": 0.0,
"ordStatus": "rejected",
"timeInForce": "GTC",
"text": "Insufficient Balance",
"execType": "8",
"execID": "0",
"transactTime": "1970-01-01T00:00:00Z",
"msgType": 8,
"lastPx": 0.0,
"lastShares": 0.0,
"tradeId": "0",
"price": 16000.3
}
ou:
{
"seqnum": 5,
"event": "updated",
"channel": "trading",
"orderID": "0",
"clOrdID": "12345678901234567890",
"symbol": "BTC-USD",
"side": "sell",
"ordType": "limit",
"orderQty": 0.001,
"leavesQty": 0.001,
"cumQty": 0.0,
"avgPx": 0.0,
"ordStatus": "rejected",
"timeInForce": "GTC",
"text": "Marketable AOL order",
"execType": "8",
"execID": "18331458",
"transactTime": "2019-08-16T10:39:19.000525614Z",
"msgType": 8,
"lastPx": 0.0,
"lastShares": 0.0,
"tradeId": "0",
"price": 100.3
}
Se sua ordem de mercado for rejeitada, você receberá:
{
"seqnum": 3,
"event": "updated",
"channel": "trading",
"orderID": "-1",
"clOrdID": "Client ID 3",
"symbol": "BTC-USD",
"side": "sell",
"ordType": "market",
"orderQty": 100.0,
"leavesQty": 0.0,
"cumQty": 100.0,
"avgPx": 0.0,
"ordStatus": "rejected",
"timeInForce": "IOC",
"text": "Insufficient Balance",
"execType": "8",
"execID": "0",
"transactTime": "1970-01-01T00:00:00Z",
"msgType": 8,
"lastPx": 0.0,
"lastShares": 0.0,
"tradeId": "0",
"minQty": 0.0
}
ou:
{
"seqnum": 1,
"event": "updated",
"channel": "trading",
"orderID": "4561237891",
"clOrdID": "Client ID 3",
"symbol": "BTC-USD",
"side": "buy",
"ordType": "market",
"orderQty": 3.0,
"leavesQty": 3.0,
"cumQty": 0.0,
"avgPx": 0.0,
"ordStatus": "cancelled",
"timeInForce": "GTC",
"text": "Met cash limit",
"execType": "4",
"execID": "1111111111",
"transactTime": "2019-01-01T08:08:08.000888888Z",
"msgType": 8,
"lastPx": 0.0,
"lastShares": 0.0,
"tradeId": "0",
"fee": 0.0
}
Cancelar um pedido (CancelOrderRequest)
Para cancelar o pedido:
{
"action": "CancelOrderRequest",
"channel": "trading",
"orderID": "999999878"
}
Resposta do servidor:
{
"seqnum": 18,
"event": "updated",
"channel": "trading",
"orderID": "999999878",
"clOrdID": "Client ID 3",
"symbol": "BTC-USD",
"side": "sell",
"ordType": "limit",
"orderQty": 10.0,
"leavesQty": 10.0,
"cumQty": 0.0,
"avgPx": 0.0,
"ordStatus": "cancelled",
"timeInForce": "GTC",
"text": "Canceled by User",
"execType": "4",
"execID": "11397697",
"transactTime": "2019-08-13T13:15:35.000955868Z",
"msgType": 8,
"lastPx": 0.0,
"lastShares": 0.0,
"tradeId": "0",
"price": 3400.0
}
Se o cliente fornecer um orderId inválido, ele retornará um cancelamento rejeitado:
{
"seqnum": 18,
"event": "rejected",
"channel": "trading",
"text": "Internal server error"
}
Solicitação de cancelamento de pedido em massa (OrderMassCancelRequest)
Para cancelar o pedido:
{
"action": "OrderMassCancelRequest",
"channel": "trading"
}
Resposta do servidor:
{
"action": "OrderMassCancelRequest",
"channel": "trading",
"symbol": "BTC-USD"
}
Os usuários têm a capacidade de cancelar todas as suas ordens ativas de uma vez usando esta ação. Um símbolo pode ser opcionalmente especificado para reduzir o escopo desta ação. Após solicitar um cancelamento em massa, os relatórios de execução para as ordens afetadas seguirão.
Solicitação de status de pedido em massa (OrderMassStatusRequest)
Para cancelar o pedido:
{
"action": "OrderMassStatusRequest",
"channel": "trading"
}
Pedidos ao vivo podem ser listados a qualquer momento com esta solicitação. A resposta subsequente conterá um snapshot similar ao recebido ao assinar este canal.
Saldos
Para receber saldos de um usuário, assine o canal de saldos autenticados:
{
"action": "subscribe",
"channel": "balances"
}
Resposta do servidor:
{
"seqnum": 1,
"event": "subscribed",
"channel": "balances"
}
Instantâneo dos saldos dos usuários (saldos zero não são enviados no instantâneo inicial):
{
"seqnum": 2,
"event": "snapshot",
"channel": "balances",
"balances": [
{
"currency": "BTC",
"balance": 0.00366963,
"available": 0.00266963,
"balance_local": 38.746779155,
"available_local": 28.188009155,
"rate": 10558.77
},
{
"currency": "USD",
"balance": 11.66,
"available": 0.0,
"balance_local": 11.66,
"available_local": 0.0,
"rate": 1.0
},
{
"currency": "ETH",
"balance": 0.18115942,
"available": 0.18115942,
"balance_local": 37.289855013,
"available_local": 37.289855013,
"rate": 205.84
}
],
"total_available_local": 65.477864168,
"total_balance_local": 87.696634168
}
Cada vez que o saldo muda, um novo evento de snapshot será enviado do servidor; este canal tem apenas o evento 'snapshot', não 'updates'
{
"seqnum": 19,
"event": "snapshot",
"channel": "balances",
"balances": [
{
"currency": "BTC",
"balance": 0.00266963,
"available": 0.00166963,
"balance_local": 28.188009155,
"available_local": 17.629239155,
"rate": 10558.77
},
{
"currency": "USD",
"balance": 22.18,
"available": 10.52,
"balance_local": 22.18,
"available_local": 10.52,
"rate": 1.0
},
{
"currency": "ETH",
"balance": 0.18115942,
"available": 0.18115942,
"balance_local": 37.289855013,
"available_local": 37.289855013,
"rate": 205.84
}
],
"total_available_local": 65.439094168,
"total_balance_local": 87.657864168
}
Pontos de extremidade REST
Consultar status de pedido único
Exemplo de solicitação:
GET https://api.blockchain.com/exchange/order/21745988181
Resposta:
{
"orderId": 21745988181,
"gwOrderId": 2789221636,
"clOrdId": "d7402f75314a4cf1webd",
"symbol": "ETH-BTC",
"ordType": "limit",
"timeInForce": "GTC",
"side": "buy",
"orderQty": 1.0,
"minQty": 0.0,
"cumQty": 0.0,
"price": 0.015797,
"stopPx": 0.0,
"ordStatus": "cancelled",
"expireDate": 20200414,
"execID": "537374697",
"avgPx": 0.0
}
Para consultar o status de um único pedido, os usuários podem utilizar o seguinte endpoint.
Item Descrição
URL https://api.blockchain.com/exchange/order/{orderId}
Método HTTP PEGAR
Cabeçalhos obrigatórios Cookie: auth_token={apiKey}
Os usuários podem se autenticar usando chaves de API, fornecendo um cookie chamado auth_token com o valor definido para sua chave de API.
Ver endereços na lista de permissões
Exemplo de solicitação:
GET https://api.blockchain.com/exchange/beneficiaries
Resposta:
{
"capabilities": [
{
"currency": "BTC",
"address": true,
"xpub": false,
"existingBeneficiaryOnly": false,
"fiat": false
},
{
"currency": "ETH",
"address": true,
"xpub": false,
"existingBeneficiaryOnly": false,
"fiat": false
}
],
"enabled": true,
"enabledAt": "2020-05-08T11:41:32.664Z",
"whitelisted": [
{
"id": "298907ac-07df-47ab-93d5-5594e019813b",
"address": "******************************2v7b",
"agent": {
"account": "",
"address": null,
"code": null,
"country": null,
"name": null,
"recipient": null,
"routingNumber": null
},
"currency": "BTC",
"state": "ACTIVE",
"name": "My Ledger Device",
"whitelisted": true,
"fiat": false
}
]
}
Para ver a lista de beneficiários permitidos, os usuários podem utilizar o seguinte endpoint.
Item Descrição
URL https://api.blockchain.com/exchange/beneficiaries
Método HTTP PEGAR
Cabeçalhos obrigatórios Cookie: auth_token={apiKey}
Os usuários podem se autenticar usando chaves de API, fornecendo um cookie chamado auth_token com o valor definido para sua chave de API.
Criar uma retirada
Exemplo de solicitação:
POST https://api.blockchain.com/exchange/withdrawals
{
"currency": "BTC",
"amount": "0.0001",
"beneficiary": "3ff5bc82-b118-45b3-b468-9697be208bdf"
}
Resposta:
{
"id": "1941fcdd-d16a-4b5a-998e-f58f5862af88",
"user": "e9307d88-bd92-4fdf-840c-7e30fbb0bbd7",
"product": "MERCURY",
"amount": {
"symbol": "BTC",
"value": "0.0001"
},
"fee": {
"symbol": "BTC",
"value": "0.0005"
},
"state": "NONE"
}