English Русский 中文 Deutsch 日本語 Português 한국어 Français Italiano Türkçe
Asesor Experto basado en las "Nuevas Dimensiones de Trading" ("New Trading Dimensions"), de Bill Williams

Asesor Experto basado en las "Nuevas Dimensiones de Trading" ("New Trading Dimensions"), de Bill Williams

MetaTrader 5Sistemas comerciales | 23 diciembre 2013, 12:00
15 059 0
Alexey Klenov
Alexey Klenov


Introducción

En este artículo trataré el desarrollo de un Asesor Experto (EA, por sus siglas en inglés) de trading, basándome en el libro "New Trading Dimensions: How to Profit from Chaos in Stocks, Bonds, and Commodities" ("Nuevas dimensiones de trading: como beneficiarse del caos en bolsa, bonos y bienes"), de B. Williams, para la plataforma MetaTrader 5 en el lenguaje MQL5. La estrategia en sí misma es muy conocida, y su uso todavía causa controversia entre traders. 

Atrae a gente nueva con su estudio real de señales "casi completamente" libres de connotaciones subjetivas, en contraste, por ejemplo, con la interpretación de la Teoría de las Ondas de Elliot. Pero esto solo se observa a primera vista; en algunos lugares, las decisiones las deberá tomar el trader. Y esto se tratará más a fondo en el artículo.

Los objetivos de este artículo son:
  • Desarrollar una clase de EA que implementa el trading usando el paradigma OOP (un programa orientado al objeto), basándonos en la estrategia de B. Williams. Lo llamaremos C_TS_BW;
  • En la clase C_TS_BW, cuando sea posible, utilizar códigos incluidos en la Biblioteca estándar.
  • Escribir un EA que utilice la clase C_TS_BW;
  • Poner a prueba el EA desarrollado en el Probador de Estrategias en varios instrumentos Forex y CFD;
  • Finalmente, confirmar o refutar la aptitud de esta estrategia en las condiciones de mercado actuales.


1. Indicadores

En la base del sistema de trading hay señales de 4 indicadores:

  1. Alligator (Aligátor);
  2. Fractals (Fractales);
  3. The Awesome Oscillator ("Gran Oscilador");
  4. Acceleration/Deceleration (Aceleración/Deceleración).

1.1. Alligator

El indicador técnico Alligator es una combinación de Líneas de Equilibrio (Medias Móviles), que usa geometría fractal y dinámicas no lineales.

  • La línea azul (la Mandíbula del Alligator) - es la Línea de Equilibrio para el período de tiempo que se utilizó para construir un gráfico (una media móvil suavizada de 13 períodos, adelantada por 8 barras en el futuro);
  • La línea roja (los Dientes del Alligator) - es la Línea de Equilibrio para un período de tiempo significativo, más baja por una orden (una media móvil suavizada de 8 períodos, adelantada por 5 barras en el futuro);
  • La línea verde (los Labios del Alligator) - es la Línea de Equilibrio para un período de tiempo significativo, más baja por otra orden (una media móvil suavizada de 5 períodos, adelantada por 3 barras en el futuro).

Las líneas de los Labios, Dientes y Mandíbula del Alligator ilustran la interacción de períodos de tiempo diferentes. Puesto que las tendencias de mercado se pueden identificar solo el 15-30 por ciento del tiempo, debemos seguir las tendencias y no trabajar en mercados que fluctúen solo con ciertos períodos de precios.

Cuando las líneas de los Labios, Dientes y Mandíbula están cerradas o interconectadas, el Alligator se irá a dormir o ya estará durmiendo. Mientras duerme, el hambre del Alligator aumenta. Cuando más duerma, más hambriento estará cuando se despierte. Cuando se despierta, lo primero que hace es abrir su boca y bostezar. Después, comienza a notar el olor a comida: carne de toro (Bull) o de oso (Bear). Esto le anima a salir de caza. Cuando el Alligator satisface su hambre, comienza a perder interés en el precio de la comida (las Líneas de Equilibrio se juntan). Este es el momento de fijar el beneficio.

1.2. Fractals

Todos los mercados están caracterizados por el hecho de que, la mayor parte del tiempo, los precios no fluctúan mucho, y solo se pueden observar cambios de tendencia en períodos cortos de tiempo (15-30 por ciento). Los períodos más favorables para la extracción de beneficio son cuando los precios de mercado cambian de acuerdo con una cierta tendencia.

Fractals (Fractales) - es uno de los cuatro indicadores del sistema de trading de Bill Williams, que permite detectar el punto más bajo y/o la cima. La definición técnica de un fractal ascendente es una serie de al menos cinco barras consecutivas, de las cuales dos barras, antes y después del máximo más alto, tienen máximos más bajos. La configuración opuesta (series de cinco barras, en las que antes y después del mínimo más bajo hay dos barras con mínimos más altos) es un fractal descendente. En un gráfico, los fractales tienen valores de Alto y Bajo, y están indicados por flechas ascendentes o descendentes.

