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

Desarrollo de un kit de herramientas para el análisis de la acción del precio (Parte 12): Flujo externo (III) TrendMap

MetaTrader 5Sistemas comerciales |
325 2
Christian Benjamin
Christian Benjamin

Introducción

Durante la volatilidad del mercado en 2020, en medio de la crisis de la COVID-19, los operadores recurrieron a diversas herramientas técnicas para ayudar a evaluar cuándo podría producirse una recuperación. Algunos incluso experimentaron con las zonas horarias de Fibonacci para identificar posibles puntos de inflexión basándose en el comportamiento histórico de los precios. Aunque la correlación entre las proyecciones de Fibonacci y los repuntes importantes sigue siendo objeto de debate, estas herramientas ofrecieron uno de los varios marcos para navegar en un entorno incierto, a medida que los gobiernos comenzaban a implementar medidas de estímulo y las economías se reabrían gradualmente.

En nuestra serie anterior Desarrollo de un kit de herramientas para el análisis de la acción del precio (Parte 10): Flujo externo (II) VWAP, examinamos una estrategia basada en el VWAP que se centraba en cómo los niveles del VWAP podían influir en las decisiones del mercado, indicando una compra cuando el precio estaba por encima del VWAP y una venta cuando estaba por debajo. Sin embargo, basarse únicamente en el VWAP puede ser problemático, especialmente durante períodos de condiciones de mercado extremas en los que pueden producirse reversiones.

En este artículo, llevamos nuestro análisis un paso más allá combinando el VWAP con los niveles de Fibonacci para generar señales de trading. Los niveles de retroceso de Fibonacci ayudan a identificar posibles áreas de soporte y resistencia, y cuando se combinan con el VWAP, pueden mejorar la solidez de su estrategia de trading. Comenzamos explicando los conceptos básicos y, a continuación, describimos las funciones clave tanto en el EA MQL5 como en el script Python. A continuación, profundizamos en detalles adicionales sobre las funciones y analizamos los resultados esperados, antes de resumir las ideas clave. Consulte el índice que aparece a continuación. 


Concepto

El retroceso de Fibonacci se basa en proporciones derivadas de la secuencia de Fibonacci, introducida por Leonardo Fibonacci en el siglo XIII, y se utiliza ampliamente en el análisis técnico para señalar posibles niveles de soporte y resistencia donde podrían ocurrir reversiones de precios. La combinación del retroceso de Fibonacci con VWAP (Volume Weighted Average Price) nos proporciona una herramienta comercial más sólida, ya que VWAP incorpora datos de precio y volumen para reflejar el verdadero sentimiento y liquidez del mercado. Esta integración mejora la toma de decisiones al confirmar zonas de reversión clave con evidencia respaldada por el volumen, reduciendo señales falsas y ofreciendo una perspectiva dinámica sobre el comportamiento del mercado.

El sistema TrendMap es un marco de generación de señales de trading que integra MQL5 (asesor experto de MetaTrader 5) con un servidor analítico basado en Python. El sistema procesa los niveles de retroceso de Fibonacci, el VWAP (precio medio ponderado por volumen) y los datos de precios para generar señales de trading (compra o venta). 

  • Si el VWAP está por debajo del nivel de Fibonacci del 50 % (precio medio), se genera una señal de compra.
  • Si el VWAP está por encima del nivel de Fibonacci del 50 % (precio medio), se genera una señal de venta.

Esto garantiza que las señales se proporcionen en función de la acción del precio en relación con los niveles de retroceso de Fibonacci y VWAP. A continuación, he incluido un diagrama que ilustra cómo interactúa el mercado con los niveles de Fibonacci y VWAP. Este diagrama representa las condiciones necesarias que nuestro sistema basado en Python supervisa para la generación de señales.

  • Fib 0 - 0%
  • Fib 1 - 24%
  • Fib 2 - 38%
  • Fib 3 - 50%
  • Fib 4 - 62%
  • Fib 5 -  79%
  • Fib 6 - 100%

Fib 3 representa el nivel de retroceso del 50 %, y observamos que el VWAP se encuentra por encima de este nivel, lo que indica una posible reversión. En consecuencia, se genera una señal de venta. También he marcado con un círculo los niveles en los que el precio interactúa tanto con los niveles de Fibonacci como con el VWAP.

CONCEPTO

Figura 1. Precio frente a Fibonacci y VWAP

El asesor experto MQL5 integra los niveles de retroceso de Fibonacci y el análisis VWAP para generar señales de trading sin ejecutar operaciones. Calcula los niveles de Fibonacci a partir de un número específico de barras pasadas, determina los máximos y mínimos de oscilación y calcula el VWAP para evaluar las tendencias del mercado. El EA envía estos datos a un servidor Python a través de HTTP, que analiza las condiciones del mercado y devuelve una señal de compra o venta. Al recibir una nueva señal, el EA actualiza el gráfico mostrando la señal y dibujando líneas de Fibonacci, la línea VWAP y flechas para una representación visual.

El sistema funciona con un enfoque basado en temporizadores, lo que garantiza actualizaciones periódicas al tiempo que registra y realiza un seguimiento de los cambios del mercado. Este script configura un servidor Flask que toma datos de mercado del EA MQL5, los procesa y devuelve una señal de trading.

Cuando el EA envía datos JSON que contienen VWAP, niveles de retroceso de Fibonacci, máximos/mínimos oscilantes y datos de precios, el script evalúa si el VWAP está por debajo o por encima del precio medio del rango oscilante para determinar una señal de «Compra» o «Venta». Al mismo tiempo, genera un gráfico Matplotlib que traza el VWAP, los niveles de Fibonacci y los datos de precios, y guarda la imagen para referencia. El trazado se ejecuta en un subproceso independiente para garantizar un funcionamiento fluido.

Todo se registra para su seguimiento, y el servidor se ejecuta en 127.0.0.1:5110. Repasemos el diagrama de flujo que aparece a continuación para obtener una visión completa del proceso.

Lógica principal

