English Русский 中文 Deutsch 日本語
preview
Desarrollo de un kit de herramientas para el análisis de la acción del precio (Parte 10): Flujo externo (II) VWAP

Desarrollo de un kit de herramientas para el análisis de la acción del precio (Parte 10): Flujo externo (II) VWAP

MetaTrader 5Sistemas comerciales |
275 4
Christian Benjamin
Christian Benjamin

Introducción

En nuestro artículo anterior, presentamos la integración de datos de mercado con bibliotecas externas, mostrando la capacidad de analizar los mercados a través de diversos sistemas automatizados. El sólido marco de trabajo de Python ofrece potentes herramientas para el análisis avanzado de datos, la modelización predictiva y la visualización, mientras que MQL5 se centra en la ejecución fluida de operaciones y las operaciones basadas en gráficos. Al combinar estas fortalezas, logramos un sistema flexible, eficiente y sofisticado para el análisis de mercado y la negociación.

Este artículo presenta una potente herramienta basada en el concepto de precio medio ponderado por volumen (VWAP) para proporcionar señales de trading precisas. El aprovechamiento de las bibliotecas avanzadas de Python para los cálculos mejora la precisión del análisis, lo que da como resultado señales VWAP altamente procesables. Comenzaremos explorando la estrategia, luego profundizaremos en la lógica central del código MQL5 y discutiremos los resultados. Por último, terminaremos con una conclusión. Echemos un vistazo al índice que aparece a continuación:


Entender la estrategia

El VWAP, o precio promedio ponderado por volumen, es una herramienta de análisis técnico que refleja la relación entre el precio de un activo y su volumen total de negociación. Proporciona a los operadores e inversores una idea del precio promedio al que se ha negociado una acción durante un período específico. El VWAP se utiliza a menudo como referencia por inversores más pasivos, como fondos de pensiones y fondos de inversión, que buscan evaluar la calidad de sus operaciones. También resulta valioso para los operadores que buscan determinar si un activo se compró o vendió a un precio óptimo.
Para calcular el VWAP, la fórmula es:

VWAP = ∑ (cantidad de activos negociados × precio de los activos) / volumen total negociado ese día

Fórmula VWAP

El VWAP se calcula normalmente utilizando las órdenes realizadas durante una sola jornada bursátil. Sin embargo, también se puede aplicar en múltiples períodos de tiempo para un análisis de mercado más amplio. En un gráfico, el VWAP aparece como una línea y sirve como punto de referencia dinámico. Cuando el precio está por encima del VWAP, el mercado generalmente se encuentra en una tendencia alcista. Por el contrario, cuando el precio está por debajo del VWAP, normalmente se considera que el mercado está en una tendencia bajista. En la siguiente imagen, he visualizado la estrategia VWAP resaltando los niveles clave donde el precio tiende a reaccionar en torno al VWAP. Estos niveles marcados muestran cómo el mercado suele interactuar con la línea VWAP.

Estrategia VWAP

Figura 1. Estrategia VWAP

Exploremos la lógica que hay detrás de este sistema. Primero, analizaremos la información presentada en el siguiente diagrama, seguido de una explicación detallada.

Lógica EA

Figura 2. Lógica del sistema

El Asesor Experto (EA) VWAP está diseñado para monitorear gráficos e interactuar sin problemas con Python para un análisis de mercado avanzado. Envía datos de mercado a Python y registra las señales de negociación recibidas en la pestaña Expertos de MetaTrader 5. La estrategia utiliza el precio promedio ponderado por volumen (VWAP) como indicador principal para proporcionar información precisa y práctica. A continuación se presenta un desglose detallado de la estrategia:

1. Recopilación de datos

El EA recopila datos históricos del mercado (precio y volumen) de las últimas 150 velas. Garantiza que los datos sean válidos (por ejemplo, que no haya valores faltantes o cero). Los datos se guardan como un archivo CSV para su trazabilidad y se envían a un servidor Python para su análisis.

2. Análisis de Python

