Desarrollo de un kit de herramientas para el análisis de la acción del precio (Parte 9): Flujo externo
Introducción
Los mercados financieros pueden ser complejos, lo que a menudo plantea retos a los operadores y analistas a la hora de procesar e interpretar los datos con precisión. Para superar estos retos, se han desarrollado diversas bibliotecas que simplifican el análisis de mercado, cada una de ellas diseñada para gestionar los datos de forma que se ajusten a objetivos específicos. Aunque las bibliotecas MQL5 se utilizan habitualmente para crear estrategias e indicadores de trading, las bibliotecas externas, como las herramientas de análisis de datos de Python, proporcionan recursos adicionales para realizar análisis más avanzados y profundos.
En artículos anteriores, me centré en la acción del precio y el análisis de datos, explorando principalmente la generación de señales a través de cálculos y métricas procesadas por los Asesores Expertos (Expert Advisor, EA) de MQL5. Sin embargo, estos artículos se limitaban al análisis basado en MQL5. Este artículo marca un cambio al introducir la integración de librerías externas diseñadas específicamente para el análisis avanzado de datos. Al aprovechar la librería Python, Pandas, podemos explorar nuevas vías para los operadores, proporcionando una gama más amplia de opciones analíticas para satisfacer diversas necesidades.
Este método no sustituye a MQL5, sino que lo posiciona como el núcleo de este sistema. Este EA MQL5 sirve como puente, permitiendo la interacción con librerías y servidores externos para construir un marco analítico más robusto y flexible. Me gustaría destacar que este artículo es solo el comienzo de la exploración del análisis avanzado, y espero poder presentar ideas y técnicas más completas en futuros debates.
Veamos cómo abordaremos esta tarea:
Descripción general de la estrategia
El objetivo principal de este sistema es generar una señal comercial utilizando la biblioteca Pandas de Python, aprovechando sus funciones de interpretación de datos. En esta sección, analizaremos más de cerca cómo el sistema ejecuta la lógica central. El intercambio general ocurre entre el Asesor Experto (EA) MQL5 y Python, y varios procesos ocurren en el medio antes de que la señal finalmente se muestre en el gráfico. Sigamos los pasos que se describen a continuación para comprender cómo funciona el sistema.
1. MQL5 a Python:
- El asesor experto MQL5 recopila los máximos, mínimos, aperturas, cierres y volúmenes del día anterior de 10 días.
- Envía datos al servidor Python.
- Formatee los datos en una cadena CSV y envíelos mediante una solicitud HTTP POST al servidor Python.
2. Python:
- Python recibe datos y procesa los datos recibidos utilizando bibliotecas como Pandas.
- Analice los datos para generar una señal comercial, un precio promedio y un volumen, luego cree una explicación.
3. De Python al EA:
- Python envía la señal generada, el precio promedio, el volumen y la explicación al EA MQL5 a través de una respuesta HTTP.
4. Asesor experto de MQL5:
- El EA MQL5 recibe y analiza la respuesta, extrae la señal, el precio promedio, el volumen promedio y una explicación de la respuesta.
- Si la señal es diferente, actualice el gráfico con la nueva señal y muéstrelo.
Para obtener más información, consulte el siguiente diagrama.

