Automatiza y Controla la Rentabilidad de tus Cryptomonedas con Google Script

Si eres de los que siempre tienen andan calculando cuanto rentabilizan sus cryptomonedas o tu cartera (el conjunto de monedas) como yo, creo que esta solución te servirá.

Básicamente, me he visto en la necesidad de saber cuánto dinero estoy metiendo en crypto y cómo me ha ido rentando en todo este tiempo que he mantenido mi posición.

En este artículo veremos cómo consultar el valor de nuestras cryptomonedas automáticamente cada 5 minutos. Usaremos Google Script para conectarnos a la API de CoinmarketCap que nos dará el valor actual de nuestras monedas, y estos valores serán enviados a un spreadsheet en Google Sheet.

1. API

Primero, debemos saber dónde consultar los valores de nuestras crypto. Muchas plataformas de compra y venta de crypto ofrecen servicios programáticos como las APIs para automatizar tareas relacionadas con las cryptomonedas.

En este caso, nosotros usaremos CoinmarketCap, y en particular accederemos a su API, por ende, nos crearemos una cuenta aquí. Luego de activar nuestra cuenta, e ingresar a la plataforma veremos este dashboard:

Alt Text

A la izquierda del dashboard tenemos el API Key, que será nuestra llave asociado a nuestro usuario que nos permitirá (i) acceder al servicio y consultar y (ii) monitorear la cantidad de request que estamos haciendo al servicio.

Para esta ocasión usaremos la capa gratuita del servicio que al día de hoy nos permite hacer 333 requests diarios al servicio, es decir, podremos consultar nuestras monedas cada 5 minutos.

Ahora cuando nuestra API Key creada, procedemos a crear el script en Google Script y el Google Sheet para consultar y guardar respectivamente.

2. Google Sheet y Script

El primero paso será crear un spreadsheet de la siguiente manera:

Alt Text

Digamos que compramos en Buda.com un mix de las cuatro cryptomonedas que nos ofrecen, para este ejemplo simularemos que compramos: $430.000 CLP en Bitcoin, $750.000 CLP en Ethereum, $170.000 CLP en Bitcoin Cash y $50.000 en Litecoin. Eso nos otorga una cantidad de cada moneda que se refleja en la columna “B”. Ambos montos (columna “B” y “C”) los puedes sacar directamente desde Buda.com o la plataforma que estés usando para comprar cryptomonedas.

Luego, vamos a crear una segunda hoja para hacer el seguimiento de los valores a través del tiempo. Haremos la segunda hoja con las siguientes columnas:

Alt Text

Ahora que tenemos nuestra cantidad de monedas y el precio de compra vamos a programar en Google Script. Vamos a “editor de secuencias de comandos” en la sección Herramientas. Eso creará un script asociado a nuestro spreadsheet.

Alt Text

Vamos a crear una función llamada getCryptoValues que tomará los códigos de nuestras monedas (BTC, ETH, BCH, LTC) para generar el request a la API según su documentación.

/*Ahora comenzaremos a programar la función que traerá lo valores */
function getCryptoValues() {
/* Referenciamos nuestro archivo asociado */
var spreadsheet = SpreadsheetApp.getActive()
/* Referenciamos la hoja en la que trabajaremos */
var sheet = spreadsheet.getSheetByName('AQUI VA EL NOMBRE DE LA HOJA 1')
/* Luego vamos a obtener el código de nuestras monedas */
var coins = sheet.getRange('A2:A').getValues();
var coins = coins.filter(function (row) {
  return row[0] != '' ;});
}

Según la documentación de CoinMarketCap, para consultar los valores de estas cryptomonedas debemos usar el endpoint:

https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest?symbol=BTC,ETH,BCH,LTC&convert=CLP

Por ende, debemos primero definir la moneda a la que queremos evaluarla, en este caso CLP (como en el ejemplo), pero podría ser MX, USD u otra. Luego, se debe definir las cryptomonedas a consultar en este caso: BTC,ETH,BCH,LTC.

Para realizar esto, debemos agregar el siguiente código dentro de la función y abajo del código señalado anteriormente:

/* Dentro de la función y abajo del código anterior */
var fiat = 'CLP' //Se define la moneda
var coins_text = ''
/* Generamos el string "BTC,ETH,BCH,LTC" a partir de los datos de nuestra hoja */
for (var j = 0; j < coins.length; j++){
  coins_text += coins[j]
  if (j != coins.length - 1) {coins_text += ','}
}

Ahora tenemos el string para consultar y la moneda, vale decir, ya podemos consultar la API de CoinMarketCap:

/* Dentro de la función y abajo del código anterior */
var options = {
headers: { 'X-CMC_PRO_API_KEY': 'AQUI VA EL API TOKEN DEL PASO 1' }
}
var url = `https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest?symbol=${coins_text}&convert=${fiat}`
var response = UrlFetchApp.fetch(url, options);
/* Aquí parseamos la data que nos envía la API */
var res = JSON.parse(response);

Ahora que tenemos la respuesta de la API, que a partir de su documentación sabemos su estructura para sacar los datos relevantes, en este caso rescataremos: los valores de cada moneda en CLP, y el timestamp.

/* Dentro de la función y abajo del código anterior */
var timestamp = res.status.timestamp
var rows = [[timestamp]]