Figura 2. Diagrama de flujo


Funciones principales

Asesor experto de MQL5

En esta parte, repasaremos las funciones principales que impulsan nuestro EA Fibonacci-VWAP en MQL5. El objetivo es:

  1. Calcular los niveles de retroceso de Fibonacci utilizando máximos y mínimos oscilantes.
  2. Determinar VWAP (precio promedio ponderado por volumen) para confirmar la tendencia.
  3. Envíe datos del mercado a Python, que realizará un análisis más profundo y devolverá una señal de compra/venta.
  4. Dibuje flechas de señal en el gráfico una vez que se cumplan todas las condiciones.

Vamos a desglosarlo paso a paso.

1. Actualización de los indicadores Fibonacci y VWAP

Para empezar, debemos asegurarnos de que nuestros niveles de retroceso de Fibonacci y VWAP estén actualizados antes de generar cualquier señal. Logramos esto llamando a dos funciones clave. En primer lugar, la función CalculateFibonacciLevels() se encarga de identificar los puntos máximos y mínimos de oscilación, así como de calcular los niveles de retroceso de Fibonacci pertinentes.

Estos niveles son cruciales para comprender las posibles zonas de soporte y resistencia. La segunda función, CalculateVWAP(), calcula el precio medio ponderado por volumen (VWAP), que sirve como indicador para determinar la tendencia general del mercado en función del volumen y el precio. Al mantener estos indicadores actualizados, nos aseguramos de estar trabajando con los datos de mercado más recientes, lo cual es esencial para un análisis y una toma de decisiones precisos.

void UpdateIndicators()
  {
   CalculateFibonacciLevels(InpTimeFrame, InpNumBars, g_SwingHigh, g_SwingLow, g_FibLevels);
   g_VWAP = CalculateVWAP(InpTimeFrame, InpNumBars);
   Print("Updated Indicators: SwingHigh=" + DoubleToString(g_SwingHigh, Digits()) +
         ", SwingLow=" + DoubleToString(g_SwingLow, Digits()) +
         ", VWAP=" + DoubleToString(g_VWAP, Digits()));
  }

2. Envío de datos de mercado a Python

Una vez actualizados los indicadores Fibonacci y VWAP, el siguiente paso es enviar los datos del mercado a Python para un análisis más avanzado. Esto se hace creando una carga JSON que incluye toda la información esencial necesaria para el procesamiento posterior. La carga útil está estructurada para contener puntos de datos clave, como el símbolo y el marco temporal del gráfico, los puntos máximos y mínimos, el valor VWAP y los niveles de Fibonacci calculados. Además, incluimos datos de precios recientes para un mayor análisis del mercado. Una vez que los datos están estructurados en este formato JSON, se envían al servidor Python a través de una solicitud HTTP, donde Python los procesará y devolverá una señal comercial basada en los cálculos.

string BuildJSONPayload()
  {
   string jsonPayload = "{";
   jsonPayload += "\"symbol\":\"" + Symbol() + "\",";
   jsonPayload += "\"timeframe\":\"" + EnumToString(InpTimeFrame) + "\",";
   jsonPayload += "\"swingHigh\":" + DoubleToString(g_SwingHigh, Digits()) + ",";
   jsonPayload += "\"swingLow\":" + DoubleToString(g_SwingLow, Digits()) + ",";
   jsonPayload += "\"vwap\":" + DoubleToString(g_VWAP, Digits()) + ",";

   jsonPayload += "\"fibLevels\":[";
   for(int i = 0; i < 7; i++)
     {
      jsonPayload += DoubleToString(g_FibLevels[i], 3);
      if(i < 6) jsonPayload += ",";
     }
   jsonPayload += "],";

   jsonPayload += "\"priceData\":[";
   for(int i = 0; i < InpNumBars; i++)
     {
      jsonPayload += DoubleToString(iClose(Symbol(), InpTimeFrame, i), Digits());
      if(i < InpNumBars - 1) jsonPayload += ",";
     }
   jsonPayload += "]}";

   return jsonPayload;
  }

3. Comunicarse con Python y recibir señales

En esta etapa, se realiza la solicitud HTTP, enviando la carga JSON al script Python. Luego, el servidor Python analizará los datos y devolverá una respuesta que contiene una señal de compra o venta. La solicitud HTTP está construida de manera que maneja tanto el envío de datos como la recepción de respuestas, verificando si hay errores durante el proceso. Si la solicitud es exitosa (indicado por un código de respuesta de 200), se analiza la respuesta y se extrae la señal relevante (compra, venta o retención) de los datos JSON devueltos por Python. Esto permite que el EA MQL5 integre potencia computacional externa en su proceso de toma de decisiones, lo que permite obtener señales comerciales más sólidas.

string SendDataToPython(string payload)
  {
   string headers = "Content-Type: application/json\r\n";
   char postData[];
   StringToCharArray(payload, postData);
   char result[];
   string resultHeaders;
   int resCode = WebRequest("POST", InpPythonURL, headers, InpHTTPTimeout, postData, result, resultHeaders);
   
   if(resCode == 200)
     {
      string response = CharArrayToString(result);
      Print("HTTP Response: " + response);
      string signal = ParseSignalFromJSON(response);
      return signal;
     }
   else
     {
      Print("Error: WebRequest failed with code " + IntegerToString(resCode));
      return "";
     }
  }

4. Trazar señales de compra/venta en el gráfico

Después de recibir la señal comercial de Python, el siguiente paso es representar visualmente esa señal en el gráfico. Esto se hace dibujando una flecha en el precio de mercado actual para indicar la acción sugerida. Si la señal es de compra, se coloca una flecha que apunta hacia arriba (de color verde) y, para una señal de venta, se dibuja una flecha que apunta hacia abajo (de color rojo). Esta señal visual es crucial para que los traders interpreten rápidamente la sugerencia comercial sin necesidad de analizar números.

