Estrategia de Trading de las 7 Barras

Los mejores corredores de opciones binarias 2020:
  • Binarium
    Binarium

    1er lugar! El mejor broker de opciones binarias!
    Ideal para principiantes! Entrenamiento gratis! Bonos de registro!

  • FinMax
    FinMax

    2do lugar! Gran corredor!

Estrategia de las 7 Barras

Está es una técnica de trading bastante sencilla para los traders que gustan de operar con gráficos diarios. Sus reglas son simples de seguir y prescinde de indicadores técnicos ya que requiere únicamente de un gráfico de candelas o de barras por lo cual puede ser aplicada incluso por operadores principiantes. Sin embargo al ser una estrategia diseñada para operar en un marco de tiempo diario debe tenerse cuidado con el tamaño de los lotes.

Reglas de la estrategia

Posiciones de compra

  • Esperar a que se produzcan 7 barras bajistas consecutivas (cada barra debe cerrar abajo de la barra anterior).
  • En la apertura de la siguiente barra abrimos una posición de compra.
  • El stop loss se coloca 10 pips abajo del mínimo de la séptima barra de la formación.
  • El primer objetivo de toma de ganancias es igual a la cantidad de pips arriesgados en el stop loss. Si la operación se desarrolla a nuestro favor sacamos la mitad de la posición en ese punto. Para la segunda mitad de la posición, movemos el stop loss al punto de breakeven, es decir al precio al cual si el mercado se mueve en contra la posición cierra sin producir pérdidas ni ganancias.
  • Si la operación sigue moviendose a nuestro favor el segundo objetivo de toma de ganancias se coloca arriba de la entrada unas tres veces la cantidad de pips arriesgada en el stop loss.

Posiciones de venta

  • Esperar a que se produzcan 7 barras alcistas consecutivas (cada barra debe cerrar arriba de la barra anterior).
  • En la apertura de la siguiente barra abrimos una posición de venta.
  • El stop loss se coloca 10 pips arriba del máximode la séptima barra de la formación.
  • El primer objetivo de toma de ganancias es igual a la cantidad de pips arriesgados en el stop loss. Si la operación se desarrolla a nuestro favor sacamos la mitad de la posición en ese punto. Para la segunda mitad de la posición, movemos el stop loss al punto de breakeven, es decir al precio al cual si el mercado se mueve en contra la posición cierra sin producir pérdidas ni ganancias.
  • Si la operación sigue moviendose a nuestro favor el segundo objetivo de toma de ganancias se coloca abajo de la entrada unas tres veces la cantidad de pips arriesgada en el stop loss.

En este ejemplo gráfico vemos una formación de 7 barras alcistas diarias seguidas las cuáles muestrab un fuerte movimiento al alza. En la barra siguiente, que muestra un claro comportamiento bajista, se abre una posición de venta en la apertura y se coloca un stop loss en el máximo de la barra anterior, precisamente en 1.2272. Al mismo tiempo se coloca el primer objetivo de la operación en 1.2214 y 1.2156. El primer objetivo es igual a la cantidad de pips arriesgada en el stop loss (29 pips) mientras que el tercer objetivo se coloca a una distancia igual a tres veces esa cantidad (87 pips). En este caso, como la operación se desarrolló a favor del operador el precio alcanzó los objetivos y la primera y segunda mitad de la posición produjeron ganancias.

Estrategia de Trading de las 7 Barras

El precio puede llegar a un nivel clave (independientemente de la metodología de trading usada para determinar ese nivel) de dos maneras: en expansión o en contracción.

Esta estrategia de trading puede utilizarse para operar a corto plazo, medio plazo o largo plazo.

Si en tu análisis técnico observas que el precio llega con fortaleza (expansión), lo más recomendable es esperar a un segundo test al nivel antes de valorar la entrada. Este segundo test tiene el objetivo de disipar el momentum que denota esa fortaleza de la primera llegada. En este segundo test, ya podremos identificar algún esquema de finalización de movimiento (doble techo/suelo, falla o trampa). Es el momento de operar.

Si el análisis te determina que el precio se aproxima al nivel con debilidad (contracción), se podría valorar la entrada directamente sobre ese primer test. Aunque la debilidad precedente añade confianza para buscar la entrada, lo más recomendable sigue siendo esperar a un segundo test. En cualquier caso, al identificar el movimiento en contracción tenemos la posibilidad de bajar de marco temporal para buscar ahí algún esquema de finalización de movimiento antes de operar.

Movimiento medido

Generalmente el precio en los mercado se mueve en patrones armónicos de dos movimientos. Tras identificar un impulso en tu análisis, hay un 80% de probabilidades de que tendrá una réplica. Lo que se observará finalmente será un movimiento armónico de dos patas.

Lo interesante de esta estrategia, es saber cuándo no tenemos que hacer trading. Debemos tener claro que no queremos operar en la dirección contraria al final de un impulso. Si identificamos un impulso alcista, esperaremos su réplica y por tanto desecharemos buscar entradas en corto aunque la localización sea favorable.

La clave de esta estrategia por tanto está en identificar cuándo el movimiento que estás observando se trata de un impulso o no.

Compradores atrapados

Si en un área de posible distribución hay algún trader atrapado, los vendedores no permitirán que el precio vuelva a visitar esa zona. Van a tratar de evitar que puedan cerrar sus posiciones en el nivel de entrada sin pérdida de dinero ya que saben que si los fuerzan a tener que abandonar en pérdida, esta cobertura de largos añadirán fortaleza al movimiento bajista. De ahí la forma distributiva de techo redondeado que observamos previo a un giro a la baja.

Continuidad en Order Flow

El Order Flow es un indicador de análisis de la cinta. Mediante él observamos las órdenes ejecutadas.

En impulso alcista queremos ver que las barras dejan el cluster (nivel de mayor volumen de contratos operados) en su parte inferior. Esto denota interés por continuar el movimiento.

El movimiento alcista ideal sería observar una fuerte barra alcista seguida por otra la cual testea su cluster y esta segunda barra deja también el suyo sobre el mismo nivel formando un fuerte control de compradores. La indicación añade fortaleza si va acompañada por un significante aumento en el delta.

Al desarrollo de un movimiento bajista queremos ver que los cluster quedan en su parte superior.

En el movimiento bajista ideal el cluster de la barra previa es testeada y origina un nuevo cluster creando un control de vendedores y dando continuidad al movimiento. Un fuerte delta negativo y en aumento añade fortaleza al movimiento bajista.

Giros en V

Debes tener muy presente que, aún pudiendo suceder, el precio rara vez revierte un movimiento tendencial mediante un esquema de clímax.

Para revertir una tendencia alcista, normalmente el precio consumirá tiempo mientras los mejores traders terminan de distribuir el stock almacenado y comienzan a asumir posiciones vendedoras. Este proceso de liquidación de largos y de entrada en cortos requiere tiempo y se observará mediante algún tipo de esquema distributivo. Es ahí donde nos adentramos en el terreno de la metodología Wyckoff.

Para el caso inverso, lo más lógico es pensar en una reversión de tendencia bajista a alcista mediante un proceso de acumulación en el que los grandes profesionales terminan de deshacer sus posiciones de venta y comienzan a posicionarse en el lado largo. Este proceso normalmente no lo hacen en un único movimiento climático (V) sino que les requerirá de tiempo.

Esta estrategia de trading puede utilizarse para operar a corto plazo, medio plazo o largo plazo.

Efecto vacío

Esta estrategia se trata de un evento climático generado por la ausencia de trader en la dirección opuesta.

Si el precio está acelerando hacia el techo de un canal alcista, habrá grandes operadores bajistas que creerán que el mercado revertirá pronto, pero que es probable que primero haga una rotura por encima de la línea de canal. ¿Por qué ese trader elegirían entrar cortos cuando cree que sobrepasará el canal? No tiene sentido y por tanto no lo hace. Esperan. Lo mismo sucede para los fuertes alcistas. Están buscando tomar beneficios, pero si creen que el mercado alcanzará dicha línea de canal, no venderán hasta que llegue el momento. Esto significa que hay algunos fuertes trader bajistas que aún no han entrado cortos y algunos fuertes alcistas que aún no han vendido sus largos; y esta ausencia de venta crea un efecto vacío que empuja bruscamente el mercado al alza hasta alcanzar un nivel donde los bajistas sienten que hay valor para entrar cortos y los alcistas sienten que hay valor para tomar beneficios.

Los primeros programas de trading que detectan el momentum en esa vela de clímax/rotura, comienzan a comprar rápidamente y lo seguirán haciendo hasta que ese momentum descienda; hasta el último tick de la barra, es por eso que el mercado hace un fuerte Spike que puede durar algunas barras.