for (var i = 0; i < coins.length; i++){
  var coin = coins[i]
  var clp_price = res.data[coin].quote.CLP.price
  var pos = i + 2
  sheet.getRange('D'+ pos).setValue(clp_price);
  sheet.getRange('E'+ pos).setValue('=D'+pos+'*B'+pos);
  sheet.getRange('F'+ pos).setValue('=E'+pos+'-C'+pos);
  sheet.getRange('G'+ pos).setValue('=F'+pos+'/C'+pos);
  rows[0].push(clp_price)
}

Si ejecutamos el código que llevamos hasta ahora deberíamos tener algo así:

Alt Text

Finalmente, queremos generar guardar cada respuesta de la API para ver cómo estos valores van variando en el tiempo:

/* Dentro de la función y abajo del código anterior */
var sheetHistorical = spreadsheet.getSheetByName('AQUI VA EL NOMBRE DE LA HOJA 2')
var lastRow = sheetHistorical.getLastRow()
var nextRow = lastRow + 1
rows[0].push('')
rows[0].push('=NOMBRE HOJA 1!$B$2*B'+nextRow)
rows[0].push('=NOMBRE HOJA 1!$B$3*C'+nextRow)
rows[0].push('=NOMBRE HOJA 1!$B$4*D'+nextRow)
rows[0].push('=NOMBRE HOJA 1!$B$5*E'+nextRow)
rows[0].push('=G'+nextRow+'+H'+nextRow+'+I'+nextRow+'+J'+nextRow)
rows[0].push('')
rows[0].push('=NOMBRE HOJA 1!$K$2')
rows[0].push('=(K'+nextRow+'-M'+nextRow+')/M'+nextRow)
if (rows.length){
  sheetHistorical.getRange(lastRow + 1, 1, rows.length, rows[0].length).setValues(rows);
  SpreadsheetApp.flush();
}

Al ejecutar la función nos debería quedar algo así:

Alt Text

3. Triggers

Hasta este momento ya tenemos toda la información que necesitamos, pero falta que esta función getCryptoValues se ejecute automáticamente cada cierto tiempo. Para ello nos apoyamos en los triggers de Google Script. Vamos al menú de App script, en “Activadores”.

Alt Text

Luego, vamos a crear un activador de tiempo (cada 5 minutos) para nuestra función de la siguiente manera:

Alt Text

Y eso es todo! Ahora debes esperar a que se ejecute y tus hojas se vayan poblando con información. Finalmente, cuando ya tengas datos después de un tiempo, puedes realizar los gráficos que sientas necesarios, como por ejemplo este:

Alt Text

Código completo

Recuerda reemplazar los valores (en negrita), y seguir el formato del spreadsheet

function getCryptoValues() {

var spreadsheet = SpreadsheetApp.getActive()
var sheet = spreadsheet.getSheetByName('AQUI VA EL NOMBRE DE LA HOJA 1')
var coins = sheet.getRange('A2:A').getValues();
var coins = coins.filter(function (row) { return row[0] != '' ; });

var fiat = 'CLP' //Se define la moneda
var coins_text = ''

for (var j = 0; j < coins.length; j++){
  coins_text += coins[j]
  if (j != coins.length - 1) {coins_text += ','}
}

var options = {
headers: { 'X-CMC_PRO_API_KEY': 'INSERTA TU API KEY AQUÍ' }
}

var url = `https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest?symbol=${coins_text}&convert=${fiat}`
var response = UrlFetchApp.fetch(url, options);

var res = JSON.parse(response);
var timestamp = res.status.timestamp
var rows = [[timestamp]]
for (var i = 0; i < coins.length; i++){
  var coin = coins[i]
  var clp_price = res.data[coin].quote.CLP.price
  var pos = i + 2
  sheet.getRange('D'+ pos).setValue(clp_price);
  sheet.getRange('E'+ pos).setValue('=D'+pos+'*B'+pos);
  sheet.getRange('F'+ pos).setValue('=E'+pos+'-C'+pos);
  sheet.getRange('G'+ pos).setValue('=F'+pos+'/C'+pos);
  rows[0].push(clp_price)
}

var sheetHistorical = spreadsheet.getSheetByName('AQUI VA EL NOMBRE DE LA HOJA 2')
var lastRow = sheetHistorical.getLastRow()
var nextRow = lastRow + 1
rows[0].push('')
rows[0].push('=NOMBRE HOJA 1!$B$2*B'+nextRow)
rows[0].push('=NOMBRE HOJA 1!$B$3*C'+nextRow)
rows[0].push('=NOMBRE HOJA 1!$B$4*D'+nextRow)
rows[0].push('=NOMBRE HOJA 1!$B$5*E'+nextRow)
rows[0].push('=G'+nextRow+'+H'+nextRow+'+I'+nextRow+'+J'+nextRow)
rows[0].push('')
rows[0].push('=NOMBRE HOJA 1!$K$2')
rows[0].push('=(K'+nextRow+'-M'+nextRow+')/M'+nextRow)
if (rows.length){
  sheetHistorical.getRange(lastRow + 1, 1, rows.length, rows[0].length).setValues(rows);
  SpreadsheetApp.flush();
}

}