Como criar um bot de compra e venda de Bitcoin usando Node.js (MBv3) - Parte 2

Cripto

Como criar um bot de compra e venda de Bitcoin usando Node.js (MBv3) - Parte 2

Luiz Duarte
Escrito por Luiz Duarte em 15/03/2021
Junte-se a mais de 34 mil devs

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

Atenção: este post está desatualizado e usa a API da Mercado Bitcoin v3, descontinuada em outubro de 2023. A versão mais atualizada deste tutorial, que usa a API v4, se encontra neste link.

Desde a primeira vez que escrevi a primeira parte deste tutorial de criação de um bot para comprar e vender Bitcoins e outras criptomoedas usando a API do Mercado Bitcoin a valorização da moeda atingiu níveis históricos. Em 2017 comemoramos a marca de U$15 mil por 1 BTC e em 2021 já estamos em U$56 mil.

Na primeira parte foquei nos conceitos fundamentais, criação e configuração da conta na exchange, criação do projeto e codificação do algoritmo de monitoramento do mercado. Agora faremos a codificação do nosso bot para que ele consiga comprar e vender criptomoedas.

Atenção: ganhos passados não representam garantia de ganhos futuros. Criptomoedas são investimentos de risco e portanto você pode perder muito dinheiro mesmo acreditando que sabe operar neste mercado. Eu NÃO SOU responsável e jamais serei pelas suas perdas, eu apenas ensino a criar programas de computador, não aconselho investimentos, ok?

O conteúdo de ambas as partes também pode ser visto neste vídeo:

#1 – Ajustando o módulo API

Abra novamente o seu projeto (sugiro estar utilizando o Visual Studio Code) e vá até o seu arquivo api.js, que é nosso módulo que guardará as classes clientes para a API do Mercado Bitcoin. Caso não tenha feito a primeira parte do tutorial, você pode baixá-la no post anterior, no formulário ao fim do mesmo.

Logo no início do arquivo api.js, vamos modificar o original para adicionar dois novos módulos que serão necessários, o crypto e o querystring (o axios é do tutorial anterior):

O primeiro serve para criptografar mensagens e o segundo para concatenar variáveis no formato de querystring do HTTP. Precisaremos de ambos pois o endpoint que vamos acessar para efetuar transações exige criptografia e para algumas operações devemos enviar dados no body de um POST.

O módulo crypto é nativo, mas para que o módulo querystring funcione corretamente precisamos instalá-lo no projeto usando o NPM via console (instale agora, caso ainda não tenha feito):

Ainda no arquivo api.js, logo abaixo dos requires, vamos definir duas novas constantes para o path da Trade API e para o endpoint da mesma (o outro endpoint é o de consulta de informações):

E por fim, logo abaixo da class da API de informações, vamos adicionar a class que representa a API de trading já com o seu constructor:

As configurações passadas por parâmetro são a chave da API, o segredo da API, o PIN da sua conta e a moeda que vai negociar com esse bot (BTC, BCH e LTC no caso do Mercado Bitcoin). Note que KEY, SECRET e PIN eu lhe ensinei como obter no post anterior, dentro da sua área de trader da exchange. Não informe estes dados a ninguém!

Logo abaixo desta função construtora, vamos adicionar as funções que fazem as chamadas à API de trading:

Aqui estou definindo diversas operações que a API nos permite realizar, apenas configurando as chamadas e passando-as para uma função call que não está implementada. Vale citar o que cada operação realiza:

  • getAccountInfo: pega informações da sua conta, especialmente o seu saldo atual em cada moeda, incluindo BRL;
  • placeBuyOrder: criar uma nova ordem de compra no livro de negociações. Caso haja disponibilidade (tem moedas sendo vendidas ao preço que deseja pagar), a ordem será executada imediatamente. Caso contrário, ela vai pro livro e seu saldo fica bloqueado para honrar a compra;
  • placeSellOrder: cria uma nova ordem de venda no livro de negociações. Caso haja disponibilidade (tem ordens de compra ao preço que você deseja vender), a ordem será executada imediatamente. Caso contrário, ela vai pro livro e seu saldo na criptomoeda fica bloqueado para honrar a venda;

