English Русский 中文 Deutsch 日本語 Português
Nuevo enfoque a la interpretación de la divergencia clásica e inversa. Parte 2

Nuevo enfoque a la interpretación de la divergencia clásica e inversa. Parte 2

MetaTrader 5Sistemas comerciales | 18 octubre 2019, 15:34
1 564 0
Alexander Lasygin
Alexander Lasygin

Introducción

En el artículo anterior, analizamos el enfoque no estándar sobre la interpretación de la divergencia, para ser más concretos, las construcciones relacionadas con ella, y solo aquellas que tocan ligeramente la propia divergencia, así como la calidad de su detección y clasificación. Asimismo, no hemos tocado en absoluto el tema del posible filtrado de las transacciones realizadas relacionadas con este patrón. Y es que, en realidad, lo que nos hemos acostumbrado a dar por seguro, no es en absoluto algo unívoco. En general, ¿tiene razón de ser la divergencia en su forma clásica? ¿Es posible que el mercado haya cambiado tanto que este enfoque ya no sea actual? En esta parte, estableceremos el objetivo de analizar más profundamente el tema de la variante clásica y su intepretación no estándar, y también intentaremos emitir un veredicto sobre esta estrategia, y en caso de que el resultado sea positivo, intentaremos aumentar su efectividad.

Términos y conceptos

Antes de abordar la parte principal, querríamos aclarar qué materiales han servido de base para este enfoque y su falta de “estandaridad”. En nuestro deseo de crear un robot comercial basado en los principios de divergencia, hemos organizado un grupo de partidarios en el que hemos asumido el papel de analista técnico. Nos encontramos ante la tarea de reunir el máximo de información sobre este tema y analizar la mayoría de herramientas de análisis técnico para descubrir así la variante ideal.

Asimismo, debíamos analizar las posibles variantes de desarrollo de los eventos después de formar la señal. Todas nuestras búsquedas, además del análisis, han sido una pérdida de tiempo. Para encontrar algo, deberíamos haber pensado un poco, y no gastar el tiempo del procesador y recursos humanos. No obstante, este trabajo tiene sus momentos positivos. Hemos creado un indicador distinto de lo que ya hay, hemos modificados o desechado una serie de conceptos que solo complicaban el análisis técnico. La divergencia como patrón ha “rejuvenecido” y ha sido simplificada hasta alcanzar el resultado "o existe o no existe", y las clases "А, B, С" ya no están.

La divergencia como señal ha conseguido una nueva vida. Durante este trabajo, hemos comprendido que cualquier tipo de mecanismo igualador, como el suavizado y el recálculo, no tiene nada que ver con el mercado. Se trata solo de la adecuación de un hecho a nuestra percepción. Pero nuestro objetivo no es escribir una tesis sobre este tama. Debemos comprender si este patrón es adecuado para el comercio, o simplemente se trata del engaño de turno. Hablaremos de ello más tarde. La búsqueda de información sobre este tema no ha dado resultados. Da la impresión de que los autores, si bien no copiaron los unos de los otros, al menos sí que tomaron la información de la misma fuente.

La descripción más detallada de la estrategia basada en este principio procede del libro de Alexander Elder “Two Roads Diverged: Trading Divergences”. Después de leer este trabajo, el número de preguntas no hizo sino aumentar. El carácter categórico del autor en cuanto a la necesidad del cruzamiento por parte de la línea del indicador del valor cero convive en el capítulo “Divergencia sin hombro derecho” con la descripción, aunque breve, de los momentos en los que no se trata de una condición obligatoria.

En el terminal MetaStock no existe la MACD lineal en la forma acostumbrada; en estos momentos, se trata simplemente de dos МА en la subventana del terminal, y no tiene ninguna vinculación con el“cero”, como consecuencia, no se puede ser utilizado en el aspecto en el que presupone el autor. Elder usa una variante de MACD que en el terminal MetaTrader 4/5 tiene el nombre OsMA, pero en este caso, además, el nombre de MACD clásico pasa por todo el material, lo cual produce cierta confusión. La descripción de la divergencia (divergencia inversa) no existe en absoluto. Aunque se traduce del inglés como convergencia, en realidad se trata de la misma divergencia entre el comportamiento del precio y el indicador. Asimismo, rechaza por completo el análisis con el uso de otros indicadores que no tienen línea de balance (curzamiento con el cero). En concreto, podemos recordar Stoсhastiс.

En su deseo de realizar un análisis más profundo, otros autores han añadido la división de la figura principal en tres subgrupos A,B y C. Junto con la opinión existente de que cuanto mayor sea la divergencia, más fuerte será la señal, que además, dentro del marco de la consolidación no vamos a analizar en absoluto, nos ha hecho pensar si los conocimientos que hemos adquirido antes son adecuados o no. ¿Qué ejemplo podemos usar? Hemos mostrado esta distribución en los materiales anteriores. La descripción de los motivos por los que no estamos de acuerdo con esta gradación superaba un tanto el marco de la primera parte, por eso, hemos decido hacer lo mismo en lo sucesivo: dejarlo todo igual.

No vamos a utilizar la mayor parte de estos términos, mientras que el resto lo usaremos muy de vez en cuando, y solo para describir la imagen general de lo que sucede. La lectrura de este material, posiblemente haga decantarse al lector por nuestro punto de vista, donde la divergencia existe como hecho, mientras que la distribución según la divergencia-convergencia se analizará exclusivamente abordando las reglas de las construcciones gráficas adicionales descritas en el artículo anterior, al tiempo que aquella solo se puede dividir condicionalmente en dos tipos: “de interrupción” y “de viraje”. ¿Por qué condicionalmente? Lo que ocurre es que, en esencia, la señal es de interrupción, pero solo podremos comprender si habrá viraje en el mercado o no después de obtener la señal de confirmación correspondiente.

Para no hablar por hablar, vamos a mostrar varios ejemplos de lo dicho.

Divergencia de clase «A»

Se considera la más intensa.

Bajista: el nuevo máximo del precio está por encima del anterior, y el nuevo máximo del indicador está por debajo del anterior.

Alcista: el nuevo mínimo del precio está por debajo del anterior, y el nuevo mínimo del indicador está por encima del anterior.


Fig.1

Podemos ver una divergecnia semejante después de un movimiento de precio fuerte (impulso). Con mayor frecuencia, este impulso es una señal del surgimiento de una nueva tendencia, y esto significa que la divergencia de clase «А» anula con su “fuerza” este regla, así como la languidez del comportamiento del mercado y la teoría de ondas al completo. Si la mitad derecha de la imagen superior puede provocar cierta discusión en cuanto a la corrección de la definición del patrón, las imágenes de abajo, probablemente, no lo hagan.


Fig.2

Asimismo, semejante comienzo en el desarrollo de los eventos puede provocar no una, sino dos e incluso tres divergencias, y cuando más potente sea el impulso, más tiempo continuará nuestra tendencia. Esto, hablando de que cuanto mayor sea la divergencia, más intensa (supuestamente) será la señal.

Divergencia de clase «B»

Una señal menos significativa en el mercado.

Bajista: los máximos del gráfico están al mismo nivel, y el máximo derecho del oscilador está por debajo del izquierdo.

Alcista: los máximos del precio están al mismo nivel, y el hombro derecho del indicador está por encima del izquierdo.

¿No le recuerda algo? Sí, a las figuras clásicas de análisis técnico “Pico doble” y “Valle doble”. Abrimos la fuente original y leemos “Modelo fuerte de viraje de mercado”. No interrupción, sino viraje. Se encuentra entre las cinco figuras principales.


Fig.3

Y el último subtipo de este grupo de tres.

Divergencia de clase «C»

Se cinsidera el más débil. Existe la opinión de que es mejor ignorarlo.

Bajista: aquí se observa un nuevo máximo en el gráfico de precio y, a pesar de ello, los picos del indicador se encuentran al mismo nivel.

Alcista: el precio alcanza un nuevo máximo, y los mínimos del oscilador son iguales.


Fig.4

Este comportamiento del precio es característico en los niveles fuertes de apoyo y resistencia, durante la llamada "falsa ruptura" o la actividad más intensa de los creadores de mercado. Se relaciona con la falta de actividad del indicador. Y, si bien no podemos llamar con certeza esta señal punto de entrada, tampoco deberíamos ignorarla.

Y esta no es, ni mucho menos, la lista completa de discordancias y desajustes que nos han impulsado a someter el estudio de este tema a un análisis más detallado. Como ya hemos dicho, no vamos a modificar los términos y conceptos a un nivel global, para no proovocar confusión entre aquellos que ya han estudiado la presente cuestión, y aquellos que aún lo harán en el futuro, tomando otros materiales aparte de este.

Vamos a analizar nuestros indicadores.

MACD

Fue creado por Gerald Appel para comerciar en el mercado de valores. Este indicador es muy popular entre los tráders. Esto se debe a su efectividad probada por el paso de los años, y a la multitud de materiales que describen el trabajo con el mismo, lo que le permite ocupar el primer puesto en nuestra clasificación teórica. Su propio nombre, “Moving Average Convergence/Divergence, Media Móvil de Convergencia/Divergencia”, parece hablar de que ha sido creada con este objetivo. En realidad tiene dos variantes, MACD lineal y MACD de histograma. 

MACD — lineal:

  • MACD=EMAsn-EMAln
  • Signal=EMAmacd
  • MACD — histograma:
  • MACDn=Signal-MACD

donde:

P es el precio, normalmente, se trata del precio de cierre del periodo Close, pero también son posibles otras variantes (Open, High, Low, Close, Median Price, Typical Price, etcétera )

Por defecto, se usan los siguientes ajustes de MACD:

  • ЕМАs — (corta) con un periodo de 12 días (dos semanas).
  • ЕМАl — (larga) con un periodo de 26 días (un mes).
  • EМАa — (diferencia suavizada) con un periodo de 9 valores. 

En MetaTrader 5 se ofrecen ambas versiones, pero tienen nombres diferentes: MACD y OsMA. Debemos recordar que MACD en el terminal se llama MACD lineal, mientras que MACD de histograma se llama OsMA.

  

Fig.5

Vamos a analizar ambas variantes.

Esta (MACD MetaTrader 5), se posiciona como de tendencia, y por este motivo puede parecer que la divergencia clásica debe reflejar de la forma más precisa posible la finalización de esta misma tendencia. Pero, en realidad, no todo es tan sencillo. Esto se deriva no solo del desacuerdo en las opiniones sobre las reglas de interpretación de sus lecturas al detectar una tendencia, sino también por la variedad de los subtipos del propio patrón. En la primera parte nos mostramos categóricos sobre el hecho de que el cruzamiento de la línea cero significa siempre el final de la tendencia general. Pero esto no es exactamente así. Existe otra opinión, que postula que una salida poco significativa más allá del cero da una señal aún más fuerte sobre el viraje.


