Reimaginando las estrategias clásicas (parte 16): Rupturas de las bandas de Bollinger dobles
Los mercados financieros no son simplemente máquinas estáticas y fijas que existen en estados discretos. Más bien, son sistemas vivos, dinámicos e inteligentes que reaccionan ante la información. Están en constante cambio y nunca se mantienen en un estado de forma permanente, pero la mayoría de las estrategias de negociación los tratan como si así fuera.
La mayoría de las estrategias de trading suelen clasificar el mercado como «en tendencia» o «en rango», y a continuación sugieren los pasos a seguir en función del estado del mercado identificado. El objetivo de este artículo es mostrar al lector que esta visión del mercado es demasiado simplista como para resultar práctica. Si queremos estrategias que realmente puedan adaptarse a unos mercados en constante cambio —mercados que, en ocasiones, pueden incluso comportarse de forma adversa—, necesitamos herramientas que acepten los mercados financieros tal y como son: un sistema en constante evolución y solo parcialmente observable.
Ahí es donde entran en juego estrategias de trading como el sistema de las bandas de Bollinger dobles. Se trata de una ampliación del sistema clásico, y se suele atribuir su origen a los traders institucionales. Está diseñado para adaptarse con flexibilidad a las condiciones cambiantes del mercado. Los resultados de las pruebas retrospectivas que mostraremos en breve respaldarán nuestras observaciones. La mayoría de las estrategias de trading con bandas de Bollinger se limitan a las reglas de los libros de texto y suelen dar por hecho que usted va a operar en condiciones de mercado favorables. Estas nos indican que debemos operar con las rupturas u operar en contra del movimiento del precio, pero no reflejan la compleja realidad de cómo se comportan realmente los mercados, que alternan constantemente entre situaciones favorables y desfavorables.
En nuestra metodología, hemos aplicado una variante muy conocida de la estrategia clásica de las bandas de Bollinger, que la mayoría de los traders de nuestra comunidad conocen bien. Esta versión de la estrategia estableció unos niveles de rentabilidad de referencia que la estrategia de bandas de Bollinger dobles debía superar. Como veremos en breve, cuando probamos la estrategia estándar de ruptura de las bandas de Bollinger, en realidad perdimos dinero.
Ambas estrategias se sometieron a prueba durante el mismo periodo histórico de cinco años, comprendido entre enero de 2020 y 2025. Siempre que nos fue posible, hicimos todo para garantizar que ambas estrategias se basaran en parámetros idénticos. La estrategia clásica generaba pérdidas de forma constante, mientras que el sistema de bandas de Bollinger dobles obtuvo unos resultados notablemente superiores, con parámetros fijos como el periodo de las bandas de Bollinger y el tamaño del lote utilizado. Sin duda, analizaremos estos resultados con más detalle. Pero, por ahora, resumiré brevemente nuestras principales conclusiones.
La estrategia clásica generó una pérdida bruta de -169 dólares en cinco años, mientras que el sistema de bandas de Bollinger dobles generó un beneficio bruto de 228 dólares en las mismas condiciones y utilizando parámetros fijos siempre que fue posible. Para garantizar una comparación equitativa, todas las operaciones se abrieron con el tamaño mínimo de lote y cada estrategia se limitó a una operación abierta a la vez. Además, la estrategia clásica también arrojó un ratio de Sharpe negativo de –0,53, mientras que la versión mejorada alcanzó un ratio de Sharpe positivo de 0,5. Esto supone una clara mejora en cuanto a rentabilidad y estabilidad.
En cuanto a la tasa de acierto, la estrategia clásica registró un 46 % de operaciones ganadoras a lo largo de cinco años, un resultado poco impresionante. No obstante, el sistema de bandas de Bollinger dobles logró un 56 % de operaciones ganadoras, lo que supone una mejora del 21 % en la tasa de acierto. Aún más llamativa resulta la forma asimétrica en la que modificamos la distribución de beneficios y pérdidas. La solución que presentamos al lector aumentó los beneficios brutos de la prueba retrospectiva en un 70 %, pero solo incrementó las pérdidas brutas en un 17 %. Este efecto asimétrico —en el que los beneficios crecen más rápido que las pérdidas— muestra cómo el sistema de bandas de Bollinger dobles modifica de forma favorable la distribución de las operaciones.
Por último, en cuanto a los cambios en el factor de beneficio, la estrategia original arrojó un valor de 0,82, lo que significa que perdió capital con el paso del tiempo. El sistema de bandas de Bollinger dobles mostró un factor de beneficio de 1,2, un indicador clave del crecimiento del capital, lo que supone una mejora del 50 % en dicho factor.
En conjunto, estos resultados sugieren que el sistema de bandas de Bollinger dobles no es simplemente una mejora con respecto al original, sino un cambio de paradigma. Así, representa una nueva familia de estrategias que comparten sus orígenes con el enfoque clásico, pero que modifican de forma fundamental su resultado. El sistema convirtió una estrategia perdedora en una ganadora, mejoró drásticamente la rentabilidad y lo hizo manteniendo un control extraordinario sobre el riesgo.
Y lo más importante: logró estas mejoras sin añadir una complejidad innecesaria. El sistema de bandas de Bollinger dobles sigue siendo fácil de aprender, aplicar e interpretar, pero ofrece ventajas mucho mayores. Esto es lo que más me entusiasma porque, en el futuro, si decidimos añadir complejidad —mediante modelos de aprendizaje automático para optimizar las entradas y salidas, o incluso controladores de retroalimentación para adaptarse a los patrones predominantes—, podremos estar seguros de que el esfuerzo merecerá la pena y de que la estrategia subyacente es rentable.
Incluso sin esas incorporaciones, el sistema de bandas de Bollinger dobles ya ofrece simplicidad con una ventaja operativa, una característica muy deseable para cualquier aplicación de trading. Empecemos.
Resumen de la estrategia de trading clásica
Vamos a empezar aplicando el indicador clásico de las bandas de Bollinger en nuestro gráfico, tal y como haríamos normalmente. Para este análisis, hemos seleccionado el par EURUSD y lo analizaremos en el marco temporal diario. Por lo tanto, en la figura 1 que aparece a continuación, hemos configurado las bandas de Bollinger para que utilicen un periodo de 20 velas diarias. Marcaremos nuestras bandas superior e inferior a 2 desviaciones estándar de la banda central, ya que esta es la configuración clásica.

