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

Node.js

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

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

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

Inscreva-se na lista de espera da segunda turma do meu curso de traderbot multi-moedas neste link!

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. Na segunda parte, mostrei como utilizar o ambiente de testes da Binance e a fazer requisições seguras, usando como exemplo o monitoramento da sua carteira de criptos. Na terceira parte, fizemos o código necessário para que o bot pudesse comprar e vender em nosso nome.

Mas o que faremos então nesta quarta parte?

Os vídeos desta série no Youtube tiveram recordes de visualização (para os padrões do meu canal) e rapidamente se tornaram os vídeos mais vistos. Respondi mais de 150 comentários somando os vídeos e redes sociais e com isso aprendi muito sobre o que vocês tiveram mais dificuldades, o que vocês gostariam que tivesse no bot, etc e decidi fazer uma parte 4 ensinando a fazer uma interface web para nosso bot.

Sim, pois muitas das funcionalidades que você me sugeriram exige uma interface para ser administrada, além do quê é bem mais fácil de hospedar um site que fique rodando do que deixar um bot na sua máquina 24h por dia, certo?

Então nesta quarta parte vamos criar uma versão web do nosso bot, o que permitirá fazer coisas muito mais bacanas com ele no futuro!

Se preferir, pode assistir ao vídeo abaixo (sim, o vídeo é parte 5, mas o conteúdo é o deste post):

#1 – Ajustando o projeto

Uma coisa que comentei na última parte mas que não mostrei como implementar foi a configuração de symbol, pois até então ele estava “chumbado” em nosso código, dificultando para mim e para você caso desejasse usar outro symbol (par de moedas ou coinpair) do que os que usei no teste.

Sendo assim, comece criando uma variável de ambiente SYMBOL no seu .env.example.

Note que adicionei duas variáveis novas, a SYMBOL e a PORT. Falaremos da PORT mais à frente.

E depois crie novamente estas variáveis no seu .env com o valor do coin pair que vai usar e a porta 3000 (explico mais adiante).

Agora no seu index.js, nos pontos em que usava uma string com o symbol, use uma constante previamente carregada com essa variável de ambiente, como abaixo.

E outra coisa que eu gostaria de ajustar é o fato de que quando o preço está baixo, posicionamos uma ordem de compra imediatamente, sem antes verificar se temos saldo para realizar a compra. Hoje já pegamos a posição da nossa carteira, de todas as moedas que possuímos, basta que a gente verifique a moeda BUSD (ou USD, no ambiente de produção) e compare com o preço de sell.

Com estes ajustes, nosso index.js ficará como abaixo.

E com isso finalizamos os ajustes que ficaram pendentes do tutorial anterior!

Curso Node.js e MongoDB

#2 – Criando a aplicação web

Vamos começar criando algo muito, mas muito simples mesmo. Existem milhares de formas de fazer uma interface web e ao invés de começar com a versão final que eu acredito que seria a melhor, vou mostrar de um jeito que qualquer programador iniciante vá entender e que funcione, é claro.

Além disso, neste primeiro momento, a interface web vai fazer a mesma coisa que o bot, ok? Ela vai ficar monitorando o mercado e quando as condições do mercado derem match com as condições programadas nela, as compras e vendas acontecerão automaticamente. Todas as configurações serão feitas via variáveis de ambiente e apenas vou fazer algumas customizações simples para que fique minimamente apresentável.

Vamos começar voltando ao nosso projeto e vamos instalar os pacotes abaixo.

O pacote Express é o mais utilizado para criação de aplicações web em Node.js, enquanto que o EJS (Embedded JavaScript) é utilizado para criação das páginas da aplicação, usando HTML+CSS+JS.

Agora crie um arquivo app.js na raiz do seu projeto, para ele ser o coração da nossa aplicação web. Coloque o seguinte conteúdo dentro, que vou explicar logo na sequência.

Esse código acima cria uma aplicação web Express, que nada mais é do que um servidorzinho chamado app que recebe requisições na porta process.env.PORT (toda aplicação servidora precisar estar “escutando” uma porta do computador) e se a requisição for na raiz (‘/’) ele apena executa o callback que imprime ‘entrou’ no console e retorna o status 200 (OK) de volta.