Fig.6

Y también donde paso a través del «0» es obligatorio. En concreto, uno de los defesores de esta opinión es el propio Alexander Elder. Y este no es el único desacuerdo, ni siquiera el más extendido de ellos. Ambas reglas tienen razón de ser, y cada caso debe analizarse en el marco de una situación concreta.

A nuestro parecer, uno de los problemas más esenciales se oculta en la definición del propio patrón. Nuestro oscilador se construye según los precios de cierre de la vela, así que ¿por qué buscamos en los máximos y los mínimos en el gráfico de precios?

  

Fig.7

  

Fig.8

  

Fig.9

Entonces, ¿cómo será correcto? ¿Y que es más importante, el precio o las lecturas del indicador? También podemos considerar una desventaja de este indicador el periodo largo de cálculo 26-12, lo cual lo hace inadecuado para detectar movimientos de precio poco significativos. La variante clásica de definición de la divergencia presupone la localización de pares de fractales en las lecturas del indicador y su comparación con el movimiento del precio. Pero, si el movimiento es poco significativo, los fractales no se forman. Para que resulte más visible, vamos a mejorar la versión estándar. Coloreamos las barras de diferentes colores, dependiendo de la dirección del movimiento. No es complicado hacer esto. Para ello, solo tenemos que modificar un poco el código estándar. En la línea

#property indicator_buffers 4

4 por 5

#property indicator_buffers 5

la línea

#property indicator_type1   DRAW_HISTOGRAM

tomará el aspecto

#property indicator_type1   DRAW_COLOR_HISTOGRAM

y

#property indicator_color1  Silver

por consiguiente,

#property indicator_color1  Green,Red,Gold

Añadimos a las variables otro búfer más

double                   Color_buff[];

y ahora, el bloque de inicialización tomará el aspecto

   SetIndexBuffer(0,ExtMacdBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,Color_buff,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2,ExtSignalBuffer,INDICATOR_DATA);
   SetIndexBuffer(3,ExtFastMaBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(4,ExtSlowMaBuffer,INDICATOR_CALCULATIONS);

Aquí 

   SetIndexBuffer(1,Color_buff,INDICATOR_COLOR_INDEX);

no se puede incluir en el último lugar, debe tener el índice «1», de lo contrario, no funcionará.

Ahora, para detectar el fractal, vamos a necesitar un mínimo de 3 velas, por eso, deberemos introducir ciertos cambios en el bloque donde se establece el número de barras calculadas, en la parte en la que se indica el valor para el primer cálculo.

if(prev_calculated==0)
      limit=2;
   else limit=prev_calculated-1;

Añadimos un par de barras en el bloque principal

//--- calculate MACD
   for(i=limit;i<rates_total && !IsStopped();i++)
     {
      ExtMacdBuffer[i]=ExtFastMaBuffer[i]-ExtSlowMaBuffer[i];
      //--- calculate Color Macd
      if(ExtMacdBuffer[i]>ExtMacdBuffer[i-1])
         Color_buff[i]=0.0; // set color Green
      else
         Color_buff[i]=1.0; // set color Red
     }
//---

Lo último que debemos hacer, es añadir el bloque en el que determinaremos el extremo de MACD. Para evitar el redibujado, vamos a hacerlo después del cierre de la barra actual. Para ello, realizaremos el cálculo con un desplazamiento de una barra.

for(i=limit;i<rates_total-1 && !IsStopped();i++)
     {
      if((ExtMacdBuffer[i-1]<0 && ExtMacdBuffer[i]>ExtMacdBuffer[i-1] && ExtMacdBuffer[i-1]<ExtMacdBuffer[i-2]) || 
         (ExtMacdBuffer[i-1]>0 && ExtMacdBuffer[i]<ExtMacdBuffer[i-1] && ExtMacdBuffer[i-1]>ExtMacdBuffer[i-2]))
         Color_buff[i-1]=2.0; // set color Gold
     }

Esta variante presupone que cuando la línea de MACD está por encima de cero, detectamos solo los fractales UP, y cuando está por debajo de cero, solo los fractales DN. Esto es incorrecto. En lo sucesivo, utilizaremos la variante en la que el tipo de fractal (UP o DN) no dependerá de la posición de la línea principal del indicador con respecto al cero.

Podemos ver que, en algunos momentos en los que el patrón existe, automatizarlo resulta, si no imposible, sí bastante complicado, y solo la observación visual da resultados positivos.

  

Fig.10

Ya intentamos compensar esta desventaja en la clase Expert/Signal/SignalMACD. En la guía de ayuda, esto suena de la forma que sigue:

  • Divergencia — el primer valle analizado del oscilador es más superficial que el anterior, y el valle de precio que le corresponde es más profundo que el anterior.
  • Divergencia doble — el oscilador ha formado tres valles consecutivos, cada uno de los cuales es más superficial que el anterior, y el precio ha formado los tres valles que les corresponden, cada uno de los cuales es más profundo que el anterior.


 Fig.11

Y una vez más, la descripción “el primer valle analizado del oscilador es más superficial que el anterior, y el valle de precio que le corresponde es más profundo que el anterior” nos hace volver a la pregunta ¿“Qué fue primero, el Huevo o la Gallina”? ¿El comportamiento del precio o las lecturas del indicador? ¿Cómo puede ser que las lecturas del indicador, que provienen de los valores del precio, sean más importantes que la propia serie temporal? Encima, no hay nada concreto. ¿Cuántas barras tomamos en concreto: tres, cinco (como en la figura) o durante toda la historia? Este método se puede clasificar como no estándar, pero su implementación en la variante clásica del archivo tiene más desventajas que ventajas. No, no conviene rechazarlo de pleno. Hay casos en los que solo él puede apañárselas con la tarea establecida.

Para lograr la automatización, podemos considerar como una de las variantes el uso simultáneo de MACD+ OsMA. Hemos mejorado el indicador OsMA de forma análoga a MACD.


Fig.12

Como ya sabemos, OsMA es MACD, lo único que los distingue es que la diferencia entre la línea de señal y la principal de MACD se representa en forma de histograma. OsMA tiene más sensibilidad que MACD, pero no siempre es suficiente, y en ocasiones se omiten señales, o bien se da el proceso inverso, cuando estas son demasiadas y se requiere de una confirmación adicional.

  

Fig.13

Usando semejante tándem, surge la pregunta: ¿cuál de los indicadores consideraremos como principal? Es decir, ¿la divergencia de cuál de ellos se considerará una parte insoslayable de la formación de la señal, y en cual de ellos la divergencia se considerará una condición no obligatoria? 

A título personal, diremos que la posibilidad de seleccionar los parámetros también supone una desventaja. Si bien el periodo de cálculo de RSI influye solo en la amplitud de la línea, en el caso de MACD, OsMA, Stochastic cambia su aspecto considerablemente. Habrá quien diga “ las condiciones de mercado cambian y esta posibilidad es necesaria, además, el propio indicador ha sido creado para el mercado de valores, y sus parámetros han sido seleccionados para el periodo de una hora”, no obstante, debemos objetar que semejante posibilidad no es una adaptación, sino una adecuación de los deseos a la realidad.

Claro que podría resultar necesaria la selección de parámetros conforme a un instrumento y un periodo concreto en la etapa inicial, pero si el indicador deja de funcionar en lo sucesivo, será mejor renunciar a sus “servicios”. Una vez más, se trata de una opinión subjetiva. Precisamente la imposibilidad de “adecuar” ha sido uno de los criterios de selección del indicador АС (Accelerator/Decelerator) para la primera parte del material. Y este indicador no está solo. Además, nadie discute sus ventajas. Todas las reglas descritas anteriormente para él también son justas para los demás. Todo lo mencionado anteriormente se refiere a la divergencia clásica, pero también es justo para las reglas de construcción de la divergencia inversa/oculta. Como podemos ver, no todo lo qeu sabíamos de ella (y dábamos por supuesto) es tan sencillo y unívoco. Y, en general, ¿es posible usar esta herramienta en la forma que estamos acostumbrados como una señal de calidad?

No vamos a adelantarnos: primero analizaremos las peculiaridades del trabajo con otros indicadores que, como se considera, son clásicos a la hora de solucionar la tarea establecida.

Stoсhastiс

Stoсhastiс Oscillator es un indicador de análisis técnico que mide los impulsos del precio en tanto por ciento. “En la práctica, el indicador muestra la divergencia del precio de cierre del periodo actual con respecto a los precios de los periodos anteriores en el marco del intervalo temporal establecido”. Creado por George Lane en marzo de 2007.

El indicador se construye a partir de dos líneas:

  • Periodo %K — estacástico rápido (línea continua). En qué número de barras buscamos los valores máximos - mínimos.
  • Periodo %K — estacástico lento (línea punteada). Periodo de SMA aplicado a %K.
  • Slowing (Ralentización) — parámetro referido a %K. Se trata del parámetro de suavizado.
  • %K=((CLOSEn-LOWn)/(HIGHn-LOWn))*100

donde:

  • CLOSEn es el precio de cierre del periodo actual:
    • LOWn  es el precio más bajo en los últimos n periodos
    • HIGHn es el precio más alto en los últimos n periodos
  • %D        es la media móvil de %K. Los métodos pueden ser distintos: media simple, exponencial, suavizada, ponderada. Asimismo, se ha previsto la posibilidad de cambiar la serie de precios High/Low o Close/Close.

En la definición suena de nuevo la palabra "divergencia". Si bien en el caso de MACD se entiende más o menos todo, en el caso de los osciladores normalizados a los que pertenece, la cosa se complica. El propio concepto de “oscilador normalizado” se puede definir como cambiante en cuanto a sus lecturas dentro de un marco estricto. En nuestro caso, van de 0 a 100. Esta particularidad implica sus propias correcciones. En la propia escala de lecturas se destacan tres zonas. Nos referimos a la escala de sobrecompra (80%), sobreventa (20%) y movimiento principal. Las pecualiaridades de cálculo crean condiciones con las que la línea del indicador puede durante mucho tiempo tanto abandonar las zonas extremas, como no entrar en las mismas.


Fig.14

Puede parecer que la posibilidad de utilizar dos series de precio distintas elimina la cuestión surgida con MACD, sobre cuál de ellas usar. Pero aquí topamos con otro problema. Como podemos ver por la fig.14, el estocástico construido según Close ocupa la posición límite «100 - 0» con mayor frecuencia que el construido según High/Low. Esto se relaciona con la fórmula de cálculo del propio indicador. Asimismo, observamos abundantes picos y valles.


Fig.15 

No tenemos ninguna regla clara para estos casos, así que, debido a ello, las divergencias como las encontradas entre los puntos 100-100 y 92,31-92, 22 , son de difícil automatización. En la variante tipo de cálculo, se usan los dos fractales más cercanos. En este caso, no son fractales ni mucho menos, y además no se encuentran lejos en absoluto. Y es aquí donde aparece el famoso «PERO», es decir, “CADA REGLA TIENE SU EXCEPCIÓN”. En nuestro caso, podemos transformar la “desventaja” en virtud. Modificando los ajustes de forma proporcional al periodo de cálculo, podemos obtener en el gráfico М5 las lecturas del gráfico М15.


Fig.16

Las ventajas de esta variante consisten en que podemos automatizar fácilmente el reconocimiento de la divergencia en los segmentos globales (prolongados) del mercado, obteniendo así una señal temprana de entrada sin el retraso derivado de la necesidad de esperar el cierre de la vela del marco temporal mayor. En las figuras 16-17, estos segmentos se destacan con líneas rojas. En ciertos casos, esto puede tener un valor determinante.


Fig.17

En la imagen de arriba podemos ver que si hubiéramos entrado según las lecturas del indicador MTF, nuestra transacción habría dado pérdidas, mientras que la variante alternativa nos habría dado la posibilidad de obtener beneficios. Este enfoque también es válido para MACD.


Fig.18

Esta solución en el contexto de aparente disminución de señales (lo cual se ve refutado por la mitad derecha de la fig.18), nos permite no solo aumentar significativamente la probabilidad de realizar una transacción con beneficios, sino también de aumentar la rentabilidad. Aquí hemos analizado la variante М5-М15, ¿y si estudiamos la opción con М5-Н1?


Fig.19

La aplicación de los estocásticos rápido y lento solo resuelve parte de los problemas. Al crear asesores basados en estos principios, de nuevo surge la misma cuestión que al usar los MACD rápido y lento (MACD+OsMA). ¿Cómo establecer las prioridades? Y esto no resuelve el problema principal, es decir, cómo filtrar la abundancia de rupturas en la línea del estocástico al crear el indicador de tendencia. No podemos permitirnos iterar todas las rupturas de la línea en nuestras búsquedas. Esto crearía una enorme cantidad de “ruido”, y estaríamos obligados a limitarnos a dos secuencias como máximo, o tres en casos raros.

Más adelante volveremos a la cuestión del filtrado de señales de una manera más global, por ahora, vamos a centrar nuestra atención en las reglas que resulta deseable respetar (no seremos categóricos en este punto) al buscar la divergencia. También un poco más adelante veremos por qué no establecemos ese «NO» categórico.

1) De una manera lógica, comprendemos que antes de obtener la divergencia (convergencia), el precio deberá alcanzar un valor crítico, y por consiguiente, también la línea del indicador. En nuestro caso, entrar en la zona de sobrecompra/sobreventa. Y cuando el mercado actualiza un máximo/mínimo, esta no será una condición obligatoria para el indicador. Es decir, en nuestro caso, el segundo punto (a la izquierda) de la barra actual deberá encontrarse en esta zona al buscar la divergencia clásica. Para la divergencia oculta (inversa), al contrario, el primer punto deberá encontrarse en el nivel crítico.


