Independente de você acreditar ou não que as criptomoedas estão em uma bolha, a oscilação delas traz diversas oportunidades para quem quer fazer trading, ou seja, compra e venda de moeda visando lucro na diferença entre as cotações. Em alguns dias é até mesmo possível fazer day trade de moedas onde tem diversos dias com oportunidades superiores a 10%!!!
Para comprar e vender criptomoedas (considerando que minerar não é mais tão lucrativo quanto foi no passado) você deve ter conta em algum exchange. Dentre os players nacionais, a mais famosa e confiável é a Mercado Bitcoin. O processo é bem burocrático para que seu cadastro seja aprovado, necessitando o envio de selfies, documentos, etc. Uma vez com a conta aberta (o que pode demorar de um a dois dias), você deve fazer um depósito bancário na conta bancária do exchange para que sua conta tenha saldo para operar.
A operação tradicional é muito simples: você usa reais para comprar criptomoedas, como Bitcoin, (a preço atual) e usa criptomoedas para vender e ganhar reais, que ficam na sua conta da exchange até ser sacado de volta para sua conta bancária. Como o preço oscila bastante, um trader mais espertinho que a média pode fazer muita grana comprando em baixa e vendendo nas altas da moeda.
Como eu não sou um trader, mas um programador, decidi criar um bot para fazer o monitoramento do mercado, além da compra e venda das moedas. E é isso que vou ensinar você a fazer hoje. Importante frisar que este é um tutorial para Mercado Bitcoin. Se estiver procurando para Binance, use este tutorial.
Importante também frisar que não faço recomendações de investimento, ensino apenas programação, ok? A responsabilidade por estratégias, ganhos e perdas é completamente sua.
Se preferir, você pode assistir ao vídeo abaixo ao invés de ler o tutorial. No final do tutorial você encontra um formulário para download dos fontes.
#1 – Configuração inicial
Para fazer a primeira etapa deste tutorial você não precisa ter conta aberta na Mercado Bitcoin, mas recomendo que você inicie o processo de cadastro antes deste tutorial porque ele costuma demorar um pouco e deve ter sido finalizado para que consiga fazer a parte 2, então acesse este link e já crie a sua conta. A Mercado Bitcoin possui atualmente APIs REST e streams via WebSockets, sendo que usaremos a primeira para envio de ordens (compra/venda) e a segunda para monitoramento do mercado, assunto central desta primeira etapa.
Como esse processo de criação de conta pode mudar com o tempo, não vou entrar em detalhes aqui. Crie sua conta e faça todo o processo de validação, com selfie e tudo mais. Após o cadastro, você precisa depositar dinheiro na sua conta Mercado Bitcoin. Após estar com a sua conta 100% aprovada, habilite todos os mecanismos de segurança (na área de configurações da sua conta) como uma senha forte, 2-Factor Authentication, etc. Todos eles são necessários para conseguir criar uma chave de API.
O link para criação da chave de API é esse, mas caso não funcione, procure as instruções neste artigo deles. Sua chave deve ter permissão total na sua conta e atenção com este par de id e chave por dois motivos: 1) se alguém tiver acesso a elas, poderá arruinar sua conta e 2) não é possível ver esses dois valores novamente no painel, então tome nota deles agora mesmo ou terá de recriar as chaves.
Com a conta ao menos em processo de abertura, é hora de instalar na sua máquina o Node.js, que é a tecnologia que vamos usar para construir o bot. Para fazer isso basta ir no site oficial, baixar a versão LTS e instalar até o final. Caso tenha qualquer dificuldade, o vídeo abaixo mostra o passo a passo, bem como outras duas tecnologias que lhe vão ser úteis: Visual Studio Code (baixe aqui) e GitHub (crie conta aqui).
#2 – Criar o projeto Node.js
Crie uma pasta no seu computador com o nome de mercado-bitcoin e dentro dela coloque um arquivo index.js vazio e via console execute um ‘npm init -y’ nesta pasta para fazer as configurações iniciais de um projeto Node.js.
Vamos instalar alguns pacotes via NPM pra deixar nosso projeto preparado. Seguem os comandos de instalação:
1 2 3 |
npm i dotenv axios ws |
O módulo dotenv serve para carregar automaticamente variáveis de ambiente na sua aplicação Node.js. Usaremos estas variáveis de ambiente para colocar as configurações do nosso bot. Agora crie um arquivo “.env” na raiz do seu projeto colocando nele os valores abaixo, conforme instruções (usaremos estas configurações mais tarde, então o que não tiver em mãos ainda, pode preencher depois):
- ACCOUNT_ID: o id da sua conta na Mercado Bitcoin. Vou mostrar como pegar mais tarde, deixe em branco por enquanto;
- API_KEY: sua API Key (alfanumérico), criada no Mercado Bitcoin (também chamado de API ID ou API Key ID);
- API_SECRET: o seu API Secret (alfanumérico), criado no Mercado Bitcoin (também chamado de API Key Secret ou Secret API);
- SYMBOL: o par de moedas que vai negociar, no formato BTC-BRL (cripto-fiat, separado por espaço);
- STREAM_ID: o par de moedas que vai monitoar, no formato BRLBTC (fiatcripto, tudo junto);
- BUY_PRICE: o seu preço alvo para compra (gatilho de compra);
- BUY_QTY: a sua quantidade de cripto que quer comprar. Ex: 0.0001;
- PROFITABILITY: a rentabilidade desejada que seu bot deve alcançar em decimal. Ex: 1.1 representa 10%, 1.05 representa 5% e etc;
Lembre-se que as informações de API_KEY e API_SECRET são secretas e você não deve compartilhar com ninguém, caso contrário quem descobri-las poderá comprar e vender criptomoedas em seu nome, usando seu dinheiro.
Sobre a variável PROFITABILITY (rentabilidade ou lucratividade), entenda que quanto maior a rentabilidade desejada, mais irá demorar para que você consiga ter retorno com seu bot e às vezes isso pode nunca acontecer. Exemplo, se sua PROFITABILITY é 1.2 (20%) e você compra Bitcoin hoje, vai demorar 20 dias para o bot vender se a moeda estiver valorizando 1% ao dia. Claro que diversas técnicas podem reduzir ou aumentar esse prazo (como uma queda da moeda ao invés de valorização), e cabe a você estudá-las (como analisar os gráficos da moeda, por exemplo).
Além disso, uma PROFITABILITY inferior a 1.01 (1%) não é muito interessante pois você tem de pagar as taxas da exchange tanto na compra quanto na venda (consulte no site oficial).
Se você for versionar o seu projeto ou mesmo compartilhar o seu código com outras pessoas via Git, coloque um .gitignore na raiz do seu projeto incluindo a pasta node_modules (padrão) e o arquivo .env, que é mantido localmente só no seu projeto.
Para carregar estas configurações na sua aplicação, modifique o seu package.json para que no script de start ele carregue o .env:
1 2 3 4 5 |
"scripts": { "start": "node index" }, |
Note que cabe a você entender as melhores configurações para os seus objetivos financeiros, a sua situação financeira, a situação do mercado de criptomoedas no momento que você está atuando nele, etc. Me focarei aqui na construção do robô de compra e venda de criptomoedas, não na sua configuração.
#3 – Monitorando o mercado
Antes de sair codificando o monitoramento, precisamos carregar algumas coisas no topo do nosso index.js.
1 2 3 4 5 6 7 8 9 |
require("dotenv").config(); const WebSocket = require("ws"); const BUY_PRICE = parseFloat(process.env.BUY_PRICE); const PROFITABILITY = parseFloat(process.env.PROFITABILITY); let sellPrice = 0; |
Nesta amostra de código eu começo carregando as variáveis de ambiente para a memória da aplicação. Depois eu carrego a classe WebSocket da biblioteca ws, usaremos ela logo mais.
Depois eu carrego e converto para número decimal duas variáveis de ambiente, a BUY_PRICE e a PROFITABILITY. Elas serão necessárias para as lógicas do nosso bot mais tarde. E por fim, declaro uma variável sellPrice que usaremos tanto para saber se o robô já comprou (abriu posição) quanto para saber o preço alvo de saída/fechamento/venda.
A seguir, vamos começar pela primeira atividade, que é mais simples e é a base do robô: monitorar o mercado. Para essa finalidade a Mercado Bitcoin fornece o que eles chamam de streams ou fluxos de dados. Uma stream é um canal de comunicação que, uma vez aberto, passa a ser usado pela corretora para envio de informações para nossos robôs em tempo real ou próximo disso. Se você possui um background mais técnico talvez você conheça isso por outro nome: WebSockets, que eu explico e ensino melhor neste tutorial.
Existem várias streams existentes e uma muito popular é a de ticker que nos traz em tempo real informações atualizadas, incluindo o preço de compra e de venda, para determinado par de moedas. Para nos conectarmos na referida stream, eu instalei o pacote ws no projeto, que usaremos em nosso index.js da seguinte forma:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
const ws = new WebSocket("wss://ws.mercadobitcoin.net/ws"); ws.onopen = () => { ws.send(JSON.stringify({ type: "subscribe", subscription: { name: "ticker", id: process.env.STREAM_ID } })); } ws.onmessage = (evt) => { console.clear(); const obj = JSON.parse(evt.data); if (obj.type !== "ticker") return; console.log(obj.data); console.log("Sell Target: " + sellPrice); } |
Com a classe WebSocket que carregamos anteriormente eu posso iniciar uma nova conexão de websockets onde informo a URL do servidor de WebSockets da MB.
Na sequência a instrução onopen nos permite configurar uma função de callback que será chamada no processo de conexão com o servidor, momento em que devemos enviar um comando subscribe para ele informando o que queremos monitorar. Neste caso, vamos monitorar o ticker (ativo da exchange) BRLBTC, que significa “Bitcoin negociado em Reais”, definido na STREAM_ID do .env.
A partir da linha de baixo o objeto ws estará conectado na Mercado Bitcoin e passará a receber dados em tempo real sobre o ativo em questão. Para que possamos processar esses dados devemos configurar o evento onmessage do objeto ws através da passagem de uma função com um event por parâmetro. Toda vez que a Mercado Bitcoin nos enviar uma informação sobre o par que estamos conectados vai disparar o conteúdo dessa função e é aí dentro que colocaremos nossa lógica de monitoramento e a lógica de trade também.
Para este primeiro momento, eu estou limpando o texto do console e convertendo o evt.data, que vem como string, em um objeto JavaScript. Mais tarde, se o evento for do tipo ticker, imprimo no console todo o conteúdo que recebemos, para ver o que temos à disposição, mais a informação do nosso alvo de venda.
Experimente rodar o seu projeto com o comando npm start e terá o resultado abaixo no terminal (não exatamente com este preço, mas esta estrutura).
Que tal adicionar uma lógica de compra e venda falsas, para exercitar alguma “inteligência” no robô? Coloque o seguinte código logo abaixo do último console.log:
1 2 3 4 5 6 7 8 9 10 |
if (!sellPrice && parseFloat(obj.data.sell) <= BUY_PRICE) { sellPrice = parseFloat(obj.data.sell) * PROFITABILITY; console.log("Compra fake!"); } else if (sellPrice && parseFloat(obj.data.buy) >= sellPrice) { console.log("Venda fake!"); sellPrice = 0; } |
Aqui eu verifico se o sellPrice é falsy, o que indica que a posição não está aberta ainda. Depois comparo o preço recebido via stream com o BUY_PRICE, que é nosso gatilho de compra. Se for ativado, nós calculamos o preço futuro de venda e imprimimos uma compra “fake”.
O robô continuará rodando, mas agora pulando o primeiro if e indo para o else if, onde se o sellPrice estiver definido (e estará), comparamos o preço de mercado com nosso alvo e se ele for alcançado, fazemos uma venda “fake”.
Usando de lógicas como essa é possível ao robô lhe avisar, por email de repente (ou ainda via SMS, WhatsApp ou Telegram) que é a hora certa de comprar ou vender. Claro, que em um cenário ideal e mais completo, o próprio robô poderia fazer essas operações e é algo perfeitamente possível de ser desenvolvido.
Mas isso a gente vai ver na PARTE 2, disponível neste link.
Olá, tudo bem?
O que você achou deste conteúdo? Conte nos comentários.
Boa noite, tudo bem?
Primeiramente parabéns pelo conteúdo!!!
Mas estou empacado num passo muito simples, testar o mercado: Ao tentar conectar no WebSocket pela extensão indicada Smart Websocket não responde nada (wss//ws.mercadobitcoin.net/ws) …
A URL que informou no comentário está errada. Dá uma revisada nela e se ainda não for o suficiente, experimenta a assistir ao vídeo também, ele acaba complementando o texto em termos de didática.