Las flechas se crean dinámicamente utilizando la función ObjectCreate, y su apariencia (como el color y el tamaño) se puede ajustar para una mejor visibilidad. El uso de estas flechas hace que las señales comerciales sean claras y accesibles, incluso para aquellos que no estén siguiendo cada detalle del análisis del sistema.

void DrawSignalArrow(string signal)
  {
   int arrowCode = 0;
   color arrowColor = clrWhite;

   string lowerSignal = MyStringToLower(signal);
   if(lowerSignal == "buy")
     {
      arrowCode = 233;  // Upward arrow
      arrowColor = clrLime;
     }
   else if(lowerSignal == "sell")
     {
      arrowCode = 234;  // Downward arrow
      arrowColor = clrRed;
     }
   else
     {
      Print("Invalid signal: " + signal);
      return;
     }

   string arrowName = "SignalArrow_" + IntegerToString(TimeCurrent());
   ObjectCreate(0, arrowName, OBJ_ARROW, 0, TimeCurrent(), iClose(Symbol(), PERIOD_CURRENT, 0));
   ObjectSetInteger(0, arrowName, OBJPROP_ARROWCODE, arrowCode);
   ObjectSetInteger(0, arrowName, OBJPROP_COLOR, arrowColor);
   ObjectSetInteger(0, arrowName, OBJPROP_WIDTH, 2);
  }

Script de Python

1. Trazado de VWAP y Fibonacci frente al precio

La función plot_vwap_fib_vs_price() visualiza el movimiento del precio, el VWAP y los niveles de retroceso de Fibonacci. Se utiliza para ayudar a comprender la relación entre estos tres indicadores. La función acepta los siguientes parámetros:

  • symbol: El activo que se está analizando. 
  • vwap: El precio promedio ponderado por volumen calculado.
  • swingHigh y swingLow: Los puntos altos y bajos utilizados para calcular los niveles de retroceso de Fibonacci..
  • fibLevels: Los niveles de retroceso de Fibonacci (los valores predeterminados incluyen retrocesos comunes como 0,236, 0,382, etc.).
  • price_data: Una serie de pandas que contiene los datos de precios a lo largo del tiempo.

Desglose de funciones:

  • Trazado de datos de precios: La función comienza trazando los datos de precios a lo largo del tiempo utilizando sns.set para el estilo y ax.plot para la visualización.
  • Dibujar niveles de Fibonacci: Para cada nivel de Fibonacci proporcionado en la lista, la función calcula el precio correspondiente y dibuja una línea horizontal utilizando ax.axhline.
  • Dibujar VWAP: El VWAP se representa como una línea horizontal amarilla.
  • Guardar gráfico: El gráfico se guarda con una marca de tiempo para evitar sobrescribir gráficos anteriores.

El gráfico se guarda como un archivo de imagen, lo que ayuda a visualizar cómo interactúa el precio con los niveles clave de retroceso de Fibonacci y el VWAP.

def plot_vwap_fib_vs_price(symbol: str, vwap: float, swingHigh: float, swingLow: float, fibLevels: list, price_data: pd.Series) -> str:     sns.set(style="whitegrid")     fig, ax = plt.subplots(figsize=(7.5, 5), dpi=100)     ax.plot(price_data.index, price_data.values, label="Price", color='blue', marker='o', markersize=4)     for level in fibLevels:         level_price = swingLow + (swingHigh - swingLow) * level         ax.axhline(y=level_price, linestyle='--', linewidth=1.5, label=f'Fib {level*100:.1f}%: {level_price:.5f}')          ax.axhline(y=vwap, color='yellow', linestyle='-', linewidth=2, label=f'VWAP: {vwap:.5f}')     ax.set_title(f'VWAP & Fibonacci vs Price for {symbol}')     ax.set_xlabel('Time Index')     ax.set_ylabel('Price')     ax.legend()     filename = f"vwap_fib_plot_{symbol}_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.png"     plt.savefig(filename)     plt.close(fig)     return filename

2. Ruta de la señal y análisis

La función get_signal() es la ruta central que gestiona las solicitudes POST y se encarga de recibir datos del mercado, realizar análisis y devolver señales de trading. Los datos se envían a esta ruta como una carga JSON desde MQL5.

Desglose de funciones:

  • Recibir datos: La función recibe datos del mercado en formato sin procesar, los decodifica y los analiza en un objeto JSON.
  • Extraer datos: Se extraen datos clave como símbolo, swingHigh, swingLow, vwap, fibLevels y priceData del JSON entrante.
  • Trazado: Inicia un nuevo hilo que llama a la función de trazado para generar la representación visual de las condiciones del mercado (VWAP y Fibonacci).
  • Generación de señales: La señal de compra/venta se genera comparando el VWAP con el punto medio entre el máximo y el mínimo oscilantes. Si el VWAP es inferior al punto medio, se genera una señal de «Compra»; de lo contrario, se emite una señal de «Venta».
  • Respuesta: Se devuelve una respuesta con la señal generada («Comprar», «Vender» o «Ninguna») y una explicación.

La lógica de generación de señales es sencilla pero eficaz:

  • Señal de compra: El VWAP se encuentra por debajo del punto medio entre el máximo y el mínimo, lo que indica un posible impulso alcista.
  • Señal de venta: El VWAP está por encima del punto medio, lo que sugiere una tendencia bajista o condiciones bajistas.