Fig.20

2) Al buscar una señal (manualmente o al crear el algoritmo), no debemos intentar dar como realidad aquello que deseamos. Vamos a buscarla en los extremos más próximos, usando para ello la secuencia que excluye el caso de la fig.20, y no más de tres.

Fig.21

Incluso si nos parece que la fig.15 se corresponde con la regla «1», donde el pico izquierdo se encuentra en la zona de sobrecompra, la ausencia de más de tres puntos en la línea del indicador la cancela.

 

RSI 

Se trata de otro de los indicadores que podemos calificar de clásicos. Pero, como el lector ya habrá entendido, nos estamos moviendo progresivamente hacia tareas más complejas.

RSI (Relative Strength Index ) — índice de fuerza relativa. Welles Wilder Jr. lo presentó en junio de 1978.

RSI=100-100/(1+U/D)

donde: 

  • U es la magnitud media del cambio de precio en el intervalo positivo (CLOSEn>CLOSEn-1 ) 
  • D es la magnitud media del cambio de precio en el intervalo negativo (CLOSEn<CLOSEn-1 ) 
Para ser justos, debemos decir que esta fórmula es la que tenemos, pero la original mostraba un aspecto diferente:
  • RSI=(SMMAn)ofU(SMMAn)ofD
  • n- periodo de cálculo SMMA.

Este también se encuentra normalizado dentro de los límites «0-100», pero, a diferencia de Stoсhastiс, como podemos ver por la fórmula, ya no existe la posibilidad de suavizar la línea. Y todo ello complica enormemente las cosas. La sensibilidad “escesiva” que conlleva crea muchas rupturas. Por la figura podemos ver que mantiene su movimiento más o menos en línea recta solo cuando el precio se mueve consecutivamente en una misma dirección. En el resto de los casos, la línea del indicador recuerda a una sierra.

  

Fig.22

Como consecuencia, el filtrado de las lecturas del indicador es todavía más relevante para él. Ahora, proponemos analizar una de las variantes para solucionar este problema.

Ya se nos ha planteado la cuestión sobre la preponderancia entre la serie de precios y las lecturas del indicador. En este caso, resulta un obstáculo insoslayable, aunque no tanto a la hora de analizar el comportamiento del precio de los instrumentos que nos pueden servir de ayuda. Se trata de МА en todas sus variedades, Fractals y ZigZag.

Fractals (Bill Williams)

En la variante estándar se ha implementado un algoritmo de fractal de cinco barras. Todo esto no resuelve la cuestión del filtrado, e incluso a veces origina “ruido” y confusión en la imagen general, debido a la discordancia en las lecturas con el indicador principal.


Fig.23

Asimismo, al igual que sucede con RSI en los segmentos planos, ofrece una gran cantidad de señales que, por cierto, debemos filtrar. Otra desventaja es el retraso a la hora de formar la estructura de cinco barras. Este es de una vela como mínimo, lo cual resulta desaconsejable en nuestro caso.

МА es una muestra estupenda de herramienta de suavizado. Pero, como hemos dicho antes, tiene una gran cantidad de interpretaciones. Comenzando por las variantes de suavizado de SMA (media móvil simple), EMA (media móvil exponencial), SMMA (media móvil suavizada), LWMA (media móvil pronderada), precios Close, Open, High, low, Median (Precio mediano, (high+low)/2), Typical (precio típico, (high+low+close)/3), Weighted (precio medio ponderado, (high+low+close+close)/4), también existe un periodo de cálculo, que puede variar entre «1» y «∞». Y esto es todo para la variante de MA (Moving Average). Además, existen Double Exponential Moving Average y Double Exponential Moving Average. Y solo aquellas que se incluyen en el paquete estándar de MetaTrader 5. No vamos a establecer una tarea tan general como "analizar todas las posibles variantes, y además cambiar el algoritmo de búsqueda de la divergencia y los ajustes del indicador básico para seleccionar la variante óptima". 

ZigZag “Indicador para determinar los extremos de precio de las oscilaciones de las cotizaciones con una amplitud y periodo configurados según la condición de desviación de los filtros”.

A juzgar por la definición, esto es lo que necesitamos. Y sin embargo, topamos de nuevo con la misma “trampa”. RSI se construye según Close, mientras que ZZ lo hace según High/Low.


Fig.24

Es posible compensar parcialmente este defecto, construyendo RSI según Median (Precio mediano — (high+low)/2).


Fig.25

No obstante, podemos ver por la fig.24 que la desviación en la posición de los fractales en el indicador y el precio no supera las dos barras, y esto significa que se puede compensar fácilmente de manera programática. Una pequeña digresión: en nuestro caso, nos interesa solo la forma de la señal, en ningún caso el valor de sus lecturas. Es decir, el indicador básico se utiliza solo para detectar las divergencias, y no se usa para señales particulares de trading según RSI.

La diferencia en los principios de construcción y cálculo, además del hecho de que ninguno de los autores haya podido crear su propia obra maestra aplicada a este tándem, nos da derecho a hacer una excepción y “jugar” con los ajustes. Sabiendo que el periodo de cálculo de RSI no influye en la forma de la señal, sino solo en su amplitud, y que los ajustes de ZigZag tampoco van a cambiar la posición de los extremos, podemos lograr un resultado espectacular “jugando” así.

Si respetamos la regla que hemos aplicado a Stoсhastiс “antes de formar un patrón de divergencia, las lecturas del indicador deberán alcanzar los valores críticos de sobrecompra/sobreventa” (en nuestro caso, las zonas por encima de «30» y por debajo de «70») y cambiamos los ajustes de ZZ para obtener tanto señales a corto plazo, como sus valores globales. En cualquier caso, estos parámetros se compensan mutuamente, lo que permite monitorear la imagen general en la combinación 2+1 (dos filtros + uno básico). El número de filtros, por supuesto, no se limita a dos, pueden ser tres o incluso más. En lo sucesivo, cuando analicemos el tema de los niveles objetivo, podremos comprender que, dividiendo las señales en grupos, será posible captar la mayor parte del movimiento del mercado siguiendo señales concretas.


Fig.26

No se sienta incómodo por el hecho de que en este ejemplo (fig.26), RSI no hay entrado en la zona de sobreventa en la primera señal. Recordemos que basta con cambiar el periodo de cálculo (aumentando con ello la amplitud) y el indicador entrará allí, lo cual se corresponderá con nuestras necesidades.

CCI

Pertenece a la clase de los osciladores (Commodity Channel Index, Índice de canal comercial) y fue desarrollado en 1980 por Donald Lambert.  

CCIn=(1/0.015)*((TypicalPrise-SMA)/MedianDeviation)