El script de Python calcula el VWAP utilizando los datos recibidos y aprovecha bibliotecas avanzadas para un cálculo preciso. Dos bibliotecas se encargan de los cálculos y análisis principales: Pandas y NumPy. Pandas facilita la manipulación de datos, los promedios móviles y los cálculos acumulativos, mientras que NumPy gestiona operaciones numéricas, incluyendo lógica condicional y cálculos vectorizados. En conjunto, proporcionan un procesamiento eficiente y preciso para el análisis de datos de series temporales.

El análisis incluye:

  • Cálculo del VWAP: Determina el precio promedio ponderado por el volumen durante el período de tiempo seleccionado.
  • Generación de señales: Proporciona señales de negociación (por ejemplo, compra/venta) basadas en la relación entre el precio actual y los niveles VWAP.
  • Explicaciones: Cada señal incluye una explicación textual para aclarar por qué se generó.

3. Confirmación de señal

El EA introduce un mecanismo de confirmación:

Las señales solo se actualizan si aparecen de forma consistente durante varios intervalos (por ejemplo, 2 períodos de confirmación).

Esto reduce los falsos positivos y aumenta la fiabilidad de la señal.

4. Salida y alertas

Las señales se muestran como:

  • Alertas: Notificaciones en tiempo real para una acción inmediata por parte del operador.
  • Mensajes de registro: Impresos en la terminal del EA para su revisión.

Las versiones futuras podrían incluir anotaciones gráficas en el gráfico para una mejor visualización.

Python 
MQL5 
Maneja grandes conjuntos de datos de manera eficiente. Monitorea el mercado y se integra con el gráfico en tiempo real.
Utiliza bibliotecas robustas para computación y modelado avanzados. Ofrece alertas y notificaciones inmediatas.
Garantiza una mayor precisión y flexibilidad en las estrategias basadas en VWAP.
El uso del VWAP en MQL5 ayuda a resaltar los niveles clave de soporte y resistencia del mercado. Esto permite a los operadores tomar decisiones basadas en la reacción del mercado al VWAP, que a menudo actúa como un punto de inflexión importante para los movimientos de precios.


Lógica central

1. EA MQL5 

Inicialización: Configuración del EA

Cuando se aplica por primera vez el Asesor Experto (EA) a un gráfico, se ejecuta la función OnInit() . Esta función se encarga de inicializar el EA, configurar los recursos necesarios y garantizar que todo esté listo para funcionar. Es donde solemos incluir tareas de configuración como imprimir mensajes, inicializar variables o establecer parámetros. En nuestro caso, simplemente imprimimos un mensaje que confirma que el EA se ha inicializado. Este paso también devuelve INIT_SUCCEEDED para indicar que la inicialización fue exitosa, lo cual es crucial para que el EA funcione correctamente.

int OnInit()
{
   Print("VWAP Expert initialized.");
   return(INIT_SUCCEEDED);
}

La inicialización es la primera etapa donde el EA establece sus bases. Es vital asegurarse de que todos los parámetros o recursos estén configurados correctamente. Un simple mensaje de confirmación te indica que el EA está listo para funcionar.

Desinicialización: Limpieza cuando el EA se detiene.

La desinicialización ocurre cuando el EA se elimina del gráfico o cuando se cierra MetaTrader. La función OnDeinit() se llama para limpiar cualquier recurso que se haya asignado o inicializado durante OnInit(). Aquí, simplemente imprime un mensaje que indica que el EA está siendo desinicializado. Esta es una buena práctica para garantizar que cualquier recurso o proceso que la EA pueda haber estado utilizando se cierre correctamente para evitar fugas de memoria o la ejecución de procesos innecesarios en segundo plano.

void OnDeinit(const int reason)
{
   Print("VWAP Expert deinitialized.");
}

Una desinicialización adecuada es crucial para mantener el rendimiento del sistema. Siempre libere los recursos cuando se elimine un EA para evitar dejar procesos colgados. Las funciones de desinicialización pueden incluir guardar datos, cerrar conexiones o detener temporizadores.

Recopilación de datos de mercado (velas)

