Carreira Dev

18 dez, 2017

Como criar um bot de compra e venda de Bitcoin usando Node.js

Publicidade

Estamos em 2017 e jamais as criptomoedas estiveram tão em alta. Com o Bitcoin batendo recordes de valorização superiores a U$11.000 e centenas de milhares de brasileiros comprando e vendendo a moeda todos os dias, é difícil ficar apenas olhando. E eu não sou o tipo de empreendedor que fica apenas olhando.

Independente de você acreditar ou não que o Bitcoin está em uma bolha, a oscilação da moeda 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 Bitcoin, considerando que nas últimas semanas tivemos diversos dias com spread (diferença entre mínima e máxima) superior a 10%!

Para comprar e vender Bitcoin e demais criptomoedas (considerando que minerar não é mais tão lucrativo quanto foi no passado) você deve ter conta em algum exchange. Dentre os brasileiros, eu confio apenas em dois: Mercado Bitcoin e Foxbit, tendo 500 mil brasileiros operando no primeiro e 120 mil no segundo. 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 Bitcoins (a preço atual ou futuro) e usa Bitcoins para vender e ganhar reais, que ficam na sua conta do exchange até ser sacado de volta para sua conta bancária. Sim, você deve ter uma conta bancária para realizar essas transações e, se não possuir nenhuma, sugiro criar uma no banco que trabalho, a Agiplan. É super fácil, rápido e não tem qualquer custo, basta baixar o app Agipag e fazer o cadastro no próprio app (iOS e Android).

Como o preço oscila bastante, um trader experiente pode fazer muita grana comprando em baixa e vendendo nas altas da moeda. Um colega de serviço fez R$4 mil em um único dia com essa estratégia em uma oscilação de 20% que a moeda teve esses dias com os rumores de uma possível abertura de contratos futuros na Nasdaq no ano que vem. Pois é, o negócio está ficando sério.

Como eu não sou um trader, sequer experiente, 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. Não, eu não vou revelar meus ganhos com bitcoin para não me responsabilizar caso você perca dinheiro e não lhe incentivar a colocar muita grana, mas sim, estou ganhando mais do que na renda fixa. Trading de bitcoin é algo muito arriscado e não recomendo colocar mais do que 20% das suas economias nele.

Primeiro passo: criar uma conta no exchange

Para conseguir fazer este tutorial você deve ter uma conta criada na Mercado Bitcoin, o maior exchange brasileiro e o mais confiável até onde sei. Eles possuem uma API REST muito completa que usaremos para monitorar e operar no mercado de criptomoedas. Sim, porque você não precisa apenas operar bitcoins, mas também bitcoin cash e litecoins, sendo que em breve eles devem disponibilizar bitcoin gold também.

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. Esse depósito inicial possui taxa, esteja ciente disso. Na verdade, tudo que você for fazer possui taxa: depositar, comprar, vender e sacar. Ao todo, o ciclo completo deve lhe comer uns 5%, então só vale operar no Mercado Bitcoin se for a longo prazo (se você é um dos que acredita no futuro do bitcoin) ou quando o spread estiver alto (acima de 6%).

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, Two Factor Authentication, palavra-segura e PIN. Nem todos estes itens são necessários para fazer este tutorial, mas sugiro que faça todos eles pois estes exchanges são atacados por hackers o tempo todo e você não vai querer facilitar, não é mesmo?

Após criar o seu PIN, você pode criar uma chave de segurança que será utilizada depois para se autenticar na API de negociações do Mercado Bitcoin. O link para criação da chave é esse, mas caso não funcione, procure as instruções neste artigo deles.

Segundo passo: criar o projeto Node.js

Crie uma pasta no seu computador com o nome de mercadobitcoin e dentro dele coloque um arquivo index.js vazio e via console execute um ‘npm init’ 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:

npm install -S dotenv-safe
npm install -S unirest
npm install -S crypto
npm install -S querystring

O módulo dotenv-safe serve para carregar automaticamente variáveis de ambiente na sua aplicação Node.js. Usaremos estes variáveis de ambiente para colocar as configurações do nosso bot.

Crie um arquivo “.env.example” na raiz do seu projeto com o seguinte conteúdo dentro, representando o modelo de arquivo de configuração que vamos precisar:

# .env.example, committed to repo
CRAWLER_INTERVAL=

# Exchange Configs
KEY=
SECRET=
PIN=
#1.05 se perdem com taxas
PROFITABILITY=

Agora crie um arquivo “.env” na raiz do seu projeto usando o mesmo conteúdo do .env.example como base, mas colocando os seus valores de verdade ao lado do sinal de igualdade de cada uma das variáveis de ambiente. Uma rápida explicação de cada variável:

  • CRAWLER_INTERVAL: milissegundos entre cada execução do bot, sendo que o Mercado Bitcoin não tolera mais de 60 chamadas por minuto e pode lhe bloquear se tentar usar mais a API deles do que isso.
  • KEY: sua API Key (alfanumérico), criada no Mercado Bitcoin
  • SECRET: o seu API Secret (alfanumérico), criado no Mercado Bitcoin
  • PIN: o seu PIN (quatro números), criado nas configurações do Mercado Bitcoin
  • PROFITABILITY: a rentabilidade desejada que seu bot deve alcançar em decimal, ou seja, 1.1 representa 10%, 1.05 representa 5% e assim por diante.