Entre los puntos positivos de este indicador, podemos considerar su funcionamiento en forma de impulso. Es decir, según él, podemos definir no solo la sobrecompra/sobreventa del mercado, sino también el impulso en el mismo. Esta ventaja, para nuestro caso, se puede considerar una desventaja. A pesar de que en la variante clásica se calcula según Typical Price, la línea tendrá forma de sierra, al igual que RSI. Por eso, todo lo que hemos dicho anteriormente para RSI, se puede aplicar a ella. Es decir, necesitaremos el filtrado de la serie de precios no solo según el tipo (High,Low,Close, etcétera sino también según la detección de los extremos del precio.


Fig.27

Un comportamiento semejante requerirá la introducción de cambios en el algortimo en el caso de usar más de una "ruptura" de la línea del indicador en la búsqueda de divergencias.


Fig.28

Si bien en otros indicadores esta situación surge rara vez, CCI supone una excepción desagradable.

El carácter del comportamiento de este indicador lo convierte en uno de los mejores a la hora de trabajar según el principio descrito en el primer artículo de esta serie. Siendo breves, suena así “Las líneas prolongadas desde las últimas divergencias inversas (última Bullish y Bearish), construidas en el gráfico de precios, se convierten en líneas de apoyo/resistencia para el precio (fig.29), mientras que en los osciladores clásicos en la ventana del oscilador se convierten para su línea (fig.30)”.


Fig.29


Fig.30

Momentum 

Momentum — ritmo de cambio de precio. Tiene otro nombre: RoC (Rate of Change). La diferencia es que en RoC, la línea de balance es «0», mientras que en Momentum es «100». El indicador fue descrito por John Murphy en el libro «Análisis técnico de los mercados de futuros».

Momentum=Pn-Pn-1

donde Momentumn es el momento en n periodos en el momento t (momento actual)

Esta variante no resulta totalmente cómoda, dado que coinciden los datos en el precio del activo. Por eso, se ha completado la fórmula.

  • Pt  — precio actual
  • Pt-n — precio n periodos atrás
  • RoCtn=(Momentum/Pt-n)*100

Ahora, el Momentum estándar es precisamente RoC, mientras que RoC es el Momentum estándar -100. Principio de cálculo del indicador en la valoración de los movimientos de impulso. Por eso, tiene los mismos problemas que CCI y RSI: la línea en forma se sierra. Pero aquí, este movimiento genera aún más señales.


Fig.31

No sabemos muy bien qué hacer con semejante cantidad de señales. Asimismo, por la fig.31 podemos ver que la automatización puede funcionar de forma incorrecta. Según la información que hemos logrado encontrar sobre este indicador, en ninguna parte se define como aplicable a la detección de la divergencia. Existe la opinión de que este, dependiendo del periodo de cálculo, es capaz de cumplir con los requisitos del comercio a corto plazo (period 6-14), además de convertirse prácticamente en un indicador de tendencia en los periodos superiores a «20», lo que nos permite detectar con su ayuda la finalización de la propia tendencia con bastante precisión. Si consideramos correcta la suposición de que la tendencia consta de tres impulsos consecutivos (Teoría de ondas del mercado), y aquí la palabra clave será "impulso", entonces los principios implementados en Momentum podrán ayudar verdaderamente a detectar su finalización. Es posible que tengamos que realizar una análisis más profundo de su funcionamiento. 

ADX

La idea del “Índice de movimiento dirigido DMI (directional movement index )” fue propuesta por Welles Wilder en 1978 en el libro «Nuevos Conceptos en Sistemas Técnicos de Trading» (New Concepts in Technical Trading Systems). Dicha idea constituyó en lo sucesivo la base de este instrumento.

El índice ADX (índice de movimiento dirigido medio) se calcula usando como base los datos de otros dos, el de dirección positiva (+DI) y el de dirección negativa (− DI), teniendo en cuenta el intervalo comercial verdadero (ATR).

ADX=(MAn(+DI--DI)/(+DI+-DI))*100

donde: 

  • +DI es el índice de dirección positiva 
  • -DI es el índice de dirección negativa
  • MA es SMA (media móvil)
  • n es el periodo de cálculo de МА 

La fórmula se presenta de manera simplificada. Podrá encontrar más información aquí.

Tras echar un vistazo al propio indicador (multitud de líneas) y comprender el principio que rige la información que se le transmite (la línea principal de ADX no indica la dirección de la tendencia, sino que informa sobre la actividad del mercado), podría parecer que no nos conviene.

  

Fig.32

En realidad, esto no es así. Esta variedad nos permite usarlo de varias formas. La primera forma consiste en determinar la divergencia entre la dirección del movimiento del precio y la actividad en el mercado. Es decir, si el precio disminuye (aumenta), y el índice ADX disminuye, esto será propiamente la divergencia.


Fig.33

Ya hemos propuesto antes añadir este método a nuestro arsenal. La complejidad de esta variante radica en la dificultad que entraña comprender la dirección del movimiento del precio. Una posible solución sería realizar una valoración primaria del movimiento de la propia serie de precios. Es decir, la secuencia de valles descendentes o picos ascendentes. Pueden surgir problemas cuando el pico más próximo está por debajo del anterior, y el valle más próximo está por encima del anterior o al contrario, las llamadas barras "Interna" y "Externa" (término de Price Action).

  

Fig.34

El segundo método es el uso de las propias líneas +DI y -DI. No debemos olvidar que el pico –DI siempre se corresponde con el valle en el gráfico de precio. Aquí, en la tendencia ascendente (+DI por encima de -DI) según la línea +DI, investigamos los picos para encontrar las divergencias bajistas clásicas, y según -DI, los picos para buscar las divergencias alcistas inversas. En el mercado descendente (+DI por debajo de -DI), analizamos en -DI los picos para buscar las divergencias alcistas clásicas, y según los picos +DI, las divergencias bajistas inversas.


Fig.35

El tercero, y en nuestra opinión el más efectivo, supone la aplicación al conjunto de ambos métodos. Esta variante soluciona un enorme grupo de problemas. Esto nos permite ver la divergencia según las líneas ADX sin retardos a la espera del viraje. Filtrar las señales según el tipo dependiendo de la tendencia general sin aplicar instrumentos adicionales.

Con esto, querríamos finalizar con los osciladores clásicos. ¿Por qué no han entrado aquí osciladores como АО, АС, TRIX, WPR y y otros semejantes?

Los instrumentos para el análisis se han seleccionado según el principio de originalidad de la fórmula de cálculo.

WPR(10) es el mismo Stochastic(10.1.1 (Low/High)), solo que con la escala invertida. Stochastic funciona en el intervalo 0-100, mientras que WPR funciona en el intervalo 100-0.


Fig.36

Awesome Oscillator (AO) es una MACD (5.35.1 Median) con la única diferencia de que AO se suaviza según una SMA (media móvil simple), mientras que en la MACD se usa una EMA (media móvil exponencial), por este motivo, la última es un poco más “viva”. En la figura de abajo, podemos ver que no introduce cambios categóricos en la forma de la señal.


Fig.37

Accelerator no es otra cosa que OsMA (5.34.5  Median) con las mismas diferencias que MACD con АО.


Fig.38

TRIX también se basa en medias móviles, por lo que es posible conseguir el mismo resultado seleccionando los parámetros de MACD.

  

Fig.39

 

Volúmenes 

Vemos una gran variedad de estrategias que usan análisis técnico. Podemos destacar aparte un grupo que usa los volúmenes. Es muy poco significativo, pero aun así tiene su razón de ser. En nuestra opinión, los volúmenes en Fórex están injustamente infravalorados. E incluso el hecho de que no obtengamos ninguno real en este mercado (solo de ticks) no menoscaba de forma alguna la idea de los autores. Dedicaremos a este tema materiales aparte, pero, por ahora, vamos a analizar lo relacionado con la divergencia.

La lista de indicadores que usan el volumen en su algoritmo y que están incluidos en el paquete obligatorio del terminal MetaTrader 5 es muy limitada. Se trata de Accumulation/Distribution (Mark Chaikin), Money Flow Index (la coincidencia de las fórmulas de cálculo nos da derecho a llamarlo RSI de volumen), On Balance Volume (Joseph Granville), Market Facilitation Index (Bill Williams) y el propio Volume. Además de ellos, podemos incluir Force Index (Alexander Elder), que por algún motivo ha quedado fuera de este grupo, entrando en el apartado «Osciladores». El escaso número de instrumentos comerciales de este tipo, genera prejuicios hacia los mismos. Por est motivo, en los materiales relacionados con la divergencia de volúmenes, podemos observar con mayor frecuencia esta imagen.

  

Fig.40

En la figura se puede ver que este método para determinar la divergencia es bueno al analizar el mercado con los datos históricos, y complicado al crear instrumentos de automatización. Posee muchos defectos. Se trata de la diferencia en los volúmenes de las transacciones dependiendo de la sesión y las desviaciones introducidas por este hecho. Podemos comprender que en la sesión asiática serán menores que en la europea o la americana. Asimismo, tanto el inicio de la tendencia como el cierre de las transacciones por parte del tráder se ven acompañados por un aumento brusco, y este volumen puede ser mayor que al comienzo.

  

Fig.41

Estos aumentos bruscos también acompañan a los movimientos propiciados por las noticias.

  

Fig.42

Resulta posible solucionar parcialmente esta tarea usando otros indicadores en los que hay línea de balance, en lugar de utilizar el Volume estándar. Hablamos de la SMA normal (media móvil simple) de los volúmenes en un periodo determinado. Esto permite filtrar los valores poco significativos. A estos pertenece «BetterVolume», que ha ganado mucha popularidad.


Fig.43

Otro método para solucionar el problema es la alineación de la serie de precios y el indicador Volume. Determinaremos el volumen en aquellas velas donde se ha formado el nuevo High (Low) y luego las compararemos. Para que resulte más visual, vamos a introducir ciertos cambios en la variante clásica de acuerdo con nuestro algoritmo.

Naturalmente, el histograma ahora no tendrá dos colores, sino cinco.

#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1  Green,Red,Blue,Magenta,Gray
  1. Green - si low[i]>low[i-1] y high[i]>high[i-1].
  2. Red     - si low[i]<low[i-1] y high[i]<high[i-1].
  3. Blue   - es la up bar exterior
  4. Magenta - es la dn bar exterior
  5. Gray - si no responde ninguno de los anteriormente enumerados 

El bloque principal de cálculo del "Volumes" estándar no se distingue en nada, salvo en la función "CalculateVolume", a la que se ha añadido el coloreado de las columnas del histograma

void CalculateVolume(const int nPosition,
                     const int nRatesCount,
                     const long &SrcBuffer[],
                     const double &h[],
                     const double &l[],
                     const double &o[],
                     const double &c[])
  {
   ExtVolumesBuffer[0]=(double)SrcBuffer[0];
   ExtColorsBuffer[0]=0.0;
//---
   for(int i=nPosition;i<nRatesCount && !IsStopped();i++)
     {
      //--- calculate indicator color
      ExtVolumesBuffer[i]=(double)SrcBuffer[i];
      ExtColorsBuffer[i]=4.0;
      //--- tendencia ascendente barra UP----
      if(h[i]>h[i-1] && l[i]>l[i-1]&& o[i]<c[i])ExtColorsBuffer[i]=0.0;
      //--- tendencia ascendente barra DN ----
      if(h[i]>h[i-1] && l[i]>l[i-1]&& o[i]>c[i])ExtColorsBuffer[i]=3.0;
      //--- tendencia descendente barra DN ----
      if(h[i]<h[i-1] && l[i]<l[i-1]&& o[i]>c[i])ExtColorsBuffer[i]=1.0;
      //--- tendencia descendente barra UP ----
      if(h[i]<h[i-1] && l[i]<l[i-1]&& o[i]<c[i])ExtColorsBuffer[i]=2.0;
      //--- barra UP exterior ----
      if(h[i]>h[i-1] && l[i]<l[i-1] && o[i]<c[i])ExtColorsBuffer[i]=2.0;
      //--- barra DN exterior ----
      if(h[i]>h[i-1] && l[i]<l[i-1] && o[i]>c[i])ExtColorsBuffer[i]=3.0;
      //--- barra interior ----
      if(h[i]<h[i-1] && l[i]>l[i-1])ExtColorsBuffer[i]=4.0;
     }
//---
  }
//+------------------------------------------------------------------+


Fig.44 

Esta variante, aunque no es ideal, simplifica el análisis. Podemos proponer algunas variantes más, incluso cambios globales para el propio principio de cálculo, pero debemos recordar que “todo lo nuevo es algo viejo que hemos olvidado por completo”. No somos los primeros en analizar estas ideas, y si no han logrado difusión alguna, no nos servirán de mucho. Es más que dudoso que todo esto nos ayude al automatizar la búsqueda de la divergencia aplicando este indicador. Vamos a centrar nuestra atención en aquello que es “de dominio público”.

Money Flow Index 

Como ya hemos mencionado más arriba, su fórmula de cálculo es muy semejante a la de RSI.

Prise=(high+low+close)/3

MF=Prise*Volume

MR=positiveMF/negativeMF

MFI=100-100/(1+MR)

En nuestra opinión, resulta más adecuado que RSI para detectar las zonas de sobrecompra/sobreventa, dado que el propio concepto de sobrecompra/sobreventa no considera tanto la magnitud del cambio del precio en el periodo calculado, como cuántos “jugadores” han participado en este proceso, que es lo que precisamente hace MFI. Como consecuencia, refleja mejor la relación causa-efecto. Eso sí, acusa los mismos defectos que su “hermano”.


Fig.45

  On Balance Volume

(Joseph Granville)

Si el precio de cierre actual está por encima del anterior:

OBVn=OBVn-1-Volumen

Si el precio de cierre actual está por debajo del anterior:

OBVn=OBVn-1-Volumen

Si el precio de cierre actual es igual al anterior:

OBVn=OBVn-1

Donde:

  • OBVn es el valor del indicador On Balance Volume en el periodo actual;
  • OBVn-1 es el valor del indicador On Balance Volume en el periodo anterior;
  • Volumen es el volumen de la barra actual.

Si recurrimos a la guía de ayuda, la información que obtendremos será más bien escasa. Pero en esta existe una frase clave: “los cambios de OBV anteceden a los del precio”, es decir, existe una divergencia entre el movimiento del precio y los volúmenes invertidos en este movimiento, lo que nos da pleno derecho a usarlo.


Fig.46

En la figura de arriba, hemos marcado con un signo de interrogación una de las divergencias. Sí, en verdad el movimiento del mercado ha sido poco significativo, y aquí el factor principal es que se ha dado el paso de un día a otro, y no conviene esperar una volatilidad perceptible del mercado asiático. En lo sucesivo, cuando analicemos los niveles objetivo, comprenderemos que ha trabajado lo suyo, y por ello es totalmente permisible.

Force Index

(Alexander Elder).

Force Index=Volume*(CLOSEn-CLOSEn-1)

La fórmula del original se distingue de aquella que se ha implementado en el terminal.

Force Index=Volume*(MAn-MAn-1)

El motivo de ello no nos resulta del todo comprensible, pero no introduce ningún cambio significativo en la forma de la señal, lo cual es totalmente permisible a la hora de resolver nuestra tarea.


Fig.47 

Los diferentes aspectos de las demás señales emitidas por este instrumento, así como sus diferencias, se salen del marco de este artículo.

Como ya hemos dicho, este indicador pertenecía a la clase de los osciladores, aunque Alexander Elder, en el libro mencionado anteriormente, escribe: “Lo considero el mejor instrumento para medir el volumen en los mercados”

Él lo contempla como herramienta para buscar la divergencia.


Fig.48

Entrada y objetivos

Son muchos autores los que se mantienen fieles a la variante clásica. La entrada en la transacción suena así:

Después de detectar la divergencia, ubicamos una orden STOP de compra en el máximo de la vela en la que ha finalizado la formación del patrón para la divergencia alcista, o una orden STOP de venta en el mínimo de la vela para la divergencia bajista.


Fig.49

Esta variante se puede considerar la óptima, y permite conseguir el máximo beneficio dentro de lo posible. Para este método de entrada en la transacción, podemos recomendar como primer objetivo los límites del envoltorio “Envelopes (26)” (la desviación se selecciona dependiendo de la volatilidad del mercado).


Fig.50

O bien puede tratarse del límite de un canal equidistante construido según los puntos de formación de la divergencia, donde el tercer punto será el máximo (mínimo) entre el primero y el segundo.


Fig.51

El Stop Loss lo colocaremos de la forma clásica, por debajo del mínimo para las transacciones Buy y por encima del máximo para las transacciones Sell. Este enfoque, aunque parezca «ideal», solo será adecuado en aquellos casos en los que nuestro patrón también sea «ideal», es decir, cuando se haya formado teniendo en cuenta todas las reglas y haya sido confirmado adicionalmente. Asimismo, se lo puede utilizar en intervalos temporales mayores, donde, gracias a una mayor volatilidad y la posibilidad (debido a la presencia de tiempo) de analizar adicionalmente el estado del mercado y salir a tiempo de la transacción, podemos obtener un beneficio, aunque sea pequeño.


Fig.52

Este "TP" es flotante, y resulta complicado determinarlo antes de abrir la transacción. Asimismo, cambiará cuando el tiempo se agote. Entre sus defectos: para los intervalos temporales cortos deberemos tener tiempo de analizar la posible rentabilidad de la transacción realizada. Para estos casos, podemos recomendar otra variante más fiable. Construiremos la línea de tendencia y entraremos solo después de su ruptura, lo cual es una señal por sí mismo para la ruptura de tendencia, y en nuestro caso, actúa como confirmación de la misma. En la mayoría de los casos, coincidirá o casi coincidirá con el nivel de la variante clásica, pero en este caso, además, nos dará mayor seguridad.


Fig.53

Podemos usar las reglas de la primera parte, modificando la corrección de la construcción de las líneas. A veces, estas líneas creadas por el indicador deben ser corregidas.

Para estas transacciones, como objetivos se seleccionan los niveles de apoyo/resistencia.


Fig.54

Asimismo, querríamos decir unas cuantas palabras sobre las divergencias dobles y triples. Podemos considerar el objetivo para ellas la finalización de la formación de la primera señal (con mucha frecuencia). Con menor frecuencia, se trata del fractal entre los puntos de formación de la primera divergencia o su comienzo.


Fig.55

Ahora, cabe preguntarse si es conveniente colocar stops. No, no vamos a enseñar nada negativo. Cada cual elige su estilo de trading y sus reglas de gestión. El método de comercio que implica la ausencia de stops o su práctica eliminación se puede recomendar solo a los tráders experimentados. Alguien que esté seguro de que sus construcciones son correctas o de que su indicador funciona como es debido, que sepa modificar sus acciones en el transcurso de una transacción o cerrar una operación con pérdidas sin esperar que la situación esté fuera de control.

Creando un instrumento comercial

El contenido del artículo indica que no nos vamos a dedicar a criticar reglas ya existentes. Nuestro objetivo es analizar esta cuestión desde un nuevo punto de vista y, a ser posible, extraer algo útil de todo el proceso. Los autores que ha creado instrumentos comerciales implementan en ellos un concepto propio, con el deseo de obtener un resultado. El indicador se crea conforme a un mercado concreto, y también con el objetivo de facilitar la definición de este u otro parámetro. A veces, el propio concepto implementado en el mismo no resulta comprensible. O la interpretación de las lecturas está clara al cien por cien solo para el autor.

En lo sucesivo, los tráders, en su afán de lograr un resultado positivo, intentan aplicarlas en otras condiciones, perdiendo de vista durante ese proceso tanto el sentido general, como la posible eficacia del mismo. Todo esto se parece un poco al deseo que seguramente ha experimentado cada tráder que ha puesto a prueba una vez un robot que pierde dinero con seguridad o ha obtenido semejante resultado al crear uno: ¿Y qué ocurriría de cambiar la dirección de las transacciones? ¿Ganaría dinero con la misma seguridad?

Nuestro objetivo es semejante: qué pasaría si... Parte del resultado de este enfoque ya ha sido publicado en la primera parte. Ahora, tenemos que implementarlo de acuerdo con otro aspecto. Vamos a tomar un instrumento que, con todos sus defectos, es capaz de dar un resultado en uno de sus segmentos que nadie puede ofrecer. Estamos hablando del indicador ADX. Todos conocemos sus defectos. Se trata sobre todo de su fuerte retraso, debido al suavizado doble. Además, la dirección de la línea principal, así como de las otras, no coincide con la dirección del movimiento del mercado. Debido a ello, surgen complicaciones al interpretarlo, porque al autor implementó la idea de mostrar la fuerza, no la dirección.


Fig.56


Fig.57

Por este motivo, si bien con la línea «DI+» todo está en orden, la línea «DI-», aunque parezca que sigue una dirección, en realidad está puesta del revés. Aquí, los picos de la línea son en realidad los valles del movimiento del precio.


Fig.58

Desconocemos los motivos que impulsaron a Welles Wilder a crear semejante indicador (en el marco del «Sistema Parabólico»), dado que solo conocemos su trabajo superficialmente. De manera lógica, podemos suponer que fue creado para el mercado de acciones, donde el concepto de comercio, en el sentido que nos hemos acostumbrado en Fórex, está distorsionado. Las acciones se compran con mayor frecuencia por un plazo prolongado, para obtener así dividendos o capitalización.

Y aquí llega nuestro turno. Tenemos que tomar de él lo mejor que tenga y usarlo con la mayor efectividad posible. Los mejor es que detecta estupendamente esos mismos picos y valles teniendo en cuenta la tendencia de mercado (fuerza de mercado), gracias a la división entre componentes positivos y negativos. Esta solución también permite comprender con mayor detalle lo que sucede en el mercado: si se trata de la presión ejercida por los compradores sobre los vendedores en un mercado descendente o de los vendedores sobre los compradores en un mercado ascendente; si la disminución de la actividad general se debe al descenso del número de participantes, o simplemente los tráders han decidido descansar para reflexionar sobre lo sucedido. Pero no vamos a detenernos aquí. Un vistazo fugaz a la fórmula nos permite comprender que podemos usar el movimiento parabólico de la línea principal del indicador para conseguir con facilidad el aspecto acostumbrado para nosotros como oscilador con cero de balance. Para ello, basta con evitar la conversión de la línea principal ( ADX) a un valor absoluto, excluyendo de la línea

         dTmp=100.0*MathAbs((ExtPDIBuffer[i]-ExtNDIBuffer[i])/dTmp);

la función MathAbs.

Obtendremos un indicador con el aspecto siguiente.


Fig.59


Fig.60

Mirando la figura anterior, podemos comprender que nuestro ADX (llamémoslo ADX_Osc) se las arregla bastante bien con la tarea de definir la dirección del mercado y nos facilita significativamente la tarea de buscar la divergencia a escala“global”. La ligera ralentización de la línea principal, de la que hablamos anteriormente, no ha desaparecido. Este defecto se ve sobradamente compensado por las señales “preliminares” de viraje del mercado. Las determinamos según "DI-" y "DI+".


Fig.61

Aquellos que no entiendan por qué se ha definido así la divergencia entre «DI-» (línea roja) y el precio, pueden leer de nuevo todo lo relacionado con el indicador ADX. En la figura se ve bien cómo ha comenzado la presión de los compradores sobre los vendedores en la tendencia descendente, lo que provoca la posterior consolidación, e incluso parece haber una confirmación por parte de la línea principal del indicador, pero es mejor no apresurarse. Necesitamos una base más sólida para entrar en una transacción BUY. Por la fig.60, podemos ver que nuestras dudas no carecían de fundamentos. El mercado ha continuado su movimiento hacia abajo.

Entre las cosas que podríamos necesitar, podemos destacar el movimiento “unidireccional” de las líneas «DI-» y «D I+». No en vano, hemos puesto unidireccional entre comillas. En realidad, el precio parece aumentar y disminuir al mismo tiempo. Y nosotros comprendemos que esto no puede ser. Esto precisamente es la divergencia. Estos momentos surgen cuando aparece la llamada "barra interior".

Abrimos el diccionario. Capítulo de Price Action: “Barra interior (IB, inside bar), conjunto de velas ubicadas en el intervalo de la vela anterior, cuyo mínimo superior y máximo inferior son mayores que en la vela inmediatamente posterior. En un marco temporal pequeño, esta configuración tiene el aspecto general de un triángulo. La barra interior indica la indeterminación y la consolidación del mercado. Se encuentra con frecuencia en el mercado de tendencia, donde indica la continuación de la tendencia después de la ruptura de la vela madre. Se encuentran en el pico del fondo del mercado, de los niveles principales de apoyo y resistencia y en los canales laterales.”

Nuestro caso no es correcto del todo para esta definición. Como pueden recordar, estamos definiendo la fuerza, no la dirección. Por eso, sonará más o menos así: “En la barra actual, las fuerzas alcistas son menores que en la anterior, y las fuerzas bajistas son mayores que en la anterior. La forma de la barra no tiene importancia .


Fig.62

En cualquier caso, se mantiene la esencia, a saber: la barra sirve como señal para la pausa o el viraje del mercado. Al valorar su “calidad”, tendremos en cuenta la dirección (fuerza) de la tendencia principal (línea ADX_Osc ). Si la tendencia se desarolla, el valor de la línea ADX será superior para la tendencia ascendente e inferior para la descendente, se trata simplemente de la consolidación (Stop Price). Si la tendencia se debilita, la línea principal descenderá durante la tendencia ascendente y ascenderá durante la tendencia descendente (divergencia), por lo que podremos esperar un viraje del mercado. Nos limitaremos a estos hechos a la hora de tomar lo necesario para crear el indicador.

Claro que esto no es todo de lo que es capaz. Pero no tenemos la misión de exprimirlo al máximo, o darle la voz cantante en nuestra estrategia comercial.

Antes de continuar, consideremos una pequeña digresión lírica. En los albores de su “carrera como escritor”, el autor vio rechazado su primer trabajo. Simplemente, le recomendaron que crease su propio blog. Pero antes de intentar ser publicado, ya había hecho un trabajo muy voluminoso. El artículo solo contenía un extracto, lo que el autor consideraba esencial, pero sin menoscabar su significado, como le pareció. Nadie le había explicado entonces que solo se podía considerar un artículo aquel material que contenía código de programación. Y aun así, esto le quitó por mucho tiempo las ganas de seguir ”emborronando papeles”. Posteriormente, retomó la idea de que merece la pena compartir sus conocimientos. Y de nuevo falló. La simple explicación de la idea que fundamentaba el tema, que hizo posible acortar el volumen del artículo, no gustó a los moderadores. Ahora, ha decidido escribir todo lo que lo ha llevado a sacar CONCLUSIONES. Como el lector seguramente sospechará, estos no son todos los materiales que podría leer, pero es de esperar que le sorprendan agradablemente incluso en tal versión, además de lo corto del resultado. Antes de pasar al estadio final de nuestra panorámica del tema, hablaremos un poco de lo que nos ha impulsado a hacerlo de esta forma, que a alguna gente le parecerá una pérdida de tiempo.

En el artículo anterior, hablamos un poco de los problemas que surgen con los indicadores basados en las construcciones gráficas. Recordemos que estas herramientas difícilmente se someten a un análisis posterior, debido a la posibilidad de hacerlo en el modo de adaptación. Solo de forma visual, lo cual supone un gran gasto de tiempo. Transmitir las propias señales del indicador resulta, si no imposible, si bastante complicado, y esto nos obliga a introducirlo en el código programático del asesor. Asimismo, surgen problemas relacionados con la corrección de la construcción de las propias líneas, y como consecuencia, se dan señales falsas de entrada en el mercado. Es posible resolver esta tarea, pero se trata de un problema de otra naturaleza completamente distinta.

Más bien no es un tema, sino una pregunta dirigida a los creadores del lenguaje de programación MQL: ¿por qué no es posible crear objetos gráficos en forma de biblioteca de código de máquinas, lo cual, en esencia, son precisamente? ¿Por qué no es posible hacer que el búfer cuya información se debe transmitir (en forma de construcción o información) pueda pertenecer por separado a la ventana principal del gráfico o a una subventana? Es posible que alguien escriba un artículo sobre este tema, o quizá nos cansemos de evitarlo y abordemos finalmente la tarea. Volviendo a nuestro tema, de todo lo mencionado, podemos sacar una conclusión preliminar. Hemos elegido, a mi entender, el indicador más adecuado al tema del enfoque no estándar, capaz de cumplir con la tarea establecida. Usando el análisis, hemos determinado en él los puntos esenciales del comportamiento a implementar, que, a la postre, no saturarán la pantalla con su presencia. No vamos a renunciar por completo a las construcciones gráficas en nuestro indicador, dado que la tarea principal sigue siendo la automatización del proceso comercial, y la posibilidad de usarla en el mismo. 

Vamos a ser sinceros: este instrumento no supndrá un concepto concreto y finalizado. se trata de un «polígono de pruebas» para el trabajo posterior. Tras analizar su funcionamiento, cualquier lector podrá decidir qué quiere obtener como resultado final, mejorando el proyecto en consecuencia. Por este motivo, hemos implementado el «enfoque no estándar» solo para la tendencia a corto plazo, mientras que dejamos la solución clásica para las señales globales.  

Como ya hemos dicho anteriormente, el código principal para el indicador ADX no experimentará cambios sustanciales.  No obstante, sí que será necesario introducir los cambios correspondientes para darle el aspecto de un oscilador. Debido a ello, no podemos llamar simplemente ADX a través de Handle. 

#property indicator_separate_window
#property indicator_buffers 8
#property indicator_plots   3
#property indicator_type1   DRAW_LINE
#property indicator_color1  LightSeaGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
#property indicator_type2   DRAW_LINE
#property indicator_color2  Green
#property indicator_style2  STYLE_DOT
#property indicator_width2  1
#property indicator_type3   DRAW_LINE
#property indicator_color3  Red
#property indicator_style3  STYLE_DOT
#property indicator_width3  1
#property indicator_label1  "ADX"
#property indicator_label2  "+DI"
#property indicator_label3  "-DI"
//--- input parameters
input int InpPeriodADX=14; // Period
input int extremum=100; // Extremum (<1 Div= OFF)
input int Gep=4; // Point to Gep
input int Bars_Calculated=300;
//--- global variables
input bool   allLine=false;// All Line
int    ExtADXPeriod;
double PDI,NDI,pDI,nDI;
string short_name="";
int    wid=-1;
//---- buffers
double    ExtADXBuffer[];
double    ExtPDIBuffer[];
double    ExtNDIBuffer[];
double    ExtPDBuffer[];
double    ExtNDBuffer[];
double    ExtTmpBuffer[];
double    ExtUpBuffer[];
double    ExtDnBuffer[];

Algunos parámetros de entrada necesitan una explicación.

input int extremum=100; // Extremum (<1 Div= OFF)

Es el número de extremos de la línea del indicador que iteraremos para buscar la divergencia. El número mínimo es "1". Si el número es inferior, la búsqueda no se realizará. En lo sucesivo, después de determinar el número óptimo, será mejor reubicar este parámetro en los globales.

input bool   allLine=false;// All Line

Este parámetro nos permite ver en la pantalla las líneas de todas las divergencias detectadas durante el funcionamiento del indicador, determinadas por el parámetro «extremum». Se ha establecido especialmente para facilitar el análisis del funcionamiento del indicador y determinar el valor del parámetro mencionado anteriormente.


Fig.63


Fig.64

input int Gep=4; // Point to Gep

Tiene un valor estético. Los puntos con la dispersión en el valor, determinados con este parámetro, se construirán en una línea. Para el uso personal, lo hemos definido como un spread y medio o dos. No influye en el margen, pero si es necesario, podremos indicar su valor de forma adicional. Más tarde aclararemos de qué puntos estamos hablando. Para acortar la función  OnDeinit, vamos a utilizar el comando de eliminación de todas aquellas con el prefijo dado, que en nuestro caso es el nombre del indicador. En el terminal MetaTrader 5, se percibe cierto "cuelgue" al eliminar un gran número de objetos de la pantalla principal. Para evitarlo, vamos a añadir el redibujado forzoso de la pantalla.

//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0,short_name);
   ChartRedraw(0);
  }
//+------------------------------------------------------------------+

Asimismo, hemos notado que si el terminal está apagado durante un periodo prolongado, los objetos gráficos en la subventana guardan la vinculación, pero no según las coordenadas de precio/hora, sino según los píxeles de su última posición. Por eso, en el bloque donde se determina el número de barras para el primer cálculo, hemos añadido el comando para eliminarlas. Es posible que alguien sepa alguna solución más original o el motivo de esto, pero nosotros hemos solucionado el problema así.

   if(prev_calculated>1) start=prev_calculated-1;
   else
     {
      OnDeinit(9);
      start=1;
      ExtPDIBuffer[0]=0.0;
      ExtNDIBuffer[0]=0.0;
      ExtADXBuffer[0]=0.0;
     }

En la función principal de cálculo del indicador también hemos añadido el bloque para determinar el "carácter unidireccional" del movimiento de las líneas "DI+" y "DI-".

//+------------------------------------------------------------------+
//|           Fast divergence calculation                            |
//+------------------------------------------------------------------+
   int bar=start;
   if(prev_calculated<2) bar=start+2;
   if(Bars_Calculated>0)bar=fmax(rates_total-Bars_Calculated,start);
//---
   for(int i=bar;i<rates_total-1 && !IsStopped();i++)
     {
      ExtUpBuffer[i-1]=EMPTY_VALUE;
      ExtDnBuffer[i-1]=EMPTY_VALUE;
      //---
      color clrUp=clrLime;
      color clrDn=clrDarkViolet;
      //---
      if((ExtPDIBuffer[i-1]<ExtPDIBuffer[i-2] && ExtNDIBuffer[i-1]<ExtNDIBuffer[i-2]) || 
         (ExtPDIBuffer[i-1]>ExtPDIBuffer[i-2] && ExtNDIBuffer[i-1]>ExtNDIBuffer[i-2]))
        {
         if(ExtPDIBuffer[i-1]>ExtNDIBuffer[i-1])
           {
            if(ExtADXBuffer[i-1]>ExtADXBuffer[i-2])
               ExtUpBuffer[i-1]=high[i-1];
            else
              {
               ExtUpBuffer[i-1]=EMPTY_VALUE;
               ExtDnBuffer[i-1]=low[i-1];
               clrDn=clrGold;
              }
            //---
            if(MathAbs(ExtUpBuffer[i-1]-ExtUpBuffer[i-2])<Gep*_Point)
               ExtUpBuffer[i-1]=ExtUpBuffer[i-2];
            if(MathAbs(ExtDnBuffer[i-1]-ExtDnBuffer[i-2])<Gep*_Point)
               ExtDnBuffer[i-1]=ExtDnBuffer[i-2];
            //---
           }
         if(ExtPDIBuffer[i-1]<ExtNDIBuffer[i-1])
           {
            if(ExtADXBuffer[i-1]<ExtADXBuffer[i-2])
               ExtDnBuffer[i-1]=low[i-1];
            else
              {
               ExtDnBuffer[i-1]=EMPTY_VALUE;
               ExtUpBuffer[i-1]=high[i-1];
               clrUp=clrBlue;
              }

            //---
            if(MathAbs(ExtDnBuffer[i-1]-ExtDnBuffer[i-2])<Gep*_Point)
               ExtDnBuffer[i-1]=ExtDnBuffer[i-2];
            if(MathAbs(ExtUpBuffer[i-1]-ExtUpBuffer[i-2])<Gep*_Point)
               ExtUpBuffer[i-1]=ExtUpBuffer[i-2];
            //---
           }
        }
      //---
      if(ExtUpBuffer[i-1]==EMPTY_VALUE)
         ExtUpBuffer[i-1]=ExtUpBuffer[i-2];
      if(ExtDnBuffer[i-1]==EMPTY_VALUE)
         ExtDnBuffer[i-1]=ExtDnBuffer[i-2];
      //---
      if(ExtUpBuffer[i-1]!=EMPTY_VALUE)
        {
         ArrowCreate(short_name+(string)time[i]+(string)Lime,time[i],ExtUpBuffer[i-1],ANCHOR_BOTTOM,clrUp);
         if(ExtUpBuffer[i-1]!=ExtUpBuffer[i-2])
            ArrowCreate(short_name+(string)time[i-1]+(string)Lime,time[i-1],ExtUpBuffer[i-1],ANCHOR_BOTTOM,clrUp);
        }
      else
         ArrowCreate(short_name+(string)time[i]+(string)Lime,time[i],ExtUpBuffer[i-2],ANCHOR_BOTTOM,clrUp);
      //---
      if(ExtDnBuffer[i-1]!=EMPTY_VALUE)
        {
         ArrowCreate(short_name+(string)time[i]+(string)Red,time[i],ExtDnBuffer[i-1],ANCHOR_TOP,clrDn);
         if(ExtDnBuffer[i-1]!=ExtDnBuffer[i-2])
            ArrowCreate(short_name+(string)time[i-1]+(string)Red,time[i-1],ExtDnBuffer[i-1],ANCHOR_TOP,clrDn);
        }
      else
         ArrowCreate(short_name+(string)time[i]+(string)Red,time[i],ExtDnBuffer[i-2],ANCHOR_TOP,clrDn);
     }