Las señales del indicador Fractals deben filtrarse con el indicador técnico Alligator. En otras palabras, no deberíamos completar una transacción para comprar si un fractal se encuentra por debajo de los Dientes del Alligator, y tampoco deberíamos vender si un fractal está por encima de los Dientes del Alligator. Después de que se haya formado el fractal y esté en funcionamiento, lo que se determina por su posición más allá de la Mandíbula del Alligator, se mantiene como señal hasta que se da una coincidencia, o hasta que aparece una señal de fractal más reciente.

1.3. AO (Awesome Oscillator)

El indicador técnico Awesome Oscillator (Gran Oscilador) de Bill Williams - es una media móvil simple de 34 periodos construida por los puntos medios de las barras (H + L)/2 que se sustrae de la media móvil simple de 5 períodos, construida por los puntos centrales de las barras (H + L)/2. Nos permite saber qué ocurre en el momento presente con el motor del mercado.

1.4. AO (Accelerator Oscillator)

El precio es el último elemento que cambia. Antes de que cambie el precio, el motor del mercado cambia, y antes de que el motor cambie de dirección, la aceleración del motor debería reducirse hasta llegar a cero. Entonces, empieza a acelerarse hasta que el precio comienza a cambiar de dirección.

El indicador técnico Accelerator/Decelerator Oscillator (AC, o Aceleración/Deceleración) mide la aceleración y deceleración del motor actual. Este indicador cambiará su dirección antes de que se dé el cambio en el motor, y a su vez cambiará de dirección antes de que se dé el cambio en el precio. Entender que el AC es un aviso anticipado supone una evidente ventaja.


2. Señales

El sistema de trading descrito en el libro "New Trading Dimensions" ("Nuevas dimensiones de trading"), de B. Williams, utiliza señales de cinco dimensiones de mercado.

  • La primera dimensión es: superar el fractal más allá de la Mandíbula del Alligator;
  • La segunda dimensión es: las señales del indicador AO (el Gran Oscilador);
  • La tercera dimensión es: las señales del indicador AC (Oscilador de Aceleración);
  • La cuarta dimensión es: "Zone Trading", o trading por zonas;
  • La quinta dimensión es: trading de línea de saldo.

Más sobre las señales de cada dimensión.


2.1. Descripción de trading por señales de la primera dimensión

El fractal "A" (señales de compra) es falso, porque la ruptura de precios ocurre por debajo de la línea de la Mandíbula del Alligator. El fractal "B" se ejecuta y tenemos una posición corta abierta. Con la apariencia del fractal "C" cerramos nuestra posición corta, y tenemos ya una posición de red larga.

Con la ruptura del fractal "D" cambiamos de nuevo la posición de compra a venta. Al superar el fractal "E" para comprar, el mercado nos dice de nuevo que la posición debe cambiar de venta a compra. Con la ejecución de señales de los fractales "G" y "J", añadimos un contrato más a la posición larga.

Figura 1. Un ejemplo de trading en señales de la primera dimensión

Figura 1. Un ejemplo de trading en señales de la primera dimensión

2.2. Descripción de trading por señales de la segunda dimensión

Se implementaron dos tipos de señales de la segunda dimensión. Este es el cruce en la línea cero del indicador AO (Gran Oscilador) y la señal "Disco". Aceptemos el índice de barras igual que lo hacemos en MetaTrader 5, es decir, como series de tiempo. La revisión de la señal se realizará en la barra cero.

Para la formación de un patrón de "cruce en la barra cero" debe haber dos barras del indicador.

La señal de compra se forma cuando la segunda barra del indicador se encuentra por debajo de la línea cero y la primera barra se encuentra por encima de la línea cero. El precio máximo de la primera barra será la primera señal, y si se excede, la orden de compra se enviará al servidor usando el precio actual. La señal de venta se forma en el caso contrario de cruce.

Para la formación de un patrón de "disco" debe haber tres barras consecutivas, y la segunda debería estar en rojo y por encima de la línea cero, mientras que la primera debería estar en verde y más alta que la segunda. El precio señalado será el precio más alto de la primera barra, que será válido hasta que sea superado por el precio actual o hasta que se forme una nueva señal de compra. Las señales de venta del patrón de "disco" se forman de forma similar, pero en el lado opuesto del indicador.

Para la formación de un patrón de "disco" debe haber tres barras consecutivas, y la segunda debería estar en rojo y por encima de la línea cero, mientras que la primera debería estar en verde y más alta que la segunda. El precio señalado será el precio más alto de la primera barra, que será válido hasta que sea superado por el precio actual o hasta que se forme una nueva señal de compra. Las señales de venta del patrón de "disco" se forman de forma similar, pero en el lado opuesto del indicador.

