English Русский 中文 Deutsch 日本語 Português
preview
Scalping Orderflow en MQL5

Scalping Orderflow en MQL5

MetaTrader 5Ejemplos |
783 4
Javier Santiago Gaston De Iriarte Cabrera
Javier Santiago Gaston De Iriarte Cabrera

Introducción

Un ejemplo de un sofisticado sistema de comercio algorítmico para MetaTrader 5 (MQL5) que utiliza la técnica Scalping Orderflow es este Asesor Experto (Expert Advisor, EA).

Una estrategia de trading a corto plazo conocida como "scalping orderflow" se centra en identificar posibles puntos de entrada y salida en el mercado mediante el análisis del flujo de órdenes en tiempo real. Toma decisiones comerciales rápidas combinando el estudio del volumen, la actividad de precios y los datos del libro de órdenes. Por lo general, las posiciones se mantienen durante un tiempo muy breve (a menudo, minutos o incluso segundos).

Este EA encuentra oportunidades comerciales basadas en desequilibrios en el flujo de órdenes utilizando una variedad de indicadores técnicos y metodologías de análisis de mercado. También se incluyen funciones avanzadas de gestión de riesgos que incluyen trailing stops, cierre de posiciones parciales y tamaño de posición dinámico. Además, el EA incorpora un método para evitar la negociación durante eventos de noticias significativas y establece un límite en las pérdidas consecutivas.

Predecir las oscilaciones de precios a corto plazo mediante el examen de los datos de la cartera de pedidos en tiempo real y la dinámica del volumen es la idea fundamental en la que se basa la negociación Orderflow. Al combinar esta idea con otros indicadores de análisis técnico establecidos, este asesor experto desarrolla una estrategia híbrida que busca identificar oportunidades comerciales de alta probabilidad.

El énfasis en la gestión del riesgo en este Asesor Experto es una de sus principales características. El control eficaz del riesgo es esencial en el turbulento mundo de la negociación de divisas, especialmente cuando se utilizan técnicas de scalping. Con el fin de salvaguardar el capital y optimizar los posibles rendimientos, este sistema incluye trailing stops, métodos de cierre parcial de posiciones y dimensionamiento dinámico de posiciones.

Gracias a su diseño flexible, los operadores pueden modificar los parámetros del EA para adaptarlos mejor a su estilo de negociación y tolerancia al riesgo. Los usuarios pueden ajustar varios aspectos del sistema para adaptarlo a sus objetivos de negociación y perspectivas de mercado, como los umbrales de volumen y los periodos de los indicadores.

Es crucial entender que aunque este EA opera automáticamente, no es una solución de «configurar y olvidar». Los usuarios deben comprender bien los conceptos básicos del comercio de divisas, las ideas detrás de Orderflow y los indicadores particulares incluidos en este sistema. Es aconsejable realizar un seguimiento rutinario y realizar las modificaciones necesarias para garantizar que el EA funcione de manera óptima en diferentes circunstancias del mercado.


El código

Este Asesor Experto (Expert Advisor, EA) está diseñado para MetaTrader 5 e implementa una estrategia avanzada de scalping Orderflow con sofisticadas funciones de gestión de riesgos. El EA comienza inicializando varios indicadores técnicos y validando los parámetros de entrada durante la función OnInit(). Establece manejadores para indicadores como Medias Móviles, ADX, ATR, RSI y Bandas de Bollinger.

#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>

// Input parameters
input int VolumeThreshold = 35000;  // Volume threshold to consider imbalance
input int OrderFlowPeriod = 30;   // Number of candles to analyze order flow
input double RiskPercent = 1.0;   // Risk percentage per trade
input int ADXPeriod = 14;         // ADX Period
input int ADXThreshold = 25;      // ADX threshold for strong trend
input int MAPeriod = 200;         // Moving Average Period
input ENUM_TIMEFRAMES Timeframe = PERIOD_M15;  // Timeframe for analysis
input double MaxLotSize = 0.1;    // Maximum allowed lot size
input int ATRPeriod = 14;         // ATR Period
input double ATRMultiplier = 2.0; // ATR Multiplier
input int RSIPeriod = 14;         // RSI Period
input int RSIOverbought = 70;     // RSI Overbought level
input int RSIOversold = 30;       // RSI Oversold level
input int MAFastPeriod = 10;      // Fast Moving Average Period
input int MASlowPeriod = 30;      // Slow Moving Average Period
input int BollingerPeriod = 20;   // Bollinger Bands Period
input double BollingerDeviation = 2.5; // Bollinger Bands Standard Deviation
input int MaxConsecutiveLosses = 1; // Maximum number of consecutive losses before pausing
input int MinBarsBetweenTrades = 1; // Minimum number of bars between trades

