Software gratuito de comercio cuantitativo de acciones Strategy_Wolfe Waves

descripción general

Wolfe Wave (Wolfe Wave) es un patrón de análisis gráfico descubierto y descrito por Bill Wolfe . Este patrón parece un triángulo o cuña ( Wolf lo llama ' cuña ascendente ') y tiene algunos matices especiales. El método gráfico propuesto por Bill Wolfe puede detectar un patrón a partir del cual se puede encontrar el momento y la dirección de entrada , y también es útil para predecir dónde debe llegar el precio y cuándo lo hará.

En este artículo , el software de operaciones cuantitativas de Hertz estudiará en detalle las reglas para la detección e interpretación de las ondas de Wolfe.  El software de comercio cuantitativo de Hertz creará un indicador que detecta y muestra automáticamente la forma de onda basada en el indicador ZigZag en el artículo general ZigZag . El software de comercio cuantitativo de Hertz también creará un sistema de comercio experto simple basado en los indicadores resultantes. Este EA permitirá a Hertz cuantificar el software comercial para probar el rendimiento del indicador y obtener una primera impresión del análisis gráfico propuesto por Bill Wolfe , que se analizará más adelante en este artículo.  

Reglas para detectar formas de onda de Wolfe

Hertz Quantitative Trading Software para estudiar la onda de Wolfe en el ejemplo de compra ( Fig . 1) . El precio forma dos picos descendentes consecutivos ( línea azul , puntos 1 y 3) y dos picos descendentes consecutivos ( puntos 2 y 4) . Después de revertirse y formar un pico en el punto 4 , el precio continúa cayendo. Una vez que el precio toca la línea extendida del punto 1 al punto 3 , se realiza una operación de compra ( punto 5) .  Fig . 1. Compre ondas de Wolfe. La línea azul es el precio y la línea roja es el objetivo de detección formado. Ejecute la entrada en el punto 5 , el objetivo es el punto 7https://c.mql5.com/2/26/001.gif

El punto de intersección 6 de las líneas de extensión 1-3 y 2-4 es el tiempo de llegada del objetivo de detección. El nivel de precio objetivo ( punto 7) se define como la intersección de la línea extendida 1-4 y la línea vertical trazada a través del punto 6 . Este método no proporciona un algoritmo de cálculo de stop loss y, en general, se recomienda que utilice un stop loss a su propia discreción. Las anteriores son las reglas de detección de forma de onda descritas en el libro de Wolfe. 

Al desarrollar los indicadores de este artículo , se encontrarán más reglas.

  1.  El punto 3 debe ser mucho más bajo que el punto 1,  se deben verificar las siguientes condiciones:

v3<v1-d1

aquí :

    • v3 — nivel de precios del punto 3;
    • v1 — nivel de precios del punto 1;
    • d1: la distancia vertical entre el punto 1 y el punto 2 (segmento de línea 1''-2'') multiplicada por K1 (K1 es un parámetro de la ventana de propiedades y su valor predeterminado es 0,1).


 

  1. La línea de extensión 1-4 del objetivo de detección debe estar hacia arriba , es decir, el punto 4 debe estar mucho más alto que el punto 1. Se deben verificar las siguientes condiciones:

v4>v1+d1;

v4 — el nivel de precios del punto 4 . 

  1. El punto 4 debe ser mucho más bajo que el punto 2,  se deben verificar las siguientes condiciones:

v4<v2-d2;

Aquí v2 es el precio del punto 2 , d2 es la distancia vertical entre el punto 2 y el punto 3 ( segmento de línea 2''-3'') multiplicado por K2 (K2 es un parámetro de la ventana de propiedades y su valor predeterminado es 0,1 ) .

  1. Las líneas de extensión 2-4 y 1-3 que detectan la hora de llegada del objetivo deben encontrarse en el lado derecho , por lo que la altura de 2-2' debe ser mucho mayor que la altura de 4-4'. Aquí se deben realizar las siguientes comprobaciones:

h2-h4>K3*h2;

Aquí h2 es la altura del segmento de línea 2-2' , h4 es la altura del segmento de línea 4-4' , K3 es la relación (K3 es un parámetro de la ventana de propiedades y su valor predeterminado es 0.1) .

No se supone que estas declaraciones de reglas sean absolutas. Lo describiremos en detalle más adelante en el proceso de creación del indicador. Con base en estos materiales , puede ajustar el código de acuerdo con sus propias ideas. 

Elija el ZigZag a usar