Las señales "Twin Peaks" ("Cumbres gemelas") y "Twin Bottoms" ("Fondos gemelos") no se tienen en cuenta en este artículo y no se programarán en el EA porque su formación casi siempre ocurre en el lado opuesto del Alligator: los fondos gemelos están bajo la línea de la Mandíbula, y las cumbres gemelas por encima de esta línea. El trading con estas señales contradice el sistema, puesto que para alimentar al Alligator, no debemos comprar por debajo de la Mandíbula, ni vender por encima de ella.

Para una descripción más detallada de las señales, le animo a que vaya a la fuente original.

Figura 2. Un ejemplo de señales de trading de la segunda dimensión

Figura 2. Un ejemplo de señales de trading de la segunda dimensión


2.3. Descripción de señales de trading de la tercera dimensión

En la tercera dimensión están las señales de "comprar por encima de la línea cero" y "comprar por debajo de la línea cero", formadas por el indicador AC (Oscilador de Aceleración).

Primero, observemos el patrón especificado en la Figura 3. Se comprueba una barra cero. La primera barra está por encima de la línea cero (caso "A"), que consiste en dos barras verdes y una roja de un histograma. Mientras tanto, la posición de las barras segunda y tercera con respecto a la línea cero no importa.

Si la primera barra está por debajo de la línea cero (caso "B"), entonces necesitaremos tres barras verdes y una roja para la formación de una señal de compra. Asimismo, no se tienen en cuenta las barras restantes con respecto a la línea cero. Las señales de venta de la tercera dimensión son inversamente análogas.

Para una descripción más detallada y ejemplos, acuda a la fuente original.

Figura 3. Ejemplo de trading de las señales de la tercera dimensión

Figura 3. Ejemplo de trading de las señales de la tercera dimensión


2.4. Descripción de las señales de trading de la cuarta dimensión ("Zone Trading")

La zona verde se forma cuando dos indicadores (AO+AC) se encuentran en verde en una barra.

La formación de una señal de trading requiere dos zonas verdes consecutivas, y el precio de cierre de la primera barra debe ser más alto que el precio de cierre de la segunda barra.

La ejecución se implementa al abrir una nueva barra. En el original, la ejecución debe ser la orden cuando se cierra una barra. Hay situaciones en las que el último tick en el cierre de una barra puede cambiar el calor de las barras de AO o AC, y si esto ocurre, el resultado es que la compra según la señal de la zona verde era falsa. Por estas razones, yo utilicé la apertura de una nueva barra para comprar.

Asimismo, en la cuarta dimensión hay una señal para rastrear una orden de stop para la posición larga.

Esto requiere cinco zonas verdes consecutivas. El valor mínimo del precio de la primera zona se usa para configurar un Stop Loss. Si la orden de stop no se activa en la siguiente barra (tras su clausura), entonces establecemos el Stop Loss al precio mínimo de la última barra completada (debería ser más alto que la orden de detención) con la apertura de una nueva, sin tener en cuenta el color en la barra anterior.

También usamos una limitación o adición a la posición larga abierta por el número de zonas verdes consecutivas: B. Williams recomienda 6 u 8 zonas. Tras todo esto, deberíamos esperar a la aparición de una zona gris (esto ocurre cuando los colores de las columnas para AO y AC son diferentes) o zonas rojas, lo que nos permitirá de nuevo llenar la posición para comprar de la zona verde.

La señal para vender forma una "zona roja" - un reflejo de la zona verde. El color de la zona afecta también al número de barras que forman la señal del "Trading de línea de saldo" (quinta dimensión). Para esta línea, B. Williams eligió los Dientes del Alligator.

En esta señal, me gustaría insistir en que los precios de la barra cero participan en la formación de la señal.

Figura 4. Un ejemplo de trading de las señales de la cuarta dimensión

Figura 4. Un ejemplo de trading de las señales de la cuarta dimensión


2.5. Descripción de señales de trading de la quinta dimensión

El patrón "Comprar por encima de la línea de saldo" (si la zona está en verde) se forma con dos barras. Si el precio de apertura de una barra cero (así como el precio más alto de la barra en estos momentos) es más bajo que el último precio más alto de la barra (se puede encontrar algunas barras atrás), entonces se encontrará el precio máximo, y será el precio de apertura de una posición de compra en la zona verde.

Las zonas rojas o grises requieren otro máximo, más alto que el precio, para entrar en la zona verde. Tan pronto como lo encontremos (generalmente no yendo más allá de 10 barras hacia atrás, y por encima de los Dientes del Alligator [no supe cuántas barras hacia atrás se debe mirar para este patrón en el texto del autor]), lo recordaremos como el precio para entrar en la zona roja o gris, en la dirección de compra.

Para abrir una posición en la señal de "compra por encima de la línea de saldo", revisaremos el precio actual excediendo el precio en cada nueva barra (para zonas verdes/rojas/grises).

Figura 5. Un ejemplo de trading de las señales de la quinta dimensión

