Este site usa cookies e tecnologias afins que nos ajudam a oferecer uma melhor experiência. Ao clicar no botão "Aceitar" ou continuar sua navegação você concorda com o uso de cookies.

Aceitar
Como criar robô trader da Binance em Node.js - Parte 2

Node.js

Como criar robô trader da Binance em Node.js - Parte 2

Luiz Duarte
Escrito por Luiz Duarte em 26/04/2021
Junte-se a mais de 22 mil profissionais de TI

Entre para minha lista e receba conteúdos exclusivos e com prioridade

Desde a primeira vez que escrevi a primeira parte deste tutorial de criação de um bot para comprar e vender Bitcoins e outras criptomoedas usando a API da Binance, a valorização da moeda tem sofrido uma grande correção, o que permite a novos entrantes aproveitarem a próxima onda de valorização.

Na primeira parte foquei nos conceitos fundamentais, criação e configuração da conta na exchange, criação do projeto e codificação do algoritmo de monitoramento do mercado. Agora faremos a codificação do nosso bot para que ele consiga comprar e vender criptomoedas.

Atenção: ganhos passados não representam garantia de ganhos futuros. Criptomoedas são investimentos de risco e portanto você pode perder muito dinheiro mesmo acreditando que sabe operar neste mercado. Eu NÃO SOU responsável e jamais serei pelas suas perdas, eu apenas ensino a criar programas de computador, não aconselho investimentos, ok?

Ao invés de ler este tutorial, você pode assistir ao vídeo abaixo, que possui o mesmo conteúdo.

Livro Node.js

#1 – Setup da conta de teste

No tutorial passado deixamos o arquivo .env preparado para nossas credenciais de negociação na API da Binance, lembra? As variáveis API_KEY e SECRET_KEY são justamente duas informações super importantes que você obtém acesso diretamente na sua conta da Binance e que deve ser guardada a sete chaves, como dizem. Se você ainda não obteve estas credenciais, você não precisa ter para este tutorial, mas vai precisar para poder rodar este bot em modo “produção”, pra valer. Então, siga os passos da própria Binance para gerar suas chaves.

Não esqueça de incluir o arquivo .env no seu .gitignore se estiver usando GitHub, para não correr o risco de compartilhar publicamente suas chaves.

Mas por que eu disse que não é obrigatório ter estas chaves agora?

Porque vamos usar uma API de teste da Binance!

A Binance disponibiliza uma API de teste que podemos usar durante todo nosso desenvolvimento e brincar à vontade, o que facilita muito a nossa vida pois caso contrário teríamos que gastar dinheiro de verdade para fazer os testes de compra e venda.

Eles chamam essa API de teste de TestNet e você deve fazer um cadastro nela e também gerar chaves de acesso. Esse cadastro é feito se autenticando com sua conta do GitHub e autorizando a Binance a se conectar nela, o que pode ser feito acessando este link.

Assim, quando gerar as chaves de teste, volte no seu arquivo .env e configure as chaves e URL de teste, como abaixo. Se seu arquivo .env já estava com as chaves de produção, você pode substitui-las ou comentá-las, usando # no início da linha. O resultado deve ficar como abaixo, sendo que a API_URL que estou informando é a mesma que VOCÊ precisa informar, pois é a URL da TestNet que todo mundo usa.

Com isso configurado, estamos prontos para o segundo passo.

Livro Micro Serviços

#2 – Entendendo a TestNet

Antes de programar compra e venda, você precisa entender algumas coisas sobre o funcionamento da TestNet.

Essa API de teste possui os mesmos endereços e comandos da API real, então se você testar seu bot novamente agora, ele em tese vai passar a receber os dados fake do mercado. Importante salientar que esse “mercado” é COMPLETAMENTE fake, inclusive os symbols, então se tentar rodar para monitorar BTCBRL, não vai rolar.

Além disso, todos os dias o mercado é reiniciado, então o seu saldo fake e carteira fake devem mudar de vez em quando, sem a sua intervenção.

Mas voltando ao primeiro assunto, dos symbols, o primeiro passo para usar a TestNet é entender os symbols que existem nela, para que depois a gente brinque de compra e venda com os symbols fake antes de gastarmos dinheiro de verdade com a API de produção.

Para descobrir os symbols podemos usar um endpoint chamado Exchange Info, que traz as informações do que está sendo comercializado an Exchange atualmente. Voltando ao seu api.js, adicione mais uma função bem simples ao final do módulo para fazer esta chamada.

Note que ela é idêntica à outras funções públicas que já usamos, mudando apenas a URL e que coloquei no final um Operador Ternário para, caso o symbol tenha sido passado, a gente vai retornar as informações somente dele, caso contrário, vamos retornar todas. Isso vai ficar mais claro o porquê quando você modificar o código da index.js momentaneamente só para rodarmos essa função uma vez.

O resultado do código acima você confere na imagem abaixo. Na verdade apenas um trecho do retorno pois você vai notar que ele demora e que lista milhares de symbols diferentes.