Antes de comenzar , descarguemos  el archivo adjunto , que contiene  varias versiones del indicador ZigZag del artículo sobre muchos ZigZag comunes .  Necesitamos elegir uno de ellos para usar en nuestro artículo. No usamos iUniZigZagPrice y iUniZigZagPriceSW, están diseñados para calcularse en función de otros indicadores que se ejecutan en el gráfico , por lo que solo son útiles para el análisis visual. Otros indicadores parecen más interesantes. Cada uno de ellos se puede utilizar para crear asesores expertos. Además , no usaremos iCloseZigZag y iHighLowZigZag, son solo ejemplos iniciales de cómo crear un ZigZag. Quedan dos versiones , iUniZigZag e iUniZigZagSW . El indicador iUniZigZagSW que funciona en una subventana nos conviene más porque ofrece una gama más amplia de funciones. El archivo adjunto también contiene el indicador iUniZigZagSWEvents y muestra el acceso a iUniZigZagSW usando la función iCustom()  Ejemplos de métricas. Usaremos esta variante porque nos permitirá usar todas las posibilidades del indicador iUniZigZagSW y además separar el código de detección de Wolfe Waves del código ZigZag.

El indicador iUniZigZagSWEvents se muestra en el gráfico de precios , se utilizan cuatro búferes para dibujar el indicador : dos búferes con flechas y los otros dos puntos de dibujo. Esto es todo lo que necesitamos para detectar las formas de onda de Wolfe. Las flechas indicarán las ubicaciones de reconocimiento de patrones , los puntos son para los objetivos. Nuestro indicador utilizará  objetos gráficos , especialmente  líneas de tendencia  para dibujar ondas y formaciones para detectar objetivos. Si lo dibuja como un segmento de línea en lugar de un rayo extendido , es una herramienta muy útil para mostrar diferentes configuraciones.  

Además de detectar el momento y la dirección de entrada , las formas de onda de Wolfe también se utilizan para predecir objetivos. Por lo tanto , surgen dificultades al usar iUniZigZagSW . El indicador tiene un parámetro SrcSelect , que puede seleccionar la fuente de datos de análisis de acuerdo con el ZigZag dibujado. Se puede seleccionar una de cuatro opciones :

  • Src_HighLow — por precio alto y bajo;
  • Src_Close — por precio de cierre;
  • Src_RSI — según el indicador RSI;
  • Src_MA — por media móvil.

Cree un Asesor Experto basado en el indicador que estamos creando ahora. Esta es la razón por la cual, si el software de operaciones cuantitativas de Hertz usa el precio para construir el ZigZag, entonces el objetivo pronosticado se puede usar para colocar el nivel de toma de ganancias. No hay nada de malo en mostrar el objetivo en el gráfico. Pero si ZigZag se calcula usando RSI (SrcSelect=Src_RSI), entonces el objetivo de pronóstico será el indicador RSI, no el precio. Entonces, una vez que el indicador RSI alcanza el valor objetivo, necesitamos el precio de mercado para cerrar la posición y no es posible mostrar el precio objetivo y configuraciones adicionales en el gráfico.

Al usar ZigZag dibujado en el precio (Src_HighLow o Src_Close), el precio objetivo y las formaciones adicionales se mostrarán en el gráfico. En todos los demás casos, solo se muestra una flecha que indica la estructura descubierta y su orientación. Los valores objetivo aún se proporcionan en los búferes de precios correspondientes (para permitir que el Asesor experto cierre posiciones a precios de mercado para cualquier otro propósito), pero no se mostrarán.

Es muy posible que en la práctica, la idea de cerrar una posición al precio de mercado cuando el indicador alcance el nivel objetivo no se pueda realizar. Los valores de la mayoría de los indicadores varían dentro de un cierto rango, y el resultado objetivo puede estar fuera de este rango. Sin embargo, en cualquier caso, el búfer contendrá el valor objetivo.

Recopilar datos sobre los picos de ZigZag

Ahora comenzaremos a crear indicadores. Abrimos el archivo iUniZigZagSWEvents, en el editor y lo guardamos como iWolfeWaves. Manipularemos este indicador.

Es muy conveniente tener acceso directo a todos los picos de ZigZag; en este caso, no tenemos que buscarlos en el historial cada vez. Vamos a crear una matriz para contener los valores. Ahora, cada vez que el ZigZag cambie de dirección, se agregará un nuevo elemento a la matriz. Si el indicador simplemente extiende el último segmento (actualiza el extremo), entonces se actualizará el último elemento de la matriz.