Una vez que el mercado alcanza un nivel donde los trader bajistas sienten que hay valor (según su análisis) y los alcistas sienten que es improbable que el mercado vaya mucho más arriba antes de un retroceso, los enormes institucionales bajistas comenzarán a vender de forma consistente y los fuertes alcistas cerrarán sus largos. Los programas de compra verán esa pérdida de momentum y cerrarán sus largos también. Ahora ambos esperan precios más bajos, y esto es lo que seguirá. Con fuerte venta y nadie comprando, el mercado revertirá a la baja al menos por 10 barras y un par de patas. En ese punto decidirán si el retroceso ha finalizado y los alcistas deberían volver a comprar y los bajistas cerrar sus cortos o si creen que la caída tiene un mayor recorrido.

– Al Brooks – Trading Price Action Reversals –

Rotación extrema

Esta estrategia trata de nunca oponerse a una rotación de delta extrema

Si en nuestro análisis observamos en los indicadores de Order Flow una rotación brutal del delta, esto nos sugiere un cambio de sentimiento. Lo más inteligente es esperar algún tipo de retroceso para intentar incorporarse a favor de ella.

Si el precio viene subiendo, alcanza una condición de sobrecompra con respecto a alguna estructura y observamos una rotación extrema en el delta como la del ejemplo (+85/-621), en ese punto deberíamos favorecer la incorporación bajista. Esperar algún test o al desarrollo de alguna estructura de distribución.

Estrategia para operativa en tendencia

Estrategia libre de indicadores. Únicamente análisis del precio y el volumen. Para operar a corto, medio o largo plazo.

Tras el desarrollo de una estructura de acumulación y el posterior inicio del movimiento tendencial al alza, debemos aprovechar las oportunidades que nos ofrece el mercado para tratar de incorporarnos a favor del camino de la menor resistencia; y este no es más que el lado largo.

La estrategia se basa en la premisa de que el contexto es el Rey, y en este ejemplo al ver la acumulación de abajo, lo más inteligente sería intentar incorporarnos al movimiento alcista.

Para ello, podemos esperar al desarrollo de alguna estructura de reacumulación. En algunas ocasiones el momentum es muy alto y a penas desarrolla el precio una rápida estructura antes de continuar al alza.

Para esos entornos de velocidad, una buena estrategia sería esperar a la creación de un soporte; a su rotura + recuperación y en ese punto, tanto en el potencial Spring como en su test, buscar un gatillo (a elección personal) para colocar nuestra orden de compra.

El stop de protección debería estar en mínimos y los posibles puntos para tomar beneficios podrían ser a la rotura del último máximo y en el siguiente cierre de ciclo que encontremos.

Estrategia para operativa en rango

Estrategia libre de indicadores. Únicamente análisis del precio y el volumen. Para operar a corto, medio o largo plazo.

En este gráfico mostramos el ejemplo ideal de una operativa en rango de acumulación. Se trata de seguir una serie de pasos en forma de checklist hasta tomar la decisión final de colocar la orden para entrar al mercado una vez que la ley de la oferta y la demanda ha hecho su trabajo.

  1. Identificar los tres eventos de parada (sc-ar-st) del movimiento previo que establecen la Fase A.
  2. En Fase B, esperar que el precio alcance en tiempo al menos la misma distancia que la Fase A.
  3. Esperar que se desarrolle el evento de test en potencial Fase C (sacudida).
  4. Una rápida recuperación del nivel tras la rotura nos dará la señal para operar.
  5. En este punto, la forma más fácil de entrar al mercado es colocando una orden limitada sobre el nivel buscando que se produzca un test antes de iniciar el movimiento tendencial.
  6. El stop loss quedaría alejado del extremo.
  7. El tp1 en el extremo opuesto y el tp2 en la proyección del 200% o al desarrollo de la segunda pata.

¿Falsa rotura o rotura efectiva?

Estrategia libre de indicadores. Únicamente análisis del precio y el volumen. Para operar a corto plazo, medio plazo o largo plazo.

A la rotura de un nivel de resistencia siempre tendremos la duda de si se trata de una sacudida o de una rotura efectiva.

Visualmente, ambos eventos son muy similares ya que comparten unas mismas características: se observa un aumento en los rangos del precio y una expansión en el volumen. Es por esto que al ser acciones tan parecidas nos pueden llevar a confusión.

En ambos casos, tras la rotura la reacción bajista será agresiva ya que el precio viene de alcanzar una condición de sobrecompra (en el corto plazo).

Los tres elementos que observo a la hora de determinar una mayor probabilidad de que suceda una cosa o la otra son los siguientes:

  • El tipo de ST que sucede en Fase B.
    • Un ST en forma de UA denota fortaleza de los compradores y añade mayor probabilidad a la rotura efectiva.
    • Un ST en forma de SOW denota fortaleza de los vendedores y añade mayor probabilidad a que la rotura sea falsa.
  • Si se ha producido una sacudida previa (en posible Fase C).
    • Si el precio viene de desarrollar el Spring añade fortaleza al escenario alcista y aumenta las probabilidades de que la rotura sea efectiva.
    • Si el precio rompe la resistencia sin haberse producido antes la sacudida de mínimos habría que poner en cuarentena la rotura ya que este evento podría tratarse de la sacudida que esperamos en Fase C.
      • En este punto es interesante observar si el precio ha realizado una sacudida de algún mínimo menor dentro del rango. Si es así, podría tratarse de una rotura efectiva pero tiene menores probabilidades.
      • Si tampoco observamos una sacudida menor aumentan las probabilidades de que la rotura sea fallida.
  • El comportamiento del precio tras la rotura.
    • Si tras la rotura de la resistencia el precio logra mantenerse por encima del nivel, denota fortaleza de los compradores y añade mayor probabilidad a la rotura efectiva.
    • Si tras la rotura el precio reingresa de nuevo al rango denota fuerte entrada de venta y añade mayor probabilidad a que la rotura sea falsa.

Fallo estructural – Debilidad

Lo primero de esta estrategia es identificar la lógica estructural que decide seguir el precio. Esta vendrá determinada por los toques exitosos que respeten una estructura formada por dos zonas/líneas de oferta/demanda.

En ese punto, y bajo el principio de favorecer la continuidad de lo que viene haciendo el precio, lo lógico sería pensar en que el mercado seguirá moviéndose respetando esa lógica estructural.

El ejemplo de fallo estructural que denota debilidad lo encontramos cuando el precio, tras validar una estructura en varias ocasiones, es incapaz de seguir moviéndose bajo esa lógica de movimientos y no puede alcanzar la parte alta de la misma.

Esta incapacidad para seguir desplazándose como venía haciendo hasta ese momento denota debilidad de fondo. Los compradores han dejado de tener el control del mercado y son los vendedores los que han comenzado a aparecer más significativamente.

Este indicio no sugiere una reversión inmediata a la baja; sino que es un elemento más a tener en cuenta a la hora de leer correctamente el contexto del mercado.

Podría simplemente tratarse de una parada temporal de la tendencia previa para desarrollar desde ahí un período de consolidación durante el que reacumular stock y seguir subiendo.

Fallo estructural – Fortaleza

La acción que denotaría fortaleza de fondo la obtendríamos al ver que el precio no puede alcanzar la parte baja de la estructura que viene trabajando.

Este fallo lo podemos encontrar en todo tipo de estructuras; tanto en estructuras con pendientes alcista o bajista como en estructuras horizontales, convergentes o divergentes.

La clave de esta estrategia es identificar en nuestro análisis técnico la estructura que el precio ha validado. Esta la identificaremos cuando sea testeado múltiples veces tanto por la parte superior como por la inferior. Cuantos más toques tenga, mayor confianza nos dará dicha estructura.

El razonamiento detrás de dicha acción es que los compradores han entrado agresivamente desequilibrando el control del mercado a favor de la demanda.

Estos compradores tienen intereses más arriba y bloquean la caída del precio. No quieren que el precio baje. No quieren que nadie más se pueda subir al movimiento alcista.

Este indicio no sugiere una reversión inmediata al alza; sino que es un elemento más a tener en cuenta a la hora de leer correctamente el contexto del mercado.

Shortening Of the Thrust (SOT)

Podría traducirse al castellano como “Acortamiento del empuje”. Se trata de un patrón de cambio de dirección. Es una herramienta analítica que originariamente usaba Wyckoff para medir la pérdida de momentum o agotamiento de un movimiento impulsivo o empuje.

Visualmente se observa como cada nuevo extremo recorre una distancia menor que el extremo previo y por tanto se dice que se está acortando el empuje.

➡️ Para el ejemplo en tendencia alcista, observaríamos como cada nuevo máximo recorre una distancia menor que el máximo previo; lo que nos sugiere un deterioro de la demanda y señala un posible giro bajista.

➡️ Para el ejemplo en tendencia bajista, se observaría una disminución en la distancia que recorre el nuevo mínimo en relación con la distancia que recorrió el mínimo previo, sugiriendo un deterioro de la oferta y señalando un posible giro al alza.

