adicionadas novas chamadas API
This commit is contained in:
2
.vscode/settings.json
vendored
2
.vscode/settings.json
vendored
@ -1,4 +1,4 @@
|
|||||||
{
|
{
|
||||||
"python.analysis.typeCheckingMode": "off",
|
"python.analysis.typeCheckingMode": "basic",
|
||||||
"python.analysis.autoImportCompletions": false
|
"python.analysis.autoImportCompletions": false
|
||||||
}
|
}
|
||||||
169
README.md
169
README.md
@ -4,6 +4,7 @@ pequena aplicação para ir acompanhando a evolução de um portfolio de activos
|
|||||||
|
|
||||||
"historico_preco.csv" -> ficheiro CSV com dados historicos diarizados de um activo.
|
"historico_preco.csv" -> ficheiro CSV com dados historicos diarizados de um activo.
|
||||||
|
|
||||||
|
~~~pseudo
|
||||||
data,moeda,simbolo,preco_abertura,preco_maximo,preco_minimo,preco_fecho
|
data,moeda,simbolo,preco_abertura,preco_maximo,preco_minimo,preco_fecho
|
||||||
|
|
||||||
<data> - data a que se referem os dados. formato: dd-mm-aaaa
|
<data> - data a que se referem os dados. formato: dd-mm-aaaa
|
||||||
@ -13,9 +14,11 @@ pequena aplicação para ir acompanhando a evolução de um portfolio de activos
|
|||||||
<preco_maximo> - preco máximo atingido pelo activo nesse dia (em EUR)
|
<preco_maximo> - preco máximo atingido pelo activo nesse dia (em EUR)
|
||||||
<preco_minimo> - preco minimo atingido pelo activo nesse dia (em EUR)
|
<preco_minimo> - preco minimo atingido pelo activo nesse dia (em EUR)
|
||||||
<preco_fecho> - preco de fecho do activo nesse dia (em EUR)
|
<preco_fecho> - preco de fecho do activo nesse dia (em EUR)
|
||||||
|
~~~
|
||||||
|
|
||||||
"portfolio.csv" - ficheiro CSV com informação sobre os movimentos de um activo.
|
"portfolio.csv" - ficheiro CSV com informação sobre os movimentos de um activo.
|
||||||
|
|
||||||
|
~~~pseudo
|
||||||
data,moeda,tipo_movimento,quantidade,preco_movimento
|
data,moeda,tipo_movimento,quantidade,preco_movimento
|
||||||
|
|
||||||
<data> - data a que se refere o movimento
|
<data> - data a que se refere o movimento
|
||||||
@ -23,6 +26,7 @@ pequena aplicação para ir acompanhando a evolução de um portfolio de activos
|
|||||||
<tipo_movimento> - tipo do movimento ("compra", "venda")
|
<tipo_movimento> - tipo do movimento ("compra", "venda")
|
||||||
<quantidade> - quantidade do activo a que se refere o movimento
|
<quantidade> - quantidade do activo a que se refere o movimento
|
||||||
<preco_movimento> - preco a que foi efectuado o movimento (preco activo * quantidade comprada)
|
<preco_movimento> - preco a que foi efectuado o movimento (preco activo * quantidade comprada)
|
||||||
|
~~~
|
||||||
|
|
||||||
exemplo:
|
exemplo:
|
||||||
02-03-2024,bitcoin,compra,0.05,2978.024
|
02-03-2024,bitcoin,compra,0.05,2978.024
|
||||||
@ -33,112 +37,153 @@ de notar que o preco do movimento é o valor pago por 0.05BTC, não o preco de m
|
|||||||
|
|
||||||
podemos calcular qual o preco de compra por unidade de BTC deste movimento simplesmente:
|
podemos calcular qual o preco de compra por unidade de BTC deste movimento simplesmente:
|
||||||
|
|
||||||
|
~~~pseudo
|
||||||
<preco_movimento> / <quantidade> = 59560.48EUR
|
<preco_movimento> / <quantidade> = 59560.48EUR
|
||||||
|
~~~
|
||||||
|
|
||||||
consultando na coingecko o preco de mercado de bitcoin à data de 02-03-2024 (cerca de 57560.483EUR), vemos que foi pago um premium de:
|
consultando na coingecko o preco de mercado de bitcoin à data de 02-03-2024 (cerca de 57560.483EUR), vemos que foi pago um premium de:
|
||||||
( ( 59560.48 / 57560.483 ) - 1 ) * 100 = 3.47%
|
( ( 59560.48 / 57560.483 ) - 1 ) * 100 = 3.47%
|
||||||
|
|
||||||
## Documentação API
|
<details>
|
||||||
https://docs.coingecko.com/reference/introduction
|
<summary>Documentação API</summary>
|
||||||
|
|
||||||
|
<https://docs.coingecko.com/reference/introduction>
|
||||||
|
|
||||||
API_KEY = "CG-K5RS5VXsdFDip2UvY3z8VjQP"
|
API_KEY = "CG-K5RS5VXsdFDip2UvY3z8VjQP"
|
||||||
|
|
||||||
## Obter preço de fecho dos ultimos 365 dias
|
</details>
|
||||||
|
|
||||||
https://api.coingecko.com/api/v3/coins/bitcoin/market_chart?vs_currency=eur&days=365&interval=daily
|
|
||||||
|
|
||||||
* 365 dias é o maximo que podemos obter com demo API_KEY da CoinGecko (as of May '24)
|
|
||||||
|
|
||||||
## Obter OHLC dos ultimos 2 dias
|
|
||||||
|
|
||||||
https://api.coingecko.com/api/v3/coins/bitcoin/ohlc?vs_currency=eur&days=365&precision=3
|
|
||||||
|
|
||||||
## Sidequest - criação de wrapper para a API Coingecko
|
## Sidequest - criação de wrapper para a API Coingecko
|
||||||
|
|
||||||
sim sim, já existe uma (muito bem feita, por sinal!) que pode ser descarregada aqui: https://github.com/khooihzhz/coingecko-python
|
sim sim, já existe uma (muito bem feita, por sinal!) que pode ser descarregada [aqui](<https://github.com/khooihzhz/coingecko-python>).
|
||||||
|
|
||||||
esta é a minha tentativa! :D
|
esta é a minha tentativa! :D
|
||||||
|
|
||||||
|
### Padrões a adoptar
|
||||||
|
|
||||||
|
#### Nomes de funções e parâmetros das chamadas API
|
||||||
|
|
||||||
|
usar como nome das funções e dos parâmetros os mesmos nomes usados pela API da CoinGecko,por exemplo:
|
||||||
|
|
||||||
|
~~~pseudo
|
||||||
|
documentation:
|
||||||
|
'Coin Price by IDs'
|
||||||
|
endpoint:
|
||||||
|
/simple/price/
|
||||||
|
parametros:
|
||||||
|
ids (required)
|
||||||
|
vs_currencies (required)
|
||||||
|
include_market_cap
|
||||||
|
include_24hr_vol
|
||||||
|
include_24hr_change
|
||||||
|
include_last_updated_at
|
||||||
|
precision
|
||||||
|
|
||||||
|
função:
|
||||||
|
coin_price_by_ids()
|
||||||
|
parametros:
|
||||||
|
ids
|
||||||
|
vs_currencies
|
||||||
|
include_market_cap
|
||||||
|
include_24hr_vol
|
||||||
|
include_24hr_change
|
||||||
|
include_last_updated_at
|
||||||
|
precision
|
||||||
|
~~~
|
||||||
|
|
||||||
|
*Nota: na situação em que o nome do parâmetro for um termo reservado, renomear com nome apropriado e comentar essa alteração*
|
||||||
|
|
||||||
|
#### Parâmetros obrigatórios e vazios
|
||||||
|
|
||||||
|
nas chamadas de API com parametros obrigatorios, a função deve gerar erro quando o parametro não for passado como argumento ou o tipo de objecto for diferente do esperado
|
||||||
|
|
||||||
|
quando houver parametros 'vazios' passados como argumentos, estes não devem ser incluidos no URL de consulta. ( implementado na função API() )
|
||||||
|
|
||||||
### endpoints Public API V3
|
### endpoints Public API V3
|
||||||
- **ping**
|
|
||||||
|
|
||||||
> ✅ check api server status
|
✅ - implementado
|
||||||
|
|
||||||
- **simple**
|
❌ - não implementado
|
||||||
> ✅ coin price by ids
|
|
||||||
|
|
||||||
> ✅ coin price by token addresses
|
* **ping**
|
||||||
|
|
||||||
> ✅ supported currencies list
|
* ✅ check api server status
|
||||||
- **coins**
|
|
||||||
> ✅ coins list (id map)
|
|
||||||
|
|
||||||
> ❌⬛ coins list with market data
|
* **simple**
|
||||||
|
* ✅ coin price by ids
|
||||||
|
|
||||||
> ❌⬛ coin data by id
|
* ✅ coin price by token addresses
|
||||||
|
|
||||||
> ❌⬛ coin tickers by id
|
* ✅ supported currencies list
|
||||||
|
* **coins**
|
||||||
|
* ✅ coins list (id map)
|
||||||
|
|
||||||
> ❌⬛ coin historical data by id
|
* ✅ coins list with market data
|
||||||
|
|
||||||
> ❌⬛ coin historical chart data by id
|
* ✅ coin data by id
|
||||||
|
|
||||||
> ❌⬛ coin historical chart data within time range by id
|
* ✅ coin tickers by id
|
||||||
|
|
||||||
> ❌⬛ coin ohlc chart by id
|
* ✅ coin historical data by id
|
||||||
- **contract**
|
|
||||||
> ❌⬛ coin data by token address
|
|
||||||
|
|
||||||
> ❌⬛ coin historical chart data by token address
|
* ✅ coin historical chart data by id
|
||||||
|
|
||||||
> ❌⬛ coin historical chart data within time range by token address
|
* ❌⬛ coin historical chart data within time range by id
|
||||||
- **asset platforms**
|
|
||||||
> ❌⬛ assets platforms list (id map)
|
|
||||||
|
|
||||||
- **categories**
|
* ❌⬛ coin ohlc chart by id
|
||||||
> ❌⬛ coins categories list (id map)
|
* **contract**
|
||||||
|
* ❌⬛ coin data by token address
|
||||||
|
|
||||||
> ❌⬛ coins categories list with market data
|
* ❌⬛ coin historical chart data by token address
|
||||||
|
|
||||||
- **exchanges**
|
* ❌⬛ coin historical chart data within time range by token address
|
||||||
> ❌⬛ exchanges list with data
|
* **asset platforms**
|
||||||
|
* ❌⬛ assets platforms list (id map)
|
||||||
|
|
||||||
> ❌⬛ exchanges list (id map)
|
* **categories**
|
||||||
|
* ❌⬛ coins categories list (id map)
|
||||||
|
|
||||||
> ❌⬛ exchange data by id
|
* ❌⬛ coins categories list with market data
|
||||||
|
|
||||||
> ❌⬛ exchange tickers by id
|
* **exchanges**
|
||||||
|
* ❌⬛ exchanges list with data
|
||||||
|
|
||||||
> ❌⬛ exchange volume chart by id
|
* ❌⬛ exchanges list (id map)
|
||||||
- **derivatives**
|
|
||||||
> ❌⬛ derivatives tickers list
|
|
||||||
|
|
||||||
> ❌⬛ derivatives exchange list with data
|
* ❌⬛ exchange data by id
|
||||||
|
|
||||||
> ❌⬛ derivatives exchange data by id
|
* ❌⬛ exchange tickers by id
|
||||||
|
|
||||||
> ❌⬛ derivatives exchanges list (id map)
|
* ❌⬛ exchange volume chart by id
|
||||||
|
* **derivatives**
|
||||||
|
* ❌⬛ derivatives tickers list
|
||||||
|
|
||||||
- **NFTs (beta)**
|
* ❌⬛ derivatives exchange list with data
|
||||||
> ❌⬛ nfts list (id map)
|
|
||||||
|
|
||||||
> ❌⬛ nfts collection data by id
|
* ❌⬛ derivatives exchange data by id
|
||||||
|
|
||||||
> ❌⬛ nfts collection data by contract address
|
* ❌⬛ derivatives exchanges list (id map)
|
||||||
|
|
||||||
- **exchange rates**
|
* **NFTs (beta)**
|
||||||
> ❌⬛ btc-to-currency exchange rates
|
* ❌⬛ nfts list (id map)
|
||||||
|
|
||||||
- **search**
|
* ❌⬛ nfts collection data by id
|
||||||
> ❌⬛ search queries
|
|
||||||
|
|
||||||
- **trending**
|
* ❌⬛ nfts collection data by contract address
|
||||||
> ❌⬛ trending search list
|
|
||||||
|
|
||||||
- **global**
|
* **exchange rates**
|
||||||
> ❌⬛ crypto global market data
|
* ❌⬛ btc-to-currency exchange rates
|
||||||
|
|
||||||
> ❌⬛ global de-fi market data
|
* **search**
|
||||||
|
* ❌⬛ search queries
|
||||||
|
|
||||||
- **companies (beta)**
|
* **trending**
|
||||||
> ❌⬛ public companies holdings
|
* ❌⬛ trending search list
|
||||||
|
|
||||||
|
* **global**
|
||||||
|
* ❌⬛ crypto global market data
|
||||||
|
|
||||||
|
* ❌⬛ global de-fi market data
|
||||||
|
|
||||||
|
* **companies (beta)**
|
||||||
|
* ❌⬛ public companies holdings
|
||||||
|
|||||||
245
coingecko_api.py
245
coingecko_api.py
@ -1,245 +0,0 @@
|
|||||||
|
|
||||||
# . documentação API: https://docs.coingecko.com/v3.0.1/reference/introduction
|
|
||||||
|
|
||||||
import requests
|
|
||||||
import json
|
|
||||||
|
|
||||||
CHAVE_API = 'CG-K5RS5VXsdFDip2UvY3z8VjQP'
|
|
||||||
headers = {
|
|
||||||
'accept': 'application/json',
|
|
||||||
'x-cg-demo-api-key': CHAVE_API
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
# https://docs.coingecko.com/v3.0.1/reference/ping-server
|
|
||||||
# verificar o estado do servidor API
|
|
||||||
def ping() -> tuple:
|
|
||||||
endpoint_api = 'ping'
|
|
||||||
url_pedido = url_raiz_API + endpoint_api
|
|
||||||
resposta = requests.get(url_pedido, headers=headers)
|
|
||||||
return resposta.status_code, resposta.json()['gecko_says']
|
|
||||||
# debug (decomentar linhas seguintes para testar funcao)
|
|
||||||
# codigo, dados = ping()
|
|
||||||
# print(f'codigo: {codigo}')
|
|
||||||
# print(f'resposta: {dados}')
|
|
||||||
|
|
||||||
# https://docs.coingecko.com/v3.0.1/reference/simple-price
|
|
||||||
# consultar preco de uma ou mais moedas usando o seu ID de Moeda API
|
|
||||||
def consultar_preco(id_criptomoeda: str = '',
|
|
||||||
vs_currency: str = '',
|
|
||||||
flag_include_market_cap: bool = False,
|
|
||||||
flag_include_24hr_vol: bool = False,
|
|
||||||
flag_include_24hr_change: bool = False,
|
|
||||||
flag_include_last_updated_at: bool = False,
|
|
||||||
precisao: int | str = 'full'
|
|
||||||
) -> tuple:
|
|
||||||
'''
|
|
||||||
consultar preço de um ou mais moedas usando o seu ID de Moeda
|
|
||||||
|
|
||||||
podem ser passadas multiplos IDs de moedas separadas por virgula, como objecto de tipo 'str'
|
|
||||||
'''
|
|
||||||
# validacao de parametros
|
|
||||||
if not isinstance(id_criptomoeda, str):
|
|
||||||
raise TypeError('\'id_criptomoeda\' não é do tipo \'str\'')
|
|
||||||
if id_criptomoeda == '':
|
|
||||||
raise ValueError('\'id_criptomoeda\' tem de ser definido')
|
|
||||||
if not isinstance(vs_currency, str):
|
|
||||||
raise TypeError('\'vs_currency\' não é do tipo \'str\'')
|
|
||||||
if vs_currency == '':
|
|
||||||
raise ValueError('\'vs_currency\' tem de ser definido')
|
|
||||||
if not isinstance(flag_include_market_cap, bool):
|
|
||||||
flag_include_market_cap = False
|
|
||||||
if not isinstance(flag_include_24hr_vol, bool):
|
|
||||||
flag_include_24hr_vol = False
|
|
||||||
if not isinstance(flag_include_24hr_change, bool):
|
|
||||||
flag_include_24hr_change = False
|
|
||||||
if not isinstance(flag_include_last_updated_at, bool):
|
|
||||||
flag_include_last_updated_at = False
|
|
||||||
if (not isinstance(precisao, int)) and (not isinstance(precisao, str)):
|
|
||||||
raise TypeError('\'precisao\' não é do tipo \'int\' ou \'str\'')
|
|
||||||
if isinstance(precisao, int):
|
|
||||||
if precisao < 0:
|
|
||||||
precisao = 0
|
|
||||||
if precisao > 18:
|
|
||||||
precisao = 18
|
|
||||||
precisao = str(precisao)
|
|
||||||
|
|
||||||
endpoint_api = 'simple/price?' + 'ids=' + id_criptomoeda + \
|
|
||||||
'&vs_currencies=' + vs_currency + \
|
|
||||||
'&include_market_cap=' + str(flag_include_market_cap).lower() + \
|
|
||||||
'&include_24hr_vol=' + str(flag_include_24hr_vol).lower() + \
|
|
||||||
'&include_24hr_change=' + str(flag_include_24hr_change).lower() + \
|
|
||||||
'&include_last_updated_at=' + str(flag_include_last_updated_at).lower() + \
|
|
||||||
'&precision=' + precisao
|
|
||||||
url_pedido = url_raiz_API + endpoint_api
|
|
||||||
resposta = requests.get(url_pedido, headers=headers)
|
|
||||||
return resposta.status_code, resposta.json()
|
|
||||||
# debug (decomentar linhas seguintes para testar funcao)
|
|
||||||
# codigo, dados_dict = consultar_preco('bitcoin,dogecoin,ethereum,0chain', 'eur')
|
|
||||||
# if codigo == 200:
|
|
||||||
# print(f'codigo: {codigo}')
|
|
||||||
# for moeda in dados_dict:
|
|
||||||
# print(f'{moeda}')
|
|
||||||
# for vs_currency in dados_dict[moeda]:
|
|
||||||
# print(f'\t{vs_currency}: {dados_dict[moeda][vs_currency]:.2f}')
|
|
||||||
|
|
||||||
# https://docs.coingecko.com/v3.0.1/reference/simple-supported-currencies
|
|
||||||
# obter lista de todas as moedas suportadas por CoinGecko que podem ser usados como 'vs_currencies'
|
|
||||||
def obter_lista_moedas_vs_currencies() -> tuple:
|
|
||||||
endpoint_api = 'simple/supported_vs_currencies'
|
|
||||||
url_pedido = url_raiz_API + endpoint_api
|
|
||||||
resposta = requests.get(url_pedido, headers=headers)
|
|
||||||
return resposta.status_code, resposta.json()
|
|
||||||
# debug (decomentar linhas seguintes para testar funcao)
|
|
||||||
# codigo, dados = obter_lista_moedas_vs_currencies()
|
|
||||||
# if codigo == 200:
|
|
||||||
# for item in dados:
|
|
||||||
# print(item)
|
|
||||||
|
|
||||||
# https://docs.coingecko.com/v3.0.1/reference/simple-token-price
|
|
||||||
# consultar preco de token usando o endereco de contrato do token
|
|
||||||
def consultar_preco_token(
|
|
||||||
id_platform: str = '',
|
|
||||||
contract_address: str = '',
|
|
||||||
vs_currency: str = '',
|
|
||||||
flag_include_market_cap: bool = False,
|
|
||||||
flag_include_24hr_vol: bool = False,
|
|
||||||
flag_include_24hr_change: bool = False,
|
|
||||||
flag_include_last_updated_at: bool = False,
|
|
||||||
precisao: int | str = 'full'
|
|
||||||
) -> tuple:
|
|
||||||
# validacao de parametros
|
|
||||||
if not isinstance(id_platform, str):
|
|
||||||
raise TypeError('\'id_platform\' tem de ser do tipo \'str\'')
|
|
||||||
if id_platform == '':
|
|
||||||
raise ValueError('\'id_platform\' tem de ser definido')
|
|
||||||
if not isinstance(contract_address, str):
|
|
||||||
raise TypeError('\'contract_address\' tem de ser do tipo \'str\'')
|
|
||||||
if contract_address == '':
|
|
||||||
raise ValueError('\'contract_address\' tem de ser definido')
|
|
||||||
if not isinstance(vs_currency, str):
|
|
||||||
raise TypeError('\'vs_currency\' tem de ser do tipo \'str\'')
|
|
||||||
if vs_currency == '':
|
|
||||||
raise ValueError('\'vs_currency\' tem de ser definido')
|
|
||||||
if not isinstance(flag_include_market_cap, bool):
|
|
||||||
flag_include_market_cap = False
|
|
||||||
if not isinstance(flag_include_24hr_vol, bool):
|
|
||||||
flag_include_24hr_vol = False
|
|
||||||
if not isinstance(flag_include_24hr_change, bool):
|
|
||||||
flag_include_24hr_change = False
|
|
||||||
if not isinstance(flag_include_last_updated_at, bool):
|
|
||||||
flag_include_last_updated_at = False
|
|
||||||
if (not isinstance(precisao, int)) and (not isinstance(precisao, str)):
|
|
||||||
raise TypeError('\'precisao\' tem de ser do tipo \'int\' ou \'str\'')
|
|
||||||
if isinstance(precisao, int):
|
|
||||||
if precisao < 0:
|
|
||||||
precisao = 0
|
|
||||||
if precisao > 18:
|
|
||||||
precisao = 18
|
|
||||||
precisao = str(precisao)
|
|
||||||
|
|
||||||
endpoint_api = 'simple/token_price/' + id_platform + \
|
|
||||||
'?contract_addresses=' + contract_address + \
|
|
||||||
'&vs_currencies=' + vs_currency + \
|
|
||||||
'&include_market_cap=' + str(flag_include_market_cap).lower() + \
|
|
||||||
'&include_24hr_vol=' + str(flag_include_24hr_vol).lower() + \
|
|
||||||
'&include_24hr_change=' + str(flag_include_24hr_change).lower() + \
|
|
||||||
'&include_last_updated_at=' + str(flag_include_last_updated_at).lower() + \
|
|
||||||
'&precision=' + precisao
|
|
||||||
url_pedido = url_raiz_API + endpoint_api
|
|
||||||
resposta = requests.get(url_pedido, headers=headers)
|
|
||||||
return resposta.status_code, resposta.json()
|
|
||||||
# debug (decomentar linhas seguintes para testar funcao)
|
|
||||||
# id_plataforma = 'ethereum'
|
|
||||||
# enderecos_contracto = '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599,0x4594cffbfc09bc5e7ecf1c2e1c1e24f0f7d29036'
|
|
||||||
# codigo, dados = consultar_preco_token(id_plataforma, enderecos_contracto, 'eur')
|
|
||||||
# print(f'codigo: {codigo}')
|
|
||||||
# if codigo == 200:
|
|
||||||
# for contrato in dados:
|
|
||||||
# print(f'{contrato}')
|
|
||||||
# for vs_currency in dados[contrato]:
|
|
||||||
# print(f'\t{vs_currency}: {dados[contrato][vs_currency]:0.2f}')
|
|
||||||
|
|
||||||
# https://api.coingecko.com/api/v3/simple/supported_vs_currencies
|
|
||||||
# este endpoint permite consultar quais as moedas de referencia suportadas pela CoinGecko
|
|
||||||
def lista_moedas_referencia_suportadas() -> tuple:
|
|
||||||
endpoint_api = 'simple/supported_vs_currencies/'
|
|
||||||
url_pedido = url_raiz_API + endpoint_api
|
|
||||||
resposta = requests.get(url_pedido, headers=headers)
|
|
||||||
return resposta.status_code, resposta.json()
|
|
||||||
# debug (decomentar linhas seguintes para testar funcao)
|
|
||||||
# codigo, lista_moedas_referencia = lista_moedas_referencia_suportadas()
|
|
||||||
# if codigo == 200:
|
|
||||||
# for moeda in lista_moedas_referencia:
|
|
||||||
# print(f'{moeda}')
|
|
||||||
|
|
||||||
|
|
||||||
# https://api.coingecko.com/api/v3/coins/list
|
|
||||||
# obter todas as moedas suportadas em CoinGecko com IDs, nome, simbolo e (no caso de contractos) endereco na plataforma das moedas
|
|
||||||
def lista_moedas(flag_include_platform: bool = False) -> tuple:
|
|
||||||
if not isinstance(flag_include_platform, bool):
|
|
||||||
flag_include_platform = False
|
|
||||||
endpoint_api = 'coins/list?' + str(flag_include_platform).lower()
|
|
||||||
url_pedido = url_raiz_API + endpoint_api
|
|
||||||
resposta = requests.get(url_pedido, headers=headers)
|
|
||||||
return resposta.status_code, resposta.json()
|
|
||||||
# debug (decomentar linhas seguintes para testar funcao)
|
|
||||||
# codigo, dados = lista_moedas(flag_include_platform=False)
|
|
||||||
# if codigo == 200:
|
|
||||||
# for item in dados:
|
|
||||||
# print(item)
|
|
||||||
|
|
||||||
# https://api.coingecko.com/api/v3/coins/markets
|
|
||||||
# consultar preço, cap mercado, volume e dados de mercado de todas as moedas suportadas
|
|
||||||
def lista_dados_mercado(
|
|
||||||
vs_currency: str = '',
|
|
||||||
ids_criptomoedas: str = '',
|
|
||||||
category: str = '',
|
|
||||||
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# =====================================================
|
|
||||||
# fazer consulta de dados OHLC
|
|
||||||
def consulta_ohcl(criptomoeda: str = '',
|
|
||||||
vs_currency: str = '',
|
|
||||||
dias: int | str = 30,
|
|
||||||
precisao: int | str = 3
|
|
||||||
) -> tuple:
|
|
||||||
# validacao de parametros
|
|
||||||
if not isinstance(criptomoeda, str):
|
|
||||||
raise TypeError('\'criptomoeda\' não é do tipo \'str\'')
|
|
||||||
if criptomoeda == '':
|
|
||||||
raise ValueError('\'criptomoeda\' tem de ser definido')
|
|
||||||
if not isinstance(vs_currency, str):
|
|
||||||
raise TypeError('\'vs_currency\' não é do tipo \'str\'')
|
|
||||||
if vs_currency == '':
|
|
||||||
raise ValueError('\'vs_currency\' tem de ser definido')
|
|
||||||
if (not isinstance(dias, str)) and (not isinstance(dias, int)):
|
|
||||||
raise TypeError('\'dias\' não é do tipo \'str\' ou \'int\'')
|
|
||||||
if isinstance(dias, int):
|
|
||||||
dias = str(dias)
|
|
||||||
if (not isinstance(precisao, str)) and (not isinstance(precisao, int)):
|
|
||||||
raise TypeError('\'precisao\' não é do tipo \'str\' ou \'int\'')
|
|
||||||
if isinstance(precisao, int):
|
|
||||||
precisao = str(precisao)
|
|
||||||
|
|
||||||
endpoint_api = 'coins/' + criptomoeda + '/ohlc?vs_currency=' + vs_currency + '&days=' + dias + '&precision=' + precisao
|
|
||||||
url_pedido = url_raiz_API + endpoint_api
|
|
||||||
resposta = requests.get(url_pedido, headers=headers)
|
|
||||||
return resposta.status_code, resposta.json()
|
|
||||||
# debug (decomentar linhas seguintes para testar funcao)
|
|
||||||
# codigo, dados = consulta_ohcl('dogecoin', 'eur', precisao=5)
|
|
||||||
# if codigo == 200:
|
|
||||||
# print(f'codigo: {codigo}')
|
|
||||||
# for item in dados:
|
|
||||||
# print(item)
|
|
||||||
1121
modulos/coingecko_api.py
Normal file
1121
modulos/coingecko_api.py
Normal file
File diff suppressed because it is too large
Load Diff
38
testes/teste_coingecko_api.py
Normal file
38
testes/teste_coingecko_api.py
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
import unittest
|
||||||
|
|
||||||
|
import modulos.coingecko_api as cgapi
|
||||||
|
|
||||||
|
|
||||||
|
class Teste_API(unittest.TestCase):
|
||||||
|
'''teste API()'''
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class Teste_ping(unittest.TestCase):
|
||||||
|
'''teste ping()'''
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class Teste_coin_price_by_ids(unittest.TestCase):
|
||||||
|
'''teste coin_price_by_ids()'''
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class Teste_supported_currencies_list(unittest.TestCase):
|
||||||
|
'''teste supported_currencies_list()'''
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class Teste_coin_price_by_token_addresses(unittest.TestCase):
|
||||||
|
'''teste coin_price_by_token_addresses()'''
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class Teste_coins_list(unittest.TestCase):
|
||||||
|
'''teste coins_list()'''
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class Teste_coins_list_with_market_data(unittest.TestCase):
|
||||||
|
'''teste coins_list_with_market_data()'''
|
||||||
|
pass
|
||||||
Reference in New Issue
Block a user