Você deve ter notado que diversas chamadas concatenam ‘BRL’ à sigla da criptomoeda que vamos negociar, gerando strings como BRLBTC, que é o que chamamos de ‘coin pair’ ou ‘par de moedas’, o que indica que você está negociando Reais por Bitcoins.

Também deve ter notado que em algumas ocasiões eu uso Template Strings para forçar variáveis numéricas a serem strings, que é o formato que a API pede em diversos casos.

Da mesma forma que no caso da classe de API de informações, nossa call é async e teremos de usar await para lidar com a assincronicidade dela. Falando nela…

Ela é um pouquinho complexa, mas segue abaixo:

A Trade API opera somente com requisições POST, cujos parâmetros da requisição devem estar no formato querystring no body. Para montar este body, conto com a ajuda do módulo querystring, concatenando os parâmetros, o nome da ação que esta request fará e um número único que identifica esta request, que aqui apenas estou pegando o timestamp atual, que sabemos que nunca se repetirá.

A Trade API também exige que cada requisição seja enviada com um cabeçalho TAPI-ID com a chave de API e um header TAPI-MAC, que é um hash HMAC-SHA512 que montamos usando o path completo desta requisição e o API secret como chave de criptografia. De acordo com o response da API, executamos o callback de success ou de error.

Para finalizar a nossa API, vamos apenas modificar o module.exports no final para expor ambas classes deste módulo api.js:

#2 – Comprando Bitcoins em Node.js

Uma vez que seu bot esteja monitorando o mercado e você tenha implementado a APIs de trading, você deverá definir a lógica de compra e venda de criptomoedas. Não há uma regra aqui, exceto que você deve procurar comprar em baixa e vender em alta, para lucrar com a oscilação da moeda.

Para começar, vamos criar uma regra bem simples, baseada em uma observação do gráfico candlestick do Bitcoin no momento que escrevo este post:

Podemos observar neste gráfico que o Bitcoin está valorizado em R$178.406 (é um gráfico velho, mas serve como exemplo) por unidade, o que é um valor mediano considerando a máxima e mínima dos últimos dias. Por exemplo, vamos modificar nosso index.js para ordenar uma compra quando o Bitcoin cair abaixo de R$170.000 a unidade:

Neste código eu inicializo a trade API logo no topo, usando diversas variáveis de ambiente presentes no seu arquivo .env que criamos na parte 1 deste tutorial.

Agora após realizar o ticker para pegar as informações atuais do mercado, eu verifico o preço de venda mais barato do Bitcoin atualmente. Se ele for menor que o número que eu defini como bom para compra (170000), eu mando comprar. Note que você pode criar todo tipo de inteligência para calcular este número, como verificar o spread das últimas 24h para inferir variação, verificar volume de vendas e compras realizadas para inferir tendências de alta ou baixa, etc.

Uma vez que o preço esteja dentro do seu patamar considerado aceitável, é hora de criar a ordem de compra no livro de negociações. O primeiro parâmetro é quantos bitcoins você deseja comprar (1, mas podem ser frações com até 5 casas decimais) e o segundo parâmetro é o preço máximo que deseja pagar por uma unidade de bitcoin (170000). Diversas coisas podem acontecer neste momento.

Caso você não tenha saldo suficiente, você terá um erro como retorno. Já no caso de que não exista nenhuma ordem de venda compatível com o preço que deseja pagar, sua compra não será efetuada imediatamente. Ela vai parar no livro, seu saldo será bloqueado, e ela será executada assim que alguém estiver vendendo pelo valor que você deseja comprar (ou mais barato). Nestes casos de execução futura, você está sendo executado, e geralmente paga uma taxa de comissão menor para a exchange.

Caso você tenha saldo e exista uma ordem de venda no mercado compatível com a sua ordem de compra, ela será executada imediatamente. O seu saldo em BRL (R$) será liquidado, você receberá saldo em BTC e pagará a comissão de executador, que geralmente é mais alta do que a taxa de quem foi executado (o vendedor cuja ordem já estava no livro antes da sua).

Curso Node.js e MongoDB

#3 – Vendendo Bitcoins em Node.js

Da mesma forma que realizamos a compra, podemos criar uma condição de venda de criptomoedas em nosso robô. Aqui existem dois cenários: operar em STOP ou buscar a lucratividade máxima. Obviamente o risco da segunda alternativa é muito maior e não existe um algoritmo 100% eficiente.