// Global variables
CTrade trade;
CPositionInfo positionInfo;
int maHandle, adxHandle, atrHandle, rsiHandle, maFastHandle, maSlowHandle, bollingerHandle;
int consecutiveLosses = 0;
datetime lastTradeTime = 0;
int barsSinceLastTrade = 0;

// New global variables for statistics
int totalTrades = 0;
int winningTrades = 0;
double totalProfit = 0;
int OnInit()
{
    // Logging initialization
    Print("Starting Order Flow EA v13...");
    
    // Verify trading permissions
    if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
    {
        Print("Error: Automated trading is not allowed in the terminal.");
        return INIT_FAILED;
    }
    
    if(!MQLInfoInteger(MQL_TRADE_ALLOWED))
    {
        Print("Error: Automated trading is not allowed for this EA.");
        return INIT_FAILED;
    }
    
    // Initialize trading object
    trade.SetExpertMagicNumber(123456);
    trade.SetMarginMode();
    trade.SetTypeFillingBySymbol(_Symbol);
    trade.SetDeviationInPoints(10); // 1 pip deviation allowed
    Print("Trading object initialized.");
    
    // Initialize indicators
    maHandle = iMA(_Symbol, Timeframe, MAPeriod, 0, MODE_SMA, PRICE_CLOSE);
    adxHandle = iADX(_Symbol, Timeframe, ADXPeriod);
    atrHandle = iATR(_Symbol, Timeframe, ATRPeriod);
    rsiHandle = iRSI(_Symbol, Timeframe, RSIPeriod, PRICE_CLOSE);
    maFastHandle = iMA(_Symbol, Timeframe, MAFastPeriod, 0, MODE_EMA, PRICE_CLOSE);
    maSlowHandle = iMA(_Symbol, Timeframe, MASlowPeriod, 0, MODE_EMA, PRICE_CLOSE);
    bollingerHandle = iBands(_Symbol, Timeframe, BollingerPeriod, 0, BollingerDeviation, PRICE_CLOSE);
    
    // Verify indicator initialization
    if(maHandle == INVALID_HANDLE || adxHandle == INVALID_HANDLE || atrHandle == INVALID_HANDLE || 
       rsiHandle == INVALID_HANDLE || maFastHandle == INVALID_HANDLE || maSlowHandle == INVALID_HANDLE ||
       bollingerHandle == INVALID_HANDLE)
    {
        Print("Error initializing indicators:");
        if(maHandle == INVALID_HANDLE) Print("- Invalid MA");
        if(adxHandle == INVALID_HANDLE) Print("- Invalid ADX");
        if(atrHandle == INVALID_HANDLE) Print("- Invalid ATR");
        if(rsiHandle == INVALID_HANDLE) Print("- Invalid RSI");
        if(maFastHandle == INVALID_HANDLE) Print("- Invalid Fast MA");
        if(maSlowHandle == INVALID_HANDLE) Print("- Invalid Slow MA");
        if(bollingerHandle == INVALID_HANDLE) Print("- Invalid Bollinger Bands");
        return INIT_FAILED;
    }
    
    Print("All indicators initialized successfully.");
    
    // Verify input parameters
    if(VolumeThreshold <= 0 || OrderFlowPeriod <= 0 || RiskPercent <= 0 || RiskPercent > 100 ||
       ADXPeriod <= 0 || ADXThreshold <= 0 || MAPeriod <= 0 || MaxLotSize <= 0 || ATRPeriod <= 0 ||
       ATRMultiplier <= 0 || RSIPeriod <= 0 || RSIOverbought <= RSIOversold || MAFastPeriod <= 0 ||
       MASlowPeriod <= 0 || BollingerPeriod <= 0 || BollingerDeviation <= 0 || MaxConsecutiveLosses < 0 ||
       MinBarsBetweenTrades < 0)
    {
        Print("Error: Invalid input parameters.");
        return INIT_FAILED;
    }
    
    Print("Input parameters validated.");
    
    // Initialize global variables
    consecutiveLosses = 0;
    lastTradeTime = 0;
    barsSinceLastTrade = MinBarsBetweenTrades;

La lógica principal de negociación se ejecuta en la función OnTick(), que se llama en cada tick del precio. El EA comprueba primero si se ha formado una nueva barra y si se permite la negociación. Luego analiza el flujo de órdenes comparando los volúmenes de compra y venta durante un período específico. El Asesor Experto utiliza múltiples indicadores técnicos para confirmar las señales de trading, incluyendo la fuerza de la tendencia (ADX), la posición del precio en relación con las medias móviles y los niveles del RSI.

void OnTick()
{
    if(!IsNewBar())
        return;
    
    Print("Current state - Consecutive losses: ", consecutiveLosses, 
          ", Bars since last trade: ", barsSinceLastTrade);
    
    if(!IsTradeAllowed())
    {
        Print("Trading not allowed. Check EA configuration and account permissions.");
        return;
    }
    
    // Check if there's an open position and manage it
    if(PositionExists())
    {
        ManageOpenPositions();
        return; // Exit if there's an open position
    }
    
    barsSinceLastTrade++; // Increment only if there's no open position
    
    if(!IsRiskAcceptable())
    {
        Print("Risk not acceptable.");
        return;
    }
    
    double buyVolume = 0, sellVolume = 0;
    AnalyzeOrderFlow(buyVolume, sellVolume);
    
    double adxValue[], maValue[], atrValue[], rsiValue[], maFastValue[], maSlowValue[], bollingerUpper[], bollingerLower[];
    if(!GetIndicatorData(adxValue, maValue, atrValue, rsiValue, maFastValue, maSlowValue, bollingerUpper, bollingerLower))
        return;
    
    bool strongTrend = (adxValue[0] > ADXThreshold);
    bool aboveMA = (SymbolInfoDouble(_Symbol, SYMBOL_LAST) > maValue[0]);
    bool fastAboveSlow = (maFastValue[0] > maSlowValue[0]);
    
    int dynamicSL = (int)(atrValue[0] * ATRMultiplier / SymbolInfoDouble(_Symbol, SYMBOL_POINT));
    int dynamicTP = dynamicSL * 3;  // Risk/Reward ratio of 1:3
    
    double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID);
    
    // Conditions for a buy trade
    if(strongTrend && aboveMA && fastAboveSlow && buyVolume > sellVolume + VolumeThreshold &&
       rsiValue[0] < RSIOverbought && currentPrice < bollingerUpper[0] &&
       barsSinceLastTrade >= MinBarsBetweenTrades)
    {
        Print("Buy conditions met. Attempting to open position...");
        if(ExecuteTrade(ORDER_TYPE_BUY, dynamicSL, dynamicTP))
        {
            Print("Buy position opened successfully.");
            barsSinceLastTrade = 0;
        }
    }
    // Conditions for a sell trade
    else if(strongTrend && !aboveMA && !fastAboveSlow && sellVolume > buyVolume + VolumeThreshold &&
            rsiValue[0] > RSIOversold && currentPrice > bollingerLower[0] &&
            barsSinceLastTrade >= MinBarsBetweenTrades)
    {
        Print("Sell conditions met. Attempting to open position...");
        if(ExecuteTrade(ORDER_TYPE_SELL, dynamicSL, dynamicTP))
        {
            Print("Sell position opened successfully.");
            barsSinceLastTrade = 0;
        }
    }
}

