Files
crypto_portfolio/crypto_portfolio.py
Luis Rodrigues 6d225acfda correcção de entrada de dados
corrigida entrada de dados da quantidade de criptomoeda detida, quando é
inserida uma virgula, trocar por ponto
2025-01-07 11:56:55 +00:00

142 lines
4.5 KiB
Python

import time
import os
import csv
import modulos.aux as aux
import pandas as pd
import mplfinance as mpf
# se não houver ficheiro 'modulos/constantes.py' criar ficheiro com
# a chave da API 'CHAVE_API_DEMO'
if not os.path.exists('modulos/constantes.py'):
chave_api = input('Introduza a chave da API Demo de CoinGecko: ')
if (not aux.validarChaveAPI(chave_api)):
print(f'erro na validação da chave API {chave_api}')
quit()
else:
with open('modulos/constantes.py', 'w') as f:
f.write(f'CHAVE_API_DEMO = \'{chave_api}\'\n')
import modulos.coingecko_api as cgapi
criptomoeda: str = 'bitcoin'
vs_currency: str = 'eur'
dias: str = '30'
cabecalho: list = [
'data_unix',
'criptomoeda',
'vs_currency',
'Open',
'High',
'Low',
'Close'
]
historico_precos_header = [
"data",
"moeda",
"open",
"preco_maximo",
"preco_minimo",
"preco_fecho"
]
portfolio_headers = [
"data",
"moeda",
"quantidade",
"movimento"
]
# introduzir quantidade de criptomoeda detida
qtd_criptomoeda = float(
input(f"Introduza valor de {criptomoeda} detida: ").replace(",", "."))
# se não houver ficheiro 'dados/{criptomoeda}.csv' criar ficheiro
caminho_ficheiro_historico_csv = f'./dados/{criptomoeda}.csv'
if (not os.path.exists(caminho_ficheiro_historico_csv)):
ficheiro = open(caminho_ficheiro_historico_csv, 'w+', newline='')
ficheiroCSV = csv.DictWriter(ficheiro, fieldnames=cabecalho)
ficheiroCSV.writeheader()
ficheiro.close()
with open(caminho_ficheiro_historico_csv,
'r',
newline='') as ficheiro_csv_historico_precos:
ficheiroCSV = csv.DictReader(ficheiro_csv_historico_precos)
lista_linhas_ficheiro_csv: list = []
for linha in ficheiroCSV:
lista_linhas_ficheiro_csv.append(linha)
# obter dados de coingecko
url, codigo, dados_ohlc = cgapi.coin_ohlc_chart_by_id(criptomoeda, vs_currency,
days=dias, precision=3)
# processar dados coigecko
if codigo == 200:
# print(len(dados_ohlc))
lista_dados_coingecko: list = []
for index in range(0, len(dados_ohlc)):
data = time.gmtime(dados_ohlc[index][0]/1000)
if data.tm_hour == 0 and data.tm_min == 0:
nova_entrada: dict = {}
nova_entrada[cabecalho[0]] = str(dados_ohlc[index][0])
nova_entrada[cabecalho[1]] = criptomoeda
nova_entrada[cabecalho[2]] = vs_currency
nova_entrada[cabecalho[3]] = str(dados_ohlc[index][1])
nova_entrada[cabecalho[4]] = str(dados_ohlc[index][2])
nova_entrada[cabecalho[5]] = str(dados_ohlc[index][3])
nova_entrada[cabecalho[6]] = str(dados_ohlc[index][4])
lista_dados_coingecko.append(nova_entrada)
print(f'dados obtidos com sucesso ({len(lista_dados_coingecko)})')
else:
print('erro ao obter dados')
print(f'erro {codigo}: {dados_ohlc}')
# adicionar items de lista_dados_coingecko se não existirem em
# lista_linhas_ficheiro_csv
# (aka: adicionar apenas items novos a lista_linhas_ficheiro_csv)
for item_resposta in lista_dados_coingecko:
item_existe: bool = False
for linha_ficheiro_csv in lista_linhas_ficheiro_csv:
if (item_resposta == linha_ficheiro_csv):
item_existe = True
if not item_existe:
lista_linhas_ficheiro_csv.append(item_resposta)
# ordenar lista por data
lista_linhas_ficheiro_csv.sort(key=lambda x: x[cabecalho[0]])
# gravar dados no ficheiro
aux.gravar_dados_ficheiro_csv(
caminho_ficheiro_historico_csv,
lista_linhas_ficheiro_csv,
cabecalho)
# carregar dados de ficheiro csv e guardar em lista
dados = aux.carregar_dados_ficheiro_csv(
caminho_ficheiro_historico_csv,
cabecalho)
print(f'{len(dados)} dados carregados')
# preparar dados para plotar
dados = dados[1:] # remover cabecalho
for item in dados:
item[cabecalho[0]] = pd.to_datetime(int(item[cabecalho[0]]), unit='ms')
item[cabecalho[3]] = float(item[cabecalho[3]])
item[cabecalho[4]] = float(item[cabecalho[4]])
item[cabecalho[5]] = float(item[cabecalho[5]])
item[cabecalho[6]] = float(item[cabecalho[6]])
# plotar dados com mplfinance
daily = pd.DataFrame.from_records(dados, index='data_unix')
mpf.plot(daily, type='line', style='charles', title=criptomoeda)
# valor mais recente de criptomoeda em eur
cripto_vs_euro = float(dados[len(dados)-1][cabecalho[6]])
# valor em eur da quantidade de criptomoeda detida
print(f"Valor de {qtd_criptomoeda} {criptomoeda} em EUR: {
(qtd_criptomoeda * cripto_vs_euro):.2f}")