Figura 1: Aplicación de nuestro indicador de bandas de Bollinger al par EURUSD con los parámetros clásicos
La versión clásica de la estrategia de negociación es sencilla. Siempre que el precio rompa al alza la banda superior, abriremos posiciones cortas. Y a la inversa: cuando el precio rompa a la baja la banda inferior, abriremos posiciones largas. El razonamiento en el que se basa la estrategia clásica de las bandas de Bollinger es que los mercados se mueven en ciclos de reversión a la media. Por consiguiente, se espera que, tras una ruptura de cualquiera de las bandas extremas, el precio vuelva a la banda central.

Figura 2: Visualización de la versión clásica de la estrategia de las bandas de Bollinger
Al igual que con cualquier estrategia de trading, existen limitaciones inherentes asociadas a las reglas de trading que hemos definido para la configuración clásica. Es bien sabido que las estrategias de negociación de este tipo son propensas a las falsas rupturas. En pocas palabras, las condiciones del mercado pueden evolucionar de forma lenta y gradual hasta el punto de activar nuestras señales de entrada, antes de cambiar bruscamente de rumbo y volver a su trayectoria original. Esas condiciones operativas acabarán agotando progresivamente el capital de cualquier inversor.
La figura 3 que aparece a continuación puede ayudar al lector a visualizar la debilidad de la estrategia que estamos señalando. En la imagen podemos ver dos oportunidades de venta que se han identificado correctamente siguiendo las reglas que hemos definido. Sin embargo, como podemos ver, solo una de las operaciones dio el resultado esperado. En la primera operación, delimitada por el recuadro verde, los niveles de precios volvieron a la banda central tras romper momentáneamente al alza la banda superior. Sin embargo, después pareció repetir el mismo patrón en el intervalo delimitado por las velas del recuadro rojo, pero se trató de una falsa ruptura. Los niveles de precios siguieron subiendo y no regresaron a la banda central como preveía la estrategia clásica.