Figura 5. Un ejemplo de trading con señales de la quinta dimensión


3. La clase C_TS_BW

3.1. Propósito de la clase:
  • Si es posible, utilice las clases de la Biblioteca estándar;
  • Las grandes cantidades de "datos similares" se deberían almacenar en las estructuras;
  • Personalizar configuración;
  • Obtener el número de datos calculados de los indicadores requeridos para análisis;
  • Cuando hay una barra nueva, observe si hay señales de las cinco dimensiones de trading;
  • Cuando vea un nuevo tick, compruebe si hay una señal para abrir una posición;
  • Calcule el lote, ya sea fijado o "piramidal" (aprenderá sobre este algoritmo en el método CalcLot de esta clase);
  • Permita cambiar el lote del EA directamente para cada tipo de señal. Implemente la necesidad personalizada de algoritmos de gestión de dinero;
  • Rastree una orden de detención de la posición abierta. Si es necesario, cambie el precio del Stop Loss, calculado por el usuario del EA;
  • Envíe una orden en el servidor de trading y haga una segunda solicitud si le aparece un error;
  • Prohíba la duplicación de señales de trading (introducir solo un tiempo por señal);
  • Minimice el número de métodos de clase pública;
3.2. La implementación de la clase C_TS_BW
  • ... Si es posible, utilice clases y métodos de la Biblioteca estándar;

Para realizar esta tarea, deberá introducir los archivos correctos de la Biblioteca estándar.

Esto se implementa con el código de abajo.

#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\HistoryOrderInfo.mqh

En la sección privada de la clase, declare los objetos para la organización de solicitudes de trading, obteniendo la información en el símbolo y posición abierta, así como accediendo al historial de órdenes.

CTrade            exp_trade;    // trading methods from the Standard Library
CSymbolInfo       s_info;       // methods of accessing the information on symbol
CPositionInfo     pos_info;     // methods of obtaining the information on position
CHistoryOrderInfo h_info;       // methods of accessing the history of orders
  • ... Las grandes cantidades de "datos similares" se almacenan en las estructuras;

Esta clase usa cuatro estructuras, dos de las cuales están declaradas en la sección privada. Estas son las estructuras:

struct l_signals            // structure of signals and time of the bar, on which they appeared
struct l_trade              // structure of the time of the last triggered signals

Asimismo, hay dos estructuras en la sección pública:

struct  s_input_parametrs   // structure of the tuning parameters
struct  s_actual_action     // structure of the appropriate trading order

Los objetos de estos tipos de estructuras son:

l_signals         last_signals;     // signals
l_trade           last_trade;       // processed signals
s_input_parametrs inp_param;        // internal structure of the accepted settings
s_input_parametrs inp_param_tmp;    // receiving structure of the settings (received through a link with the initialization of the class)
s_actual_action   actual_action;    // orders on the serve

Puede encontrar más detalles sobre el código de las estructuras en el archivo adjunto.

  • ... personalizar configuración;

Esta tarea se implementa usando el método Init de la sección pública. Parámetros para llamadas del EA:

string Symbol_for_trade             // symbol, on which the class will trade
ENUM_TIMEFRAMES Period_for_trade     // the period of the chart symbol, on which the search for signals and its processing will occur
s_input_parametrs &inp_param_tmp   // receiving structure of the class settings

En este método ocurre también la inicialización de los indicadores involucrados y la organización de los buffers necesarios para recibir información de ellos.

  • ... obtener el número de datos calculados de los indicadores requeridos para análisis

Esto se puede hacer usando el método CopyIndValue de la sección privada los parámetros

int type       // what we request  (0- Alligator, 2 - АО, 3 - АС  )
int countValue // amount of data

Dependiendo en el tipo de parámetro, los buffers recipientes se sustituirán automáticamente por los datos calculados, organizados como series de tiempo para la inicialización de la clase.

  • ... durante la apertura de una nueva barra ...

Solo se realizará una búsqueda de señales tras abrir una nueva barra. Para ello debemos determinar ese momento. Esto se consigue con el método NewBar: no tiene parámetros de entrada, y en una situación en la que un tick recibido abre una nueva barra, devolverá un valor "true"; si no, devolverá "false".

  • ... compruebe si hay señales de cinco dimensiones de trading;

Para cada dimensión de trading comencé un método separado. Las señales de la primera dimensión se comprueban con FindSignal_1_dimension.

Parámetros de llamada:

int type               // direction of the fractal for the search (0- to buy, 1 to sell)
double &price_out[]   // this array, after a successful search, will contain the fractal price 
datetime &time_out[]  // in this array, after a successful search, will contain the time of the bar on which the fractal is found

El análisis de la segunda dimensión se realizará con el método FindSignal_2_dimension. Parámetros de llamada:

