Obtener datos históricos inclusive datos en tiempo de cotización, variación del precio, media móvil simple, índice de fuerza relativa, soportes y resistencias (S/R) en datos históricos empleando la función GOOGLEFINANCE(). Manejando varias fórmulas independientes, formadas por combinaciones de Google Spreadsheet Functions:
Entrada criterios:
Ticker!A1 📌Escribe número de periodos a calcular la media móvil simple al precio de cierre.
Ticker!A2 🗓 Escribe número de periodos a calcular la media móvil simple al precio de cierre.
Ticker!I2 🛒 Escribe en el interior de la fórmula el precio «setPriceBuyTicker» y número de acciones en «setAmountShares»
Ticker!I2 📏 Escribe número de periodos a calcular la media móvil simple al precio de cierre.
Ticker!J2 📐 Escribe número de periodos a calcular la RSI variación al precio de cierre.
Ticker!K2 ⟰ Escribe número de periodos a calcular resistencias.
Ticker!M2 ⟱ Escribe número de periodos a calcular soportes.
Detalles celdas:
Ticker!B1 🌍 Enlace a web Google Finance cotización.
Ticker!C1 ⤵️🔒 Precio de cierre mínimo en los resultados mostrados.
Ticker!D1 ▁▄█ Grafico de barras del precio cierre de los resultado mostrados columna color rojo precio mínimo y columna color verde precio máximo.
Ticker!H1 ⤴️🔒 Precio de cierre máximo en los resultados mostrados.
Ticker!I1 🛒 Número de acciones,
Ticker!J1 Precio de la acción.
Ticker!K1 🟰 Importe total acciones.
Ticker!L1 ⏫⏬ Importe perdida o ganancia.
Ticker!M1⏫⏬ Porcentaje perdida o ganancia.
Ticker!N1 💸 Tipo de moneda.
Ticker!B2 🔄 Promedio precio apertura en los resultados mostrados.
Ticker!C2 ⤴️ Máximo precio máximo en los resultados mostrados.
Ticker!D2 ⤵️ Mínimo precio mínimo en los resultados mostrados.
Ticker!E2 🔄 Promedio precio cierre en los resultados mostrados.
Ticker!F2 🔄 Promedio volumen en los resultados mostrados.
Ticker!B2 🔄 Promedio precio apertura en los resultados mostrados.
Ticker!C2 ⤴️ Máximo precio máximo en los resultados mostrados.
Ticker!D2 ⤵️ Mínimo precio mínimo en los resultados mostrados.
Ticker!E2 🔄 Promedio precio cierre en los resultados mostrados.
Ticker!F2 🔄 Promedio volumen en los resultados mostrados.
Ticker!G2 ∆ Variación precio de cierre último día respecto precio cierre primer día en los resultados mostrados.
Ticker!H2 ∆ Variación precio de cierre último día respecto precio cierre primer día en los resultados mostrados.
Detalles Columnas:
Ticker!A3:A 📆Fecha datos históricos.
Ticker!B3:B 🔓Apertura precio datos históricos.
Ticker!C3:C 📈Máximo precio datos históricos.
Ticker!D3:D 📉Mínimo precio datos históricos.
Ticker!E3:E 🔒Cierre precio datos históricos.
Ticker!F3:F 📊Volumen precio datos históricos.
Ticker!G3:G 🧮Var variación precio cierre respecto al día anterior.
Ticker!H3:H 🧮Var % variación porcentual del precio cierre respecto al día anterior.
Ticker!I3:I 🧱Sma: Media móvil simple de los datos históricos.
Ticker!J3:J 💪Rsi: índice de fuerza relativa de los datos históricos.
Ticker!K3:K ⏫Resistencia del precio máximo en datos históricos.
Ticker!L3:L 🕗Periodo incremental de la resistencia.
Ticker!M3:M ⏬Soporte del precio mínimo en datos históricos.
Ticker!N3:N 🕞Periodo incremental del soporte.
Ⓐ Propuesta plantilla datos históricos:
TickerHistroy!A1:
=LAMBDA(getValueStatic;getValueStatic)
(LET(getTicker;Ticker!$A$1;
getDatasHistory;GOOGLEFINANCE(getTicker;"all";DATE(1930;1;1);TODAY();"DAILY");
getToday;GOOGLEFINANCE(getTicker;"tradetime");
getDateLast;MAX(CHOOSECOLS(getDatasHistory;1));
IF(TEXT(getToday;"dd/mm/yyyy")=TEXT(getDateLast;"dd/mm/yyyy");
getDatasHistory;
{getDatasHistory;
getToday\GOOGLEFINANCE(getTicker;"priceopen")\GOOGLEFINANCE(getTicker;"high")\GOOGLEFINANCE(getTicker;"low")\GOOGLEFINANCE(getTicker;"price")\GOOGLEFINANCE(getTicker;"volume")}
)))
Ⓐ Propuesta detalle:
Insertar la fórmula en la hoja y celda TickerHistory!A1:
Crear una hoja cuyo nombre es «TickerHistory» Insertar fórmula celda A1. La función LET() asigna nombres descriptivos para clarificar su cometido. Su utilización parte de guardar las variables para no tener que volver a repetir funciones, en caso de modificar la fórmula meses después es práctico comprobar la estructura de la fórmula. Asignación «getTicker» obtiene el símbolo del índice bursátil seguido de dos puntos y después símbolo de cotización. Ejemplo «NASDAQ:GOOG» ubicado en hoja y celda «Ticker!$A$1».
Asignación «getDatasHistory» mediante la función GOOGLEFINANCE(), obtiene los datos históricos con el parámetro «all». Función DATE() convierte los valores en fecha. Empezado desde los principios hasta la fecha actual con la función TODAY(). Parámetro «DAILY» frecuencia diaria para conseguir los datos.
Asignación «getToday» logramos la fecha y hora en tiempo de cotización.
Asignación «getDateLast» obtenemos la última fecha de los datos históricos de la asignación «getDatasHistory» que se encuentra en la primera columna por CHOOSECOLS() y calcule la fecha máxima utilizando la función MAX(). Función IF() si la expresión lógica «getToday = getDateLast» comparación de igualdad con el mismo patrón de fecha mediante TEXT() y eliminado la hora predeterminada. Si es TRUE() muestra los datos históricos. Si es FALSE() entonces creamos una matriz con llaves {}. El primer parámetro son los datos históricos. Punto y coma «;»crea otra línea. los demás parámetros son de fecha, precio apertura, precio máximo, precio mínimo, precio actual con retraso y volumen obtenidos por la llamada a la función GOOGLEFINANCE() exento al fecha que ya estaba asignada con «getToday». Están separados con barra de dividir inversa «\» para generar la matriz como columna. Finalmente e insertado LAMBDA() elimina a veces el mensaje de calculado.....
Ⓑ Propuesta celdas criterios:
Reservar celdas para criterios.
Ⓑ Propuesta detalle:
Crear una hoja cuyo nombre es «Ticker».
«Ticker!A1» reservado para escribir el nombre del ticket. Ejemplo «NASDAQ:GOOG». Utilizar el orden, símbolo índice bursátil seguido de dos puntos y finalmente símbolo de cotización. Formato de número personalizado «0;0;0;"📌"@» (opcional).
«Ticker!A2» reservado para escribir el número de días a mostrar en la hoja. Formato de número personalizado «"🗓"#,##0" Días"» (opcional).
«Ticker!I2» reservado para escribir el número de periodos a calcular la media móvil simple. Formato de numérico personalizado «" 📏 "#,##0" Longitud"» (opcional).
«Ticker!J2» reservado para escribir el número de periodos a calcular el índice de fuerza relativa. Formato de numérico personalizado «" 📐 "#,##0" longitud"» (opcional).
«Ticker!K2» reservado para escribir el número de periodos a calcular las resistencias. Formato de número personalizado «"⟰ "#,##0" Longitud"» (opcional). Combinar celdas en horizontal rango «Ticker!K2:L2».
«Ticker!M2» reservado para escribir el número de periodos a calcular soportes. Formato de número personalizado «"⟱ "#,##0" Longitud"» (opcional). Combinar celdas en horizontal rango «Ticker!M2:N2».
Inmovilizar las tres primeras líneas.
Color relleno a su criterio.
Ⓒ Propuesta datos históricos:
Ticker!A3:
=LET(getRangeDatasHistory;TickerHistory!$A:$F; getDays;$A$2;
getCountShowResults;QUERY(getRangeDatasHistory;"select count(Col1) where Col1 >= date '"&TEXT(TODAY()-getDays;"yyyy-mm-dd")&"' label count(Col1) ''");
getDatasHistoryOperate;QUERY(getRangeDatasHistory;"order by Col1 desc limit "&getCountShowResults;1);
getShowResults;QUERY(getDatasHistoryOperate;"order by Col1 desc
label Col1 '📆Fecha', Col2 '🔓Apertura', Col3 '📈Máximo', Col4 '📉Mínimo', Col5 '🔒Cierre', Col6 '📊Volumen'
format Col1 'dd/mm/yyyy', Col2 '#,##0.00', Col3 '#,##0.00', Col4 '#,##0.00', Col5 '#,##0.00',
Col6 '[>=1000000000000]#,##0.00,,,,"&CHAR(34)&"B"&CHAR(34)&";[>=1000000]#,##0.00,,"&CHAR(34)&"M"&CHAR(34)&";#,##0.00,"&CHAR(34)&"K"&CHAR(34)&"'";1);
HSTACK(getShowResults))
Ⓒ Propuesta datos históricos:
Inserta la fórmula en hoja y celda «Ticker!A3».
La función LET() asigna nombres descriptivos para clarificar su cometido. Su utilización parte de guardar las variables para no tener que volver a repetir funciones, en caso de modificar la fórmula meses después es práctico comprobar la estructura de la fórmula.
Asignación «getRangeDatasHistory» obtiene el historial de datos históricos. Según ticket en la celda A1.
Asignación «getDay» intervalo de días a mostrar los datos históricos. según días en la celda A2.
Asignación «getCountShowResults» numerosos de periodos que se muestran mediante QUERY(): Aggregation Function count(). La condición QUERY(): Clause where muestra los días mediante el cálculo de la fecha actual TODAY() restando los días asignados y convirtiendo el patrón de fecha para el lenguaje consulta con la función TEXT(). La QUERY(): Clause label elimina la etiqueta.
Asignación «getDatasHistoryOperate» obtenemos los valores a operar en orden descendente mediante QUERY(): Clause order by y limitado los resultados a calcular con QUERY(): Clause limit.
Asignación «getShowResults» obtiene los resultados mediante la función QUERY() con un orden descendente QUERY(): Clause order by muestra la última fecha y después posteriores. La QUERY(): Clause label modifica las cabeceras predeterminadas cambiando a idioma español y añadiendo símbolos unicode. QUERY(): Clause format cambia a formato fecha, número con dos decimales y para el volumen B de billón, M de millón y K de mil.Este formato necesita comillas dobles. Para no tener conflicto con las comillas dobles que se utiliza en el parámetro QUERY(): Referencia del lenguaje de consulta. Concatenar la función CHAR() con el código 34 de comillas dobles.
Función HSTACK() muestra los resultados de la asignación de nombre «getShowResults» en una matriz con la condición, si matriz no es cuadrada rellena para convertirla.
Ⓓ Propuesta variación de precio y variación porcentual del precio de cierre:
Ticker!G3:
=LET(getRangeDatasHistory;TickerHistory!$A:$F; getDays;$A$2;
getCountShowResults;QUERY(getRangeDatasHistory;"select count(Col1) where Col1 >= date '"&TEXT(TODAY()-getDays;"yyyy-mm-dd")&"' label count(Col1) ''");
getDatasHistoryOperate;QUERY(getRangeDatasHistory;"select Col5 order by Col1 desc limit "&getCountShowResults+1;1);
getPriceClose;getDatasHistoryOperate;
getPriceClosePrevious;QUERY(getDatasHistoryOperate;"offset 1";1);
getVar;QUERY(HSTACK(getPriceClose;getPriceClosePrevious);"select (Col1-Col2) ";1);
getVarPercent;QUERY(HSTACK(getPriceClose;getPriceClosePrevious);"select (1-(Col2/Col1))";1);
getShowResults;QUERY(HSTACK(getVar;getVarPercent);"limit "&getCountShowResults&
" label Col1 '🧮Var', Col2 '🧮Var %' format Col1 '[blue]+#,##0.00;[red]-#,##0.00;0.00', Col2 '[blue]+#,##0.00%;[red]-#,##0.00%;0.00%'";1);
HSTACK(getShowResults))
Ⓓ Propuesta detalle:
Inserta la fórmula en hoja y celda «Ticker!G3».
La función LET() asigna nombres descriptivos para clarificar su cometido. Su utilización parte de guardar las variables para no tener que volver a repetir funciones, en caso de modificar la fórmula meses después es práctico comprobar la estructura de la fórmula.
Asignación «getRangeDatasHistory» obtiene el historial de datos históricos. Según ticket en la celda A1 y vinculada en la hoja «TickerHistory!A:F»
Asignación «getDay» intervalo de días a mostrar los datos históricos. según días en la celda A2.
Asignación «getCountShowResults» número de periodos que se muestran mediante QUERY(): Aggregation Function count(). La condición QUERY(): Clause where muestra los días mediante el cálculo de la fecha actual TODAY() restando los días asignados y convirtiendo el patrón de fecha para el lenguaje consulta con la función TEXT(). La QUERY(): Clause label elimina la etiqueta.
Asignación «getDatasHistoryOperate» obtenemos los valores a operar seleccionando la columna «Close» con un índice Col5 en QUERY(): Clause select, en orden descendente mediante QUERY(): Clause order by y limitado los resultados a calcular con QUERY(): Clause limit.
Asignación «getPriceClose» asignamos «getDatasHistoryOperate», son los precios del cierre
Asignación «getPriceClosePrevious» obtenemos los precios del cierre con un desfase de un periodo mediación de QUERY(): Clause offset.
Asignación «getVar» resultado de restar las asignaciones anteriores por QUERY(): Clause select. Creando primero una matriz alineando precio y precio desfase con HSTACK().
Asignación «getVarPercent» resultado de la división asignaciones anteriores restando uno. Creando primero una matriz alineando precio y precio desfase con HSTACK().
Asignación «getShowResults» obtiene los resultados a mostrar creando matriz en horizontal HSTACK(), limitando los los resultados QUERY(): Clause limit, creando encabezados con símbolos unicode QUERY(): Clause label y danto formato numérico de dos decimales y porcentual QUERY(): Clause format. Para activar los colores, copie el formato sin las comillas simples, seleccione la columna, pega el formato en formato numérico personalizado.
Finalmente la función HSTACK() muestra los resultados de la asignación de nombre «getShowResults» en una matriz con la condición, si matriz no es cuadrada rellena para convertirla.
Ⓔ Propuesta Media móvil simple (SMA):
Ticker!I3:
=LET(getRangeDatasHistory;TickerHistory!A:F; getDays;A2; getLengthSma;I2;
getCountShowResults;QUERY(getRangeDatasHistory;"select count(Col1) where Col1 >= date '"&TEXT(TODAY()-getDays;"yyyy-mm-dd")&"' label count(Col1) ''");
getDatasHistoryOperate;QUERY(getRangeDatasHistory;"select Col5 order by Col1 desc limit "&getCountShowResults+getLengthSma;1);
getSma;MAP(SEQUENCE(getCountShowResults+getLengthSma;1;0;1);LAMBDA(getOffsetNext;LET(
getDataNext;QUERY(getDatasHistoryOperate;"Col1 limit "&getLengthSma&" offset "&getOffsetNext);
QUERY(getDataNext;"select avg(Col1) label avg(Col1) ''"))));
getShowResults;QUERY(getSma;"limit "&getCountShowResults&" label Col1 '🧱Sma: "&getLengthSma&"' format Col1 '#,##0.00'";1);
HSTACK(getShowResults))
Ⓔ Propuesta detalle:
Inserta la fórmula en «Ticker!I3».
La función LET() asigna nombres descriptivos para clarificar su cometido. Su utilización parte de guardar las variables para no tener que volver a repetir funciones, en caso de modificar la fórmula meses después es práctico comprobar la estructura de la fórmula.
Asignación «getRangeDatasHistory» obtiene el historial de datos históricos. Según ticket en la celda A1 y vinculada en la hoja «TickerHistory!A:F»
Asignación «getDay» intervalo de días a mostrar los datos históricos. según días en la celda A2.
Asignación «getLengthSma» periodos a calcular la media móvil simple. según criterio en celda I2
Asignación «getCountShowResults» número de periodos que se muestran mediante QUERY(): Aggregation Function count(). La condición QUERY(): Clause where muestra los días mediante el cálculo de la fecha actual TODAY() restando los días asignados y convirtiendo el patrón de fecha para el lenguaje consulta con la función TEXT(). La QUERY(): Clause label elimina la etiqueta.
Asignación «getDatasHistoryOperate» obtenemos los valores a operar seleccionando la columna «Close» con un índice Col5 en QUERY(): Clause select, en orden descendente mediante QUERY(): Clause order by y limitado los resultados a calcular con QUERY(): Clause limit.
Asignación «getSma» obtenemos la media móvil simple. La función MAP() crea una matriz de números consecutivos usando SEQUENCE() limitando las operaciones solamente de los datos mostrados más un periodo para la última posición. LAMBDA() asignación «getOffsetNext» recorre la matriz de números consecutivos convertidos en valores (SMA). Creamos otra asignación de nombres interna empleado LET(). Asignación «getDataNext» logramos el periodo de precio cierre limitado el periodo QUERY(): Clause limit de la longitud según criterio en Ticker!I2 y QUERY(): Clause offset logrando el desfase de cada periodo anterior. Finalmente la QUERY(): Aggregation Function avg() calcula la media y eliminamos la etiqueta que se genera automáticamente con QUERY(): Clause label.
Asignación «getShowResults» obtiene los resultados a mostrar creando matriz en horizontal HSTACK(), limitando los los resultados QUERY(): Clause limit, creando encabezados con símbolos unicode QUERY(): Clause label y danto formato numérico de dos decimales QUERY(): Clause format..
Finalmente la función HSTACK() muestra los resultados de la asignación de nombre «getShowResults» en una matriz con la condición, si matriz no es cuadrada rellena para convertirla.
Ⓕ Propuesta Índice de fuerza relativa (RSI) :
Insertar fórmula en Ticker!J3:
=LET(getRangeDatasHistory;TickerHistory!$A:$F; getDays;$A$2; getLengthRsi;$J$2;
getCountShowResults;QUERY(getRangeDatasHistory;"select count(Col1) where Col1 >= date '"&TEXT(TODAY()-getDays;"yyyy-mm-dd")&"' label count(Col1) ''");
getDatasHistoryOperate;QUERY(getRangeDatasHistory;"select Col5 order by Col1 desc limit "&getCountShowResults+getLengthRsi;1);
getPriceClose;getDatasHistoryOperate;
getPriceClosePrevious;QUERY(getDatasHistoryOperate;"offset 1";1);
getVar;QUERY(HSTACK(getPriceClose;getPriceClosePrevious);"select (Col1-Col2) label (Col1-Col2) ''");
getRsi;MAP(SEQUENCE(getCountShowResults+getLengthRsi;1;0;1);LAMBDA(getOffsetNext;LET(
getVarOperate;QUERY(getVar;"limit "&getLengthRsi&" offset "&getOffsetNext&" label Col1 ''");
getVarPositiveAvg;QUERY(getVarOperate;"select avg(Col1) where Col1 > 0 label avg(Col1) ''");
getVarNegativeAvg;ABS(QUERY(getVarOperate;"select avg(Col1) where Col1 < 0 label avg(Col1) ''"));
100-100/(1+(getVarPositiveAvg/getVarNegativeAvg)))));
getShowResults;QUERY(getRsi;"limit "&getCountShowResults&" label Col1 '💪Rsi: "&getLengthRsi&"' format Col1 '#,##0.00;#,##0.00;0.00'";1);
HSTACK(getShowResults))
Ⓕ Propuesta detalle:
Inserta la fórmula en «Ticker!J3».
La función LET() asigna nombres descriptivos para clarificar su cometido. Su utilización parte de guardar las variables para no tener que volver a repetir funciones, en caso de modificar la fórmula meses después es práctico comprobar la estructura de la fórmula.
Asignación «getRangeDatasHistory» obtiene el historial de datos históricos. Según ticket en la celda A1 y vinculada en la hoja «TickerHistory!A:F»
Asignación «getDay» intervalo de días a mostrar los datos históricos. según días en la celda A2.
Asignación «getLengthRsi» períodos a calcular el índice de fuerza relativa. según criterio en celda J2.
Asignación «getCountShowResults» número de periodos que se muestran mediante QUERY(): Aggregation Function count(). La condición QUERY(): Clause where muestra los días mediante el cálculo de la fecha actual TODAY() restando los días asignados y convirtiendo el patrón de fecha para el lenguaje consulta con la función TEXT(). La QUERY(): Clause label elimina la etiqueta.
Asignación «getDatasHistoryOperate» obtenemos los valores a operar seleccionando la columna «Close» con un índice Col5 en QUERY(): Clause select, en orden descendente mediante QUERY(): Clause order by y limitado los resultados a calcular con QUERY(): Clause limit.
Asignación «getPriceClose» asignamos «getDatasHistoryOperate», son los precios del cierre
Asignación «getPriceClosePrevious» obtenemos los precios del cierre con un desfase de un periodo mediación de QUERY(): Clause offset.
Asignación «getVar» resultado de restar las asignaciones anteriores por QUERY(): Clause select. Creando primero una matriz alineando precio y precio desfase con HSTACK().
Asignación «getRsi» obtenemos el índice de fuerza relativa. La función MAP() crea una matriz de números consecutivos usando SEQUENCE() limitando las operaciones solamente de los datos mostrados más un periodo para la última posición. LAMBDA() asignación «getOffsetNext» recorre la matriz de números consecutivos convertidos en valores (SMA). Creamos otra asignación de nombres interna empleado LET(). Asignación «getVarOperate» logramos cada periodo de precio cierre limitado el periodo QUERY(): Clause limit de la longitud según criterio en Ticker!I2 y QUERY(): Clause offset logrando el desfase de cada periodo anterior. Asignación «getVarPositiveAvg» calculamos la media QUERY(): Aggregation Function avg() con la condición de ser número positivo QUERY(): Clause where mayor de cero y eliminamos la etiqueta generada con QUERY(): Clause label. Asignación «getVarPositiveAvg» calculamos la media QUERY(): Aggregation Function avg() con la condición de ser número negativo QUERY(): Clause where menor de cero y eliminamos la etiqueta generada con QUERY(): Clause label. y convertimos en valor absoluto ABS(). Por último damos valor a «getRsi» en una matriz con la media ponderada para crear la relatividad y sumandole uno dividido entre cien y restar cien para dar el índice del uno a cien.
Asignación «getShowResults» obtiene los resultados a mostrar creando matriz en horizontal HSTACK(), limitando los los resultados QUERY(): Clause limit, creando encabezados con símbolos unicode QUERY(): Clause label y danto formato numérico de dos decimales
Finalmente la función HSTACK() muestra los resultados de la asignación de nombre «getShowResults» en una matriz con la condición, si matriz no es cuadrada rellena para convertirla.
Ⓖ Propuesta resistencias (S/R) :
Ticker!K3:
=LET(getRangeDatasHistory;TickerHistory!$A:$F; getDays;$A$2; getLengthResistance;$K$2;
getCountShowResults;QUERY(getRangeDatasHistory;"select count(Col1) where Col1 >= date '"&TEXT(TODAY()-getDays;"yyyy-mm-dd")&"' label count(Col1) ''");
getLimitOperate;getDays*getLengthResistance;
getDatasHistoryOperate;QUERY(getRangeDatasHistory;"select Col3 order by Col1 desc limit "&getLimitOperate&" label Col3 ''";1);
getResistance;MAP(SEQUENCE(getCountShowResults+1;1;0;getLengthResistance);LAMBDA(getOffsetNext;LET(
getDataNext;QUERY(getDatasHistoryOperate;"limit "&getOffsetNext);
HSTACK(QUERY(getDataNext;"select max(Col1) label max(Col1) ''");getOffsetNext))));
getShowResults;QUERY(getResistance;" limit "&getCountShowResults&" label Col1 '⏫Resistencia', Col2 '🕗Periodo' format Col1 '#,##0.00', Col2 '(#,##0)'";1);
HSTACK(getShowResults)
Ⓖ Propuesta detalle:
Inserta la fórmula en «Ticker!K3».
La función LET() asigna nombres descriptivos para clarificar su cometido. Su utilización parte de guardar las variables para no tener que volver a repetir funciones, en caso de modificar la fórmula meses después es práctico comprobar la estructura de la fórmula.
Asignación «getRangeDatasHistory» obtiene el historial de datos históricos. Según ticket en la celda A1 y vinculada en la hoja «TickerHistory!A:F»
Asignación «getDay» intervalo de días a mostrar los datos históricos. según días en la celda A2.
Asignación «getLengthResistance» períodos a calcular las resistencias (precio máximos según periodo celda K2.
Asignación «getCountShowResults» número de periodos que se muestran mediante QUERY(): Aggregation Function count(). La condición QUERY(): Clause where muestra los días mediante el cálculo de la fecha actual TODAY() restando los días asignados y convirtiendo el patrón de fecha para el lenguaje consulta con la función TEXT(). La QUERY(): Clause label elimina la etiqueta.
Asignación «getDatasHistoryOperate» obtenemos los valores a operar seleccionando la columna «High» con un índice Col3 en QUERY(): Clause select, en orden descendente mediante QUERY(): Clause order by índice Col1 pertenece a la columna «Date» y limitado los resultados a calcular con QUERY(): Clause limit.
Asignación «getResistances» obtenemos las resistencias. La función MAP() crea una matriz de números consecutivos con un incremento de «getLengthResistance» usando SEQUENCE() limitando las operaciones solamente de los datos mostrados más un periodo para la última posición. LAMBDA() asignación «getOffsetNext» recorre la matriz de números consecutivos con su incremento y convertirlos en en valores máximos. Creamos otra asignación de nombres interna empleado LET(). Asignación «getDataNext» obtenemos la cotización en el periodo con QUERY(): Clause limit que irá incrementado periodo + periodo ect. Finalmente creamos la matriz en horizontal HSTACK() el cual obtenemos el valor máximo QUERY(): Aggregation Function max(). Eliminamos la etiqueta generada QUERY(): Clause label e incluimos al periodo que pertenece «getOffsetNext».
Asignación «getShowResults» obtiene los resultados a mostrar, limitando los los resultados QUERY(): Clause limit, creando encabezados con símbolos unicode QUERY(): Clause label y danto formato numérico de dos decimales a la resistencia y sin decimales entre paréntesis a los periodos.
Finalmente la función HSTACK() muestra los resultados de la asignación de nombre «getShowResults» en una matriz con la condición, si matriz no es cuadrada rellena para convertirla.
Ⓗ Propuesta soportes (S/R):
Ticker!M 3:
=LET(getRangeDatasHistory;TickerHistory!$A:$F; getDays;$A$2; getLengthResistance;$K$2;
getCountShowResults;QUERY(getRangeDatasHistory;"select count(Col1) where Col1 >= date '"&TEXT(TODAY()-getDays;"yyyy-mm-dd")&"' label count(Col1) ''");
getLimitOperate;getDays*getLengthResistance;
getDatasHistoryOperate;QUERY(getRangeDatasHistory;"select Col3 order by Col1 desc limit "&getLimitOperate&" label Col3 ''";1);
getResistance;MAP(SEQUENCE(getCountShowResults+1;1;0;getLengthResistance);LAMBDA(getOffsetNext;LET(
getDataNext;QUERY(getDatasHistoryOperate;"limit "&getOffsetNext);
HSTACK(QUERY(getDataNext;"select max(Col1) label max(Col1) ''");getOffsetNext))));
getShowResults;QUERY(getResistance;" limit "&getCountShowResults&" label Col1 '⏫Resistencia', Col2 '🕗Periodo' format Col1 '#,##0.00', Col2 '(#,##0)'";1);
HSTACK(getShowResults))
Ⓗ Propuesta Detalle:
Inserta la fórmula en «Ticker!M3».
La función LET() asigna nombres descriptivos para clarificar su cometido. Su utilización parte de guardar las variables para no tener que volver a repetir funciones, en caso de modificar la fórmula meses después es práctico comprobar la estructura de la fórmula.
Asignación «getRangeDatasHistory» obtiene el historial de datos históricos. Según ticket en la celda A1 y vinculada en la hoja «TickerHistory!A:F»
Asignación «getDay» intervalo de días a mostrar los datos históricos. según días en la celda A2.
Asignación «getLengthSupport» períodos a calcular los soportes (precio mínimo según periodo celda M2.
Asignación «getCountShowResults» número de periodos que se muestran mediante QUERY(): Aggregation Function count(). La condición QUERY(): Clause where muestra los días mediante el cálculo de la fecha actual TODAY() restando los días asignados y convirtiendo el patrón de fecha para el lenguaje consulta con la función TEXT(). La QUERY(): Clause label elimina la etiqueta.
Asignación «getDatasHistoryOperate» obtenemos los valores a operar seleccionando la columna «Lower» con un índice Col4 en QUERY(): Clause select, en orden descendente mediante QUERY(): Clause order by índice Col1 pertenece a la columna «Date» y limitado los resultados a calcular con QUERY(): Clause limit.
Asignación «getSupports» obtenemos las resistencias. La función MAP() crea una matriz de números consecutivos con un incremento de «getLengthSupport» usando SEQUENCE() limitando las operaciones solamente de los datos mostrados más un periodo para la última posición. LAMBDA() asignación «getOffsetNext» recorre la matriz de números consecutivos con su incremento y convertirlos en en valores máximos. Creamos otra asignación de nombres interna empleado LET(). Asignación «getDataNext» obtenemos la cotización en el periodo con QUERY(): Clause limit que irá incrementado periodo + periodo ect. Finalmente creamos la matriz en horizontal HSTACK() el cual obtenemos el valor máximo QUERY(): Aggregation Function min(). Eliminamos la etiqueta generada QUERY(): Clause label e incluimos al periodo que pertenece «getOffsetNext».
Asignación «getShowResults» obtiene los resultados a mostrar, limitando los los resultados QUERY(): Clause limit, creando encabezados con símbolos unicode QUERY(): Clause label y danto formato numérico de dos decimales a los soportes y sin decimales entre paréntesis a los periodos.
Finalmente la función HSTACK() muestra los resultados de la asignación de nombre «getShowResults» en una matriz con la condición, si matriz no es cuadrada rellena para convertirla.
Ⓘ Propuesta media del precio apertura en resultados mostrados:
Fórmula enTicker!B2
=LET(getRangePriceOpen;B4:B;
getAveragePriceOpen;QUERY(getRangePriceOpen;"select avg(Col1) label avg(Col1) '' format avg(Col1) '🔄#,##0.00'");
getAveragePriceOpen)
Ⓘ Propuesta Detalle:
🖮 Insertar fórmula en hoja y celda: Ticker!B2
La función LET() asigna nombres descriptivos (variables) para clarificar su cometido y meses después al cambiar la fórmula su estructura detallada facilita su modificación. Asignación «getRangePriceOpen» obtenemos el rango donde está el precio de apertura. Asignación.
Asignación «getAveragePriceOpen» obtenemos la media de los resultados mostrados mediante QUERY(): Aggregation Function avg() , QUERY(): Clause label elimina la etiqueta generada automáticamente y QUERY(): Clause format establecemos formato numérico utilizando un patrón con símbolo unicode.
Finalmente repetimos la asignación «getAveragePriceOpen» logrando mostrar el resultado.
Ⓙ Propuesta precio máximo en resultados mostrados:
Formula en Ticker!C2
=LET(getRangePriceHigh;C4:C;
getMaxPriceHigh;QUERY(getRangePriceHigh;"select max(Col1) label max(Col1) '' format max(Col1) '⤴️#,##0.00'");
getMaxPriceHigh)
Ⓙ Propuesta detalle:
🖮 Insertar fórmula en hoja y celda: Ticker!C2
La función LET() asigna nombres descriptivos (variables) para clarificar su cometido y meses después al cambiar la fórmula su estructura detallada facilita su modificación. Asignación «getRangePriceHigh» obtenemos el rango donde están los precios máximos.
Asignación «getMaxPriceHigh» obtenemos el precio máximo de los resultados mostrados mediante QUERY(): Aggregation Function max() , QUERY(): Clause label elimina la etiqueta generada automáticamente y QUERY(): Clause format establecemos formato numérico utilizando un patrón con símbolo Unicode.
Finalmente repetimos la asignación «getRangePriceHigh» logrando mostrar el resultado.
Ⓚ Propuesta precio mínimo en resultados mostrados:
Formula en Ticker!D2
=LET(getRangePriceLower;D4:D;
getMinPriceLower;QUERY(getRangePriceLower;"select min(Col1) label min(Col1) '' format min(Col1) '⤵️#,##0.00'");
getMinPriceLower)
Ⓚ Propuesta Detalle:
🖮 Insertar fórmula en hoja y celda: Ticker!D2
La función LET() asigna nombres descriptivos (variables) para clarificar su cometido y meses después al cambiar la fórmula su estructura detallada facilita su modificación. Asignación «getRangePriceLower» obtenemos el rango donde están los precios mínimos.
Asignación «getMinPriceLower» obtenemos el precio mínimo de los resultados mostrados mediante QUERY(): Aggregation Function min(), QUERY(): Clause label elimina la etiqueta generada automáticamente y QUERY(): Clause format establecemos formato numérico utilizando un patrón con símbolo Unicode.
Finalmente repetimos la asignación «getMinPriceLower» logrando mostrar el resultado.
Ⓛ Propuesta promedio precio cierre en los resultados:
Formula en Ticker!E2:
=LET(getRangePriceClose;$E$4:$E;
getAveragePriceClose;QUERY(getRangePriceClose;"select avg(Col1) label avg(Col1) '' format avg(Col1) '🔄#,##0.00'");
getAveragePriceClose)
Ⓛ Propuesta detalle:
🖮 Insertar fórmula en hoja y celda: Ticker!E2
La función LET() asigna nombres descriptivos (variables) para clarificar su cometido y meses después al cambiar la fórmula su estructura detallada facilita su modificación.
Asignación «getRangePriceClose» obtenemos el rango donde está el precio de cierre.
Asignación «getAveragePriceClose» obtenemos la media de los resultados mostrados mediante QUERY(): Aggregation Function avg() , QUERY(): Clause label elimina la etiqueta generada automáticamente y QUERY(): Clause format establecemos formato numérico utilizando un patrón con símbolo Unicode.
Finalmente repetimos la asignación «getAveragePriceClose» logrando mostrar el resultado.
Ⓜ Propuesta promedio volumen en los resultados mostrados:
Formula en Ticker!F2
=LET(getRangeVolume;$F$4:$F;
getAverageVolume;QUERY(getRangeVolume;"select avg(Col1) label avg(Col1) '' format avg(Col1) '[>=1000000000000]🔄#,##0.00,,,,"&CHAR(34)&"B"&CHAR(34)&";[>=1000000]🔄#,##0.00,,"&CHAR(34)&"M"&CHAR(34)&";🔄#,##0.00,"&CHAR(34)&"K"&CHAR(34)&"'";1);
getAverageVolume)
Ⓜ Propuesta detalle:
🖮 Insertar fórmula en hoja y celda: Ticker!F2
La función LET() asigna nombres descriptivos (variables) para clarificar su cometido y meses después al cambiar la fórmula su estructura detallada facilita su modificación.
Asignación «getRangeVolume» obtenemos el rango donde está el volumen.
Asignación «getAverageVolume» obtenemos la media de los resultados mostrados mediante QUERY(): Aggregation Function avg() , QUERY(): Clause label elimina la etiqueta generada automáticamente y QUERY(): Clause format establecemos formato numérico utilizando un patrón con símbolo unicode y B de billón, M de millón y K de mil.Este formato necesita comillas dobles. Para no tener conflicto con las comillas dobles que se utilizan en el parámetro QUERY(): Referencia del lenguaje de consulta. Concatenar la función CHAR() con el código 34 de comillas dobles.
Finalmente repetimos la asignación «getAverageVolume» logrando mostrar el resultado.
Ⓝ Propuesta variación del precio de cierre. Respecto primer resultado y último resultado.
Formula en Ticker!G2:
=LET(getRangePriceClose;$E4:$E;
getFirstPriceClose;INDEX(getRangePriceClose;1;1);
getLastPriceClose;INDEX(getRangePriceClose;COUNT(getRangePriceClose);1);
getVarPriceClose;QUERY(MINUS(getFirstPriceClose;getLastPriceClose);"format Col1 '[blue]∆ +#,##0.00;[red]∆ -#,##0.00;∆ 0.00'");
getVarPercent;QUERY(1-(getLastPriceClose/getFirstPriceClose);"format Col1 '[blue]∆ +#,##0.00%;[red]∆ -#,##0.00%;∆ 0.00%'");
HSTACK(getVarPriceClose;getVarPercent))
Ⓝ Propuesta Detalle:
🖮 Insertar fórmula en hoja y celda: Ticker!G2
La función LET() asigna nombres descriptivos (variables) para clarificar su cometido y meses después al cambiar la fórmula su estructura detallada facilita su modificación.
Asignación «getRangePriceClose» obtenemos el rango donde están los precios de cierre.
Asignación «getFirstPriceClose» obtenemos el primer precio de los resultados mostrados mediante INDEX() donde logramos el contenido de la primera fila.
Asignación «getLastPriceClose» obtenemos el último precio de los resultados mostrados utilizando INDEX() para conseguir el último precio de la fila por mediación de COUNT(), el cual cuenta el número de valores numéricos.
Asignación «getVarPriceClose» resta las asignaciones con MINUS() equivalente al operador «-» y QUERY(): Clause format establecemos formato numérico utilizando un patrón con símbolo Unicode.
Asignación «getVarPercent» obtiene la variación en porcentaje y QUERY(): Clause format establecemos formato numérico de porcentaje utilizando un patrón con símbolo unicode.
Finalmente mostramos los resultados de «getVarPriceClose» y «getVarPercent» en una matriz horizontal empleando HSTACK().
Ⓞ Propuesta enlace cotización en Google Finance web.
Formula en Ticker!B1:
=LET(getTicker;$A$1;
getSymbolShare;CHOOSECOLS(SPLIT(getTicker;":");2);
getSymbolIndex;CHOOSECOLS(SPLIT(getTicker;":");1);
getLink;"https://www.google.com/finance/quote/";
getQuote;CONCATENATE(getSymbolShare;":";getSymbolIndex);
HYPERLINK(CONCAT(getLink;getQuote);"🌍Web"))
Ⓞ Propuesta Detalle:
🖮 Insertar fórmula en hoja y celda: Ticker!B1
La función LET() asigna nombres descriptivos (variables) para clarificar su cometido y meses después al cambiar la fórmula su estructura detallada facilita su modificación.
Asignación «getRangePriceClose» obtenemos el rango donde están los precios de cierre.
Asignación «getTicker» celda donde obtener el ticket.
Asignación «getSymbolShare» mediante un SPLIT() creamos una matriz en horizontal separado por los dos puntos y la función CHOOSECOLS() seleccionamos el segundo valor que es símbolo de cotización.
Asignación «getSymbolIndex» mediante un SPLIT() creamos una matriz en horizontal separado por los dos puntos y la función CHOOSECOLS() seleccionamos el primer valor que es símbolo del índice bursátil.
Asignación «getLink» establecemos el enlace de página web de cotización.
Asignación «getQuote» concatenamos con CONCATENATE() primero la acción seguido de dos puntos y después el índice (en la web se invierte los valores para la búsqueda).
Finalmente creamos en enlace aprovechado la función HYPERLINK() y concatenando con CONCAT() la url de cotización con el ticker.
Ⓟ Propuesta mini gráfico de barras.
Formula en Ticker!C1:
=LET(getRangePriceClose;E4:E;
getSizeCellHorizontal;4;
getMinPriceClose;min(getRangePriceClose);
getMaxPriceClose;max(getRangePriceClose);
HSTACK("⤵️🔒"&getMinPriceClose;
SPARKLINE(getRangePriceClose;{"charttype"\"column";"color"\"blue";"lowcolor"\"red";"highcolor"\"green";"empty"\"ignore";"nan"\"ignore";"ymin"\getMinPriceClose;"ymax"\getMaxPriceClose;"rtl"\TRUE()});
WRAPROWS(;getSizeCellHorizontal;);
"⤴️🔒"&getMaxPriceClose))
Ⓟ Propuesta detalle:
🖮 Insertar fórmula en hoja y celda: Ticker!C1
La función LET() asigna nombres descriptivos (variables) para clarificar su cometido y meses después al cambiar la fórmula su estructura detallada facilita su modificación.
Asignación «getRangePriceClose» columna donde obtener el precio de cierre.
Asignación «getSizeCellHorizontal» establecer el número de celdas en horizontal que ocupará el gráfico el cual realizaremos una combinación de celdas en horizontal.
Asignación «getMinPriceClose» obtenemos el precio de cierre mínimo con MIN().
Asignación «getMaxPriceClose» obtenemos el precio de cierre máximo con MAX().
Finalmente se muestran los resultados mediante una matriz en horizontal HSTACK(). Esta se compone de símbolos Unicode con el precio mínimo de cierre. Mini gráfico de barras SPARKLINE() de los resultados mostrados al precio de cierre donde la columna color rojo es la mínima y color verde la máxima. Función WRAPROWS() crea matriz en horizontal con valores nulos para reservar espacio al gráfico y por último el precio máximo.
Ⓠ Propuesta Obtener compra ficticia:
Formula en Ticker!I2:
=LET(setPriceBuyTicker; 182,28;
setAmountShares; 100;
getPriceClose; $E$4;
getCurrency; CONCAT("💸 ";GOOGLEFINANCE($A$1;"currency"));
getAmountShares; QUERY(setAmountShares;"format Col1 '[$🛒Nº Acc:]#,##'");
getPriceBuyTicker; QUERY(setPriceBuyTicker;"format Col1 '[$Precio:]#,##0.00'");
getAmountCurrecy; QUERY(setAmountShares * setPriceBuyTicker;"format Col1 '🟰#,##0.00💰'");
getLostProfist; QUERY((getPriceClose * getAmountShares) - getAmountCurrecy;"format Col1 '[blue]⏫ +#,##0.00;[red]⏬ -#,##0.00;0.00'");
getPercentLostProfist; QUERY(((getAmountShares * getPriceClose) / getAmountCurrecy)-1;"format Col1 '[blue]⏫ +#,##0.00%;[red]⏬ -#,##0.00%;0.00%'");
HSTACK(getAmountShares; getPriceBuyTicker; getAmountCurrecy; getLostProfist; getPercentLostProfist; getCurrency))
Ⓠ Propuesta detalle:
🖮 Insertar fórmula en hoja y celda: Ticker!B2
La función LET() asigna nombres descriptivos (variables) para clarificar su cometido y meses después al cambiar la fórmula su estructura detallada facilita su modificación.
Asignación «setPriceBuyTicker» Establecemos el precio de compra ficticia.
Asignación «setAmountShares» Establecemos el número de acciones adquiridas.
Asignación «getPriceClose» Obtenemos el precio de la acción en tiempo real.
Asignación «getCurrency» Obtenemos el tipo de moneda de la acción. Concatenado mediante CONCAT(), Símbolo unicode y obteniendo la moneda con GOOGLEFINANCE()
Asignación «getAmountShares» Obtenemos el importe de la acción con formato QUERY(): Clause format incluyendo texto y número con dos decimales.
Asignación «getPriceBuyTicker» Obtenemos el precio de compra y con formato QUERY(): Clause format incluyendo texto y número con dos decimales.
Asignación «getAmountCurrecy» Obtenemos el importe total de compra mediante una multiplicación con formato QUERY(): Clause format incluyendo símbolos unicode y número con dos decimales.
Asignación «getLostProfist» Obtenemos mediante un cálculo las perdidas o ganancias con formato QUERY(): Clause format incluyendo símbolos unicode para positivos o negativos y número con dos decimales.
Asignación «getPercentLostProfist» Obtenemos mediante un cálculo las perdidas o ganancias porcentuales con formato QUERY(): Clause format incluyendo símbolos unicode para positivos o negativos y número con dos decimales.
Función HSTACK() Crea una matriz en horizontal para mostrar: el número de acciones, precio de compra, importe de compra, ganancias o pérdidas, ganancias o pérdidas porcentuales y tipo de moneda.
Resultados:
Demo Agradecimientos ScreenToGif :
Videos:
[Google SpreadSheet] Función GOOGLEFINANCE() nombre de la empresa
[Google SpreadSheet] Función GOOGLEFINANCE(): Modificar encabezados y formato en datos históricos. Ⅰ
[Google SpreadSheet] Función Datos históricos y variación del precio al cierre anterior II
[Google SpreadSheet] Función GOOGLEFINANCE(): Media móvil simple. Ⅲ
[Google SpreadSheet] Función GOOGLEFINANCE(): Índice fuerza relativa (RSI) Ⅳ
[Google SpreadSheet] Función GOOGLEFINANCE(): Soportes y resistencias (S/R) Ⅴ
[Google SpreadSheet] Función GOOGLEFINANCE(): Datos históricos y en tiempo de cotización anexados. Ⅵ
[Google SpreadSheet] Función GOOGLEFINANCE(): Máximo, mínimo, promedio, enlace y mini gráfico. Ⅶ
[Google SpreadSheet] Función GOOGLEFINANCE(): Compra ficticia y seguimiento. Ⅷ
Referencias:
GOOGLEFINANCE(): Obtiene información de valores actual o histórica de Google Finance.
SEQUENCE(): La función devuelve una matriz de números secuenciales, como 1, 2, 3, 4.
MINUS(): Devuelve la diferencia de dos números. Equivalente al operador `-`.
INDEX(): Devuelve el contenido de una celda, especificado por desplazamiento de fila y columna.
CONCAT(): Devuelve la concatenación de dos valores. Equivalente al operador `&`.
MIN(): Devuelve el valor mínimo en un conjunto de datos numéricos.
MAX(): Devuelve el valor máximo en un conjunto de datos numérico.
SEQUENCE(): La función devuelve una matriz de números secuenciales, como 1, 2, 3, 4.
CHAR(): Convierte un número en un carácter según la tabla Unicode actual.
IF(): Ofrece un valor si una expresión lógica es `VERDADERO` y otro si es `FALSO`
TEXT(): Convierte un número en texto según un formato específico
SPARKLINE(): Crea un gráfico en miniatura contenido dentro de una sola celda.