Tenha em mente que as informações de KEY, SECRET e PIN são secretas e você não deve compartilhar com ninguém, caso contrário quem descobri-las poderá comprar e vender bitcoins 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.05 (5%) não é muito interessante, pois você gasta quase isso com as taxas do Mercado Bitcoin para um ciclo completo de depósito, compra, venda e saque de criptomoedas.

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, dentro do seu index.js na raiz do seu projeto adicione a seguinte linha de código:

require("dotenv-safe").load()

Caso você tenha se esquecido de alguma variável ou o arquivo .env não esteja presente na raiz do projeto, ao chamar esta função load do dotenv-safe, sua aplicação não iniciará.

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 bitcoins, não na sua configuração.

Terceiro passo: consumindo a API de dados

Existem duas APIs na maioria dos exchanges: uma de dados (somente leitura, aberta) e outra de trading (leitura e escrita, exige credenciais mais específicas). Vamos começar pela primeira, que é mais simples e é a base do monitoramento do robô.

A documentação completa e atualizada da API de dados do Mercado Bitcoin pode ser encontrada aqui. Para organizar melhor nosso código, crie um arquivo api.js na raiz do seu projeto e dentro dele vamos colocar o protótipo do nosso objeto da API de dados:

//MERCADO BITCOIN
const unirest = require('unirest')
const ENDPOINT_API = 'https://www.mercadobitcoin.com.br/api/'

var MercadoBitcoin = function (config) {
    this.config = {
        CURRENCY: config.currency
    }
}

MercadoBitcoin.prototype = {

    ticker: function (success) {
        this.call('ticker', success);
    },

    orderBook: function (success) {
        this.call('orderbook', success);
    },

    trades: function (success) {
        this.call('trades', success);
    },

    call: function (method, success) {

        unirest.get(ENDPOINT_API + this.config.CURRENCY + '/' + method)
            .headers('Accept', 'application/json')
            .end(function (response) {
                try{
                    success(JSON.parse(response.raw_body));
                }
                catch(ex){ console.log(ex)}
        });
    }
}

module.exports = {MercadoBitcoin}

Nesta amostra de código, eu carrego a biblioteca unirest para fazer as chamadas à API REST do Mercado Bitcoin e crio uma constante para armazenar o endereço da API. Crio uma função construtora que recebe um objeto de configurações por parâmetro, que neste primeiro momento coloquei apenas uma variável currency que determina a moeda que estou operando no mercado, uma vez que esta informação deve ir na URL da chamada, usando a notação:

  • BTC: Bitcoin
  • BCH: Bitcoin Cash
  • LTC: Litecoin

No protótipo do objeto Mercado Bitcoin eu tenho as funções ticker, orderbook, trades e a função genérica call que é a base para as demais. Todas as funções esperam uma função success como callback para que o retorno seja trabalhado de alguma forma e abaixo coloco uma explicação sucinta de cada uma das funções:

  • ticker: retorna um objeto com o estado atual do mercado, incluindo o menor valor de venda da moeda no livro (sell), o maior valor de compra no livro (buy), o valor da última transação (last), o maior valor da moeda nas últimas 24h (high) e menor no mesmo período (low), além do timestamp desta informação. Estas informações são a base do monitoramento, para tomar decisões de compra e venda.
  • orderbook: retorna um array de ordens do livro, sendo as ordens de compra mais altas e as ordens de venda mais baixas abertas atualmente.
  • trades: retorna um array das últimas operações realizadas, serve para monitorar se o mercado vai cair (muitas vendas sucessivas) ou vai subir (muitas compras sucessivas).

Com esse arquivo de API pronto, podemos voltar ao nosso index.js para criar uma rotina básica de monitoramento em nosso bot, como abaixo:

//index.js
require("dotenv-safe").load()
const MercadoBitcoin = require("./api").MercadoBitcoin
var infoApi = new MercadoBitcoin({ currency: 'BTC' })

setInterval(() => 
   infoApi.ticker((tick) => console.log(tick.ticker)),
   process.env.CRAWLER_INTERVAL
)

Aqui eu carreguei nosso módulo de api e criei um objeto de monitoramento da moeda BTC (bitcoin), que vai rodar a cada x segundos, definidos pela variável de ambiente CRAWLER_INTERVAL (sugiro começar com 5000).

Se você rodar agora este arquivo usando o comando ‘node index’, ele já deve estar funcionando e o seu bot vai estar monitorando o mercado continuamente (até ser encerrado), embora ainda não esteja tomando ação alguma.

Na próxima parte deste tutorial, vamos lidar com a segunda API, a de trading. Até lá espero que você já tenha sua conta criada e aprovada e este monitoramento 100%. Confira a parte 2 aqui.

Um abraço!