MetaTrader se une a Google Sheets con Pythonanywhere: guía para un flujo de datos seguro
Introducción
Acceder a los datos de operaciones y analizarlos es muy importante para los traders de MetaTrader, ya que les permite evitar errores y tomar mejores decisiones en el futuro. Existen herramientas y funciones integradas para exportar datos, pero no permiten exportarlos a servicios en la nube. La exportación automática de gráficos, historiales y datos de registro a servicios en la nube puede constituir un recurso importante para el proceso de toma de decisiones de los traders.
Existen diferentes formas y herramientas para transferir datos desde MetaTrader a soluciones en la nube, como Google Sheets; algunas son gratuitas, pero menos seguras, y otras son seguras, pero no son gratuitas o tienen un acceso limitado. Encontrar una forma adecuada de realizar exportaciones a la nube que resulte más económica puede suponer un quebradero de cabeza para los traders que buscan sacar partido del análisis de los datos de sus operaciones en futuras operaciones.
Los traders suelen perder el registro de operaciones importantes y otra información útil, ya que MetaTrader carece de un sistema de copias de seguridad automáticas en servicios en la nube. A los traders les cuesta sacar partido de las herramientas de visualización y análisis de datos que están fácilmente disponibles en la nube. El objetivo de este artículo es mostrar cómo se puede automatizar la transferencia de datos de MetaTrader a Google Sheets sin costes adicionales y con un alto nivel de seguridad, así como aprovechar soluciones fácilmente accesibles para realizar operaciones rentables en el futuro.
Este artículo está pensado para ayudar a aquellos traders y desarrolladores que buscan formas de transferir sus datos a soluciones en la nube o a servicios de almacenamiento. En este artículo voy a explicar cómo podemos utilizar herramientas seguras y disponibles de forma gratuita, como las claves de cuenta de servicio de Google y un servidor proxy alojado en una plataforma en la nube segura, gratuita y basada en la web llamada PythonAnywhere.
¿Por qué usar Google Sheets y una clave de cuenta de servicio?
Google Sheets es la solución más valiosa, ya que está basada en la nube y se puede acceder a los datos guardados en ella en cualquier momento y desde cualquier lugar. De este modo, los traders pueden acceder a los datos de operaciones y a otros datos relacionados exportados a una hoja de cálculo de Google, y realizar análisis adicionales para futuras operaciones en cualquier momento y desde cualquier lugar en el que se encuentren. Podemos utilizar las herramientas de análisis de datos de Google Sheets e incluso integrarlas con otras herramientas como Google Data Studio o TradingView. Además, otros traders y personas de apoyo pueden colaborar en las hojas de cálculo para aportar sus análisis y puntos de vista. He publicado una aplicación utilidad Info Exporter MT5 en MQL5 Market, que se puede descargar y utilizar de forma gratuita y que utiliza la herramienta Apps Script de Google para transferir datos desde MetaTrader a una hoja de cálculo de Google.
Aunque Apps Script es gratuito y fácil de usar, no es lo bastante seguro, ya que la URL publicada queda accesible públicamente; esto permite que cualquier persona que disponga de dicha URL pueda leer y escribir en el script para acceder a los datos de las hojas de cálculo. Existen muchos otros enfoques, como la federación de identidades de cargas de trabajo y la API de Google Sheets, que son complejos de usar, no son gratuitos o solo son gratuitos de forma limitada.
La clave de cuenta de servicio es más segura, gratuita y requiere menos conocimientos para configurarla.
Puede consultar el vídeo «Acceder a Google Sheets mediante una clave de cuenta de servicio en un servidor proxy» para obtener más detalles sobre cómo configurar la clave de cuenta de servicio de Google y utilizarla en su aplicación.
¿Por qué utilizar un servidor proxy en pythonanywhere.com?
MetaTrader no cuenta con integración directa con Google Sheets ni con sus API. Por lo tanto, un servidor proxy es la mejor opción para transferir datos a Google Sheets. El uso de una solución basada en la nube como PythonAnywhere nos ofrece disponibilidad, escalabilidad, seguridad y fiabilidad. Disponibilidad, porque sigue accesible incluso cuando nuestras máquinas están desconectadas. Escalabilidad, en el sentido de que cualquiera que tenga el enlace puede usarlo, siempre que proporcione un ID de hoja de cálculo válido. Seguridad, ya que está bien probado y gestionado por ingenieros cualificados. Fiabilidad, ya que siempre podemos confiar en sus servicios (incluso en la versión gratuita).
PythonAnywhere.com ofrece a los usuarios un plan gratuito razonable para crear un servidor proxy sencillo destinado a este tipo de aplicaciones. La URL del servidor proxy de la versión gratuita tiene una vigencia de tres meses, pero puede prorrogarse indefinidamente siempre que se renueve antes de que caduque cada período de tres meses.