Para la gestión del riesgo, el Asesor Experto implementa un dimensionamiento dinámico de las posiciones basado en un porcentaje del saldo de la cuenta y en la volatilidad actual del mercado (utilizando el ATR). También incluye un mecanismo de stop dinámico y cierre de posiciones parciales para fijar ganancias. El Asesor Experto limita el riesgo al imponer un número máximo de pérdidas consecutivas y un número mínimo de barras entre operaciones.

bool IsRiskAcceptable()
{
    if(IsHighImpactNews())
    {
        Print("Risk not acceptable: High impact news detected.");
        return false;
    }
    
    if(consecutiveLosses >= MaxConsecutiveLosses)
    {
        Print("Risk not acceptable: Maximum consecutive losses reached (", consecutiveLosses, "/", MaxConsecutiveLosses, ").");
        return false;
    }
    
    if(barsSinceLastTrade < MinBarsBetweenTrades)
    {
        Print("Risk not acceptable: Not enough bars since last trade (", barsSinceLastTrade, "/", MinBarsBetweenTrades, ").");
        return false;
    }
    
    double equity = AccountInfoDouble(ACCOUNT_EQUITY);
    double balance = AccountInfoDouble(ACCOUNT_BALANCE);
    double drawdown = (balance - equity) / balance * 100;
    if(drawdown > 20) // Increased from 10% to 20%
    {
        Print("Risk not acceptable: Excessive drawdown (", DoubleToString(drawdown, 2), "%).");
        return false;
    }
    
    Print("Risk acceptable. Consecutive losses: ", consecutiveLosses, 
          ", Bars since last trade: ", barsSinceLastTrade, 
          ", Current drawdown: ", DoubleToString(drawdown, 2), "%");
    return true;
}

