Open fxmarty opened 3 years ago
A mon avis c'est carrement plus simple d'utiliser l'API de TheGraph (meme syntaxe pour UniSwap et Pancakeswap). Cela dit ca sera utile seulement si on se rend compte qu'il y a pas mal de paires pour lesquelles on arrive pas a avoir de donnees historiques sur des exchanges centralises.
Il y a aussi un autre truc important : la liquidite des paires. Typiquement, on a ce genre de cas (token FRAX, pris au pif):
La crypto est listee sur quelques exchanges centralises (Bilaxy, gate.io), mais on voit que le volume est ridicule. Maintenant, imaginons qu'une crypto similaire soit listee sur Binance, et que pour faire nos statistiques on se base sur gate.io
(qui a des donnees historiques via ccxt
). Et ben je dirais intuitivement que ces stats auront tout simplement aucun sens car le volume est si faible (et la profondeur ridicule...) que l'evolution de prix sera sensiblement differente de celle d'Uniswap au vu du peu de liquidite.
Le probleme est encore plus gros si on veut acheter. A cause du manque de liquidite, bah... on peut pas acheter au prix du marche sans faire s'envoler le cours. D'ou l'interet d'utiliser aussi les DEX comme Pancakeswap/Uniswap ou il y a souvent plus de liquidite pour des "petites" crypto.
Voir https://messari.io/article/retrieving-uniswap-trades-using-the-graph pour les donnees historiques Uniswap / Pancakeswap. C'est assez facile je pense.
Voir aussi pour Binance Chain qui n'a pas l'air d'etre reference sur TheGraph : https://docs.binance.org/api-reference/dex-api/paths.html#apiv1trades et https://github.com/sammchardy/python-binance-chain
Peut-etre utile pour plus tard (pas pour l'historique): https://github.com/shanefontaine/uniswap-python https://github.com/ethereum/web3.py (probablement le mieux pour UniSwap, mais aussi PancakeSwap, voir ici et ici) https://github.com/gauss314/defi https://github.com/pcko1/bscscan-python https://github.com/binance-chain/python-sdk
J'ai pas trouve d'API pour Uniswap V2/V3 et PancakeSwap pour passer des ordres, je pense qu'il faudra interagir avec le contrat directement (cf web3py au-dessus). A tester.
Voir price_history/test_graphQL.py
sur comment faire une requete avec TheGraph pour avoir des donnees historiques sur Uniswap. C'est tout simplement genial, pas etonnant que GRT (le token de TheGraph) ait flambe en decembre.
Pour finir le taff, c'est pas si complique mais il y a pas mal de details a regler. Notamment, pour l'instant dans le CSV on a juste l'adresse du contrat du token, mais pour faire les queries qui vont bien en graphQL je pense qu'il faut l'adresse du contrat de la pair uniswap. Probablement qu'en graphQL c'est un truc qu'on peut recuperer sans trop de souci. Un exemple de token (et un peu plus bas, la paire BCDT-ETH): https://info.uniswap.org/pair/0x2c618ff14c3273236ee441cb24aa6998f266a872
Autre chose : pour faire une requete a un temps donne dans le passe, TheGraph utilise l'argument startBlock
, qui est basiquement le numero de block a partir duquel faire la query (exemple d'un bloc : https://etherscan.io/block/12317134 ). Non ce qui nous faut c'est retrouver le numero de bloc a partir d'une date donnee (e.g. yyyy/mm/dd/hh/mm). Pas complique mais faut trouver une API qui fait ca.
Egalement, il faudra tester le graphQL avec Pancakeswap, mais ca devrait etre bien faisable.
Par ailleurs, ccxt
manque de donnees historiques pour un nombre significatif d'exchanges importants. Voir la liste d'exchanges qui ont des donnees a 1min dans le passe : https://github.com/fxmarty/binance-listing-announcement-price-analysis/blob/main/dat/good_CEX.txt
A comparer avec https://www.coingecko.com/en/exchanges (en triant par #Coins).
For Uniswap, can be found here for sure https://github.com/EverexIO/Ethplorer/wiki/Ethplorer-API#get-last-token-operations
And probably also through TheGraph API: https://github.com/Uniswap/uniswap-v2-subgraph
For PancakeSwap, most probably this one is our best chance: https://github.com/pancakeswap/pancake-subgraph
For centralized exchanges,
ccxt
is really good.