La función principal de este EA consiste en recopilar datos de mercado (velas) para su análisis. Este proceso comienza dentro de la función OnTick(), que se ejecuta cada vez que se actualiza el precio de mercado. El EA está configurado para recopilar datos a intervalos establecidos, cada uno de los cuales se define mediante signalIntervalMinutes. Una vez que ha transcurrido suficiente tiempo desde la última señal, el EA comienza a recopilar los datos del mercado (apertura, máximo, mínimo, cierre, volumen) para el último número de velas numCandles.

A continuación, los datos se formatean como una cadena CSV, lo cual es crucial porque se enviarán al servidor Python para su posterior procesamiento. El bucle itera hacia atrás desde la vela más reciente para garantizar que capturemos los datos de mercado más recientes, y los datos se formatean de manera estandarizada utilizando StringFormat().

int totalBars = iBars(Symbol(), Period());
if (totalBars < numCandles)
{
   Print("Error: Not enough candles on the chart to collect ", numCandles, " candles.");
   return;
}

for (int i = numCandles - 1; i >= 0; i--)
{
   datetime currentTime = iTime(Symbol(), Period(), i);
   if (currentTime == 0) continue;

   double high = iHigh(Symbol(), Period(), i);
   double low = iLow(Symbol(), Period(), i);
   double close = iClose(Symbol(), Period(), i);
   double open = iOpen(Symbol(), Period(), i);
   long volume = iVolume(Symbol(), Period(), i);

   if (high == 0 || low == 0 || close == 0 || volume == 0)
   {
      Print("Skipping invalid data at ", TimeToString(currentTime, TIME_DATE | TIME_MINUTES));
      continue;
   }

   csvData += StringFormat("%s,%.5f,%.5f,%.5f,%.5f,%ld\n",
                           TimeToString(currentTime, TIME_DATE | TIME_MINUTES),
                           high, low, open, close, volume);
}

iBars():

iBars() recupera el número total de barras (velas) disponibles en el gráfico para el símbolo y el período de tiempo actuales. El EA comprueba si hay al menos numCandles (número de velas) disponibles. Si no es así, imprime un mensaje de error y sale de la función, impidiendo que se sigan recopilando datos.

Bucle «for»:

El bucle «for» itera hacia atrás desde la barra más reciente (numCandles - 1) hasta la barra más antigua (0), recopilando el número requerido de velas.

iTime(), iHigh(), iLow(), iOpen(), iClose(), iVolume():

Estas funciones obtienen los datos de precios relevantes para cada vela. iTime() obtiene la marca de tiempo, iHigh() obtiene el precio máximo, iLow() obtiene el precio mínimo, y así sucesivamente.

Validación de datos:

Antes de añadir datos a la cadena CSV, el EA comprueba si hay datos faltantes o no válidos (valores cero). Si los datos de alguna vela no son válidos, la iteración continúa y esa vela se omite.

Formato de cadena:

StringFormat() se utiliza para dar formato a los datos de velas en una fila CSV. Cada campo está separado por una coma, y la marca de tiempo se formatea en una cadena legible utilizando TimeToString().

Escribir datos en un archivo CSV

Una vez recopilados los datos, el siguiente paso es escribirlos en un archivo CSV. Esto es esencial porque queremos guardar los datos recopilados localmente antes de enviarlos al servidor Python. La función FileOpen() abre el archivo en modo de escritura, y FileWriteString() escribe los datos CSV formateados en él. Después de escribir los datos, el archivo se cierra para finalizar el proceso y garantizar que no se pierda ningún dato.

El archivo CSV se guarda en el directorio MQL5\\Files, un directorio especial de MetaTrader utilizado para almacenar archivos a los que la plataforma puede acceder. Esto garantiza que el archivo se pueda recuperar fácilmente si es necesario.

string fileName = StringFormat("%s_vwap_data.csv", Symbol());
string filePath = "MQL5\\Files\\" + fileName;
int fileHandle = FileOpen(filePath, FILE_WRITE | FILE_CSV | FILE_ANSI);
if (fileHandle != INVALID_HANDLE) {
    FileWriteString(fileHandle, csvData);
    FileClose(fileHandle);
} else {
    Print("Failed to open file for writing: ", filePath);
}