Se optar por operar em STOP, você pode definir uma lucratividade padrão que deseja atingir em cada trade, como 3% por exemplo, e assim que realizar uma compra, você já emite uma ordem de venda com o ágio correspondente, como abaixo (substitua o código de compra anterior por este):

Com isso, você garante que venderá a um valor mínimo que lhe renda o lucro desejado (neste caso, vender a 170000 * 1.03 lhe renderá 2% líquido, por causa das comissões de compra e venda da exchange), tão logo o mercado atinja esse patamar. Eu gosto de operar assim, pois é uma forma de investimento de renda fixa com Bitcoin. Essa porcentagem deve ser relativa ao spread atual (diferença entre mínima e máxima dentro de um período) e deve ser sempre superior a 1% (por causa das comissões).

Note que esta venda está sendo posicionada no livro de negociações no mesmo instante que você está comprando a moeda. Ela não vai ser executada instantaneamente, mas assim que o mercado atingir aquele patamar, o que pode levar alguns minutos em dias de alta volatilidade, ou até mesmo semanas, em períodos de baixa volatilidade (ou caso tenha escolhido um valor muito alto).

Ordens de compra e de venda não executadas podem ser canceladas a qualquer momento usando a function apropriada e seu dinheiro é devolvido (seja ele BTC ou BRL).

Se optar por operar com lucratividade máxima, você não deverá posicionar sua ordem de venda imediatamente após a ordem de compra e sim, deverá continuar monitorando o mercado para entender qual o melhor momento de vender. Esse desafio eu deixo para você bolar.

Curso Web3 para Iniciantes

#4 – Otimizando Compra e Venda de Bitcoin

Usei números fixos nos exemplos anteriores, mas é óbvio que essa estratégia não é lá muito boa pois cria um bot muito burro. O que sugiro é que você sempre realize uma consulta à sua conta para saber quanto possui de saldo da moeda que vai utilizar, para poder calcular quanto pode comprar/vender, evitando erros na API.

Para fazer isso, vamos criar uma function na index.js chamada getQuantity:

Esta function espera a moeda que estamos negociando, o preço de uma unidade dela e se é uma compra ou venda (true/false).

Após algumas conversões usamos a Trade API para pegar informações da conta do indivíduo e descobrir o saldo dele da moeda que vamos criar a ordem. Se for uma compra (isBuy === true), estaremos operando em BRL e temos de ter no mínimo R$100 na conta para poder gastar, comprando uma quantidade igual a saldo / preço. Se for uma venda de criptomoeda, o próprio saldo (balance) da criptomoeda é a quantidade que queremos negociar.

Aqui considero que você sempre deseja usar todo o seu saldo na transação o que, em volumes altos, pode ser muito arriscado (ajuste a seu critério).

Agora vamos usar esta getQuantity nas nossas chamadas de compra, para deixá-las dinâmicas, adaptadas ao saldo atual na sua conta do Mercado Bitcoin:

Usei aqui a quantidade que tenho em carteira para ofertar a venda (não posso usar a quantidade da última compra pois é feito um desconto de comissão em cada compra). E por fim, usei o valor que comprei pela última vez e multipliquei pela rentabilidade desejada que eu deixei configurada no arquivo .env na primeira parte do tutorial, lembra? Assim, fica fácil de mudar isso depois conforme a sua análise do mercado, até que tenha capacidade para montar uma fórmula em cima do spread corrente.

A única otimização que eu não tenho como lhe ajudar é a de determinar quando é o melhor momento para compra, deixei o 170000 chumbado ali no código e depois você deve mudar conforme o mercado. Parece um problema simples, mas não é, é tão complicado descobrir a mínima de compra quanto a máxima de venda e se eu tivesse essa fórmula já estaria rico.

Espero que tenham gostado deste tutorial e tendo qualquer dúvida, deixe nos comentários!

Quer mais algumas dicas, confira o vídeo abaixo.

Curtiu o post? Que tal aprender a construir um robô multi-moedas profissional para a maior exchange do mundo? Clique no banner abaixo e saiba mais!

TAGS:

Olá, tudo bem?

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

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

44 Replies to “Como criar um bot de compra e venda de Bitcoin usando Node.js (MBv3) – Parte 2”

Mario Augusto Bignami

