English Русский 中文 Deutsch 日本語 Português Türkçe
Enfoque ideal sobre el desarrollo y el análisis de sistemas comerciales

Enfoque ideal sobre el desarrollo y el análisis de sistemas comerciales

MetaTrader 5Sistemas comerciales | 17 febrero 2021, 08:30
612 0
Evgeniy Ilin
Evgeniy Ilin

Introducción

En la actualidad, el comercio en fórex se está volviendo cada vez más popular, y no paran de surgir nuevas señales y sistemas comerciales. Esto resulta inevitable, ya que siempre ha habido mucha gente que quiere ganar dinero de forma rápida y simple. Además, con la expansión de la infraestructura de internet por todo el mundo, el mercado no hace otra cosa que crecer. Este sitio web es una buena muestra de ello. Probablemente sea el más grande y variado en términos de funciones: un lugar donde podemos comprar un producto o servicio, o contribuir a su desarrollo y ganar dinero. En este artículo, trataremos de enseñar qué criterios utilizar al elegir productos o señales de interés, además de mostrar qué dogmas se deben seguir al construir y usar sistemas comerciales propios.

La filosofía del autor

Vamos a hablar un poco de la motivación del autor y, especialmente, sobre los principios del enfoque usado para construir sistemas comerciales. Como ya mencionamos en su día, de la enorme cantidad de asesores diferentes escritos por el autor, la mayoría era para MetaTrader 4, porque puede resultar más simple y cómodo, aunque, claro está, es mejor acostumbrarse a MetaTrader 5. Normalmente, transferimos algunos sistemas a MetaTrader 5, aunque no siempre, todo depende de la situación.

Como herramienta para estudiar el mercado, MetaTrader 4 resulta mucho más simple y rápido, el código es más fácil de escribir, surgen menos problemas y por lo tanto menos errores. Obviamente, en cuanto a su funcionalidad, MetaTrader 5 es mucho más progresivo, no hay nada que discutir al respecto. Para entender el mercado, primero es necesario combinar teoría y práctica. MetaTrader 4 ofrece una parte práctica suficiente para nuestra meta.

Así, vamos a actuar según el siguiente principio: implementamos algo de la manera más simple y rápida posible, y luego observamos el resultado. Si el resultado muestra que algo funciona, o que algo se asemeja a algún tipo de patrón, intentamos añadir filtros, aumentar la intensidad de la señal y ver qué sucede. Si hay una mejora, intentamos entender la esencia del proceso, por qué mejora o empeora.

Además, necesitamos escribir los sistemas más diferentes y al mismo tiempo simples para ofrecer algo semejante a una cadena. Y es que si nos concentramos en un sistema y lo pulimos durante meses y años, lo más probable es que no lo consigamos. Al mismo tiempo, existe la opinión de que cuantos más parámetros de entrada tenga un sistema, y más código y complejidades posea, mejor será este. En realidad, todo resulta exactamente al contrario.

A veces podemos escribir asesores de 2000-3000 líneas de código y no tienen sentido, mientras que en otras ocasiones, escribimos código de trabajo para 20-50 líneas y, curiosamente, todo funciona inmediatamente a lo largo de la historia y también en múltiples monedas. La calidad de nuestro conocimiento del mercado es en realidad el punto decisivo. Un escritor de código talentoso no es aquel que escribe Skynet y no funciona en absoluto, sino el que sabe qué escribir, además de decidir si una cosa es necesaria o no en el sistema.

La ventaja de este enfoque es que cuanto más simple es el sistema en la salida, más fácil resultará arreglarlo y modificarlo. Otro punto interesante es que al principio nada funciona en absoluto, y luego de repente comienza a funcionar, mientras pensamos en una lógica, pero el asesor trabaja con una lógica completamente distinta e incomprensible que, en algunos casos, lleva años descifrar.

En el siguiente nivel, comenzamos a entender el mercado y casi todos los robots que escribimos se vuelven lo más simples posible, mientras que al mismo tiempo son tan rentables y estables como sea posible. Ahora estamos en este mismo nivel, aunque sabemos qué funciona y qué no, qué puntos debemos abordar y cuáles no. Habiendo alcanzado este nivel, podemos comprender que el 99% de la información que circula en el entorno comercial es una completa tontería, sin sustento alguno.

Un buen ejemplo son los patrones de velas o los indicadores. El resto de la información, por ejemplo, las tendencias y los flats con los que llenan la cabeza del lector, se tratan de tal manera que no pueden ponerse en duda. Parece que todos estos modelos existen y están presentes, y si hemos perdido, siempre podremos decir que no detectamos algo correctamente, por ejemplo, que la línea de tendencia se ha construido de forma incorrecta.

Sáquese todo esto de la cabeza y comience a pensar en lo que hace al precio moverse. Otros requisitos previos para que el lector tenga la oportunidad de encontrar algo son el conocimiento de las matemáticas y la capacidad de aplicarlas, la capacidad de analizar los resultados, aislar los momentos trascendentes desde el punto de vista del trabajo y comprender su física. Todo esto se logra solo con práctica y teoría. Al final, todo dependerá de la cantidad de sistemas comerciales que hayamos escrito y probado. No es necesario manejar el código de otra persona, escribiremos desde cero. Si alguien piensa que será capaz de codificar el mega grial y fabricar dinero, está equivocado. Eso hemos pensado todos durante años. Pero pensar es no saber.


Señales, asesores e indicadores

Todas estas herramientas están diseñadas para ayudar al tráder o suscriptor a comerciar en Fórex, además, cada una de ellas, si se usa correctamente, puede resultar útil: algunas incluso pueden hacernos ganar dinero. En este sentido, es muy importante tener una correcta comprensión de cada uno por separado, para poder formarse una visión adecuada de la situación en su conjunto. Lo más importante es comprender que cualquier servicio solo pretende ofrecer un medio, no una solución. Es muy importante comprender qué esconde realmente la etiqueta del precio. El autor no ha entendido estos problemas durante mucho tiempo, pero seguro que los conociemientos adquiridos servirán de ayuda a alguien. Otra de las posibles motivaciones es realizar un breve recorrido para abordar correctamente las ideas sobre el desarrollo de los sistemas comerciales propios.

Señales

Las señales están disponibles para comerciar con cuentas reales y demo. Las señales permiten monitorear nuestra propia cuenta comercial y las de otros tráders, y también suscribirnos a señales y copiar las transacciones de otro tráder. En nuestra opinión, no es recomendable suscribirse a señales cuyo tiempo medio de mantenimiento de posición sea inferior a un minuto. Resulta que estas transacciones son o bien de arbitraje o de scalpers. En ambos casos, estas estrategias son muy sensibles al ping, e incluso 10 milisegundos pueden ser suficientes para que una posición se abra de forma incorrecta. Cuanto mayor sea la duración promedio de la transacción, menor diferencia habrá respecto a la original.

A continuación, mostramos un ejemplo de una mala señal y una buena:

Señal segura:

 

Es segura porque la línea de los fondos está lo más cerca posible de la línea de balance, lo cual significa que no hay transacciones prolongadas, las posiciones se abren y cierran por turno, no hay técnicas de martingale y cuadrículas, y está claro que la señal es honesta y estable. Se parece mucho a una línea recta: una pequeña carga sobre el depósito y un alto porcentaje de transacciones ganadoras.

Siguiente señal:

 

En realidad, también es una señal bastante buena, pero merece la pena mirar más de cerca los grandes picos verdes hacia abajo, estos indican que el martingale se utiliza aquí activamente, y al comienzo de la prueba había un par de picos que podrían hacernos perder todo el dinero ganado. No hay garantías de que esta situación no suceda de nuevo en el futuro, o puede resultar que todo el depósito se pierda. No es un hecho, por supuesto, pero existen ciertos riesgos. A pesar de esto, el Mercado tiene una selección muy amplia de señales y, si lo deseamos, podremos encontrar opciones excelentes.

Asesores

Nadie publicará nunca un asesor estable y rentable en el Mercado sin considerar que la venta de este asesor le hará ganar mucho más que su propio uso no compartido. O también es posible una segunda opción, que el propio autor no esté seguro del sistema y no quiera correr riesgos invirtiendo grandes fondos en su depósito, comerciando al mínimo con riesgos mínimos. Para que la compra de un asesor resulte rentable, necesitaremos un gran depósito, por ejemplo, comprando un asesor por un año, que presumiblemente nos aportará 200$ partiendo de los 100$ iniciales y, al mismo tiempo, pagando 200$ por eso, no obtendremos nada incluso si el asesor permanece operativo...

El beneficio pronosticado debería ser al menos varias veces superior al precio del asesor. Además, debemos tener en cuenta que nadie nos garantizará que el rendimiento del asesor se mantenga duante el periodo que deseemos. Una ventaja adicional para el asesor sería su carácter multidivisa. El hecho es que si el asesor trabaja con al menos varios pares de divisas, significará que utiliza la física del mercado. Y esto ofrece una garantía de beneficios de casi el 100%. Como ejemplo, mostraremos el rendimiento del último sistema del autor y uno de los resultados en el recuadro en calidad de prueba real.

Primero, mostraremos el recuadro general de pruebas del asesor durante los últimos 10 años de la historia de las principales parejas de divisas:


Todos estos resultados se logran usando un archivo set único y sin configurar para una pareja de divisas específica, además, sin optimización.

Esta es una de las variantes del recuadro:

 

Hemos mostrado esta variante para confirmar que esto no es solo un recuadro tomado al azar, y también para que el lector pueda ver claramente qué valores se pueden alcanzar realmente usando un sistema de comercio automatizado. Hemos dado este ejemplo porque resulta bastante problemático encontrar estos asesores en el mercado. ¿Es posible?, sí, por supuesto, pero tendremos que buscar durante mucho tiempo, por lo que es más fácil mostrar nuestros propios resultados. Eso sí, aclaramos de inmediato que este asesor aún no se encuentra entre los productos del autor. Pero estamos seguros de que a aquellos que dudan de que se pueda crear un asesor así les resultará útil ver esto. Al comerciar, hemos utilizado un lote fijo 1.

Indicadores

Nuestra opinión respecto a los indicadores es más negativa que positiva; los indicadores son más para el trading manual que para el automático. Aunque podemos usarlos en el código, funcionan de forma extremadamente lenta y, en definitiva, dan un precio ligeramente modificado. Esto resulta natural cuando el indicador se dibuja en la ventana de cotizaciones. Si hablamos de indicadores en una ventana aparte, será solo el cálculo de alguna función; en muchos casos, se tratará de cálculos recurrentes, es decir, de valores que se calculan a partir de los anteriores. En ambos casos, la importancia de estas herramientas es muy limitada.

Nunca debemos esperar una señal como cruzamiento de indicadores o cruzamiento con nuestras líneas, se trata solo de un aspecto psicológico y nada más. En nuestras opinión, los indicadores más útiles son aquellos que detectan la geometría del mercado (los patrones). No obstante, deben usarse con una señal acústica. Además, si reaccionamos a tiempo a un patrón, la decisión de comercial dependerá solo de nosotros.

Es como si nos dijeran: prepárate, hay un punto interesante, pero nada más. En otras palabras, supongamos que tenemos un punto y el indicador lo considera interesante, pero el hecho de que él lo considere interesante, no necesariamente vuelve interesante al punto. Si los indicadores detectaran correctamente los puntos de entrada, ya se habría inventado un asesor experto que comerciara usando estos como base para obtener beneficios. Todos los indicadores que hemos probado, incluyendo el del autor, dejan bastante claro que no muestran los puntos de entrada, porque hemos hecho asesores expertos a partir de ellos, los hemos puesto a prueba y el resultado es cero. Son útiles solo como herramienta auxiliar para mejorar la precisión y, en general, para que todos los tráders puedan sentirse igual de tranquilos sobre la entrada y la salida.

Aquí también ofrecemos un ejemplo de nuestro propio indicador:


Es un ejemplo de un enfoque no estándar que define funciones matemáticas simples y busca estas mismas en el gráfico; si las encuentra, puede activar una señal acústica que nos informará de que se ha encontrado un patrón. Una vez más, insistiremos en que este indicador es solo una herramienta para ahorrar tiempo al comerciar. Estos indicadores pueden resultar realmente útiles para el comercio manual, pero aún así, la decisión final pertenece siempre al tráder.

Tras este breve recorrido por las posibilidades adicionales en cuanto a inversión y el trading, comenzaremos a analizar cuál es el proceso de prueba y desarrollo en el lenguaje matemático para una comprensión más profunda.

Las matemáticas de una búsqueda óptima

Si el objetivo final del desarrollo es obtener un n-ésimo número de sistemas que cumplan con nuestros requisitos, entonces nos surge la primera pregunta: ¿cómo de complejo debe ser un sistema para maximizar el rendimiento de nuestro trabajo? Podemos entender el rendimiento como la probabilidad de que el prototipo inicial se ajuste a los criterios de prototipo que hemos definido. En otras palabras, el prototipo debe propocionar ciertos indicadores ya en la etapa inicial, y trabajar con una pareja de divisas determinada o con varias de ellas. En nuestra opinión, siempre es mejor definir como criterio obligatorio la presencia de varias divisas. Como resultado, todo se reduce a algún tipo de dependencia que no se puede definir de manera fiable, pero que se puede probar a grandes rasgos mediante experimentos:

  • Ps=Ps(L)

Donde "L" es el número de líneas en el código de trabajo. En otras palabras, la probabilidad de que los primeros indicadores del sistema actual a crear se encuentren en un rango satisfactorio, depende directamente de la cantidad de código que escribamos. Podría parecer que cuantas más líneas tenga, mejor será el sistema, pero, en la práctica, este no es siempre el caso. Además, debemos comprender que:

  • T=K*L

Cuantas más líneas contenga el código, más tiempo tardará en desarrollarse. En primer lugar, no debemos pensar en cuántas líneas hay en nuestro código y en si nos criticarán porque 2 líneas de código funcionen como 2000, no: debemos pensar en el nivel de eficiencia de nuestro código y en cuántos sistemas aceptables podremos escribir en una unidad de tiempo. Después de todo, el resto de indicadores dependerá de este:

  • E= Ps/T
  • E --> Max

En otras palabras, debemos maximizar el índice "E" de todas las formas posibles. Los dos métodos principales son mejorar la calidad de nuestro conocimiento del mercado y encontrar el tamaño ideal para el código del prototipo. Tras decidir el tamaño del prototipo, y teniendo en cuenta nuestro conocimiento actual del mercado y nuestra capacidad para aplicarlo, obtendremos un cierto "E0", es decir, un cierto indicador de su eficiencia en este momento. También obtendremos el tiempo de desarrollo medio dedicado a 1 sistema.

La cosa es que el desarrollo siempre va seguido de un periodo de prueba y modificación, y este proceso también tiene su propia probabilidad. En este caso, se trata de la probabilidad de una modificación + la optimización exitosa. Uno es inseparable del otro. Resulta imposible realizar ediciones y modificaciones sin un proceso de prueba. Como resultado, todo se reduce a varios ciclos repetitivos de "prueba-conclusiones-modificación". De esta manera, desecharemos el sistema o lo mejoraremos, después de lo cual lo guardaremos para venderlo o bien usarlo nosotros mismos.

También debemos comprender que la optimización de nuestro enfoque sobre el desarrollo y las pruebas iniciales no garantiza que encontremos al menos uno de esos sistemas. Todo lo que podemos esperar es alcanzar la posibilidad máxima de obtener el resultado deseado. En este caso, además, necesitaremos saber cuánto tiempo tenemos para los procesos de desarrollo y las pruebas iniciales. Utilizando la fórmula de Bernoulli, podemos escribir: 

  • Pa=Suma(m0...m...n)[C(n,m)*Pow(Ps ,m)*Pow(1-Ps ,n-m)]
  • m0 — es el número mínimo de prototipos satisfactorios
  • Pa — es la probabilidad de que, como resultado del desarrollo, obtengamos al menos "m0" o más de "n" ciclos de desarrollo.
  • n — es el número máximo disponible de ciclos de búsqueda para los prototipos de trabajo

Utilizamos la suma en la fórmula porque nos convendrán aquellas opciones en las que el número de prototipos satisfactorios ha resultado ser superior a lo que necesitamos. En la parte inferior habrá otra fórmula en que usa la misma consideración.

Aquí resulta importante no sobrestimar las propias capacidades y no pensar que obtendremos muchos buenos prototipos. Después de todo, incluso si los encontramos, nadie puede garantizarnos que funcionarán como deseamos. Podemos contar con muchos prototipos simples o podemos contar con unos pocos más complejos. La decisión es suya. El autor confió en los simples.

Durante la modificación y la prueba, también hay indicadores que pueden y deben maximizarse. Comenzaremos con la probabilidad de encontrar una opción aceptable en el esquema de prueba. Todo el proceso de búsqueda de resultados aceptables para el prototipo seleccionado inicialmente se funde finalmente en un solo proceso de prueba-modificación-optimización. Se trata de un proceso por lotes que se puede describir usando la fórmula de Bernoulli:

  • Pf= Suma(1...m...n)[C(n,m)*Pow(Po,m)*Pow(1-Po,n-m)]
  • Po — es la probabilidad de que, como resultado de la iteración, obtengamos un resultado aceptable
  • n — es el número máximo de ciclos de búsqueda disponibles

En este caso, además, asumimos que necesitaremos al menos un evento satisfactorio durante la búsqueda de resultados aceptables. Es decir, tendremos un tiempo determinado para realizar las pruebas y modificaciones que finalmente se traducirán en el número de iteraciones disponibles (prueba o modificación), para encontrar en el prototipo algo más que el resultado inicial. Este resultado debe cumplir con nuestras necesidades. No necesitamos exigir el máximo "Pf", ya que el uso racional de nuestro tiempo resulta mucho más importante:

  • Ef= Pf/m
  • Ef--> Max

En esta etapa, lo importante es mantener un equilibrio entre las correcciones y las pruebas: es importante sentir cómo este o aquel parámetro influye en el resultado final y si tiene algún sentido en posteriores pruebas. El proceso de prueba y revisión siempre abarca aproximadamente el mismo tiempo, por consiguiente, "m" aquí es un número de pruebas que deberemos determinar por nuestra cuenta usando la intuición o la experiencia. No hay pautas ni recomendaciones específicas. Obviamente, podemos adoptar el esquema clásico, cuando tomamos "n" ciclos y observamos al final, pero, en muchos casos, podremos reducir el número de estas iteraciones y, por ejemplo, descartar el sistema ya en la etapa inicial, o viceversa, sacar una conclusión sobre su excelente rendimiento y flexibilidad. Siempre intentamos ceñirnos a este enfoque, porque ahorra tiempo, y el tiempo es lo más valioso que tenemos. Usando como base los hallazgos anteriores, podemos crear un indicador más completo y general sobre la efectividad de nuestro desarrollo, considerando que, de media, usa "m" pruebas en lugar de "n" completas:

  • ET= ( Ps*Pf)/(TSumm)
  • TSumm = T + m*Tm
  • Tm — es el tiempo medio del ciclo (simulación-modificación-optimización)

Dado que los eventos de las probabilidades Pf y Ps son inconsistentes, podemos crear un nuevo espacio de eventos en el que el nuevo evento sea la ubicación del prototipo. La comparación es después seguida por una mejora exitosa, que esencialmente indica el descubrimiento exitoso de un sistema comercial aceptable. Por lo consiguiente, multiplicamos las probabilidades para obtener la probabilidad de un evento dado.

De hecho, también sabemos que para cada variante que encontramos se necesita tiempo para desarrollar un prototipo "T" y modificar "m*Tm". Cuanto mayor sea la probabilidad de éxito respecto a un ciclo de desarrollo completo, más eficaz será nuestro enfoque. En parte, el tiempo final depende del tiempo de prueba. Inicialmente, hacíamos robots de ticks, pero les recomendamos que construyan solo prototipos que funcionen con barras. En primer lugar, el lector podrá acelerar la velocidad de las pruebas varias veces. En segundo lugar, se librará de los ticks y no perderá tiempo en pruebas basadas en ticks reales, y esto, créanos, acelerará mucho su desarrollo. A continuación, vamos a analizar qué criterios se pueden presentar a las estrategias y cuáles deben ser considerados.

Principales indicadores de la estrategia

Existen ciertos valores cuantitativos diseñados para valorar la calidad de la estrategia, y cada uno de ellos muestra determinadas características. Algunos valores son más importantes que otros, pero en general pueden decir todo sobre una estrategia. Existen los siguientes indicadores cuantitativos de una estrategia:

  • Esperanza matemática
  • Factor de beneficio
  • Reducción absoluta
  • Reducción relativa
  • Reducción máxima
  • Factor de recuperación
  • Porcentaje de transacciones rentables

Esperanza matemática

La esperanza matemática es el indicador más importante de cualquier asesor o sistema de comercio manual: si no logramos una buena esperanza matemática, nuestras posibilidades serán prácticamente nulas, excepto en los casos en los que simplemente hayamos tenido suerte. La esperanza matemática se da de dos tipos. En puntos y divisa del depósito.

  • M_Points=( Suma(1,n)(PrPoints[i]) - Suma(1,n)(LsPoints[i]) )/n
  • M=( Suma(1,n)(Pr[i]) - Suma(1,n)(Ls[i]) )/n

Donde:

  • PrPoints[i] — si la i-ésima transacción es rentable, esta magnitud será su beneficio en puntos
  • LsPoints[i] — si la i-ésima transacción no es rentable, esta magnitud representará sus pérdidas en puntos
  • Pr[i] — si la i-ésima transacción es rentable, esta magnitud será su beneficio en la divisa del depósito
  • Ls[i] — si la i-ésima transacción no es rentable, esta magnitud representará sus pérdidas en la divisa del depósito
  • n — número de transacciones

Debomos decir de inmediato que todas las cantidades que describiremos aquí no describen la estrategia con un 100% de precisión, ya que para poder definirlas con precisión, es necesario que n tienda a infinito. Pero incluso cuando no hay muchas transacciones, todos estos valores pueden decirnos con una fiabilidad muy alta todo lo que se puede revelar en principio sobre una estrategia en esta etapa.

Para que una estrategia sea rentable, este valor deberá ser superior a cero; en este caso, además, deberemos entender qué parte del beneficio se destina al spread, las comisiones, el swap, etc.

  • PrPoints[i]=PrPoints_0[i] - (SpreadOpen[i]/2 + SpreadClose[i]/2) - (OrderComission[i]/OrderLots[i])/TickValue + (OrderSwap[i]/OrderLots[i])/TickValue
  • Pr[i]=Pr_0[i] - (SpreadOpen[i]/2 + SpreadClose[i]/2)*OrderLots[i])*TickValue - OrderComission[i] + OrderSwap[i]

Vamos a hablar un poco de TickValue. Se trata del precio de un pip en la divisa de nuestro depósito, siempre y cuando jueguemos con un lote igual a 1. Este valor es diferente para todas las parejas de divisas y es considerado de forma que el cambio mínimo en el precio ofrezca el TickValue completo. En realidad, este es el parámetro más importante de la estrategia, ya que el spread, de hecho, supone esa parte de la esperanza matemática que le damos al bróker, por lo que debemos estar atentos a este indicador: si la esperanza matemática excede levemente el spread, todas las demás estrategias de indicadores no importarán.

Factor de beneficio

El factor de beneficio es la segunda característica más importante de nuestra estrategia. Si logramos una buena esperanza matemática, merece la pena mirar este indicador, ya que muestra la calidad de nuestra señal, es decir, la calidad del pronóstico. Cuanto mayor sea, mayor resultará el beneficio total de nuestras transacciones y menor la pérdida total de estas.

  • PrFactor = Suma(1,n)(Pr[i]) / Suma(1,n)(Ls[i])

Como se puede ver en la fórmula, si el denominador de esta fórmula se vuelve cero, entonces el factor de beneficio no se podrá calcular o, formalmente, se podrá suponer que este es el límite cuando el denominador tiende a cero desde la parte positiva del argumento. El límite es igual a más infinito, es decir, si no hay transacciones no rentables, este indicador pasa al infinito, y si no hay transacciones rentables, este indicador cambia a "0". Resulta que el intervalo de valores de esta magnitud es [0,+infinito]. El valor medio aquí es el número 1: todo lo superior es rentable, y lo inferior, no lo es.

Los siguientes en importancia son 2 parámetros, que de hecho indican lo mismo, pero de una manera ligeramente distinta. Ambos parámetros reflejan la misma magnitud, solo que de manera levemente diferente.

Reducción máxima

La reducción máxima supone la diferencia máxima entre dos máximos adyacentes y el mínimo de los fondos, si asumimos que primero se alcanza el máximo y luego el beneficio disminuye hasta el siguiente mínimo. Si designamos los precios de la matriz de vértices con PriceExtremum[i], entonces la reducción máxima será:

  • MaximumDrawdown = MaxOf( PriceExtremum[i+1]- PriceExtremum[i] )

Si existen 2 o más estrategias con el mismo beneficio final, entonces resultará mejor la que tenga una menor reducción máxima, lo cual muestra en realidad el siguiente indicador sin la necesidad de hacer esta suposición:

Factor de recuperación

Casi idéntico al anterior, salvo que el beneficio está presente en la fórmula:

  • RecoveryFactor = TotalProfit/MaximumDrawdown

Este valor muestra exactamente lo mismo que la reducción máxima, y honestamente desconocemos por qué se utilizan estos dos valores, ya que la última opción resulta más informativa. Cuanto mayor sea el factor de recuperación, más estable resultará nuestra estrategia. Por ejemplo, cuanto más alto sea este indicador, más adecuada será la estrategia de utilización de martingale, ya que la secuencia de pérdidas se hará menor y, en caso de sufrir pérdidas, podremos comenzar a aumentar el lote sin miedo a que el depósito se esfume.

Porcentaje de transacciones ganadoras

Este criterio solo resulta relevante en situaciones en las que el valor promedio de una transacción ganadora es muy cercano o igual al valor promedio de una transacción perdedora. De hecho, estamos acostumbrados a un nivel del 50%, y todo lo que se encuentre por encima significa que la estrategia es rentable, de lo contrario, será perdedora. Cabe destacar el nivel del 60%: en nuestra opinión, esta línea es bastante importante, especialmente para un sistema de trading manual, ya que este indicador influye intensamente en cualquier tráder. Pero no hay nada en este indicador que el propio factor de beneficio no pueda decirnos sobre el sistema; además, este indicador no siempre resulta informativo.

  • WinPercent= (100*NProfit)/(NProfit + NLoss)

Reducción absoluta

Este valor es importante cuando nuestra estrategia tiene una gran carga en el depósito o cuando la forma de la curva del balance no resulta muy similar a una línea recta, sino que muestra una forma caótica con una tendencia ligeramente pronunciada hacia la ganancia, o al menos si hay algunos motivos previos para esto en el futuro. Podría parecer que la reducción absoluta puede indicarnos el depósito mínimo con el que no perderemos los fondos, pero esta lógica resulta ilusoria y no recomendamos a nadie que se someta a estos pensamientos. Este valor es igual a la diferencia entre el balance inicial y el punto inferior en el gráfico de balance para el área en la que realizamos las pruebas o comerciamos:

  • AbsoluteDrawdown = StartBalance - MinimumBalance
Reducción relativa

En opinión del autor, este valor resulta más informativo como indicador de la rentabilidad o la estabilidad de un sistema de negociación, ya que tiene en consideración el beneficio total. La diferencia es aproximadamente la misma que hay entre la reducción máxima y el factor de recuperación:

  • 100*AbsoluteDrawdown/EndProfit

El valor se mide en tanto por ciento y muestra cuánto influye la reducción absoluta en el beneficio final. El contenido informativo de este factor también es muy limitado. Cuanto menor sea este valor, mejor será la estrategia.

Otros parámetros de la estrategia

También hay algunos parámetros menos importantes en la estrategia, pero no conviene subestimarlos.

  • Beneficio máximo
  • Pérdidas máximas
  • Beneficio promedio
  • Pérdidas promedio
  • Serie máxima de transacciones ganadoras
  • Serie máxima de transacciones perdedoras
  • Serie promedio de transacciones ganadoras
  • Serie promedio de transacciones perdedoras

Beneficio máximo

Entre todas las transacciones ganadoras, buscamos una cuyo beneficio adquiera el valor máximo. Este indicador puede mostrarse en la divisa del depósito, o en puntos, todo dependiendo de para qué necesitamos este valor. La importancia de este indicador resulta bastante abstracta, al igual que el siguiente indicador.

Pérdidas máximas

Valor idéntico al anterior, salvo que buscamos el valor máximo en el módulo de una transacción perdedora entre todas las perdedoras.

Beneficio promedio

El beneficio promedio es la suma de los beneficios de todas las transacciones dividida por el número de estas. Por sí mismo, este parámetro es informativo solo cuando la esperanza matemática y el factor de beneficio son positivos. En otros casos, resulta totalmente inútil.

  • MiddleProfit= Sum(Pr[i])/n;

Pérdidas promedio

Similar al beneficio promedio, solo que utilizando las transacciones perdedoras:

  • MiddleLoss= Suma(Ls[i])/n;

Serie máxima de transacciones ganadoras

Este parámetro resulta muy útil, ya que si está delimitado por la parte superior, es ideal para usar un martingale inverso. Cuanto menor sea el número de transacciones ganadoras, mejor para el martingale inverso.

Serie máxima de transacciones perdedoras

Si la reducción de la serie máxima de transacciones ganadoras permite el uso de martingale inverso, la limitación de este valor nos permitirá usar el martingale directo. Si de alguna manera tenemos una limitación de esa cantidad en cualquier señal, podremos usar el martingale para ganar dinero de manera rápida y segura sin temor a perder el depósito.

Serie promedio de transacciones ganadoras

El indicador es casi equivalente al porcentaje de transacciones ganadoras, de hecho, muestra casi el mismo indicador que el sistema comercial, solo que un poco distinto

  • MiddleWins= Suma(Wins[i])/n

donde Wins[i] — es la longitud de una media onda concreta. Si dividimos el gráfico de balance entero en áreas ascendentes y descendentes, seleccionamos solo las ascendentes y contamos el número de segmentos (o transacciones, que es lo mismo) en ellas, calculando también el número de medias ondas (ascendentes), que será "n", entonces podremos calcular el indicador en sí, que no es más que la media aritmética de ciertas medias ondas.

Serie promedio de transacciones perdedoras

Es un indicador similar, con la única diferencia de que se calculan medias ondas negativas:

  • MiddleLosses= Suma(Loss[i])/n

Los complementos del autor

Creo que para una valoración más completa de la estrategia, podemos introducir un indicador más que ofrezca una valoración más completa de la estrategia:

  • Factor de linealidad

Este indicador muestra la desviación de la curva de balance respecto a la línea recta que conecta el principio y el final del gráfico de balance. Cuanto más se parezca el gráfico de saldo a una línea recta al comerciar con un lote fijo, mejor será el sistema encontrado. Esto nos ofrece una mayor probabilidad de poder trabajar en el futuro. Este indicador es especialmente útil si estamos comerciando con un lote fijo. El asunto es que la volatilidad del mercado varía y salta constantemente, lo cual significa que el tamaño promedio de las velas o la dinámica general del mercado cambia, que es esencialmente lo mismo. Si comprendemos estos puntos, podremos entender por qué algunas estrategias sufren una atenuación de la esperanza matemática al final de la prueba, o bien la situación opuesta, lo cual indica que el gráfico resulta muy curvo, y comienza a irritarnos o confundirnos porque no existen garantías de que aparezca un ángulo de inclinación en el futuro y, por consiguiente, de que la esperanza matemática sea estable.

  • LinearFactor = MaxDeviation/EndBalance
  • MaxDeviaton = Max(MathAbs(Balance[i]-AverageLine))
  • AverageLine=StartBalance+K*i
  • K=(EndBalance-StartBalance)/n
  • n - número de transacciones en la prueba

La razón por la que no existen tales indicadores en los simuladores de estrategias de MetaTrader 4 y MetaTrader 5 es muy sencilla: siempre se necesitan 2 pasadas para calcular dichos indicadores, ya que ellos muestran el beneficio final. Cuanto menor sea este indicador, mejor será la estrategia. Si lo deseamos, podemos medirlo en tanto por ciento.

Podemos mostrar la figura siguiente para hacer todo más comprensible:


En qué indicadores debemos concentrarnos al probar o revisar un sistema

En nuestra opinión, solo hay algunos indicadores sistémicos básicos que debemos tener en cuenta:

  • Esperanza matemática en puntos
  • Factor de beneficio o su equivalente
  • Reducción máxima
  • Serie máxima de transacciones perdedoras
  • Factor de linealidad

¿Por qué hemos elegido esta combinación como la más importante? Esto se debe a que resulta muy difícil utilizar todos los demás parámetros como información adicional sobre el sistema o el mercado; en cualquier caso, todavía no hemos encontrado algoritmos que sean capaces de explotar estos indicadores y ni siquiera hay una razón para usarlos. En opinión del autor, no es necesario complicar algo simple, y estos indicadores no suponen más que un intento de complicar algo que en realidad es mucho más sencillo. Esto confunde a los tráders, desviándolos de los temas realmente importantes.

Vamos a intentar describir la selección de estos criterios en un lenguaje sencillo, reflexionando también sobre ello:

Primero, para que una estrategia resulte rentable, es necesario conseguir una esperanza matemática en puntos que supere la magnitud spread+comisión+swap, por supuesto, midiéndola en puntos. La esperanza matemática debe ser preferiblemente al menos el doble del valor spread+comisión+swap promedio, con lo cual compensaremos las pérdidas y obtendremos un beneficio mayor o igual al módulo de este indicador.

Una vez estamos convencidos de la rentabilidad de la estrategia, deberemos preocuparnos de la calidad de la previsión. El factor de beneficio no es más que la calidad del pronóstico. Cuanto más alto sea el indicador, mejor será la calidad de nuestro pronóstico. Y cuanto mejor sea la calidad del pronóstico, más afectará este valor a todos los demás. De hecho, si pudiéramos abstraernos de la esperanza matemática, el valor más importante sería el factor de beneficio. Todos los demás indicadores disponibles dependen de su valor, ya sea directa o indirectamente.

Además, si hemos conseguido unos indicadores de rentabilidad que nos convienen, merece la pena pensar en la reducción máxima. La reducción máxima responde de forma directa y sencilla a la pregunta del depósito mínimo requerido para no perder el depósito y al mismo tiempo asegurar la máxima rentabilidad en esta etapa del depósito. Usando la reducción máxima como base, podemos elegir el depósito inicial de tal forma que nos aseguremos el máximo porcentaje anual de beneficio, sin temer prácticamente la pérdida total del mismo. Si estamos seguros de que la serie máxima de transacciones perdedoras o la reducción máxima tienen valores extremos, entonces podemos usar un martingale en esta señal sin temor a perderlo todo.

El factor de linealidad nos ahorrará las dudas sobre si se trata de una regularidad o un resultado accidental, porque cuanto más se parezca un gráfico a una línea recta, más probable será que se trate de una regularidad real o una característica del mercado.

Además, otro factor que muy pocas personas creen importante es el momento de la prueba. Cuanto más tiempo se ponga a prueba un sistema (mostrando en este caso indicadores de rentabilidad similares), más probable será que dicho sistema refleje un patrón global, y no un resultado aleatorio.

Balance y equidad

Esta pregunta resulta de gran importancia para los principiantes, especialmente para aquellos que no ven la diferencia entre estos valores. La equidad es el beneficio actual no registrado, mientras que el balance es la beneficio actual registrado. La diferencia reside en que, básicamente, todo el mundo se queda mirando la línea de balance, pero no la de equidad, porque aquella es más llamativa. Hablando con rigor, en los buenos sistemas comerciales, la equidad está lo más cerca posible de la línea de balance. Esto sugiere que la estrategia no usa ninguna trampa, como cuadrículas o martingales, o pirámides. Por supuesto, no estamos diciendo que estos enfoques no funcionen, pero sin una buena señal, esto son solo distracciones, seamos honestos. Los artículos anteriores pueden confirmarlo. En el simulador de estrategias MetaTrader 5 y en el sitio web de MQL5, la línea de balance se muestra en azul oscuro, mientras que la línea de equidad se muestra en verde. Cuanto más cerca se encuentre la línea de equidad respecto a la línea de balance, más segura será la estrategia, obviamente, siempre que ambas líneas asciendan. 

Los indicadores de un sistema comercial real y su viabilidad

Planteamos esta pregunta basándonos en nuestra práctica y en los sistemas comerciales de la vida real que hemos escrito. Al mismo tiempo, nuestro objetivo es lograr que los lectores comprendan todo lo mejor posible y, lo que es más importante, puedan protegerse lo mejor que puedan contra las inversiones en señales o asesores que en realidad solo suponen un bonito envoltorio. La experiencia nos dice que los sistemas que se han probado durante menos de 10 años de historia tienen un mayor riesgo de resultar inoperantes. Y si el área probada tiene 2 años o menos, entonces no nos merece la pena mirar esos sistemas en absoluto.

La práctica nos muestra que un sistema que sea capaz de comerciar de forma rentable a lo largo de su historia tendrá alrededor de 5-50 puntos de esperanza matemática, con un factor de beneficio en el rango de 1.05-3.0. El marco temporal M5 nos gusta mucho, ya que todos los sistemas de trabajo que hemos creado funcionaron en este marco temporal, y si el lector quisiera, podría ejecutarlos en M1. Este también es un gráfico muy bueno, probablemente debido a que son las barras más pequeñas y contienen más información por unidad de tiempo ( High[i],Low[i],Close[i],Open[i] ). Estos puntos de las barras son en realidad ticks reales guardados, y cuanto más corto sea el periodo del gráfico, más ticks reales se almacenarán dentro de las velas. Esto resultará de gran importancia para muchos sistemas al probar un sistema en el simulador, a menos que, por supuesto, usemos ticks reales.

Nunca hacemos pruebas con ticks reales, porque ya hemos adoptado un concepto durante mucho tiempo. Todos nuestros asesores expertos trabajan para cerrar la barra, por lo que no debemos preocuparnos por generar ticks artificialmente, porque cerrar una barra supone siempre un tick real. Si realizamos una valoración media, el factor de beneficio promedio de los sistemas encontrados ha sido de aproximadamente 1,2, y la esperanza matemática de aproximadamente 15 puntos. Esto se debe a que hemos usado marcos temporales bastante bajos. Resulta mucho más complicado encontrar algo que funcione en marcos temporales prolongados, pues, si bien aumentará la esperanza matemática, el factor de beneficio difícilmente lo hará.

Otro punto muy importante es que muchos vendedores escriben que, supuestamente, el asesor debe ser optimizado, y después escriben incluso el tiempo previsto antes de la reoptimización. No se deje engañar por semejantes afirmaciones: resulta imposible predecir de forma alguna el futuro tiempo de funcionamiento de un asesor. Le recomendamos igualmente que olvide la palabra "optimización" hasta que aprenda a usar esta herramienta. Podremos optimizar cualquier cosa y ajustar el resultado deseado, pero lo más probable es que el resultado sea solo accidental. Necesitamos optimizar de manera competente y opcional. Pocas veces utilizamos esta herramienta, incluso se podría decir que casi nunca: hacemos todo manualmente y esto es lo correcto. El cerebro humano es un sistema mucho más eficiente que la iteración de parámetros por fuerza bruta.

Cómo poner a prueba correctamente un sistema

Personalmente, probamos nuestros propios sistemas y los de otros, aunque, por supuesto, casi siempre probamos los propios, usando el siguiente enfoque:

Para la primera prueba, siempre seleccionamos el último año contando desde la fecha actual. Si la prueba es satisfactoria, tomamos algunos gráficos más. Es importante entender que, para un análisis integral, necesitamos tener un área de al menos 10 años, o mejor de 20.

Si el primer y el último año son buenos, entonces deberíamos acercarnos unas cuantas áreas más hacia la mitad. Si todo resulta aceptable, merece la pena probarlo cada 10 años y valorar la curva de balance y la equidad. Si resultan lo más planas posible y se asemejan a una línea recta, probablemente el sistema merezca la pena. Este enfoque tiene un único objetivo: ahorrar tiempo y maximizar la calidad de los sistemas resultantes.

Una vez realizado este análisis, podemos pensar cómo actuar a continuación. Para reforzar aún más la confianza en el sistema, deberemos probarlo utilizando algunas parejas de divisas más, y si conserva al menos parte de su rendimiento, será porque el sistema se basa en la física del mercado y se puede mejorar. Vamos a probar los principales parámetros del sistema uno a uno y ver cómo afectan al resultado. En la mayoría de los casos, parece que la influencia de un parámetro dado es prácticamente independiente de otro.

Tras conseguir el mejor rendimiento, podemos comenzar a probar el sistema en una cuenta demo. Si el sistema muestra un resultado aceptable en dicha cuenta, podemos probar con una cuenta real. Nuevamente, otra ventaja del funcionamiento del asesor experto con barras es que el resultado de la cuenta demo no se diferenciará del resultado de la cuenta real, siempre que, por supuesto, tengamos un bróker adecuado. Personalmente, recomendamos Alp***. Podrá completar la palabra por sí mismo. Datos históricos de este bróker sin distorsión. No recomendamos probar los robots de ticks aún, no existe ninguna garantía. Solo le sugerimos utilizar aquellos que funcionen con el cierre o la apertura de una barra.

Parámetros de las barras

Para entender correctamente las cotizaciones, es necesario considerar qué es una barra o vela y qué datos contiene, y qué información podemos obtener en función del tipo de barra o vela en sí. Una barra o vela es un segmento de la historia de ticks de una longitud fija, en el que no se guardan todos los ticks, sino el tick inicial, el tick final, el tick máximo y el tick mínimo, así como la hora de apertura de la barra modificada en datetime. Este valor representa el número de segundos transcurridos desde el 1 de enero de 1970. Hay 6 valores dentro de la barra:

  • Close[]
  • Open[]
  • Low[]
  • High[]
  • Time[]
  • Volume[]

Los 4 primeros son, respectivamente, los 4 ticks almacenados en la barra, mientras que el resto son la fecha y la hora de apertura de la barra y su volumen. El volumen se refiere al número de ticks que caben en una barra determinada. Obviamente, los datos más importantes son los datos de precios, pero podríamos decir que la fecha y la hora y los volúmenes no son menos importantes. Durante mucho tiempo, no le dimos importancia a estos valores, pero si procesamos esta información correctamente, podemos encontrar buenas señales. Las barras y las velas son iguales, solo que ofrecen diferentes representaciones gráficas de los mismos valores:


Existen diferentes métodos para analizarlas, incluso se introducen la clasificación y los nombres de cierto tipo de barras. No le recomendamos que se tome estas metodologías como algo personal, porque son tan solo información gráfica. Solo puede ayudarnos en conjunto con los indicadores y otros métodos de análisis.

Escribimos y probamos un asesor experto simple usando volúmenes

Como ejemplo de un enfoque competente, consideraremos la posibilidad de escribir un asesor experto que use volúmenes y franjas temporales como información adicional sobre el mercado y los límites comerciales. La idea es que al corregir los picos de volumen, podamos encontrar puntos de decisión importantes por parte de los jugadores y, limitando el tiempo de trabajo del servidor del asesor, encontrar áreas en las que los volúmenes sean cruciales. Vamos a escribir un asesor; luego realizaremos varias pruebas y un análisis completo, sacando las conclusiones pertinentes sobre el sistema. Obviamente, el sistema en sí sirve solo para sumergirse y estudiar la relación entre los parámetros del mercado. Principalmente, necesitamos el sistema para mostrar que cada parámetro de barra tiene su propio peso y contribuye a la calidad general del sistema. Adjuntaremos el propio asesor al final artículo, para que el lector pueda usarlo y modificarlo como desee.

Vamos a comenzar con las bibliotecas para trabajar con posiciones, que conocemos ya hasta la saciedad:

#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
CPositionInfo  m_position=CPositionInfo();// trade position object
CTrade         m_trade=CTrade();          // trading object

Las necesitamos esencialmente para simplificar el código. No explicaremos qué y cómo funciona ahí, podrá encontrar información completa en el sitio web.

A continuación, definimos una lista numerada para poder cambiar el modo de funcionamiento:

enum MODE_CALCULATE
   {
   MODE_1=0,
   MODE_2=1,
   MODE_3=2,
   MODE_4=3
   };

Esto se hace para que tengamos varias formas de determinar la fórmula de mercado más eficaz. Inicialmente, debemos tener algunas ideas generales sobre qué física queremos explorar, pero, en la práctica, no sabemos qué fórmula será la más efectiva para nosotros. En este robot, hemos creado 4 variantes de la fórmula; a continuación, veremos cuál de ellas describe mejor el mercado. No merece la pena que implementemos muchos modos, ya que si hay algo de verdad en nuestro supuesto, ciertamente lo veremos. Normalmente no hacemos más de 4 modos.

A continuación, vamos a definir los parámetros de entrada y todo lo que necesitamos:

input MODE_CALCULATE MODEE=MODE_1;//Mode
input int TradeHour=0;//Start Trading Hour
input int TradeMinute=1;//Start Trading Minute
input int TradeHourEnd=23;//End Trading Hour
input int TradeMinuteEnd=59;//End Trading Minute

input bool bWriteValuesE=false;//Log
input int CandlesE=50;//Bars To Analyse
input int Signal=200;//Signal Power
input int PercentE=52;//Percent Signals To One Side

input bool bInvert=false;//Trade Invert

input int SLE=3000;//Stop Loss Points
input int TPE=3000;//Take Profit Points
input double Lot=0.01;//Lot

input int MagicF=15670867;//Magic

Tras el modo de trabajo, viene un bloque de 4 parámetros en el que deberemos describir la franja temporal del servidor en la que abriremos las posiciones (o la sesión comercial). Por extraño que parezca, es mucho lo que depende de ese valor. A continuación, tenemos el bloque de parámetros de trabajo, que describe las variables más importantes para el sistema. De ser necesario, podemos registrar la información sobre el estado actual de los valores monitoreados en el log, para que podamos ajustar los parámetros de entrada al cambiar de modo.

Luego, viene el trozo del mercado en barras que vamos a analizar. Todas las velas de la historia posteriores no se tendrán en cuenta en el cálculo. A continuación, tenemos la fuerza de la señal, que posee diferentes escalas para cada modo; precisamente para ello necesitamos el log. Y en último lugar, tenemos el elemento de control adicional de la señal. Después de todo, puede suceder que la señal sea grande, pero si no entendemos qué porcentaje de la mayoría de la señal supone respecto a todas las señales, no tendrá sentido definir la intensidad de esa señal. Estas últimas variables permiten invertir el comercio, definir el stop loss y el take profit, y también el volumen y número mágico de todas las órdenes.

Para calcular rápida y cómodamente los valores de matriz predefinidos, debemos introducir las siguientes funciones:

MqlTick LastTick;//the last tick

double High[];
double Low[];
double Close[];
double Open[];
datetime Time[];
long Volume[];

void DimensionAllMQL5Values()//prepare the arrays
   {
   ArrayResize(Time,CandlesE,0);
   ArrayResize(High,CandlesE,0);
   ArrayResize(Close,CandlesE,0);
   ArrayResize(Open,CandlesE,0);   
   ArrayResize(Low,CandlesE,0);
   ArrayResize(Volume,CandlesE,0);
   }

void CalcAllMQL5Values()//recalculate the arrays
   {
   ArraySetAsSeries(High,false);                        
   ArraySetAsSeries(Low,false);                              
   ArraySetAsSeries(Close,false);                        
   ArraySetAsSeries(Open,false);                                 
   ArraySetAsSeries(Time,false); 
   ArraySetAsSeries(Volume,false);                                   
   CopyHigh(_Symbol,_Period,0,CandlesE,High);
   CopyLow(_Symbol,_Period,0,CandlesE,Low);
   CopyClose(_Symbol,_Period,0,CandlesE,Close);
   CopyOpen(_Symbol,_Period,0,CandlesE,Open);
   CopyTime(_Symbol,_Period,0,CandlesE,Time);
   CopyTickVolume(_Symbol,_Period,0,CandlesE,Volume);
   ArraySetAsSeries(High,true);                        
   ArraySetAsSeries(Low,true);
   ArraySetAsSeries(Close,true);                        
   ArraySetAsSeries(Open,true);                                 
   ArraySetAsSeries(Time,true);
   ArraySetAsSeries(Volume,true);
   }

Ya les hemos mostrados estas funciones en artículos anteriores, pero de una forma más abreviada; asismismo, tenemos la variable LastTick, en la que guardaremos el valor de todos los parámetros del último tick que ha llegado del servidor. Estos son necesarios para acceder a las matrices, como en MQL4.

Aquí les mostramos las variables principales y la lógica en una clase estática:

class TickBox
   {
   public:
   static int BarsUp;
   static int BarsDown;
   static double PowerUp;
   static double PowerDown;
   static double PercentUp;
   static double PercentDown;
   static double PercentPowerUp;
   static double PercentPowerDown;

   static void CalculateAll(MODE_CALCULATE MODE0)//calculate all the necessary parameters
      {
      BarsUp=0;
      BarsDown=0;
      PercentUp=0.0;
      PercentDown=0.0;
      PowerUp=0.0;
      PowerDown=0.0;
      if ( MODE0 == MODE_1 )
         {
         for ( int i=0; i<CandlesE; i++ )
            {
            if ( Open[i] < Close[i] )
               {
               BarsUp++;
               PowerUp+=(MathAbs(Open[i] - Close[i])/(High[i] - Low[i]))*Volume[i];
               } 
            if ( Open[i] > Close[i] )
               {
               BarsDown++;
               PowerDown+=(MathAbs(Open[i] - Close[i])/(High[i] - Low[i]))*Volume[i];
               } 
            }
         }
         
      if ( MODE0 == MODE_2 )
         {
         for ( int i=0; i<CandlesE; i++ )
            {
            if ( Open[i] < Close[i] )
               {
               BarsUp++;
               PowerUp+=(MathAbs(Open[i] - Close[i])/_Point)*Volume[i];
               } 
            if ( Open[i] > Close[i] )
               {
               BarsDown++;
               PowerDown+=(MathAbs(Open[i] - Close[i])/-_Point)*Volume[i];
               } 
            }
         }
         
      if ( MODE0 == MODE_3 )
         {
         for ( int i=0; i<CandlesE; i++ )
            {
            if ( Open[i] < Close[i] )
               {
               BarsUp++;
               PowerUp+=(double(CandlesE-i)/double(CandlesE))*(MathAbs(Open[i] - Close[i])/_Point)*Volume[i];
               } 
            if ( Open[i] > Close[i] )
               {
               BarsDown++;
               PowerDown+=(double(CandlesE-i)/double(CandlesE))*(MathAbs(Open[i] - Close[i])/_Point)*Volume[i];
               } 
            }
         }
         
      if ( MODE0 == MODE_4 )
         {
         for ( int i=0; i<CandlesE; i++ )
            {
            if ( Open[i] < Close[i] )
               {
               BarsUp++;
               PowerUp+=(double(CandlesE-i)/double(CandlesE))*(MathAbs(Open[i] - Close[i])/(High[i] - Low[i]))*Volume[i];
               } 
            if ( Open[i] > Close[i] )
               {
               BarsDown++;
               PowerDown+=(double(CandlesE-i)/double(CandlesE))*(MathAbs(Open[i] - Close[i])/(High[i] - Low[i]))*Volume[i];
               } 
            }
         }
         
      if ( BarsUp > 0 && BarsDown > 0 )
         {
         PercentUp=(double(BarsUp)/double(BarsUp+BarsDown))*100.0;
         PercentDown=(double(BarsDown)/double(BarsUp+BarsDown))*100.0;
         PercentPowerUp=(double(PowerUp)/double(PowerUp+PowerDown))*100.0;
         PercentPowerDown=(double(PowerDown)/double(PowerUp+PowerDown))*100.0;
         }         
      }
   };
   int TickBox::BarsUp=0;
   int TickBox::BarsDown=0;
   double TickBox::PowerUp=0;
   double TickBox::PowerDown=0;   
   double TickBox::PercentUp=0;
   double TickBox::PercentDown=0;
   double TickBox::PercentPowerUp=0;
   double TickBox::PercentPowerDown=0;

Todas las funciones y variables son estáticas en ella. No hemos previsto la creación de una instancia, ya que una es suficiente para nosotros. Todo el cálculo tiene lugar en la única función que hay en la clase; en la función se calcula el número de barras alcistas y bajistas, así como los componentes similares de la fuerza de la señal que se suman en una variable común. Las 4 fórmulas para cada modo se implementan precisamente en esta función.

Las 2 primeras variantes de la fórmula se implementan sin atenuación hasta el extremo más alejado del área analizada; las dos siguientes son una copia exacta, pero implementan la atenuación. En este caso, la atenuación es lineal; si lo deseamos, podemos implementar cualquier otra atenuación, pero por simplicidad, siempre será mejor intentar primero aquello que requiera un mínimo de cálculo.

Para cada vela se calcula un término elemental que contribuye al total. La primera versión de la fórmula considera que todo el volumen que estaba en la vela es una señal en una u otra dirección, y también considera lo cerca que está el movimiento final de ser el único. Cuantas más colas haya en la parte inferior y superior de la vela en relación con el movimiento final, menor será el peso de este volumen. Si lo deseamos, podemos componer otras proporciones.

La segunda versión de la fórmula calcula el movimiento final de la vela en puntos; el signo depende de la dirección del movimiento de la vela. En este caso, además, también multiplicamos este valor por el volumen, por lo que asumimos que el volumen es una especie de coeficiente de peso que indica la fiabilidad del movimiento de una barra determinada. El resto de variables calculan el porcentaje de barras que han ascendido o descendido, así como el porcentaje de la propia señal.

A continuación, describimos la función principal en la que abriremos y cerraremos las posiciones:

void Trade()
   {
   SymbolInfoTick(Symbol(),LastTick);
   MqlDateTime tm;
   TimeToStruct(LastTick.time,tm);
   int MinuteEquivalent=tm.hour*60+tm.min;
   int BorderMinuteStartTrade=HourCorrect(TradeHour)*60+MinuteCorrect(TradeMinute);
   int BorderMinuteEndTrade=HourCorrect(TradeHourEnd)*60+MinuteCorrect(TradeMinuteEnd);
   if ( MathAbs(TickBox::BarsUp-TickBox::BarsDown) >= 1.0 && TickBox::PercentPowerUp >= 50.0 )
      {
      if ( !bInvert ) ClosePosition(POSITION_TYPE_BUY);
      else ClosePosition(POSITION_TYPE_SELL);
      }
      
   if ( MathAbs(TickBox::BarsUp-TickBox::BarsDown) >= 1.0 && TickBox::PercentPowerDown >= 50.0 )
      {
      if ( !bInvert ) ClosePosition(POSITION_TYPE_SELL);
      else ClosePosition(POSITION_TYPE_BUY);
      }
      
     if ( BorderMinuteStartTrade > BorderMinuteEndTrade )
        {
        if ( PositionsTotal() == 0 && !(MinuteEquivalent>=BorderMinuteEndTrade && MinuteEquivalent<= BorderMinuteStartTrade) )
           {
           if ( MathAbs(TickBox::BarsUp-TickBox::BarsDown) >= Signal && TickBox::PercentPowerUp >= PercentE )
              {
              if ( !bInvert ) m_trade.Sell(Lot,_Symbol,LastTick.ask,LastTick.ask+double(SLE)*_Point,LastTick.bid-double(TPE)*_Point);
              else m_trade.Buy(Lot,_Symbol,LastTick.ask,LastTick.bid-double(SLE)*_Point,LastTick.ask+double(TPE)*_Point);
              }
      
           if ( MathAbs(TickBox::BarsUp-TickBox::BarsDown) >= Signal && TickBox::PercentPowerDown >= PercentE )
              {
              if ( !bInvert ) m_trade.Buy(Lot,_Symbol,LastTick.ask,LastTick.bid-double(SLE)*_Point,LastTick.ask+double(TPE)*_Point);
              else m_trade.Sell(Lot,_Symbol,LastTick.ask,LastTick.ask+double(SLE)*_Point,LastTick.bid-double(TPE)*_Point);
              }
           }        
        }
     if ( PositionsTotal() == 0 && BorderMinuteStartTrade <= BorderMinuteEndTrade )
        {
        if ( MinuteEquivalent>=BorderMinuteStartTrade && MinuteEquivalent<= BorderMinuteEndTrade )
           {
           if ( MathAbs(TickBox::BarsUp-TickBox::BarsDown) >= Signal && TickBox::PercentPowerUp >= PercentE )
              {
              if ( !bInvert ) m_trade.Sell(Lot,_Symbol,LastTick.ask,LastTick.ask+double(SLE)*_Point,LastTick.bid-double(TPE)*_Point);
              else m_trade.Buy(Lot,_Symbol,LastTick.ask,LastTick.bid-double(SLE)*_Point,LastTick.ask+double(TPE)*_Point);
              }
      
           if ( MathAbs(TickBox::BarsUp-TickBox::BarsDown) >= Signal && TickBox::PercentPowerDown >= PercentE )
              {
              if ( !bInvert ) m_trade.Buy(Lot,_Symbol,LastTick.ask,LastTick.bid-double(SLE)*_Point,LastTick.ask+double(TPE)*_Point);
              else m_trade.Sell(Lot,_Symbol,LastTick.ask,LastTick.ask+double(SLE)*_Point,LastTick.bid-double(TPE)*_Point);
              }
           }        
        }
   }

Abrimos según la fuerza y ​​la calidad de la señal medida en tanto por ciento. Cerramos si existe la más mínima sugerencia de un cambio de signo.

Usaremos esta función para cerrar solo una posición que esté abierta en una determinada dirección. Es simple.

void ClosePosition(ENUM_POSITION_TYPE Direction)//close a position by a symbol
   {
   bool ord;
   ord=PositionSelect(Symbol());
   if ( ord && int(PositionGetInteger(POSITION_MAGIC)) == MagicF  && Direction == ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE)) )
      {
      if(m_position.SelectByIndex(0)) m_trade.PositionClose(m_position.Ticket());          
      }
   }

A continuación, describimos los principales eventos y la función para trabajar con las barras:

int OnInit()
  {
  m_trade.SetExpertMagicNumber(MagicF);//set the magic number for positions
  DimensionAllMQL5Values();//prepare the predefined arrays
  return(INIT_SUCCEEDED);
  }

datetime Time0;
datetime TimeX[1];
bool bNewBar()
   {
   CopyTime(_Symbol,_Period,0,1,TimeX);
   if ( Time0 < TimeX[0] )
      {
      if (Time0 != 0)
         {
         Time0=TimeX[0];
         return true;
         }
      else
         {
         Time0=TimeX[0];
         return false;
         }
      }
   else return false;
   }

void OnTick()
  {
  if ( bNewBar())//work by bars
     {
     CalcAllMQL5Values();
     TickBox::CalculateAll(MODEE);
     if (bWriteValuesE)
        {
        Print("% Sit in buy = ",TickBox::PercentUp);
        Print("% Sit in sell = ",TickBox::PercentDown);
        Print("Signal = ",MathAbs(TickBox::BarsDown-TickBox::BarsUp));
        Print("% Resistance = ",TickBox::PercentPowerUp);
        Print("% Support = ",TickBox::PercentPowerDown);        
        Print("***************************************************************************");
        }
     Trade();
     } 
  }

Al iniciar el asesor experto, debemos preparar las matrices y definir su tamaño, y también definir el número mágico para las posiciones. Después de ello, describiremos la función de predicado para registrar el cambio de la barra y las variables necesarias para su funcionamiento. Después de todo esto, describiremos el evento principal del tick y recalcularemos en cada barra los valores de las matrices predefinidas, tras lo cual calcularemos los parámetros del sistema y ​​añadiremos un bloque para escribir en el log los valores de los principales parámetros del sistema si activamos esta función. Obviamente, podemos hacerlo de otra forma, e incluso mejor, pero en este caso, también podemos usar esto. Lo principal es que todo sea sencillo y claro.

La esencia del asesor es que cada barra contribuye a la imagen actual, podemos incluso determinar de forma aproximada lo que sucederá durante un par de barras a continuación; le recomendamos al lector que recuerde esto. Cada barra contribuye a la señal final, pero debemos comprender que el peso de las barras no es el mismo. Todo por culpa de la física del mercado. Hablaremos de la física del mercado en el próximo artículo.

Probando el asesor experto

En este apartado, pondremos a prueba nuestro asesor experto e intentaremos encontrar momentos interesantes en su funcionamiento, si es que existen. Comenzaremos con la prueba del año pasado. Tomamos la pareja EURUSD M5. Al revisar los modos de trabajo y probar 10 años de la historia usando también diferentes franjas temporales, hemos encontrado el siguiente resultado, bastante aceptable. El conjunto con el que hemos probado el asesor se adjunta al artículo. Siguiendo nuestras propias reglas para analizar sistemas, hemos cambiado alternativamente tanto los modos operativos como el intervalo temporal del servidor para comerciar y, como resultado, en aproximadamente 30-60 minutos, hemos encontrado los siguientes parámetros.

Más abajo, mostramos la prueba del último año:

 

A continuación, hemos probado el primer año en un intervalo de 10 años:

 

El gráfico no es tan bueno como en el área cercana, pero el movimiento final aún se conserva. Hay ciertos puntos desagradables, pero parece que aquí también funciona todo.

Después de eso, hemos tomado la mitad del intervalo y verificado cómo se comporta el sistema allí para asegurarnos de que funciona:

 

Como podemos ver, aquí hay signos de un patrón global. Solo tenemos que probar todo el intervalo y ver cómo se ve a escala global:

 

El gráfico dista mucho de ser perfecto, pero podemos ver los momentos en los que funciona, intentar introducir filtros o, por ejemplo, realizar una optimización profunda. La elección de una herramienta específica siempre es opcional. Si probamos con otras parejas, el resultado probablemente sea distinto, pero después de cierto tiempo, seguramente encontraremos los parámetros ideales para varias parejas a la vez, y si comprendemos la física y podemos reforzarla, sería genial.

Incluso con este robot, hemos logrado resultados aceptables; hemos tenido muy pocas transacciones, pero sí que se han usado varias divisas. Podemos probarlo con más detalle, en cualquier caso, dará buenos resultados. Incluso a primera vista, el código más simple puede servir como una base potente para desarrollar una cierta idea; algunos sistemas pueden incluso usarse sin modificaciones, de forma organizada, pero aún así puede usarse.

Obviamente, sería también positivo conseguir implementar el dominio multidivisa, pero esto se logra realizando un trabajo mucho más profundo y con modificaciones activas. En este artículo, no nos ocuparemos de esto, lo dejamos a la discreción del lector. Por nuestra parte, añadiremos que no debemos dedicar demasiado tiempo al sistema tratando de sacarle al menos algún beneficio, porque si algo funciona, resultará visible casi de inmediato. Si el resultado no es visible, será mejor sacar conclusiones y cambiar de la forma de pensar. Claro que en algunos sistemas resulta posible corregir algo, pero no siempre es así.

Obviamente, podemos realizar algunas pruebas más, pero creemos que resulta suficiente para mostrar que absolutamente todos los parámetros de las barras influyen de diferentes maneras en el resultado; además, hay valores extremos de indicadores con diferentes combinaciones en diferentes parejas. También hay extremos que funcionan para todas las parejas al mismo tiempo, pero encontrarlos requiere de tiempo y práctica. La versión de MQL4 también se adjunta al artículo.

Conclusión

En último lugar, diremos que el lector no debe temer escribir código y poner este a prueba por sí mismo, no debe temer que el sistema sea demasiado simple (estos son los sistemas que suelen funcionar). El hecho es que cuanto más complejo sea un sistema, más grados de libertad tendrá, es decir, más datos de entrada y opciones de trabajo impredecibles. Debemos evitar como sea posible la presencia de complejidades en el código, y mantener este lo más simple posible.

Otro momento interesante es que cuanto más complejo sea un sistema, más deberá ser puesto a prueba, e invertiremos en ello una gran cantidad de tiempo sin motivo alguno. No debemos escribir sistemas que se basen ​en nada en absoluto, o que se basen en las especulaciones de algunas personas que afirman que "aquí he hecho 30 transacciones y ahora todo va a funcionar". Este es un enfoque poco profesional. En particular, no debemos escribir sistemas basados ​​en algunos indicadores; esto es lo más estúpido que podemos hacer como desarrolladores.

Y en general, en primer lugar, merece la pena entender por qué deberíamos dedicar tiempo a esto y, si estamos dispuestos a ello, cuánto vamos a gastar. Debemos tener un objetivo y un marco temporal; esto estimulará el uso racional de nuestro tiempo. Al principio, el objetivo es muy ambicioso, y luego se hace más realista; lo importante es que tengamos uno.

Resulta complicado enteder a la gente que ha estado años preparándose aquí, poniendo mil indicadores en el gráfico y tratando de ver algo: este es un camino a ninguna parte. Antes de nada, necesitamos entender si estamos decididos a conseguir un resultado o simplemente todo es un pasatiempo, creo que hay pasatiempos mucho más interesantes que mirar cotizaciones aburridas durante años. Fórex es como un agujero negro: si nos quedamos atrapados en él, nunca podremos salir.

Traducción del ruso hecha por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/ru/articles/8410

Aplicación práctica de las redes neuronales en el trading. Python (Parte I) Aplicación práctica de las redes neuronales en el trading. Python (Parte I)
En este artículo, analizaremos paso a paso la implementación de un sistema comercial basado en la programación de redes neuronales profundas en Python. Para ello, usaremos la biblioteca de aprendizaje automático TensorFlow, desarrollada por Google. Para describir las redes neuronales, utilizaremos la biblioteca de Keras.
Conjunto de instrumentos para el marcado manual de gráficos y comercio (Parte II). Haciendo el marcado Conjunto de instrumentos para el marcado manual de gráficos y comercio (Parte II). Haciendo el marcado
Este artículo continúa el ciclo en el que mostramos la creación de una biblioteca capaz de marcar gráficos manualmente utilizando atajos de teclado. El marcado se realiza con líneas rectas y combinaciones de estas. Esta parte habla directamente sobre el propio dibujado utilizando las funciones descritas en la primera parte. La biblioteca se puede conectar a cualquier asesor experto o indicador, lo cual simplifica sustancialmente las tareas de marcado. Esta solución NO UTILIZA dlls externas: todos los comandos se implementan usando las herramientas integradas de MQL.
Ejemplos de análisis de gráficos utilizando el TD Sequential de DeMark y los niveles de Murray-Gann Ejemplos de análisis de gráficos utilizando el TD Sequential de DeMark y los niveles de Murray-Gann
El sistema secuencial de Thomas DeMark o TD sequential muestra perfectamente los cambios de equilibrio en el movimiento del precio. Esto se hace especialmente obvio si combinamos sus señales con un indicador de nivel, por ejemplo, con los niveles de Murray. En el artículo hablaremos de estas combinaciones. El texto está más bien dirigido a principiantes en el trading y aquellos que aún no pueden encontrar su "Grial", si bien mostramos algunas características de los niveles de construcción que no hemos visto en otros foros. Por consiguiente, también podría resultar de utilidad en algunos puntos a los usuarios avanzados. Bueno, y a los gurús los invitamos a debatir y realizar críticas constructivas...
Redes neuronales: así de sencillo (Parte 6): Experimentos con la tasa de aprendizaje de la red neuronal Redes neuronales: así de sencillo (Parte 6): Experimentos con la tasa de aprendizaje de la red neuronal
Ya hemos hablado sobre algunos tipos de redes neuronales y su implementación. En todos los casos, hemos usado el método de descenso de gradiente para entrenar las redes neuronales, lo cual implica la elección de una tasa de aprendizaje. En este artículo, queremos mostrar con ejemplos lo importante que resulta elegir correctamente la tasa de aprendizaje, y también su impacto en el entrenamiento de una red neuronal.