int type               // direction of the search (0-in the direction of to buy, 1-in the direction to sell)
int sub_type         // subtype of the search (0- signal of transferring the zero line, 1- sign "saucer")
double &price_out[]   // this array, after a successful search, will contain the signal price 
datetime &time_out[]  // this array, after a successful search, will contain the time of the bar signal

El análisis de la tercera dimensión se realizará con el método FindSignal_3_dimension con parámetros de entrada/salida:

int type              // direction of the search (0-in the direction of to buy, 1-in the direction of to sell)
int sub_type           // subtype of the search (0-  signal on two identical bars, 1- signal for "three identical bars)
double &price_out[]    // this array, after a successful search, will contain the signal price
datetime &time_out[]   // this array, after a successful search, will contain the time of the bar signal

El procesamiento de la cuarta dimensión se realizará con el método FindSignal_4_dimension, con parámetros de entrada/salida:

int type               // direction of the search (0-in the direction to buy, 1-in the direction to sell)
int sub_type          // what we are looking for (0- signal from the zones, 1- tailing stop for five consecutive zones of one color)
double &price_out[]   // this array, after a successful search, will contain the signal price
datetime &time_out[]  // this array, after a successful search, will contain the time of the signal bar

La quinta dimensión está monitorizada por la FindSignal_5_dimension. Parámetros de este método:

int type               // direction of the search (0-in the direction to buy, 1-in the direction to sell)
int sub_type          // subtype of the search (0-  signal for two bars, 1- signal for three bars)
double &price_out[]   // this array, after a successful search, will contain the signal price
datetime &time_out[]  // this array, after a successful search, will contain the time of the bar signal

La revisión entera está unido por el método CheckSignal, no tiene parámetros de entrada y contiene:

  • Copia de datos de los indicadores;
  • Una revisión para el cierre de una posición (si se está usando) para alguna línea del Alligator;
  • Restablecimiento de las señales de la barra anterior;
  • Búsqueda de fractales activos en ambas direcciones;
  • Dependiendo de la disponibilidad de una posición, búsqueda de las señales de las dimensiones segunda a quinta, en la dirección de una posición abierta.

Este método está declarado en la sección pública, y debe ser llamado por el EA.

  • …con la llegada de un nuevo tick, compruebe la posibilidad de activación de una señal para una apertura de una posición;

En esta clase se implementa el método CheckForTradeSignal, que ejecuta la búsqueda de posibilidades de introducir una posición por el precio actual.

Parámetros de llamada:

int dimension        // number of the dimension (from the first to the fifth)
int type            // direction of the trade (0- buy, 1- sell)
int sub_type         // signal subtype from the trading dimension (described in the signal search)
double &price_out[]  // signal price
datetime &time_out[] // time of the signal bar

Si se siguen todas las regulaciones para la activación de una señal, entonces nos dará un resultado "true"; de lo contrario, "false".

La revisión de las capacidades de procesamiento de las señales se combina con el método CheckActionOnTick, anunciado en la sección pública, que debe ser llamado por el EA. No hay parámetros para la llamada. Cada señal con éxito se almacena en el objeto actual_action, y después será procesada en el método TradeActualSignals.

  • …calcular el lote; ya sea fijado o "piramidal"

El método CalcLot está declarado en la sección pública y puede ser llamado por el EA. Está pensado para el cálculo del lote y la consiguiente modificación de la variable "Lot", declarada en la sección privada de la clase. Parámetros de llamada:

bool external // for the installation of the external calculated lot, you need to direct to this variable true, 
              // then the lot will be set by the value ext_lot. 
              // Inside this class (calculate the lot), the method is called with the parameter false.
double ext_lot // external size of the lot
int type // type of lot calculation 
         //(0- starting lot (use the value that was transferred during the initialization of the class, 
         //-1 turn over lot (the sum of the lot of the current position and the starting lot), 
         // the values from 5 to 2 are used if the aggressive trading mode is turned on (meaning "pyramiding").
         // In this mode: 5 – starting,  multiply by 5, 
         // 4 – starting,  multiply by 4,
         // 3 – starting,  multiply by 3, 
         // 2 – starting,  multiply by 2,
         // 1 - the filling lot is equal to the starting lot

Ahora que hemos considerado el lote fijado, hablemos más del lote "piramidal".

Deje que el lote inicial sea igual a 0,1. Por ejemplo, abriendo con el lote inicial para la señal del fractal, fuera de la Mandíbula del Alligator, la posición total será 0,1 lotes. Tras ello, empezamos a analizar las señales recibidas de las dimensiones segunda a quinta. Tan pronto como la señal se active, rellene la posición abierta con 0,5 lotes (inicial, multiplicado por 5), y obtenga el volumen total de la posición como 0,6 lotes. Durante la siguiente señal en la dirección de la posición abierta, rellene con 0,4 lotes, y la posición total será igual a 1,0 lotes.

La siguiente señal en la dirección de la posición nos dará 0,3 lotes adicionales, y su volumen será de 1,3 lotes. La quinta adición se hará con 0,2 lotes, y el volumen total de la posición pasará a ser de 1,5 lotes. Las siguientes adiciones en la dirección de la posición serán solo de 0,1 lotes.

Este algoritmo de gestión monetaria (ММ) fue descrito por B. Williams en el Trading Chaos (Caos de Trading). La posibilidad de instalación de un lote de usuario nos permite implementar prácticamente cualquier gestión de capital.

Para una determinación correcta de la secuencia de órdenes en una transacción, utilizo varios Números Mágicos.

Número

Descripción de la orden

999

Anular orden

1000

Comenzar orden

1001

Rellenar orden (empezando Х 1)

1002

Rellenar orden (empezando Х 2)

1003

Rellenar orden (empezando Х 3)

1004

Rellenar orden (empezando Х 4)

1005

Rellenar orden (empezando Х 5)


La clase calculó el número necesario (usando el método CalcMagic), el cual más tarde identificará la operación de trading en el servidor antes de enviar una nueva orden.

  • …Permitir el cambio de lote del EA, directamente para cada tipo de señal.

Si se desea, puede implementar en el EA una consulta sobre la estructura actual_action, donde las señales de trading se almacenan en forma de variables booleanas. Cada tipo y dirección se corresponde con una variable. Si tenemos un valor de "true", entonces, para este tick, la clase tratará de producir una operación de trading a través de la señal de trading especificada, tras lo cual se podrá cambiar el lote para esta señal. Para cada tick del cambio de precio, la clase envía solo una orden para la posición abierta o un relleno.

Se puede configurar un lote en el EA tras la llamada del método CheckActionOnTick y antes de la llamada del TradeActualSignals. Puesto que en el tick actual puede haber un número de señales en espera de ejecución, solo se seleccionará una.

La secuencia de ejecución de señal:

  • Cerrando la posición;
  • Ejecución de una de las señales del fractal (apertura, relleno, facturación de posición);
  • La señal de "disco";
  • La señal de "cruce en línea cero";
  • AC "dos barras del mismo color";
  • AC "tres barras del mismo color";
  • Trading por zonas;
  • La línea de Saldo (señal de 2 barrasl);
  • La línea de Saldo (señal de 3 barrasl);

Por tanto, es necesario tener en cuenta esta secuencia durante la instalación del tamaño de lote "de usuario".

  • ... Rastreo de Stop de la posición abierta. Si es necesario, cambie el precio del Stop Loss, calculado por el usuario del EA.

En la clase descrita hay un mantenimiento del precio de stop en la posición por el método de Rastreo de Stop, lo que implica levantar el Stop Loss solo en la dirección de aumento de los beneficios en la posición para la activación a este precio. Hay cinco modelos de mantenimiento:

  • En la línea de los Labios del Alligator;
  • En la línea de los Dientes del Alligator;
  • En la línea de la Mandíbula del Alligator;
  • En cinco zonas consecutivas del mismo color (zonas verdes para comprar, o rojas para vender);
  • Establecimiento externo de precio de stop.

La quinta opción para la instalación de un Stop Loss se implementa con el método SetStopLoss, con un solo parámetro double & stoploss. La llamada se debe hacer desde el EA y antes del método de ejecución TrailingStop, que comprueba los precios para la modificación de una posición y envía la solicitud al servidor. Tras el éxito en la ejecución de este procedimiento, el valor de la variable interna StopLoss vuelve a -1.

  • ...Controle el envío de la orden de la transacción abierta al servidor, y si no se realiza con éxito, haga una segunda solicitud.

Para el envío de una orden de trading para abrir, cerrar o facturar una posición, se usa el método booleanoSendOrder. Los parámetros de llamada:

ENUM_ORDER_TYPE type   // direction of the trading operation
double &price_out[]   // pointer to the signal price, after a successful execution of the operation, set in -1;
datetime &time_out[]  // the pointer to the signal time, after a successful execution of the operation, set in -1;
string comment         // the commentary for the order

La simulación de todas las señales de trading se combina con el método TradeActualSignals. La estructura actual_action almacena órdenes de trading. Tras el envío de la orden con éxito (SendOrder da como resultado "true") al servidor, restablezca la señal de trading en la estructura actual_action. La señal de trading estará activa hasta que obtengamos una respuesta positiva en el envío.

Hay también una función en la estructura actual_action init , sin parámetros, que restablece todas las señales actuales. Este procedimiento se usa al abrir una nueva posición o al facturar una posición existente.

  • ...Prohíba la duplicación de señales de trading (introducir solo una por cada señal);

La estructura last_trade almacena el tiempo de la última señal de trading para cada tipo y dirección. Antes de configurar una orden de trading en la estructura actual_action, compruebe si esta señal está ya funcionando en la estructura, y si es el caso, ignórela. Así, esto nos facilita la implementación del control de la ejecución "desechable" de una situación de trading.

  • Minimice el número de métodos de clase pública.

Aquí hay una lista de métodos de clase que están disponibles llamando desde el EA:

void C_TS_BW();                                      // Constructor
bool Init(string Symbol_for_trade,
           ENUM_TIMEFRAMES Period_for_trade,
          s_input_parametrs  &inp_param_tmp);       // Initialization of the class
bool NewBar();                                           // Check for a new bar on the current symbol\time-frame
void CheckSignal();                                 // Search for signals
void CheckActionOnTick();                              // Collecting the desired actions on the current tick
void TrailingStop();                                // Trailing Stop
void TradeActualSignals();                             // Trading by the current signals
void SetStopLoss(double  &stoploss);                  // Set Stop Loss
void CalcLot(bool external,double ext_lot,int type); // Calculation of the lot

También están disponibles las estructuras:

actual_action    // Current trading orders for execution
inp_param_tmp;   // Reception of the structure of settings
                   // (receives the data by the link during the initialization of the class)


4. La implementación del EA, usando la clase C_TS_BW

Lo primero que se debe hacer es incluir el archivo h_TS_BW.mqh en el Asesor Experto.

#include <h_TS_BW.mqh>

Tras esto, declare el objeto de la clase C_TS_BW. Permita que esto sea el EA_TS_BW.

También necesitará la estructura de parámetros ajustables tales como s_input_parametrs; por ejemplo, input_parametrs.

Esta es una descripción de los parámetros incorporados en esta estructura:

input_parametrs.alligator_jaw_period        // The Alligator: period of the Jaws line
input_parametrs.alligator_jaw_shift         // The Alligatpr: shift of the Jaws line
input_parametrs.alligator_teeth_period      // Alligator: period of the Teeth line
input_parametrs.alligator_teeth_shift       // Alligator: shift of the Teeth line
input_parametrs.alligator_lips_period       // Alligator: period of the Lips line
input_parametrs.alligator_lips_shift        // Alligator: shift of the Lips line
input_parametrs.add_1_dimension              // Allow the addition by Fractals
input_parametrs.add_2_dimension_bludce     // Allow the addition by the "Saucer" (АО) signal
input_parametrs.add_2_dimension_cross_zero // Allow the addition by the "Crossing the zero line" (АО) signal 
input_parametrs.add_3_dimension_use_2_bars // Allow the addition by the "АС 2 bars" signal 
input_parametrs.add_3_dimension_use_3_bars // Allow the addition by the "АС 3 bars" signal
input_parametrs.add_4_dimension_zone       // Allow the addition by the red or the green zone
input_parametrs.add_5_dimension             // Allow the addition by the Balance Line
input_parametrs.max_4_dimension_zone       // The maximum amount of consecutive bars of zones of the same color 
input_parametrs.trall_4_dimension           // Allow a trail position using 5 consecutive bars of zones of the same color
input_parametrs.agress_trade_mm            // Aggressive style of filling in an open position
input_parametrs.support_position           // Type of trailing stop of the position
input_parametrs.lot                           // Trading lot

En la sección OnInit() del EA, deberá:

  • Rellenar todos los valores requeridos de la estructura input_parametrs con información que después pasará a la clase.
  • Usando el método de clase Init , haga la inicialización. Ejemplo:
expert_TS_BW.Init(Symbol(),PERIOD_CURRENT,input_parametrs)

En este caso, el EA funcionará en el período/símbolo actual donde está instalado.

Ejemplo de la sección OnTick() del Asesor Experto:

//   double Sl[1];  
   if(expert_TS_BW.NewBar()) // new bar on the chart
     {
      expert_TS_BW.CheckSignal();       // signal search
     }
   expert_TS_BW.CheckActionOnTick();    // check for the required actions on the current tick
//---******************* the place of the beginning of external control of the lot, the stop 
//--- example of setting the lot for trade by the signal from the zones

//   if(expert_TS_BW.actual_action.zone_buy || expert_TS_BW.actual_action.zone_sell)
//     {expert_TS_BW.CalcLot(true,0.11,0);}
//--- setting the stop by the parabolic

//   CopyBuffer(h_parabolic,0,0,1,Sl);
//   if (Sl[0]>0){expert_TS_BW.SetStopLoss(Sl[0]);}
//---*******************the place of the end of external control of the lot, the stop 

   expert_TS_BW.TrailingStop();           // pulling-up the stop (if necessary)  
   expert_TS_BW.TradeActualSignals();     // trading of current signals

En este caso, los ejemplos de control externo del precio de stop y del lote de trading reciben comentarios para la ejecución de la clase.


5. Algunas pruebas en el historial

El autor del libro, basándose en lo que el EA escribió, argumenta que este sistema está centrado en mercados bursátiles y de bienes.

Primero, revisaremos el Asesor Experto en el CFD. Supongamos que el polígono de prueba será parte del historial de IBM. El sistema está dirigido a los segmentos de tendencias de las cotizaciones. Yo tomé el primer segmento disponible, en el que se puede observar una tendencia a primera vista.

Figura 6. Gráfico IBM

Figura 6. Gráfico IBM

Tras ejecutar el Asesor Experto escrito en este segmento, estas son las órdenes que obtenemos.

Figura 7. Las señales de trading de Bill Williams (IBM)

Figura 7. Las señales de trading de Bill Williams (IBM)

A primera vista, hay varias operaciones de trading en la tendencia, lo que es una buena señal. Este es el gráfico creado por el Probador de Estrategias.

El trading se hizo en 0,1 lotes, sin cierre de las líneas del Alligator, sin un rastreo de stop, usando las cinco zonas del mismo color consecutivas y sin trading agresivo (piramidal).

Figura 8. Resultados de la Simulación

Figura 8. Resultados de la Simulación

En general, obtuvimos un beneficio.

Ahora, tomemos una tendencia prolongada con menor inclinación.

Figura 9. Gráfico IBM (fragmento 2)

Figura 9. Gráfico IBM (fragmento 2)

Hagamos que este sea el mismo símbolo y período de 13 meses (de diciembre de 2008 a enero de 2010)

Este es un gráfico del Probador de Estrategias.

Figura 10. Los resultados de simulaciones en el sistema en el historial (fragmento 2)

Figure 10. Los resultados de simulaciones en el sistema en el historial (fragmento 2)

Digamos, simplemente, que "no es satisfactorio", o "no ha cumplido con nuestras expectativas".

A continuación, me gustaría revisar el trabajo en los pares de divisas.

Tomemos el conocido par EURUSD y el período H1 del gráfico. La profundidad del historial es el año 2010.

Figura 11. Los resultados de simulaciones en el sistema en el historial, EURUSD, H1, 2010

Figura 11. Los resultados de simulaciones en el sistema en el historial, EURUSD, H1, 2010

Intentémoslo en las barras diarias de EURUSD para el mismo año (2010).

El informe del probador tiene este aspecto:

Figura 12. Los resultados de simulaciones en el sistema en el historial, EURUSD, D1, 2010

Figura 12. Los resultados de simulaciones en el sistema en el historial, EURUSD, D1, 2010


Conclusión

El objetivo de este artículo era revisar la efectividad de una de las conocidas estrategias de trading de Bill Williams, no solo en los mercados bursátiles y de intercambio de bienes, sino también en el mercado Forex. El sistema funciona "más o menos" en los gráficos diarios de EURUSD del año pasado, pero no reporta beneficios en marcos temporales más pequeños sin intentos de optimización.

Las señales de entrada de mercado del sistema son bastante acertadas (si miramos a los gráficos diarios), pero las salidas tienen un claro retraso, puesto que más de la mitad de los beneficios no están fijados. Este campo sirve para la mejora del sistema existente en términos de optimización para marcos temporales más pequeños.

El código completo de la clase se puede encontrar en el archivo adjunto.


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

Archivos adjuntos |
h_ts_bw.mqh (119.53 KB)
Controles gráficos personalizados. Parte 2. Librería de control Controles gráficos personalizados. Parte 2. Librería de control
El segundo artículo de la serie "Controles gráficos personalizados" introduce una librería de control para gestionar los principales problemas que surgen en la interacción del programa (Expert Advisor, script, indicador) con el usuario. La librería contiene un gran número de clases ((CInputBox, CSpinInputBox, CCheckBox, CRadioGroup, CVSсrollBar, CHSсrollBar, CList, CListMS, CComBox, CHMenu, CVMenu, CHProgress, CDialer, CDialerInputBox, CTable) y ejemplos de su uso.
Guía de Simulación y Optimización de Asesores Expertos en MQL5 Guía de Simulación y Optimización de Asesores Expertos en MQL5
Este artículo explica el proceso para identificar y corregir errores de código, así como los pasos para llevar a cabo una simulación y optimizar los parámetros de entrada del Asesor Experto. Aprenderá a usar el Probador de Estrategias del terminal de cliente del MetaTrader 5 para encontrar el mejor símbolo y conjunto de parámetros de entrada para su Asesor Experto.
Controles gráficos personalizados. Parte 3. Formularios Controles gráficos personalizados. Parte 3. Formularios
Este es el último de los tres artículos dedicados a los controles gráficos. En él vamos a ver la creación del principal componente de la interfaz gráfica, el formulario, y su uso en combinación con otros controles. Además de las clases para formularios, las clases CFrame, CButton y CLabel se han añadido a la librería del control.
Controles gráficos personalizados. Parte 1: Creando un control simple Controles gráficos personalizados. Parte 1: Creando un control simple
Este artículo trata los principios generales del desarrollo de controles gráficos. Vamos a preparar herramientas para un trabajo rápido y adecuado con objetos gráficos, analizar un ejemplo de creación de un control simple para introducir texto o datos numéricos, así como las distintas formas de usarlo.