Automatiza y Controla la Rentabilidad de tus Cryptomonedas con Google Script

Nicolás Vega
6 min readMay 3, 2021
Photo by André François McKenzie on Unsplash

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:

Dashboard de request — CoinmarketCap Developer

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:

Crea un spreadsheet e ingresa la información de compra en una primera hoja. Setea también una celda para sumar el total invertido con =SUMA(C2:C), y otra celda para el valor total de la cartera con =SUMA(E2:E).

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:

Creamos una segunda hoja para hacer el trackeo de los valores de nuestras monedas. De esta manera, podremos ver la variación en el tiempo.

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.

Si tienes configurado la GSuite en inglés lo encontrarás bajo “Tools” y luego “Script editor”.

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.timestampvar rows = [[timestamp]]
for (var i = 0; i < coins.length; i++){
var coin = coins[i]var clp_price = res.data[coin].quote.CLP.pricevar pos = i + 2sheet.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í:

Seteamos el valor venta de 1 unidad (que viene de la API), valor actual (cantidad*valor venta de 1 unidad), rentabilidad o utilidad bruta (valor actual — valor compra) y la rentabilidad (utilidad bruta/valor compra)

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 + 1rows[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í:

A la izquierda tenemos el valor de una unidad, y a la derecha tenemos el valor total de cada una de nuestras monedas, más el total invertido y la rentabilidad en ese momento

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”.

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

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:

Tomamos el eje X como el timestamp (columna A), y el eje Y como la rentabilidad % (columna N).

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 monedavar 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.timestampvar rows = [[timestamp]]for (var i = 0; i < coins.length; i++){var coin = coins[i]var clp_price = res.data[coin].quote.CLP.pricevar pos = i + 2sheet.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 + 1rows[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();}
}

--

--