@app.route('/getSignal', methods=['POST']) def get_signal():     try:         # Get the raw data from the request         raw_data = request.data.decode('utf-8').strip()         logging.debug("Raw data received: " + raw_data)         # Parse JSON         decoder = json.JSONDecoder()         data, idx = decoder.raw_decode(raw_data)         if idx != len(raw_data):             logging.error(f"Extra data found after valid JSON: index {idx} of {len(raw_data)}")         logging.info("Data received from MQL5: " + json.dumps(data, indent=2))     except Exception as e:         logging.error("Error parsing JSON: " + str(e))         return jsonify({"signal": "None", "error": str(e)})     try:         # Extract parameters         symbol = data.get('symbol', 'Unknown')         swingHigh = float(data.get('swingHigh', 0))         swingLow = float(data.get('swingLow', 0))         vwap = float(data.get('vwap', 0))         fibLevels = data.get('fibLevels', [0.236, 0.382, 0.5, 0.618, 1.618])  # Default levels if not provided         # Convert priceData list into a pandas Series         price_data = pd.Series(data.get('priceData', []))         # Start thread for visualization         threading.Thread(target=plot_vwap_fib_vs_price, args=(symbol, vwap, swingHigh, swingLow, fibLevels, price_data)).start()         # Determine signal based on VWAP & Fibonacci         mid_price = np.mean([swingHigh, swingLow])         if vwap < mid_price and price_data.iloc[-1] < swingLow + (swingHigh - swingLow) * 0.382:             signal = "Buy"         elif vwap > mid_price and price_data.iloc[-1] > swingLow + (swingHigh - swingLow) * 0.618:             signal = "Sell"         else:             signal = "None"         explanation = f"Signal: {signal} based on VWAP and Fibonacci analysis."     except Exception as e:         logging.error("Error processing data: " + str(e))         signal = "None"         explanation = "Error processing the signal."     # Build response     response = {         "signal": signal,         "explanation": explanation,         "received_data": data     }     logging.debug("Sending response to MQL5: " + json.dumps(response))     return jsonify(response)

En el código, el proceso de generación de señales tiene en cuenta tanto VWAP como Fibonacci, y la lógica se basa explícitamente en ambos para determinar si se debe generar una señal de compra o de venta. La señal de compra o venta se basa directamente en la alineación de los niveles VWAP y Fibonacci. Por ejemplo:

  • Señal de compra: cuando el VWAP está por debajo del punto medio y el precio se acerca a un nivel de soporte (retroceso de Fibonacci), es una fuerte indicación de compra.
  • Señal de venta: si el VWAP está por encima del punto medio y el precio está en un nivel de resistencia de Fibonacci, la señal de venta es más fuerte.


Otras funciones

Asesor experto MQL5

  • Funciones auxiliares

Comencemos con las funciones auxiliares. Son como las pequeñas herramientas en nuestra caja de herramientas que simplifican nuestro trabajo más adelante. Por ejemplo, la función BoolToString convierte un valor verdadero/falso en una cadena («true» o «false») para que, cuando registre o muestre estos valores, sean fáciles de leer. Luego está CharToStr, que toma un código de carácter (un short sin signo) y lo convierte en una cadena, una función muy útil cuando se necesita trabajar con datos de texto. Por último, MyStringToLower recorre una cadena dada carácter por carácter, convirtiendo las letras mayúsculas en minúsculas. Esto es especialmente útil cuando desea comparar cadenas sin preocuparse por las diferencias entre mayúsculas y minúsculas. Aquí está el código exacto:

//+------------------------------------------------------------------+ //| Helper: Convert bool to string                                   | //+------------------------------------------------------------------+ string BoolToString(bool val)   {    return(val ? "true" : "false");   } //+------------------------------------------------------------------+ //| Helper: Convert ushort (character code) to string                | //+------------------------------------------------------------------+ string CharToStr(ushort ch)   {    return(StringFormat("%c", ch));   } //+------------------------------------------------------------------+ //| Helper: Convert a string to lower case                           | //| This custom function avoids the implicit conversion warning.     | //+------------------------------------------------------------------+ string MyStringToLower(string s)   {    string res = "";    int len = StringLen(s);    for(int i = 0; i < len; i++)      {       ushort ch = s[i];       // Check if character is uppercase A-Z.       if(ch >= 'A' && ch <= 'Z')          ch = ch + 32;       res += CharToStr(ch);      }    return res;   }

En esencia, estas funciones ayudan a garantizar que nuestro manejo de texto y datos sea consistente en todo el EA.

  • Inicialización y limpieza

A continuación, tenemos las rutinas de inicialización y limpieza. Piense en esto como preparar el escenario antes de que comience la obra y ordenarlo después. En la función OnInit, el EA comienza imprimiendo un mensaje de bienvenida. A continuación, establece un temporizador utilizando EventSetTimer (que es fundamental para las tareas periódicas) y llama a InitializeFibonacciArray para precargar nuestros niveles de Fibonacci. Además, registra la hora actual para gestionar actualizaciones posteriores. Si el temporizador falla, el EA se detiene inmediatamente para evitar más problemas. Por el contrario, la función OnDeinit se llama cuando el EA se elimina del gráfico; detiene el temporizador con EventKillTimer y registra el motivo. Así es como se ve:

//+------------------------------------------------------------------+ //| Expert initialization function                                   | //+------------------------------------------------------------------+ int OnInit()   {    Print("FibVWAP No-Trade EA initializing...");    if(!EventSetTimer(InpTimerInterval))      {       Print("Error: Unable to set timer.");       return(INIT_FAILED);      }    InitializeFibonacciArray();    g_LastUpdateTime = TimeCurrent();    Print("FibVWAP No-Trade EA successfully initialized.");    return(INIT_SUCCEEDED);   } //+------------------------------------------------------------------+ //| Expert deinitialization function                                 | //+------------------------------------------------------------------+ void OnDeinit(const int reason)   {    EventKillTimer();    Print("FibVWAP No-Trade EA deinitialized, reason code: " + IntegerToString(reason));   } //+------------------------------------------------------------------+ //| Initialize Fibonacci levels array                                | //+------------------------------------------------------------------+ void InitializeFibonacciArray()   {    g_FibLevels[0] = 0.000;    g_FibLevels[1] = 0.236;    g_FibLevels[2] = 0.382;    g_FibLevels[3] = 0.500;    g_FibLevels[4] = 0.618;    g_FibLevels[5] = 0.786;    g_FibLevels[6] = 1.000;   }

Al configurar y desmantelar nuestro entorno con cuidado, garantizamos que nuestro EA funcione sin problemas y sin dejar cabos sueltos.

  • Ejecución periódica y manejo de eventos