La función CalculateLotSize() determina el tamaño de posición adecuado en función del saldo de la cuenta, el porcentaje de riesgo y las condiciones actuales del mercado. La función ManageOpenPositions() gestiona las operaciones existentes, implementando trailing stops y cierres parciales.

double CalculateLotSize(double stopLossDistance)
{
    double accountBalance = AccountInfoDouble(ACCOUNT_BALANCE);
    double maxRiskAmount = accountBalance * (RiskPercent / 100);
    double tickValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
    double lotStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
    
    if(tickValue == 0 || stopLossDistance == 0)
    {
        Print("Error: Tick value or Stop Loss distance is 0");
        return 0;
    }
    
    double lotSize = NormalizeDouble(maxRiskAmount / (stopLossDistance * tickValue), 2);
    lotSize = MathFloor(lotSize / lotStep) * lotStep;
    
    double maxLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
    double minLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
    
    lotSize = MathMax(MathMin(lotSize, maxLot), minLot);
    lotSize = MathMin(lotSize, MaxLotSize);
    
    double margin = AccountInfoDouble(ACCOUNT_MARGIN_FREE);
    double requiredMargin = SymbolInfoDouble(_Symbol, SYMBOL_MARGIN_INITIAL) * lotSize;
    
    if(requiredMargin > margin)
    {
        Print("Not enough free margin to open this position. Required: ", requiredMargin, " Available: ", margin);
        return 0;
    }
    
    Print("Calculated lot size: ", lotSize, " Risk: $", NormalizeDouble(lotSize * stopLossDistance * tickValue, 2));
    
    return lotSize;
}

La función HandleTradingErrors(), que proporciona información detallada sobre varios errores relacionados con la negociación, se ocupa de la gestión de errores. El Asesor Experto también incluye funciones para registrar estadísticas de operaciones y comprobar si hay noticias de gran impacto (aunque esta última se deja como marcador de posición para que los usuarios la implementen).

//+------------------------------------------------------------------+
//| Function for error handling                                      |
//+------------------------------------------------------------------+
void HandleTradingErrors(int errorCode)
{
    switch(errorCode)
    {
        case TRADE_RETCODE_REQUOTE:
            Print("Error: Requote");
            break;
        case TRADE_RETCODE_REJECT:
            Print("Error: Request rejected");
            break;
        case TRADE_RETCODE_CANCEL:
            Print("Error: Request cancelled by trader");
            break;
        case TRADE_RETCODE_PLACED:
            Print("Order placed successfully");
            break;
        case TRADE_RETCODE_DONE:
            Print("Request completed");
            break;
        case TRADE_RETCODE_DONE_PARTIAL:
            Print("Request partially completed");
            break;
        case TRADE_RETCODE_ERROR:
            Print("Request processing error");
            break;
        case TRADE_RETCODE_TIMEOUT:
            Print("Error: Request cancelled by timeout");
            break;
        case TRADE_RETCODE_INVALID:
            Print("Error: Invalid request");
            break;
        case TRADE_RETCODE_INVALID_VOLUME:
            Print("Error: Invalid volume in request");
            break;
        case TRADE_RETCODE_INVALID_PRICE:
            Print("Error: Invalid price in request");
            break;
        case TRADE_RETCODE_INVALID_STOPS:
            Print("Error: Invalid stops in request");
            break;
        case TRADE_RETCODE_TRADE_DISABLED:
            Print("Error: Trading is disabled");
            break;
        case TRADE_RETCODE_MARKET_CLOSED:
            Print("Error: Market is closed");
            break;
        case TRADE_RETCODE_NO_MONEY:
            Print("Error: Not enough money to complete request");
            break;
        case TRADE_RETCODE_PRICE_CHANGED:
            Print("Error: Prices changed");
            break;
        case TRADE_RETCODE_PRICE_OFF:
            Print("Error: No quotes to process request");
            break;
        case TRADE_RETCODE_INVALID_EXPIRATION:
            Print("Error: Invalid order expiration date");
            break;
        case TRADE_RETCODE_ORDER_CHANGED:
            Print("Error: Order state changed");
            break;
        case TRADE_RETCODE_TOO_MANY_REQUESTS:
            Print("Error: Too many requests");
            break;
        case TRADE_RETCODE_NO_CHANGES:
            Print("Error: No changes in request");
            break;
        case TRADE_RETCODE_SERVER_DISABLES_AT:
            Print("Error: Autotrading disabled by server");
            break;
        case TRADE_RETCODE_CLIENT_DISABLES_AT:
            Print("Error: Autotrading disabled by client terminal");
            break;
        case TRADE_RETCODE_LOCKED:
            Print("Error: Request locked for processing");
            break;
        case TRADE_RETCODE_FROZEN:
            Print("Error: Order or position frozen");
            break;
        case TRADE_RETCODE_INVALID_FILL:
            Print("Error: Invalid order filling type");
            break;
        case TRADE_RETCODE_CONNECTION:
            Print("Error: No connection to trading server");
            break;
        case TRADE_RETCODE_ONLY_REAL:
            Print("Error: Operation allowed only for live accounts");
            break;
        case TRADE_RETCODE_LIMIT_ORDERS:
            Print("Error: Pending orders limit reached");
            break;
        case TRADE_RETCODE_LIMIT_VOLUME:
            Print("Error: Volume limit for orders and positions reached");
            break;
        default:
            Print("Unknown error: ", errorCode);
            break;
    }
}

En general, este Asesor Experto representa un complejo sistema de negociación que combina el análisis del flujo de órdenes con indicadores técnicos tradicionales y técnicas avanzadas de gestión de riesgos. Está diseñado para traders experimentados y debe probarse exhaustivamente antes de su implementación en vivo.

Nota: La función de eventos de noticias de alto impacto no está hecha, esto lo dejaré para que usted lo termine.



Pruebas retrospectivas

Este Asesor Experto también funciona en períodos de tiempo de 5, 15 y 30 minutos.

Debes analizar bien todos los periodos de tiempo y optimizar el Asesor Experto antes de pensar en operar con él.

Estos son los resultados para un periodo de 15 minutos

Configuración 15 min

Entradas 15 min

Gráfico 15 min

Pruebas retrospectivas 15 min

Utilizando datos de gráficos de 15 minutos, este análisis retrospectivo arroja luz sobre el rendimiento de una estrategia de trading en el par EURUSD entre 2000 y 2025. Con un apalancamiento de 1:100 y un depósito inicial de 3000 USD, el tamaño de la cuenta era relativamente modesto, y el alto apalancamiento podría magnificar tanto las ganancias como las pérdidas. Durante el periodo de pruebas retrospectivas, el enfoque generó una rentabilidad modesta del 4,19 % sobre el depósito inicial de 3000 USD, con una ganancia neta total de 125,83 USD.

Con 1,13 USD en ganancias por cada 1 USD en pérdidas, la estrategia parece haber sido ligeramente rentable en general, como indica el factor de beneficio de 1,13. En total se realizaron 364 operaciones, de las cuales 167 fueron largas y 197 cortas. La buena selección de las operaciones se reflejó en los elevados porcentajes de ganancias, que fueron del 73,60 % en las operaciones cortas y del 86,23 % en las largas.

El método parecía tener pequeñas ganancias pero mayores pérdidas cuando las operaciones iban en su contra, ya que el beneficio medio por operación ganadora (3,71) era considerablemente menor que la pérdida media por operación perdedora (-12,62 USD). Hubo un máximo de 15 operaciones con ganancias y un máximo de 5 operaciones con pérdidas. La mayor operación con beneficio fue de 50,22 USD, mientras que la mayor pérdida fue de -66,10 USD.

La mayor caída de la estrategia en la curva de renta variable fue del 5,63 %, que es una pérdida aceptable e indica una gestión prudente del riesgo. La estrategia produjo rendimientos que compensaron adecuadamente el grado de riesgo asumido, como demuestra el ratio de Sharpe de 1,83.

Todo ello considerado, parece que se trata de un enfoque de scalping de alta frecuencia que busca realizar muchas operaciones pequeñas y exitosas mientras que ocasionalmente se sufren pérdidas mayores. Como lo demuestra su alta tasa de ganancias y su menor factor de beneficio, lo que podría hacerlo vulnerable a pérdidas significativas en caso de que cambien las condiciones del mercado. Por favor revise sus respuestas nuevamente.

Marco de tiempo de 5 minutos

Configuración 5 min

Entradas 5 min

Gráfico 5 min

Pruebas retrospectivas 5 min

Utilizando datos de gráficos de 5 minutos, esta investigación de backtesting analiza cómo una estrategia de trading se desempeñó en el par de divisas EURUSD entre el 1 de enero de 2000 y el 1 de febrero de 2025. La técnica utiliza un depósito inicial de 3000 USD con un apalancamiento de 1:100, lo que indica un tamaño de cuenta relativamente pequeño con un alto apalancamiento que tiene el potencial de magnificar tanto las ganancias como las pérdidas.

Según los resultados del backtesting, el depósito inicial de 3000 USD generó una ganancia neta total de 150,32 USD, lo que representa un modesto retorno del 5,01 % a lo largo de 25 años. Se realizaron un total de 1732 transacciones utilizando la estrategia, de las cuales 1023 fueron operaciones cortas y 709 posiciones largas. La buena selección de operaciones fue evidente en ambas direcciones, como lo muestran las altas tasas de ganancia de 81,82 % y 81,95 % para las operaciones cortas y largas, respectivamente.

El método parece haber tenido muchas ganancias menores, pero grandes pérdidas cuando las operaciones se fueron en su contra, ya que la ganancia promedio por operación ganadora (2,27 USD) fue mucho menor que la pérdida promedio por operación perdedora (-9,79 USD). Con 1,05 USD de ganancia por cada 1 USD en pérdidas, la estrategia fue solo ligeramente lucrativa en general, como lo indica el factor de ganancia de 1,05. El mayor drawdown de la estrategia en la curva de equidad fue del 9,95%, lo que es una cantidad razonable, pero podría generar inquietudes respecto a la gestión del riesgo.

El enfoque parece haber producido rendimientos que sólo compensan marginalmente el nivel de riesgo incurrido, como indica el ratio de Sharpe de 0,92. La curva de la renta variable indica en general una tendencia al alza, aunque hay oscilaciones y descensos notables.

Los parámetros del método recomiendan utilizar un complicado enfoque multifactorial para las decisiones comerciales mediante el uso de diversos indicadores técnicos, como ADX, Medias Móviles, RSI y Bandas de Bollinger. En conjunto, parece que se trata de un enfoque de scalping de alta frecuencia que busca realizar muchas operaciones pequeñas y exitosas mientras que ocasionalmente sufre pérdidas mayores. Puede resultarle difícil proporcionar retornos sustanciales a lo largo del tiempo y puede ser susceptible a caídas importantes en situaciones desfavorables del mercado dada su alta tasa de ganancias pero bajo componente de ganancias.


Conclusión