Escribir los datos en un archivo CSV es una forma de almacenar la información localmente para su análisis futuro. El uso de FILE_CSV garantiza que los datos se guarden en un formato estandarizado, lo que los hace compatibles con otros sistemas, como Python. El manejo de errores aquí garantiza que, si el archivo no se puede abrir, el EA maneje el problema con elegancia e imprima un mensaje de error.

Envío de datos al servidor Python para el análisis VWAP

Ahora, los datos recopilados están listos para enviarse a un servidor Python para su análisis. Esto se hace utilizando la función WebRequest(), que permite al EA realizar solicitudes HTTP. Los datos CSV se convierten en una matriz de caracteres (StringToCharArray()) y se envían al servidor mediante una solicitud POST. Los encabezados especifican que el contenido que se envía es CSV, y la respuesta del servidor se captura en una matriz de resultados.

El parámetro de tiempo de espera se establece en 5000 milisegundos (5 segundos), lo que garantiza que la solicitud no se quede bloqueada durante demasiado tiempo si el servidor no responde.

char data[];
StringToCharArray(csvData, data); 

string headers = "Content-Type: text/csv\r\n";
char result[];
string resultHeaders;
int timeout = 5000;

int responseCode = WebRequest("POST", pythonUrl, headers, timeout, data, result, resultHeaders);

Aquí se utiliza HTTP POST porque es la mejor forma de enviar datos a un servidor sin alterar la URL. WebRequest() gestiona la comunicación con el servidor Python, donde se realizan todas las tareas pesadas (es decir, los cálculos VWAP). El tiempo de espera garantiza que el EA no se cuelgue si el servidor no responde, lo que mantiene un funcionamiento fluido.

Gestión de la respuesta del servidor Python

Tras enviar los datos, debemos gestionar la respuesta del servidor Python. Aquí es donde ocurre la verdadera magia, ya que el servidor Python analiza los datos y proporciona una señal de negociación basada en el VWAP (Volume Weighted Average Price). La respuesta se devuelve en formato JSON, y utilizamos una función auxiliar, ExtractValueFromJSON(), para extraer los valores relevantes (VWAP y explicación) de la respuesta.

Si la respuesta es satisfactoria (código HTTP 200), analizamos la información necesaria y procedemos con la lógica de negociación. Si la respuesta contiene datos válidos, podemos proceder a generar una nueva señal.

// Check if the request was successful
if (responseCode == 200) {
    string response = CharArrayToString(result); // Convert the result array to a string
    Print("Server response: ", response);  // Print the server's response

    // Validate if the required data is present in the response
    if (StringFind(response, "\"vwap\":") == -1 || StringFind(response, "\"signal_explanation\":") == -1) {
        Print("Error: Invalid response from server. Response: ", response);
        return;
    }

    // Extract individual data points from the JSON response
    string vwap = ExtractValueFromJSON(response, "vwap");
    string explanation = ExtractValueFromJSON(response, "signal_explanation");
    string majorSupport = ExtractValueFromJSON(response, "major_support");
    string majorResistance = ExtractValueFromJSON(response, "major_resistance");
    string minorSupport = ExtractValueFromJSON(response, "minor_support");
    string minorResistance = ExtractValueFromJSON(response, "minor_resistance");

    // If valid data is received, update the signal
    if (vwap != "" && explanation != "") {
        string newSignal = "VWAP: " + vwap + "\nExplanation: " + explanation
                           + "\nMajor Support: " + majorSupport + "\nMajor Resistance: " + majorResistance
                           + "\nMinor Support: " + minorSupport + "\nMinor Resistance: " + minorResistance;

        // Confirm the signal and handle the response further
        if (newSignal != lastSignal) {
            signalConfirmationCount++; // Increment confirmation count
        }

        if (signalConfirmationCount >= confirmationInterval) {
            lastSignal = newSignal;  // Set the new signal
            signalConfirmationCount = 0;  // Reset the count
            Print("New VWAP signal: ", newSignal);
            Alert("New VWAP Signal Received:\n" + newSignal); // Alert user of the new signal
        }
    }
} else {
    Print("Error: WebRequest failed with code ", responseCode, ". Response headers: ", resultHeaders);
}

