As exchanges decentralizadas ou DEX, como são popularmente chamadas, são uma alternativa às exchanges tradicionais, ou centralizadas, como Binance e Coinbase. Enquanto que nas exchanges centralizadas você compra e vende moedas com a corretora como mediadora das negociações e sem a custódia das suas próprias moedas (“not your keys, not your money”), nas DEX temos todas as negociações, chamadas de swaps (trocas), sendo feitas através de usuários que se conectam à rede com suas próprias carteiras de criptomoedas (como MetaMask) e a mediação acontecendo através de contratos inteligentes (smart contracts). Ou seja, não é um P2P “cru”, direto, ainda existe um intermediador, mas ele é um software aberto e transparente, publicado na blockchain.
Como Chanpeng Zhao afirma, o próprio fundador da Binance, as DEX são o futuro das corretoras de criptomoedas já que por rodarem nativamente na blockchain eles garantem a segurança, o anonimato e a descentralização a todas as partes envolvidas, diferente das exchanges tradicionais que sofrem cada vez mais ataques dos órgãos reguladores nos países em que operam. No entanto, operar em uma DEX é ligeiramente mais complicado do que operar em exchanges comuns, pela própria natureza das criptomoedas e blockchain em si. Da mesma forma, programar bots para este tipo de corretora é um desafio maior também.
Desta forma, neste tutorial eu espero lhe ajudar a entender como criar um primeiro bot trader de criptomoedas que fará swaps em seu nome em uma DEX, a PancakeSwap. A escolha por essa DEX não é por acaso: além dela ser uma das maiores DEX existentes, ela opera em cima da BNB Smart Chain, a blockchain da Binance e com isso acaba aproveitando muito de seu ecossistema como ferramentas de desenvolvimento, documentações e base de usuários. Não obstante, a PancakeSwap é um fork da UniSwap (ensino bot pra ela aqui), a maior DEX do mercado, o que garante que ela segue muitos padrões de desenvolvimento para redes “EVM compatible” (compatíveis com Ethereum Virtual Machine). Assim, uma vez que consiga programar um bot para PancakeSwap, possivelmente conseguirá criar bots para outras redes “EVM compatible” no futuro.
É importante você entender, antes de começarmos a programar, que operar no mercado cripto é muito arriscado por este ser um mercado muito volátil e auto-regulado. Não posso prometer ou me responsabilizar por qualquer lucro ou prejuízo que você possa ter ao colocar o seu dinheiro em uma PancakeSwap ou qualquer outra DEX, independente se usar os códigos que ensino ou não. Além disso, é imprescindível que você já possua conhecimentos básicos de programação para poder fazer este tutorial e também que já tenha feito swaps manualmente na PancakeSwap antes, pois são coisas que não ensinarei aqui.
Dito isso, vamos ao tutorial. Importante ressaltar que este é um tutorial para PancakeSwap v2. Se o que procura é robô para PancakeSwap v3, use este outro tutorial.
Se preferir, pode assistir ao vídeo abaixo, que possui o mesmo conteúdo.
#1 – Ambiente
Usaremos neste tutorial a tecnologia Node.js, cujo setup deve ser feito antes do projeto começar de fato. Baixe e instale diretamente do site oficial e caso tenha dificuldade, pode usar o vídeo abaixo. O vídeo também ensina a instalar o Visual Studio Code, que é a ferramenta de desenvolvimento que uso.
Você vai precisar também de uma carteira de criptomoedas e se já é usuário da PancakeSwap certamente você já tem uma. Usarei aqui a MetaMask como exemplo pois é uma carteira bem popular e que consigo dar algum suporte. Via de regra, qualquer carteira compatível com rede Ethereum (e consequentemente BNB Smart Chain) vai servir. Caso ainda não tenha uma MetaMask, no vídeo abaixo eu ensino a criar uma (é grátis) e a configurar ela com as configurações e saldo de teste. Também mostro isso nesse tutorial, caso prefira ler ao invés de assistir. Usarei aqui a rede BSC (BNB Smart Chain, antiga Binance Smart Chain), mas você pode usar qualquer rede compatível com EVM.
Agora com saldo na carteira e ela apontada para a Testnet, pode testar as suas configurações na PancakeSwap apontada para Testnet. Experimente se autenticar com sua carteira apontada para Testnet, escolher a rede testnet na PancakeSwap e fazer alguns swaps a fim de ter algumas moedas na carteira de testes, recomendo USDT (ou outra stable coin), WBNB e CAKE, além do BNB em si.
E com isso nós estamos com tudo preparado para começar a programar.
#2 – Criando o Projeto
Vamos começar criando nosso projeto. Para fazer isso, crie uma pasta no seu computador e dentro dela (navegue pelo terminal de linha de comando usando ‘cd’) rode o comando abaixo, para inicializar ela como um projeto Node.js.
1 2 3 |
npm init -y |
Agora vamos criar um arquivo index.js, que será o coração do nosso bot. Esse arquivo deverá ter um mecanismo de execução infinita para garantir que nosso bot fique operando 24h por dia, 7 dias por semana. Para isso vou usar o setInterval do JavaScript, determinando um tempo x entre cada execução do nosso bot.
1 2 3 4 5 6 7 |
const CRAWLER_INTERVAL = 3000; setInterval(async () => { console.log("executou"); }, CRAWLER_INTERVAL) |
No exemplo acima coloquei para ele executar a cada 3 segundos (3000ms) e você pode testar esse código executando o programa. Para isso, você pode rodar o index.js com o comando abaixo, considerando que você esteja na pasta do projeto.
1 2 3 |
node index.js |
O resultado deve ser uma mensagem sendo impressa a cada 3 segundos ou outro tempo qualquer que você tenha definido.
Algumas informações que nosso bot vai precisar estão disponíveis na API da PancakeSwap. Outras, estão disponíveis na nossa carteira MetaMask. Em ambos os casos precisaremos de pacotes adicionais em nosso projeto para podermos consumir estes informações. Para isso, instale algumas dependências na pasta do projeto usando o comando abaixo.
1 2 3 |
npm i dotenv axios ethers |
As dependências que instalamos foram:
- dotenv: pacote para fazer gestão de variáveis de ambiente;
- axios: pacote para consumir API HTTP;
- ethers: pacote para se integrar à MetaMask;
O pacote DotEnv requer que a gente crie um arquivo .env na raiz do nosso projeto e coloque dentro dele as nossas variáveis de ambiente. Faça isso e dentro defina as seguintes variáveis.
1 2 3 4 5 6 7 |
#.env, don't commit to repo WALLET=<wallet address> MNEMONIC=<12-word phrase> PROVIDER_URL=https://data-seed-prebsc-1-s1.binance.org:8545 API_KEY=<abc123> |
As variáveis que definimos e que você deve preencher, são:
- WALLET: o endereço público da sua carteira MetaMask, criada na etapa anterior do tutorial;
- MNEMONIC: a frase mnemônica (12 palavras) da sua carteira MetaMask, obtida na criação da carteira;
- PROVIDER_URL: a URL de um full node da rede BNB Smart Chain. Aqui pode deixar o endereço que forneci, que é o de um nó da Testnet da Binance;
- API_KEY: a sua chave de API que vamos usar para obter as cotações/preços, falarei sobre ela mais adiante;
Agora ajuste o seu package.json, na seção scripts, para que nosso .env seja carregado quando o programa iniciar.
1 2 3 4 5 |
"scripts": { "start": "node -r dotenv/config index.js" }, |
Assim, se quiser fazer um novo teste agora, use sempre o comando abaixo ao invés do que usamos anteriormente.
1 2 3 |
npm start |
O resultado deve ser o mesmo de antes, apenas que na memória do programa agora você tem acesso às variáveis de ambiente também.
#3 – Monitorando o Mercado
A primeira coisa que vamos programar em nosso bot é o monitoramento do mercado. Diferente das exchanges centralizadas, que nos fornecem APIs com dados prontos para tudo, nas DEX não temos tanto ferramental para construir bots e espero que isso no futuro mude. No caso da PancakeSwap eles até tinham uma API básica de preço, mas que não está mais disponível e o caminho recomendado é consultar diretamente na blockchain. Felizmente existem projetos como da 0x.org que fazem isso pra gente, desde que respeitemos o rate limit de 40 requests por minuto e 1 request por segundo (conta free).
Para usar a 0x.org você precisará de uma API Key, que você obtém ao se inscrever em qualquer um dos planos do site, incluindo o gratuito. Faça a criação da sua conta, confirme seu email clicando no link que vão enviar e assim que chegar no seu dashboard, terá sua API Key para copiar, como abaixo.
Para usar a nossa recém criada API Key primeiro você deve colocá-la no arquivo .env, na variável API_KEY mais especificamente. Depois, vamos criar um novo arquivo em nosso projeto que vai ser o api.js, onde vamos concentrar todas as funções de comunicação com a PancakeSwap, seja via 0x.org, seja via BNB Smart Chain. É importante salientar que a 0x.org não fornece APIs apontadas para a Testnet e na data que escrevo este tutorial não encontrei ninguém que tenha feito este trabalho pela comunidade, então iremos pegar os preços de produção mesmo, ok? Isso certamente vai atrapalhar qualquer estratégia que tente elaborar em seus testes de desenvolvimento, mas não deve impactar quando estiver apontado para produção.
A função de obter o preço (em dólares) pode ser vista abaixo e é explicada logo em seguida (coloque no api.js).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
const axios = require('axios'); const USDT_MAINNET = "0x55d398326f99059fF775485246999027B3197955"; async function getPrice(contract) { const { data } = await axios.get( `https://bsc.api.0x.org/swap/v1/price?sellToken=${contract}&buyToken=${USDT_MAINNET}&sellAmount=1000000000000000000`, { headers: { "0x-api-key": process.env.API_KEY } }); return parseFloat(data.price); } module.exports = { getPrice } |
Nesta função nós fazemos uma chamada GET simples à URL da API, informando o endereço do contrato do Token que queremos consultar o preço e passando nossa API Key no header exigido na documentação deles. Enquanto que os endereços dos contratos de produção você pode obter no site BSCScan ou no site da PancakeSwap, os endereços dos contratos de teste devem ser obtidos na no Testnet BSCScan. Atenção a essa mistura: sempre consulte preços usando os endereços dos tokens de produção, mas mais tarde, durante os swaps, deverá usar os endereços da Testnet, a menos que já queira operar apontado para produção (mainnet).
Esta chamada GET retorna um objeto com uma série de informações sobre o token, sendo a mais importante delas o preço do mesmo (em dólares, pois nosso buyToken é USDT). Importante salientar novamente que este preço é o de produção e que na Testnet os preços são completamente zoados uma vez que os mercados não possuem liquidez. Novamente: isto não atrapalha nosso desenvolvimento, mas esqueça teste de estratégia na Testnet.
Agora vamos chamar este nosso módulo api e sua função getPrice no index.js e adicionar algumas novas constantes para definir nosso preço e lucratividade alvos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
const api = require('./api'); const CRAWLER_INTERVAL = 3000; const PRICE_TO_BUY = 1; const PROFITABILITY = 1.1;//10% const CAKE_MAINNET = "0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82"; let isOpened = false; setInterval(async () => { const price = await api.getPrice(CAKE_MAINNET); if (price < PRICE_TO_BUY && !isOpened) { console.log("Cheap. Time to buy."); isOpened = true; } else if (price > (PRICE_TO_BUY * PROFITABILITY) && isOpened) { isOpened = false; console.log("Expensive. Time to sell."); } }, CRAWLER_INTERVAL) |
PRICE_TO_BUY define o gatilho de compra da moeda, baseado em preço. PROFITABILITY define o percentual de lucro que você quer ter em cima da compra, ou seja, seu gatilho de venda. Assim, a cada x tempo o seu bot monitora o preço chamando a API e se ele estiver abaixo do gatilho de compra, ele imprime uma mensagem. Agora, se o preço estiver acima do preço de compra mais uma lucratividade (10% no exemplo), ele imprime uma mensagem e venda. Já a variável isOpened serve para entender se a posição está aberta (comprada) ou não, o que evita compras ou vendas sucessivas, ele sempre vai comprar uma vez e aguardar para vender.
Com isso rodando, você já tem um bot monitorando o preço de um ativo e decidindo, baseado no preço, se é um bom momento para comprar ou para vender o ativo.
A próxima etapa é justamente fazer a compra ou a venda literalmente, mas este é um assunto para a parte dois deste tutorial. Leia aqui!
Teve algum problema? Confira este artigo com os erros mais comuns!
Olá, tudo bem?
O que você achou deste conteúdo? Conte nos comentários.