Utilizando herramientas de gestión de riesgos de última generación, este asesor experto para MetaTrader 5 aplica un enfoque complejo de scalping de flujo de órdenes. Utiliza una combinación de varios indicadores técnicos, análisis del flujo de órdenes y tamaño de posición dinámico para encontrar oportunidades de negociación de divisas de alta probabilidad. Al realizar pruebas retrospectivas del EA en diferentes marcos temporales para el par EURUSD, especialmente en intervalos de 15 y 5 minutos, se indica potencial.

Aun así, los resultados indican tanto ventajas como desventajas. A pesar de las altas tasas de éxito de la estrategia y su modesta rentabilidad, es posible que no pueda producir grandes retornos debido a su bajo factor de ganancia y ganancias relativamente menores a lo largo de períodos de prueba prolongados. Debido a su propensión a que pequeñas ganancias frecuentes se vean compensadas por pérdidas mayores y esporádicas, el método puede ser susceptible a caídas significativas en caso de condiciones desfavorables del mercado.



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

Archivos adjuntos |
SO_Final.mq5 (58.46 KB)
Kevin Spreier
Kevin Spreier | 19 sept 2024 en 19:20
¿Dónde está AnalyzeOrderFlow()?
Javier Santiago Gaston De Iriarte Cabrera
Kevin Spreier #:
¿Dónde está AnalyzeOrderFlow()?

línea 285

damhi
damhi | 21 sept 2024 en 02:16
Javier Santiago Gaston De Iriarte Cabrera #:

línea 285

¿Dónde están las otras funciones ()?
Javier Santiago Gaston De Iriarte Cabrera
damhi #:
¿Dónde están las otras funciones ()?

Lo tendré en cuenta para próximos artículos. Usted todavía puede descargar el script, y verlos.

DoEasy. Funciones de servicio (Parte 3): Patrón "Barra exterior" DoEasy. Funciones de servicio (Parte 3): Patrón "Barra exterior"
En este artículo desarrollaremos el patrón Price Action "Barra exterior" en la biblioteca DoEasy y optimizaremos los métodos de acceso a la gestión de los patrones de precios. Además, trabajaremos en la corrección de los fallos y errores detectados durante las pruebas de la biblioteca.
Redes neuronales en el trading: Enfoque sin máscara para la predicción del movimiento de precios Redes neuronales en el trading: Enfoque sin máscara para la predicción del movimiento de precios
En este artículo nos familiarizaremos con el método Mask-Attention-Free Transformer (MAFT) y su aplicación en el ámbito del trading. A diferencia de los Transformers tradicionales, que requieren el enmascaramiento de los datos durante el procesamiento de la secuencia, el MAFT optimiza el proceso de atención eliminando la necesidad de enmascaramiento, lo que mejora significativamente la eficiencia computacional.
Análisis de múltiples símbolos con Python y MQL5 (Parte I): Fabricantes de circuitos integrados del NASDAQ Análisis de múltiples símbolos con Python y MQL5 (Parte I): Fabricantes de circuitos integrados del NASDAQ
Acompáñenos mientras debatimos cómo puede utilizar la IA para optimizar el tamaño de sus posiciones y las cantidades de sus órdenes para maximizar la rentabilidad de su cartera. Mostraremos cómo identificar algorítmicamente una cartera óptima y adaptar su cartera a sus expectativas de rentabilidad o niveles de tolerancia al riesgo. En este debate, utilizaremos la biblioteca SciPy y el lenguaje MQL5 para crear una cartera óptima y diversificada utilizando todos los datos de que disponemos.
Optimización del modelo de nubes atmosféricas — Atmosphere Clouds Model Optimization (ACMO): Práctica Optimización del modelo de nubes atmosféricas — Atmosphere Clouds Model Optimization (ACMO): Práctica
En este artículo, seguiremos profundizando en la aplicación del algoritmo ACMO (Atmospheric Cloud Model Optimisation). En particular, discutiremos dos aspectos clave: el movimiento de las nubes hacia regiones de bajas presiones y la modelización del proceso de lluvia, incluida la inicialización de las gotas y su distribución entre las nubes. También analizaremos otras técnicas que desempeñan un papel importante a la hora de gestionar el estado de las nubes y garantizar su interacción con el entorno.