y el módulo de inicio de las funciones de cálculo de la divergencia "global".

//+----------- Finding a discrepancy ----------+
   bar=start;
   if(bar>rates_total-2)bar=rates_total-2;
   if(Bars_Calculated>0)bar=fmax(rates_total-Bars_Calculated,bar);
   for(int i=bar;i<rates_total-2 && !IsStopped() && extremum>0;i++)
     {
      UP(i,ExtADXBuffer,high,time);
      DN(i,ExtADXBuffer,low,time);
     }

El indicador de la primera parte fue rehecho a partir de MQL4. Esta versión se ha escrito inicialmente en MQL5, Por eso, aunque no de forma muy notoria, los bloques de búsqueda de divergencias han sufrido algunos cambios.

Función de búsqueda de divergencias bajistas.

//+----------- Detectando las divergencias UP -------------------------------+
void UP(int l,const double &buf[],const double &high[],const datetime &time[])
  {
   if(Extremum(buf[l+1],buf[l],buf[l-1])<0)
     {
      int i=l;
      for(int j=0;j<extremum;j++)
        {
         int counted=LastPeak(i,buf);
         if(counted!=-1)
           {
            if(buf[l]<buf[counted] && high[l]>high[counted])
              {
               double k=fabs(buf[l]-buf[counted])/(l-counted);
               int z=1;
               bool yes=true;
               for(i=l-1;i>counted;z++,i--)
                     if(buf[i]>buf[l]+k*z){yes=false;break;}
               if(yes)
                 {
                  DrawPriceTrendLine(time[l],time[counted],high[l],high[counted],Red,STYLE_SOLID);
                  DrawIndicatorTrendLine(time[l],time[counted],buf[l],buf[counted],Red,STYLE_SOLID);
                  break;
                 }
              }

            if(buf[l]>buf[counted] && high[l]<high[counted])
              {
               double k=fabs(buf[l]-buf[counted])/(l-counted);
               int z=1;
               bool yes=true;
               for(i=l-1;i>counted;z++,i--)
                     if(buf[i]>buf[l]-k*z){yes=false;break;}
               if(yes)
                 {
                  DrawPriceTrendLine(time[l],time[counted],high[l],high[counted],Red,STYLE_DOT);
                  DrawIndicatorTrendLine(time[l],time[counted],buf[l],buf[counted],Red,STYLE_DOT);
                  break;
                 }
              }
           }
         i=counted;
        }
      //---
     }
  }

Función de búsqueda de divergencias alcistas.

//+----------- Detectando las divergencias DN -------------------------------+
void DN(int l,const double &buf[],const double &low[],const datetime &time[])
  {
   if(Extremum(buf[l+1],buf[l],buf[l-1])>0)
     {
      int i=l;
      //---
      for(int j=0;j<extremum;j++)
        {
         int counted=LastTrough(i,buf);
         if(counted!=-1)
           {
            if(buf[l]>buf[counted] && low[l]<low[counted])
              {
               double k=fabs(buf[l]-buf[counted])/(l-counted);
               int z=1;
               bool yes=true;
               for(i=l-1;i>counted;z++,i--)
                     if(buf[i]<buf[l]-k*z){yes=false;break;}
               if(yes)
                 {
                  DrawPriceTrendLine(time[l],time[counted],low[l],low[counted],Green,STYLE_SOLID);
                  DrawIndicatorTrendLine(time[l],time[counted],buf[l],buf[counted],Green,STYLE_SOLID);
                  break;
                 }
              }
            if(buf[l]<buf[counted] && low[l]>low[counted])
              {
               double k=fabs(buf[l]-buf[counted])/(l-counted);
               int z=1;
               bool yes=true;
               for(i=l-1;i>counted;z++,i--)
                     if(buf[i]<buf[l]+k*z){yes=false;break;}
               if(yes)
                 {
                  DrawPriceTrendLine(time[l],time[counted],low[l],low[counted],Green,STYLE_DOT);
                  DrawIndicatorTrendLine(time[l],time[counted],buf[l],buf[counted],Green,STYLE_DOT);
                  break;
                 }
              }
           }
         i=counted;
        }
      //---
     }
  }

La principal diferencia radica en que se le ha añadido un filtro. Haciendo pruebas, hemos establecido que para los casos de las figuras 20 y 28, la señal tiene una tendencia positiva inferior al 30%. Por eso han sido excluidas. Hemos destacado con color el código del filtro. La función de búsqueda de los propios extremos también ha sufrido algunos cambios. Se ha excluido en la misma la posibilidad del filtrado según el valor positivo y negativo de la posición de la línea del indicador. En nuestro caso, no solo no hay necesidad de ello, sino que además molesta. Dado que la línea puede adoptar valores iguales en la barra actual y la pasada, hacemos que la determinación principal sea igual a cero. 

En lo sucesivo, si alguien quiere introducir cambios en las reglas de búsqueda, resultará muy fácil hacerlo aquí.

//+-- buscando  los extremos/search for extrema -------------------------+
int Extremum(double a,double b,double c)
  {
   if((a-b)*(b-c)<=0)
     {
      if(c>b) return(1); //extremo DN 
      if(c<b) return(-1);//extremo UP 
     }
   return(0);
  }

La búsqueda del punto del hombro izquierdo no ha cambiado.

//+--- buscando el segundo extremo UP/search for the second UP extreme -+
int LastPeak(int l,const double &buf[])
  {
   for(int i=l-2; i>4; i--)
     {
      int ext=Extremum(buf[i+1],buf[i],buf[i-1]);
      if(ext < 0)return (i);
     }
   return (-1);
  }
//+--- buscando el segundo extremo DN/search for the second DN extreme -+
int LastTrough(int l,const double &buf[])
  {
   for(int i=l-2; i>4; i--)
     {
      int ext=Extremum(buf[i+1],buf[i],buf[i-1]);
      if(ext > 0)return (i);

     }
   return (-1);
  }

Hemos añadido la construcción de los puntos de los que hemos hablado antes. Con su ayuda destacaremos las divergencias a corto plazo.