Figura 1. Diagrama de la lógica
Python
Python es un lenguaje de programación versátil reconocido por su simplicidad y amplia gama de aplicaciones. Se utiliza comúnmente para análisis de datos, aprendizaje automático, desarrollo web y automatización, entre otras tareas. En este sistema, Python es crucial para realizar análisis de datos avanzados, particularmente a través de bibliotecas como Pandas, que proporcionan herramientas eficientes para manipular y analizar datos. Python también crea un servidor para la interacción entre MQL5 y sus bibliotecas. Al utilizar Python para procesar conjuntos de datos complejos, el sistema genera señales comerciales basadas en datos históricos del mercado, que luego se pasan al Asesor Experto (EA) MQL5 para ayudar en la toma de decisiones comerciales en vivo.
Te guiaré a través del proceso de instalación de Python, creación de un script y ejecución paso a paso.
- Descargue el instalador de Python en el sitio web oficial de Python
- Ejecutar el instalador
Importante: Asegúrese de marcar la casilla que dice "Add Python to PATH" (Agregar Python a PATH) antes de hacer clic en Instalar. Esto hace que sea más fácil ejecutar Python desde la línea de comandos.
- Completar la instalación
El instalador comenzará el proceso de instalación. Espera a que termine. Una vez completada la instalación, haga clic en Cerrar.
- Verificar la instalación
Abra el símbolo del sistema (presione Windows + R, escriba cmd y presione Entrar). Escriba python --version y pulse Entrar. Si Python está instalado correctamente, debería aparecer la versión de Python (por ejemplo, Python 3.x.x).
Tras instalar correctamente Python, ahora considere instalar Flask y Pandas. Flask es un marco web ligero para Python que se utiliza para crear aplicaciones web. Está diseñado para ser sencillo, flexible y fácil de usar. Flask se utiliza para configurar un servidor web sencillo que permite la comunicación entre el Asesor Experto (EA) MQL5 y las herramientas de análisis de datos de Python. El EA envía datos a Flask (a través de solicitudes HTTP), que procesa los datos utilizando bibliotecas de Python, en este caso Pandas, y devuelve una señal de trading al EA.
Para instalar Flask y Pandas utilizando el símbolo del sistema, siga estos pasos:
Abrir el Símbolo del sistema
- Presione Windows + R, escriba cmd y presione Entrar.
Asegúrese de que pip (instalador de paquetes de Python) esté instalado.
- Primero, verifique si pip (el administrador de paquetes de Python) está instalado ejecutando:
pip --version- Si pip está instalado, verá el número de versión. Si no está instalado, puedes seguir los pasos a continuación para instalarlo. PIP (Python Package Installer) suele instalarse automáticamente con Python. Si PIP no está instalado, descargue get-pip.py y ejecútelo con el comando python get-pip.py.
Instalar Flask
- Para instalar Flask, ejecute el siguiente comando en el Símbolo del sistema:
pip install Flask
- Espere a que se complete la instalación. Flask se instalará y estará listo para usar.
Instalar Pandas
- Para instalar Pandas, ejecute este comando:
pip install pandas
- Del mismo modo, espere a que se complete la instalación.
Verificar la instalación
- Después de instalar ambos paquetes, puede verificar la instalación ejecutando estos comandos:
python -c "import flask; print(flask.__version__)" python -c "import pandas; print(pandas.__version__)"
- Esto debería imprimir las versiones instaladas de Flask y Pandas, confirmando que se han instalado correctamente.
Ahora puedes proceder a crear un script de Python. Personalmente, prefiero usar Notepad++ para esta tarea. Para crear el script, abra Notepad++, inicie un nuevo archivo y configure el idioma en Python seleccionándolo en el menú Idioma. Una vez que haya escrito su script, guárdelo en un directorio que sea fácil de localizar. Asegúrese de guardar el archivo con una extensión .py, que lo identifica como un script de Python.
Script de Python
import pandas as pd import flask from flask import request, jsonify app = flask.Flask(__name__) app.config["DEBUG"] = True @app.route('/analyze', methods=['POST']) def analyze_csv(): try: # Read CSV data from the POST request csv_data = request.data.decode('utf-8') # Write the CSV data to a file (optional, for debugging) with open('received_data.csv', 'w') as file: file.write(csv_data) # Load the CSV data into a DataFrame from io import StringIO data = StringIO(csv_data) df = pd.read_csv(data) # Ensure the CSV has the correct columns required_columns = ['date', 'prev_high', 'prev_low', 'prev_open', 'prev_close', 'prev_volume'] for column in required_columns: if column not in df.columns: return jsonify({"error": f"Missing column: {column}"}), 400 # Print the received metrics for debugging print("Received metrics:") print(df) # Perform analysis (Example: Calculate average price and volume) df['average_price'] = (df['prev_high'] + df['prev_low'] + df['prev_open'] + df['prev_close']) / 4 average_price = df['average_price'].mean() # Average of all the average prices average_volume = df['prev_volume'].mean() # Average volume # Print the computed averages print(f"Average Price: {average_price}") print(f"Average Volume: {average_volume}") # Create a trading signal based on a simple rule last_close = df['prev_close'].iloc[-1] if last_close > average_price: signal = "BUY" signal_explanation = f"The last close price ({last_close}) is higher than the average price ({average_price})." else: signal = "SELL" signal_explanation = f"The last close price ({last_close}) is lower than the average price ({average_price})." # Print the signal and explanation print(f"Generated Signal: {signal}") print(f"Signal Explanation: {signal_explanation}") # Return the signal as JSON return jsonify({ "signal": signal, "average_price": average_price, "average_volume": average_volume, "signal_explanation": signal_explanation }) except Exception as e: return jsonify({"error": str(e)}), 500 if __name__ == '__main__': app.run(host='189.7.6.8', port=5877)
Para ejecutar el script, abra el Símbolo del sistema en su computadora.
Ejecute el comando:
cd C:\Users\pathway to your python script folderSeguido de un comando:
python filename.py
Utilice el nombre exacto que asignó a su script al ejecutarlo. Una vez que se ejecuta el script, indicará que el puerto está escuchando activamente.
Running on http://189.7.6.8:5877Funciones principales
Initialization (OnInit)
Esta función se ejecuta cuando el EA se inicializa por primera vez en la plataforma MetaTrader. Se utiliza para configurar cualquier recurso o configuración que necesite el EA. En este caso, simplemente imprime un mensaje en el registro que indica que el EA está listo para comenzar a interactuar con el servidor Python.
int OnInit() { Print("Expert initialized. Ready to send data to Python."); return(INIT_SUCCEEDED); }
El valor de retorno INIT_SUCCEEDED significa que la inicialización se ha realizado correctamente.
Deinitialization (OnDeinit)
Esta función se activa cuando se elimina el EA o se cierra la plataforma MetaTrader. Generalmente se utiliza para operaciones de limpieza, como liberar recursos o cerrar archivos abiertos. Aquí, simplemente imprime un mensaje indicando que el EA ha sido desinicializado y ya no está activo.
void OnDeinit(const int reason) { Print("Expert deinitialized."); }
OnTick (Core Functionality)
Esta es la función principal del EA que se ejecuta cada vez que cambian las condiciones del mercado (en cada nuevo tick).
void OnTick() { // Check if enough time has passed since the last signal update if(TimeCurrent() - lastSignalTime < signalInterval) { return; // Skip if it's too soon to update } // Collect data and prepare CSV for Python string csvData = "date,prev_high,prev_low,prev_open,prev_close,prev_volume\n"; // Get the previous trend data for the last `trendDays` for(int i = 1; i <= 10; i++) // You can adjust the trendDays here { datetime prevDate = iTime(Symbol(), PERIOD_D1, i); double prevHigh = iHigh(Symbol(), PERIOD_D1, i); double prevLow = iLow(Symbol(), PERIOD_D1, i); double prevOpen = iOpen(Symbol(), PERIOD_D1, i); double prevClose = iClose(Symbol(), PERIOD_D1, i); long prevVolume = iVolume(Symbol(), PERIOD_D1, i); csvData += StringFormat("%s,%.5f,%.5f,%.5f,%.5f,%ld\n", TimeToString(prevDate, TIME_DATE | TIME_MINUTES), prevHigh, prevLow, prevOpen, prevClose, prevVolume); } // Save data to CSV file string fileName = StringFormat("%s_analytics.csv", Symbol()); int fileHandle = FileOpen(fileName, FILE_WRITE | FILE_CSV | FILE_ANSI); if(fileHandle != INVALID_HANDLE) { FileWriteString(fileHandle, csvData); FileClose(fileHandle); Print("CSV file created: ", fileName); } }
También ejecuta las siguientes operaciones:
- Comprobación del intervalo de señal: El EA comprueba primero si ha transcurrido suficiente tiempo desde la última actualización de la señal utilizando TimeCurrent(). Si no es así, se omite el procesamiento.
- Recopilación de datos: El EA recopila datos del mercado de los últimos 10 días (o más, si cambia el valor en el bucle), incluyendo: Máximo, mínimo, apertura, cierre y volumen del día anterior.
- Formato de datos: A continuación, formatea estos datos en formato CSV para facilitar su transmisión al servidor Python.
- Guardado de archivos CSV: Los datos se guardan en el disco como un archivo .csv con el nombre <símbolo>_analytics.csv. Si la creación y escritura del archivo se realizan correctamente, se muestra un mensaje de éxito.
Solicitud HTTP al servidor Python (WebRequest)
string headers = "Content-Type: application/json\r\n"; char result[]; string resultHeaders; int responseCode = WebRequest( "POST", // HTTP method pythonUrl, // URL headers, // Custom headers timeout, // Timeout in milliseconds data, // Data to send result, // Response content resultHeaders // Response headers ); if(responseCode == 200) { string response = CharArrayToString(result); Print("Received response: ", response); } else { Print("Error: HTTP request failed with code ", responseCode); }
Después de preparar los datos en formato CSV, el EA envía estos datos a un servidor Python a través de HTTP POST.
- Encabezados: El encabezado Content-Type se establece en application/json, lo que indica al servidor que los datos que se envían están en formato JSON.
- WebRequest: La función WebRequest se utiliza para enviar la solicitud HTTP POST al servidor Python. La función devuelve:
1) responseCode: El código de respuesta HTTP (por ejemplo, 200 para indicar éxito).
2) result: El contenido de la respuesta del servidor (que suele ser el resultado del análisis).
Figura 2. Diagrama de flujo de WebRequest
- Si la solicitud tiene éxito (responseCode == 200), el contenido de la respuesta se convierte de una matriz de caracteres a una cadena y se imprime un mensaje de éxito. Si la solicitud falla, se muestra un mensaje de error.
Análisis y visualización de la respuesta
if(responseCode == 200) { string signal = ""; string avgPrice = ""; string avgVolume = ""; string explanation = ""; // Extract signal, avgPrice, avgVolume, and explanation from the response int signalStart = StringFind(response, "\"signal\":"); int signalEnd = StringFind(response, "\"average_price\":"); int explanationStart = StringFind(response, "\"signal_explanation\":"); int avgPriceStart = StringFind(response, "\"average_price\":"); int avgVolumeStart = StringFind(response, "\"average_volume\":"); if(signalStart != -1 && signalEnd != -1) { signal = StringSubstr(response, signalStart + 10, signalEnd - signalStart - 12); } if(explanationStart != -1) { explanation = StringSubstr(response, explanationStart + 23, StringFind(response, "\"", explanationStart + 23) - (explanationStart + 23)); } if(avgPriceStart != -1) { avgPrice = StringSubstr(response, avgPriceStart + 16, StringFind(response, "\"", avgPriceStart + 16) - (avgPriceStart + 16)); } if(avgVolumeStart != -1) { avgVolume = StringSubstr(response, avgVolumeStart + 18, StringFind(response, "\"", avgVolumeStart + 18) - (avgVolumeStart + 18)); } // Update the chart if the signal has changed if(signal != lastSignal) { lastSignal = signal; lastSignalTime = TimeCurrent(); // Update last signal time string receivedSummary = "Signal: " + signal + "\n" + "Avg Price: " + avgPrice + "\n" + "Avg Volume: " + avgVolume + "\n" + "Explanation: " + explanation; Print("Received metrics and signal: ", receivedSummary); Comment(receivedSummary); // Display it on the chart } }
Después de recibir la respuesta del servidor Python, el EA analiza la respuesta para extraer datos clave, tales como:
- Signal: La señal de negociación (por ejemplo, «comprar» o «vender»).
- Avg Price: El precio medio derivado del análisis.
- Avg Volume: El volumen medio de operaciones.
- Explanation: Una explicación de por qué se generó la señal.
La función utiliza StringFind y StringSubstr para extraer estos valores de la cadena de respuesta.
Si la señal ha cambiado desde la última actualización (signal != lastSignal), entonces:
1) Actualiza las variables lastSignal y lastSignalTime.
2) Muestra la nueva señal, el precio medio, el volumen y la explicación como comentario en el gráfico utilizando la función Comment().
Actualización y visualización de señales
Esta parte está integrada en el paso anterior, donde la señal se actualiza y se muestra en el gráfico.
if(signal != lastSignal) { lastSignal = signal; lastSignalTime = TimeCurrent(); // Update last signal time string receivedSummary = "Signal: " + signal + "\n" + "Avg Price: " + avgPrice + "\n" + "Avg Volume: " + avgVolume + "\n" + "Explanation: " + explanation; Print("Received metrics and signal: ", receivedSummary); Comment(receivedSummary); // Display it on the chart }
Si la señal ha cambiado (es decir, difiere de la anterior), del EA:
- Actualiza las variables lastSignal y lastSignalTime.
- Crea un resumen de cadena que contiene la señal, el precio medio, el volumen medio y la explicación.
- Muestra el resumen en el gráfico como un comentario y lo imprime en el registro.
CharArrayToString (Función de utilidad)
string CharArrayToString(char &arr[]) { string result = ""; for(int i = 0; i < ArraySize(arr); i++) { result += StringFormat("%c", arr[i]); } return(result); }
Esta función de utilidad se utiliza para convertir una matriz de caracteres (recibida de la respuesta HTTP) en una cadena. Recorre cada elemento de la matriz de caracteres y añade el carácter correspondiente a la cadena de resultado.
Cada uno de estos pasos está diseñado para manejar una parte específica del proceso: recopilar datos, enviarlos al servidor Python, recibir el análisis y actualizar el gráfico con la señal comercial. El enfoque garantiza que el EA pueda operar de forma autónoma, recopilar datos relevantes del mercado y tomar decisiones basadas en análisis impulsados por Python.
Resultados
El primer paso es confirmar que su script de Python se esté ejecutando y escuchando activamente en el servidor requerido. Para obtener instrucciones detalladas sobre cómo configurar y ejecutar el script, consulte la sección de Python anterior. Si está escuchando activamente, debería escribir:Running on http://189.7.6.8:5877Tenga en cuenta que la API y el host mencionados anteriormente no son los reales utilizados, sino que se generaron con fines educativos. A continuación, procedemos a iniciar el EA MQL5. Si la conexión entre MQL5 y el servidor Python se establece correctamente, verá mensajes de registro en la pestaña "Expertos" del gráfico. Además, el script de Python que se ejecuta en el símbolo del sistema mostrará las métricas recibidas.
El Símbolo del sistema mostrará lo siguiente:
189.7.6.8 - - [21/Jan/2025 10:53:44] "POST /analyze HTTP/1.1" 200 - Received metrics: date prev_high prev_low prev_open prev_close prev_volume 0 2025.01.20 00:00 868.761 811.734 826.389 863.078 83086.0 1 2025.01.19 00:00 856.104 763.531 785.527 826.394 82805.0 2 2025.01.18 00:00 807.400 752.820 795.523 785.531 82942.0 3 2025.01.17 00:00 886.055 790.732 868.390 795.546 83004.0 4 2025.01.16 00:00 941.334 864.202 932.870 868.393 83326.0 5 2025.01.15 00:00 943.354 870.546 890.620 932.876 83447.0 6 2025.01.14 00:00 902.248 848.496 875.473 890.622 83164.0 7 2025.01.13 00:00 941.634 838.520 932.868 875.473 82516.0 8 2025.01.12 00:00 951.350 868.223 896.455 932.883 83377.0 9 2025.01.11 00:00 920.043 857.814 879.103 896.466 83287.0 10 NaN NaN NaN NaN NaN NaN
Pandas utilizará la información anterior para el análisis y la generación de señales. Los datos del décimo día muestran 'NaN' porque el día aún no ha cerrado, lo que significa que el análisis se basa principalmente en valores obtenidos de días anteriores. Sin embargo, también incorpora los niveles de precios actuales del décimo día, que están incompletos. A continuación, puede encontrar los resultados de registro y análisis que muestra pandas en el Símbolo del sistema (CMD).
Average Price: 865.884525 Average Volume: 83095.4 Generated Signal: SELL Signal Explanation: The last close price (nan) is lower than the average price (865.884525).
MetaTrader 5 mostrará lo siguiente:
Comencemos comprobando el registro en la pestaña “Expertos”. Consulte a continuación para ver los resultados obtenidos.
2025.01.21 10:50:28.106 External Flow (Boom 300 Index,D1) CSV file created: Boom 300 Index_analytics.csv 2025.01.21 10:50:28.161 External Flow (Boom 300 Index,D1) Received response: { 2025.01.21 10:50:28.161 External Flow (Boom 300 Index,D1) "average_price": 865.884525, 2025.01.21 10:50:28.161 External Flow (Boom 300 Index,D1) "average_volume": 83095.4, 2025.01.21 10:50:28.161 External Flow (Boom 300 Index,D1) "signal": "SELL", 2025.01.21 10:50:28.161 External Flow (Boom 300 Index,D1) "signal_explanation": "The last close price (nan) is lower than the average price (865.884525)."
El resultado también se mostrará en el gráfico y el proceso se repetirá según la configuración de tiempo de espera especificada en los parámetros de entrada.
Figura 3. Resultado mostrado
A continuación se muestra un diagrama de una operación rentable que realicé en función de la señal generada y un análisis adicional. El comercio se muestra en el marco de tiempo M1 (1 minuto) para una mejor claridad.

Figura 4. Operación realizada
Conclusión
Tras describir los pasos para implementar análisis avanzados utilizando bibliotecas externas como pandas para este proyecto, creo que hemos sentado unas bases sólidas para desarrollar herramientas más avanzadas para el análisis de la evolución de los precios y del mercado. Animo a todos los traders a considerar esto como una guía general para comprender los movimientos anticipados del mercado. Sin embargo, para una ejecución comercial óptima, incorpore otras estrategias con las que esté familiarizado. Sus comentarios y sugerencias son muy bienvenidos a medida que continuamos trabajando para crear herramientas más profesionales para análisis de mercado avanzados.
| Fecha | Nombre de la herramienta | Descripción | Versión | Actualizaciones | Notas |
|---|---|---|---|---|---|
| 01/10/24 | Chart Projector | Script para superponer la acción del precio del día anterior con efecto fantasma. | 1.0 | Lanzamiento inicial | Primera herramienta en Lynnchris Tool Chest |
| 18/11/24 | Analytical Comment | Proporciona información del día anterior en formato tabular y anticipa la dirección futura del mercado. | 1.0 | Lanzamiento inicial | Segunda herramienta en Lynnchris Tool Chest |
| 27/11/24 | Analytics Master | Actualización periódica de las métricas del mercado cada dos horas. | 1.01 | Segundo lanzamiento | Tercera herramienta en Lynnchris Tool Chest |
| 02/12/24 | Analytics Forecaster | Actualización periódica de las métricas del mercado cada dos horas con integración de Telegram. | 1.1 | Tercera edición | Herramienta número 4 |
| 09/12/24 | Volatility Navigator | El EA analiza las condiciones del mercado utilizando los indicadores Bandas de Bollinger, RSI y ATR. | 1.0 | Lanzamiento inicial | Herramienta número 5 |
| 19/12/24 | Mean Reversion Signal Reaper | Analiza el mercado utilizando la estrategia de reversión a la media y proporciona señales. | 1.0 | Lanzamiento inicial | Herramienta número 6 |
| 09/01/25 | Signal Pulse | Analizador de múltiples marcos temporales. | 1.0 | Lanzamiento inicial | Herramienta número 7 |
| 17/01/25 | Metrics Board | Panel con botón para análisis. | 1.0 | Lanzamiento inicial | Herramienta número 8 |
| 21/01/25 | External Flow | Análisis a través de bibliotecas externas. | 1.0 | Lanzamiento inicial | Herramienta número 9 |
Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/articles/16967
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.
Simulación de mercado (Parte 08): Sockets (II)
Simulación de mercado (Parte 07): Sockets (I)
Redes neuronales en el trading: Modelos bidimensionales del espacio de enlaces (Final)
Redes neuronales en el trading: Modelos bidimensionales del espacio de enlaces (Quimera)
- 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