Caraca Luiz, muito bem explicado.. O melhor de tudo q me fez entender melhor a aplicação em si.. amanhã irei criar o bot e entrar de cabeça no mercado, posso contar contigo para melhorias no código?

Luiz Fernando Jr

Certamente.

Mario Augusto Bignami

Luiz, to com dificuldade em startar o código, é node index mesmo?

Mario Augusto Bignami

C:UsersXXXXXXDesktopmercadobitcoinindex.js:14
const coin = isBuy ? ‘brl’ : coin.toLowerCase()
^

SyntaxError: Identifier ‘coin’ has already been declared
at createScript (vm.js:56:10)
at Object.runInThisContext (vm.js:97:10)
at Module._compile (module.js:542:28)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.runMain (module.js:604:10)
at run (bootstrap_node.js:383:7)
at startup (bootstrap_node.js:149:9)

eu atualizei os modulos.. e algo diz q ta errado ainda

Luiz Fernando Jr

Tira o ‘const’ dessa linha 14 do index.js que vai funcionar. Devo ter ratiado ao fazer algum refactor.

Mario Augusto Bignami

Luiz, como vai tudo bem?
Olha eu de novo por aqui, realmente tirando a linha 14 resolveu o problema, porém outro acabou acontecendo.. lembrando q depois de ter acontecido esses erros eu reinstalei todos os módulos necessários porém ainda encontra-se com erro.

C:UsersXXXXDesktopGráficosmercadobitcoinindex.js:5
var tradeApi = new MercadoBitcoinTrade({
^

ReferenceError: MercadoBitcoinTrade is not defined
at Object. (C:UsersXXXXDesktopGráficosmercadobitcoinind
ex.js:5:20)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.runMain (module.js:604:10)
at run (bootstrap_node.js:383:7)
at startup (bootstrap_node.js:149:9)
at bootstrap_node.js:496:3

oque será que pode ser? não alterei nada mais do q o necessário do q pede nos dois tutoriais que criou.

Luiz Fernando Jr

Lá em cima, após o primeiro require, adiciona:

const MercadoBitcoinTrade = require(“./api”).MercadoBitcoinTrade

Eu sei o que aconteceu, eu fiz esse tutorial com partes do meu bot. Não consegui testar essa versão que subi pro blog.

Luiz Fernando Jr

De qualquer forma fiz os ajustes nos fontes que estão aí no post e no zip para download.

Mario Augusto Bignami

Luiz, muito obrigado pelas respostas e ajuda e por subir de novo o zip, porém acho q ainda há algo de errado, pois ja coloquei 3 e-mails diferentes pra baixar o novo zip e não chegou rs…

Luiz Fernando Jr

O link do zip é o mesmo, não mudou. Procura no email que você recebeu pela primeira vez. Qualquer coisa me manda um email pela página Sobre que eu te envio o link de novo.

Mario Augusto Bignami

Luiz, tudo certo.. o bot rodou, porém não consegui configurar corretamente a parte q postou sobre o STOP à 3%.. poderia compartilhar seu código q usa para fazer suas transações?
Na verdade não entendi muito bem as partes de lucro do código.

Luiz Fernando Jr

Boa noite Mario. Após você efetuar a compra de criptomoeda (placeBuyOrder), você imediatamente posiciona uma ordem de venda no livro (placeSellOrder) com um valor 3% superior ao que você pagou, gerando uma ordem que será executada automaticamente no futuro, quando o preço da moeda subir.

A grande dificuldade é comprar barato. No exemplo este valor está fixo em 50000 e você terá de ajustar conforme o mercado atual. Em meu algoritmo pessoal aplico uns cálculos malucos que estou sempre ajustando para chegar em um modelo ideal.

Mario Augusto Bignami

Luiz bom dia, deixa ver se entendi.. eu setei os valores, mas onde está o 3% que seria o STOP?

https://uploads.disquscdn.com/images/e35cac2a594aeca1227b56d522d63159dc43cbcab6bb4fbd45b95dd0e49886bd.png

Luiz Fernando Jr

1200 é 3% superior a 1050. É só substituir pela regra que você quiser, neste exemplo deixei os valores fixos no código, pois é apenas um exemplo de compra e venda.

Mateus Mascarenhas

Olá Luiz, poderia me enviar o código fonte para o meu e-mail [email protected] ? Aconteceu o mesmo erro aqui que deu com o Mario.

Luiz Fernando Jr

Recebeu agora?

Rafael

Obrigado por compartilhar, Luiz. Tem como disponibilizar no Github?

Luiz Fernando Jr

Boa tarde Rafael. Basta deixar seu email no formulário do final do post que você recebe o zip com os fontes por email. Um abraço.

Eduardo

Olá luiz Fernando, Agradeço pelo código, é um ótimo ponto de partida para outras construções.
A minha dúvida é a seguinte, está aparecendo “Undefined” para o Ticker.sell quando ele está sendo testado, o que estou fazendo errado?:

setInterval(() =>
infoApi.ticker((tick) => {
console.log(tick)
if(tick.sell <= 50000){

Luiz Fernando Jr

O que está vindo no console.log do tick? Porque se o sell está undefined não deve estar funcionando a sua chamada à API.

Eduardo

Olá Luiz Fernando, Obrigado pela resposta, no console.log do tick retorna os valores normal (High, Low, Vol, Last Buy, Sell, Date) mas na hora do teste, ” if(tick.sell<= 50000){ " o tick.sell retorna Undefined e então não consegue comparar com o valor estipulado no caso os 50000 do exemplo, evitando todo o tratamento placebuyorder e placesellorder.

Luiz Fernando Jr

Não faz sentido o tick estar populado com todos os campos (incluindo o sell) e depois o tick.sell estar undefined. Tem certeza que não há alguma coisa escrito errado no seu código? Como o JS é muito dinâmico, é fácil cometermos erros.

Eduardo

Bom dia Luiz Fernando, vc te razão é algo bem estranho mesmo, ainda mais pq só descompactei os arquivos e alterei apenas para os dados da minha conta. De qualquer maneira, tive que contornar esse problema para poder usar o seu bot, no meu caso só funcionou com um foreach no array do Ticker, assim consegui pegar o valor do Sell. Bom que seja então, obrigado pela sua ajuda.

Matheus Henrique Souza

Tudo bem pessoal?
Primeiramente quero agradecer ao @luizfernandojr:disqus pelo excelente tutorial.

Quanto ao bug que o @disqus_kVtzKCouTQ:disqus comentou, realmente está acontecendo, e já que o bot do Luiz estava funcionando antes, deve ter acontecido uma alteração pequena na API do MercadoBitcoin, é que no retorno da função ‘infoApi.ticker’ o objeto retornado pela API não é ‘tick’, mas sim ‘ticker’ que contém um objeto ‘tick’, então já na primeira comparação do ‘tick.sell <= 5000' não vai funcionar, porque seria 'ticker.tick.sell' o correto.
Então é isso, galera, espero ter ajudado.

Um abraço.

Luiz Fernando Jr

Obrigado Matheus. Corrigi os fontes do post e do zip. Curiosamente eu já havia feito esta mesma correção na parte um do post, mas aqui ainda não.

Evandro Junior

Bugfix:

Faltava o this do this.config.CURRENCY nesses métodos:

placeBuyOrder: function(qty, limit_price, success, error){
this.call(‘place_buy_order’, {coin_pair: BRL${this.config.CURRENCY}, quantity: (”+qty).substr(0,10), limit_price: ”+limit_price}, success, error)
},

placeSellOrder: function(qty, limit_price, success, error){
this.call(‘place_sell_order’, {coin_pair: BRL${this.config.CURRENCY}, quantity: (”+qty).substr(0,10), limit_price: ”+limit_price}, success, error)
},

Parabéns pelo artigo!

Luiz Fernando Jr

Não estava funcionando sem o this? Porque eu nunca uso this e estava funcionando aqui.

Evandro Junior

Para mim não estava funcionando sem o this. Tem outro lugar mais abaixou que você usou this.

var signature = crypto.createHmac(‘sha512’, this.config.SECRET)
.update(ENDPOINT_TRADE_PATH + ‘?’ + queryString)
.digest(‘hex’)

Luiz Fernando Jr

Blz, vou atualizar os fontes. Obrigado.

Geovane Aguiar

Muito bom mesmo, sou leigo em programaçao, seus posts sao super didaticos, otimos pra quem esta iniciando,
meu Interesse e especisalmente em programaçao mobile, mas estes posts sobre node.js estao otimos… vou ficar aguardando
aquela implementaçao que vai deixar a gente rico. 😉 vlew

Luiz Fernando Jr

Fico feliz que goste dos conteúdos que escrevo. Tendo qualquer sugestão de tema, pode mandar!

Luiz Felipe

Bom dia Luiz,
Parabéns pelo Post, ótimo para iniciantes ( meu caso ) !
Fiz todo o procedimento…. teve alguns erros meus por falta de experiência mesmo, mas analisando com calma, voltando e corrigindo…. acho que agora esta igual ao seu Post….. mesmo assim não estou conseguindo fazer rodar o Bot…… vc teria ele na versão final ( sem os APIs, é claro, rs ) para me encaminhar e ver onde estou errando ?
Já refiz o seu post e não estou conseguindo finalizar !
Agradeco se alguém me enviar o arquivo final no email para eu poder ver onde estou errando !
( [email protected] )

Obrigado e Parabéns mais uma vez !

Luiz Fernando Jr

Coloca seu email no formulário ao final do post que você recebe a versão completa. Se ela não funcionar me avise.

868686

Olá Luiz, parabéns pelo trabalho e obrigado pelo post.

Você conhece algum bot para arbitragem de cryptomoedas em NodeJS? Já pensou em criar um?

Existem algumas opções open source, como o Balckbird, mas são escritas em outras linguagens e não suportam exchanges brasileiras.

Luiz Fernando Jr

Desculpe minha ignorância em trading, mas o que seria arbitragem? Meu bot em Node.js analisa mercado, compra em baixa, vende em alta, etc. Seria isso?

868686

É basicamente a mesma coisa só que entre exchanges.

O bot monitora o mercado em duas ou mais exchanges, compra na que está mais barato e vende na que estão com a cotação mais cara.

Nem todos os bots usam a mesma abordagem, o Blackbird, por exemplo, é imune as variações do mercado, portanto, oferece um risco menor.

Existem empresas que oferecem este serviço, no Brasil eu conheço a Atlas: https://quantum.atlasproj.com/

Porém, eles ficam com metade dos lucros para eles (!!!). :/

Encontrei este aqui feito em NodeJS, mas não é atualizado há 4 anos, nem suporta exchanges brasileiras.

Luiz Fernando Jr

Ah entendi, eu comecei a fazer isso entre Foxbit e Mercado Bitcoin, mas é para uso pessoal mesmo e não tive bons resultados ainda por causa das altas taxas de transferência e de mineradores (talvez com altcoins seja mais viável). Se eu fizesse para mercado faria o mesmo que a Atlas, hehehehe.

868686

Então, depois quando tiver um tempo dê lida na documentação do Blackbird. Na abordagem deles o trader divide o montante que tem entre as exchanges que deseja operar e o bot faz a arbitragem sem transferir os valores entre as exchanges em toda a operação. Isso evita perder muito dinheiro com as taxas.

Luiz Fernando Jr

Vou dar uma olhada sim.

Iago Nunes

Olá luiz Fernando, Agradeço pelo Tutorial, é um ótimo ponto de partida para outras construções. Teria como você enviara para e-mail o codigo fonte [email protected]

Evandro Junior

Luiz,

Criei uma adaptação do seu bot e coloquei aqui: https://github.com/evandrojr/dimdim-bot
Fiz referência ao seu artigo, obviamente. Falta colocar um stop loss.

Muito obrigado pelos ensinamentos!

Luiz Fernando Jr

Excelente recomendação no Readme, hehehe

Marcos Martinelli

Olá Luiz, boa tarde!
Obrigado pelo tutorial, estava buscando isso há um bom tempo. Só que estou tendo um problema: eu fiz o cadastro a baixei os arquivos, enquanto não tinha dinheiro na corretora, apareciam os índices e a mensagem de saldo insuficiente, depois que coloquei dinheiro na corretora, aparece o seguinte erro repetidamente:

“[SyntaxError: Unexpected token u]”

O que pode ser?
Obrigado,
Marcos

Luiz Fernando Jr

No erro deve dizer o arquivo e a linha onde está o problema. Lá deve ter um ‘u’ perdido, que está quebrando o código. É problema de código errado mesmo.