Skip to main content

QuotesAggregator is a quote aggregator program that stores the instant values of various currencies to create and save 1, 5 and 10 minute candles in a database through the Poloniex API.

Project description

QuotesAggregator

QuotesAggregator é um programa agregador de cotações que armazena os valores instantâneos de várias moedas para criar e salvar candles de 1, 5 e 10 minutos num banco de dados através da API da Poloniex.

  • Gráficos gerados a partir do banco de dados:

Gráfico de 1 minuto Gráfico de 5 minutos Gráfico de 10 minutos

Como Utilizar

Pré-requisitos

  • Docker

Utilizando

docker-compose up

Executando testes unitários

# Na pasta raiz do projeto
# Lembre-se de criar um virtual env
pip install --no-cache-dir -r requirements.txt
pytest

Criando graficos

Clique aqui

Decisões de arquitetura

  • Uso de websokets ao invés da HTTP API
    • Para manter a consistência dos dados seria necessário fazer varias requisições a HTTP API e por conta disso, poderia ser bloqueado ou ter requisições recusadas, além de receber dados desnecessários. Por conta disso, utilizei websockets API, dessa forma basta inscrever-se no canal para receber a atualização das moedas.
  • Uso de bibliotecas asyncio
    • O programa demanda muito IO (receber os dados da API, salva-los), por isso, optei por utilizar bibliotecas assíncronas para isso, dessa forma o programa não é bloqueado enquanto a recebimento ou envio de dados.
  • Utilização do prodict
    • Para facilitar a leitura do código, utilizei uma classe que se comporta como um dicionário, porém deixa os atributos mais legíveis e funcionalidade de autocomplete.
  • Objeto candle não contem a currency_id
    • Uma estratégia possível, seria utilizar outra chave do candle contendo o ‘id’ da moeda, porém ao utiliza-lo seria necessário iterar, no pior caso, sobre toda a lista, ou seja, O(n). Utilizando um dicionário que se comporta como um HashMap a complexidade de tempo cai para O(1) no caso médio , ou seja, a complexidade de tempo para encontrar os candles é O(1).
  • Não Utilização de ORM
    • Também seria possível utilizar um ORM para facilitar a interação com o banco de dados, porém optei por utilizar consultas SQL para demonstrar os meus conhecimentos em SQL (Mesmo que, nessa prova, apenas consultas simples são necessárias).

Funcionamento

Apos se inscrever no canal Ticker Data é recebido a atualização do valor das moedas, este valor é processado e a partir dele é criado um objeto chave-valor que contem uma lista de 3 candles de 1 5, 10 minutos respetivamente, então estes candles recebem atualização constantemente, até que o período do candle se encerre e ele seja salvo e os seus atributos sobrescritos.

Resultados

Os candles gerados podem ser encontrados através do banco de dados disponível na porta 34807 da sua maquina. Além disso, o programa gera logs visíveis no stdout do docker.

Dificuldades (Resolvidas)

  • Como nunca havia testado métodos assíncronos ainda, foi difícil entender como faze-lo.
  • Ao criar a tabela, utilizei float para os campos, e não comportava o tamanho de alguns valores recebidos, mudei para DECIMAL, que inclusive é mais adequado para valores monetários por problemas de arredondamento em outros tipos de dados.
  • Por desconhecer o modulo aiomysql, cometi o erro de não fazer o commit na transação do banco de dados, e por isso, os dados não eram salvos. Para corrigir habilitei o autocommit na chamada.
  • Tentei algumas abordagens para saber quando salvar o candle, uma delas deixava os valores de abertura-fechamento errado, pois ele considerava o valor pertencente ao período como valor inicial, sendo que o valor do final de um deve ser igual ao inicial do outro, além disso, o candle de 1 minuto estava sendo atualizado a cada 2 minutos, pois eu utilizei o modulo de 2 ao invés do de 1, porque todo numero dividido por um tem resto 0, então ele salvaria o candle antes de o minuto ser finalizado. A solução foi junto ao modulo, verificar se o tempo do candle atual era diferente do novo valor recebido.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

quotesaggregator-0.1.0.tar.gz (12.4 kB view details)

Uploaded Source

Built Distribution

quotesaggregator-0.1.0-py3-none-any.whl (11.1 kB view details)

Uploaded Python 3

File details

Details for the file quotesaggregator-0.1.0.tar.gz.

File metadata

  • Download URL: quotesaggregator-0.1.0.tar.gz
  • Upload date:
  • Size: 12.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.6 CPython/3.8.6 Linux/5.11.0-7614-generic

File hashes

Hashes for quotesaggregator-0.1.0.tar.gz
Algorithm Hash digest
SHA256 bc6436d07420c472b8a13561a9db4ca364b2145e05d9c7a3b14bd3d24f2e99fe
MD5 101fbb39f7f923e22ce25c0058516df4
BLAKE2b-256 dc4034257cf6016fc6708c237a40b72fe9f35be35adcf56b1120e1cebfd0c99f

See more details on using hashes here.

File details

Details for the file quotesaggregator-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: quotesaggregator-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 11.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.6 CPython/3.8.6 Linux/5.11.0-7614-generic

File hashes

Hashes for quotesaggregator-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6c4d7a66fde8776e36d09b4858216e8951bb8c7221257feaf1117c10e2bef17e
MD5 fbcbf373a0d948d179b73b20ed16e3f9
BLAKE2b-256 e5e1d6a66913e32e8692c78229d7d17d92380636d1019ef0988a6d83187f08f4

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page