Ahora, veamos cómo el EA administra sus tareas durante el tiempo de ejecución. La función OnTimer es clave aquí; se activa a intervalos definidos por el usuario (establecidos por InpTimerInterval). Cada vez que suena este temporizador, el EA actualiza sus indicadores, crea una carga útil JSON, envía esa carga útil a nuestro punto final de Python y procesa cualquier señal devuelta. Si hay una nueva señal, el EA incluso dibuja una flecha en el gráfico. Aunque OnTick se invoca con cada actualización del mercado (o tick), solo lo utilizamos para invocar MainProcessingLoop, de modo que el procesamiento pesado no se produzca en cada tick, sino solo en intervalos controlados. Este diseño ayuda a mantener la eficiencia del EA. Mira el código:

//+------------------------------------------------------------------+ //| Expert timer function: periodic update                           | //+------------------------------------------------------------------+ void OnTimer()   {    UpdateIndicators();    string payload = BuildJSONPayload();    Print("Payload sent to Python: " + payload);    string signal = SendDataToPython(payload);    if(signal != "")      {       if(signal != g_LastSignal)         {          g_LastSignal = signal;          Print("New signal received: " + signal);          Comment("ML Signal: " + signal);          // Draw an arrow on the chart for the new signal.          DrawSignalArrow(signal);         }       else         {          Print("Signal unchanged: " + signal);         }      }    else      {       Print("Warning: No valid signal received.");      }    UpdateChartObjects();   } //+------------------------------------------------------------------+ //| Expert tick function                                             | //+------------------------------------------------------------------+ void OnTick()   {    MainProcessingLoop();   } //+------------------------------------------------------------------+ //| Main processing loop: can be called from OnTick                  | //+------------------------------------------------------------------+ void MainProcessingLoop()   {    datetime currentTime = TimeCurrent();    if(currentTime - g_LastUpdateTime >= InpTimerInterval)      {       UpdateChartObjects();       g_LastUpdateTime = currentTime;      }   }

Esta configuración garantiza que nuestro EA realice sus actualizaciones al ritmo adecuado sin verse abrumado por cada tick.

  • Gestión de objetos de gráficos

La retroalimentación visual es importante en el trading, y aquí es donde entra en juego nuestra gestión de objetos gráficos. La función DrawChartObjects se encarga de dibujar elementos visuales en el gráfico, como líneas horizontales que representan nuestros niveles de Fibonacci y el VWAP. Primero borra todos los objetos anteriores para evitar el desorden, luego crea nuevos objetos con los colores, estilos y etiquetas de texto adecuados. La función auxiliar UpdateChartObjects simplemente llama a DrawChartObjects para mantener la modularidad, y ExtendedProcessing está disponible si necesitamos realizar actualizaciones adicionales o acciones de depuración. Aquí está el código:

//+------------------------------------------------------------------+ //| Draw objects on the chart for visual indicator levels            | //+------------------------------------------------------------------+ void DrawChartObjects()   {    string objPrefix = "FibVWAP_";    // Remove previous objects with the given prefix.    ObjectsDeleteAll(0, objPrefix);    double range = g_SwingHigh - g_SwingLow;    for(int i = 0; i < 7; i++)      {       double levelPrice = g_SwingLow + range * g_FibLevels[i];       string name = objPrefix + "FibLevel_" + IntegerToString(i);       if(!ObjectCreate(0, name, OBJ_HLINE, 0, 0, levelPrice))          Print("Error creating object: " + name);       else         {          ObjectSetInteger(0, name, OBJPROP_COLOR, clrDeepSkyBlue);          ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_DOT);          ObjectSetString(0, name, OBJPROP_TEXT, "Fib " + DoubleToString(g_FibLevels[i]*100, 0) + "%");         }      }    string vwapName = objPrefix + "VWAP";    if(!ObjectCreate(0, vwapName, OBJ_HLINE, 0, 0, g_VWAP))       Print("Error creating VWAP object.");    else      {       ObjectSetInteger(0, vwapName, OBJPROP_COLOR, clrYellow);       ObjectSetInteger(0, vwapName, OBJPROP_STYLE, STYLE_SOLID);       ObjectSetString(0, vwapName, OBJPROP_TEXT, "VWAP");      }   } //+------------------------------------------------------------------+ //| Periodically update chart objects                                | //+------------------------------------------------------------------+ void UpdateChartObjects()   {    DrawChartObjects();   } //+------------------------------------------------------------------+ //| Extended processing: additional updates and chart redraw         | //+------------------------------------------------------------------+ void ExtendedProcessing()   {    Print("Extended processing executed.");    UpdateChartObjects();   }

  • Funciones de utilidad adicionales
Por último, veamos las funciones de utilidad. Estos son los héroes anónimos que apoyan a nuestro EA detrás de escena. La función CharArrayToString toma una matriz de caracteres, a menudo recibida de solicitudes web, y la convierte en una cadena utilizable. LogDebugInfo imprime mensajes con una marca de tiempo para que pueda realizar un seguimiento de la actividad del EA a lo largo del tiempo, lo que resulta muy útil durante la depuración. Y PauseExecution le permite detener el EA durante un número determinado de segundos, lo que puede resultar útil si necesita ralentizar las cosas para observar el comportamiento durante las pruebas. Aquí está el código para estas utilidades:

//+------------------------------------------------------------------+ //| Convert char array to string                                     | //+------------------------------------------------------------------+ string CharArrayToString(const char &arr[])   {    string ret = "";    for(int i = 0; i < ArraySize(arr); i++)       ret += CharToStr(arr[i]);    return(ret);   } //+------------------------------------------------------------------+ //| Custom logging function for detailed debug information           | //+------------------------------------------------------------------+ void LogDebugInfo(string info)   {    string logMessage = TimeToString(TimeCurrent(), TIME_DATE|TIME_SECONDS) + " | " + info;    Print(logMessage);   } //+------------------------------------------------------------------+ //| Additional utility: Pause execution (for debugging)              | //+------------------------------------------------------------------+ void PauseExecution(int seconds)   {    datetime endTime = TimeCurrent() + seconds;    while(TimeCurrent() < endTime)      {       Sleep(100);      }   }

Puede que estas funciones no sean las estrellas de EA, pero marcan una gran diferencia a la hora de solucionar problemas y garantizar que todo funcione como se espera.

Script de Python

  • Importaciones clave en nuestro sistema de comercio de Python
Analicemos las bibliotecas clave utilizadas en este sistema. Cada uno juega un papel crucial, ya sea en el manejo de datos, la realización de cálculos o la visualización de información del mercado. A continuación, proporcionaré un fragmento de código que muestra estas importaciones, seguido de una tabla que explica su propósito y cómo contribuyen al sistema.

import datetime   import json   import logging   import threading   import numpy as np   import pandas as pd   import pandas_ta as ta   import matplotlib.pyplot as plt   import seaborn as sns   from flask import Flask, request, jsonify  

Biblioteca Objetivo Cómo se utiliza en nuestro sistema
datetime Gestión del tiempo Se utiliza para marcar con fecha y hora los gráficos comerciales guardados y registrar eventos. Cada vez que generamos un gráfico, adjuntamos una marca de tiempo para realizar un seguimiento de las diferentes condiciones del mercado a lo largo del tiempo.
json Intercambio de datos Como nuestro sistema se comunica con MQL5, enviamos y recibimos datos en formato JSON. Este módulo nos ayuda a codificar y decodificar mensajes JSON entre Python y MQL5.
logging Depuración y monitorización Realiza un seguimiento de los eventos del sistema. Lo usamos para registrar cada paso (cuando se recibe una señal, se procesa o si ocurre un error), lo que facilita la depuración.
threading Ejecutar tareas en segundo plano Cuando generamos un gráfico VWAP-Fibonacci, lo ejecutamos en un hilo separado para garantizar que el servidor siga respondiendo y no demore el envío de señales a MQL5.
numpy Cálculo numérico Utilizamos NumPy para calcular el precio medio y realizar otras operaciones matemáticas de forma rápida y eficiente. La velocidad es importante cuando se procesan datos del mercado en tiempo real.
pandas Manejo de datos Dado que los datos del mercado están estructurados en filas y columnas (como una hoja de cálculo), pandas facilita el almacenamiento, el filtrado y la manipulación de estos datos para su análisis.
pandas_ta Indicadores técnicos Aunque no es una parte fundamental de nuestro sistema actual, permite utilizar herramientas de análisis técnico adicionales si es necesario en el futuro.
matplotlib.pyplot Gráficos y visualización La columna vertebral de nuestro análisis visual. Lo usamos para trazar movimientos de precios, niveles VWAP y zonas de retroceso de Fibonacci.
seanborn Estilo de gráfico mejorado Ayuda a que nuestros gráficos sean visualmente atractivos, lo que facilita la detección de tendencias y niveles clave.
flask  Comunicación entre MQL5 y Python  Esto es lo que hace posible el intercambio de señales en tiempo real. Flask crea una API que permite a nuestro Asesor Experto MQL5 enviar datos de precios y recibir señales comerciales al instante. 
  • Flask Server Initialization (if __name__ == '__main__')
Este bloque inicializa y ejecuta el servidor web Flask, lo que permite al EA MQL5 comunicarse con el script Python a través de solicitudes HTTP.

Cómo funciona:
  • Vincula el servidor al puerto 5110.
  • Se ejecuta en modo de depuración para registro y resolución de problemas en tiempo real.
  • Asegura que el servidor no se reinicie automáticamente de forma innecesaria (use_reloader=False).

if __name__ == '__main__':     port = 5110     logging.info(f"Starting Flask server on 127.0.0.1:{port} (debug mode ON)")     app.run(host="127.0.0.1", port=port, debug=True, use_reloader=False)


Resultados

Para probar el sistema, comience ejecutando el script de Python para activar el puerto y el servidor para la conexión. Si no está seguro de cómo ejecutar el script, consulte el artículo sobre flujo externo para obtener orientación. Una vez que el servidor esté activo, ejecute MQL5 EA. Ahora, examinemos los resultados después de ejecutar exitosamente el sistema.

Registros del símbolo del sistema

2025-02-06 12:45:32,384 DEBUG: Sending response to MQL5: {"signal": "Sell", "explanation": "Signal: Sell based on VWAP and Fibonacci analysis.", "received_data": {"symbol": "EURUSD", "timeframe": "PERIOD_H1", "swingHigh": 1.05331, "swingLow": 1.02099, "vwap": 1.03795, "fibLevels": [0.0, 0.236, 0.382, 0.5, 0.618, 0.786, 1.0], "priceData": [1.03622, 1.03594, 1.03651, 1.03799, 1.03901, 1.03865, 1.03871, 1.0392, 1.03951, 1.04025, 1.03974, 1.03986, 1.04041, 1.04017, 1.04049, 1.04072, 1.04156, 1.04197, 1.04181, 1.04223, 1.04224, 1.04079, 1.04192, 1.04147, 1.04251, 1.04039, 1.04039, 1.04026, 1.0385, 1.03778, 1.03786, 1.03796, 1.03845, 1.03734, 1.03786, 1.03714, 1.0378, 1.03786, 1.03854, 1.03817, 1.03811, 1.03767, 1.03784, 1.03801, 1.03593, 1.03404, 1.03254, 1.03223, 1.0335, 1.03386, 1.03344, 1.03115, 1.03067, 1.02932, 1.0306, 1.03147, 1.0322, 1.03221, 1.03178, 1.03281, 1.0342, 1.03441, 1.02955, 1.02846, 1.02785, 1.02795, 1.02761, 1.03162, 1.0251, 1.0264, 1.02577, 1.02522, 1.02438, 1.0231, 1.02436, 1.02249, 1.02431, 1.02404, 1.02265, 1.02216, 1.02235, 1.02377, 1.02314, 1.0247, 1.02504, 1.03583, 1.03733, 1.03763, 1.03698, 1.042, 1.03998, 1.03964, 1.03687, 1.03822, 1.03825, 1.03759, 1.03765, 1.03836, 1.03845, 1.0404, 1.03946, 1.03888, 1.03875, 1.0385, 1.03897, 1.03884, 1.03867, 1.03969, 1.03873, 1.03885, 1.04076, 1.0428, 1.0425, 1.0417, 1.04197, 1.04314, 1.0428, 1.04562, 1.04033, 1.03918, 1.04007, 1.04076, 1.04217, 1.04239, 1.04139, 1.0422, 1.04191, 1.04253, 1.0423, 1.042, 1.04259, 1.04247, 1.04216, 1.04209, 1.04105, 1.04164, 1.042, 1.04213, 1.04157, 1.04194, 1.04013, 1.03878, 1.0404, 1.04016, 1.04037, 1.04038, 1.04244, 1.04161, 1.04372, 1.04403, 1.04386, 1.04374, 1.0434, 1.04272, 1.04304, 1.04272, 1.04286, 1.04301, 1.04315, 1.0435, 1.04264, 1.04279, 1.04262, 1.04241, 1.04314, 1.04249, 1.04203, 1.04234, 1.0425, 1.04352, 1.04252, 1.04342, 1.04376, 1.04364, 1.04336, 1.04291, 1.04336, 1.04378, 1.04453, 1.0437, 1.04886, 1.04916, 1.04881, 1.04926, 1.04849, 1.04888, 1.04908, 1.04992, 1.05094, 1.05199, 1.05212, 1.0513, 1.05054, 1.04888, 1.04875, 1.04571, 1.04591, 1.0463, 1.04633, 1.04686]}} 2025-02-06 12:39:32,397 INFO: 127.0.0.1 - - [06/Feb/2025 12:39:32] "POST /getSignal HTTP/1.1" 200 - 2025-02-06 12:39:32,805 DEBUG: VWAP & Fibonacci vs Price graph saved as vwap_fib_plot_EURUSD_20250206_123932.png

Registros MQL5

2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5)     Fib Level 0 (0%): 1.02099 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5)     Fib Level 1 (24%): 1.02862 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5)     Fib Level 2 (38%): 1.03334 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5)     Fib Level 3 (50%): 1.03715 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5)     Fib Level 4 (62%): 1.04096 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5)     Fib Level 5 (79%): 1.04639 2025.02.06 12:45:32.332 FIBVWAP (EURUSD,M5)     Fib Level 6 (100%): 1.05331 2025.02.06 12:45:32.332 FIBVWAP (EURUSD,M5)     Updated Indicators: SwingHigh=1.05331, SwingLow=1.02099, VWAP=1.03795 2025.02.06 12:45:32.332 FIBVWAP (EURUSD,M5)     Payload sent to Python: {"symbol":"EURUSD","timeframe":"PERIOD_H1","swingHigh":1.05331,"swingLow":1.02099,"vwap":1.03795,"fibLevels":[0.000,0.236,0.382,0.500,0.618,0.786,1.000],"priceData":[1.03583,1.03594,1.03651,1.03799,1.03901,1.03865,1.03871,1.03920,1.03951,1.04025,1.03974,1.03986,1.04041,1.04017,1.04049,1.04072,1.04156,1.04197,1.04181,1.04223,1.04224,1.04079,1.04192,1.04147,1.04251,1.04039,1.04039,1.04026,1.03850,1.03778,1.03786,1.03796,1.03845,1.03734,1.03786,1.03714,1.03780,1.03786,1.03854,1.03817,1 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)     HTTP Response: { 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)       "explanation": "Signal: Sell based on VWAP and Fibonacci analysis.", 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)       "received_data": { 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)         "fibLevels": [ 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           0.0, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           0.236, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           0.382, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           0.5, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           0.618, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           0.786, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.0 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)         ], 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)         "priceData": [ 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03583, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03594, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03651, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03799, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03901, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03865, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03871, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.0392, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03951, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04025, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03974, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03986, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04041, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04017, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04049, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04072, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04156, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04197, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04181, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04223, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04224, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04079, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04192, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04147, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04251, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04039, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04039, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04026, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.0385, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03778, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03786, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03796, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03845, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03734, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03786, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03714, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.0378, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03786, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03854, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03817, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03811, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03767, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03784, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03801, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03593, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03404, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03254, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03223, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0335, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03386, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03344, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03115, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03067, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02932, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0306, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03147, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0322, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03221, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03178, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03281, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0342, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03441, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02955, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02846, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02785, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02795, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02761, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03162, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0251, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0264, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02577, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02522, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02438, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0231, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02436, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02249, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02431, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02404, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02265, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02216, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02235, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02377, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02314, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0247, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02504, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03583, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03733, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03763, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03698, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.042, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03998, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03964, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03687, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03822, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03825, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03759, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03765, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03836, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03845, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0404, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03946, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03888, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03875, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0385, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03897, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03884, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03867, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03969, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03873, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03885, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04076, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0428, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0425, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0417, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04197, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04314, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0428, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04562, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04033, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03918, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04007, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04076, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04217, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04239, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04139, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0422, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04191, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04253, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0423, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.042, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04259, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04247, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04216, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04209, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04105, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04164, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.042, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04213, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04157, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04194, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04013, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03878, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0404, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04016, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04037, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04038, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04244, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04161, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04372, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04403, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04386, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04374, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0434, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04272, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04304, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04272, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04286, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04301, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04315, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0435, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04264, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04279, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04262, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04241, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04314, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04249, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04203, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04234, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0425, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04352, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04252, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04342, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04376, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04364, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04336, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04291, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04336, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04378, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04453, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0437, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04886, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04916, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04881, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04926, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04849, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04888, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04908, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04992, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.05094, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.05199, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.05212, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0513, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.05054, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04888, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04875, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04571, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04591, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0463, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04633, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04686 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)         ], 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)         "swingHigh": 1.05331, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)         "swingLow": 1.02099, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)         "symbol": "EURUSD", 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)         "timeframe": "PERIOD_H1", 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)         "vwap": 1.03795 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)       }, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)       "signal": "Sell" 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)     }

