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"

}