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 ) # obter volume de negociação # exchange_id: str = "coinbase" # url, codigo, dados_volume = cgapi.exchange_volume_chart_by_id(exchange_id, "365") # print(dados_volume) # 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]]) # 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 }€" ) # plotar dados com mplfinance daily = pd.DataFrame.from_records(dados, index="data_unix") mpf.plot(daily, type="line", style="charles", title=criptomoeda)