Algoritmo para arbitragem triangular com bot - Parte 2

Node.js

Algoritmo para arbitragem triangular com bot - Parte 2

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

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

Na primeira parte deste tutorial, que você confere neste link, nós entendemos os conceitos mais fundamentais da arbitragem triangular e começamos a olhar o mercado e montar as possibilidades de triangulação, apenas com o caminho Buy Buy Sell inicialmente.

Nesta segunda etapa, vamos gerar as hipóteses usando o caminho Buy Sell Sell e vamos monitorar os preços do mercado, a fim de ver quais hipóteses podem ser lucrativas, dando sequência ao projeto da parte 1.

Se preferir, pode assistir ao vídeo abaixo, tem o mesmo conteúdo.

Buy Sell Sell

Entendemos na parte 1 que um dos caminhos possíveis é fazer duas compras seguidas de uma venda. Vimos também que a segunda possibilidade é fazer uma compra seguida de duas vendas, como mostra o diagrama de exemplo abaixo.

Nós já temos todos os pares sendo negociados na corretora (variável allSymbols), temos todos os pares que podemos comprar em virtude do quote disponível (variável buySymbols) e um mapa de symbols que é o mesmo allSymbols, mas organizado com foco em performance de pesquisa.

Vamos criar no nosso index.js nossa função getBuySellSell, que é bem parecida com a getBuyBuySell anterior, mas com ajustes.

Quase não tem nada novo a explicar aqui. O que muda basicamente é o filtro aplicado no allSymbols para procurar os candidatos a venda 1 e também a forma de procurar o candidato a venda 2. Mas se você comparar ambos com o diagrama de exemplo do BSS, verá que é somente isso que muda mesmo, em virtude da troca da segunda operação.

Agora, vamos usar esta função em nosso start para que tenhamos também toda a coleção de possibilidades BSS.

Você deve esperar ver que ambos caminhos possuem a mesma quantidade de possibilidades. Isso não quer dizer que sejam iguais, mas em número de combinações sim. Na prática podem aparecer oportunidades em um caminho, em outro ou em nenhum, mas nunca nos dois, por isso que temos de testar ambos.

Livro Node.js

Monitorando os Preços

Agora que temos todas as possibilidades de triangulação temos de começar a nos preocupar com os preços. São os preços que nos dirão se cada modelo de triângulo é viável economicamente ou não, certo?

Para fazer o monitoramento de preços você pode fazer de maneira sync/pull ou de maneira async/push, sendo que o segundo cenário tem melhor performance e maior exatidão na informação. No entanto, para trabalhar com recebimento de preços (async/push) ao invés de consulta de preços (sync/pull), é necessário que a exchange tenha suporte a websockets/streams, coisa que a Binance felizmente tem.

Então, vamos criar um novo arquivo no nosso projeto chamado stream.js para criarmos esta conexão.

Este módulo começa carregando o pacote ws que deixamos instalados ainda na parte 1 do projeto. Na sequência, usamos a classe WebSocket para nos conectarmos na stream de bookTicker, cuja documentação completa você confere aqui. Isso vai fazer com que o objeto ws passe a receber os preços de todos os pares sendo negociados na Binance, em tempo real, toda vez que mudarem.

Para processar esses dados chegando a gente cria uma função que recebe um evento. Esse evento tem os dados dos preços, que são 2: ask price e bid price. O ask price é o melhor preço de venda e bid price é melhor preço de compra e a título de curiosidade, toda vez que eles se encontram um trade acontece no book da corretora.

Conforme esses dados vão sendo processados a gente guarda um resumo deles em um objeto BOOK, que expomos através de uma função getBook exportada. Usaremos esta função no arquivo principal do bot para que ele possa fazer as consultas de preço. Importe este módulo no início do index.js para que ele passe a receber os preços em background.

Caso queira testar, pode colocar um console.log dentro da função do onmessage para imprimir o event.data e ver as informações chegando no console.

Curso Node.js e MongoDB

Viabilidade da Triangulação

Agora nós entramos na última e mais crucial parte do algoritmo que é a verificação de viabilidade financeira. Dentre todos os triângulos hipotéticos que podemos fazer, quais deles seriam lucrativos dados os preços atuais, o QUOTE que possuímos e a meta de PROFITABILITY que colocamos?

Para fazer isso usaremos duas fórmulas de cruzamento (cross-rate formulas), uma para as hipóteses BUY BUY SELL e outra para as hipóteses BUY SELL SELL, como mostra a imagem abaixo.

Essa fórmula deve ser aplicado a cada um dos triângulos hipotéticos que montamos e a função a seguir mostra como fazê-lo no caminho BBS.

Começamos com um laço, que vai percorrer todas hipóteses. A cada hipótese, verificamos se já temos os preços dos três pares. Preços esses que consultamos usando a função getBook exportada no módulo stream.js. Se tivermos os 3 preços, aplicamos a fórmula de cross-rate e se o resultado for superior à PROFITABILITY configurada, então a oportunidade foi encontrada.

A título de didática, incluí uma mensagem a mais, indicando o retorno esperado na triangulação considerando o AMOUNT de QUOTE que você informou nas configurações. Futuramente, é aí que você deveria disparar as ordens reais de compra e de venda.

Agora vamos fazer a função que calcula a viabilidade para os cenários de BUY BUY SELL.

Aqui é praticamente a mesma coisa que a função anterior, apenas mudando o preço sendo consultado (troca-se um ask por um bid) e a fórmula de cross-rate.

Curso FullStack

Monitoramento Ininterrupto

Agora a última coisa que precisamos é de um mecanismo que monitore os triângulos ininterruptamente, para sempre que existir alguma oportunidade, que a gente fique sabendo e no futuro, talvez até negocie automaticamente.

Para isso podemos usar um setInterval, para que a cada x segundos a gente verifique os BBS e BSS novamente, deixando a nossa função start como abaixo.

O resultado será que o programa vai ficar imprimindo o horário do processamento e, eventualmente quando algum triângulo for viável, ele imprime as informações do triângulo e o suposto retorno esperado, como mostrado na imagem abaixo, onde defini o QUOTE como USDT, o AMOUNT como 10 e o PROFITABILITY como 1.003.

Espero que tenha gostado do tutorial e até a próxima!

Olá, tudo bem?

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