Manejar correctamente la respuesta es fundamental para interpretar el análisis del servidor. La función ExtractValueFromJSON() garantiza que solo recuperemos los datos que necesitamos (VWAP y explicación de la señal) de la respuesta JSON, que puede ser muy grande. Si la respuesta no es válida o no se encuentran los datos esperados, es importante gestionar los errores y evitar actuar basándose en señales incorrectas.

Confirmación de la señal y visualización de la señal de trading

El último paso consiste en confirmar la señal de trading. Después de recibir la señal del servidor Python, no actuamos inmediatamente. En su lugar, requerimos confirmación en múltiples intervalos (configurados por "confirmationInterval"). Esto garantiza que la señal sea consistente durante un período determinado, lo que ayuda a evitar reaccionar ante las fluctuaciones a corto plazo del mercado.

Una vez confirmada la señal, actualizamos la variable lastSignal y mostramos la señal al usuario mediante Alert(). Una vez confirmada la señal, actualizamos la variable lastSignal y mostramos la señal al usuario mediante Alert().

// Confirm the signal multiple times before updating
if (newSignal != lastSignal)
{
    signalConfirmationCount++;  // Increment the confirmation count
}

// Once the signal has been confirmed enough times
if (signalConfirmationCount >= confirmationInterval)
{
    // Update the last signal and reset confirmation count
    lastSignal = newSignal;
    signalConfirmationCount = 0;  // Reset the count after confirmation

    // Display the new signal in the log and via an alert
    Print("New VWAP signal: ", newSignal);  // Print to the log
    Alert("New VWAP Signal Received:\n" + newSignal);  // Display alert to the user
}

La confirmación de señales ayuda a evitar actuar basándose en señales fugaces o poco fiables. Al confirmar la señal varias veces, aumentamos la precisión y la fiabilidad de las decisiones comerciales. Las alertas proporcionan información inmediata al operador, lo que garantiza que esté al tanto de los cambios importantes.

2. Python

El flujo del script está diseñado para preprocesar datos, calcular el VWAP y las métricas relevantes, generar señales y devolver información significativa al EA para la toma de decisiones. Esto incluye determinar los niveles de soporte/resistencia principales y secundarios, junto con el VWAP y las explicaciones de las señales. Sigamos los pasos a continuación:

Preparación y preprocesamiento de datos

La primera parte del script garantiza que los datos entrantes estén limpios y listos para el análisis mediante la realización de varios pasos de preprocesamiento. Estos pasos garantizan que todas las columnas necesarias contengan datos válidos y gestionan casos excepcionales como valores faltantes o no válidos.

# Ensure critical columns have no missing values
df = df.dropna(subset=['volume', 'high', 'low', 'open', 'close'])

# Convert 'date' column to datetime
df.loc[:, 'date'] = pd.to_datetime(df['date'])

# Handle zero volume by replacing with NaN and dropping invalid rows
df.loc[:, 'volume'] = df['volume'].replace(0, np.nan)
df = df.dropna(subset=['volume'])

# Check if data exists after filtering
if df.empty:
    print("No data to calculate VWAP.")
    return pd.DataFrame()

El script garantiza que las columnas esenciales (volumen, máximo, mínimo, apertura, cierre) no contengan valores faltantes.dropna(). También gestiona los volúmenes cero sustituyéndolos por NaN y eliminando cualquier fila con volúmenes no válidos. La columna de fecha se convierte a un formato de fecha y hora para el análisis de series temporales.

Cálculo del VWAP y métricas adicionales

El script calcula el VWAP (Volume Weighted Average Price) y métricas adicionales como el precio típico, el precio medio, el volumen medio y los niveles de soporte/resistencia.