Como nossa aplicação agora tem dois pontos de entrada, o nosso bot e nosso app, vamos criar um novo script no nosso package.json, como abaixo.

Eu renomeei o script start antigo, que inicia o bot, para ‘bot’, enquanto criei um novo script ‘start’ com o comando para subir não apenas a nossa aplicação, mas carregar nossas variáveis de ambiente (flag “-r”) e tudo isso usando o nodemon, que é um pacote para manter nosso projeto rodando e aguardando alterações. Para executar nossa aplicação, basta rodar o comando “npm start” no console, estando dentro da pasta do projeto.

Nada demais irá acontecer, exceto uma mensagem no console quando a aplicação tiver subido. Se quiser testar as chamadas na aplicação, abra seu navegador depois de ter a aplicação rodando e acesse localhost:3000 (3000 é a porta configurada no .env, lembra?). Nada demais irá acontecer, mas se olhar no console e estiver tudo certo, vai aparecer a mensagem de que ‘entrou’ na rota padrão que criamos com app.use.

Note que além do funcionamento em si, esse console nos mostra algumas mensagens diferentes das anteriores. Isso porque executamos a aplicação com ‘npx nodemon’, lembra? O NPX baixa e executa o pacote nodemon, que além de subir a aplicação fica esperando por alterações. Quando algum código nosso for alterado, automaticamente a aplicação se atualizará sem a gente precisar derrubar e subir de novo a aplicação.

Livro Node.js

#3 – Criando a página do bot

Mas obviamente que não faz sentido algum a gente ficar olhando no console para ver o que aconteceu em nossa aplicação web, não é mesmo?

O teste anterior foi apenas para ver se nosso servidor estava funcionando. Agora vamos alterar novamente nosso app.js para que ele envie uma página para o browser como resposta à chamada na localhost:3000

Repare que agora eu carrego o pacote path, nativo do Node e que não precisa ser instalado, e uso ele para definir uma propriedade ‘views’ na nossa aplicação, que deve conter o caminho onde estarão as páginas da mesma. Aqui eu uso path.join para concatenar o __dirname (pasta atual da aplicação) com ‘views’, que é o nome de uma pasta que já já vamos criar.

A instrução seguinte define outra propriedade da aplicação, a ‘view engine’, informando quando o motor de renderização que vamos usar, no caso o EJS, que instalamos láááá atrás lembra? Ficará mais clara a utilidade dele em breve.

O mesmo vale para a instrução express.static, que será útil mais à frente.

E por fim, alteramos o conteúdo do callback do app.use, para que ele use res.render, uma função que renderiza uma view (página) como resposta a uma requisição HTTP. O res.render espera dois parâmetros, sendo o primeiro o nome da view (app) e o segundo os dados que queremos enviar para a view (também chamado de model).

Para que este código funcione, precisamos criar uma pasta views na raiz do projeto e dentro colocar um arquivo app.ejs, com o seguinte conteúdo.

Sim, um simples Olá Mundo!

Agora, quando você testar novamente a sua aplicação no navegador, acessando localhost:3000 (desde que ela esteja rodando no console ainda), você terá como retorno um Olá Mundo, se tudo deu certo.

Mas não é isso que queremos, certo?

Então vamos modificar o nosso views/app.ejs para que ele espere algumas informações básicas que virão da Binance (e que ainda não temos).

Eu não vou explicar aqui HTML, CSS e muito menos o Bootstrap, que é a biblioteca de frontend que estou usando no HTML acima, esses assuntos todos são abordados em detalhe no meu livro de Programação Web com Node.js. Basicamente esta página exibirá a posição da carteira, os dados do mercado que estamos monitorando e uma timeline das últimas coisas que nosso bot fez na Binance.

Mas antes de você rodar (e se decepcionar com o erro) gostaria de falar de alguns pontos em específico, de tags começadas com <%=, que chamamos de server-tags. Elas são tags especiais do EJS, que rodam no servidor e não no browser do cliente como o resto do HTML. A tag <%= symbol %> por exemplo, exprime o comando de imprimir naquele exato ponto do HTML, uma variável symbol que tenha sido passada na renderização da página.