Repare no primeiro resultado do retorno, que é um array de objetos, que cada objeto possui propriedades como symbol (o coinpair, repare que na TestNet é fictício), o status (só podemos comprar e vender moedas que estejam em TRADING) e uma série de outras informações desta moeda nesta exchange (todas fakes).

Podemos pegar este primeiro retorno que você tiver (não necessariamente o da minha imagem) para decidir que vamos operar em cima de BNBBUSD.

Com este symbol, vamos voltar no nosso index.js e vamos mudá-lo para que a função de depth busque informações do order book para este symbol.

Agora, ao executarmos, será retornada as informações do order book fake para este symbol (também fake). Como abaixo.

Repare que no meu retorno (o seu pode ser completamente diferente), existem apenas duas ordens de venda posicionadas e NENHUMA ordem de compra.  Talvez você queira procurar outra moeda com mais ordens, até para facilitar os seus testes depois. Mas sendo sincero, isso não é um grande problema visto que teremos de começar comprando, para depois vender. Então só se não tivesse ninguém vendendo na TestNet, aí seria um problema mesmo.

Curso FullStack

#3 – Vendo situação da sua carteira

A primeira coisa que vamos querer fazer é programar nosso robô para que ele consiga comprar cripto sozinho. Mas antes disso, precisaremos pegar as informações da nossa carteira, uma operação bem mais simples mas que ao mesmo tempo deixará pronta a base para TODAS as demais operações privadas. Sim, pois aquela função publicCall só serve para chamadas públicas, ou seja, informações sem autenticação, sem criptografia, etc. Comprar e vender é outra história.

Sendo assim, volte ao seu api.js e modifique-o para que seja adicionado um novo pacote (ele é nativo, então não rode npm install nele) e uma nova função, a privateCall.

O pacote crypto, nativo do Node.js e que importamos logo no início, servirá para criptografarmos a assinatura digital de nossa requisição. Essa é uma informação única e pessoal em cada request, baseado em seu SECRET_KEY, os dados da sua requisição e a hora atual (timestamp). Essa assinatura deve ser gerada a cada requisição pois, como disse antes, é única. Também é muito importante que ela seja feita usando o algoritmo HMAC com hashing SHA256, assim como fiz ali em cima, padrões estes definidos pela Binance na sua documentação oficial, não por mim.

Além desta assinatura, pegaremos a API_KEY para colocar em um header específico X-MBX-APIKEY e montaremos a URL da requisição usando a API_URL, o path (que varia conforme a ação que quer fazer na API) e a query string formada pela assinatura, timestamp e qualquer dado adicional que possa ser necessário para a operação.

Com esta privateCall pronta, poderemos criar uma infinidade de funções privadas na nossa api.js, sendo a primeira função a que pega as informações da nossa carteira, que chamamos de accountInfo.

Esta é uma chamada muito simples, sem parâmetros adicionais. Baseado na API_KEY enviada automaticamente na querystring, o servidor da Binance vai buscar a posição da carteira desta conta, retornando um objeto, contendo todas as moedas que possui, como abaixo (o seu retorno pode ser diferente do meu). Para chegar neste resultado, eu modifiquei o robô para executar esta função accountInfo.

Repare que possuo 1.000 BNB e que também possuo 10.000 BUSD. Essas são as moedas que vou usar nos testes, visto que o symbol que escolhi para testar lá atrás quando fizemos o ExchangeInfo foi o BNBBUSD, lembra?

Se eu modificar o index.js para que traga informações de mercado e da carteira, juntas, inclusive resumindo algumas delas para o que mais me importa para tomar decisão, teremos algo como abaixo.

Gerando o resultado a seguir, com a minha conta e os dados atuais da TestNet.

Repare que o menor preço do BNB à venda é de 603 em BUSD. Sendo assim, eu tenho dinheiro para comprar, o que faremos a seguir.

Possíveis problemas

A API da Binance é RESTful, o que significa que eles seguem uma série de padrões de desenvolvimento, muitos deles definidos pela especificação do protocolo HTTP, como o uso dos status code corretos. Baseado no status code retornado, você terá algumas pistas do que fez errado no caso de não retornar a sua carteira mas sim uma exceção.

Um 404 indica que você montou a URL errada, revise esta informação.

Um 401 indica que a sua API_KEY ou SECRET_KEY estão erradas, revise estas duas variáveis e/ou recrie-as no seu painel da TestNet.

Um 400 é o mais cretino de todos, pois pode ser várias coisas diferentes mas, geralmente, será informações erradas passadas na querystring (ou ausentes). Então revise a querystring da sua requisição.

Estes problemas citados acima são os mais comuns de acontecer com a API da Binance e se aplicam também às funções que criaremos a seguir, na parte 3 deste tutorial.

Curso Node.js e MongoDB

TAGS: nodejs

Olá, tudo bem?

O que você achou deste conteúdo? Conte nos comentários.