Atenção: com a compra pela BitPreço, as APIs da Biscoint foram desabilitadas, conforme anunciado aqui. Veja o novo tutorial de bot de arbitragem neste link.
O mercado de criptomoedas é extremamente volátil e todo mundo sabe disso. O que nem todo mundo parou para reparar é que o preço de um ativo, como por exemplo o Bitcoin, pode variar bastante no mesmo minuto em corretoras diferentes. Com isso em mente, será que é possível criar um bot que compra onde o BTC está mais barato e vende onde ele está mais caro?
Em 2018 eu me fiz esta pergunta pela primeira vez e lembro que criei um bot que faz exatamente isso, uma técnica chamada de arbitragem de criptomoedas ou arbitragem entre corretoras. Na época, eu monitorava Mercado Bitcoin e FoxBit, mas como as ferramentas dessas empresas não ajudam muito nós programadores de bots (sequer possuem websockets) e as taxas também são relativamente altas, acabou não indo pra frente, me deu só prejuízo, motivo pelo qual acabei me dedicando a outras estratégias que me trouxeram muito mais resultado.
Então não vale a pena fazer arbitragem?
No entanto, esses dias conversava com um aluno do meu curso de bot de criptomoedas e ele me contava que estava fazendo arbitragem usando uma tal de Biscoint. Pra ser mais específico, o aluno era o Enio Almeida, que entrevistei no vídeo abaixo.
Pelo que entendi a Biscoint (que aliás é investida pelo Primo Rico, Thiago Nigro) não tem foco em ser uma corretora, mas sim um comparador de preços de criptoativos. Apesar disso, eles mantém carteiras nas principais corretoras do país e algumas globais para oferecer um serviço centralizado de compra e venda.
Ou seja, você transfere dinheiro para sua conta na Biscoint e depois usa os serviços deles para encontrar e comprar a sua criptomoeda pelo melhor preço. Algo como um Busca Acelerada das criptomoedas.
Para nós que somos devs, isso diminui drasticamente a quantidade de desenvolvimento necessário para fazer um bot de arbitragem pois normalmente teríamos que nos integrar e monitorar diversas exchanges diferentes, mas se a Biscoint tiver APIs, podemos fazer tudo diretamente por ela…
Setup da Conta
E não é que a Biscoint tem API? \o/
Para ser mais específico, pelo que entendi ela foi desenvolvida por outro de meus alunos, o Gustavo Toledo do curso de Node.js, que trabalha lá.
Mas antes de você sair metendo a mão na API da Biscoint para fazer este tutorial, é preciso que você tenha conta lá, certo?
Errado. Para fazer a primeira parte deste tutorial não é necessário ter conta, pois iniciaremos com os endpoints públicos.
Mas, recomendo já abrir a conta pois como tem um processo de validação que pode demorar um pouco, você não vai querer ficar trancado com isso depois.
Então abra sua conta na Biscoint agora, faça as verificações de segurança (enviar selfie com documento, enviar foto de carta assinada à mão, etc), ative o 2FA e só depois volte aqui, quando eles tiverem aprovado tudo na sua conta. Esse processo pra mim foi super rápido, não levou nem uma hora. Ponto pra Biscoint.
O próximo passo é você ter saldo na sua carteira (se quiser de fato rodar o bot para testar), então recomendo fazer um depósito pela própria plataforma, sendo que o mínimo permitido é R$50 e recomendo fazê-lo via PIX, para cair mais rápido na sua conta. Aqui a principal dica é fazer a partir de uma conta que esteja no mesmo CPF da conta da Biscoint ou sua grana vai se perder. Aqui pra mim o PIX foi confirmado em questão de minutos, super rápido. Mais um ponto pra Biscoint.
Agora com tudo ok na sua conta e saldo carregado, podemos avançar. Claro, pode avançar com o setup mais à frente, sem qualquer problema.
Você vai precisar de credenciais para usar a API da Biscoint. Para isso, você vai na sua conta, no ícone do seu usuário > Perfil > Segurança > Automação > API. Sim, repare que a própria Biscoint sabe e não se importa que você crie robôs, a API é justamente pra automatizar o processo de monitoramento, compra e venda de ativos.
Na área de API, você dar um nome para suas credenciais e definir as permissões. Se você vai fazer apenas um bot de sinais, a permissão de visualização é o suficiente. Caso queira fazer um bot de arbitragem, que compra e vende em seu nome, precisa da permissão de negociação também. Marque as permissões que façam sentido e gere as credenciais.
Uma vez que mande criar as credenciais você vai receber um API Key e um API Secret. Guarde os dois em segredo pois eles não podem ser visualizados novamente e também porque quem tiver eles está autorizado em seu nome para fazer automações na sua conta. Se no futuro você perder esta informação ou desconfiar que mais alguém sabe, você pode excluir esta chave e criar outra, mas jamais recuperá-la.
Agora que está tudo 100% configurado e validado na sua conta da Biscoint, é hora de criarmos nosso robô. Se preferir, pode acompanhar este tutorial em vídeo, ao invés de texto (playlist abaixo).
Setup do Projeto
Recomendo que você crie uma pasta específica para este bot, vou chamar a minha de biscoint mesmo.
Dentro desta pasta, rode o seguinte comando no seu terminal para inicializar o projeto Node.js.
1 2 3 |
npm init -y |
Agora vamos instalar as dependências que precisaremos pro bot funcionar. Como vamos fazer chamadas HTTP precisaremos de um cliente, vou usar o Axios que é o mais popular para JavaScript.
1 2 3 |
npm i axios |
Olhando a documentação da Biscoint API, vemos que as rotas são bem simples de serem chamadas, mas como não quero deixar o código bagunçado, vamos criar um módulo biscoint.js pra organizar as chamadas nele. Vamos começar com uma chamada bem simples ao endpoint Meta, que traz meta-informações da API. O código abaixo fica no arquivo biscoint.js e vou explicar na sequência.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
const axios = require("axios"); async function meta() { return call('meta'); } async function call(endpoint) { const headers = { "Content-Type": "application/json" }; const url = `https://api.biscoint.io/v1/${endpoint}`; const method = "GET"; const config = { url, method, headers, data: {}, timeout: 5000 } const result = await axios(config); return result.data; } module.exports = { meta } |
Aqui eu importei a biblioteca Axios, que será usada mais abaixo na função call. Ela é uma função genérica para chamadas à API da Biscoint. Repare como a função meta em si ficou beeem simples por causa disso, pois varia apenas o endpoint.
Agora para usarmos este módulo que criamos vamos importá-lo no index.js e fazer a chamada.
1 2 3 4 5 6 |
const biscoint = require("./biscoint"); biscoint.meta() .then(data => console.log(JSON.stringify(data, null, 2))) .catch(err => console.error(err)); |
Experimente rodar com node index.js ou comando equivalente e verá no terminal todas as meta-informações da API, incluindo a importantíssima informação de rate limit, ou seja, do máximo de chamadas que pode fazer por minuto a cada endpoint. Vou pegar especificamente um trecho para analisarmos.
1 2 3 4 5 6 7 8 9 10 11 12 |
"ticker": { "get": { "type": "public", "rateLimit": { "windowMs": 60000, "maxRequests": 12, "rate": "12 per 1 minute" } } }, |
Repare que podemos fazer apenas 12 requests por minuto ao endpoint de ticker.
Criando o monitoramento
Eu comecei pela consulta acima para entendermos como irá funcionar o nosso monitoramento.
Isso porque o primeiro passo quando o assunto é trade automatizado é fazer o monitoramento automatizado. No caso da API da Biscoint o monitoramento é feito via endpoint ticker. A gente passa qual o par de moedas e ele nos retorna os dados atualizados daquela moeda.
Para fazer isso, vamos voltar ao nosso módulo biscoint.js e criar a função ticker.
1 2 3 4 5 |
async function ticker(base = 'BTC', quote = 'BRL') { return call(`ticker?base=${base}"e=${quote}`); } |
Repare que além do endpoint ticker, eu incluí dois parâmetros na querystring que caso não sejam passados serão iguais a BTC e BRL, respectivamente.
Agora para iniciar o monitoramento, vamos voltar ao index.js e criar um timer que faça as chamadas consecutivamente respeitando o rate limit que descobrimos anteriormente.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
const biscoint = require("./biscoint"); async function doCycle() { try { const result = await biscoint.ticker(); console.log(JSON.stringify(result, null, 2)); } catch (err) { console.error(err); } } setInterval(doCycle, 5010); doCycle(); |
Repare que eu removi a chamada ao meta, já que não é necessário ficar monitorando ele também. Aqui eu criei uma função doCycle que vai executar uma vez quando o programa for iniciado e a cada 5010ms depois disso. Optei por não deixar 5000ms cravado no limite para não correr o risco de bloqueio.
A função doCycle, hoje, solicita os dados de ticker e joga no console para analisarmos. Como não passei parâmetros pra ela, vai trazer os dados de BTCBRL, como abaixo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
{ "message": "", "data": { "base": "BTC", "quote": "BRL", "vol": 7.43021796, "low": 189990.93, "high": 201589.03, "last": 199880.07, "ask": 199797.01, "askQuoteAmountRef": 1000, "askBaseAmountRef": 0.00500508, "bid": 198406.01, "bidQuoteAmountRef": 1000, "bidBaseAmountRef": 0.00504017, "timestamp": "2022-03-08T13:56:19.471Z" } } |
Repare que temos muitas informações bacanas aqui, mas que nem todas são essenciais para estratégias de arbitragem. Duas são as que mais nos interessam: ask (preço de venda) e bid (preço de compra). Pois é na diferença destes dois valores é que PODE ter a oportunidade que você procura.
Entrarei em detalhes mais à frente, mas por enquanto, o que vamos fazer é monitorar a diferença entre esses dois valores. O código abaixo faz exatamente isso.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
const biscoint = require("./biscoint"); function percent(value1, value2) { return (Number(value2) / Number(value1) - 1) * 100; } async function doCycle() { try { const result = await biscoint.ticker(); console.log("BID: " + result.data.bid); console.log("ASK: " + result.data.ask); console.log("%: " + percent(result.data.bid, result.data.ask)); } catch (err) { console.error(err); } } setInterval(doCycle, 5010); doCycle(); |
Assim, eu observo no terminal apenas a informação que mais me importa e calculo o spread entre preço de compra e venda a cada 5 segundos (aproximadamente). O resultado você confere na imagem abaixo.
Agora nossa próxima missão é avançar para as negociações de fato. Mas como este tutorial está ficando muito grande, vou dividir ele em duas partes e a segunda parte que está disponível neste link.
Qualquer dúvida, deixe nos comentários.
Um abraço e sucesso!
Olá, tudo bem?
O que você achou deste conteúdo? Conte nos comentários.
congratulações
não estou conseguindo rodar o seu código de arbitragem teria alguma dica
Pelo que estou sabendo não funciona mais. A Biscoint foi comprada pela BitPreço e com isso mudaram todas APIs. Em algum momento futuro devo dar uma olhada nas APIs novas deles pra ver se ainda rola arbitragem com eles.
Olá Luiz é possível criar um robô que que opere direto na minha conta da binance fazendo as arbitragem triangulares tendo como base uma planilha que mostra as arbitragem mais rentáveis
Dá pra fazer melhor que isso, pegando as mais rentáveis diretamente da Binance, confira nesse tutorial: http://184.73.67.74/post/algoritmo-para-arbitragem-triangular-com-bot/
Olá Luiz,
Por favor, tenho interesse em Flash Loan, sou leiga. Como poderia conseguir assessoria para fazê-lo?
Obrigada.
Infelizmente eu não desenvolvo projetos para terceiros, somente trabalho com cursos de programação. Como você é leiga, o caminho seria começar por essa playlist: https://www.youtube.com/watch?v=c9mDHLYAIu8&list=PLsGmTzb4NxK3r0_sMLyHKaYX97tPN2QPm