# Calculate VWAP and additional metrics
df.loc[:, 'typical_price'] = (df['high'] + df['low'] + df['close']) / 3
df.loc[:, 'vwap'] = (df['typical_price'] * df['volume']).cumsum() / df['volume'].cumsum()
df.loc[:, 'avg_price'] = df[['high', 'low', 'open', 'close']].mean(axis=1)
df.loc[:, 'avg_volume'] = df['volume'].rolling(window=2, min_periods=1).mean()
df.loc[:, 'major_support'] = df['low'].min()
df.loc[:, 'major_resistance'] = df['high'].max()
df.loc[:, 'minor_support'] = df['low'].rolling(window=3, min_periods=1).mean()
df.loc[:, 'minor_resistance'] = df['high'].rolling(window=3, min_periods=1).mean()

  • Cálculo del VWAP: El VWAP se calcula como la suma acumulada del precio típico ponderado por el volumen, dividida por el volumen acumulado.
  • Precio típico: El precio típico se calcula como el promedio entre el precio máximo, mínimo y de cierre de cada período.

Soporte y resistencia

  • Soporte principal: El valor más bajo de los precios bajos (durante todo el período).
  • Resistencia mayor: El valor más alto en los precios altos.
  • Resistencia/soporte menor: Medias móviles de los precios mínimos y máximos en un intervalo de tres períodos.

Generación y análisis de señales

Esta parte calcula la tendencia del mercado y genera señales de trading basadas en la posición del VWAP con respecto al precio de cierre. También proporciona explicaciones sobre estas señales.

# Calculate strength and generate signals
df.loc[:, 'strength'] = np.where(
    (df['high'] - df['low']) != 0,
    np.abs(df['close'] - df['open']) / (df['high'] - df['low']) * 100,
    0
)

# Generate Buy/Sell signals based on VWAP
df.loc[:, 'signal'] = np.where(
    df['close'] > df['vwap'], 'BUY',
    np.where(df['close'] < df['vwap'], 'SELL', 'NEUTRAL')
)

# Signal explanation
df.loc[:, 'signal_explanation'] = np.where(
    df['signal'] == 'BUY',
    'The price is trading above the VWAP, indicating bullish market tendencies.',
    np.where(
        df['signal'] == 'SELL',
        'The price is trading below the VWAP, indicating bearish market tendencies.',
        'The price is trading at the VWAP, indicating equilibrium in the market.'
    )
)

Cálculo de la fuerza: Calcula la fuerza del mercado utilizando la diferencia entre los precios de cierre y apertura en relación con el rango alto y bajo. Un valor más alto indica un movimiento más fuerte.

Generación de señales

  • COMPRAR: Cuando el precio de cierre es superior al VWAP.
  • VENDER: Cuando el precio de cierre es inferior al VWAP.
  • NEUTRAL: Cuando el precio de cierre es igual al VWAP.
  • Explicación de la señal: Basándose en la señal, se genera una explicación textual que indica las tendencias del mercado (alcista, bajista o neutral).

Respuesta final y resultado

Una vez realizados todos los cálculos, el script prepara el resultado final, que incluye el VWAP, la señal de trading, la explicación y los niveles clave de soporte/resistencia.

# Return data with major and minor support/resistance levels included
return df[['date', 'vwap', 'signal', 'signal_explanation', 'entry_point', 'major_support', 'major_resistance', 'minor_support', 'minor_resistance']].iloc[-1]

  • Resultado final: El script devuelve los datos más recientes (última fila), incluyendo el VWAP, la señal de trading, su explicación, el punto de entrada (que se establece en el VWAP) y los niveles de soporte/resistencia principales y secundarios. Los niveles de soporte/resistencia se calculan para ayudar a identificar mejor las tendencias del mercado. La respuesta enviada a EA incluye estos valores, lo que le permite visualizarlos o tomar medidas basadas en ellos.


Resultados

Proporcionaré respuestas desde ambos extremos: El lado MQL5 y el lado Python. Antes de hacerlo, permítanme enfatizar la importancia de asegurarse de que el script de Python se ejecute primero. Para obtener más información sobre cómo crear y ejecutar el script de Python, no te pierdas mi artículo anterior. Para garantizar una comunicación fluida entre MetaTrader 5 y el servidor, añade la dirección HTTP a la configuración de MetaTrader 5. Vaya a Herramientas > Opciones, active Permitir WebRequest e introduzca la dirección del servidor en el campo correspondiente. Consulte el GIF siguiente para obtener orientación.