La idea principal es una falta de continuidad en esa dirección. Un agotamiento de las fuerzas que hasta el momento parecían tener el control del mercado. La pérdida de momentum anticipa un retroceso importante e incluso a veces una reversión de la tendencia.

Para que este comportamiento sea válido, se requiere un mínimo de tres empujes en la dirección de la tendencia. A partir de tres o cuatro movimientos impulsivos, es útil comenzar a buscar este patrón de acortamiento en el empuje final.

➡️ Cuando el avance del precio se acorta pero hay un fuerte volumen, significa que el gran esfuerzo obtuvo poca recompensa: Divergencia Esfuerzo/Resultado. En el caso de un ejemplo bajista, la demanda estaría apareciendo; y en un ejemplo alcista la oferta estaría apareciendo.

➡️ Cuando el avance del precio se acorta y además hay un volumen débil, significa agotamiento. En el caso de un ejemplo bajista, la oferta se estaría retirando; y en un ejemplo alcista, serían los compradores los que se retiran del mercado.

Cuando hay más de cuatro empujes y persiste el acortamiento, la tendencia puede que sea demasiado fuerte como para operar en su contra.

Lo que confirmaría el cambio de dirección sería un fuerte movimiento impulsivo en la dirección contraria. Tras el acortamiento del empuje, queremos ver que el nuevo impulso en la dirección opuesta tenga un volumen alto, denotando intencionalidad.

Tras este impulso que cambia de dirección se podría esperar a un retroceso para buscar incorporarnos en la dirección del nuevo movimiento impulsivo.

Siempre ten en cuenta el contexto sobre el que se desarrolla el acortamiento del empuje:

➡️ Si el precio rompe el techo de un rango y revierte, esta acción es un potencial Upthrust. Si tras una pocas ondas bajistas se produce un acortamiento del empuje y sugiere una operación de compra; debes tener en cuenta que el precio viene de desarrollar un Upthrust y que lo más probable es que siga cayendo. Cualquier operación de compra debería ser evitada, y en caso de ser tomada, cerrada rápidamente tras una débil respuesta.

El patrón de Shortening Of the Thrust también puede ser visto en barras individuales además de en movimientos. En este caso, se observaría cómo sucesivas barras hacen cada vez menos progreso, dejando los cierres alejados de los extremos.

Entrada recomendada: Forex Brokers

Estrategia de trading ’80-20′

Introducción

’80-20′ es el nombre de una de las Estrategias Comerciales descritas en el libro «Street Smarts: High Probability Short-Term Trading Strategies», escrito por Linda Raschke y Laurence Connors. Igual como dos estrategias analizadas en mi artículo anterior, los autores la atribuyeron a la fase del testeo de los límites del intervalo por el precio. Ella también está enfocada en la obtención del beneficio desde la ruptura falsa o retroceso de los límites. Sin embargo, esta vez para detectar la señal, se analiza el movimiento del precio en un período significativamente más corto del historial, solamente el día anterior. El tiempo de vida de la señal obtenida también es relativamente pequeño, el sistema está diseñado para el trading intradía.

El primero de los objetivos de este artículo consiste en describir la creación del módulo de señal en el lenguaje MQL5 que se encarga de la implementación de la estrategia comercial ’80-20′. Luego conectaremos este módulo al Asesor Experto (EA) básico creado en el artículo anterior de esta serie, modificándolo un poco. Además de eso, usaremos este módulo sin cambiarlo durante el desarrollo del indicador para el trading manual.

Recordaré que el código que se está desarrollando en esta serie de artículos está orientado principalmente a la categoría de los programadores que puede ser definida como «principiantes ligeramente avanzados». Por tanto, aparte de su tarea principal, este código está ideado para ayudar a pasar del enfoque procesal al enfoque orientado a objetos. Aquí no vamos a crear las clase, pero vamos a usar en totalidad sus análogos más simples, es decir, las estructuras.

Otro objetivo de este artículo es crear las herramientas que permitan comprobar la eficacia de esta estrategia hoy en día. Pues, durante su creación Raschke y Connors se basaban en el comportamiento del mercado del final del siglo pasado. Algunas pruebas en datos históricos actuales del EA creado serán presentadas al final del artículo.

Sistema de trading ’80-20′

Como fundamentación teórica, los autores se refieren al libro The Taylor Trading Technique de George Taylor, así como a los trabajos sobre el análisis de ordenador de los mercados de futuros de Steve Moore, y la experiencia práctica de Derek Gipson. La hipótesis, como base de la Estrategia Comercial, puede ser resumida de la siguiente manera: si los precios de apertura y de cierre del día de ayer están distribuidos en las áreas opuestas del intervalo diario, entonces, hoy con mayor probabilidad, se puede esperar la reversa a la dirección de la apertura del día de ayer. Además, es importante que, por un lado, los precios de apertura y de cierre de ayer estuvieran bastante cerca de los límites del intervalo, y, por otro lado, la reversa empezara precisamente hoy, y no antes del cierre de la barra diaria de ayer. Completado con sus propios retoques de los autores, el conjunto de las reglas de la Estrategia Comercial ’80-20′ para la entrada en la operación de compra puede ser formulado de la siguiente manera:

1. Asegúrese de que ayer el mercado se abrió en los 20% superiores del intervalo diario, y se cerró en los 20% inferiores del intervalo.

2. Espere a que el precio mínimo de hoy rompa el mínimo de ayer por lo menos en 5 ticks.

3. Coloque la orden pendiente de compra en el límite inferior del intervalo de ayer.

4. Inmediatamente después de la activación de la orden pendiente, establezca su StopLoss inicial en el mínimo de hoy.

5. Utilice Trailing Stop para proteger el beneficio obtenido.

Las reglas para entrar en venta son similares, pero la barra de ayer debe ser alcista, hay que colocar la orden de compra en el límite superior de esta barra, y colocar StopLoss en el nivel del máximo de hoy.

Otro detalle importante aparece en el libro durante la discusión sobre las ilustraciones de la Estrategia Comercial en los gráficos desde el historial: los autores llaman la atención en el tamaño de la barra diaria que se cierra. Según Raschke, debe ser bastante grande, más grande que el tamaño medio de las barras diarias. La verdad es que no especifica el número de días del historial que hay que tomar en consideración a la hora de calcular el rango diario medio.

No olvidemos que esta Estrategia Comercial está destinada exclusivamente para el trading intradía, los ejemplos mostrados en el libro usan los gráficos con el período de tiempo de 15 minutos.

Más abajo, se describe el bloque de señal y el indicador que lo utiliza y hace trazado según esta estrategia. A continuación, Usted puede ver unas capturas de pantalla con el resultado de trabajo del indicador. Se ven muy bien los patrones que corresponden a las reglas del sistema, y los niveles de trading vinculados a estos patrones.

Período de tiempo M5:

Como resultado del análisis de este patrón debe ser la colocación de la orden pendiente de compra. Los niveles de trading correspondientes se ven mejor en el período de tiempo M1:

El patrón semejante con la dirección opuesta del trading en el período de tiempo M5:

Sus niveles de trading (M1):

Módulo de señal

Para mostrar el ejemplo de cómo añadir las opciones adicionales a la Estrategia Comercial, añadiremos el cálculo del nivel Take Profit. Este nivel no está presente en la versión original, para el cierre de la posición se utiliza solamente el trailing del nivel Stop Loss. Hagamos que Take Profit dependa del valor mínimo de la ruptura establecido por el usuario ( TS_8020_Extremum_Break ) — vamos a multiplicarlo por el coeficiente personalizado TS_8020_Take_Profit_Ratio .

De la función principal del módulo de señal fe_Get_Entry_Signal vamos a necesitar lo siguiente: el estatus actual de la señal, los niveles calculados de la entrada y salida (Stop Loss y Take Profit), así como los límites del intervalo del día anterior. Obtendremos todos los niveles por las referencias traspasadas a las variables de la función, y el estatus de la señal devuelto va a usar la lista de opciones del artículo anterior:

enum ENUM_ENTRY_SIGNAL < // Lista de señales de entrada
ENTRY_BUY, // señal de compra
ENTRY_SELL, // señal de venta
ENTRY_NONE, // no hay señal
ENTRY_UNKNOWN // estatus no definido
>;

ENUM_ENTRY_SIGNAL fe_Get_Entry_Signal( // Análisis del patrón de dos velas D1
datetime t_Time, // hora actual
double & d_Entry_Level, // nivel de entrada (referencia a la variable)
double & d_SL, // nivel StopLoss (referencia a la variable)
double & d_TP, // nivel TakeProfit (referencia a la variable)
double & d_Range_High, // máximo del intervalo de la 1-a barra del patrón (referencia a la variable)
double & d_Range_Low // mínimo del intervalo de la 1-a barra del patrón (referencia a la variable)
) <>

