Skip to content

Bot que cria candlestickers baseado na cotação atual de uma criptomoeda

Notifications You must be signed in to change notification settings

Wilson3g/crypto-candle-bot

Repository files navigation

Crypto Candle Bot

API que realiza a montagem de candlestickers baseado na cotação em tempo real de uma criptomoeda (Bitcoin)

Não sabe o que é um candlesticker? clique aqui

Funcionalidade:

  • Disponibilizar uma api com dois endpoints responsáveis por iniciar a criação dos candle stickers e por retornar os candles stickers criados.

Requisitos

  • python
  • pip
  • MYSQL
  • ou apenas o Docker

Instalação manual

  1. Faça o clone do projeto
  • $ git clone https://github.com/Wilson3g/crypto-candle-bot.git
  1. Crie e ative uma virtual env usando python3
  • $ python3 -m venv nome_da_sua_env
  • $ . nome_da_sua_env/bin/activate
  1. Instale as dependências
  • $ pip install -r requirements.txt
  1. Inicie o servidor Flask
  • $ flask run

Instalação com Docker

  1. Faça o clone do projeto
  • $ git clone https://github.com/Wilson3g/crypto-candle-bot.git
  1. Montagem dos containers Docker
  • $ docker-compose up
    OBS: Fique ciente que a instalação do projeto com Docker pode levar vários minutos para ser finalizada!

Endpoints da aplicação

Uso

Teste

  1. Executar teste
  • $ python test.py

Escolha do Framework

Assim que comecei a pesquisar e idealizar como o projeto seria implementado, já tinha em mente que gostaria de disponibilizar uma API com um endpoint que retornasse a lista de candle já criados.

Tendo isso em mente, minha escolha se resumiu aos Frameworks Flask Restful e Django Rest Framework (DRF). Como tenho mais experiência com o DRF, fiquei tentado a usa-lo, porém pela alta customização que o Flask oferece e pensando também na leveza do mesmo, decidi usa-lo, já que iria desenvolver uma aplicação simples de início mas que com o passar do tempo poderia ser escalada.

Dificuldades na implementação

python

Assim que comecei a codificar, encontrei como primeiro desafio o uso de multithreading no python(visto que, eu tinha noção de como esse recurso funcionava, mas nunca havia usado). Gastando algumas horas de pesquisas, consegui sair do outro lado rapidamente com este problema.

Assim que resolvi o problema das threads e montei a base da arquitetura e organização do projeto, tive minha primeira "decepção". Minha ideia seria disponibiizar um socket para que sempre que um novo candle fosse criado, o dado fosse retornado de maneira "automática" para o usuário. Cheguei a implementar o script, mas logo percebi o custo computacional que minha aplicação teria caso eu á escalasse, isso porque estava rodando multithreads e sockets na mesma aplicação. Tentei separa os scripts mas não consegui realizar a implementação de uma maneira inteligente.

Docker

Quando terminei o script em Flask, iniciei os meus estudos e tentativas de subir um container com o Flask e MYSQL.

Admito que tenho pouca ou nenhuma experiência com o Docker, mas subir os containers do Flask e MYSQL não foi nada muito complicado. Com poucas horas gastas, consegui realizar a implementação.

Meu primeiro problema com Docker se iniciou quando tentei ligar os dois containers que havia acabado de subir. Demorei mais de um dia para conseguir realizar a conexão do banco com a aplicão.

Minha segunda "decepção" aconteceu assim que consegui realizar a conexão dos dois containers. Percebi que o container com Flask estava tentando executar as migrations antes do container MYSQL ser totalmente iniciado. Gastei mais de dois dias tentando resolver o problema.

Acabei descobrindo que a solução se encontrava em uma técnica popularmente chamada de "wait-for-it" que consistem em criar um script responsável por fazer com que um determinado container espere a instância de outro, para assim prosseguir.

Pontos a melhorar

Entre os vários pontos a melhorar no desenvolvimento, posso listar alguns que particulamente me deixaram incomodado.

  1. Organização do projeto: Como não tenho conhecimento em design patterns ainda, tive que procurar formas de organizar o código e a estrutura de pastas. Creio que se fossem aplicadas técnicas de designer pattern, o projeto ficaria mais organizado.

  2. Endpoint usado apenas para startar o servidor: Me desagradou o fato de disponibilizar um endpoint só para iniciar a criação dos candles. Acho que o ideal seria iniciar a criação dos candles assim que o servidor fosse iniciado.

  3. Disponibilizar mais de uma cripto moeda: Atualmente os candles estão sendo montados usando o bitcoin, seria bom se ouvesse ao menos a montagem de candle das 5 principais cripto moedas do mercado.

  4. Socket para exibir os candles em tempo real: Acredito que seja uma ótima ideia retornar a criação dos candles em tempo real para o usuário

  5. Otimizar a montagem dos containers: Creio que a solução que encontrei para a montagem "sincrôna" dos containers não tenha sido a melhor em questão de performance. Vale a pena tentar criar um script próprio para otimizar o processamento.

  6. Aplicar testes: Como não tenho conhecimento com TDD, não sabia o que testar quando montei a implementação. Acabei testando apenas a criação do candle e a url que lista os mesmos. Uma correção a ser feita seria implementar testes em todas as partes possíveis do sistema.

Aprendizado

Como tenho apenas o conhecimento básico do python, desenvolver esta aplicação me possíbilitou aprender tecnologias que eu ainda não havia experimentado.

Mesmo as frustrações que tive ao tentar montar os containers com Docker e ao tentar implementar um server Flask com sockets, me fizeram aprender e tirar lições valiosas que eu jamais teria percebido se não tivesse realizado esta implementação.

Esse desafio me possibilitou observar pontos fracos que eu ainda tenho a desenvolver com meus estudos e com a resolução de desafios cada vez mais complexos.

Enfim, fico feliz com o aprendizado que tirei ao realizar este projeto. Tanto das parte em que consegui alcançar meus objetivos, quanto das partes em que não consegui.

About

Bot que cria candlestickers baseado na cotação atual de uma criptomoeda

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published