WebRequest

Figura 3. Configuración de WebRequest

Echemos un vistazo a las respuestas tanto de Python como de MQL5.

  • Iniciar sesión en Python en el Símbolo del sistema

Received data: date,high,low,open,close,volume
2025.01.22 15:00,8372.10000,8365.60000,8368.90000,8367.80000,3600
2025.01.22 16:00,8369.00000,8356.60000,8367.90000,8356.80000,3600
2025.01.22 17:00,8359.00000,8347.800...
Calculating VWAP...
127.0.0.1 - - [28/Jan/2025 22:07:59] "POST /vwap HTTP/1.1" 200 -

El EA MQL5 envió correctamente los datos de las últimas 150 velas, incluyendo la fecha, el máximo, el mínimo, la apertura, el cierre y el volumen. Python recibió correctamente los datos, tal y como se muestra en el registro del símbolo del sistema anterior. Aunque no se muestra toda la información debido al volumen de datos, aún podemos observar los valores de varias velas.

  • Registro del Asesor Experto de MetaTrader 5
2025.01.28 22:07:59.452 VWAP (Step Index,H1)    VWAP Expert initialized.
2025.01.28 22:07:59.513 VWAP (Step Index,H1)    CSV file created: MQL5\Files\Step Index_vwap_data.csv
2025.01.28 22:07:59.777 VWAP (Step Index,H1)    Server response: {
2025.01.28 22:07:59.777 VWAP (Step Index,H1)      "entry_point": 8356.202504986322,
2025.01.28 22:07:59.777 VWAP (Step Index,H1)      "major_resistance": 8404.5,
2025.01.28 22:07:59.777 VWAP (Step Index,H1)      "major_support": 8305.0,
2025.01.28 22:07:59.777 VWAP (Step Index,H1)      "minor_resistance": 8348.0,
2025.01.28 22:07:59.777 VWAP (Step Index,H1)      "minor_support": 8341.699999999999,
2025.01.28 22:07:59.777 VWAP (Step Index,H1)      "signal": "SELL",
2025.01.28 22:07:59.777 VWAP (Step Index,H1)      "signal_explanation": "The price is trading below the VWAP, indicating bearish market tendencies.",
2025.01.28 22:07:59.777 VWAP (Step Index,H1)      "vwap": 8356.202504986322
2025.01.28 22:07:59.777 VWAP (Step Index,H1)    }

El EA MQL5 recibió correctamente la respuesta de Python y la registró en el registro de expertos de MetaTrader 5. Repasemos la respuesta del análisis y veamos cómo se alinea con el gráfico de MetaTrader 5.

RESULTADOS DEL SISTEMA

Figura 4. Visualización de señales

Analicemos cómo respondió el mercado después de que se activó la señal, como se ilustra en el siguiente diagrama.

Respuesta del mercado

Figura 5. Respuesta del mercado


Conclusión

Una vez configurado correctamente el sistema VWAP, es fundamental supervisar la dirección del mercado y utilizar los niveles VWAP para confirmarlo. El nivel VWAP es muy respetado por el mercado y suele actuar como zona clave de soporte o resistencia. Además, es fundamental seleccionar el marco temporal adecuado que se adapte a su estrategia de trading. Los marcos temporales más cortos, como M1-M15, capturan los movimientos intradía; M30 equilibra la precisión con una perspectiva más amplia; H1-H4 revelan las tendencias de varios días, y los gráficos diarios/semanales proporcionan información sobre la dinámica del mercado a largo plazo. Adaptar su enfoque al plazo adecuado garantiza una mejor alineación con sus objetivos comerciales.

Fecha Nombre de la herramienta  Descripción Versión  Actualizacion  Nota
01/10/24 Chart Projector Script para superponer la evolució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, además de anticipar 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 los indicadores del mercado cada dos horas con integración de Telegram. 1.1 Tercera edición Herramienta número 4
09/12/24 Volatility Navigator EA que analiza las condiciones del mercado utilizando los indicadores de 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 una señal.  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 mediante bibliotecas externas. 1.0  Lanzamiento inicial Herramienta número 9 
27/01/25 VWAP Precio medio ponderado por volumen (Volume Weighted Average Price).   1.3  Lanzamiento inicial  Herramienta número 10 

Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/articles/16984