Para identificar la señal, es necesario analizar dos últimas barras del timeframe diario. Empezamos con la primera de ellas: si ella no corresponde a los criterios de la Estrategia Comercial, no tendrá sentido comprobar la segunda barra. Hay dos criterios:

1. La magnitud de la barra (diferencia entre los precios High y Low) debe ser superior a la media para los últimos XX días (se establece con la configuración personalizada TS_8020_D1_Average_Period )

2. Los niveles de apertura y de cierre de la barra deben estar relacionados con los 20% opuestos del intervalo de la barra

Si estas condiciones se cumplen, entonces hay que recordar los precios High y Low para el uso futuro. Puesto que los parámetros de la primera barra del patrón no van a cambiar durante todo el día, no vamos a comprobarlos con cada llamada de la función, los guardaremos en las variables estáticas:

// ajustes personalizados
input uint TS_8020_D1_Average_Period = 20 ; // 80-20: Número de días para calcular el intervalo diario medio
input uint TS_8020_Extremum_Break = 50 ; // 80-20: Ruptura mínima del extremo de ayer (en puntos)

static ENUM_ENTRY_SIGNAL se_Possible_Signal = ENTRY_UNKNOWN; // dirección de la señal en la 1-a barra del patrón
static double
// variables para almacenar los niveles calculados entre los ticks
sd_Entry_Level = 0 ,
sd_SL = 0 , sd_TP = 0 ,
sd_Range_High = 0 , sd_Range_Low = 0
;

// prueba de 1-a barra del patrón en D1:
if (se_Possible_Signal == ENTRY_UNKNOWN) < // todavía no ha sido realizada hoy
st_Last_D1_Bar = t_Curr_D1_Bar; // este día la 1-a barra no va a cambiar más

// intervalo diario medio
double d_Average_Bar_Range = fd_Average_Bar_Range(TS_8020_D1_Average_Period, PERIOD_D1 , t_Time);

if (ma_Rates[ 0 ].high — ma_Rates[ 0 ].low // la 1-a barra no es suficientemente grande
se_Possible_Signal = ENTRY_NONE; // significa que hoy no habrá la señal
return (se_Possible_Signal);
>

double d_20_Percents = 0.2 * (ma_Rates[ 0 ].high — ma_Rates[ 0 ].low); // 20% del intervalo de ayer
if ((
// barra bajista:
ma_Rates[ 0 ].open > ma_Rates[ 0 ].high — d_20_Percents // la barra se ha abierto en los 20% superiores
&&
ma_Rates[ 0 ].close 0 ].low + d_20_Percents // y se ha cerrado en los 20% inferiores
) || (
// alcista:
ma_Rates[ 0 ].close > ma_Rates[ 0 ].high — d_20_Percents // la barra se ha cerrado en los 20% superiores
&&
ma_Rates[ 0 ].open 0 ].low + d_20_Percents // y se ha abierto en los 20% inferiores
)) <
// la 1-a barra corresponde a las condiciones
// definición de la dirección del trading para hoy por la 1-a barra del patrón:
se_Possible_Signal = ma_Rates[ 0 ].open > ma_Rates[ 0 ].close ? ENTRY_BUY : ENTRY_SELL;
// nivel de la entrada en el mercado:
sd_Entry_Level = d_Entry_Level = se_Possible_Signal == ENTRY_BUY ? ma_Rates[ 0 ].low : ma_Rates[ 0 ].high;
// límites del intervalo de la 1-a barra del patrón:
sd_Range_High = d_Range_High = ma_Rates[ 0 ].high;
sd_Range_Low = d_Range_Low = ma_Rates[ 0 ].low;
> else <
// los niveles de la apertura/cierre de la 1-a barra no corresponde a las condiciones
se_Possible_Signal = ENTRY_NONE; // significa que hoy no habrá la señal
return (se_Possible_Signal);
>
>

Listado de la función de la definición del intervalo medio de la barra para el número establecido de las barras del timeframe especificado, empezando desde la hora indicada a la función:

double fd_Average_Bar_Range( // Cálculo del tamaño medio de la barra
int i_Bars_Limit, // cuantas barras a tomar en cuenta
ENUM_TIMEFRAMES e_TF = PERIOD_CURRENT , // timeframe de las barras
datetime t_Time = WRONG_VALUE // a partir de que momento empezar el cálculo
) <
double d_Average_Range = 0 ; // variable para sumar los valores
if (i_Bars_Limit 1 ) return (d_Average_Range);

MqlRates ma_Rates[]; // array para la información sobre las barras

// obtención de la información sobre las barras desde la parte establecida del historial:
if (t_Time == WRONG_VALUE ) t_Time = TimeCurrent ();
int i_Price_Bars = CopyRates ( _Symbol , e_TF, t_Time, i_Bars_Limit, ma_Rates);