Para cada pico, guardaremos el índice del pico, su dirección y la barra en la que estaba (indexado de izquierda a derecha). Para ello, utilizaremos una estructura con tres campos  :

struct SPeackTrough{ 
   double Val; // pico 
   int Dir; // dirección 
   int Bar; // índice de barra 
};

Vamos a crear una matriz de estas estructuras:

Pico de pico Pico de pico [];

Si el ZigZag se basa solo en precios altos y bajos (SrcSelect = Src_HighLow), basta con incrementar la matriz en caso de cambio de dirección, establecer el valor y actualizar el último elemento con el último segmento estirado del indicador. ZigZag basado en precios de cierre (SrcSelect = Src_Close) o cualquier otro indicador de datos es más difícil. Durante la formación de una barra, la dirección cambia, ZigZag puede volver a su estado original (es decir, antes de la apertura de la barra actual). Esto significa que para cada recálculo de la misma barra, la matriz de picos debe volver al estado inicial de la barra anterior. Si cambiamos el tamaño de la matriz con frecuencia, esto puede ralentizar el funcionamiento del indicador. Por lo tanto, introduzcamos una variable adicional en la que se guardará el tamaño de matriz utilizado. Cuando sea necesario, la matriz se modificará en bloques, solo se permitirá que crezca en tamaño. Antes de volver a calcular la misma barra, devolvemos el valor inicial de esta variable.

Usaremos dos variables para almacenar el tamaño de la matriz. En una variable, almacene el tamaño de la matriz en la barra anterior. El tamaño de la barra calculada actualmente se almacenará en la segunda variable:

int PreCount; // el tamaño de la matriz PeackTrough en la barra anterior 
int CurCount; // el tamaño de la matriz PeackTrough en la barra calculada actual

Después de que se forman y calculan las barras, o después del cálculo de las barras históricas, el valor de la variable CurCount debe transferirse a la variable PreCount. Luego, antes de cada cálculo de una barra recién formada, moveremos el valor de PreCount a CurCount. Solo se utilizará la variable CurCount para todos los cálculos. La variable PreCount es solo auxiliar. La información sobre la finalización de la estructura de la barra solo se conoce en la apertura de la siguiente barra (o cuando el cálculo cambia a la siguiente barra en la historia). La aparición de una nueva barra estará determinada por el tiempo: si el tiempo de la barra ha cambiado, aparecerá una nueva barra (o se iniciará la siguiente barra en el historial de cálculo). Se necesita una variable auxiliar para determinar la nueva barra:

fecha y hora última hora;

PreCount, LastCount y LastTime son variables globales del indicador. Pero también se pueden   declarar como variables estáticas en la  función de indicador OnCalculate() .

Pasamos a la función OnCalculate(). Con base en el valor de prev_calculated, se determina si el cálculo del indicador se realiza por primera vez o solo para barras nuevas. 0 significa todos los cálculos. En este caso, las variables PreCount, CurCount y LastTime deben inicializarse. El siguiente código se encuentra en la parte superior de la función OnCalculte(), define el rango de barra calculado e inicializa las variables auxiliares:

int start; // variable de índice de la barra para iniciar el cálculo 

if(prev_calculated==0){ // calcula todas las barras 
   start=1; 
   CurCount=0;    
   PreCount=0; 
   LastTime=0; 
} 
else{ // Calcula nuevas barras 
   inicio=anterior_calculado-1; 
}

Ahora tratemos con el ciclo de indicador estándar. Al principio, trasladaremos el valor de organización en las variables PreCount, CurCount:

for(int i=start;i<rates_total;i++){ 

   if(time[i]>LastTime){ // calcula la nueva (siguiente) barra 
      LastTime=time[i]; 
      PreCount=CurCount; 
      PreDir=CurDir; 
   } 
   else{ // recálculo de barra 
      CurCount=PreCount; 
      CurDir=PreDir; 
   }

En todos los cálculos, solo se usa la variable CurCount y PreCount solo está diseñado para mantener el valor actual de CurCount. Al comienzo de la apertura de una nueva barra, CurCount primero contiene el valor obtenido después del cálculo de la barra anterior. Es por eso que movemos este valor a PreCount. Después del cálculo de una nueva barra, se puede cambiar el valor de CurCount. Sin embargo, podemos estar seguros de que el valor es definitivo solo en la apertura de la siguiente barra. Por eso, en caso de recálculo de la misma barra, el valor de la variable PreCount se coloca en CurCount.

Supongo que te gusta

Origin blog.csdn.net/herzqthz/article/details/131791218
Recomendado
Clasificación