Al tratarse de un servicio gratuito, obtenemos una URL accesible que se utiliza como servicio de API en el servidor proxy; este se emplea para acceder a Google Sheets y realizar otras tareas necesarias, como leer datos de las hojas, mostrar páginas estáticas con información y muchas otras funciones. Tenemos acceso a consolas para ejecutar comandos de terminal, lo cual se utiliza principalmente para instalar las bibliotecas necesarias y realizar otras tareas relacionadas con archivos y redes, como editar archivos de errores, etc.
También tenemos acceso a una base de datos MySQL que se utilizará con nuestro servicio de API para almacenar información o usarla como caché. También disponemos de funciones para programar tareas, con las que podemos crear tareas cron que se repitan a la hora del día especificada, de modo que no tengamos que ejecutarlas manualmente. Tenemos acceso a herramientas para crear, editar y eliminar archivos, a una interfaz web para consultar los archivos de registro de errores, para proteger el sitio, para crear entornos virtuales (virtualenvs) y a muchas otras herramientas.
He intentado incluir toda la información necesaria para crear, editar y alojar un servidor proxy en un vídeo sobre pythonanywhere.com, en el que creo un servidor proxy idéntico al que se utiliza en este artículo.
Diagrama de flujo de datos
El concepto de flujo de datos en este proceso de transferencia es bastante sencillo de entender. MetaTrader actúa como fuente de datos: allí se encuentran los datos necesarios para realizar un análisis minucioso que permita tomar decisiones de trading rentables, y desde allí se transfieren a un servidor proxy alojado en la plataforma en la nube pythonanywhere.com. El servidor proxy escribe los datos recibidos en la hoja de cálculo de Google autorizada, utilizando los paquetes de autenticación de Google y las credenciales creadas a partir de la clave de cuenta de servicio de Google. Este proceso queda más claro en el siguiente diagrama.

Este es uno de los métodos gratuitos y seguros para transferir datos de MetaTrader a Hojas de cálculo de Google. Solo se accede a las hojas autorizadas desde un servidor proxy, ya sea alojado localmente o en una plataforma en la nube probada y segura como PythonAnywhere.
Proceso para crear una clave de cuenta de servicio
La consola de Google Cloud cuenta con numerosas funciones avanzadas que son gratuitas y muy útiles. Google Service Accounts es una de esas funciones. La opción «Cuentas de servicio» se encuentra en la sección «IAM y administración», tal y como se muestra a continuación:

Antes de gestionar las cuentas de servicio, asegúrese de crear un proyecto o de seleccionar uno de los proyectos existentes. La página de cuentas de servicio tiene el aspecto que se muestra a continuación, donde el botón «Crear cuenta de servicio» se encuentra en la fila superior.

Complete los campos necesarios en la sección «Crear cuenta de servicio»; se creará un correo electrónico de cuenta de servicio que se utilizará en el paso de compartir la hoja de cálculo que se describe a continuación. El campo «ID de clave» estará vacío; para crearlo, debe ir a la página de detalles de la cuenta de servicio creada, que se muestra a continuación:

El botón «Añadir clave» le dará la opción de crear una clave y descargar las credenciales en formato JSON o P12. Elija el formato JSON y el archivo se descargará automáticamente; este se utiliza en el servidor proxy para la autenticación.
El siguiente paso es habilitar la API de Hojas de cálculo de Google para el proyecto; se encuentra en «APIs y servicios», como se muestra a continuación, donde debemos localizar la API de Hojas de cálculo de Google y habilitarla.