if (i_Price_Bars == WRONG_VALUE ) < // procesamiento de la función CopyRates
if (Log_Level > LOG_LEVEL_NONE) PrintFormat ( «%s: CopyRates: error #%u» , __FUNCTION__ , _LastError );
return (d_Average_Range);
>

if (i_Price_Bars // la función CopyRates ha extraído los datos parcialmente
if (Log_Level > LOG_LEVEL_NONE) PrintFormat ( «%s: CopyRates: copiado %u barras de %u» , __FUNCTION__ , i_Price_Bars, i_Bars_Limit);
>

// suma de intervalos:
int i_Bar = i_Price_Bars;
while (i_Bar– > 0 )
d_Average_Range += ma_Rates[i_Bar].high — ma_Rates[i_Bar].low;

// valor medio:
return (d_Average_Range / double (i_Price_Bars));
>

Para la segunda barra (actual) del patrón, el criterio es único: la ruptura del límite del intervalo de ayer no debe ser menos de la ruptura establecida en los ajustes ( TS_8020_Extremum_Break ). En cuanto se alcance este nivel, aparecerá la señal para colocar la orden pendiente:

// prueba de 2-a barra (actual) del patrón en D1:
if (se_Possible_Signal == ENTRY_BUY) <
sd_SL = d_SL = ma_Rates[ 1 ].low; // StopLoss — en el máximo del precio de hoy
if (TS_8020_Take_Profit_Ratio > 0 ) sd_TP = d_TP = d_Entry_Level + _Point * TS_8020_Extremum_Break * TS_8020_Take_Profit_Ratio; // TakeProfit
return (
// ¿está bien expresada la ruptura para abajo?
ma_Rates[ 1 ].close 0 ].low — _Point * TS_8020_Extremum_Break ?
ENTRY_BUY : ENTRY_NONE
);
>

if (se_Possible_Signal == ENTRY_SELL) <
sd_SL = d_SL = ma_Rates[ 1 ].high; // StopLoss — en el mínimo del precio de hoy
if (TS_8020_Take_Profit_Ratio > 0 ) sd_TP = d_TP = d_Entry_Level — _Point * TS_8020_Extremum_Break * TS_8020_Take_Profit_Ratio; // TakeProfit
return (
// ¿está bien expresada la ruptura para arriba?
ma_Rates[ 1 ].close > ma_Rates[ 0 ].high + _Point * TS_8020_Extremum_Break ?
ENTRY_SELL : ENTRY_NONE
);
>

Vamos a guardar dos funciones descritas arriba ( fe_Get_Entry_Signal y fd_Average_Bar_Range ) y los ajustes personalizadas referentes a la obtención de la señal en el archivo de la librería mqh. Encontrará el código completo en el anexo a este artículo Vamos a nombrar el archivo Signal_80-20.mqh y colocarlo en la carpeta correspondiente (MQL5\Include\Expert\Signal) del directorio del terminal.

Indicador para el trading manual

El indicador, igual como el EA, va a utilizar el módulo de señal descrito anteriormente. El indicador debe informar al trader sobre la recepción de la señal para la colocación de la orden pendiente y comunicar los niveles de cálculo: nivel de colocación de la orden, los niveles Take Profit y Stop Loss. Los métodos de notificación el usuario puede eligirlos personalmente, eso puede ser una ventana emergente estándar, mensaje de correo electrónico o notificación en el dispositivo móvil. Se puede elegir todo, o cualquier combinación conveniente de opciones mencionadas.

Otra finalidad del indicador es el trazado en el historial del trading a base de la Estrategia Comercial ’80-20′. Va a resaltar las barras diarias correspondientes a los criterios del sistema y trazar los niveles de cálculo. Basándose en las líneas de los niveles, será posible evaluar cómo iba evolucionando la situación a lo largo de tiempo Para la mejor demostración hagamos lo siguiente: cuando el precio toca la línea de señal, ella se termina, se empieza la línea de la orden pendiente; y cuando la orden pendiente se activa, se termina su línea y se empiezan las líneas Take Profit y Stop Loss. Estas líneas se interrumpirán cuando el precio toque una de ellas (la orden se cerrará). Con este trazado será más fácil evaluar la eficacia de las reglas del sistema de trading y comprender qué es lo que se puede mejorar.

Vamos a empezar con la declaración de los búferes y los parámetros de su visualización. En primer lugar, nos hace falta declarar dos búferes con el relleno del área vertical (DRAW_FILLING). Uno de ellos va a resaltar el intervalo completo de la barra diaria del día anterior, el otro, sólo el área interior, para destacarla de los 20% superiores e inferiores del intervalo involucrados en la Estrategia Comercial. Luego, declararemos dos búferes para la línea de señal y la línea de la orden pendiente multicolores (DRAW_COLOR_LINE). Sus colores van a depender de la dirección del trading. Otras dos líneas (Take Proft y Stop Loss) no van a cambiar sus colores (DRAW_LINE)— van a utilizar los mismos colores estándar que les han sido asignados en el terminal. A excepción de la línea simple, todos los tipos de visualización requieren dos búferes, por eso el código va a tener el siguiente aspecto:

#property indicator_chart_window
#property indicator_buffers 10
#property indicator_plots 6

#property indicator_label1 «1 barra del patrón»
#property indicator_type1 DRAW_FILLING
#property indicator_color1 clrDeepPink , clrDodgerBlue
#property indicator_width1 1

#property indicator_label2 «1 barra del patrón»
#property indicator_type2 DRAW_FILLING
#property indicator_color2 clrDeepPink , clrDodgerBlue
#property indicator_width2 1

#property indicator_label3 «Nivel de señal»
#property indicator_type3 DRAW_COLOR_LINE
#property indicator_style3 STYLE_SOLID
#property indicator_color3 clrDeepPink , clrDodgerBlue
#property indicator_width3 2

#property indicator_label4 «Nivel de entrada»
#property indicator_type4 DRAW_COLOR_LINE
#property indicator_style4 STYLE_DASHDOT
#property indicator_color4 clrDeepPink , clrDodgerBlue
#property indicator_width4 2

#property indicator_label5 «Stop Loss»
#property indicator_type5 DRAW_LINE
#property indicator_style5 STYLE_DASHDOTDOT
#property indicator_color5 clrCrimson
#property indicator_width5 1

#property indicator_label6 «Take Profit»
#property indicator_type6 DRAW_LINE
#property indicator_style6 STYLE_DASHDOTDOT
#property indicator_color6 clrLime
#property indicator_width6 1

Vamos a dar al usuario la posibilidad de desactivar el relleno de la primera barra diaria del patrón, elegir las opciones de notificación sobre la señal y limitar la profundidad del trazado del historial. Aquí mismo incluiremos todos los ajustes del sistema de trading desde el módulo de señal. Para eso tendremos que enumerar previamente las variables involucradas en el módulo, aunque si algunas de ellas van a usarse sólo en el EA y no serán necesarias para el indicador:

#include 20 .mqh> // módulo de señal de la estrategia ’80-20′

input bool Show_Outer = true ; // 1-a barra del patrón: ¿Mostrar el intervalo completo?
input bool Show_Inner = true ; // 1-a barra del patrón: ¿Mostrar el área interna?
input bool Alert_Popup = true ; // Alerta: ¿Mostrar la ventana emergente?
input bool Alert_Email = false ; // Alerta: ¿Envar el email?
input string Alert_Email_Subj = «» ; // Alerta: Asunto del mensaje del email
input bool Alert_Push = true ; // Alerta: ¿Enviar la notificación push?

input uint Bars_Limit = 2000 ; // Profundidad del trazado del historial (en las barras del timeframe actual)

ENUM_LOG_LEVEL Log_Level = LOG_LEVEL_NONE; // Modo de registro
double
buff_1st_Bar_Outer[], buff_1st_Bar_Outer_Zero[], // búferes para el dibujo del intervalo completo de la 1-a barra del patrón
buff_1st_Bar_Inner[], buff_1st_Bar_Inner_Zero[], // búferes para el dibujo de los 60% internos de la 1-a barra del patrón
buff_Signal[], buff_Signal_Color[], // búferes de la línea de señal
buff_Entry[], buff_Entry_Color[], // búferes de la línea de la orden pendiente
buff_SL[], buff_TP[], // búfere de las líneas StopLoss y TakeProfit
gd_Extremum_Break = 0 // TS_8020_Extremum_Break en precios del símbolo
;
int
gi_D1_Average_Period = 1 , // valor correcto para TS_8020_D1_Average_Period
gi_Min_Bars = WRONG_VALUE // número mínimo obligatorio de las barras para el recálculo
;

int OnInit () <
// comprobación del parámetro introducido TS_8020_D1_Average_Period:
gi_D1_Average_Period = int ( fmin ( 1 , TS_8020_D1_Average_Period));
// conversión de los puntos en los precios del símbolo:
gd_Extremum_Break = TS_8020_Extremum_Break * _Point ;
// número mínimo obligatorio de barras para el recálculo = número de barras del timeframe actual en el día
gi_Min_Bars = int ( 86400 / PeriodSeconds ());

// finalidad de los búferes del indicador:

// rectángulo del intervalo completo de la 1-a barra
SetIndexBuffer ( 0 , buff_1st_Bar_Outer, INDICATOR_DATA );
PlotIndexSetDouble ( 0 , PLOT_EMPTY_VALUE , 0 );
SetIndexBuffer ( 1 , buff_1st_Bar_Outer_Zero, INDICATOR_DATA );

// rectángulo del área interna de la 1-a barra
SetIndexBuffer ( 2 , buff_1st_Bar_Inner, INDICATOR_DATA );
PlotIndexSetDouble ( 1 , PLOT_EMPTY_VALUE , 0 );
SetIndexBuffer ( 3 , buff_1st_Bar_Inner_Zero, INDICATOR_DATA );

// línea de señal
SetIndexBuffer ( 4 , buff_Signal, INDICATOR_DATA );
PlotIndexSetDouble ( 2 , PLOT_EMPTY_VALUE , 0 );
SetIndexBuffer ( 5 , buff_Signal_Color, INDICATOR_COLOR_INDEX );

// línea de colocación de la orden pendiente
SetIndexBuffer ( 6 , buff_Entry, INDICATOR_DATA );
PlotIndexSetDouble ( 3 , PLOT_EMPTY_VALUE , 0 );
SetIndexBuffer ( 7 , buff_Entry_Color, INDICATOR_COLOR_INDEX );

// línea SL
SetIndexBuffer ( 8 , buff_SL, INDICATOR_DATA );
PlotIndexSetDouble ( 4 , PLOT_EMPTY_VALUE , 0 );

// línea TP
SetIndexBuffer ( 9 , buff_TP, INDICATOR_DATA );
PlotIndexSetDouble ( 5 , PLOT_EMPTY_VALUE , 0 );

IndicatorSetInteger ( INDICATOR_DIGITS , _Digits );
IndicatorSetString ( INDICATOR_SHORTNAME , «ТС 80-20» );

Colocamos el código del programa principal en la función estándar OnCalculate. Es decir, organizamos el ciclo que va a repasar (del pasado al futuro) las barras del timeframe actual y comprobar la presencia de la señal en ellas usando la función desde el módulo de señal. Declaramos e inicializamos previamente las variables usando los valores iniciales. La barra más antigua del ciclo para el primer cálculo se determina tomando en cuenta la profundidad del historial establecida por el usuario ( Bars_Limit ). Para las llamadas siguientes vamos a recalcular no sólo la última barra, sino todas las barras del día actual, pues el patrón de dos barras en realidad pertenece al gráfico D1, independientemente del timeframe actual.

Además de eso, habrá que tomar medidas para protegernos contra así llamadas «fantasmas»: si no vamos a limpiar obligatoriamente los búferes de los indicadores durante la reinicialización, entonces al conmutar los timeframes o al cambiar el símbolo, en la pantalla van a quedarse las áreas coloreadas que no son actuales para el gráfico actual. Hay que vincular esta acción (limpieza de los búferes) a la primera llamada a la función OnCalculate después de la inicialización del indicador. Pero será imposible determinar que es la primera llamada usando sólo la variable estándar prev_calculated, ya que esta variable contiene el cero no sólo durante la primera llamada a la función, sino durante «el cambio de la suma de control». Vamos a gastar un poco de tiempo para resolver este problema— crearemos una estructura independiente de que la variable prev_calculated se ponga a cero. Esta estructura va a almacenar y procesar los datos útiles que se utilizan con frecuencia en los indicadores.

– bandera de la primera ejecución de la función OnCalculate;

– contador de las barras contadas que no se pone a cero al cambiar la suma de control;

– bandera del cambio de la suma de control;

– bandera del inicio de nueva barra;

– hora del inicio de la barra actual.

La estructura que reúne todos estos datos será declarada a nivel global y podrá recopilar o facilitar la información en/de cualquier función estándar o personalizada. Un nombre adecuado para esa esencia de programa sería «Duende amigo» (Brownie). Podemos colocarla el final del código del indicador. Ahí mismo, vamos a declarar otro objeto-estructura global con el nombre go_Brownie :

struct BROWNIE < // Duende amigo: estructura para almacenar y procesar los datos a nivel global
datetime t_Last_Bar_Time; // hora de la última barra procesada
int i_Prew_Calculated; // número de barras contadas
bool b_First_Run; // bandera de la primera ejecución
bool b_History_Updated; // bandera de actualización del historial
bool b_Is_New_Bar; // bandera de apertura de nueva barra

BROWNIE() < // constructor
// valores por defecto:
t_Last_Bar_Time = 0 ;
i_Prew_Calculated = WRONG_VALUE ;
b_First_Run = b_Is_New_Bar = true ;
b_History_Updated = false ;
>

void f_Reset( bool b_Reset_First_Run = true ) < // puesta a cero de las variables
// valores por defecto:
t_Last_Bar_Time = 0 ;
i_Prew_Calculated = WRONG_VALUE ;
if (b_Reset_First_Run) b_First_Run = true ; // puesta a cero, si hay permiso
b_Is_New_Bar = true ;
b_History_Updated = false ;
>

void f_Update( int i_New_Prew_Calculated = WRONG_VALUE ) < // actualización de variables
// bandera de la primera llamada a la función estándar OnCalculate
if (b_First_Run && i_Prew_Calculated > 0 ) b_First_Run = false ;

// ¿nueva barra?
datetime t_This_Bar_Time = TimeCurrent () – TimeCurrent () % PeriodSeconds ();
b_Is_New_Bar = t_Last_Bar_Time == t_This_Bar_Time;

// ¿actualizar la hora de la barra actual?
if (b_Is_New_Bar) t_Last_Bar_Time = t_This_Bar_Time;

if (i_New_Prew_Calculated > – 1 ) <
// ¿hay algunos cambios en el historial?
b_History_Updated = i_New_Prew_Calculated == 0 && i_Prew_Calculated > WRONG_VALUE ;

// prew_calculated usar, si es la 1-a llamada a OnCalculate
if (i_Prew_Calculated == WRONG_VALUE ) i_Prew_Calculated = i_New_Prew_Calculated;
// o si no ha habido actualizaciones del historial
else if (i_New_Prew_Calculated > 0 ) i_Prew_Calculated = i_New_Prew_Calculated;
>
>
>;
BROWNIE go_Brownie;

Los mejores corredores de opciones binarias 2020:
  • Binarium
    Binarium

    1er lugar! El mejor broker de opciones binarias!
    Ideal para principiantes! Entrenamiento gratis! Bonos de registro!

  • FinMax
    FinMax

    2do lugar! Gran corredor!

Vamos a prever también la notificación del «Duende amigo» sobre la deinicialización del indicador:

En caso de necesidad, es posible ampliar la colección de la información almacenada por el «Duende amigo» si las funciones personalizadas o las clases van a necesitar, por ejemplo, los precios, volúmenes o el tamaño del spread de la barra actual (Open, High, Low, Close, tick_volume, volume, spread). Es más cómodo coger los datos hechos desde la función OnCalculate y enviarlos a través del «Duende amigo» en vez de usar las funciones del copiado de las series temporales (CopyOpen, CopyHigh etc. o CopyRates). Eso va a ahorrar los recursos de la CPU y eliminará la necesidad de organizar el procesamiento de errores de estas funciones del lenguaje.

Volvamos a la función principal del indicador. La declaración de las variables y preparación de los arrays con el uso de la estructura go_Brownie tendrá el siguiente aspecto:

go_Brownie.f_Update(prev_calculated); // alimentar al Duende con la información

int
i_Period_Bar = 0 , // contador adicional
i_Current_TF_Bar = rates_total – int (Bars_Limit) // índice de la barra del inicio del ciclo del timeframe actual
;
static datetime st_Last_D1_Bar = 0 ; // hora de la última barra D1 del par procesado (2-a barra del patrón)
static int si_1st_Bar_of_Day = 0 ; // índice de la 1-a barra del día actual

if (go_Brownie.b_First_Run) < // si es la 1-a ejecución
// limpiar el búfer durante la reinicialización:
ArrayInitialize (buff_1st_Bar_Inner, 0 ); ArrayInitialize (buff_1st_Bar_Inner_Zero, 0 );
ArrayInitialize (buff_1st_Bar_Outer, 0 ); ArrayInitialize (buff_1st_Bar_Outer_Zero, 0 );
ArrayInitialize (buff_Entry, 0 ); ArrayInitialize (buff_Entry_Color, 0 );
ArrayInitialize (buff_Signal, 0 ); ArrayInitialize (buff_Signal_Color, 0 );
ArrayInitialize (buff_TP, 0 );
ArrayInitialize (buff_SL, 0 );
st_Last_D1_Bar = 0 ;
si_1st_Bar_of_Day = 0 ;
> else < // no es la primera ejecución
datetime t_Time = TimeCurrent ();
// profundidad mínima del recálculo – desde ayer:
i_Current_TF_Bar = rates_total – Bars ( _Symbol , PERIOD_CURRENT , t_Time – t_Time % 86400 , t_Time) – 1 ;
>
ENUM_ENTRY_SIGNAL e_Signal = ENTRY_UNKNOWN; // сигнал
double
d_SL = WRONG_VALUE , // уровень SL
d_TP = WRONG_VALUE , // nivel TP
d_Entry_Level = WRONG_VALUE , // nivel de la entrada
d_Range_High = WRONG_VALUE , d_Range_Low = WRONG_VALUE // límites del intervalo de la 1-a barra del patrón
;
tipo datetime t_Curr_D1_Bar = 0 , // hora de la barra actual D1 (2-a barra del patrón)
t_D1_Bar_To_Fill = 0 // hora de la barra D1 que hay que colorear (1-a barra del patrón)
;

// controlamos que el índice de la barra inicial del recálculo se encuentre dentro de los límites aceptables:
i_Current_TF_Bar = int ( fmax ( 0 , fmin (i_Current_TF_Bar, rates_total – gi_Min_Bars)));

while (++i_Current_TF_Bar IsStopped ()) < // repaso de las barras del timeframe actual
// aquí habrá el ciclo principal del programa
>

Durante el repaso de las barras del timeframe actual, vamos a comprobar la presencia de la señal:

Si, por un lado, la señal existe y, por otro, es la primera barra del día nuevo, es necesario organizar el relleno del intervalo de la barra diaria anterior. El valor de la variable t_D1_Bar_To_Fill tipo datetime será la bandera; si tiene asignado el valor WRONG_VALUE, el relleno no es necesario para esta barra. La línea de señal debe comenzar en la misma primera barra, pero para mejor comprensión del trazado vamos a prolongarla hasta la última barra del día anterior. Puesto que los cálculos del nivel de señal, el color de las líneas y de las áreas coloreadas son diferentes para la barra alcista y bajista, hagamos dos bloques parecidos entre ellos:

t_Curr_D1_Bar = Time [i_Current_TF_Bar] — Time [i_Current_TF_Bar] % 86400 ; // inicio del día al que pertenece esta barra
if (st_Last_D1_Bar // es la barra del día nuevo
t_D1_Bar_To_Fill = Time [i_Current_TF_Bar — 1 ] — Time [i_Current_TF_Bar — 1 ] % 86400 ;
si_1st_Bar_of_Day = i_Current_TF_Bar;
>
else t_D1_Bar_To_Fill = WRONG_VALUE ; // barra del día antiguo, el nuevo relleno no es necesario
st_Last_D1_Bar = t_Curr_D1_Bar; // recordamos

if (t_D1_Bar_To_Fill != WRONG_VALUE ) < // новый бар D1
// Relleno de la barra D1 del día anterior:
i_Period_Bar = i_Current_TF_Bar;
if (d_Entry_Level // barra bajista D1
if (Show_Outer) while (–i_Period_Bar > 0 ) < // intervalo completo
if ( Time [i_Period_Bar] break ;
buff_1st_Bar_Outer_Zero[i_Period_Bar] = d_Range_Low;
buff_1st_Bar_Outer[i_Period_Bar] = d_Range_High;
>
if (Show_Inner) < // área interna
i_Period_Bar = i_Current_TF_Bar;
while (–i_Period_Bar > 0 ) <
if ( Time [i_Period_Bar] break ;
buff_1st_Bar_Inner_Zero[i_Period_Bar] = d_Range_Low + 0.2 * (d_Range_High — d_Range_Low);
buff_1st_Bar_Inner[i_Period_Bar] = d_Range_High — 0.2 * (d_Range_High — d_Range_Low);
>
>
// inicio de la línea de señal — desde la última barra del día anterior
buff_Signal[i_Current_TF_Bar] = buff_Signal[i_Current_TF_Bar — 1 ] = d_Range_Low — gd_Extremum_Break;
buff_Signal_Color[i_Current_TF_Bar] = buff_Signal_Color[i_Current_TF_Bar — 1 ] = 0 ;
> else < // barra alcista D1
if (Show_Outer) while (–i_Period_Bar > 0 ) < // intervalo completo
if ( Time [i_Period_Bar] break ;
buff_1st_Bar_Outer_Zero[i_Period_Bar] = d_Range_High;
buff_1st_Bar_Outer[i_Period_Bar] = d_Range_Low;
>
if (Show_Inner) < // área interna
i_Period_Bar = i_Current_TF_Bar;
while (–i_Period_Bar > 0 ) <
if ( Time [i_Period_Bar] break ;
buff_1st_Bar_Inner_Zero[i_Period_Bar] = d_Range_High — 0.2 * (d_Range_High — d_Range_Low);
buff_1st_Bar_Inner[i_Period_Bar] = d_Range_Low + 0.2 * (d_Range_High — d_Range_Low);
>
>
// inicio de la línea de señal — desde la última barra del día anterior
buff_Signal[i_Current_TF_Bar] = buff_Signal[i_Current_TF_Bar — 1 ] = d_Range_High + gd_Extremum_Break;
buff_Signal_Color[i_Current_TF_Bar] = buff_Signal_Color[i_Current_TF_Bar — 1 ] = 1 ;
>
> else continue ;

Vamos a organizar el dibujo del resto de las líneas del trazado aquí mismo (dentro del ciclo del repaso de las barras del timeframe actual). Recordare que la línea de señal debe terminarse sobre la barra donde ella ha sido tocada por el precio. La línea de la orden pendiente debe empezar sobre esta misma barra. Ella debe terminar sobre la barra de contacto con el precio, y en la misma barra, deben empezar las líneas de Take Profit y Stop Loss. En la barra de contacto de una de ellas con el precio, el trazado de este patrón será terminado:

// Línea de señal hasta la barra que la atraviesa:
i_Period_Bar = i_Current_TF_Bar;
if (d_Entry_Level // barra bajista D1
while (++i_Period_Bar if ( Time [i_Period_Bar] > t_Curr_D1_Bar + 86399 ) break ;
buff_Signal[i_Period_Bar] = d_Range_Low — gd_Extremum_Break;
buff_Signal_Color[i_Period_Bar] = 0 ;
if (d_Range_Low — gd_Extremum_Break >= Low [i_Period_Bar]) break ;
>
> else < // barra alcista D1
while (++i_Period_Bar if ( Time [i_Period_Bar] > t_Curr_D1_Bar + 86399 ) break ;
buff_Signal[i_Period_Bar] = d_Range_High + gd_Extremum_Break;
buff_Signal_Color[i_Period_Bar] = 1 ;
if (d_Range_High + gd_Extremum_Break High [i_Period_Bar]) break ;
>
>

// Línea de entrada hasta la barra que la atraviesa:
if (d_Entry_Level // barra bajista D1
while (++i_Period_Bar if ( Time [i_Period_Bar] > t_Curr_D1_Bar + 86399 ) break ;
buff_Entry[i_Period_Bar] = d_Range_Low;
buff_Entry_Color[i_Period_Bar] = 0 ;
if (d_Range_Low High [i_Period_Bar]) <
if (buff_Entry[i_Period_Bar — 1 ] == 0 .) <
// inicio y fin en la misma barra, extendemos a 1 barra al pasado
buff_Entry[i_Period_Bar — 1 ] = d_Range_Low;
buff_Entry_Color[i_Period_Bar — 1 ] = 0 ;
>
break ;
>
>
> else < // barra alcista D1
while (++i_Period_Bar if ( Time [i_Period_Bar] > t_Curr_D1_Bar + 86399 ) break ;
buff_Entry[i_Period_Bar] = d_Range_High;
buff_Entry_Color[i_Period_Bar] = 1 ;
if (d_Range_High >= Low [i_Period_Bar]) <
if (buff_Entry[i_Period_Bar — 1 ] == 0 .) <
// inicio y fin en la misma barra, extendemos a 1 barra al pasado
buff_Entry[i_Period_Bar — 1 ] = d_Range_High;
buff_Entry_Color[i_Period_Bar — 1 ] = 1 ;
>
break ;
>
>
>

// Líneas TP y SL hasta la barra que ha cruzado una de ellas:
if (d_Entry_Level // barra bajista D1
// SL es igual al mínimo desde el inicio del día:
d_SL = Low [ ArrayMinimum ( Low , si_1st_Bar_of_Day, i_Period_Bar — si_1st_Bar_of_Day)];

while (++i_Period_Bar if ( Time [i_Period_Bar] > t_Curr_D1_Bar + 86399 ) break ;
buff_SL[i_Period_Bar] = d_SL;
buff_TP[i_Period_Bar] = d_TP;
if (d_TP High [i_Period_Bar] || d_SL >= Low [i_Period_Bar]) <
if (buff_SL[i_Period_Bar — 1 ] == 0 .) <
// inicio y fin en la misma barra, extendemos a 1 barra al pasado
buff_SL[i_Period_Bar — 1 ] = d_SL;
buff_TP[i_Period_Bar — 1 ] = d_TP;
>
break ;
>
>
> else < // barra alcista D1
// SL es igual al máximo desde el inicio del día:
d_SL = High [ ArrayMaximum ( High , si_1st_Bar_of_Day, i_Period_Bar — si_1st_Bar_of_Day)];

while (++i_Period_Bar if ( Time [i_Period_Bar] > t_Curr_D1_Bar + 86399 ) break ;
buff_SL[i_Period_Bar] = d_SL;
buff_TP[i_Period_Bar] = d_TP;
if (d_SL High [i_Period_Bar] || d_TP >= Low [i_Period_Bar]) <
if (buff_SL[i_Period_Bar — 1 ] == 0 .) <
// inicio y fin en la misma barra, extendemos a 1 barra al pasado
buff_SL[i_Period_Bar — 1 ] = d_SL;
buff_TP[i_Period_Bar — 1 ] = d_TP;
>
break ;
>
>
>

Colocaremos el código de la llamada a la función de la notificación sobre la señal f_Do_Alert fuera del ciclo. En realidad, sus posibilidades son un poco más amplias que las que se utilizan en este indicador: la función puede trabajar con los archivos de audio, es decir, se puede añadir en los ajuste personalizados la activación de esta opción y la selección de los archivos separados para las señales de compra y venta. El listado de esta función:

void f_Do_Alert( // Función del envío de señales y avisos
string s_Message, // texto para la alerta
bool b_Alert = true , // ¿mostrar la ventana emergente?
bool b_Sound = false , // ¿reproducir archivo sonoro?
bool b_Email = false , // ¿enviar mensaje de correo?
bool b_Notification = false , // ¿enviar notificación Push?
string s_Email_Subject = «» , // asunto para el mensaje de email
string s_Sound = «alert.wav» // archivo de sonido
) <
static string ss_Prev_Message = «había silencio» ; // texto de la alerta anterior
static datetime st_Prev_Time; // hora de la barra de la alerta anterior
datetime t_This_Bar_Time = TimeCurrent () — PeriodSeconds () % PeriodSeconds (); // hora de la barra actual

if (ss_Prev_Message != s_Message || st_Prev_Time != t_This_Bar_Time) <
// otra alerta y/o la 1-a en esta barra

// guardar:
ss_Prev_Message = s_Message;
st_Prev_Time = t_This_Bar_Time;

// formar la línea del mensaje:
s_Message = StringFormat ( «%s | %s | %s | %s» ,
TimeToString ( TimeLocal (), TIME_SECONDS ), // hora local
_Symbol , // símbolo
StringSubstr ( EnumToString ( ENUM_TIMEFRAMES ( _Period )), 7 ), // timeframe
s_Message // сообщение
);

// saltar la señal del aviso:
if (b_Alert) Alert (s_Message);
if (b_Email) SendMail (s_Email_Subject + » » + _Symbol , s_Message);
if (b_Notification) SendNotification (s_Message);
if (b_Sound) PlaySound (s_Sound);
>
>

Este es el código de comprobación de la necesidad de llamar a esta función y formar el texto del mensaje para ella, ubicado en el cuerpo del programa, antes de la finalización del trabajo del manejador de eventos OnCalculate:

// alerta
i_Period_Bar = rates_total — 1 ; // barra actual

if (Alert_Popup + Alert_Email + Alert_Push == 0 ) return (rates_total); // todo desactivado
if (buff_Signal[i_Period_Bar] == 0 ) return (rates_total); // ya o aún no hay nada que pillar
if (
buff_Signal[i_Period_Bar] > High [i_Period_Bar]
||
buff_Signal[i_Period_Bar] Low [i_Period_Bar]
) return (rates_total); // no hay toque con la línea de señal

// texto del mensaje:
string s_Message = StringFormat ( «TS 80-20: es necesario %s @ %s, TP: %s, SL: %s» ,
buff_Signal_Color[i_Period_Bar] > 0 ? «BuyStop» : «SellStop» ,
DoubleToString (d_Entry_Level, _Digits ),
DoubleToString (d_TP, _Digits ),
DoubleToString (d_SL, _Digits )
);
// aviso:
f_Do_Alert(s_Message, Alert_Popup, false , Alert_Email, Alert_Push, Alert_Email_Subj);

return (rates_total); // fin del trabajo de OnCalculate

El código fuente completo del indicador está en los archivos adjuntos con el nombre TS_80-20.mq5. En cuanto a su uso, se puede decir que el trazado del trading según este sistema se ve mejor en los gráficos de minutos.

Es importante tener en cuenta a la hora de usar este trazado que el indicador utiliza los datos de las barras, en vez de las secuencias de los ticks dentro de las barras. Eso significa que si el precio ha cruzado varias líneas del trazado (por ejemplo, las líneas Take Profit y Stop Loss) en una barra, no siempre se puede determinar cuál de ellas ha sido la primera. Otro momento desfavorable está relacionado con el hecho de que las barras del inicio y del final de las líneas no pueden coincidir, de lo contrario las líneas desde el búfer tipo DRAW_LINE y DRAW_COLOR_LINE simplemente no estarían visibles para el usuario. Estas particularidades hacen que el trazado no sea preciso a 100%, pero es bastante ilustrativo.

Asesor Experto para probar la Estrategia Comercial ’80-20′

El EA básico para las pruebas de las estrategias del libro Street Smarts: High Probability Short-Term Trading Strategies ha sido descrito detalladamente en el primer artículo. Vamos a introducir dos modificaciones importantes en él. La primera está relacionada con el hecho de que el módulo de señal va a utilizarse también en el indicador, por tanto sería lógico que haga los cálculos de los niveles de trading. Ya lo hemos hecho antes: la función fe_Get_Entry_Signal , aparte del estatus de la señal, devuelve los niveles de colocación de la orden, Stop Loss y Take Profit. Por eso quitaremos la parte correspondiente del código de la versión anterior del EA, añadiremos las variables para recibir los niveles desde la función y editaremos la llamada a esta función. No voy a mostrar aquí el listado del bloque nuevo y anterior del código, Usted podrá verlo en el archivo adjunto (líneas de 128 a 141).

La segunda adición importante en el código del EA básico está relacionada con el hecho de que esta Estrategia Comercial trata con la tendencia a corto plazo, a diferencia de dos estrategias anteriores. Ella supone que el retroceso ocurrirá una vez al día, y es poco probable que se repita. Eso significa que el robot tiene que hacer sólo una entrada e ignorar la señal existente todo el tiempo restante hasta el día siguiente. La manera más simple para implementar eso consiste en utilizar una bandera especial, la variable global o estática tipo bool en la memoria del programa. Pero si el trabajo del EA será interrumpido por alguna razón (el terminal se cierra, el EA se elimina del gráfico, etc.), se perderá también el valor de la bandera. Por tanto, después del reinicio, el EA debe tener la posibilidad de comprobar si la señal de hoy ha sido utilizado. Para eso se puede analizar el historial de las operaciones de hoy, o se puede almacenar la fecha de la última entrada en las variables globales del terminal, en vez del programa. Nosotros vamos a utilizar la segunda opción, es mucho más sencilla para la implementación.

Vamos a dar al usuario la posibilidad de controlar la opción «una entrada al día», así como establecer el identificador para cada versión del robot en ejecución: va a ser necesario para el uso de las variables globales del nivel del terminal:

Para la implementación de la opción «una entrada al día», vamos a añadir la declaración de las variables necesarias en el bloque de determinación de variables globales del programa. Las analizaremos en la función OnInit:

string
gs_Prefix // identificador de nombres de las variables (super)globales
;
bool
gb_Position_Today = false ,
gb_Pending_Today = false
;

// Creación del prefijo de nombres de las variables (super)globales:
gs_Prefix = StringFormat ( «SSB %s %u %s» , _Symbol , Magic_Number, MQLInfoInteger ( MQL_TESTER ) ? «t » : «» );

// ¿Ha trabajado el robot hoy con las órdenes de mercado o pendientes?
gb_Position_Today = int ( GlobalVariableGet (gs_Prefix + «Last_Position_Date» )) == TimeCurrent () — TimeCurrent () % 86400 ;
gb_Pending_Today = int ( GlobalVariableGet (gs_Prefix + «Last_Pending_Date» )) == TimeCurrent () — TimeCurrent () % 86400 ;

Aquí el robot lee el valor de las variables globales y compara la hora registrada en ellas con la hora del inicio del día: así determina si ha sido trabajada ya la señal de hoy o no. Vamos a organizar la escritura de la hora en estas variables en dos lugares: añadimos el bloque correspondiente en el código de colocación de la orden pendiente (las adiciones están marcadas):

Colocamos el segundo bloque después del código que determina la posición recién abierta:

if ( PositionSelect ( _Symbol )) < // hay posición abierta
if ( PositionGetDouble ( POSITION_SL ) == 0 .) < // nueva posición

if (!gb_Position_Today) < // es la 1-a posición hoy
// actualizar la bandera:
GlobalVariableSet ( // en las variables globales del terminal
gs_Prefix + «Last_Position_Date» ,
TimeCurrent () — TimeCurrent () % 86400
);
gb_Position_Today = true ; // en las variables globales del programa
>
.

No hay otras modificaciones importantes en el código de la versión anterior del EA. En el anexo encontrará el código fuente de la nueva versión en su forma final.

Prueba de la estrategia a base de datos históricos

Los autores del sistema de trading, como la justificación de su viabilidad, muestran los patrones en los gráficos del fin del siglo pasado, pero nosotros necesitamos comprobar su relevancia en las condiciones del mercado contemporáneo. Para la prueba, he escogido el par más popular en el mercado de Forex, EURUSD, así como el más volátil, USDJPY, y uno de los metales, XAUUSD. He aumentado 10 veces los márgenes especificados por Raschke y Connors, ya que en aquel entonces se utilizaban las cotizaciones de cuatro dígitos, y yo probaba el EA con cinco dígitos. Como no había ninguna orientación de parte de los autores respecto a los parámetros del trailing, he escogido los que me parecieron más adecuados para el timeframe D1 y volatilidad del símbolo. Lo mismo se refiere al algoritmo del cálculo de Take Profit adicionado a las reglas originales, el coeficiente para su cálculo ha sido elegido aleatoriamente, sin una optimización profunda.

Gráfico del cambio del balance durante la prueba en el historial de cinco años de EURUSD con reglas originales (sin Take Profit):

Con las mismas configuraciones y adición de Take Profit:

Gráfico del cambio del balance durante la prueba de las reglas originales en el historial de cinco años de USDJPY:

El mismo símbolo y timeframe con las mismas configuraciones, pero con adición de Take Profit:

Las reglas originales en las cotizaciones diarias del oro para los últimos 4 años muestran el siguiente gráfico del cambio del balance:

La información completa sobre cada prueba de las configuraciones del robot se puede encontrar en el archivo adjunto al artículo, contiene los informes completos de cada prueba.

Conclusión

Las reglas programadas en el módulo de señal corresponden a la descripción del sistema de trading 80-20 en el libro Street Smarts: High Probability Short-Term Trading Strategies, escrito por Linda Raschke y Laurence Connor. Tiene lugar una pequeña extensión de las reglas de los autores. Estas herramientas (robot e indicador) deben ayudar a los interesados a sacar sus propias conclusiones sobre la relevancia de la Estrategia Comercial en las condiciones del mercado de hoy. En mi humilde opinión, requiere una importante modernización. En este artículo he intentado comentar detalladamente la creación del código del módulo de señal y el robot e indicador que lo utilizan, espero que eso sirva de ayuda para quienes decidan hacer dicha modernización. Aparte de la actualización de las reglas, se puede intentar seleccionar los símbolos que convengan mejor para este sistema, los mejores parámetros de la detección de la señal y el mejor seguimiento de posiciones.

Los mejores corredores de opciones binarias 2020:
  • Binarium
    Binarium

    1er lugar! El mejor broker de opciones binarias!
    Ideal para principiantes! Entrenamiento gratis! Bonos de registro!

  • FinMax
    FinMax

    2do lugar! Gran corredor!

Like this post? Please share to your friends:
Opciones binarias: ¿por dónde empezar?
Deja un comentario

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: