Em outras oportunidades aqui no blog e também no meu canal do Youtube eu trouxe tutoriais de como criar robôs de criptomoedas, ou seja, automações via software para comprar e vender criptoativos em corretoras como Binance, Mercado Bitcoin e BityPreço. Em todas essas ocasiões eu trouxe como gatilho de compra e venda o preço do ativo no mercado à vista, afinal nada é mais importante (e óbvio para leigos) do que o preço do ativo, já que a estratégia mais bruta que existe é comprar barato e vender caro, certo?
No entanto estratégias mais elaboradas (e geralmente mais assertivas) não usam unicamente o preço como indicador de melhor momento de compra ou de venda. O mais comum é o cruzamento de diversas informações, incluindo indicadores técnicos mas também padrões gráficos e outras formas de prever tendências de mercado. Uma das estratégias baseadas em analisar tendências é a de Tape Reading, também chamada de “Leitura de Fita” (tradução literal) ou “Análise de Fluxo”.
Neste tutorial eu vou te explicar brevemente o que é Tape Reading e como implementar um script para auxiliar no Tape Reading ou até mesmo automatizá-lo. Se preferir, você pode assistir ao vídeo abaixo ao invés de ler.
Vamos lá!
#1 – O que é Tape Reading?
Aqui vai um aviso importante: eu não sou trader profissional nem nada do tipo, então meu foco maior aqui será ensinar a parte de programação e não ensinar sobre Tape Reading em si, ok?
A primeira coisa que você precisa saber para entender Tape Reading é sobre como o preço de um ativo é definido na corretora. Imagine o BTCUSDT, ou seja, o Bitcoin negociado em Tether (que é pareado com dólar). O que define o preço dele? A oferta e demanda. E como isso é calculado? Através do orderbook (oferta) e dos trades realizados (demanda). Quem coloca ordens no book, quem gera a oferta, são os market makers. Quem retira ordens do book, os agressores, são os market takers.
Toda vez que um trader quer que sua ordem seja executada à mercado (imediatamente), ele remove a ordem mais ao topo do orderbook, pagando o preço que constava nela. Se ele quer comprar, removerá a ordem mais barata de venda. Se ele quer vender, removerá a ordem mais cara de compra. Em ambos os casos, a ordem que estava em segundo lugar no book se tornará a primeira e com isso o preço do ativo tende a mudar, já que ele é definido como sendo o ponto central entre o menor preço de venda e maior preço de compra.
Eu falo mais sobre essa dinâmica e outros aspectos técnicos do orderbook é da match engine no vídeo abaixo.
Basicamente, a técnica de Tape Reading consiste em analisar as intenções de trades (orderbook) e os trades realizados (chamado times & trades) para entender o que está acontecendo com um ativo no mercado. Um volume de compras agredindo o book (ou seja, consumindo) muito maior que vendas, durante algum tempo, é o suficiente para fazer o preço de um ativo iniciar uma tendência de alta. Isso se deve à dinâmica natural do book de ordens onde as ordens de venda mais barata são executadas primeiro, sobrando ordens cada vez mais caras no book. E o mesmo vale pro contrário: um volume grande de vendas agredindo o book vai fazer com que se esgotem as ofertas baratas.
Mas se você já tentou acompanhar o book de ordens de uma corretora grande como a Binance deve ter percebido o quão desgastante é essa tarefa porque ele é muito dinâmica e via de regra não são amistosos para Tape Reading. Existem plataformas específicas para isso no mercado, mas com alguns scripts JS você pode facilmente isolar alguns indicadores e agrupar algumas informações de modo a facilitar sua análise de fluxo sem precisar de plataformas proprietárias. E é sobre isso o restante deste tutorial.
#2 – Setup do Projeto
Dentre os players mundiais de criptomoedas, uma das mais agressivas em termos de taxas e portfólio de moedas é a Binance, considerada a maior exchange de criptomoedas do mundo em volume de negociações. Usaremos ela como fonte de dados aqui pois é um bom termômetro do mercado de criptomoedas, mas o que vou mostrar pode ser usado com qualquer exchange (de cripto ou não) que disponibilize publicamente o seu orderbook via API. Nem mesmo você precisa ter conta na Binance para fazer este tutorial, pois ele não efetuará as compras e vendas de fato, ok?
Dito isso, antes de sairmos programando precisamos configurar nosso projeto. Usarei aqui a linguagem JavaScript, então precisamos do Node.js instalado na máquina. Se ainda não tem o ambiente de desenvolvimento para Node.js configurado, você pode ver como fazer no vídeo abaixo.
Agora crie uma pasta no seu computador com o nome de binance-tape-reading e dentro dela rode o comando abaixo pelo seu terminal de linha de comando para inicializar um projeto Node.js na pasta.
1 2 3 |
npm init -y |
Agora coloque um arquivo index.js vazio dentro da pasta e vamos instalar alguns pacotes via NPM pra deixar nosso projeto preparado. Seguem os comandos de instalação:
1 2 3 |
npm i axios |
Por fim, modifique o seu package.json para que no script de start ele inicie o seu index.js:
1 2 3 4 5 |
"scripts": { "start": "node index" }, |
Note que este robô de tape reading irá funcionar com um par de moedas, mas pode ser adaptado para vários pares ou pode replicar o projeto várias vezes na sua máquina.
#3 – Obtendo os dados do book
Para a finalidade de monitoramento do book a Binance fornece uma API que traz os bids (ofertas de compra) e os asks (ofertas de venda) no topo do book, podendo pegar até 5000 registros de cada um de cada vez, o que será muito útil pra gente. No entanto essa chamada é um pouco pesada, consumindo 250 de peso de request, portanto teremos de maneirar na quantidade de vezes que vamos usar por minuto. Falo mais sobre limites de uso da API neste post (inclui vídeo).
Para consumir a API de book da Binance eu usarei o pacote Axios, que instalamos anteriormente. Se você nunca programou com Axios antes, ele é um cliente HTTP bem popular para JavaScript e o vídeo abaixo dá uma excelente introdução (não é obrigatório, mas ajuda).
Com o Axios importado em seu arquivo index.js (abaixo) você pode chamar a API de book e imprimir no console o resultado.
1 2 3 4 5 6 7 8 |
const axios = require("axios"); setInterval(async () => { const { data } = await axios.get("https://api.binance.com/api/v3/depth?symbol=BTCUSDT&limit=5000"); console.log(data); }, 3000) |
Nesta amostra de código, eu criei um timer que a cada 3 segundos vai pedir para a Binance as 5k bids e 5k asks no topo do book de ofertas de BTCUSDT. Se você reparar na URL que estamos chamando verá que nela tem um parâmetro symbol, que você pode trocar por qualquer par da Binance que quiser, e que tem também uma variável limit, onde já passamos o máximo possível que é 5k. Isso retornará um objeto com bids e asks como arrays, e em cada elemento temos um array contendo o preço do ativo (posição 0) e a quantidade ofertada/demandada (posição 1).
Neste primeiro momento, apenas imprimimos o objeto no terminal para que você consiga ver se esta primeira etapa funcionou. Experimente rodar o seu projeto com o comando npm start e terá os valores impressos no terminal.
Após imprimir no console você deve ter notado que os valores numéricos estão como string, o que é um problema para os cálculos que faremos a seguir. Desta forma, vamos fazer um map para converter ambos valores para float antes de avançarmos. Esse código deve ficar abaixo do console.log anterior, que pode até ser removido depois do teste.
1 2 3 4 |
const bidsFloat = data.bids.map(b => [parseFloat(b[0]), parseFloat(b[1])]); const asksFloat = data.asks.map(a => [parseFloat(a[0]), parseFloat(a[1])]); |
Esses bidsFloat e asksFloat serão usados a seguir para os cálculos que auxiliarão em estratégias de Tape Reading.
#4 – Calculando a força
Agora que temos os dados que precisamos, é hora de usarmos eles para gerar informações de valor, considerando a ideia de uso em estratégias de Tape Reading. Primeiro, vamos calcular o valor nominal de cada elemento do book (preço x quantidade) e também a somatória de cada lado do book (oferta x demanda). Esse código deve ficar imediatamente abaixo do anterior, ainda dentro do setInterval:
1 2 3 4 5 6 7 8 9 10 11 12 |
//calcula o valor nominal const bidsNotional = bidsFloat.map(b => b[0] * b[1]); const asksNotional = asksFloat.map(a => a[0] * a[1]); //somatório dos valores nominais const bidsSum = bidsNotional.reduce((a, b) => a + b); const asksSum = asksNotional.reduce((a, b) => a + b); console.log("Bids: " + bidsSum); console.log("Asks: " + asksSum); |
Repare que estou usando aqui como base o bidsFloat e asksFloat que convertemos mais cedo. No primeiro bloco, eu calculo o valor nominal de todos bids do book (lances de compra) e de todos os asks também (ofertas de venda). Isso é útil para o somatório que faremos a seguir, usando reduce, mas também mais tarde para encontrarmos a zona de maior pressão de compra e de venda. Remova o console.log anterior e deixe os dois novos, fazendo um novo teste e verificando se está sendo realizado o somatório corretamente.
Com tudo funcionando, vamos descobrir agora se o book de compra está pressionando mais o ativo ou se é o book de venda que está. Para isso temos de calcular a diferença percentual de valor nominal negociado entre os lados do book, como abaixo.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
let difference = 0; if (bidsSum > asksSum) { console.log("Força compradora vencendo, preço vai subir!"); difference = (bidsSum * 100 / asksSum) - 100; } else { console.log("Força vendedora vencendo, preço vai cair!"); difference = (asksSum * 100 / bidsSum) - 100; } console.log(difference.toFixed(2) + "%"); |
Se o somatório de compras é maior que o de vendas, então a força compradora está pressionando mais e a tendência é que se isso continuar, que o preço vá subir. Mas qual essa diferença? Basta uma regra de 3 para sabermos. Do outro lado, faço exatamente a mesma coisa, mas focado nos asks e por fim imprimimos no console estas percepções e o percentual de diferença, com duas casas decimais. Teste novamente antes de avançarmos.
#5 – Calculando a tendência
Além de detectar qual lado do book está pressionando mais, nós podemos utilizar do book para detectar possíveis platôs de preço, seja no caso de uma alta quanto de uma baixa. Tem várias formas de tentar prever esses platôs e inclusive já falei sobre suporte e resistência em outro momento aqui no blog (inclui vídeo), mas aqui vou me basear na busca pela oferta com o maior valor nominal em cada lado do book. Isso porque, essas grandes ofertas são colocadas no book por “baleias” (grandes investidores) e costumam ser indicadores importantes de suporte e resistência do preço durante um período considerável de tempo, já que pressionam muito o book para que sejam completadas.
Então nossa primeira missão é encontrar a maior (ou as maiores, caso queira) oferta em cada lado do book. Para isso vamos criar uma função fora do setInterval, que tem como objetivo encontrar o maior valor dentro de um array, retornando o índice do elemento uma vez encontrado.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
function findGreater(arr) { let bestIndex = 0; let bestValue = arr[0]; for (let i = 1; i < arr.length; i++) { if (arr[i] > bestValue) { bestValue = arr[i]; bestIndex = i; } } return bestIndex; } |
Essa função será usada pelo código a seguir, que busca o índice do maior valor nominal no array bidsNotional e exibe os dados desse lance de compra no console, fazendo o mesmo também para os asks.
1 2 3 4 5 6 7 |
const bestBuyIndex = findGreater(bidsNotional); console.log("Maior zona de compra: " + bidsFloat[bestBuyIndex]); const bestSellIndex = findGreater(asksNotional); console.log("Maior zona de venda: " + asksFloat[bestSellIndex]); |
O resultado, você vê no seu terminal. No exemplo abaixo, o somatório de asks (vendas) está superando em 51.21% os lances de compra, o que indica uma pressão maior no preço para baixo, sendo que temos uma zona de compra grande perto do preço 102.498, onde o preço deve enfrentar um suporte caso a tendência se concretize.
Obviamente que estas informações não esgotam tudo que você possa precisar para um Tape Reading profissional, até porque olhar o book representa entender as intenções do mercado, o ideal é acompanhar também os trades realizados, mas certamente o que temos já irá te ajudar bastante e até permitir criar alguns sinais bacanas.
Quer aprender a calcular outros indicadores? Confira este post sobre Médias Móveis e neste outro sobre RSI.
Um abraço e até a próxima!
Olá, tudo bem?
O que você achou deste conteúdo? Conte nos comentários.