93 lines
3.7 KiB
Python
93 lines
3.7 KiB
Python
# script para criar um historico de preços de criptomoedas, guardado em ficheiro CSV, com intuito de utilizar este historico de precos para acompanhar evolução de portfolio de criptomoedas
|
|
|
|
# aceder ao historico de preços OHLC de CoinGecko através da API
|
|
# máximo de requests mensal: 10000 (320/dia; 13/hora)
|
|
# . referenciar o uso da CoinGecko através de branding oficial e
|
|
# link para site (https://www.coingecko.com/en/branding)
|
|
# . documentação API: https://docs.coingecko.com/v3.0.1/reference/introduction
|
|
# . obter OHLC: https://docs.coingecko.com/v3.0.1/reference/coins-id-ohlc
|
|
import requests
|
|
|
|
url_raiz_API = 'https://api.coingecko.com/api/v3/'
|
|
|
|
criptomoeda = 'bitcoin'
|
|
vs_currency = 'eur'
|
|
dias = '30'
|
|
precisao = '3'
|
|
url_consulta_ohlc = 'coins/' + criptomoeda + \
|
|
'/ohlc?vs_currency=' + vs_currency + \
|
|
'&days=' + dias + \
|
|
'&precision=' + precisao
|
|
|
|
url = url_raiz_API + url_consulta_ohlc
|
|
|
|
CHAVE_API = 'CG-K5RS5VXsdFDip2UvY3z8VjQP'
|
|
headers = {
|
|
'accept': 'application/json',
|
|
'x-cg-demo-api-key': CHAVE_API
|
|
}
|
|
|
|
resposta = requests.get(url, headers= headers)
|
|
|
|
# carregar dados já existentes em ficheiro CSV (criar ficheiro se não existir) para dicionario
|
|
import csv
|
|
import os
|
|
cabecalho: list = [
|
|
'data_unix',
|
|
'criptomoeda',
|
|
'vs_currency',
|
|
'preco_abertura',
|
|
'preco_maximo',
|
|
'preco_minimo',
|
|
'preco_fecho'
|
|
]
|
|
caminho_ficheiro_historico_csv = './historico_precos.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)
|
|
|
|
# converter dados de coingecko para o formato usado no ficheiro CSV
|
|
lista_linhas_resposta: list = []
|
|
for linha_resposta in resposta.json():
|
|
nova_entrada: dict = {}
|
|
nova_entrada[cabecalho[0]] = str(linha_resposta[0])
|
|
nova_entrada[cabecalho[1]] = criptomoeda
|
|
nova_entrada[cabecalho[2]] = vs_currency
|
|
nova_entrada[cabecalho[3]] = str(linha_resposta[1])
|
|
nova_entrada[cabecalho[4]] = str(linha_resposta[2])
|
|
nova_entrada[cabecalho[5]] = str(linha_resposta[3])
|
|
nova_entrada[cabecalho[6]] = str(linha_resposta[4])
|
|
lista_linhas_resposta.append(nova_entrada)
|
|
|
|
# adicionar items de lista_linhas_resposta se não existirem em lista_linhas_ficheiro_csv (aka: adicionar apenas items novos a lista_linhas_ficheiro_csv)
|
|
for item_resposta in lista_linhas_resposta:
|
|
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)
|
|
|
|
# gravar dados importados
|
|
def gravar_dados_ficheiro_csv(nome_ficheiro: str, dados_importados: list, campos: list = cabecalho):
|
|
# validacao de parametros da funcao
|
|
if not isinstance(nome_ficheiro, str):
|
|
raise ValueError('\'nome_ficheiro\' não é do tipo \'str\'')
|
|
if not isinstance(dados_importados, list):
|
|
raise ValueError('\'dados_importados\' não é do tipo \'list\'')
|
|
if not isinstance(campos, list):
|
|
raise ValueError('\'campos\' não é do tipo \'list\'')
|
|
|
|
with open(nome_ficheiro, 'w', newline='') as ficheiro_csv_historico_precos:
|
|
ficheiroCSV = csv.DictWriter(ficheiro_csv_historico_precos, fieldnames=campos)
|
|
ficheiroCSV.writeheader()
|
|
ficheiroCSV.writerows(dados_importados)
|
|
|
|
gravar_dados_ficheiro_csv(caminho_ficheiro_historico_csv, lista_linhas_ficheiro_csv) |