Archivos adjuntos |
VWAP.py (3.89 KB)
VWAP.mq5 (6.99 KB)
Isuru Weerasinghe
Isuru Weerasinghe | 31 ene 2025 en 10:45
Usted mostró que este código funciona en backtesting pero me sale este error HTTP Code: -1 | Error: 4014 . según docs su "Función no está permitido para la llamada "

Christian Benjamin
Christian Benjamin | 31 ene 2025 en 10:51
Isuru Weerasinghe backtesting pero me sale este error HTTP Code: -1 | Error: 4014 . según docs su "Función no está permitido para la llamada "

Mis disculpas. Necesitas importar librerías de backtesting como Backtrader, BT, o VectorBT en el script de Python. Sin ellas, el backtesting no será posible.
Too Chee Ng
Too Chee Ng | 30 may 2025 en 15:19
Gracias por el artículo.
¿Podemos backtest(optimizar) el "WebRequest habilitado EA" en MetaTrader con agentes de la nube?
Too Chee Ng
Too Chee Ng | 30 may 2025 en 15:45
Too Chee Ng backtest(optimizar) el "WebRequest habilitado EA" en MetaTrader con agentes de la nube?

Según mis conclusiones:

- El uso de WebRequest() en Agentes Cloud (red remota MQL5.com) no está permitido

- A diferencia de los Agentes en la Nube de MetaTrader (que bloquean la comunicación externa), los agentes LAN están permitidos

Optimización con el juego del caos — Game Optimization (CGO) Optimización con el juego del caos — Game Optimization (CGO)
Hoy presentamos el nuevo algoritmo metaheurístico de Chaos Game Optimisation (CGO), que demuestra una capacidad única para mantener una alta eficiencia al trabajar con problemas de alta dimensionalidad. A diferencia de la mayoría de los algoritmos de optimización, el CGO no solo no pierde rendimiento, sino que a veces incluso lo aumenta cuando se escala el problema, lo cual supone su característica clave.
Redes neuronales en el trading: Modelos híbridos de secuencias de grafos (Final) Redes neuronales en el trading: Modelos híbridos de secuencias de grafos (Final)
Continuamos nuestro estudio de los modelos híbridos de secuencias de grafos (GSM++) que integran las ventajas de distintas arquitecturas, proporcionando una gran precisión de análisis y una asignación eficiente de los recursos computacionales. Estos modelos revelan eficazmente patrones ocultos, reduciendo el impacto del ruido del mercado y mejorando la calidad de las previsiones.
Desarrollo de asesores expertos autooptimizables en MQL5 (Parte 5): Reglas de negociación autoadaptativas Desarrollo de asesores expertos autooptimizables en MQL5 (Parte 5): Reglas de negociación autoadaptativas
Las mejores prácticas, que definen cómo utilizar un indicador de forma segura, no siempre son fáciles de seguir. Las condiciones de mercado tranquilas pueden producir, sorprendentemente, lecturas en el indicador que no califican como señal de negociación, lo que conlleva la pérdida de oportunidades para los operadores algorítmicos. Este artículo propondrá una posible solución a este problema, al analizar cómo construir aplicaciones de negociación capaces de adaptar sus reglas de negociación a los datos de mercado disponibles.
Redes generativas antagónicas (GAN) para datos sintéticos en modelos financieros (Parte 2): Creación de símbolos sintéticos para pruebas Redes generativas antagónicas (GAN) para datos sintéticos en modelos financieros (Parte 2): Creación de símbolos sintéticos para pruebas
En este artículo creamos un símbolo sintético utilizando una red generativa adversaria (Generative Adversarial Networks, GAN), lo que implica generar datos financieros realistas que imitan el comportamiento de instrumentos de mercado reales, como el EURUSD. El modelo GAN aprende patrones y volatilidad a partir de datos históricos del mercado y crea datos sintéticos de precios con características similares.