He enlazado un vídeo detallado sobre este proceso en la sección anterior «Por qué usar Hojas de cálculo de Google y una clave de cuenta de servicio».
Programa del servidor proxy
Si ha visto los vídeos que compartí en la sección anterior, «Por qué usar un servidor proxy en pythonanywhere.com», debería comprender mejor el código que voy a explicar a continuación. Vamos a escribir una aplicación sencilla con Flask que actualizará la hoja de cálculo de Google utilizando las funciones del paquete «google-auth» y las credenciales de la clave de cuenta de servicio.
En primer lugar, vamos a importar las funciones de biblioteca necesarias en nuestro programa.
from flask import Flask, request, jsonify from google.oauth2 import service_account from googleapiclient.discovery import build
Las bibliotecas anteriores deben instalarse mediante pip si no están presentes en su sistema o en su entorno virtual. También las he explicado en mis vídeos.
A continuación, debemos instanciar el framework Flask para poder crear endpoints de API (GET, POST, PUT, DELETE), routers y muchas otras cosas más adelante en nuestros programas. La siguiente línea hace precisamente eso.
app = Flask(__name__)
El siguiente paso consiste en indicar la ubicación del archivo JSON de credenciales que se descargó al crear la clave de la cuenta de servicio. También podemos definir el alcance para que se limite únicamente a los elementos especificados, es decir, las hojas. A continuación, utilizando las credenciales y el alcance, se crea un objeto de credenciales que se utilizará al iniciar el cliente de la API de Google.
SERVICE_ACCOUNT_FILE = 'service_account.json' SCOPES = ['https://www.googleapis.com/auth/spreadsheets'] credentials = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_FILE, scopes=SCOPES )
El siguiente paso es definir una API POST llamada «update-sheet».
@app.route('/update-sheet', methods=['POST'])
def update_sheet(): Normalmente utilizamos una API POST para enviar datos al servidor. Además, también enviamos encabezados que incluyen información sobre los datos para que el servidor pueda extraerlos fácilmente.
data = request.json sheet_id = data['sheet_id'] data_range = data['range'] values = data['values']
En el código anterior, «request» es un objeto de Flask que contiene la información enviada por el cliente en su solicitud POST, que también incluye datos JSON. El código anterior extrae el identificador de la hoja de cálculo, el rango de la hoja y los valores que se van a escribir en la hoja de cálculo.
A continuación, vamos a inicializar el paquete del cliente de la API de Google pasando el objeto de credenciales creado anteriormente.
service = build('sheets', 'v4', credentials=credentials)
Este objeto de servicio se utiliza para actualizar la hoja de cálculo identificada por el «sheet_id» extraído anteriormente.
result = service.spreadsheets().values().update(spreadsheetId=sheet_id, range=data_range, valueInputOption='RAW', body={'values': values}).execute()
El código anterior indica al servicio del cliente de la API de Google que ejecute la actualización de la hoja de cálculo con los valores proporcionados en el rango indicado. Se adjunta el código completo con la API de «append» para que pueda profundizar en el tema; en él encontrará la API de «append» adicional y el código para comprobar el nombre de la hoja y, si no existe, crearla. Si lo prefiere, puede añadir más endpoints de API, como «delete» y otros.
Programa MetaTrader
El programa mq5 en sí incluye la exportación de información del terminal, información de la cuenta, historial de operaciones e historial de órdenes, así como una sección de configuración en la que los usuarios pueden seleccionar qué información desean transferir. Voy a explicar únicamente el código correspondiente a la información de la cuenta. A continuación se muestra la función en la que utilizamos el archivo de cabecera AccountInfo.mqh para extraer los datos de la cuenta y darles formato en un array de cadenas, con el fin de utilizarlos en la función StringToCharArray y crear así un array de caracteres, tal y como requiere la función de red WebRequest.
#include <Trade\AccountInfo.mqh> string GetAccountInfo() { CAccountInfo accountInfo; string account_info = "[\"symbol\", \"name\", \"currency\", \"company\", \"balance\", \"credit\", " + "\"profit\", \"equity\", \"margin\", \"login\", \"trade_mode\", \"leverage\", \"limit_orders\", \"margin_mode\"]"; StringAdd(account_info, StringFormat( ", [\"%s\", \"%s\", \"%s\", \"%s\", \"%f\", \"%f\", \"%f\", \"%f\", \"%f\", \"%d\", \"%d\", \"%d\", \"%d\", \"%d\"]", Symbol(), accountInfo.Name(), accountInfo.Currency(), accountInfo.Company(), accountInfo.Balance(), accountInfo.Credit(), accountInfo.Profit(), accountInfo.Equity(), accountInfo.Margin(), accountInfo.Login(), accountInfo.TradeMode(), accountInfo.Leverage(), accountInfo.LimitOrders(), accountInfo.MarginMode() )); return account_info; }
La función indicada anteriormente prepara únicamente los datos relativos a la información de la cuenta. El código completo adjunto en el archivo ProxyExport.mq5 contiene tres funciones más para preparar datos de información del terminal, historial de operaciones e historial de órdenes. Tras preparar los datos, los enviamos a la siguiente función `WriteToGoogleSheet`, donde se realizan manipulaciones adicionales de cadenas y se invoca a `SheetExporter`.
void WriteToGoogleSheet(string terminalInfos, string historicalDeals, string historicalOrders, string accountInfos) { if(terminalInfos != NULL) { StringReplace(terminalInfos, "\\", "/"); SheetExporter(terminalInfoName, terminalInfos); } if(historicalDeals != NULL) { SheetExporter(historyDealsName, historicalDeals); } if(historicalOrders != NULL) { SheetExporter(historyOrdersName, historicalOrders); } if(accountInfos != NULL) { SheetExporter(accountInfoName, accountInfos); } } void SheetExporter(string sheetName, string data) { string headers = "Content-Type: application/json\r\n"; char postData[], result[]; string responseHeaders; string jsonDataWithSheetName = StringFormat("{\"spreadSheetId\": \"%s\", \"sheetName\": \"%s\", \"data\": [%s]}", spreadSheetId, sheetName, data); // Convert to char array StringToCharArray(jsonDataWithSheetName, postData, 0, StringLen(jsonDataWithSheetName), CP_UTF8); // Send POST request int res = WebRequest("POST", proxyServerUrl, headers, 5000, postData, result, responseHeaders); // Check response if(res != 200) { Alert("Account Infos not exported to Google Sheets returned error ", res, " and get last error is ", GetLastError()); } }
La función `SheetExporter` añade `spreadSheetId` y `sheetName`, además de los datos, a la cadena JSON que se enviará al servidor proxy. Hay que tener en cuenta que debemos introducir la URL del servidor proxy en la sección «Permitir WebRequest para las URL indicadas:», que se encuentra en el menú Herramientas → Opciones. Debe pegar la misma URL del servidor proxy en el siguiente campo de entrada.

Demostración del flujo de datos
Siga el proceso que he explicado en la sección «Proceso para crear la clave de cuenta de servicio» anterior para crear su clave de cuenta de servicio y descargue el archivo JSON necesario para autorizar al servidor proxy a acceder a la hoja de cálculo a la que desea exportar los datos de MetaTrader. A continuación, puede alojar su propio servidor proxy o utilizar pythonanywhere.com, o cualquier otra plataforma con la que se sienta cómodo, para ejecutar el código `service_accounts_proxy.py` y tener alojada la API de actualización. Recuerde que puede modificar el código según sus necesidades.
El último paso consistiría en compilar el código `ProxyExport.mq5` y ejecutar el archivo `.ex5` en su gráfico. Dispondrá de opciones para elegir qué datos exportar y de campos para introducir su API y el ID de la hoja de cálculo; sin ellos, la exportación no funcionará.
He intentado mostrar todo lo necesario para crear las credenciales de la clave de cuenta de servicio, habilitar Hojas de cálculo de Google para la cuenta de servicio y compartir la hoja de cálculo de Google con la dirección de correo electrónico de la cuenta de servicio.

He intentado recopilar en el siguiente GIF todos los pasos necesarios que hay que seguir en pythonanywhere.com.

También he intentado recopilar todos los pasos que hay que realizar en MetaEditor y MetaTrader para que la exportación funcione. Además, he grabado en el siguiente GIF la transferencia automática de la información de MetaTrader a una hoja de cálculo de Google en tiempo real.

Análisis de trading con Hojas de cálculo de Google
He exportado los siguientes datos históricos de operaciones a una hoja de cálculo de Google. Solo he incluido 9 filas.

El valor en pips se calcula como (precio de salida - precio de entrada) * multiplicador, donde el multiplicador es 100 para los pares con JPY y 10 000 en los demás casos; el valor del beneficio se calcula como pips * tamaño del lote * 10, y el beneficio acumulado se calcula como (beneficio acumulado anterior + beneficio actual).
El nombre de la hoja anterior es «History_Deals», según la forma en que lo he codificado. Puede adaptarlo a sus necesidades. A continuación, podemos crear otra hoja, llamarla «métricas» e introducir las etiquetas y fórmulas que se muestran a continuación.
| Etiquetas | Fórmulas |
|---|---|
| Total de operaciones | =COUNTA(History_Deals!A2:A) |
| Operaciones ganadoras | =COUNTIF(History_Deals!K2:K,">0") |
| Operaciones perdedoras | =COUNTIF(History_Deals!K2:K,"<0") |
| Tasa de acierto (%) | =FIXED(B2/A2 * 100, 2) |
| Tasa de pérdidas (%) | =FIXED(C2/A2 * 100, 2) |
| Ganancia media | =FIXED(AVERAGEIF(History_Deals!K2:K,">0"), 2) |
| Pérdida media | =FIXED(AVERAGEIF(History_Deals!K2:K,"<0"), 2) |
| Relación riesgo-recompensa | =FIXED(F2/ABS(G2), 2) |
| Expectativa | =FIXED((D2/100*F2)-(E2/100*G2), 2) |
| Beneficio total | =SUM(History_Deals!K2:K) |
| Factor de beneficio | =SUMIF(History_Deals!K2:K,">0")/ABS(SUMIF(History_Deals!K2:K,"<0")) |
| Drawdown máximo | =MIN(History_Deals!L2:L)-MAX(FILTER(History_Deals!L2:L,History_Deals!L2:L<MIN(History_Deals!L2:L))) |
Permítame explicar brevemente las métricas utilizadas en la tabla anterior.
- «Total de operaciones» es el número total de operaciones realizadas con éxito. Un mayor total de operaciones se traduce en estadísticas fiables y precisas.
- «Operaciones ganadoras» es el número de operaciones que cerraron con beneficio. Este número indica cuántas decisiones acertadas ha tomado.
- «Operaciones perdedoras» es el número de operaciones que cerraron con pérdidas. Esta cifra indica cuántas decisiones erróneas ha tomado.
- «Tasa de acierto %» es el porcentaje de operaciones rentables, y «Tasa de pérdidas %» es el porcentaje de operaciones que cerraron con pérdidas. Es importante tener en cuenta que una tasa de acierto más alta no siempre significa ser rentable. Los traders pueden obtener beneficios con una relación riesgo-recompensa adecuada, incluso con una tasa de acierto del 30 al 40 %.
- «Ganancia media» y «pérdida media» son las cifras que indican cuánto gana cuando acierta y cuánto pierde cuando se equivoca. Hemos diseñado una estrategia para que la pérdida media se mantenga siempre baja.
- «Relación riesgo-recompensa» es la relación entre la ganancia media y la pérdida media. El lema de los traders debería ser conseguir que este valor sea siempre superior a 1. La regla de oro es mantenerla entre 1,5:1 y 2:1.
- «Expectativa» es el beneficio medio por operación. Por ejemplo, si este valor es 20, entonces, por cada 100 operaciones, obtendrá 2000.
- «Beneficio total» es la suma de todos los beneficios y pérdidas.
- «Factor de beneficio» es la cifra que indica la rentabilidad global. Los traders deberían intentar siempre que este valor sea superior a 1,5.
- «Drawdown máximo» es la mayor caída del beneficio acumulado desde su pico. Los traders siempre deben intentar que sea lo más reducido posible.
Tras aplicar todas las fórmulas, obtenemos la siguiente tabla.
| Total de operaciones | Operaciones ganadoras | Operaciones perdedoras | Tasa de acierto % | Tasa de pérdidas % | Ganancia media | Pérdida media | Relación riesgo-recompensa | Expectativa | Beneficio total | Factor de beneficio | Drawdown máximo |
| 9 | 7 | 2 | 77,78 | 22,22 | 285,71 | -400,00 | 0,71 | 311,11 | 1200 | 2,5 | 200 |
Podemos conocer la solidez y la consistencia de nuestro trading representando el beneficio acumulado en un gráfico de líneas, como se muestra a continuación: para ello, vaya a Insertar → Gráfico → Gráfico de líneas y seleccione «beneficio acumulado» en el eje vertical y «fecha de cierre» en el eje horizontal.

También podemos comparar las operaciones ganadoras con las operaciones perdedoras en un gráfico circular, como se muestra a continuación

También podemos ver el rendimiento por par de divisas mediante el gráfico de columnas que se muestra a continuación.

En Hojas de cálculo de Google podemos hacer muchas cosas de este tipo.
Conclusión
Los traders pueden utilizar esta solución para transferir de forma sencilla y segura sus datos de MetaTrader a Hojas de cálculo de Google y beneficiarse de las herramientas de visualización de Hojas de cálculo de Google. Esta es una solución para exportar nuestros datos de MetaTrader a Hojas de cálculo de Google, con el fin de llevar un diario de trading o realizar análisis posteriores, utilizando soluciones disponibles de forma gratuita. En este artículo se ha mostrado cómo alojar su propio servidor proxy o desplegarlo en soluciones basadas en la nube como pythonanywhere.com. Las soluciones basadas en la nube siempre son seguras y escalables. Se ha intentado modularizar el programa de MetaTrader para ofrecer flexibilidad en la elección y facilitar incluso la incorporación de nuevas funciones, como el registro de datos del probador de estrategias para análisis posteriores, entre muchas otras.
En resumen, este artículo es una herramienta más que los traders y desarrolladores pueden utilizar para transferir sus datos de MetaTrader con el fin de analizarlos más a fondo y tomar mejores decisiones de trading.
He incluido el código fuente del servidor proxy y el script de MetaTrader.
| Nombre del archivo | Descripción |
|---|---|
| service_accounts_proxy.py | Esta es una aplicación Flask sencilla con una API para actualizar y añadir datos. |
| ProxyExport.mq5 | Se trata de una aplicación de MetaTrader que permite seleccionar los datos que se van a exportar. |
Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/articles/19175
Advertencia: todos los derechos de estos materiales pertenecen a MetaQuotes Ltd. Queda totalmente prohibido el copiado total o parcial.
Este artículo ha sido escrito por un usuario del sitio web y refleja su punto de vista personal. MetaQuotes Ltd. no se responsabiliza de la exactitud de la información ofrecida, ni de las posibles consecuencias del uso de las soluciones, estrategias o recomendaciones descritas.
Guía de aprendizaje automático para MetaTrader 5 (Parte 2): Etiquetado de datos financieros para modelos de aprendizaje automático
Creación de un sistema de trading (parte 3): Determinación de los niveles mínimos de riesgo para objetivos de beneficio realistas
Desarrollo de un kit de herramientas para el análisis de la acción del precio (Parte 38): VWAP con búfer de ticks y motor de desequilibrio de ventana corta
Evaluación de la calidad de la operativa con spreads en función de los factores de estacionalidad en el mercado Forex en el terminal MetaTrader 5
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
Echa un vistazo al nuevo artículo: «MetaTrader se une a Google Sheets con Pythonanywhere: una guía para un flujo de datos seguro».
Autor: Ramesh Maharjan
Si se pueden realizar las mismas funciones con MQL, ¿por qué utilizar Python?
¿Podemos utilizar bibliotecas de Google, como las que utilicé en el servidor de Python, en MQL? Si es posible, por favor, comparte el enlace que explique cómo se puede hacer en MQL. Te agradecería mucho que me enseñaras esta nueva forma de hacerlo.