Hoje não estamos passando esta variável symbol, bem como outras que que você deve notar que estão envolvidas por server tags como essa. Então vamos voltar ao nosso app.js e modificar a nossa rota padrão, app.use(‘/’ para que no res.render dela a gente passe algumas informações fake, que mais tarde substituíremos pelas reais.

Assim, quando você acessar a página localhost:3000 e ela for renderizar a página app.ejs, ela vai passar aquelas 3 variáveis ali para ela, o que resultará na página abaixo que você pode personalizar à vontade, eu dei só um tapa inicial no visual.

A ideia é que agora a gente crie o comportamento dinâmico que tínhamos no bot console, para que essa página se atualize de tempos em tempos com as informações obtidas da Binance.

Curso FullStack

#4 – Transferindo a lógica do bot

Agora que temos a página criada, embora não fazendo nada ainda, é hora de trazer a lógica do nosso bot console para o nosso app web. Vamos no nosso app.js e adicionar nele uma segunda rota, logo antes da primeira app.use, que não servirá para renderizar uma página, mas para fazer o monitoramento do mercado, possivelmente comprar e vender, e retornará os dados de tudo que ele fez.

Assim, toda vez que a rota /data for chamada (seja pelo navegador ou via script, como mostraremos a seguir, ela fará a mesma coisa que o nosso bot console fazia antes, retornando um objeto JSON no final com os dados do que ela fez.

Você pode fazer esse teste facilmente, chamando localhost:3000/data no browser. Depois de pensar um pouco, deve aparecer para você um JSON tipo o abaixo.

Vamos aproveitar também para mexer na rota padrão que renderiza a página, para que ela passe as variáveis corretas no primeiro carregamento.

As variáveis symbol e profitability estão sendo setadas em constantes logo no início do arquivo, quando carregamos algumas variáveis de ambiente para a rota /data, lembra? Já as variáveis lastUpdate e interval podemos deduzir a partir da data atual e de outra variável de ambiente, respectivamente.

Agora vamos juntar as duas pontas: front e back. No nosso front HTML que criamos com EJS, temos de ter algum mecanismo que fique chamando este backend Node.js de tempos em tempos e atualizando as informações presentes na página. Vamos fazer isso com JavaScript client-side!

O primeiro passo é aprender a fazer as chamadas ao backend no nosso front-end, usando a API fetch do JavaScript, em uma tag script no final da página views/app.ejs, como abaixo.

Neste exemplo acima nós definimos um intervalo assim como fazíamos no bot para que a cada x tempo uma requisição seja enviada para a rota /data e o resultado seja jogado no console, apenas para vermos se está funcionando. Importante citar que este console aqui é o do navegador (front-end) e não o do console (back-end). Repare que o tempo do intervalo eu estou recebendo em uma server tag do EJS, ou seja, está vindo esta informação do backend na primeira vez que essa página é renderizada.

O segundo passo é, com o objeto JSON retornado pelo fetch, a gente popular os campos do nosso HTML dinamicamente, usando JS client-side também. Note que em todos os campos que deverão ser populados dinamicamente eu deixei ids sugestivos, para que eu possa facilmente fazer estas alterações aqui, deixando o nosso código de atualização automática das informações bem fácil de entender, como abaixo.

Repare que eu pego o elemento HTML usando o DOM, depois pego a informação que veio no JSON e altero o elemento com ela. O resultado é bem interessante, pois logo após os segundos iniciais de espera, as informações da página se atualizam com os dados reais da Binance, como mostrado abaixo, incluindo o fato de que eu tive compras e vendas posicionadas, assim a timeline teve informação também para se atualizar.

Legal, não?

Como próximos passos temos uma infinidade de coisas que eu e você podemos fazer juntos neste projeto. Abaixo, algumas sugestões e gostaria que você deixasse nos comentários outras que você acharia interessante de ter no seu bot web.

Que tal? Tem bastante coisa para você estudar aí hein!

Quer mais algumas dicas? Assista ao vídeo abaixo!

Curtiu o post? Que tal aprender a construir um robô multi-moedas profissional para a maior exchange do mundo? Clique no banner abaixo e saiba mais!

TAGS: nodejs

Olá, tudo bem?

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