El gráfico VWAP-Fibonacci vs. Precio también se trazó y guardó en el mismo directorio que el script de Python. Este gráfico ayuda a visualizar cómo interactúa el precio con los niveles VWAP y Fibonacci.

MATPLOTLIB

Figura 3. Gráfico de Matplotlib

En el diagrama a continuación, el EA MQL5 en el gráfico MetaTrader 5 registra y muestra la respuesta del servidor Python. El gráfico muestra dos señales de compra, indicadas por flechas, que también se registran en la pestaña Expertos. Podemos ver que el mercado siguió la dirección de estas señales, confirmando su validez. Elegí ver el gráfico M1 para un análisis más claro.

B300

Figura 4. Prueba del índice Boom 300


Conclusión

Este sistema resulta muy útil para los traders. Además de proporcionar señales, permite una visualización clara de cómo el precio interactúa con los niveles de Fibonacci y VWAP durante la generación de señales. La visualización se logra de dos maneras: Python traza un gráfico utilizando elMatplotlib biblioteca, mientras que MQL5 EA muestra líneas VWAP y Fibonacci directamente en el gráfico para un mejor análisis. Esta representación visual mejorada puede ayudar a los comerciantes a tomar decisiones informadas.

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 
27/01/25 VWAP Precio promedio ponderado por volumen   1.3  Lanzamiento inicial  Herramienta número 10 
02/02/25  Heikin Ashi  Identificación de señales de suavizado y reversión de tendencias  1.0  Lanzamiento inicial  Herramienta número 11
04/02/25  FibVWAP  Generación de señales mediante análisis de Python  1.0  Lanzamiento inicial  Herramienta número 12

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

Archivos adjuntos |
server.py (4.53 KB)
FIBVWAP.mq5 (17.22 KB)
linfo2
linfo2 | 21 mar 2025 en 18:52
Gracias Chris por todas tus ideas y publicaciones, definitivamente material útil. Para este artículo. para conseguir que funcione tengo que hacer algunos ajustes apropiados para mi entorno después de volver a comprobar Price Action Analysis Toolkit Desarrollo (Parte 9): Flujo Externo - Artículos MQL5 Que Tal Vez Sean Útiles Para Otros

1 actualizar las secuencias de comandos para utilizar su dirección o host local 127.0.0.1

2 en opciones de herramientas url de solicitud web añadir la dirección que está utilizando

4 asegúrese de que todas las partes de Python están instaladas

instala matplotlib

pip install pandas

pip install Flask seaborn y Numpty si es necesario

3 inicie la aplicación flask en esa dirección ejecutando el archivo python con la dirección que está utilizando

Christian Benjamin
Christian Benjamin | 22 mar 2025 en 14:59
linfo2 #:
Gracias Chris por todas tus ideas y publicaciones, definitivamente material útil. Para este artículo. para conseguir que funcione tengo que hacer algunos ajustes apropiados para mi entorno después de volver a comprobar Price Action Analysis Toolkit Desarrollo (Parte 9): Flujo Externo - Artículos MQL5 Que Tal Vez Sean Útiles Para Otros

1 actualizar las secuencias de comandos para utilizar su dirección o host local 127.0.0.1

2 en opciones de herramientas url de solicitud web añadir la dirección que está utilizando

4 asegúrese de que todas las partes de Python están instaladas

instala matplotlib

pip install pandas

pip install Flask seaborn y Numpty si es necesario

3 inicie la aplicación flask en esa dirección ejecutando el archivo python con la dirección que está utilizando

Hola linfo2
Tienes toda la razón en las notas adicionales que has aportado. Muchas gracias a ti🔥.
Automatización de estrategias de trading en MQL5 (Parte 6): Dominar la detección de bloques de órdenes para el comercio inteligente con dinero Automatización de estrategias de trading en MQL5 (Parte 6): Dominar la detección de bloques de órdenes para el comercio inteligente con dinero
En este artículo, automatizamos la detección de bloques de órdenes en MQL5 utilizando análisis de acción de precios puro. Definimos bloques de órdenes, implementamos su detección e integramos la ejecución automatizada de operaciones. Por último, realizamos una prueba retrospectiva de la estrategia para evaluar su rendimiento.
Introducción a MQL5 (Parte 12): Guía para principiantes sobre cómo crear indicadores personalizados Introducción a MQL5 (Parte 12): Guía para principiantes sobre cómo crear indicadores personalizados
Aprenda a crear un indicador personalizado en MQL5. Con un enfoque basado en proyectos. Esta guía para principiantes cubre los buffers de indicadores, las propiedades y la visualización de tendencias, permitiéndole aprender paso a paso.
Dominando JSON: Crea tu propio lector JSON desde cero en MQL5 Dominando JSON: Crea tu propio lector JSON desde cero en MQL5
Experimente una guía paso a paso sobre la creación de un analizador JSON personalizado en MQL5, completo con manejo de objetos y matrices, verificación de errores y serialización. Obtenga conocimientos prácticos para conectar su lógica comercial y sus datos estructurados con esta solución flexible para manejar JSON en MetaTrader 5.
Pruebas de robustez en asesores expertos Pruebas de robustez en asesores expertos
En el desarrollo de una estrategia hay muchos detalles complejos a tener en cuenta, muchos de los cuales no se destacan para los traders principiantes. Como resultado, muchos comerciantes, incluido yo mismo, hemos tenido que aprender estas lecciones a las duras penas. Este artículo se basa en mis observaciones de errores comunes que la mayoría de los traders principiantes encuentran al desarrollar estrategias en MQL5. Ofrecerá una variedad de consejos, trucos y ejemplos para ayudar a identificar la descalificación de un EA y probar la solidez de nuestros propios EA de una manera fácil de implementar. El objetivo es educar a los lectores, ayudándolos a evitar futuras estafas al comprar EA, así como a prevenir errores en el desarrollo de su propia estrategia.