//+------------ Crea una flecha   Creates an arrow -------------------+ 
bool ArrowCreate(string                  name,
                 datetime                time,
                 double                  price,
                 ENUM_ARROW_ANCHOR       anchor,
                 color                   clr)
  {
//--- reseteamos el valor del error 
   ResetLastError();
//--- creamos una flecha 
   if(!ObjectCreate(0,name,OBJ_ARROW,0,time,price))
     {
      Print(__FUNCTION__,
            ": ¡no se ha podido crear la flecha! Código de error = ",GetLastError());
      return(false);
     }
   ObjectSetInteger(0,name,OBJPROP_ARROWCODE,167);
//--- establecemos el método de vinculación 
   ObjectSetInteger(0,name,OBJPROP_ANCHOR,anchor);
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
   ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_SOLID);
   ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
   ObjectSetInteger(0,name,OBJPROP_BACK,false);
   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
   ObjectSetInteger(0,name,OBJPROP_SELECTED,false);
   ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);
//--- ejecutado con éxito 
   return(true);
  }
//+------------------------------------------------------------------+ 

Asimismo, hemos modificado los bloques de construcción para que resulte posible representar las líneas de todas las divergencias o solo de la última en el segmento determinado por el parámetro " extremum".

Para la ventana principal del gráfico

//+------ creando los objetos en el gráfico de precio ---------------------------+
void DrawPriceTrendLine(datetime T_0,datetime T_1,double P_0,double P_1,color color_0,int style)
  {
   string name_0=short_name+"Line_Sn"+ColorToString(color_0);
   string name_1="";
   if(allLine)
      name_1=short_name+DoubleToString(T_0,0);
   else
      name_1=short_name+DoubleToString(T_1,0);
//--- 
   ObjectDelete(0,name_1);
   drawLineS(name_1,T_0,T_1,P_0,P_1,color_0,style,0,true,false,0);
//+-----------+
   if(style==STYLE_DOT)
     {
      ObjectDelete(0,name_0);
      drawLineS(name_0,T_1,T_0,P_1,P_0,clrAqua,0,3,true,true,0);
     }
  }

y en la ventana del indicador

//+------ creando los objetos en la ventana del indicador -------------------------+
void DrawIndicatorTrendLine(datetime T_0,datetime T_1,double P_0,double P_1,color color_0,int style)
  {

   int window=wid;
   string name_0=short_name+"Line_Pn"+ColorToString(color_0);
   string name_1="";
   if(allLine)
      name_1=short_name+DoubleToString(T_0+wid,0);
   else
      name_1=short_name+DoubleToString(T_1+wid,0);
//---
   ObjectDelete(0,name_1);
   drawLineS(name_1,T_0,T_1,P_0,P_1,color_0,style,0,false,false,window);
//---
   if(style==STYLE_SOLID)
     {
      ObjectDelete(0,name_0);
      drawLineS(name_0,T_1,T_0,P_1,P_0,clrMagenta,style,2,true,true,window);
     }
  }

Por este motivo, hemos pasado el comando de eliminación desde la función de construcción de líneas de tendencia al bloque principal.

//+------------------------------------------------------------------+
void drawLineS(string name,datetime T_0,datetime T_1,double P_0,double P_1,color clr,
               int style,int width,bool back,bool ray,int window)
  {
   ObjectCreate(0,name,OBJ_TREND,window,T_0,P_0,T_1,P_1,0,0);
   ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,ray);
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
   ObjectSetInteger(0,name,OBJPROP_STYLE,style);
   ObjectSetInteger(0,name,OBJPROP_WIDTH,width);
   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
   ObjectSetInteger(0,name,OBJPROP_BACK,back);
  }

Nuestro indicador tiene ahora el aspecto siguiente.


Fig.65

Aquí, podemos observar que, aparte de las líneas de divergencia a las que estamos acostumbrados, tenemos multitud de esos puntos que determinan las zonas de consolidación, y que a la vez suponen los niveles de entrada en las transacciones Selly Buy. Estas señales son determinadas por las leyes que hemos establecido (movimiento unidireccional de las líneas “DI+”,”DI-“). Los puntos verdes son los niveles de entrada en Buy, y los violetas, en Sell. La aparición de puntos azules con puntos verdes como fondo, y de puntos amarillos con violetas como fondo, advierten al tráder sobre una tendencia titubeante, así como su posible cambio. Después de abrir transacciones, estas pueden servir como niveles para desplazar los stops. Advertimos de inmediato de que resulta desaconsejable entrar en las transacciones con órdenes pendientes según dichos niveles. Y no solo porque estos determinen una tendencia del mercado a corto plazo, sino tambien debido a las activaciones falsas por la simulación con las colas. La señal de ejecución de una transacción también supone el cierre de la vela por encima (por debajo) de este nivel. En la construcción existe la variable “Gep”. El algoritmo es como sigue: después de que aprezca la señal Sell, el punto se coloca por debajo de la barra Low en la que se ha formado la señal, y cuando aparece la señal, lo colocamos por encima de High. Del margen a partir de High\low se encargan perfectamente las funciones que determinan los puntos de vinculación  ANCHOR_BOTTOM ANCHOR_TOP. En lo sucesivo, todas las señales en el radio «+\- Gep» se construirán en función del primer punto.

Además, cualquiera de nosotros podrá mejorar esta versión, por ejemplo, reduciendo el retardo de la línea principal del indicador. El método más sencillo consiste en reducir el periodo del segundo suavizado trasladándolo a las variables, lo que nos permitirá experimentar. Asimismo, se podría eliminar todo lo relacionado con la determinación clásica de la señal y añadir el algoritmo que mencionamos al hablar de MACD, dejando solo el dibujado de los niveles de entrada en la transacción. Esto reduciría significativamente el número de construcciones.

Podemos comprobar si nuestras conjeturas son correctas creando un pequeño robot. La variante clásica, y como consecuencia la dirección de la línea principal, no nos interesa. Esto nos permitirá usar el ADX estándar del terminal. Entre los filtros, solo incluiremos los casos en los que la vela de ruptura es demasiado grande. Para los casos en los que, por alguna razón, no existe la línea del canal condicional inverso en el que se colocan los stops, introduciremos la distancia Stop Loss. Asimismo, también deberemos determinar por nosotros mismos en el asesor la distancia de margen con respecto High/Low. Abajo se muestran los resultados de la simulación según las principales parejas divisas EUR/USD,GBP/USD,USD/JPY en el periodo del 01.01.2016 al 01.06.2019, en el intervalo temporal Н1,Н4.

EURUSD Н1


EURUSD Н4


GBPUSD H1


GBPUSD H4


JPYUSD H1


JPYUSD H4


Los resultados podrían ser mejores. Pero no es ese nuestro objetivo. Lo más importante es la tendencia positiva.

Conclusión

Bueno, ¿y qué supone este nuevo enfoque sobre cosas que nos parecen bien conocidas? ¿Es una simple pérdida de tiempo o representa algún progreso? Usted es un tráder de éxito. Su estrategia comercial funciona estupendamente. ¿Puede que mirar esta estrategia desde un punto de vista distinto le ayude a lograr un resultado aún mejor? ¿O mejor dejar todo como está? Cada uno debe responder a estas preguntas por sí mismo. Es posible que los resultados de nuestro trabajo impulsen a alguien a mirar de otra forma los resultados de su propio desempeño e incluso crear herramientas de análisis técnico totalmente nuevas.

Por su parte, el autor, de naturaleza autodidacta, siempre ha tenido una opinión crítica sobre lo que se publica para el público en general. Su cerebro no se ha visto enturbiado por la actividad de autores consagrados, lo cual le ha ofrecido un amplio campo de acción. Tras visitar diversos foros, se dio cuenta de que los autores de estrategias narran largamente a sus alumnos todos los detalles sobre las mismas. Todo esto lo impulsó a continuar con la búsqueda de soluciones más efectivas sin abandonar la idea de obtener el máximo beneficio. Si esto inspira a alguien a seguir con sus proyectos, consideraremos que no hemos perdido el tiempo. Claro que en este artículo se ha incluido una pequeña parte de lo que hemos construido durante el estudio de la divergencia. Así, ha ocurrido que las cuestiones surgidas en el proceso han requerido una solución, de nuevo no estándar. Y resulta muy complicado describirlo todo dentro de un mismo tema. Por este motivo, es posible que vean la luz artículos en los que se analizarán otras soluciones no estándar.

Y, otra cosa, caballeros. Les rogamos que no contacten con la petición de mejorar los materiales publicados, y menos aún pidiendo colaborar en la creación de robots. Ya tenemos el apartado Freelance para esos menesteres. Para el autor, la programación es más una necesidad forzosa. Solo comenzó a escribir programas para conocer las posibilidades del lenguaje y no plantear por desconocimiento tareas irresolubles a los especialistas, así como para comprobar sus ideas de forma operativa.

     Nombre         Tipo                           Descripción                      
1 ADX_Osc.mq5 Indicators  Indicador para analizar la divergencia. 
2 TestADX.mql5 Experts  Experto para simular las leyes detectadas. 

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

Archivos adjuntos |
ADX.zip (149.51 KB)
Creando un EA gradador multiplataforma (Parte III): cuadrícula de correcciones con martingale Creando un EA gradador multiplataforma (Parte III): cuadrícula de correcciones con martingale
En este artículo, intentaremos crear el mejor asesor posible de aquellos que funcionan según el principio del gradador. Como siempre, se tratará de un asesor multiplataforma, capaz de funcionar tanto en MetaTrader 4, como en MetaTrader 5. El primer asesor era bueno en todo, excepto en que no podía traer beneficios en un periodo de tiempo prolongado. El segundo asesor podía funcionar en intervalos superiores a varios años. Pero era incapaz de lograr más de un 50% de beneficio anual con una reducción máxima inferior al 50%.
Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte XV): Colección de objetos de símbolo. Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte XV): Colección de objetos de símbolo.
En el artículo analizaremos la creación de una colección de símbolos basada en el objeto de símbolo abstracto básico creado en el artículo anterior. Los herederos del símbolo abstracto concretarán la información sobre el símbolo. En ellos se organizará la determinación de la accesibilidad en el programa de las propiedades del objeto de símbolo básico, y también se diferenciarán los objetos de símbolo según su pertenencia a un grupo.
Análisis sintáctico HTML con ayuda de curl Análisis sintáctico HTML con ayuda de curl
En el artículo se describe una sencilla biblioteca que usa componentes de terceros para parsear código HTML. El lector podrá saber cómo llegar hasta los datos que no se pueden obtener con solicitudes GET y POST. Vamos a elegir algún sitio web con páginas no demasiado voluminosas, e intentaremos obtener del mismo información interesante.
Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte XIV): El objeto "Símbolo" Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte XIV): El objeto "Símbolo"
En este artículo vamos a crear un objeto de símbolo que será el objeto básico para crear la colección de símbolos. Con su ayuda, podremos obtener los datos de los símbolos necesarios para su posterior análisis y comparación.