Impariamo come accedere alle API software di un exchange per crypto ed estrarre informazioni sensibili con una manciata di righe di Python.
Gli articoli relativi alla gestione software delle crypto sta avendo un discreto successo, per via dell’elevato rapporto produttività consumo delle SBC. Proseguiamo quindi su questo argomento presentando una serie di approfondimenti sull’utilizzo del linguaggio Python per accedere alle informazioni relative alle crittovalute. Non si tratta, ovviamente di un articolo che offre consigli finanziari, piuttosto di un divertissement da programmatore per raccogliere le informazioni potenzialmente utili a portare avanti le nostre scelte ed i nostri programmi di investimento.
Cos’è un ticker?
Una delle caratteristiche che più scoraggiano l’investitore in erba è la lettura e l’interpretazione di un grafico finanziario, ritenuto a torto o a ragione ancor più ostico di quelli matematici. Proviamo a fare un po’ di chiarezza…
L’esempio attuale è tratto dall’exchange Binance, ma è praticamente uguale per qualsiasi exchange, e soprattutto è disponibile anche senza registrazione all’exchange.
In alto a sinistra troviamo il valore del titolo relativo ad un controvalore “stabile”, in questo caso legato alla parità con il dollaro: Bitcoin su crittodollaro tether (BTC/USDT).
Di seguito, sulla stessa linea, troviamo il tipo di timeframe, o finestra temporale, desiderata: un timeframe da 1 giorno (1D, come nell’esempio) avrà una barra del grafico per ciascun giorno trascorso, ed il giorno relativo appare sull’asse delle ascisse (asse x). E’ possibile modificare la risoluzione del grafico da 1 minito ad un mese, per riconoscere gli eventi (trend) microscopici e o macroscopici della valuta.
Sulla riga inferiore troviamo una etichetta che riporta i valori prescelti, e 6 indicatori che riportano le seguenti informazioni:
- Open – Il valore di “apertura” del titolo nel timeframe di riferimento (viene riconfigurato modificado il timeframe).
- High – Il valore massimo del titolo in esame nel timeframe di riferimento.
- Low – Il valore minimo nel timeframe di riferimento
- Close – Il valore di “chiusura” nel timeframe di riferimento
- Change – Il valore quantitativo di variazione tra apertura e chiusura
- Percentage – Il valore percentuale di variazione tra apertura e chiusura
Le barre del grafico (chiamate candele) sono composte di una parte piena ed una parte sottile (shadow). Rappresentano visivamente i valori che abbiamo appena visto: la parte solida è limitata dai valori open e close, le shadow sono limitate dai valori high e low. La scala con il valore effettivo si trova sulle ordinate (asse y) ed è posta sulla destra del grafico.
Una rapida occhiata al grafico consente pertanto di avere sotto controllo l’andamento (orario, giornaliero, settimanale) della propria criptovaluta, per poter agire di conseguenza.
Ma cosa accade se nel nostro wallet possediamo più doi una crittovaluta? Come rappresentare i dati in modo più complesso?
Il metodo fetchTicker() dell’exchange
Nell’articolo “Interroghiamo lo stato della blockchain con Python” abbiamo imparato ad usare il modulo ccxt di interfaccia con le API pubbliche degli exchange. Abbiamo visto che diversi sistemi exchange crypto (Binance, Kraken, FTX, KuCoin) utilizzano le stesse API (Application Programming Interface), ovvero la stessa sintassi per raccogliere e presentare i dati pubblici in essi contenuti.
Oggi ci concentreremo su di un metodo che ci consentirà di avere uno snapshot istantaneo di un “multi-ticker” comprendente diverse coppie di crittovalute, con i relativi valori caratteristici, in modo da poter tenere sotto controllo gli spostamenti di ciascuna sul mercato rispetto alle altre, ed essere quindi in grado di interagire in tempo (quasi) reale, per usufruire di pump (rialzo improvviso) o dump (ribasso improvviso) di una valuta rispetto alle altre, e non solo rispetto alla valuta stabile di cambio.
La prima cosa da fare, tuttavia, è capire come sia strutturata la risposta della API che richiede le informazioni all’exchange.
Lanciamo il seguente programma:
La riga 7 stamperà tutti gli exchanges raggiungibili ed interrogabili dal modulo ccxt.
La riga 10 invece restituirà (fetch) il ticker (ovvero le informazoni di tabellone) della coppia specifica BTC/USDT. Cosa contiene, esattamente, questa struttura? Vediamola assieme.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
{ 'symbol': 'BTC/USDT', 'timestamp': 1653494525691, 'datetime': '2022-05-25T16:02:05.691Z', 'high': 30223.74, 'low': 29101.0, 'bid': 29640.86, 'bidVolume': 1.82619, 'ask': 29640.87, 'askVolume': 1.80164, 'vwap': 29649.21974498, 'open': 29421.02, 'close': 29640.86, 'last': 29640.86, 'previousClose': '29421.01000000', 'change': 219.84, 'percentage': 0.747, 'average': 29530.94, 'baseVolume': 61369.15586, 'quoteVolume': 1819547587.6569934, 'info': { 'symbol': 'BTCUSDT', 'priceChange': '219.84000000', 'priceChangePercent': '0.747', 'weightedAvgPrice': '29649.21974498', 'prevClosePrice': '29421.01000000', 'lastPrice': '29640.86000000', 'lastQty': '0.20154000', 'bidPrice': '29640.86000000', 'bidQty': '1.82619000', 'askPrice': '29640.87000000', 'askQty': '1.80164000', 'openPrice': '29421.02000000', 'highPrice': '30223.74000000', 'lowPrice': '29101.00000000', 'volume': '61369.15586000', 'quoteVolume': '1819547587.65699350', 'openTime': '1653408125691', 'closeTime': '1653494525691', 'firstId': '1379910027', 'lastId': '1380851681', 'count': '941655' } } |
Ci troviamo davanti ad un dizionario di coppie chiave-valore, che in Python è semplicissimo manipolare (come abbiamo imparato a fare nella serie di video “Pillole di Python”).
In particolare, riconosciamo i valori open, last, close, high, low, change, percentage, average, che abbiamo appena imparato a riconoscere nel grafico relativo alle coppie di valute.
Inoltre, notiamo che sotto la chiave symbol appare il valore BTC/USDT. Cosa accade se modifichiamo tale coppia chiave:valore inserendo altre crittovalute? Ebbene sì, otteniamo il ticker relativo alle valute presenti e mappate sull’exchange, con tutti i valori attualizzati.
A questo punto, allora, è sufficiente crare un ciclo sulle chiavi per ciascuna valuta di nostro interesse, ed il goco è fatto!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import time import ccxt exchanges = [ccxt.binance ({})] tickers = ['open', 'high', 'low', 'close', 'change', 'percentage', 'average'] # Mostra scostamento percentuale giornaliero i = 0 print(" BNB BUSD EUR BTC ETH ETC XMR ONE COTI QTUM GAL") print("------------------------------------------------------------------------------------------------------------------------------------------------") for ticker in tickers: BTC = exchanges[0].fetchTicker('BTC/USDT')[ticker] ETH = exchanges[0].fetchTicker('ETH/USDT')[ticker] ETC = exchanges[0].fetchTicker('ETC/USDT')[ticker] XMR = exchanges[0].fetchTicker('XMR/USDT')[ticker] ONE = exchanges[0].fetchTicker('ONE/USDT')[ticker] COTI = exchanges[0].fetchTicker('COTI/USDT')[ticker] QTUM = exchanges[0].fetchTicker('QTUM/USDT')[ticker] GAL = exchanges[0].fetchTicker('GAL/USDT')[ticker] BNB = exchanges[0].fetchTicker('BNB/USDT')[ticker] BUSD = exchanges[0].fetchTicker('BUSD/USDT')[ticker] EUR = exchanges[0].fetchTicker('EUR/USDT')[ticker] print("%10s : %10.2f |%10.4f |%10.4f |%10.2f |%10.2f |%10.3f |%10.2f|%10.4f |%10.4f |%10.3f |%10.3f |" % (ticker, BNB, BUSD, EUR, BTC, ETH, ETC, XMR, ONE, COTI, QTUM, GAL)) print("------------------------------------------------------------------------------------------------------------------------------------------------") |
La riga 5 del programma definisce queli chiavi ci interessa mettere a confronto. Quindi il programma eseguirà un loop su tali chiavi (riga 12) richiamandone i valori per una serie definita di coppie di crittovalute. Nell’esempio abbiamo utilizzato Bitcoin, Ethereum, Ethereum Classic, Monero, One, Coti, Quantum, Project Galaxy, Binance Coin, Binance USD, Euro, ma è facile adattare il programma per richiedere i valori relativi alle valute detenute nel proprio wallet. La riga 24 si occuperà di stampare le informazioni raccolte per ciascuna chiave in modo gradevole e tabulato.
E’ anche possibile appoggiarsi ad un diverso exchange, modificando la proprietà a riga 4. Ovviamente occorre prima controllare se sul nuovo exchange esistano le coppie di riferimento.
Il risultato finale è il seguente:
Considerazioni finali
E anche per questa settimana abbiamo terminato.
Abbiamo presentato un articolo ricco di spunti di riflessione, che si presterà ad essere rielaborato per ottenere effetti diversi.
Ad esempio, potremo lanciare il programma ad intervalli di un’ora, e monitorare l’andamento dei valori nel tempo. O salvare i datai all’interno di un database. O utilizzare lo stesso scritp, ma in PHP, e creare un application server su Raspberry PI in grado di rispondere online alle richieste del proprietario delle valute. O magari presentare un grafico comparativo…
Fateci sapere cosa ne pensate, e se vi interessa approfondire l’argomento in un verso o nell’altro. Ci risentiamo tra sette giorni!
Join our groups on Telegram…