Figura 3: Visualización de las limitaciones de la estrategia clásica de las bandas de Bollinger
Primeros pasos en MQL5
Al igual que con la mayoría de nuestras aplicaciones de trading, empezamos por definir las constantes del sistema. Estas definiciones constituyen la piedra angular de nuestras pruebas, pues permiten mantener fijos tantos parámetros como sea posible en ambos experimentos. Los parámetros importantes —el periodo de las bandas de Bollinger, los desplazamientos, los periodos de referencia de los indicadores, los marcos temporales y las desviaciones estándar utilizadas para las bandas— deben mantenerse fijos, ya que alteran considerablemente el comportamiento de la estrategia.
//+------------------------------------------------------------------+ //| DBB Benchmark.mq5 | //| Gamuchirai Ndawana | //| https://www.mql5.com/en/users/gamuchiraindawa | //+------------------------------------------------------------------+ #property copyright "Gamuchirai Ndawana" #property link "https://www.mql5.com/en/users/gamuchiraindawa" #property version "1.00" //+------------------------------------------------------------------+ //| System definitions | //+------------------------------------------------------------------+ #define BB_PERIOD 20 #define BB_SHIFT 0 #define ATR_PERIOD 14 #define ATR_PADDING 2 #define BB_SD_1 2 #define BB_SD_2 1 #define TF_1 PERIOD_D1Después de las constantes, definimos las variables globales. La mayoría de las variables globales están relacionadas con los indicadores técnicos en los que nos basamos y con la distancia a la que situaremos los niveles de stop-loss.
//+------------------------------------------------------------------+ //| Global variables | //+------------------------------------------------------------------+ int bb_handler,bb_handler_2,atr_handler; double bb_reading_u[],bb_reading_m[],bb_reading_l[],bb_reading_u_2[],bb_reading_m_2[],bb_reading_l_2[],atr_reading[]; double padding,close;
A continuación, importaremos las bibliotecas necesarias para realizar operaciones y registrar información sobre las operaciones, como los precios bid y ask. Las bibliotecas cumplen un papel importante en casi cualquier proceso de desarrollo de aplicaciones, ya que rara vez escribimos todo el código desde cero.
//+------------------------------------------------------------------+ //| Library | //+------------------------------------------------------------------+ #include <Trade\Trade.mqh> #include <VolatilityDoctor\Trade\TradeInfo.mqh> CTrade Trade; TradeInfo *TradeInfoHandler;
Cuando la aplicación se carga por primera vez, inicializamos las variables globales: estructuras de datos vacías y una nueva instancia de nuestra clase personalizada de información sobre las operaciones.
//+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- Setup our technical indicators bb_handler = iBands(Symbol(),TF_1,BB_PERIOD,BB_SHIFT,BB_SD_1,PRICE_CLOSE); bb_handler_2 = iBands(Symbol(),TF_1,BB_PERIOD,BB_SHIFT,BB_SD_2,PRICE_CLOSE); atr_handler = iATR(Symbol(),TF_1,ATR_PERIOD); TradeInfoHandler = new TradeInfo(Symbol(),TF_1); //--- return(INIT_SUCCEEDED); }
Cuando la aplicación deje de usarse, debemos recordar liberar los recursos de memoria previamente asignados a los identificadores de los indicadores que definimos anteriormente.
//+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- Release the indicators we are no longer using IndicatorRelease(bb_handler); IndicatorRelease(bb_handler_2); IndicatorRelease(atr_handler); }
En la configuración clásica de la estrategia, la lógica de entrada es sencilla y fácil de interpretar. Si el precio de cierre rompe al alza la banda superior de Bollinger, vendemos; si el precio de cierre rompe a la baja la banda inferior de Bollinger y no tenemos posiciones abiertas, compramos.
//+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- Keep track of time static datetime timestamp; datetime current_time = iTime(Symbol(),TF_1,0); if(timestamp != current_time) { //--- Update indicator readings CopyBuffer(bb_handler,0,0,1,bb_reading_m); CopyBuffer(bb_handler,1,0,1,bb_reading_u); CopyBuffer(bb_handler,2,0,1,bb_reading_l); CopyBuffer(bb_handler_2,0,0,1,bb_reading_m_2); CopyBuffer(bb_handler_2,1,0,1,bb_reading_u_2); CopyBuffer(bb_handler_2,2,0,1,bb_reading_l_2); CopyBuffer(atr_handler,0,0,1,atr_reading); //--- Get updated market readings close = iClose(Symbol(),TF_1,0); padding = atr_reading[0] * 2; //--- If we have no open positions if(PositionsTotal() == 0) { if(close > bb_reading_u[0]) Trade.Sell(TradeInfoHandler.MinVolume(),Symbol(),TradeInfoHandler.GetBid(),TradeInfoHandler.GetAsk()+padding,TradeInfoHandler.GetAsk()-padding); else if(close < bb_reading_l[0]) Trade.Buy(TradeInfoHandler.MinVolume(),Symbol(),TradeInfoHandler.GetAsk(),TradeInfoHandler.GetBid()-padding,TradeInfoHandler.GetBid()+padding); } } } //+------------------------------------------------------------------+
Una vez la aplicación haya terminado de ejecutarse, anulamos las definiciones de las constantes del sistema que definimos al principio; de nuevo, se trata de una buena práctica para el código MQL5.
//+------------------------------------------------------------------+ //| Undefine system definitions | //+------------------------------------------------------------------+ #undef BB_PERIOD #undef BB_SD_1 #undef BB_SD_2 #undef BB_SHIFT #undef ATR_PADDING #undef ATR_PERIOD #undef TF_1 //+------------------------------------------------------------------+
Cuando se hayan combinado todas las piezas, esta será la configuración de control de nuestra aplicación clásica.
//+------------------------------------------------------------------+ //| DBB Benchmark.mq5 | //| Gamuchirai Ndawana | //| https://www.mql5.com/en/users/gamuchiraindawa | //+------------------------------------------------------------------+ #property copyright "Gamuchirai Ndawana" #property link "https://www.mql5.com/en/users/gamuchiraindawa" #property version "1.00" //+------------------------------------------------------------------+ //| System definitions | //+------------------------------------------------------------------+ #define BB_PERIOD 20 #define BB_SHIFT 0 #define ATR_PERIOD 14 #define ATR_PADDING 2 #define BB_SD_1 2 #define BB_SD_2 1 #define TF_1 PERIOD_D1 //+------------------------------------------------------------------+ //| Global variables | //+------------------------------------------------------------------+ int bb_handler,bb_handler_2,atr_handler; double bb_reading_u[],bb_reading_m[],bb_reading_l[],bb_reading_u_2[],bb_reading_m_2[],bb_reading_l_2[],atr_reading[]; double padding,close; //+------------------------------------------------------------------+ //| Library | //+------------------------------------------------------------------+ #include <Trade\Trade.mqh> #include <VolatilityDoctor\Trade\TradeInfo.mqh> CTrade Trade; TradeInfo *TradeInfoHandler; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- Setup our technical indicators bb_handler = iBands(Symbol(),TF_1,BB_PERIOD,BB_SHIFT,BB_SD_1,PRICE_CLOSE); bb_handler_2 = iBands(Symbol(),TF_1,BB_PERIOD,BB_SHIFT,BB_SD_2,PRICE_CLOSE); atr_handler = iATR(Symbol(),TF_1,ATR_PERIOD); TradeInfoHandler = new TradeInfo(Symbol(),TF_1); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- Release the indicators we are no longer using IndicatorRelease(bb_handler); IndicatorRelease(bb_handler_2); IndicatorRelease(atr_handler); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- Keep track of time static datetime timestamp; datetime current_time = iTime(Symbol(),TF_1,0); if(timestamp != current_time) { //--- Update indicator readings CopyBuffer(bb_handler,0,0,1,bb_reading_m); CopyBuffer(bb_handler,1,0,1,bb_reading_u); CopyBuffer(bb_handler,2,0,1,bb_reading_l); CopyBuffer(bb_handler_2,0,0,1,bb_reading_m_2); CopyBuffer(bb_handler_2,1,0,1,bb_reading_u_2); CopyBuffer(bb_handler_2,2,0,1,bb_reading_l_2); CopyBuffer(atr_handler,0,0,1,atr_reading); //--- Get updated market readings close = iClose(Symbol(),TF_1,0); padding = atr_reading[0] * 2; //--- If we have no open positions if(PositionsTotal() == 0) { if(close > bb_reading_u[0]) Trade.Sell(TradeInfoHandler.MinVolume(),Symbol(),TradeInfoHandler.GetBid(),TradeInfoHandler.GetAsk()+padding,TradeInfoHandler.GetAsk()-padding); else if(close < bb_reading_l[0]) Trade.Buy(TradeInfoHandler.MinVolume(),Symbol(),TradeInfoHandler.GetAsk(),TradeInfoHandler.GetBid()-padding,TradeInfoHandler.GetBid()+padding); } } } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Undefine system definitions | //+------------------------------------------------------------------+ #undef BB_PERIOD #undef BB_SD_1 #undef BB_SD_2 #undef BB_SHIFT #undef ATR_PADDING #undef ATR_PERIOD #undef TF_1 //+------------------------------------------------------------------+
Ahora analizaremos el rendimiento de la aplicación a lo largo de los cinco años de la prueba retrospectiva. El beneficio neto total es de −169, un resultado poco destacable. El ratio de Sharpe es de −0,53, y el porcentaje de operaciones rentables es inferior al 50 %, situándose en el 46 %. En resumen, esta aplicación ofrece unos resultados peores que los que cabría esperar por puro azar y resulta sistemáticamente deficitaria.

Figura 4: Visualización de las estadísticas detalladas generadas por la estrategia de negociación clásica
La curva de capital de la estrategia clásica muestra una tendencia bajista persistente que se acentúa con el paso del tiempo.

Figura 5: La versión clásica de la estrategia de negociación muestra una tendencia negativa a lo largo del tiempo
Resumen de la estrategia de negociación revisada
La mejora es simple: en lugar de un único sistema de bandas de Bollinger, utilizamos dos conjuntos de bandas. La banda interior utiliza una desviación estándar menor, mientras que la banda exterior utiliza una mayor. Cuando se rompe la banda interior, lo interpretamos como una señal de seguimiento de tendencia; cuando se rompe la banda exterior (de dos desviaciones estándar), lo interpretamos como una señal de reversión a la media. En concreto, si se rompe al alza la banda superior del conjunto interior, compramos (seguimiento de tendencia); si se rompe al alza la banda superior del conjunto exterior, vendemos (reversión a la media). En las bandas inferiores se cumple lo contrario de estas reglas.
Para realizar esta estrategia, solo tenemos que modificar las reglas de entrada; la mayor parte del código permanece sin cambios.

Figura 6: Añadiremos un segundo filtro con un valor menor de desviación estándar de las bandas de Bollinger, pero mantendremos el periodo fijo
Podemos visualizar la versión revisada de la estrategia usando nuestro terminal MetaTrader 5. Tenga en cuenta que no es necesario que elimine el primer indicador que hemos aplicado ni que cambie a un nuevo gráfico. Si ha seguido los pasos hasta aquí, solo tiene que aplicar una segunda instancia del indicador de bandas de Bollinger en el mismo gráfico que ha seleccionado.

Figura 7: Visualización de la versión renovada de la estrategia clásica de las bandas de Bollinger
Puesta en práctica de nuestras mejoras
Ya estamos listos para poner en práctica las mejoras de la estrategia de las bandas de Bollinger dobles. //--- If we have no open positions if(PositionsTotal() == 0) { //--- Is the close price above the highest band? Buy if(close > bb_reading_u[0]) Trade.Buy(TradeInfoHandler.MinVolume(),Symbol(),TradeInfoHandler.GetAsk(),TradeInfoHandler.GetBid()-padding,TradeInfoHandler.GetBid()+padding); //--- Is the close price below the lowest band? Sell else if(close < bb_reading_l[0]) Trade.Sell(TradeInfoHandler.MinVolume(),Symbol(),TradeInfoHandler.GetBid(),TradeInfoHandler.GetAsk()+padding,TradeInfoHandler.GetAsk()-padding); //--- Is the close price above the mid-high band? Sell else if((close < bb_reading_u[0]) && (close > bb_reading_l[0]) && (close > bb_reading_u_2[0])) Trade.Sell(TradeInfoHandler.MinVolume(),Symbol(),TradeInfoHandler.GetBid(),TradeInfoHandler.GetAsk()+padding,TradeInfoHandler.GetAsk()-padding); //--- Is the close price below the mid-low band? Buy else if((close < bb_reading_u[0]) && (close > bb_reading_l[0]) && (close < bb_reading_l_2[0])) Trade.Buy(TradeInfoHandler.MinVolume(),Symbol(),TradeInfoHandler.GetAsk(),TradeInfoHandler.GetBid()-padding,TradeInfoHandler.GetBid()+padding); }
Realizaremos la prueba retrospectiva en el mismo periodo de cinco años, que abarca desde enero de 2020 hasta marzo de 2025.

Figura 8: Prueba de la versión mejorada de la estrategia de trading con bandas de Bollinger dobles
Como siempre, usamos retardos aleatorios en cada apertura de posición y realizamos las pruebas con ticks reales para emular mejor la latencia y la imprevisibilidad del mercado real.

Figura 9: Seleccione ajustes de retardo aleatorios para una emulación fiable de las condiciones reales del mercado
Al analizar las estadísticas detalladas de la estrategia mejorada, observamos un cambio evidente en todos los ámbitos. El beneficio neto total pasa a ser positivo y casi se duplica en términos absolutos en comparación con el sistema clásico. La ganancia esperada aumenta, el factor de beneficio mejora y el porcentaje de operaciones rentables se eleva hasta un 56 %, una cifra más atractiva. Con frecuencia, mejorar una estrategia reduce el número de operaciones y, al mismo tiempo, aumenta la rentabilidad. En este caso, sin embargo, tanto el número total de operaciones como el beneficio neto han aumentado. Esto sugiere que la versión mejorada detecta señales adicionales que el sistema original no era capaz de detectar.

Figura 10: La estrategia de negociación revisada ha mejorado considerablemente las estadísticas de rendimiento de nuestra aplicación de negociación
Por último, la curva de capital de la estrategia mejorada ha cambiado por completo: la tendencia negativa anterior se ha convertido ahora en positiva, y la nueva curva de capital está alcanzando máximos más altos que la antigua curva nunca habría podido alcanzar, por mucho tiempo que se hubiera mantenido activa.

Figura 11: La curva de capital generada por la estrategia de negociación revisada resulta finalmente rentable
Conclusión
Tras leer este artículo, el lector se dará cuenta de que las estrategias clásicas de negociación que creemos entender pueden, en realidad, encerrar un potencial aún no descubierto.
La API de MQL5 nos permite replantearnos estas estrategias. Gracias a unos métodos bien definidos y otras herramientas, puede abarcar una amplia variedad de aplicaciones de negociación, a pesar de que el tamaño de la API sea fijo. Sí, la API de MQL5 crece cada semana con nuevas actualizaciones, que se van incorporando constantemente al marco de trabajo de MQL5.
Pero incluso solo con las utilidades básicas, podemos crear de forma sistemática nuevas aplicaciones capaces de subsanar las carencias que presentan las estrategias clásicas. La API de MQL5 nos ofrece métodos con funcionalidades amplias y dinámicas, justo lo que necesitamos para crear aplicaciones más sensibles a los cambios en las condiciones del mercado, a diferencia de sus predecesoras clásicas, que solo analizaban los mercados en términos estáticos y binarios.
| Nombre del archivo | Descripción del archivo |
|---|---|
| DBB.mq5 | Estrategia de negociación revisada basada en las bandas de Bollinger dobles que hemos implementado para mejorar nuestros resultados. |
| DBB_Benchmark.mq5 | Implementación clásica de la estrategia de las bandas de Bollinger. |
Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/articles/19418
Advertencia: todos los derechos de estos materiales pertenecen a MetaQuotes Ltd. Queda totalmente prohibido el copiado total o parcial.
Este artículo ha sido escrito por un usuario del sitio web y refleja su punto de vista personal. MetaQuotes Ltd. no se responsabiliza de la exactitud de la información ofrecida, ni de las posibles consecuencias del uso de las soluciones, estrategias o recomendaciones descritas.
Creación de un sistema de trading (Parte 4): Cómo influyen las salidas aleatorias en la esperanza matemática del trading
Arbitraje estadístico mediante acciones cointegradas (Parte 5): Filtrado
Particularidades del trabajo con números del tipo double en MQL4
Herramientas de trading de MQL5 (Parte 9): Desarrollo de un asistente de configuración inicial del usuario para asesores expertos (EAs) con una guía desplazable
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso