English Русский 中文 Deutsch 日本語 Português
Cómo reducir los riesgos del tráder

Cómo reducir los riesgos del tráder

MetaTrader 5Trading | 19 enero 2018, 08:04
9 246 0
Aleksandr Masterskikh
Aleksandr Masterskikh

Índice


Introducción

En primer lugar, este artículo le resultará útil a los tráders principiantes y a los analistas que trabajan en la creación de su propio sistema comercial. Esperamos que muchas cuestiones sean también interesantes para los participantes del mercado con mayor experiencia. Hablamos, por ejemplo, de la clasificación de los tipos de riesgo, el uso del análisis de velas para determinar las zonas de sobrecompra/sobreventa, la interrelación del análisis fundamental y el análisis técnico, la elección de los periodos de cálculo de las medias móviles o la minimización de los riesgos relacionados con el posible desplome del precio.

En el artículo se analizan las siguientes cuestiones:

  • con qué proceso (desde el punto de vista de la dinámica) estamos teniendo cuentas en los mercados financieros y las bolsas;
  • cuál es la probabilidad de obtener beneficio al comerciar;
  • cómo podemos reducir el riesgo del comercio en el estadio del desarrollo del sistema comercial.

No aspiramos al analisis total y la clasificación completa de los riesgos al comerciar en los mercados financieros. Hablamos más bien de los principales riesgos de mercado relacionados con la dinámica del movimiento de los precios de los instrumentos financieros. Asimismo, hablaremos de los riesgos no relacionados directamente con la dinámica de mercado, pero también importantes desde el punto de vista de la efectividad del comercio. Al escribir el artículo, hemos empleado nuestra propia experiencia, acumulada durante el análisis y el desarrollo de diversos sistemas comerciales.


¿Qué son los mercados financieros desde el punto de vista de la dinámica de un proceso?

Al desarrollar estrategias comerciales (ya sea para el comercio manual o automático), hay que comprender ante todo el proceso con el que estamos tratando. El movimiento de los precios en los mercados financieros no es un proceso estacionario. El motivo de ello es que se ve influido por multitud de factores, entre los cuales no se puede destacar con frecuencia el más determinante.

Esta falta de carácter estacionario se manifiesta en el comportamiento de los participantes del mercado. Sus reacciones están dirigidas en direcciones opuestas, y como resultado, el cambio de amplitud y frecuencia en el mercado no puede ser definido por las leyes de comportamiento determinado. Por eso mismo, este proceso en general se puede considerar casual.

Sin embargo, al mismo tiempo, el proceso de movimiento de los precios de mercado no se puede definir como completamente casual. Sigue teniendo algunas zonas en las que se puede pronosticar correctamente el movimiento. Vamos a enumerar los factores gracias a los cuales aparecen estas zonas.

  • Movimiento ondulatorio de precio. Podemos definir el inicio de la onda: por ejemplo, por el cruce de la vela con un grupo de medias móviles o por las señales de los indicadores tradicionales. Por ahora no vamos a hablar sobre las sutilezas de esa definición, solo destacaremos que, en principio, es posible.
  • Aparición de zonas estrechas de consolidación (el precio saldrá necesariamente de ellas).
  • Algunas normas de reacción a factores concretos de orden fundamental, técnico o relacionado con las noticias.

¿Cuál es la probabilidad de obtener beneficios al comerciar en los mercados financieros?

Esta es la cuestión principal, puesto que cualquier tráder, en esencia, es un inversor. La probabilidad de obtener beneficios al comerciar en los mercados financieros se relaciona directamente con la fiabilidad del pronóstico sobre la continuación de la tendencia, ya que la amplitud principal del movimiento se encuentra precisamente en los intervalos de tendencia.

Existen muchos métodos de cálculo de la probabilidad de la continuación o el viraje de la tendencia. Todos ellos tienen un defecto relacionado con el hecho de cualquier sistema comercial constituye un modelo del estado del mercado. Y siempre resulta muy complejo definir la precisión de este modelo. Y es que, en primer lugar, el propio proceso es extremadamente complejo en lo que respecta a su dinámica (en esencia, es aleatorio, no estacionario); y en segundo lugar, las meotodologías disponibles de valoración de la exactitud «dentro» de un proceso aleatorio también son complicadas, y su efectividad no es unívoca.

Por eso, para valorar la posibilidad de obtener beneficios, tomaremos otro camino y utilizaremos, no los datos calculados, sino los reales. Para ello, recurriremos a las estadísticas de efectividad del trading en el mercado fórex y el mercado de valores. Estas vienen representadas por las compañías de inversión y de corretaje.

Bien, según los datos indicados en el artículo «La efectividad del trading privado en Fórex en Rusia y los EE.UU.», a comienzos de 2015, el porcentaje de cuentas rentables de tráders privados en Rusia era del 28%, y en EE.UU., del 33%. Por supuesto, estos datos no pueden considerarse exhaustivos, ya que en el estudio se incluyó un número limitado de empresas, y el periodo de estudio fue de solo seis meses. Sin embargo, la categoría de las cifras de la probabilidad de obtención de beneficios es bastante clara. ¿Qué conclusión podemos sacar de este hecho?

Los métodos de análisis tradicionales, usados por la mayoría de los participantes del mercado, no permiten pronosticar con efectividad el proceso del movimiento de los precios en los mercados financieros. También son poco efectivas las medidas adicionales, incluidos los métodos de gestión de capital. La razón de ello es la falta de efectividad del pronóstico original de referencia de la dinámica del mercado, realizado con la ayuda del análisis técnico y fundamental. Como resultado, solo un tercio de los tráders obtienen ganancias en los mercados financieros.

En cuanto al mercado de valores, las estadísticas no son uniformes. Vamos a mostrar datos «moderados». Según las investigaciones de la agencia francsesa de mercados financieros, ocho de cada diez tráders individueales acaban por perder sus recursos. Es decir, la efectividad del comercio en el mercado de valores es del 20%. Este dato es peor aún que en el mercado de Fórex, aunque las cifras son semejantes.

Bien, como podemos ver, tener en cuenta rigurosamente todos los riesgos al comerciar es una necesidad importantísima para cualquier inversor.

Vamos a destacar los principales grupos de riesgo:

  • riesgos relacionados con la dinámica del movimiento de precios
  • riesgos no relacionados con la dinámica de mercado

Vamos a analizar con más detalle estos riesgos y las posibilidades de minimizarlos.

Vamos a comenzar con el primer grupo de riesgos. Su lista se define partiendo del análisis de los gráficos de los instrumentos financieros. Es necesario analizar los elementos del gráfico y sus parámetros, incluyendo las características tanto de las velas aparte como de grupos de las mismas, así como los parámetros de las medias móviles. No vamos a utilizar otros indicadores tradicionales: sus modelos matemáticos no se corresponden con la naturaleza del proceso de los movimientos de precio, y por lo tanto no son eficaces en el análisis.


Riesgos de mercado relacionados con la dinámica del movimiento de precios

El principal riesgo para el tráder en el ámbito técnico es el riesgo que supone el cambio de tendencia. Este consiste en que el precio del instrumento financiero cambia de dirección y comienza a moverse en la dirección opuesta a la posición abierta del tráder. Si la posición no está abierta, entonces el riesgo consistirá en el pronóstico de ese viraje.

Cada tráder define para sí mismo qué es la tendencia. Y es que, por paradójico que resulte, no existe una definición "oficial" de este concepto en el análisis técnico. Por lo tanto, también será subjetiva la valoración de la probabilidad del viraje de la tendencia. Además, la magnitud de la amplitud crítica (al darse el viraje de tendencia), que el tráder define para sí mismo, depende de la magnitud del riesgo asumible (límite del riesgo). Este, a su vez, viene determinado por la cantidad de recursos en el balance de un tráder particular. Todo se sustenta en la reducción máxima permisible. En otras palabras, lo que para un banco es «bueno», para un tráder común y corrientes significa la «muerte».

A continuación, vamos a analizar los tipos de riesgos y, si es posible, buscar soluciones para minimizarlos.

Clasificación de los riesgos relacionados con la dinámica de mercado

El análisis tradicional distingue tres tipos de tendencias en cuanto a duración: a corto plazo, a medio plazo y a largo plazo.

Asimismo, se mencionan con frecuencia las tendencias locales y globales. Por lo general, se entiende por tendencia local una tendencia formada a corto o medio plazo. Las tendencias mundiales se forman a largo plazo. Además, en este caso, no hay cifras unívocas que definan los límites en cuanto al tiempo y la amplitud de estos conceptos. De nuevo, todo es relativo. Por eso vamos a simplificar el análisis: como criterio de riesgo relacionado con el viraje de tendencia, tomaremos la magnitud de la amplitud del movimiento inverso. La valoraremos con respecto a los niveles técnicos importantes, o bien dependiendo de la magnitud del depósito del inversor, y teniendo en cuenta el límite del riesgo.

Para clasificar los riesgos asociados con la posibilidad de un cambio de tendencia, también hay que tener en cuenta los factores que afectan a la dinámica de los precios de mercado. Los enumeramos brevemente a continuación.

  • Riesgos relacionados con la alta volatilidad en el momento de entrada en el mercado.
  • Riesgos relacionados con los niveles de resistencia al entrar en el mercado
  • Riesgos de caída en la zona de sobrecompra/sobreventa al entrar en el mercado
  • Riesgos relacionados con la ausencia de tendencia clara al entrar en el mercado.
  • Riesgos relacionados con la elección incorrecta del periodo de cálculo de los indicadores
  • Riesgos relacionados con el uso de órdenes pendientes al entrar en el mercado.
  • Riesgos relacionados con la indeterminación de la amplitud del movimiento de los precios después de entrar al mercado.
  • Riesgos relacionados con el desplome del precio después de entrar en el mercado.
  • Riesgos relacionados con el uso de un solo marco temporal.
  • Riesgos relacionados con el uso de un solo tipo de análisis (técnico o fundamental)

Riesgos relacionados con la alta volatilidad en el momento de entrada en el mercado

Muchos tráders no tienen en cuenta en absoluto este tipo de riesgo. Pero es un gran error, porque cuando hay una volatilidad alta, aumenta la amplitud del movimiento, también en contra de la tendencia predominante. Este es precisamente el factor de riesgo.

La valoración de la volatilidad con la ayuda de los indicadores tradicionales es demasiado subjetiva. En primer lugar, los propios ajustes de los indicadores son subjetivos, y en segundo lugar, los modelos matemáticos no siempre están diseñados para tal evaluación. Por lo tanto, como modelo para determinar el grado necesario de volatilidad al entrar al mercado, es más fiable utilizar una zona de consolidación.

Para minimizar este tipo de riesgo se puede especificar en el algoritmo de entrada la siguiente condición: límite máximo de la amplitud en la historia de cotizaciones más próxima. Podemos establecer un corredor de precios así:

  • amplitud entre dos fractales opuestos
  • o amplitud de un grupo de velas.

La limitación de la amplitud de las velas constituye la forma más sencilla. Vamos a analizar el fragmento de código en el que se implementa:

 //---ALGORITMO DE ENTRADA EN EL MERCADO - COMPRA (BUY)-------------------------------------------------------------------------------------------
      
  if( 
   //----MINIMIZAMOS LOS RIESGOS RELACIONADOS CON LA ALTA VOLATILIDAD EN EL MOMENTO DE ENTRADA EN EL MERCADO ----
  
     //Modelamos la ausencia de volatilidad alta en la historia más próxima:
     ( High[1] - Low[1]) <= 200*Point &&                       //limitación de la amplitud de las velas del marco temporal menor (М1)
     ( High[2] - Low[2]) <= 200*Point &&
     ( High[3] - Low[3]) <= 200*Point && 
     (H_prev_m15 - L_prev_m15) <= 300*Point &&                 //limitación de la amplitud de las velas del marco temporal mayor (М15)
     (H_2p_m15 - L_2p_m15) <= 300*Point && 
     (H_3p_m15 - L_3p_m15) <= 300*Point && 
     (H_prev_m15 - L_3p_m15) <= 300*Point &&                   //limitación de la amplitud del canal de las velas de la escala mayor (М15)
     (High[1] - Low[1]) >= (1.1*(High[2] - Low[2])) &&         //limitación de la actividad en la barra anterior con respecto a la 2-da barra en la historia de cotizaciones 
     (High[1] - Low[1]) < (3.0*(High[2] - Low[2])) &&          //lo mismo

Fig. 1 Módulo en el algoritmo de entrada: minimización de riesgos relacionados con la alta volatilidad en el momento de entrada en el mercado.

En la figura 1 se muestra el módulo en el algoritmo de entrada (Buy).

Denominaciones:

  • High{1], High[2], High[3] — niveles Highen las tres barras anteriores del marco temporal М1,
  • H_prev_m15, H_2p_m15, H_3p_m15 — niveles High en las tres barras anteriores del marco temporal М15,
  • Low[1], Low[2], Low[3] — niveles Low en las tres barras anteriores del marco temporal М1,
  • L_prev_m15, L_2p_m15, L_3p_m15 — niveles Low en las tres barras anteriores del marco temporal М15.

El módulo permite reducir al mínimo los riesgos que surgen si el punto de entrada se encuentra en una zona de alta volatilidad. Esto se logra modelando el canal horizontal de precios y modelando la actividad (volatilidad moderada) al extremo del canal.

Los canales de precio en los marcos temporales M1 y M15 se modelan usando las limitaciones de la amplitud de las velas que se encuentran en las tres barras anteriores en la historia de cotizaciones. Además, las limitaciones de la amplitud se indican tanto para las velas aparte, como para todo el grupo de velas. La amplitud del canal se determina como la diferencia entre los extremos de la primera y la última vela.

La volatilidad moderada al final del canal se modela limitando la proporción de las amplitudes de las dos velas vecinas del marco temporal М1 (en este caso, se usa una proporción de 1.1 a 3.0). Por supuesto, puede utilizar otra relación de amplitud.

Surge la pregunta: ¿por qué indicar la amplitud de todo el canal? ¿No es suficiente con establecer la amplitud de cada vela? No, no es suficiente. Si no se establece la amplitud de todo el canal, se puede formar un canal ondulatorio, en lugar de horizontal, cuya amplitud puede ser el doble de la amplitud de una sola vela.

Este ejemplo se muestra para la entrada de Buy. Para la entrada de Sell el código será el mismo, puesto que la amplitud del canal y de las velas aparte se define como la diferencia de High y Low, y la dirección se establecerá no en este, sino en los otros módulos del algoritmo de entrada.

Riesgos relacionados con la presencia de niveles de resistencia al entrar en el mercado

Los participantes del mercado reaccionan de manera diferente a los niveles de resistencia presentes en el gráfico. Para algunos, es objeto de beneficios, para otros, una pérdida limitada, y para algún tercero, el objetivo inicial para la ruptura de nivel. Por eso, alrededor de los niveles fractales se forman a menudo zonas donde el precio se mueve en diferentes direcciones con una pequeña amplitud. Los riesgos derivados de la apertura de posiciones en estas áreas aumentan, y el pronóstico en ellos no es efectivo según los resultados de las pruebas de varios sistemas comerciales. Por lo tanto, parece una solución lógica que el punto de entrada en el mercado se encuentre más allá de los niveles de resistencia en la dirección de la tendencia.

¿Cómo tener en cuenta este tipo de riesgo en el comercio?

Si una posición ya está abierta en la dirección del nivel de resistencia y el precio encuentra cerca del mismo, entonces será mejor cerrar la posición con antelación, ya que es posible el retroceso, y este empeorará el resultado.

Si planea abrir una posición según su propio algoritmo después de que el precio pase el nivel de resistencia, será necesario esperar a que se dé su ruptura fiable en la dirección elegida.

En esencia, la cuestión se apoya en el problema de las rupturas falsas y verdaderas. Se puede solucionar, por ejemplo, de esta forma. Espere a que se forme un nuevo nivel de resistencia después de un nivel fractal. A continuación, espere a que el precio rompa el nuevo nivel fractal. En este caso, además, es deseable utilizar uno de los marcos temporales menores. Pero esto no es suficiente: en la dinámica actual deberán existir rasgos claros de actividad en la dirección de la ruptura y más allá del nuevo nivel fractal.

El principal defecto de este enfoque es la indeterminación del marco temporal. Se elige de forma subjetiva, por eso no es posible pronosticar de antemano la amplitud de la ruptura del nivel. Por lo tanto, simplificaremos el problema estableciendo la siguiente condición: en el momento de entrada, el nivel tendrá que haber sido superado.

Al crear un sistema comercial se pueden utilizar varias formas de implementación en el algoritmo de entrada para reducir al mínimo el riesgo asociado con la presencia de niveles de resistencia.

  • Variante 1. Búsqueda del fractal de resistencia más cercano (en el código se implementará usando un ciclo). La ventaja de este enfoque es que vamos a encontrar el nivel real de resistencia en este periodo de tiempo. Eso sí, tiene dos inconvenientes. En primer lugar, la programación de ciclos puede ser difícil para los principiantes. En segundo lugar, el fractal puede encontrarse demasiado lejos en la historia, lo que significa que será irrelevante como nivel de resistencia.
  • Variante 2. Usar High (para Buy) y Low (para Sell) de la vela anterior. Este enfoque tiene dos ventajas. En primer lugar, es fácil de programar. En segundo lugar, se pueden establecer múltiples marcos temporales, lo que equivale a la búsqueda de los fractales mayores. Desventaja: algunos fractales no pueden ser detectados, ya que los extremos de las velas son fractales solamente cuando se dan las así llamadas "sombras".

Para los principiantes, así como en el desarrollo de estrategias manuales, se recomienda la opción 2: es simple y eficaz, a pesar de que existe una ligera disminución en la precisión, debido a la pérdida de algunos fractales. Aquí tenemos un fragmento de código:

 //----MINIMIZAMOS LOS RIESGOS RELACIONADOS CON LA PRESENCIA DE NIVELES DE RESISTENCIA AL ENTRAR EN EL MERCADO-----
  
     //Modelamos la situación en que los niveles de resistencia locales han sido superados por el precio actual:
       Bid > High[1] &&           //en М1 (marco temporal menor)
       Bid > H_prev_m15 &&        //en М15 (marco temporal menor)

Fig. 2. Módulo en el algoritmo de entrada: minimización de riesgos relacionados con la presencia de niveles de resistencia en la entrada.

En la figura 2 se muestra el módulo en el algoritmo de entrada para la minimización de los riesgos relacionados con la presencia de niveles de resistencia para el movimiento ascendente, entrada Buy. Esto se logra gracias a la condición establecida sobre la superación por parte del precio actual del nivel de resistencia en forma de High de la vela anterior (en dos marcos temporales por separado).

En principio, es necesariao especificar adicionalmente la actividad del movimiento, pero, a fin de evitar la duplicación de variables, esto se ha implementado en otros módulos (donde se definirá tanto la dirección del movimiento, como su actividad).

Para la entrada de Sell, como niveles de resistencia se deben utilizar los niveles Low de la vela anterior (en los marcos temporales М1 y М15), teniendo en cuenta la tendencia descendente.

Riesgos de caída en la zona de sobrecompra/sobreventa al entrar en el mercado

Entendemos por dichos riesgos la probabilidad de entrar en la "cola" de un movimiento activo en forma de onda, cuando el resto de la amplitud en la dirección de la entrada es pequeño y aumenta bruscamente la probabilidad de viraje. Tales zonas no son otra cosa que zonas de sobrecompra/sobreventa. El uso de indicadores tradicionales (RSI, etc.) para su definición con frecuencia se muestra poco eficaz, en muchos casos, sus señales son falsas. La razón sigue siendo la misma: en los indicadores tradicionales no hay algoritmos matemáticos adecuados para la definición de estas zonas. Para buscar con mayor precisión las zonas de sobrecompra/sobreventa hay que descubrir las señales sobre la ralentización de la tendencia (incluidas las de М1, puesto que en él se ve de inmediato la dinámica de los virajes en el resto de marcos temporales).

Así, detectaremos los signos de desaceleración de la tendencia con una combinación de análisis fractal y de análisis de velas según los siguientes criterios:

  • la reducción de la distancia (magnitud de la amplitud) entre niveles de resistencia fractales vecinos. Para comparar las amplitudes de dos zonas vecinas, necesitamos tres fractales;
  • el aumento de la profundidad de la corrección dentro de la vela, la reducción del "cuerpo" de la vela (análisis intravela);
  • el cambio de la dirección de desplazamiento del pivote de la vela con respecto al pivote de la vela anterior (para ello, se necesitan tres velas).

Si se utiliza este método, en el algoritmo de entrada se debe inscribir la condición de ausencia de los factores enumerados. Por ejemplo, esto se puede hacer con la ayuda de false y true, donde true indica la presencia de los factores de desaceleración en el mercado.

Hay otra opción más simple. No está relacionada directamente con la búsqueda de zonas de sobrecompra\sobreventa. Aquí se utiliza un rasgo indirecto: si posibilitamos la entrada en el mercado al principio de un movimiento de onda, la probabilidad de entrar en la zona de sobrecompra/sobreventa, en este caso, dismunuye bruscamente. En esencia, modelamos el estadio inicial de una tendencia local.

  • Primero hay que identificar el cruce de una o más medias móviles (MA) dentro de la misma vela, esto puede indicar el comienzo del movimiento ondulatorio. Para confirmar el inicio de la onda, se requieren condiciones adicionales (ver más abajo).
  • A continuación, modelamos la fase de desarrollo del movimiento ondulatorio. Será el comienzo de una nueva tendencia. Para ello, indicaremos: la dirección de la próxima vela tras el cruce; su actividad; la dirección de las МА rápidas que participan en el cruce en la barra anterior; la posición del precio actual con respecto a estas МА.

Preste atanción: al modelar el estadio inicial de la tendencia local, será más útil indicar solo la dirección de las МА rápidas. La dirección de las MA lentas no es necesaria.

La razón de este enfoque diferente sobre las medias móviles es la siguiente: las MA mayores, debido a su mayor retraso, no tienen tiempo de dar la vuelta en la dirección de la nueva tendencia. Por eso, si vamos a establecer su dirección, el punto modelado de entrada en el mercado puede resultar lejos del inicio de la tendencia y entrar en la zona peligrosa de sobrecompra/sobreventa.

La segunda variante (el modelado del estadio inicial de la tendencia local) es más sencilla, y por eso se recomienda a los desarrolladores principiantes. Vamos a ver un fragmento de código:

//---MINIMIZAMOS LOS RIESGOS RELACIONADOS CON LA ENTRADA EN EL MERCADO EN LA ZONA DE SOBRECOMPRA-----
  
    //Modelamos la vinculación al inicio de la onda, para reducir la probabilidad de caer en la zona de sobrecompra:
     ((MA8_prev > Low[1] && MA8_prev < High[1]) || (MA8_2p > Low[2] && MA8_2p < High[2]) || //inicio de la onda - no más allá de tres barras en la historia de datos (М1)
     (MA8_3p > Low[3] && MA8_3p < High[3])) &&                                              //lo mismo
      MA5_prev_m15 > L_prev_m15 && MA5_prev_m15 < H_prev_m15 &&                             //inicio de la onda - en la barra anterior del marco temporal mayor (М15)
    

Fig. 3. Módulo en el algoritmo de entrada: minimalización de riesgos de incursión en la zona de sobrecompra al entrar en el mercado.

Denominaciones:

  • МА8_prev, МА8_2p, МА8_3p — МА con periodo 8, calculada en las anteriores barras (la segunda y la tercera, respectivamente), en la historia de cotizaciones (М1),
  • МА5_prev_m15, МА5_2p_m15, МА5_3p_m15 - МА con periodo 5, calculada en las anteriores barras (la segunda y la tercera, respectivamente), en la historia de cotizaciones (М15),
  • las denominaciones de los extremos de las velas se indican antes (ver fig.2).

El riesgo de caer en la zona de sobrecompra se minimiza gracias a la vinculación del punto de entrada al inicio de la onda pronosticada. Consideraremos el cruce de la MA por parte de la vela como el rasgo diferencial del comienzo de la onda: en М1 será la МА con periodo 8, en М15, la МА con periodo 5. La magnitud de los periodos de las medias móviles se elige de la serie de Fibonacci. Hablaremos más en profundidad de la elección de este parámetro en el apartado «Riesgos relacionados con la elección incorrecta de la magnitud del periodo de cálculo de los indicadores».

En este módulo no se establecen los parámetros que caracterizan la actividad y la direción de las velas y las МА, ni tampoco la posición del precio actual con respecto a la МА. Esto se hace así para no duplicar las variables: indicaremos estos parámetros en el módulo del apartado «Riesgos relacionados con la ausencia de tendencia clara al entrar en el mercado».

Preste atención: el cruce de la vela y la МА en el marco temporal М1 no se limita a una barra de la historia. Se establece con un "o" lógico, o bien en la anterior barra, o bien en la segunda o en la tercera de la historia (en М1). En М15, en este caso, se ha previsto una variante de cruce en la barra anterior en la historia de cotizaciones. Este conjunto de posibles opciones da la posibilidad de tener en cuenta la gran variabilidad de situaciones de mercado reales relacionadas con el desarrollo de una tendencia local con respecto a este cruce.

El ejemplo mostrado más arriba se ha escrito para la entrada Buy (evitamos la zona de sobrecompra). Para la entrada Sell (evitamos la zona de sobreventa), el módulo es exactamente el mismo, puesto que el algoritmo de cruce de MA con la vela no depende de la dirección del movimiento.

Bien, ya hemos analizado dos métodos para entrar en el mercado y no caer en la zona de sobrecompra/sobreventa, localizando también estas dos zonas. Con estos métodos, podrá hacer sus propios experimentos al crear su sistema comercial o al desarrollar indicadores comerciales.

Riesgos relacionados con la ausencia de tendencia clara al entrar en el mercado

Otro factor de incertidumbre de la dinámica relacionado con los riesgos, es la falta de una tendencia clara. Estamos hablando de situaciones en las que impera en el mercado o bien un flat de pequeña amplitud o bien del todo plano.

Determinar la dirección dominante del precio en este caso es difícil, ya que está en constante cambio, y la amplitud del cambio es muy pequeña. Por lo tanto, aumenta el riesgo de error al pronosticar la dirección para las posiciones de apertura.

El problema es que dentro del marco de los métodos tradicionales de análisis no existe una definición única del flat (igual que sucede con la tendencia). Por lo tanto, no existe una definición de la frontera entre el flat y el comienzo de una tendencia. Los métodos existentes para la identificación de estas condiciones de mercado son muy subjetivos: esto también se aplica al método de desviaciones al cuadrado (es decir, el indicador "StdDev"), y funciones adaptativas más avanzadas (por ejemplo, FRAMA). Otra historia completamente distinta la representan los métodos gráficos de análisis técnico para determinar la tendencia. En este caso, existen tantas tendencias como tráders. Según diversas interpretaciones, al flat pertenecen segmentos con diferente amplitud, a veces bastante considerable. Esto conduce a la pérdida de beneficios.

Nuestra experiencia personal nos ha demostrado que (y esto está confirmado por el sistema comercial) el límite del flat se determina con mayor efectividad estableciendo un valor absoluto para la amplitud en una tendencia lateral.

¡Pero debe recordar que si la amplitud es mayor que el valor umbral seleccionado, eso no quiere decir que estemos ante una nueva tendencia! Así que no se apresure a abrir una posición inmediatamente. Primero es necesario confirmar estos datos con la dinámica actual.

El enfoque de utilización de umbrales absolutos me parece más prometedor que la valoración de las magnitudes relativas de las amplitudes, las cuales son muy difíciles de establecer en un proceso aleatorio no estacionario. Por supuesto, se trata de una simplificación excesiva, pero en la práctica da buenos resultados. Sin ella, se encontrará con un problema serio y con complejos cálculos teóricos, y es que los límites del flat y la tendencia pertenecen a la lógica difusa.

Vamos a analizar un fragmento de código (para la entrada Buy):

 //---MINIMIZAMOS LOS RIESGOS RELACIONADOS CON LA AUSENCIA DE TENDENCIA CLARA AL ENTRAR EN EL MERCADO-------
  
      //Modelamos la dirección de la tendencia en un marco temporal menor:
      Close[2] > Open[2] &&      //dirección ascendente de la vela en la 2-da barra en la historia (М1)
      Close[1] > Open[1] &&      //dirección ascendente de la vela anterior (М1)
      
      //Modelamos la dirección de las medias móviles en un marco temporal menor:
      MA5_cur > MA5_2p &&  MA60_cur > MA60_2p &&     //МА ascendentes: usamos medias las móviles con un periodo de 5 y 60 (М1)
      
      //Modelamos la jerarquía de las medias móviles en el marco temporal menor:
      MA5_cur > MA8_cur && MA8_cur > MA13_cur &&     //formada una "jerarquía" de tres МА en М1 (periodos de Fibonacci:5,8,13), se trata de un rasgo indirecto de la tendencia ascendente
      
      //Modelamos la posición del precio actual con respecto a las medias móviles de la escala menor:
      Bid > MA5_cur && Bid > MA8_cur && Bid > MA13_cur && Bid > MA60_cur && //el precio actual está por encima de la МА (5,8,13,60) en М1, se trata de un rasgo indirecto del movimiento ascendente 
      
      //Modelamos la dirección de la tendencia en un marco temporal mayor:
      C_prev_m15 > O_prev_m15 &&       //dirección ascendente de la vela anterior (М15)
      
      //Modelamos la dirección de la media móvil en un marco temporal mayor: 
      MA4_cur_m15 > MA4_2p_m15 &&     //МА ascendente con periodo 4 (М15)
      
      //Modelamos la jerarquía de las medias móviles en el marco temporal mayor: 
      MA4_prev_m15 > MA8_prev_m15 &&  //formada una "jerarquía" de dos МА en М15 (periodos: 4 y 8), se trata de un rasgo indirecto de la tendencia ascendente
      
      //Modelamos la posición del precio actual con respecto a las medias móviles de los marcos temporales mayores:
      Bid > MA4_cur_m15 &&            //el precio actual está por encima de МА4 (М15), se trata de un rasgo indirecto del movimiento ascendente 
      Bid > MA24_cur_h1 &&            //el precio actual está por encima de МА24 (МН1), se trata de un rasgo indirecto del movimiento ascendente
      
      //Modelamos una microtendencia dentro de la vela actual del marco temporal menor, así como los puntos de entrada:
      Bid > Open[0] &&               //presencia de movimiento ascendente dentro de la vela actual (М1)
       
     //Modelamos actividad suficiente del proceso anterior en el marco temporal mayor:
     (C_prev_m15 - O_prev_m15) > (0.5*(H_prev_m15 - L_prev_m15)) &&  //la parte del "cuerpo" de la vela es superior al 50% de la magnitud de la amplitud de la vela (vela anterior М15)
     (H_prev_m15 - C_prev_m15) < (0.25*(H_prev_m15 - L_prev_m15)) && //la limitación de la profundidad de la corrección es menor al 25% de la amplitud de la vela (vela anterior М15)
      H_prev_m15 > H_2p_m15 &&                                       //tendencia ascendente de los niveles locales de resistencia (dos velas М15) 
      O_prev_m15 < H_prev_m15 && O_prev_m15 > L_prev_m15 &&          //la presencia de sombra (vela anterior М15) con respecto al precio de apertura de la vela dada
      
     //Modelamos actividad suficiente del proceso anterior en el marco temporal menor: 
     (Close[1] - Open[1]) > (0.5*(High[1] - Low[1])) &&              //la parte del "cuerpo" de la vela es superior al 50% de la magnitud de la amplitud de la vela (vela anterior М1)
     (High[1] - Low[1]) > 70*Point &&                                //la vela anterior tiene una amplitud superior a la amplitud umbral (excluimos el flat obvio)
     (High[2] - Close[2]) < (0.25*(High[2] - Low[2])) &&             //la limitación de la profundidad de la corrección es menor al 20% de la amplitud de la vela (2-da vela en la historia de datos М1)
      High[1] > High[2] &&                                           //tendencia ascendente de los niveles locales de resistencia (dos velas М1)
      Open[1] < High[1] && Open[1] > Low[1] )                        //la presencia de sombra (vela anterior М1) con respecto al precio de apertura de la vela dada
      

Fig. 4. Módulo en el algoritmo de entrada: minimización de riesgos relacionados con la ausencia de tendencia clara en el momento de entrada en el mercado.

Denominaciones:

  • Open[1], Close[1] — los precios de apertura y cierre respectivamente en la barra anterior (М1);
  • МА5_cur, MA8_cur, MA13_cur, MA60_cur los valores de la МА en la barra actual con periodos 5,8, 13, 60, respectivamente (М1);
  • MA4_cur_m15, MA4_prev_m15, MA4_2p_m15 — valores de la МА con periodo 4 en la barra actual, en la anterior y en la segunda en la historia de cotizaciones, respectivamente (М15);
  • MA8_prev_m15 —  el valor de la МА con periodo 8 en la barra anterior en la historia de cotizaciones (М15).

Este tipo de riesgo lo podemos reducir gracias a que se modela una tendencia pronunciada simultáneamente en los dos marcos temporales M1 y M15, a saber:

  • la dirección de las velas anteriores en la dirección de apertura de la posición (dos velas en М1, y una en М15);
  • la dirección de las medias móviles (dos МА en М1, una en М15);
  • la jerarquía de las medias móviles (tres МА en М1 y dos en М15);
  • la posición del precio actual con respecto a las medias móviles, tres МА en М1.

Tal "conjunto de medidas" aumenta significativamente la probabilidad de que el punto de entrada en la posición se encuentre dentro de una tendencia definida, además, en los dos marcos temporales de forma simultánea. En consecuencia, se reducirá la probabilidad de caer en el área plana de las fluctuaciones aleatorias y otras áreas de tendencias difusas. Esto significa que también disminuirá el riesgo relacionado con este factor indeseado.

En nuestro ejemplo se ha analizado la variante para la entrada Buy. Para la entrada Sell, el algoritmo será inverso, en lugar de la dirección ascendente de las velas y las МА, estableceremos la dirección descendente, y el punto de entrada se encontrará por debajo, y no por encima de las МА indicadas.

Riesgos relacionados con la elección incorrecta de la magnitud del periodo de cálculo de los indicadores

Cada tráder ajusta de manera arbitraria el periodo de visualización, incluyendo el de la media móvil, partiendo de la propia experiencia. Hay quien prefiere una МА con periodo 200, a otros le gusta el periodo 50, y cierta gente se decanta por los periodos de la serie de Fibonacci. Es decir, elegimos la configuración específica de los indicadores (en el primer lugar, el periodo que más nos interesa) de manera intuitiva.

La razón de esta intuición forzada reside en que en los métodos de análisis tradicionales no hay mecanismos de identificación de oscilaciones de frecuencia variable en un momento particular. Esto provoca incertidumbre al determinar el periodo de los indicadores. Obviamente, existen métodos de construcción de las funciones adaptativas (Kaufman, FRAMA, etc.), pero sus algoritmos tampoco tienen en cuenta el constante cambio de las frecuencias de las oscilaciones de mercado.

Vamos a analizar una solución parcial al problema: usaremos los métodos de análisis tradicionales, pero introduciremos cierta lógica en la definición de los periodos de las medias móviles. Utilizaremos algunos factores constantes relacionados con el tiempo. En apoyo de este principio interviene el hecho de que los límites de las velas de los marcos temporales mayores son niveles fractales para los movimientos intradía, pero solo si estas velas tienen sombras. Si no tienen sombra, el movimiento puede continuar a la siguiente vela sin la formación de un fractal.

Vamos a correlacionar los marcos teporales y los números de la serie de Fibonacci (de magnitud similar). Obtenemos los siguientes pares de correspondencia aproximada de los marcos temporales y los periodos de cálculo de MA:

  • 1 minuto — número de Fibonacci más cercano 1 (un minuto, es un pivote);
  • 5 minutos — número de Fibonacci más cercano 5 (minutos);
  • 15 minutos — número de Fibonacci más cercano 13 (minutos);
  • 1 hora (60 minutos) — número de Fibonacci más cercano 55 (minutos);
  • 4 horas (240 minutos) — número de Fibonacci más cercano 3 (horas), 5 (horas), 233 (minutos);
  • 1 día (24 horas) — número de Fibonacci más cercano 21 (horas);
  • 5 días (semana comercial, 120 horas para el mercado Fórex) — números de Fibonacci más cercanos 89 (horas) y 144 (horas).

Además, podemos recomendar una opción que minimiza el retraso de la MA:

  • usar en cada marco temporal solo las primeras cifras de la serie: 1 (pivote), 3, 5, 8, 13;
  • usarlas de forma conjunta: pasarlas al marco temporal menor con la ayuda de un coeficiente igual a la relación de los marcos temporales. El uso de una MA con periodos mínimos ayudará a minimizar el retraso de estas funciones.

Como resultado, obtenemos un conjunto de medias móviles para diferentes escalas (por ejemplo, el uso de cuatro marcos temporales):

  • para М1:МА con periodos 5, 8, 13, 55 (o 60 =1 hora), 233 (o 240 = 4 hora);
  • para М15: МА con periodos 5, 8, 13, 55 (o 60=4 horas?);
  • para Н1: МА con periodos 5, 8, 13, 21 (o 24 = 1 día), 89, 144 (o 120 = 5 días);
  • para D1: МА con periodos 5, 8, 13, 21 (o 24 = 1 mes comercial).

Por supuesto, esto es solo un conjunto aproximado de MA, y cualquiera puede añadir sus valores. Pero este principio de selección de periodos de la media móvil tiene derecho a existir. De hecho, muchos factores, como por ejemplo el principio y el final de las sesiones comerciales, las estadísticas de frecuencia, el pago de dividendos, etc. tienen una periodicidad bien establecida. De esta forma, la selección del periodo de los indicadores (en esta caso, la МА), permite tener en cuenta la periodicidad de los eventos en el mercado, y eso significa, en cierta medida, que se reducen los riesgos.

Vamos a utilizar también estas recomendaciones sobre la elección de medias móviles en el desarrollo de otros módulos descritos.

Riesgos relacionados con el uso de órdenes pendientes para entrar en el mercado

Aquí nos referimos a las estrategias de obtención de beneficio donde el nivel meta se establece no con una orden de mercado, sino con una pendiente. Con frecuencia, las órdenes pendientes se usan en las estrategias relacionadas con la salida del precio de las zonas de consolidación.

Como la variedad de este tipo de estrategias es muy amplia, hablaremos acerca de cómo utilizar un par de órdenes pendientes que se colocan a ambos lados de la zona de consolidación, con la esperanza de que una orden se active correctamente, y la segunda se borre en virtud de su inutilidad después de la primera transacción. Además, debemos tener en cuenta que el uso de las órdenes pendientes para determinar el punto de entrada está asociado al riesgo. Después de todo, el nivel en el que se coloca la orden pendiente siempre se determina antes de que suceda el evento de alcance del precio deseado. El nivel de la orden pendiente se determina, por ejemplo, como un porcentaje de la amplitud de la zona de consolidación, o incluso de forma intuitiva, y no tiene nada que ver con la dinámica real de los precios.

Esta es precisamente la principal desventaja de las órdenes pendientes en comparación con las órdenes de mercado: la imposibilidad de evitar la apertura de la posición en el caso de que existan factores negativos en el momento de la entrada. De hecho, justo después del momento en el que se alcanza el precio deseado, la dinámica de mercado puede resultar desfavorable para este tipo de orden pendiente, pero, a pesar de ello, se efectuará la entrada en el mercado. Como resultado, el tráder pierde dinero.

Por eso, si aun así usted quiere operar partiendo de niveles fijos concretos, será más recomendable indicar las órdenes pendientes de forma virtual dentro del algoritmo de entrada, en lugar de indicar las mismas de manera estándar. Solo será necesario entrar en el mercado según las mismas si al cruzarse se registra la dinámica necesaria. Este proceso, por supuesto, es más complejo que las órdenes pendientes clásicas, ya que requiere un algoritmo adicional de control de la dinámica en el momento del cruce con un precio del nivel virtual (necesidad de conocimientos de programación de tal algoritmo). Sin embargo, usted se verá libre de los riesgos derivados de comerciar "a ciegas", inevitables al usar las órdenes pendientes tradicionales.

Este método también tiene defectos. Cuando el precio alcanza el nivel necesario, entraremos con una orden de mercado, pero no con una pendiente, que se reflejará en la plataforma del bróker más tarde que las órdenes pendientes ya colocadas. Si el número de órdenes es grande, aumenta la posibilidad de que haya retrasos en la ejecución relacionados con el establecimiento de prioridades. Si se da un salto brusco en el momento de entrada, es también posible que suceda un deslizamiento.

Así que se encuentra usted en la disyuntiva de elegir entre el riesgo de entrar «a ciegas» con órdenes pendientes y el riesgo que supone el retraso en la ejecución de órdenes. En este caso, la ventaja de utilizar un nivel virtual en el sistema, en general, consiste en que el sistema tiene la posibilidad de cancelar la entrada en el modo automático, si al alcanzar el nivel del mercado no se dan condiciones más favorables para entrar en el mercado.

Nuestra opinión personal es que, dado que el uso de órdenes pendientes aumenta el riesgo, es necesario minimizar este riesgo renunciando a ellas. Tal rechazo se justifica también por el hecho de que la amplitud de los movimientos del precio viene definida solo por el mercado. Y nuestra tarea es solo registrar esos movimientos en un cierto estadio de desarrollo, y después acompañarlos con la ayuda de funciones analíticas.

Riesgos relacionados con la indeterminación de la amplitud del movimiento de los precios después de entrar al mercado

Un error típico que muchos tráders cometen consiste en tender a tratar de definir objetivos concretos con demasiada frecuencia. Mientras tanto, en las condiciones no estacionarias y aleatorias del movimiento de precios, la amplitud final es un valor de probabilidad. Por lo tanto, como en el ejemplo con órdenes pendientes analizado anteriormente, la colocación de niveles meta fijos y específicos para fijar el beneficio (es decir, para determinar el punto del mercado de rendimiento) es intuitivo. Por eso, este enfoque a menudo conduce a pérdidas.

El algoritmo de salida del mercado debe tener o bien una función de control de los signos de retraso (es decir, una función adaptativa), o bien una función de control de la magnitud fija de la amplitud con respecto a ciertos niveles (nivel de entrada, máximo o mínimo actual dentro de una posición abierta). Vamos a añadir también a la segunda variante el control del límite de riesgo, tanto en la posición, como del depósito en general. Nos detendremos en la última opción, la más sencilla. Vamos a ver un fragmento de código:

 //MINIMIZAMOS LOS RIESGOS RELACIONADOS CON LA INDETERMINACIÓN DE LA AMPLITUD DEL MOVIMIENTO DE LOS PRECIOS DESPUÉS DE ENTRAR EN EL MERCADO-- 
             
              //Control de la magnitud del beneficio fijo (de la posición):
              (Bid > OrderOpenPrice() && (Bid - OrderOpenPrice()) >= 100*Point)                       //condición de salida en la zona de beneficios (take-profit de la sombra)
                     ||
                     
             //Control de la magnitud de la desviación máxima permisible del precio 
             //con respecto al máximo actual después de la entrada del mercado:    
             (shift_buy >= 1 &&                                                                          //un desplazamiento no inferior a 1 barra desde el punto de entrada
             Time_cur > OrderOpenTime() && Max_pos > 0 && OrderOpenTime() > 0 && OrderOpenPrice() > 0 && //tenemos un máximo actual después de la entrada
             Max_pos > OrderOpenPrice() &&                                                               //el máximo actual se encuentra en la zona de beneficios
             Bid < Max_pos &&                                                                            //tenemos un movimiento inverso de precio
             (Max_pos - Bid) >= 200*Point)                                                               //magnitud del movimiento inverso con respecto al máximo actual para la salida del mercado
                    ||
                      
             //Control de un límite de riesgo (de la posición) establecido de antemano:     
              (Bid < OrderOpenPrice() && (OrderOpenPrice() - Bid) >= 200*Point)                          //condiciones de salida en la zona de pérdidas (stop-loss de la sombra)
                    ||
                    
             //Control del límite de riesgo (del depósito) establecido de antemano:
              (AccountBalance() <=  NormalizeDouble( (Depo_first*((100 - Percent_risk_depo)/100)), 0)) )  //si con el comercio actual se supera el límite total de riesgo de la posición

Fig.5. Módulo en el algoritmo de salida: minimizar los riesgos asociados con la incertidumbre de la amplitud del movimiento de precio después de la entrada en el mercado.

Denominaciones:

  • OrderOpenPrice() — precio en la entrada del mercado;
  • Shift_buy —  desplazamiento (en barras en М1) con respecto al punto de entrada (es imprescindible para definir el máximo dentro de la posición abierta);
  • Max_pos  — nivel del máximo dentro de una posición abierta;
  • AccountBalance()valor actual del balance del depósito en dinero;
  • Depo_first — depósito inicial en dinero;
  • Percent_risk_depo — porcentaje de pérdidas totales máximas permitidas del depósito.

La minimización de este tipo de riesgo se logra gracias al uso de las siguientes funciones:

  • El control del beneficio fijo de la posición, esto es, en esencia, el take-profit «de la sombra».
  • El control de la desviación máxima del precio con respecto al máximo actual (para Buy) o el mínimo actual (para Sell) tras la entrada en el mercado.
  • El control del límite de riesgo preestablecido para la posición: el stop-loss "de la sombra".
  • El control del límite de riesgo preestablecido para todo el depósito.

En todos estos casos, controlamos un valor determinado de la amplitud con respecto a los niveles que pueden cambiar su valor. Se trata del nivel de entrada, del máximo dentro de la posición abierta y de la magnitud del valor inicial del depóstio. Por eso, a diferencia de los rígidos niveles meta, en este caso, estos objetivos no son niveles fijos.

Ya hemos analizado un ejemplo del módulo en el algoritmo de cierre de posición Buy. Para el módulo Sell, los cambios solo afectarán a la dirección del movimiento. En lugar del máximo actual dentro de la posición (Max_pos), se usará el mínimo actual (Min_pos).

En el próximo apartado, analizaremos los riesgos que tienen en cuenta no solo la amplitud, sino también la velocidad, lo que es especialmente importante cuando los precios de mercado se desploman.

Riesgos relacionados con el desplome del precio después de entrar en el mercado

Una de las formas más peligrosas de viraje de una tendencia local comprende el desplome y los saltos bruscos de gran amplitud en un intervalo corto de tiempo. El salto de una de las divisas de la pareja siempre conlleva el desplome de la otra. Esto es especialmente peligroso si hay una posición abierta cuando la dirección del desplome es inversa a su dirección. En esta situación, un pequeño depósito podría perderse por completo.

Esencia del problema

  • La velocidad de desplome de los precios se encuentra más allá de la reacción adecuada de los participantes del mercado.
  • En los análisis modernos no existe ningún mecanismo para la identificación de las estructuras dinámicas inherentes a la caída rápida de los precios.
  • Si hay una posición abierta, los participantes del mercado están completamente expuestos ante un colapso de los precios. En una etapa temprana, detectar un desplome es problemático, y reaccionar al mismo es imposible, debido a que el pico principal ya ha pasado el movimiento, o bien porque el mercado está bloqueado debido a que ha cundido el pánico en la cadena de intermediarios y bancos.

El resultado es una enorme pérdida para los comerciantes. Por ejemplo, el 6 de mayo 2010 el Dow Jones cayó 1000 puntos en solo 6 minutos, mientras que, de acuerdo con las estimaciones de los expertos, el mercado perdió un billón de dólares.

Aquí tenemos un ejemplo más reciente (fig. 6), la salida de Reino Unido de la UE, que provocó un hundimiento de 560 puntos de GBPUSD el 24 de junio de 2016. 473 puntos de ellos se perdieron en solo un minuto:

GBPUSD 24/06/2014

Fig. 6. Desplome del precio de GBPUSD el 24 de junio de 2016.

Las razones globales del desplome del precio son tres.

  1. La naturaleza del propio mercado. Los desplomes no constituyen un fenómeno ajeno: son una manifestación natural de la dinámica de mercado. Entre otras cosas, pueden ser causados por un fuerte salto en la velocidad de cambio de los precios (en particular, debido al crecimiento en el número de participantes en el mercado, incluyendo los robots comerciales). Por ejemplo, de acuerdo con informes de la prensa, pueden registrarse miles de fluctuaciones ultrarrápidas de menos de 1 segundo en el mercado de valores de los Estados Unidos.
  2. Nivel de desarrollo del análisis. Los métodos de identificación de tales manifestaciones del mercado son imperfectos. Para reaccionar a los desplomes, no se necesita un análisis en fracciones de minuto, sino un marco temporal de segundos para plataformas comerciales.
  3. Deficiencias en la ley que regula las actividades de los mercados financieros. Por ejemplo, no existen mecanismos legales para combatir la manipulación artificial del precio que realizan los creadores de mercado.

Aquí puede ver un ejemplo sobre cómo un experto basado en MACD no tiene tiempo para responder a la fuerte caída de los precios de la pareja USDCHF:


USDCHF- MACD

Fig. 7. El experto basado en el indicador MACD no tiene tiempo de reaccionar ante la caída de los precios de USDCHF el 2 de octubre de 2015.

En la figura 7 se ve que el experto ha abierto dos posiciones: una antes del colapso de los precios (flecha 1), y la otra, después (flecha 2). Pero no ha reaccionado al propio impulso tras el colapso, puesto que, sencillamente, no lo ha «notado».

De esta forma, si usted tiene una posición abierta, correrá un riesgo enorme de perder una gran parte del depósito cuando suceda un desplome o un rally (aumento sostenido de precio). Por eso, en el algoritmo de cierre de posición deberá incluirse un módulo de protección contra estas situaciones.

Vamos a ver un fragmento de código:

 if( 
            //MINIMIZAMOS LOS RIESGOS RELACIONADOS CON LOS DESPLOMES DE PRECIO DESPUÉS DE ENTRAR EN EL MERCADO----------------------
            
              (Bid < Open[0] && (Open[0] - Bid) >= 100*Point && (Time_cur - Time[0]) <= 20)           //condiciones de salida (en cualquier zona) al desplomarse los precios (el punto de control es el precio de apertura de la vela actual М1)
                     ||
              (Bid < O_cur_m15 && (O_cur_m15 - Bid) >= 200*Point && (Time_cur - Time_cur_m15) <= 120) //condiciones de salida (en cualquier zona) al desplomarse los precios (el punto de control es el precio de apertura de la vela actual М15)
                     ||
              ((Time_cur - OrderOpenTime()) > 60 && Close[1] < Open[1] && 
              (Open[1] - Close[1]) >= 200*Point)                                                      //condiciones de salida en cualquier zona al desplomarse los precios (el parámetro de control es la amplitud de la anterior vela М1)
                     ||

Fig. 8. El módulo en el algoritmo de salida existe para minimizar los riesgos asociados con el desplome de los precios después de entrar en el mercado.

El riesgo de desplome de los precios después de la posición de apertura se reduce al mínimo como sigue.

  • Se establecen los valores límite de desviación inversa (desplome) del precio con respecto al nivel de apertura de la vela actual por separado en diferentes marcos temporales (en esta caso, se trata de М1 y М15), así como la duración máxima permitida del mencionado desplome.
  • Se establece el desplome máximo permitido en forma de vela anterior finalizada en М1 (puesto que se trata de una vela de minuto, también se establece de forma indirecta el tiempo del desplome).

De esta forma, el desplome se controla también al inicio de la vela actual (según el desplome en la vela anterior), y en el proceso de desarrollo de la vela actual. Si aparece cualquiera de las condiciones mencionadas (según el "o" lógico), la posición se cierra y el riesgo se minimiza.

En este ejemplo, se muestra el módulo para el cierre de la posición Buy. Para cerrar la posición Sell, será necesario tener en cuenta de forma inversa la dirección del precio.

Riesgos relacionados con el uso de un solo marco temporal durante el análisis.

Los cambios de precio se reflejan de diferentes formas en los gráficos de diferentes marcos temporales. Una tendencia clara en un marco temporal menor podría resultar solo una pequeña corrección si lo analizamos en el mayor periodo del gráfico.

Por lo tanto, para analizar al completo la dinámica de los movimientos de precio, esta debe analizarse conforme a varios marcos temporales, uno solo no basta.

¿Cuántos marcos temporales hay que usar en el análsis? Eso depende de cada uno. Personalmente, nosotros usamos simultáneamente cuatro marcos temporales (en cuatro pantallas), verá por qué:

  • М1: en este marco se ven bien tanto los virajes de las tendencias (incluidas las globales), como los desplomes rápidos del mercado;
  • M15: las velas en este periodo a menudo reflejan estructuras dinámicas completas de los desplomes de mercado más rápidos, formados en los marcos temporales menores (M1, M5);
  • H1: las velas en este marco temporal son limitadores temporales naturales (incluyendo las sesiones comerciales, la publicación de los indicadores macroeconómicos, la información de los medios de comunicación, etc.);
  • D1: las velas en este marco temporal son limitadores naturales (incluyendo los días de negociación dentro de la semana).

Este conjunto de marcos temporales me parece óptimo, ya que permite analizar con precisión la dinámica del mercado. Por supuesto, es necesaria cierta experiencia en la percepción «conjunta» del movimiento de los precios, pero se trata de una condición indispensable a la hora de trabajar en los mercados financieros.

Dado que el uso de un solo marco temporal aumenta inevitablemente los riesgos de negociación, en el código del algoritmo de entrada debe estar presente el análisis de velas, MA y otros indicadores que se aplican a múltiples marcos temporales.

Riesgos relacionados con el uso de un solo tipo de análisis (técnico o fundamental)

Muchos factores afectan al movimiento de los precios. El mercado es un sistema con comportamiento propio, basado en los intereses económicos de sus integrantes. El análisis técnico (que se basa en el trabajo de los robots comerciales) utiliza un solo tipo de información: el nivel de precios de un instrumento financiero en particular. A su vez, el análisis fundamental también analiza solamente un tipo de datos (por ejemplo, la velocidad de los factores macroeconómicos específicos). Es obvio que este tipo de análisis sería incompleto, unilateral, y por lo tanto, impreciso. Sería incorrecto analizar solo los precios, excluyendo los factores que intervienen en su movimiento o solo los indicadores fundamentales, sin tener en cuenta el movimiento real del precio.

Es más conveniente utilizar ambos tipos de análisis de forma conjunta, ya que se complementan entre sí de forma lógica. Los factores fundamentales, en general (pero no de forma absoluta), determinan la dirección del movimiento de los precios, mientras que los factores técnicos la confirman. Sin embargo, la primacía de los factores fundamentales sobre los técnicos no es absoluta.

En algunas situaciones, el mercado es más sensible a los factores técnicos que a los fundamentales: sucede en los momentos en que se alcanzan máximos históricos. Un ejemplo claro de ello son los desplomes ocasionales del bitcóin (a veces de hasta un 20% al día) inmediatamente después de alcanzar el máximo histórico. Sin embargo, el ejemplo del bitcóin no es bastante indicativo, puesto que el análisis fundamental de criptomonedas es en principio problemático, debido a la especificidad del mercado.

Pero en el caso de las operaciones de Fórex, y sobre todo en el mercado de valores, el papel del análisis fundamental es obvio. Por ejemplo, el desplome del precio de la pareja USDCHF (en octubre de 2015) fue provocado, sin duda, por el hecho de que el Banco de Suiza «desligara» el curso del franco del curso del euro.

Por eso, a nuestro juicio, sería recomendable renunciar a la vieja búsqueda de la hegemonía entre el análisis técnico y el fundamental, para adoptar el análisis combinado. Esto plantea inmediatamente la pregunta: ¿cómo utilizar el análisis fundamental para el comercio automatizado, visto que el algoritmo del sistema comercial analiza solo los parámetros técnicos del mercado?

Podemos ofrecer dos variantes de integración del análisis fundamental en el sistema comercial.

  • Opción 1. Intentar introducir los parámetros fundamentales en el algoritmo del sistema comecial, transformándolos en técnicos (por ejemplo, incorporar los datos del calendario económico definiendo la lógica de acción de estos indicadores).
  • Variante 2. Limitar manualmente la dirección de entrada en el mercado dentro del experto comercial (solo en aquella dirección que se corresponda con los índices fundamentales).

Como podemos ver, utilizar el análisis fundamental en el trading algorítmico es incómodo, pero es también el método correcto. El uso combinado del análsis técnico y el fundamental en el comercio manual es más sencillo: es importante que tanto los analistas como los tráders principiantes dominen sus fundamentos.


Riesgos no relacionados con la dinámica de mercado

Los factores externos: operacionales, financieros y legales también forman parte del proceso comercial. Ellos juegan un papel igualmente importante en la aparición de riesgos. Por lo tanto, si es posible, deben tenerse en cuenta en el desarrollo del sistema comercial.

Vamos a definir una lista con ellos.

Clasificación de los riesgos relacionados con la dinámica de mercado

Éstos son los posibles riesgos más comunes no relacionados con la dinámica de precios.

  • Riesgos relacionados con la estructura del sistema comercial.
  • Riesgos relacionados con la superación del límite de pérdidas del depósito (control del límite del riesgo del inversor según el depósito).
  • Riesgos relacionados con los cambios negativos de las condiciones comerciales.
  • Riesgos determinados por la calidad de la conexión con el servidor comercial de bróker.
  • Riesgos determinados por el permiso de comercio automático en el lado del bróker o del cliente.
  • Riesgos relacionados con el cambio de la legislación en el área de los mercados financieros.

Vamos a analizar los riesgos y a trazar medidas para minimizarlos.

Riesgos relacionados con la estructura del sistema comercial

La norma principal es la siguiente: la estructura del sistema comercial deberá tener en cuenta la estructura de los riesgos. Es necesario incluir una protección contra el mayor número posible de los riesgos discutidos anteriormente. Esto aumentará la eficiencia del comercio.

Pero, al aumentar el número de bloques para reducir al mínimo los riesgos, inevitablemente, aumentará el número de filtros, ya que cualquier forma de evitar un riesgo es esencialmente un filtro. Como resultado, topamos con un «filtrado excesivo» de los algoritmos de entrada del robot comercial. Además, la mayoría de los comerciantes creen que el robot debe comerciar activamente, abriendo posiciones, como mínimo, a diario. En este sentido, el comerciante encarga un robot, y por su parte, tal requisito parece ser bastante lógico. Sin embargo, desde el punto de vista de la comprensión de la naturaleza del proceso, esto, en nuestra opinión, es un error, y he aquí por qué.

El algoritmo de cualquier robot comprende siempre la simulación de procesos dinámicos complejísimos, inevitablemente simplificados. Errores asociados con la falta de correspondencia entre el modelo de un robot y la dinámica de mercado.

Cada desarrollador sabe que existe una relación entre el número de entradas del sistema comercial y el volumen de filtrado en el algoritmo de entrada. Cuanto mayor sea el volumen del filtrado, menor será el número de entradas, y viceversa. Además, en general, al aumentar el volumen de filtrado, se mejora el resultado financiero. Pero, por supuesto, todo depende del contenido de los filtros. Está claro que para cada sistema comercial es necesario encontrar un compromiso entre el número de entradas y los resultados financieros, y más específicamente, el riesgo máximo (reducción del depósito). Precisamente esto se conoce como optimización tradicional.

¿Y qué, exactamente, se entiende por filtrado?

Si se trata de la separación de la señal útil de todo el espectro, entonces serán necesarios criterios de utilidad claros. Pero estos no se encuentran en el análisis tradicional: la activación de los indicadores tradicionales no se puede definir como filtrado "correcto" de un proceso tan complejo como lo es el movimiento de los precios. Si, por ejemplo, al buscar una señal útil usamos las estructuras ondulatorias de Elliott o las figuras del análisis técnico, entonces podemos desconfiar de todos ellas en el análisis, ya que cada tráder las define de manera diferente en el mismo gráfico.

Por eso, la estructura del sistema comercial deberá ser tal que pueda minimizar los riesgos de filtrado de los valores críticos de los parámetros conforme a los cuales se determinan estos riesgos. Sin embargo, existe gran cantidad de riesgos, y el grado de filtrado aumenta con su número. Por ello, al evaluar la eficacia de un robot aparte, lo principal no es el número de entradas, sino que proporcione un beneficio estable (aunque bajo), asumiendo un riesgo (reducción) aceptable. Además, el número de entradas (cuando se simula un instrumento financiero) puede ser insignificante. El beneficio se puede aumentar comerciando de forma simultánea con varias parejas de divisas.

De aquí podemos sacar la conclusión:

El número de posiciones abiertas es un factor secundario en la valoración de la calidad del trabajo. Lo principal es la estabilidad relativa en la obtención de beneficios.

Para evaluar la eficacia de un sistema comercial es necesario realizar pruebas con varios instrumentos financieros. Esto aumenta la calidad de la simulación y mejora el resultado:

  • El sistema comercial se simula con diferentes escenarios de dinámicas de mercado;
  • Si los resultados de la simulación son positivos con varios instrumentos, la ganancia total en el depósito crece. De esta manera, se cumple con los requisitos de los inversores sobre la cantidad de beneficios.

Por lo tanto, la optimización del sistema comercial debe limitarse a la elección de una configuración que demuestre éxito en las pruebas de varios instrumentos financieros.

Riesgos relacionados con la superación del límite de pérdidas del depósito

Antes de empezar a negociar, es necesario establecer un límite de riesgo en el depósito comercial. Este será un valor fijo, absoluto (en términos monetarios) o relativo (porcentaje de la cantidad inicial del depósito). Al alcanzar dicho valor, el comercio se detendrá.

Si usted le confía el control de la cuenta a un tráder con mayor experiencia, la magnitud del límite de riesgo se deberá indicar en el contrato.

Si usted comercia por sí mismo, será necesario añadir código tanto al algoritmo de entrada (prohibición de la entrada al superar el límite de riesgo), como al algoritmo de cierre de posición (esto ya lo hemos analizado en el apartado «Riesgos asociados con la incertidumbre de la amplitud del movimiento de precio después de la entrada en el mercado"). El doble control sobre el depósito es necesario porque el límite de riesgo del depósito se alcanza en primer lugar cuando hay una posición abierta (esto se fija en el algoritmo de salida del mercado). Luego hay que bloquear las siguientes entradas, ya que se ha alcanzado el límite de riesgo del depósito (esto se fija en el módulo antes del algoritmo de entrada en el mercado).

Vamos a ver un fragmento de código:

 //CONTROL DE LOS PARÁMETROS FINANCIEROS RELACIONADOS CON EL LÍMITE TOTAL DE RIESGO DEL DEPÓSITO DEL CLIENTE-------------------------------
  
  if(kol < 1) //no hay órdenes
  {
   if(AccountBalance() <=  NormalizeDouble( (Depo_first*((100 - Percent_risk_depo)/100)), 0))//si se ha superado anteriormente el límite total de riesgo del depósito 
    {
     Print("Entrada prohibida, se ha alcanzado anteriormente el límite total de riesgo=",Percent_risk_depo, " % del depósito=", Depo_first);
     Alert("Entrada prohibida, se ha alcanzado anteriormente el límite total de riesgo=",Percent_risk_depo, " % del depósito=", Depo_first); 
     return;
    }
    
    
   if(AccountFreeMargin() < (1000*Lots)) //si no hay recursos de margen suficientes permitidos para la apertura de órdenes en la cuenta actual
    {
     Print("No hay recursos de margen suficientes. El margen libre de la cuenta= ",AccountFreeMargin());
     Alert("No hay recursos de margen suficientes. El margen libre de la cuenta = ",AccountFreeMargin());
     return; //...entonces, salimos
    } 
  }     
        
 //-------------- 

Fig. 9. El módulo hasta el algoritmo de entrada: minimización de riesgos relacionados con la superación del límite de pérdidas del depósito.

En el primer bloque se controla el estado del depósito del cliente (variable AccountBalance()). Variables configurables:

  • Depo_first — magnitud inicial del depósito en dinero;
  • Percent_risk_depo — límite de pérdidas del depósito (en % de su magnitud inicial).

El algoritmo se activa si las pérdidas del depósito alcanzan el valor establecido con la variable Percent_risk_depo. Al mismo tiempo, se prohíbe la entrada al mercado, y salimos del programa.

En el segundo bloque se controla el valor del margen en la cuenta, con el cual se permite la entrada en el mercado. El algoritmo se activa cuando el volumen de los recursos del margen está por debajo de un cierto número de lotes. La entrada en el mercado se prohíbe, y salimos del programa.

Riesgos relacionados con la llegada de condiciones desfavorables para el comercio

Tales factores pueden incluir: la calidad de las cotizaciones proporcionadas por el bróker; la expansión del spread en el momento de la apertura y el cierre de posiciones; el deslizamiento del precio al ejecutar las órdenes; el retraso en la ejecución de las órdenes.

Todo esto puede afectar en gran medida a los resultados comerciales (hasta una pérdida total del depósito), por lo que necesitamos controlar los parámetros relevantes. En especial, será necesario monitorizar de forma automática los valores de precio, el spread, el momento de activación del algoritmo de entrada y salida, y luego compararlos con los valores de apertura y cierre reales de las posiciones.

Usted puede desarrollar de forma independiente un módulo igual en su sistema de comercio.


Riesgos determinados por la calidad de la conexión con el servidor comercial de bróker

La calidad de la comunicación con el servidor comercial depende de dos factores:

  • si está conectado el servidor comercial en el lado del bróker;
  • si funciona internet en el lado del cliente.

El segundo factor se puede excluir si ubicamos el terminal de cliente en un servidor externo. El primer factor se comprueba de forma programática, mediante la adición de código al algoritmo del sistema comercial.

Vamos a ver un fragmento de código:

 if(IsConnected() == false) //comprobamos el estado de la conexión principal del terminal de cliente con el servidor del bróker
    {
     Print("La entrada está prohibida, el servidor del bróker está desactivado"); 
     Alert("La entrada está prohibida, el servidor del bróker está desactivado");
     return;
    } 

Fig. 10. Módulo para minimizar los riesgos relacionados con la calidad de la conexión con el servidor comercial del bróker.

La figura 10 muestra un fragmento de código que permite controlar la comunicación con el servidor del bróker. Debemos integrarlo en el asesor antes del algoritmo de entrada. Si aparecen las condiciones indicadas, se bloqueará la apertura de posiciones.

Riesgos relacionados con la existencia de permisos para el comercio automático en el lado del bróker y en el lado del cliente

En ocasiones, el sistema comercial envía una orden al terminal de cliente, pero esta no se ejecuta. Pero, además, en este caso, la entrada no está prohibida por el propio sistema comercial. Las posibles razones para esto son:

  • en el terminal de cliente no se han marcado las casillas de verificación para permitir el comercio automático en el lado del cliente;
  • no hay permiso para comerciar en la cuenta comercial actual en el lado del bróker.

Para hacer frente a estos riesgos, es necesario controlar si está permitido el comercio automatizado en el programa del sistema comercial.

Vamos a ver un fragmento de código:

 if(IsTradeAllowed() == false) //comprobando la posibilidad de comerciar con la ayuda de expertos (flujo del bróker, permiso de comerciar)
    {
     
     Print("La entrada está prohibida, el flujo comercial del bróker no está libre, o bien el robot comercial no tiene permiso de negociar :", IsTradeAllowed()); 
     Alert("La entrada está prohibida, el flujo comercial del bróker no está libre, o bien el robot comercial no tiene permiso de negociar :", IsTradeAllowed());
     return;
    } 
    
    
    if( !AccountInfoInteger(ACCOUNT_TRADE_EXPERT) ) //comprobando las propiedades de la cuenta comercial
    {
     Print("El comercio automático está prohibido para la cuenta :", AccountInfoInteger(ACCOUNT_LOGIN), "en el lado del servidor comercial"); 
     Alert("El comercio automático está prohibido para la cuenta :", AccountInfoInteger(ACCOUNT_LOGIN), "en el lado del servidor comercial"); 
     return;
    }
    
    
    if(IsExpertEnabled() == false) //comprobando el permiso para el inicio de expertos en el terminal de cliente
    {
     
     Print("La entrada está prohibida, el robot no tiene permiso de comerciar en el terminal de cliente :", IsExpertEnabled()); 
     Alert("La entrada está prohibida, el robot no tiene permiso de comerciar en el terminal de cliente :", IsExpertEnabled());
     return;
    } 
    
    
   if(IsStopped() == true) //comprobando la llegada del comando para finalizar la ejecución del programa mql4
    {
     Print("La entrada está prohibida, ha llegado el comando de finalización del funcionamiento del programa mql4"); 
     Alert("La entrada está prohibida, ha llegado el comando de finalización del funcionamiento del programa mql4");
     return;
    } 

Fig. 11. Módulo de minimalización de los riesgos relacionados con la existencia de permisos para el comercio automático en el lado del bróker y en el lado del cliente

El fragmento de código anterior supervisa el estado de los permisos para el comercio automatizado tanto en el lado del bróker como en el lado del cliente. Al darse cualquiera de las condiciones de entrada indicadas, la entrada en el mercado será imposible.

Riesgos relacionados con el cambio de la legislación en el área de los mercados financieros

Estas son las reglas de relación mutua en la industria de los mercados financieros que afectan directa o indirectamente a los riesgos del cliente. En varios países se están desarrollando leyes que regulen las relaciones en los mercados bursátiles y financieros. En el futuro, muchos de los riesgos asociados con diversas infracciones deberían reducirse.

Ejemplo de un experto sencillo que tiene en cuenta algunos de estos riesgos

Bien, ya hemos identificado y analizado tanto los riesgos relacionados como los no relacionados con la dinámica del mercado, así como algunas soluciones específicas para reducirlos.

Los riesgos se reducen al mínimo incorporando módulos especiales al asesor (algoritmo de entrada, algoritmo de entrada en el mercado, algoritmo de salida del mercado). Cada módulo controla su propio tipo de riesgo.

Los principales elementos de análisis son las velas de los diferentes marcos temporales. Se ha analizado la dinámica tanto dentro de las velas (análisis de estructura única), como entre ellas (análsis de un grupo de estructuras).

A continuación, se muestra el código de un sencillo asesor en el que hemos implementado soluciones para minimizar algunos de los riesgos que hemos analizado. Preste atención: de los indicadores tradicionales, se usa solo la media móvil (teniendo en cuenta las limitaciones de las que hemos hablado anteriormente).

Código del experto para las cotizaciones con 5 dígitos (o 3 dígitos para USDJPY):

//+------------------------------------------------------------------+
//|                                                 Reduce_risks.mq4 |
//|                            Copyright 2017, Alexander Masterskikh |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright   "2017, Alexander Masterskikh"
#property link        "https://www.mql5.com/ru/users/a.masterskikh"

input double TakeProfit     = 600;   //take-profit                                    
input double StopLoss       = 300;   //stop-loss                                 
input double Lots           = 1;     //número de lotes
input int Depo_first        = 10000; //magnitud inicial del depósito del cliente, en dinero
input int Percent_risk_depo = 5;     //riesgo máximo total permitido del depósito (en % de la suma del depósito del cliente)
input bool test             = false; //indicar: para la simulación, true (por defecto - para el comercio, false)

//-------------------------------------------------------------------------------------------------

void OnTick(void)
  {
   //---definiendo las variables---
   int f,numb,kol;
   double sl_buy, tp_buy, sl_sell, tp_sell;
   double L_prev_m15, L_2p_m15, L_3p_m15; 
   double H_prev_m15, H_2p_m15, H_3p_m15;
   double O_cur_m15, O_prev_m15, O_2p_m15, C_prev_m15, C_2p_m15;
   double MA4_cur_m15, MA4_prev_m15, MA4_2p_m15, MA5_prev_m15, MA8_cur_m15, MA8_prev_m15, MA8_2p_m15;
   double MA8_cur, MA8_prev, MA8_2p, MA8_3p, MA5_cur, MA5_prev, MA5_2p, MA13_cur, MA13_prev, MA13_2p,  
       MA60_cur, MA60_prev, MA60_2p, MA24_cur_h1;
   double C_prev_h1, O_prev_h1, H_prev_h1, L_prev_h1, H_2p_h1, L_2p_h1;    
   datetime Time_cur, Time_cur_m15; 
   double shift_buy, shift_sell;
   double Max_pos, Min_pos;    
  //--------

   //CONTROL DE LOS PARÁMETROS TÉCNICOS (ESTADOS Y PERMISOS)- EN EL LADO DEL BRÓKER Y EN EL LADO DEL TERMINAL DE CLIENTE-------------------------------
   
 if(test==false) //comprobamos: simulación o comercio (simulación -true, comercio -false)
 {//comienzo de los parámetros que no se comprueban al simular con datos históricos---
     
    if(IsConnected() == false) //comprobamos el estado de la conexión principal del terminal de cliente con el servidor del bróker
    {
     Print("La entrada está prohibida, el servidor del bróker está desactivado"); 
     Alert("La entrada está prohibida, el servidor del bróker está desactivado");
     return;
    } 
    
    
    if(IsTradeAllowed() == false) //comprobando la posibilidad de comerciar con la ayuda de expertos (flujo del bróker, permiso de comerciar)
    {
     
     Print("La entrada está prohibida, el flujo comercial del bróker no está libre, o bien el robot comercial no tiene permiso de negociar :", IsTradeAllowed()); 
     Alert("La entrada está prohibida, el flujo comercial del bróker no está libre, o bien el robot comercial no tiene permiso de negociar :", IsTradeAllowed());
     return;
    } 
    
    
    if( !AccountInfoInteger(ACCOUNT_TRADE_EXPERT) ) //comprobando las propiedades de la cuenta comercial
    {
     Print("El comercio automático está prohibido para la cuenta :", AccountInfoInteger(ACCOUNT_LOGIN), "en el lado del servidor comercial"); 
     Alert("El comercio automático está prohibido para la cuenta :", AccountInfoInteger(ACCOUNT_LOGIN), "en el lado del servidor comercial"); 
     return;
    }
    
    
    if(IsExpertEnabled() == false) //comprobando el permiso para el inicio de expertos en el terminal de cliente
    {
     
     Print("La entrada está prohibida, el robot no tiene permiso de comerciar en el terminal de cliente :", IsExpertEnabled()); 
     Alert("La entrada está prohibida, el robot no tiene permiso de comerciar en el terminal de cliente :", IsExpertEnabled());
     return;
    } 
    
    
   if(IsStopped() == true) //comprobando la llegada del comando para finalizar la ejecución del programa mql4
    {
     Print("La entrada está prohibida, ha llegado el comando de finalización del funcionamiento del programa mql4"); 
     Alert("La entrada está prohibida, ha llegado el comando de finalización del funcionamiento del programa mql4");
     return;
    } 
    
 } //aquí finalizan los parámetros que no se comprueban al simular con datos históricos
 
 
  //Controlamos que el número de cotizaciones en el terminal sobre el símbolo utilizado sea suficiente---
      
     if(Bars<100)
     {
      Print("número insuficiente de barras en el gráfico actual");
      return; 
     }
     
  //Controlamos la instalación del experto en el marco temporal necesario----
  
    if(Period() != PERIOD_M1)
    {
     Print("el experto se ha instalado de forma incorrecta, instale el experto en el marco temporal :", PERIOD_M1);
     Alert("el experto se ha instalado de forma incorrecta, instale el experto en el marco temporal:", PERIOD_M1);
     return;
    }
 
  //Controlamos la instalación del experto en los gráficos de los instrumentos financieros necesarios----
  
   if(Symbol() != "EURUSD" && Symbol() != "USDCHF" && Symbol() != "USDJPY") 
     {
     Print("el experto ha sido instalado de forma incorrecta-instrumento financiero no autorizado"); 
     Alert("el experto ha sido instalado de forma incorrecta-instrumento financiero no autorizado");
     return;
    } 
    
    //----------
    
    
  //CONTROL DE LOS PARÁMETROS FINANCIEROS RELACIONADOS CON EL LÍMITE TOTAL DE RIESGO DEL DEPÓSITO DEL CLIENTE-------------------------------
  
  if(kol < 1) //no hay órdenes
  {
   if(AccountBalance() <=  NormalizeDouble( (Depo_first*((100 - Percent_risk_depo)/100)), 0))//si se ha superado anteriormente el límite total de riesgo del depósito 
    {
     Print("Entrada prohibida, se ha alcanzado anteriormente el límite total de riesgo=",Percent_risk_depo, " % del depósito=", Depo_first);
     Alert("Entrada prohibida, se ha alcanzado anteriormente el límite total de riesgo=",Percent_risk_depo, " % del depósito=", Depo_first); 
     return;
    }
    
    
   if(AccountFreeMargin() < (1000*Lots)) //si no hay recursos de margen suficientes permitidos para la apertura de órdenes en la cuenta actual
    {
     Print("No hay recursos de margen suficientes. El margen libre de la cuenta= ",AccountFreeMargin());
     Alert("No hay recursos de margen suficientes. El margen libre de la cuenta = ",AccountFreeMargin());
     return; //...entonces, salimos
    } 
  }     
        
 //-------------- 
        
         
  //Valores de las variables:
 
    L_prev_m15 = iLow(NULL,PERIOD_M15,1);
    L_2p_m15 = iLow(NULL,PERIOD_M15,2);
    L_3p_m15 = iLow(NULL,PERIOD_M15,3);
    H_prev_m15 = iHigh(NULL,PERIOD_M15,1);
    H_2p_m15 = iHigh(NULL,PERIOD_M15,2);
    H_3p_m15 = iHigh(NULL,PERIOD_M15,3);
    
    O_cur_m15 = iOpen(NULL,PERIOD_M15,0);
    O_prev_m15 = iOpen(NULL,PERIOD_M15,1);
    O_2p_m15 = iOpen(NULL,PERIOD_M15,2);
    C_prev_m15 = iClose(NULL,PERIOD_M15,1);
    C_2p_m15 = iClose(NULL,PERIOD_M15,2);
    Time_cur_m15 = iTime(NULL,PERIOD_M15,0);
    
    C_prev_h1 = iClose(NULL,PERIOD_H1,1);
    O_prev_h1 = iOpen(NULL,PERIOD_H1,1);
    H_prev_h1 = iHigh(NULL,PERIOD_H1,1);
    L_prev_h1 = iLow(NULL,PERIOD_H1,1);
    H_2p_h1 = iHigh(NULL,PERIOD_H1,2);
    L_2p_h1 = iLow(NULL,PERIOD_H1,2);
    
    MA4_cur_m15 = iMA(NULL,PERIOD_M15,4,0,MODE_SMA,PRICE_TYPICAL,0);
    MA4_prev_m15 = iMA(NULL,PERIOD_M15,4,0,MODE_SMA,PRICE_TYPICAL,1);
    MA4_2p_m15 = iMA(NULL,PERIOD_M15,4,0,MODE_SMA,PRICE_TYPICAL,2);
    MA5_prev_m15 = iMA(NULL,PERIOD_M15,5,0,MODE_SMA,PRICE_TYPICAL,1);
    MA8_cur_m15 = iMA(NULL,PERIOD_M15,8,0,MODE_SMA,PRICE_TYPICAL,0);
    MA8_prev_m15 = iMA(NULL,PERIOD_M15,8,0,MODE_SMA,PRICE_TYPICAL,1);
    MA8_2p_m15 = iMA(NULL,PERIOD_M15,8,0,MODE_SMA,PRICE_TYPICAL,2);

    MA8_cur = iMA(NULL,PERIOD_M1,8,0,MODE_SMA,PRICE_TYPICAL,0);
    MA8_prev = iMA(NULL,PERIOD_M1,8,0,MODE_SMA,PRICE_TYPICAL,1);
    MA8_2p = iMA(NULL,PERIOD_M1,8,0,MODE_SMA,PRICE_TYPICAL,2);
    MA8_3p = iMA(NULL,PERIOD_M1,8,0,MODE_SMA,PRICE_TYPICAL,3);
    MA5_cur = iMA(NULL,PERIOD_M1,5,0,MODE_SMA,PRICE_TYPICAL,0);
    MA5_prev = iMA(NULL,PERIOD_M1,5,0,MODE_SMA,PRICE_TYPICAL,1);
    MA5_2p = iMA(NULL,PERIOD_M1,5,0,MODE_SMA,PRICE_TYPICAL,2);
    MA13_cur = iMA(NULL,PERIOD_M1,13,0,MODE_SMA,PRICE_TYPICAL,0);
    MA13_prev = iMA(NULL,PERIOD_M1,13,0,MODE_SMA,PRICE_TYPICAL,1);
    MA13_2p = iMA(NULL,PERIOD_M1,13,0,MODE_SMA,PRICE_TYPICAL,2);  
    MA60_cur = iMA(NULL,PERIOD_M1,60,0,MODE_SMA,PRICE_TYPICAL,0);
    MA60_prev = iMA(NULL,PERIOD_M1,60,0,MODE_SMA,PRICE_TYPICAL,1);
    MA60_2p = iMA(NULL,PERIOD_M1,60,0,MODE_SMA,PRICE_TYPICAL,2);
    MA24_cur_h1 = iMA(NULL,PERIOD_H1,24,0,MODE_SMA,PRICE_TYPICAL,0);
    
    kol = OrdersTotal();
    Time_cur = TimeCurrent();
   
 if(kol < 1) //si no hay posiciones abiertas, continuamos
     {
      
 //---ALGORITMO DE ENTRADA EN EL MERCADO - COMPRA (BUY)-------------------------------------------------------------------------------------------
      
  if( 
   //----MINIMIZAMOS LOS RIESGOS RELACIONADOS CON LA PRESENCIA DE UNA MAGNITUD SIGNIFICATIVA DE VOLATILIDAD EN EL MOMENTO DE ENTRADA EN EL MERCADO ----
  
     //Modelamos la ausencia de una volatilidad significativa en la historia más próxima:
     ( High[1] - Low[1]) <= 200*Point &&                       //limitación de la amplitud de las velas de la escala menor (М1)
     ( High[2] - Low[2]) <= 200*Point &&
     ( High[3] - Low[3]) <= 200*Point && 
     (H_prev_m15 - L_prev_m15) <= 300*Point &&                 //limitación de la amplitud de las velas de la escala mayor (М15)
     (H_2p_m15 - L_2p_m15) <= 300*Point && 
     (H_3p_m15 - L_3p_m15) <= 300*Point && 
     (H_prev_m15 - L_3p_m15) <= 300*Point &&                   //limitación de la amplitud del canal de las velas de la escala mayor (М15)
     (High[1] - Low[1]) >= (1.1*(High[2] - Low[2])) &&         //limitación de la actividad en la barra anterior con respecto a la 2-da barra en la historia de cotizaciones 
     (High[1] - Low[1]) < (3.0*(High[2] - Low[2])) &&          //lo mismo
  
    
   //----MINIMIZAMOS LOS RIESGOS RELACIONADOS CON LA PRESENCIA DE NIVELES DE RESISTENCIA AL ENTRAR EN EL MERCADO-----
  
     //Modelamos la situación en que los niveles de resistencia locales han sido superados por el precio actual:
       Bid > High[1] &&           //en М1 
       Bid > H_prev_m15 &&        //en М15 
           
    
   //---MINIMIZAMOS LOS RIESGOS RELACIONADOS CON LA ENTRADA EN LA ZONA DE SOBRECOMPRA AL ENTRAR EN EL MERCADO-----
  
    //Modelamos la vinculación al inicio de la onda, para reducir la probabilidad de caer en la zona de sobrecompra:
     ((MA8_prev > Low[1] && MA8_prev < High[1]) || (MA8_2p > Low[2] && MA8_2p < High[2]) || //inicio de la onda - no más allá de tres barras en la historia de datos (М1)
     (MA8_3p > Low[3] && MA8_3p < High[3])) &&                                              //lo mismo
      MA5_prev_m15 > L_prev_m15 && MA5_prev_m15 < H_prev_m15 &&                             //inicio de la onda - en la barra anterior del marco temporal mayor (М15)
      
  
  //---MINIMIZAMOS LOS RIESGOS RELACIONADOS CON LA AUSENCIA DE TENDENCIA CLARA AL ENTRAR EN EL MERCADO-------
  
      //Modelamos la dirección de la tendencia en un marco temporal menor:
      Close[2] > Open[2] &&      //dirección ascendente de la vela en la 2-da barra en la historia de datos (М1)
      Close[1] > Open[1] &&      //dirección ascendente de la vela anterior (М1)
      
      //Modelamos la dirección de las medias móviles en un marco temporal menor:
      MA5_cur > MA5_2p &&  MA60_cur > MA60_2p &&     //МА ascendentes: usamos medias las móviles con un periodo de 5 y 60 (М1)
      
      //Modelamos la jerarquía de las medias móviles en el marco temporal menor:
      MA5_cur > MA8_cur && MA8_cur > MA13_cur &&     //formada una "jerarquía" de tres МА (periodos de Fibonacci:5,8,13), (se trata de un rasgo indirecto del movimiento ascendente) М1
      
      //Modelamos la posición del precio actual con respecto a las medias móviles de la escala menor:
      Bid > MA5_cur && Bid > MA8_cur && Bid > MA13_cur && Bid > MA60_cur && //el precio actual está por encima de la МА (5,8,13,60), (se trata de un rasgo indirecto del movimiento ascendente) M1 
      
      //Modelamos la dirección de la tendencia en un marco temporal mayor:
      C_prev_m15 > O_prev_m15 &&       //dirección ascendente de la vela anterior (М15)
      
      //Modelamos la dirección de la media móvil en un marco temporal mayor: 
      MA4_cur_m15 > MA4_2p_m15 &&     //МА ascendente con periodo 4 (М15)
      
      //Modelamos la jerarquía de las medias móviles en el marco temporal mayor: 
      MA4_prev_m15 > MA8_prev_m15 &&  //formada una "jerarquía" de dos МА en (periodos: 4 y 8), (se trata de un rasgo indirecto del movimiento ascendente) М15
      
      //Modelamos la posición del precio actual con respecto a las medias móviles de las escalas mayores:
      Bid > MA4_cur_m15 &&            //el precio actual está por encima de МА4 (М15), (se trata de un rasgo indirecto del movimiento ascendente) 
      Bid > MA24_cur_h1 &&            //el precio actual está por encima de МА24 (H1), (se trata de un rasgo indirecto del movimiento ascendente)
      
      //Modelamos una microtendencia dentro de la vela actual del marco temporal menor, así como los puntos de entrada:
      Bid > Open[0] &&               //presencia de movimiento ascendente dentro de la vela actual (М1)
       
     //Modelamos la actividad suficiente del proceso anterior en la escala mayor:
     (C_prev_m15 - O_prev_m15) > (0.5*(H_prev_m15 - L_prev_m15)) &&  //la parte del "cuerpo" de la vela es superior al 50% de la magnitud de la amplitud de la vela (vela anterior М15)
     (H_prev_m15 - C_prev_m15) < (0.25*(H_prev_m15 - L_prev_m15)) && //la limitación de la profundidad de la corrección es menor al 25% de la amplitud de la vela (vela anterior М15))
      H_prev_m15 > H_2p_m15 &&                                       //tendencia ascendente de los niveles locales de resistencia (dos velas М15) 
      O_prev_m15 < H_prev_m15 && O_prev_m15 > L_prev_m15 &&          //la presencia de sombra (vela anterior М15) con respecto al precio de apertura de la vela dada
      
     //Modelamos la actividad suficiente del proceso anterior en la escala menor: 
     (Close[1] - Open[1]) > (0.5*(High[1] - Low[1])) &&              //la parte del "cuerpo" de la vela es superior al 50% de la magnitud de la amplitud de la vela (vela anterior М1)
     (High[1] - Low[1]) > 70*Point &&                                //la vela anterior tiene una amplitud superior a la amplitud umbral (excluimos el flat obvio)
     (High[2] - Close[2]) < (0.25*(High[2] - Low[2])) &&             //la limitación de la profundidad de la corrección es menor al 20% de la amplitud de la vela (2-da vela en la historia de datos М1)
      High[1] > High[2] &&                                           //tendencia ascendente de los niveles locales de resistencia (dos velas М1)
      Open[1] < High[1] && Open[1] > Low[1] )                        //la presencia de sombra (vela anterior М1) con respecto al precio de apertura de la vela dada
      
        {
        //si las condiciones anteriormente indicadas del algoritmo de entrada Buy se han cumplido, formamos la orden de entrada Buy:
        sl_buy = NormalizeDouble((Bid-StopLoss*Point),Digits);
        tp_buy = NormalizeDouble((Ask+TakeProfit*Point),Digits);
        
         numb = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,sl_buy,tp_buy,"Reduce_risks",16384,0,Green); 
         
         if(numb > 0)

           {
            if(OrderSelect(numb,SELECT_BY_TICKET,MODE_TRADES))
            {
               Print("Entrada Buy : ",OrderOpenPrice());   
            }
           }
         else
            Print("Error al abrir la orden Buy : ",GetLastError());
         return;
        }
        
 //--- ALGORITMO DE ENTRADA EN EL MERCADO - VENTA (SELL)--------------------------------------------------------------------------------------------------
    
  if( 
     //----MINIMIZAMOS LOS RIESGOS RELACIONADOS CON LA PRESENCIA DE UNA MAGNITUD SIGNIFICATIVA DE VOLATILIDAD EN EL MOMENTO DE ENTRADA EN EL MERCADO ----
  
     //Modelamos la ausencia de una volatilidad significativa en la historia más próxima:
     ( High[1] - Low[1]) <= 200*Point &&                       //limitación de la amplitud de las velas de la escala menor (М1)
     ( High[2] - Low[2]) <= 200*Point &&
     ( High[3] - Low[3]) <= 200*Point && 
     (H_prev_m15 - L_prev_m15) <= 300*Point &&                 //limitación de la amplitud de las velas de la escala mayor (М15)
     (H_2p_m15 - L_2p_m15) <= 300*Point && 
     (H_3p_m15 - L_3p_m15) <= 300*Point && 
     (H_prev_m15 - L_3p_m15) <= 300*Point &&                   //limitación de la amplitud del canal de las velas de la escala mayor (М15)
     (High[1] - Low[1]) >= (1.1*(High[2] - Low[2])) &&         //limitación de la actividad en la barra anterior con respecto a la 2-da barra en la historia de cotizaciones 
     (High[1] - Low[1]) < (3.0*(High[2] - Low[2])) &&          //lo mismo
  
    
  //----MINIMIZAMOS LOS RIESGOS RELACIONADOS CON LA PRESENCIA DE NIVELES DE RESISTENCIA AL ENTRAR EN EL MERCADO-----
  
     //Modelamos la situación en que los niveles de resistencia locales han sido superados por el precio actual:
       Bid < Low[1] &&           //en М1 
       Bid < L_prev_m15 &&       //en М15 
           
    
  //---MINIMIZAMOS LOS RIESGOS RELACIONADOS CON LA ENTRADA EN LA ZONA DE SOBREVENTA AL ENTRAR EN EL MERCADO-----
  
    //Modelamos la vinculación al inicio de la onda, para reducir la probabilidad de entrar en la zona de sobreventa:
     ((MA8_prev > Low[1] && MA8_prev < High[1]) || (MA8_2p > Low[2] && MA8_2p < High[2]) || //inicio de la onda - no más allá de tres barras en la historia de datos (М1)
     (MA8_3p > Low[3] && MA8_3p < High[3])) &&                                              //lo mismo
      MA5_prev_m15 > L_prev_m15 && MA5_prev_m15 < H_prev_m15 &&                             //inicio de la onda - en la barra anterior del marco temporal mayor (М15)
      
  
  //---MINIMIZAMOS LOS RIESGOS RELACIONADOS CON LA AUSENCIA DE TENDENCIA CLARA AL ENTRAR EN EL MERCADO-------
  
      //Modelamos la dirección de la tendencia en un marco temporal menor:
      Close[2] < Open[2] &&      //dirección descendente de la vela en la 2-da barra en la historia de datos (М1)
      Close[1] < Open[1] &&      //dirección descendente de la vela anterior (М1)
      
      //Modelamos la dirección de las medias móviles en un marco temporal menor:
      MA5_cur < MA5_2p &&  MA60_cur < MA60_2p &&     //МА descendentes: usamos medias móviles con un periodo de 5 y 60 (М1)
      
      //Modelamos la jerarquía de las medias móviles en el marco temporal menor:
      MA5_cur < MA8_cur && MA8_cur < MA13_cur &&    //formada una "jerarquía" de tres МА (periodos de Fibonacci:5,8,13), (se trata de un rasgo indirecto del movimiento descendente) М1
      
      //Modelamos la posición del precio actual con respecto a las medias móviles de la escala menor:
      Bid < MA5_cur && Bid < MA8_cur && Bid < MA13_cur && Bid < MA60_cur && //el precio actual está por debajo de la МА (5,8,13,60), (se trata de un rasgo indirecto del movimiento descendente) M1
      
      //Modelamos la dirección de la tendencia en un marco temporal mayor:
      C_prev_m15 < O_prev_m15 &&      //dirección descendente de la vela anterior (М15)
      
      //Modelamos la dirección de la media móvil en un marco temporal mayor: 
      MA4_cur_m15 < MA4_2p_m15 &&     //МА descendente con periodo de cálculo 4 (М15)
      
      //Modelamos la jerarquía de las medias móviles en el marco temporal mayor: 
      MA4_prev_m15 < MA8_prev_m15 &&  //formada una "jerarquía" de dos МА en (periodos: 4 y 8), (se trata de un rasgo indirecto del movimiento descendente) М15
      
      //Modelamos la posición del precio actual con respecto a las medias móviles de las escalas mayores:
      Bid < MA4_cur_m15 &&            //el precio actual está por debajo de МА4 (М15), (se trata de un rasgo indirecto del movimiento descendente) 
      Bid < MA24_cur_h1 &&            //el precio actual está por debajo de МА24 (МH1), (se trata de un rasgo indirecto del movimiento descendente)
      
      //Modelamos una microtendencia dentro de la vela actual del marco temporal menor, así como los puntos de entrada:
      Bid < Open[0] &&                //presencia de movimiento descendente dentro de la vela actual (М1)
       
     //Modelamos actividad suficiente del proceso anterior en el marco temporal mayor:
     (O_prev_m15 - C_prev_m15) > (0.5*(H_prev_m15 - L_prev_m15)) &&  //la parte del "cuerpo" de la vela es superior al 50% de la magnitud de la amplitud de la vela (vela anterior М15)
     (C_prev_m15 - L_prev_m15) < (0.25*(H_prev_m15 - L_prev_m15)) && //la limitación de la profundidad de la corrección es menor al 25% de la amplitud de la vela (vela anterior М15)
      L_prev_m15 < L_2p_m15 &&                                       //tendencia descendente de los niveles locales de resistencia (dos velas М15) 
      O_prev_m15 < H_prev_m15 && O_prev_m15 > L_prev_m15 &&          //la presencia de sombra (vela anterior М15) con respecto al precio de apertura de la vela dada
      
     //Modelamos actividad suficiente del proceso anterior en el marco temporal menor: 
     (Open[1] - Close[1]) > (0.5*(High[1] - Low[1])) &&              //la parte del "cuerpo" de la vela es superior al 50% de la magnitud de la amplitud de la vela (vela anterior М1)
     (High[1] - Low[1]) > 70*Point &&                                //la vela anterior tiene una amplitud superior a la amplitud umbral (excluimos el flat obvio)
     (Close[2] - Low[2]) < (0.25*(High[2] - Low[2])) &&              //la limitación de la profundidad de la corrección es menor al 20% de la amplitud de la vela (2-da vela en la historia de datos М1)
      Low[1] < Low[2] &&                                             //tendencia descendente de los niveles locales de resistencia (dos velas М1)
      Open[1] < High[1] && Open[1] > Low[1] )                        //la presencia de sombra (vela anterior М1) con respecto al precio de apertura de la vela dada
               
        {
         //si las condiciones anteriormente indicadas del algoritmo de entrada Buy se han cumplido, formamos la orden de entrada Sell:
         
         sl_sell = NormalizeDouble((Ask+StopLoss*Point),Digits);
         tp_sell = NormalizeDouble((Bid-TakeProfit*Point),Digits);
         
         numb = OrderSend(Symbol(),OP_SELL,Lots,Bid,3,sl_sell,tp_sell,"Reduce_risks",16384,0,Red);
          
         if(numb > 0)
           {
            
            if(OrderSelect(numb,SELECT_BY_TICKET,MODE_TRADES))
              {
               Print("Вход Sell : ",OrderOpenPrice());
              }
           }
         else
            Print("Error al abrir la orden Sell : ",GetLastError());
        }
      //--- aquí tenemos la finalización del algoritmo de entrada en el mercado (Buy,Sell)
      return;
     }
//--- Comprobando las órdenes abiertas y el símbolo del instrumento financiero para preparar el cierre de posición:  

   for(f=0; f < kol; f++)
     {
      if(!OrderSelect(f,SELECT_BY_POS,MODE_TRADES))
         continue;
      if(OrderType()<=OP_SELL &&   //para comprobar el tipo de orden 
         OrderSymbol()==Symbol())  //comprobar el símbolo 
        {
         
         if(OrderType()==OP_BUY) //si el tipo de orden es "Buy", pasamos al cierre de la posición Buy:
           {
            
   //------ALGORITMO DE CIERRE DE POSICIÓN------------------------------------------------------------------------------------------------- 
          
         
     //Módulo de búsqueda del máximo de precio disponible dentro de una posición abierta--------------
         
          //primero definimos la distancia desde el punto actual dentro de la posición abierta hasta el punto de entrada en el mercado:
             
             shift_buy = 0; 
      
           if(Time_cur > OrderOpenTime() && OrderOpenTime() > 0)                          //si la hora actual está más allá del momento de entrada...
            { shift_buy = NormalizeDouble( ((Time_cur - OrderOpenTime() ) /60), 0 ); }    //definimos la distancia en barras del marco temporal М1 hasta el punto de entrada
            
          //ahora definimos el máximo del precio después de la entrada en el mercado:
          
            Max_pos = 0; 
     
           if(Time_cur > OrderOpenTime() && shift_buy > 0) 
            { Max_pos = NormalizeDouble((High[iHighest(NULL,PERIOD_M1, MODE_HIGH ,(shift_buy + 1), 0)]), Digits);}
           
          //aquí va el final del módulo de búsqueda del máximo del precio dentro de una posición abierta--  
          
          //Pasamos al cierre de la posición abierta Buy (variantes con "o" lógico): 
       
            if( 
            //MINIMIZAMOS LOS RIESGOS RELACIONADOS CON LOS DESPLOMES DE PRECIO DESPUÉS DE ENTRAR EN EL MERCADO----------------------
            
              (Bid < Open[0] && (Open[0] - Bid) >= 100*Point && (Time_cur - Time[0]) <= 20)           //condiciones de salida (en cualquier zona) al desplomarse los precios (el punto de control es el precio de apertura de la vela actual М1)
                     ||
              (Bid < O_cur_m15 && (O_cur_m15 - Bid) >= 200*Point && (Time_cur - Time_cur_m15) <= 120) //condiciones de salida (en cualquier zona) al desplomarse los precios (el punto de control es el precio de apertura de la vela actual М15)
                     ||
              ((Time_cur - OrderOpenTime()) > 60 && Close[1] < Open[1] && 
              (Open[1] - Close[1]) >= 200*Point)                                                      //condiciones de salida en cualquier zona al desplomarse los precios (el parámetro de control es la amplitud de la anterior vela М1)
                     ||
                     
            //MINIMIZAMOS LOS RIESGOS RELACIONADOS CON LA INDETERMINACIÓN DE LA AMPLITUD DEL MOVIMIENTO DE LOS PRECIOS DESPUÉS DE ENTRAR EN EL MERCADO-- 
             
              //Control de la magnitud del beneficio fijo (de la posición):
              (Bid > OrderOpenPrice() && (Bid - OrderOpenPrice()) >= 100*Point)                       //condición de salida en la zona de beneficios (take-profit de la sombra)
                     ||
                     
             //Control de la magnitud de la desviación máxima permisible del precio 
             //con respecto al máximo actual después de la entrada del mercado:    
             (shift_buy >= 1 &&                                                                          //un desplazamiento no inferior a 1 barra desde el punto de entrada
             Time_cur > OrderOpenTime() && Max_pos > 0 && OrderOpenTime() > 0 && OrderOpenPrice() > 0 && //tenemos un máximo actual después de la entrada
             Max_pos > OrderOpenPrice() &&                                                               //el máximo actual se encuentra en la zona de beneficios
             Bid < Max_pos &&                                                                            //existe un movimiento inverso de precio
             (Max_pos - Bid) >= 200*Point)                                                               //magnitud del movimiento inverso con respecto al máximo actual para la salida del mercado
                    ||
                      
             //Control de un límite de riesgo (de la posición) establecido de antemano:     
              (Bid < OrderOpenPrice() && (OrderOpenPrice() - Bid) >= 200*Point)                          //condiciones de salida en la zona de pérdidas (stop-loss de la sombra)
                    ||
                    
             //Control del límite de riesgo (del depósito) establecido de antemano:
              (AccountBalance() <=  NormalizeDouble( (Depo_first*((100 - Percent_risk_depo)/100)), 0)) )  //si con el comercio actual se supera el límite total de riesgo de la posición
   
          
              {
               
               if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))     //si se ha ejecutado el algoritmo de cierre, formamos la orden de cierre de posición Buy
                  Print("Error al cerrar la posición Buy ",GetLastError());    //de lo contrario, imprimimos el error de cierre de la posición Buy
               return;
              }
        
           }
           else //de lo contrario, pasamos al cierre de la posición Sell:
           {
            
           //------ALGORITMO DE CIERRE DE LA POSICIÓN SELL------------------------------------------------------------------------------------
           
           
            //Módulo de búsqueda del máximo de precio disponible dentro de una posición abierta--------------
         
          //primero definimos la distancia desde el punto actual dentro de la posición abierta hasta el punto de entrada en el mercado:
             
             shift_sell = 0; 
      
           if(Time_cur > OrderOpenTime() && OrderOpenTime() > 0)                          //si la hora actual está más allá del momento de entrada...
            { shift_sell = NormalizeDouble( ((Time_cur - OrderOpenTime() ) /60), 0 ); }   //definimos la distancia en barras del marco temporal М1 hasta el punto de entrada
            
          //ahora definimos el mínimo del precio después de la entrada en el mercado:
          
            Min_pos = 0; 
     
           if(Time_cur > OrderOpenTime() && shift_sell > 0)  
           { Min_pos = NormalizeDouble( (Low[iLowest(NULL,PERIOD_M1, MODE_LOW ,(shift_sell + 1), 0)]), Digits); }
           
          //aquí va el final del módulo de búsqueda del máximo del precio dentro de una posición abierta--  
          
          
          //Pasamos al cierre de la posición abierta Sell (variantes con "o" lógico): 
           
           if( 
            //MINIMIZAMOS LOS RIESGOS RELACIONADOS CON LOS DESPLOMES DE PRECIO DESPUÉS DE ENTRAR EN EL MERCADO-----------------
            
              (Bid > Open[0] && (Bid - Open[0]) >= 100*Point && (Time_cur - Time[0]) <= 20)          //condiciones de salida (en cualquier zona) al desplomarse los precios (el punto de control es el precio de apertura de la vela actual М1)
                     ||
              (Bid > O_cur_m15 && (Bid - O_cur_m15) >= 200*Point && (Time_cur - Time_cur_m15) <= 120) //condiciones de salida (en cualquier zona) al desplomarse los precios (el punto de control es el precio de apertura de la vela actual М15)
                     ||
              ((Time_cur - OrderOpenTime()) > 60 && Close[1] > Open[1] && 
              (Close[1] - Open[1]) >= 200*Point)                                                      //condiciones de salida en cualquier zona al desplomarse los precios (el parámetro de control es la amplitud de la anterior vela М1)
                     ||
                       
           //MINIMIZAMOS LOS RIESGOS RELACIONADOS CON LA INDETERMINACIÓN DE LA AMPLITUD DEL MOVIMIENTO DE LOS PRECIOS DESPUÉS DE ENTRAR EN EL MERCADO-- 
             
              //Control de la magnitud del beneficio fijo (de la posición):
              (Bid < OrderOpenPrice() && (OrderOpenPrice()- Bid) >= 100*Point)                         //condición de salida en la zona de beneficios (take-profit de la sombra)
                     ||
                     
             //Control de la magnitud de la desviación máxima permisible del precio 
             //desde el mínimo actual después de la entrada del mercado:      
             (shift_sell >= 1 &&                                                                         //desplazamiento no inferior a 1 barra desde el punto de entrada
             Time_cur > OrderOpenTime() && Min_pos > 0 && OrderOpenTime() > 0 && OrderOpenPrice() > 0 && //tenemos un mínimo actual después de la entrada
             Min_pos < OrderOpenPrice() &&                                                               //el mínimo actual se encuentra en la zona de beneficios
             Bid > Min_pos &&                                                                            //tenemos un movimiento inverso de precio
             (Bid - Min_pos) >= 200*Point)                                                               //magnitud del movimiento inverso con respecto al mínimo actual para la salida del mercado
                    || 
                      
             //Control de un límite de riesgo (de la posición) establecido de antemano:     
             (Bid > OrderOpenPrice() && (Bid - OrderOpenPrice()) >= 200*Point)                            //condiciones de salida en la zona de pérdidas (stop-loss de la sombra)
                    ||
                    
             //Control del límite de riesgo (del depósito) establecido de antemano:
             (AccountBalance() <=  NormalizeDouble( (Depo_first*((100 - Percent_risk_depo)/100)), 0)) )   //si con el comercio actual se supera el límite total de riesgo del depósito 
   
              {
        
               if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))     //si se ha ejecutado el algoritmo de cierre, formamos la orden de cierre de la posición Sell
                  Print("Error al cerrar la posición Sell ",GetLastError());   //de lo contrario, imprimimos el error de cierre de la posición Sell
               return;
              }  
          
           }
        }
     }
//---
  }
//-----------------------------------------------------------------------------------------------------------

Fig.12. Ejemplo de un experto que tiene en cuenta algunos de estos riesgos

En la estructura del código presentado del asesor sencillo se han tenido en cuenta algunos de los riesgos mencionados más arriba, también se han incluido en ella los módulos correspondientes para su minimización.

El experto se instala en el marco temporal М1, además, ha sido simulado con datos históricos con los siguientes instrumentos: EURUSD, USDCHF, USDJPY.

Resultados de la simulación en EURUSD:

test_EURUSD

Fig.13. Resultados de la simulación en EURUSD:

Hemos obtenido un resultado positivo en la simulación con datos históricos en un año y medio.

Resultados de la simulación en USDCHF:

test_USDCHF

Fig.14. Resultados de la simulación en USDCHF:

Hemos obtenido un resultado positivo en la simulación con datos históricos en un año y medio. Sin embargo, el número de entradas en el mercado no es suficiente.

Resultados de la simulación en USDJPY:


test_USDJPY

Fig.15. Resultados de la simulación en USDJPY:

Hemos obtenido un resultado positivo en la simulación en un año y medio.

Ahora, vamos a valorar la importancia de cada tipo de riesgo. Para ello, utilizaremos el siguiente procedimiento:

  • tomaremos como parámetro principal la magnitud del beneficio neto obtenido por el experto;
  • la importancia del tipo concreto de riesgo la definiremos desactivando (aparte) el módulo correspondiente en el algoritmo del experto;
  • cuanto peor sea el resultado financiero, más importante será este tipo de riesgo.

Como nivel con repecto al cual definiremos la influencia de cada módulo, usaremos los datos de la simulación de la pareja EURUSD. Vamos a analizar el gráfico:

segnificance_types_risks

Fig.16. Gráfico de importancia de los tipos de riesgo usando como ejemplo el experto analizado anteriormente

Denominaciones de la fig. 16:

  • NetProfit — eje donde se muestra el beneficio neto del experto comercial;
  • А - magnitud del benefico neto «reunido» (todos los módulos de minimización de riesgos están activados);
  • 1 - se ha desactivado el módulo de minimización de riesgos relacionados con la alta volatilidad en el momento de entrada en el mercado;
  • 2 - se ha desactivado el módulo de minimización de riesgos relacionados con la presencia de niveles de resistencia al entrar en el mercado;
  • 3 - se ha desactivado el módulo de minimización de riesgos relacionados con la caída en la zona de sobrecompra/sobreventa al entrar en el mercado;
  • 4 - se ha desactivado el módulo de minimización de riesgos relacionados con la ausencia de tendencia clara en el momento de entrada en el mercado (bloque de modelado de actividad suficiente del proceso anterior);
  • 5 - se ha desactivado el módulo de minimización de riesgos relacionados con la ausencia de tendencia clara en el momento de entrada en el mercado (bloque de dirección de las velas y las medias móviles).

En la figura se puede ver que las pérdidas máximas se corresponden con el punto 4. El resultado es varias veces peor que en otras partes del gráfico. Esto significa que el componente más impoortante del sistema comercial es el módulo donde se establece la actividad del proceso.

Esto también significa que el riesgo más serio (por lo menos aplicado a este experto comercial) es el riesgo relacionado con la ausencia de tendencia clara (con la ausencia de actividad suficiente del proceso).

Conclusión

Hemos clasificado los principales tipos de riesgos, tanto los relacionados, como los no relacionados con la dinámica del mercado. Hemos identificado las variantes de minimización de estos riesgos. Hemos mostrado los algoritmos de implmentación de algunos de ellos. A continuación, hemos analizado el programa de un sencillo experto que contiene algunos de estos algoritmos. Asimismo, hemos simulado el experto en tres instrumentos financieros: EURUSD, USDCHF, USDJPY. Quisieramos destacar que los resultados han sido obtenidos sin ningún tipo de optimización de los expertos. En este caso, hemos establecido los niveles de precio umbral utilizados en los módulos programáticos con la ayuda de nuestra propia experiencia.

Además, hemos ofrecido un conjunto de medias móviles, así como un método de definición de su conjunto basado en el carácter cíclico del calendario. Hemos utilizado este método en el diseño para reducir al mínimo los módulos de riesgo, así como el experto en general. Hemos ofrecido un método que permite en cierta medida reducir la probabilidad de que el punto de entrada caíga en la zona de sobrecompra/sobreventa (basado en el modelado del comienzo del movimiento ondulatorio).

Hemos obtenido un resultado positivo con tres instrumentos financieros, lo que confirma en general la corrección de los enfoques descritos, tanto en lo que respecta a la clasificación de los riesgos y sus métodos de minimalización, como a la definición de la estructura de un sistema comercial que contemple estos riesgos.

El análisis realizado ha revelado que se someten a mayor riesgo aquellos sistemas comerciales en los que no se modela la actividad del proceso. Precisamente este factor, en mayor medida que los demás, se refleja en los resultados financieros.

La ventaja del experto mostrado (y del enfoque descrito sobre la construcción del sistema comercial) es la ausencia de indicadores tradicionales en el algoritmo de entrada y salida. Solo se usa el análisis de velas y medias móviles (además, con limitaciones). Eso reduce significativamente el volumen de optimización. Esta se reduce aquí a la elección de los niveles de umbral, en los cuales se activan los módulos correspondientes, así como a la elección de los periodos de las medias móviles entre la lista de peridos disponibles (ver apartado «Riesgos relacionados con la elección incorrecta de la magnitud del periodo de cálculo de los indicadores»).

El defecto del enfoque descrito es el «filtrado excesivo» del algoritmo de entrada, puesto que la catidad de riesgos (y, por consiguiente, de filtros) puede ser bastante elevada. El resultado es un número limitado de entradas en el mercado. Sin embargo, esto se compensa parcialmente con la posibilidad de comerciar simultáneamente con varios instrumentos financieros (después de realizar las simulaciones correspondientes, claro).

El objetivo de este desarrollo es la creación de un experto sencillo para minimizar los principales riesgos, con un algoritmo que pueda ser entendido por los principiantes. Ciertamente, se podría mejorar de forma significativa la efectividad del experto incluyendo en el algoritmo el análisis de niveles fractales. Sin embargo, esto presupone la búsqueda de fractales (también en el ciclo, lo que complicaría sustancialmente el código). Pero para los analistas y tráders principiantes lo más importante es comprender la estructura del sistema comercial (desde el punto de vista de las peculiaridades de la dinámica del mercado), y ya después avanzar paulatinamente hacia el desarrollo de sus habilidades como programadores.

En el ejemplo del experto, a los desarrolladores novatos se les da la oportunidad de experimentar desactivando los módulos individuales o cambiando la composición de los módulos, en función de sus soluciones lógicas.

¡ATENCIÓN! Debe tener en cuenta que este experto es una versión demostrativa simplificada, que no ha sido diseñada para el comercio real.

Los enfoques descritos de minimización de los riesgos de mercado le podrán ser útiles a la hora de desarrollar su propia estrategia comercial.



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

Archivos adjuntos |
Reduce_risks.mq4 (60.32 KB)
test_EURUSD.png (186.65 KB)
test_USDCHF.png (182.76 KB)
test_USDJPY.png (178.94 KB)
Simulador de estrategias personalizado basado en cálculos matemáticos rápidos Simulador de estrategias personalizado basado en cálculos matemáticos rápidos
El artículo describe el proceso de construcción de un simulador de estrategias personalizado y un analizador de pasadas de optimización de creación propia. Después de leerlo, usted entenderá cómo funciona el modo de cálculos matemáticos y el mecanismo de los llamados frames; también aprenderá a preparar y cargar sus propios datos para los cálculos y a utilizar algoritmos eficientes para la compresión de los mismos. Además, este artículo será de interés para cualquier persona interesada en las distintas formas de almacenamiento de la información del usuario en un experto.
Creamos una nueva estrategia comercial usando una tecnología de colocación de entradas a los indicadores Creamos una nueva estrategia comercial usando una tecnología de colocación de entradas a los indicadores
En el artículo se expone una tecnología con cuya ayuda cualquiera podrá crear su propia estrategia comercial combinando un conjunto individual de indicadores, y también desarrollar sus propias señales para entrar en el mercado.
LifeHack para tráders: preparando "comida rápida" a partir de indicadores LifeHack para tráders: preparando "comida rápida" a partir de indicadores
Si usted se ha decidido a dar el salto a MQL5 solo ahora, entonces este artículo le resultará muy útil: por una parte, el acceso a los datos de los indicadores y a las series se ha ejecutado en el estilo MQL4, al que usted ya está acostumbrado, y por otro, toda la implementación se ha escrito en MQL5 con la misma sencillez. Todas las funciones son totalmente comprensibles y se adecuan perfectamente a la depuración paso a paso.
La estrategia comercial 'Momentum Pinball' La estrategia comercial 'Momentum Pinball'
En este artículo se continúa con el tema de la escritura de código para los sistemas comerciales descritos en el libro de Linda Raschke y Laurence Connors "Secretos bursátiles. Estrategias comerciales de alto rendiemiento a corto plazo". En esta ocasión, analizaremos el sistema 'Momentum Pinball', describiendo la creación de dos indicadores, un robot comercial y un bloque comercial para el sistema.