
Análisis comparativo de 10 estrategias de flat
Contenido
- Introducción
- Definiendo la tarea al crear la estrategia de flat
- Estrategias de flat
- Estrategia №1. Indicador Envelopes con filtro en forma de MFI
- Estrategia №2. Indicador Bollinger Bands y dos Moving Average
- Estrategia №3. WSO & WRO Channel con filtro en forma de Fractal Dimension Ehlers
- Estrategia №4. Indicador Percentage Crossover Channel y TrendRange como filtro
- Estrategia №5. Indicador Price Channel y RBVI como filtro
- Estrategia №6. Indicador Williams Percent Range y ADX como filtro
- Estrategia №7. Canal de Keltner modificado e indicador Magic Trend como filtro
- Estrategia №8. Canal Donchian con confirmación del indicador Trinity Impulse
- Estrategia №9. Indicador ATR Channel y CCI Color Levels como filtro
- Estrategia №10. RSI en forma de histograma e indicador Flat como filtro
- Simulación
- Conclusiones sobre la comparativa
- Conclusión
Introducción
Las estrategias comerciales según la tendencia son las más populares y sencillas, especialmente para los tráders principiantes. Pero en nuestra realidad actual, el dinamismo de los mercados ha aumentado, y los movimientos de tendencia se han vuelto menos pronunciados (tanto en su amplitud, como en su duración). Por eso, no querríamos perder beneficio potencial dejando pasar la posibilidad de comerciar en mercado plano. Las normas del comercio según la tendencia son sencillas: hay que determinar los rasgos de la tendencia e intentar extraer beneficios de su desarrollo. El comercio con flat sucede de una forma totalmente distinta. Durante el movimiento lateral, el precio se encuentra en un pequeño intervalo y puede no cambiar en absoluto durante un tiempo considerable. En este caso, además, no existen movimientos direccionales, y la liquidez es baja.
Definiendo la tarea al crear la estrategia de flat
En el artículo anterior nos marcamos tres tareas cuya resolución resultaba imprescindible para crear una estrategia de trabajo con tendencia. Las tareas para crear las estrategias de flat son muy similares a ellas.
Fig. 1. Ejemplo de movimiento lateral (flat).
Tarea №1. Definir la presencia de flat.
No existe un concepto general o exhaustivo de lo que es el flat, (propiamente, como tampoco lo hay de tendencia). Pero sí que hay ciertas señales de que en el mercado existe un movimiento lateral (flat) en el momento actual. Propiamente, este movimiento se llama lateral porque no hay un movimiento claramente pronunciado del mercado en vertical: ni hacia arriba, ni hacia abajo. En este caso, además, se encuentra en un intervalo determinado, aproximándose de forma ondulada bien a la parte inferior, bien a la parte superior. Otra señal de flat puede ser un volumen bajo de transacciones en el mercado o un interés bajo de los participantes del mercado. Esto se percibe no solo por los cambios débiles de precio, sino también por el bajo volumen de ticks.
Tarea №2. Objetivos de la posición abierta.
Con mucha frecuencia, al comerciar con flat se usa el concepto de comercio dentro del canal. Este es precisamente el método principal de uso del movimiento lateral para obtener beneficios. Se define el canal de flat dentro de ciertos límites virtuales, y a continuación, partiendo de la relación entre el precio y estos límites, se construye la estrategia del comercio. Con frecuencia, se construye sobre la compra o la venta cuando el precio retrocede con respecto al límite del canal (fig.2).
Fig. 2. Comercio cuando el precio retrocede con respecto al límite del canal.
Al vender en la parte superior del canal, suponemos que el precio irá en la dirección del límite inferior. Ahí se encontrará precisamente el take-profit. El stop-loss se puede colocar o bien con un valor numérico determinado en puntos, o partiendo de la anchura del canal. Para comprar, todo será al contrario: compraremos en la parte inferior del canal, poniendo el take-profit cerca del límite superior.
Estrategias de flat
Al elegir las estrategias de flat, hemos decidido guiarnos por los principios descritos más arriba.
- El comercio tendrá lugar en el canal. Por eso, elegiremos instrumentos que nos permitan construirlo y definir los límites virtuales del flat.
- Aparte de definir el canal, necesitaremos aunque solo sea un instrumento para confirmar que el precio va a ir en la dirección que necesitamos, tras retroceder con respecto al límite del canal. Este filtro lo necesitaremos para descartar señales de entrada falsas.
Estrategia №1: Indicador Envelopes con filtro en forma de MFI
Para definir los límites del canal, usaremos Envelopes, mientras que la señal será filtrada por MFI.
Parámetro | Descripción |
---|---|
Indicador utilizado | Envelopes |
Indicador utilizado | MFI |
Marco temporal | H1 |
Condiciones de compra | Precio alcanzado en el borde inferior del canal y MFI se encuentra en la zona de sobreventa (por debajo de 20) |
Condiciones de venta | Precio alcanzado en el borde superior del canal y MFI se encuentra en la zona de sobrecompra (por encima de 80) |
Condiciones de salida | El precio alcanza el borde opuesto del canal |
En la fig.3 se muestran las condiciones de entrada en el mercado según la estrategia №1.
Fig. 3. Condiciones de entrada según la estrategia de flat №1.
El código del asesor para esta estrategia tiene el aspecto siguiente:
void OnTick() { //--- Comprobando las órdenes abiertas anteriormente por el asesor experto if(!Trade.IsOpenedByMagic(Inp_MagicNum)) { //--- Obteniendo los datos para el cálculo if(!GetIndValue()) return; //--- Apertura de una orden al darse la señal de compra if(BuySignal()) Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); //--- Apertura de una orden al darse la señal de venta if(SellSignal()) Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); } } //+------------------------------------------------------------------+ //| Condiciones de compra | //+------------------------------------------------------------------+ bool BuySignal() { if(mfi[0]<20 && env_low[0]>close[0]) { tp=env_high[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Condiciones de venta | //+------------------------------------------------------------------+ bool SellSignal() { if(mfi[0]>80 && env_high[0]<close[0]) { tp=env_low[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Obteniendo los valores actuales de los indicadores | //+------------------------------------------------------------------+ bool GetIndValue() { return(CopyBuffer(InpInd_Handle1,0,0,2,mfi)<=0 || CopyBuffer(InpInd_Handle2,1,0,2,env_low)<=0 || CopyBuffer(InpInd_Handle2,0,0,2,env_high)<=0 || CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0 )?false:true; } //+------------------------------------------------------------------+
El take-profit se establece de forma automática, partiendo de las condiciones indicadas, y el stop-loss se establece manualmente, dependiendo del marco temporal.
Estrategia №2: Indicador Bollinger Bands y dos Moving Average
Para definir los límites del canal, se usa el indicador Bollinger Bands, y como filtro, la posición de las MA lenta y rápida una con respecto a otra.
Parámetro | Descripción |
---|---|
Indicador utilizado | Bollinger Bands |
Indicador utilizado | Moving Average |
Marco temporal | H1 |
Condiciones de compra | Precio alcanzado en el borde inferior del canal, MA rápida por encima de la lenta |
Condiciones de venta | Precio alcanzado en el borde superior del canal, MA rápida por debajo de la lenta |
Condiciones de salida | El precio alcanza el borde opuesto del canal |
En la fig.4 se muestran las condiciones de entrada en el mercado. El periodo de las dos SMA es por defecto pequeño: 4 y 8. En el asesor, podemos ajustar los periodos y métodos de suavizado, cambiando de esta forma la sensibilidad de filtrado de la señal de Bollinger Bands.
Fig. 4 Condiciones de entrada según la estrategia de flat №2
Con excepción de las condiciones de entrada en el mercado, la estrategia №2 es muy similar a la estrategia №1.
void OnTick() { //--- Comprobando las órdenes abiertas anteriormente por el asesor experto if(!Trade.IsOpenedByMagic(Inp_MagicNum)) { //--- Obteniendo los datos para el cálculo if(!GetIndValue()) return; //--- Apertura de una orden al darse la señal de compra if(BuySignal()) Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); //--- Apertura de una orden al darse la señal de venta if(SellSignal()) Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); } } //+------------------------------------------------------------------+ //| Condiciones de compra | //+------------------------------------------------------------------+ bool BuySignal() { if(ma_slow[0]>ma_fast[0] && bb_low[0]>close[0]) { tp=bb_up[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Condiciones de venta | //+------------------------------------------------------------------+ bool SellSignal() { if(ma_slow[0]<ma_fast[0] && bb_up[0]<close[0]) { tp=bb_low[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Obteniendo los valores actuales de los indicadores | //+------------------------------------------------------------------+ bool GetIndValue() { return(CopyBuffer(InpInd_Handle1,1,0,2,bb_up)<=0 || CopyBuffer(InpInd_Handle1,2,0,2,bb_low)<=0 || CopyBuffer(InpInd_Handle2,0,0,2,ma_slow)<=0 || CopyBuffer(InpInd_Handle3,0,0,2,ma_fast)<=0 || CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0 )?false:true; } //+------------------------------------------------------------------+
Estrategia №3. WSO & WRO Channel y Fractal Dimension Ehlers
La señal principal del indicador será WSO & WRO Channel, un canal construido usando como base los valores de los dos osciladores: WSO (Widner Support Oscillator) y WRO (Widner Resistance Oscillator). La idea del indicador se basa en el artículo de Mel Widner: "Automated Support And Resistance". Como filtro, tomaremos el indicador de dimensión fractal descrito en el artículo de John Eulers y Rick Weiss: "Fractal Dimension As A Market Mode Sensor".
Parámetro | Descripción |
---|---|
Indicador utilizado | WSO & WRO Channel |
Indicador utilizado | Fractal Dimension Ehlers |
Marco temporal | Cualquiera |
Condiciones de compra | Precio alcanzado en el borde inferior del canal y valor de Fractal Dimension por debajo del umbral objetivo |
Condiciones de venta | Precio alcanzado en el borde superior del canal y valor de Fractal Dimension por debajo del umbral objetivo |
Condiciones de salida | El precio alcanza el borde opuesto del canal |
En la fig.5 se muestran las condiciones de entrada en el mercado. Como en los anteriores artículos, la estrategia presupone el comercio con retroceso a partir de los límites del canal; en este caso, además, intentaremos encontrar con la ayuda del filtro aquellos puntos de entrada donde el mercado no se encuentra en un estado de tendencia.
Fig. 5. Condiciones de entrada de la estrategia de flat №3.
El código de esta estrategia tiene el aspecto siguiente:
void OnTick() { //--- Comprobando las órdenes abiertas anteriormente por el asesor experto if(!Trade.IsOpenedByMagic(Inp_MagicNum)) { //--- Obteniendo los datos para el cálculo if(!GetIndValue()) return; //--- Apertura de una orden al darse la señal de compra if(BuySignal()) Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); //--- Apertura de una orden al darse la señal de venta if(SellSignal()) Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); } } //+------------------------------------------------------------------+ //| Condiciones de compra | //+------------------------------------------------------------------+ bool BuySignal() { if(wwc_low[0]>close[0] && fdi[0]<Inp_FdiThreshold) { tp=wwc_up[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Condiciones de venta | //+------------------------------------------------------------------+ bool SellSignal() { if(wwc_up[0]<close[0] && fdi[0]<Inp_FdiThreshold) { tp=wwc_low[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Obteniendo los valores actuales de los indicadores | //+------------------------------------------------------------------+ bool GetIndValue() { return(CopyBuffer(InpInd_Handle1,3,0,2,wwc_up)<=0 || CopyBuffer(InpInd_Handle1,2,0,2,wwc_low)<=0 || CopyBuffer(InpInd_Handle2,0,0,2,fdi)<=0 || CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0 )?false:true; } //+------------------------------------------------------------------+
Estrategia №4. Indicador Percentage Crossover Channel y TrendRange como filtro
Aquí intentaremos usar un canal que se construya según la ruptura de los niveles en un tanto por ciento determinado. Necesitaremos un indicador que construya el canal, la búsqueda de puntos de retroceso del precio respecto a sus límites y el filtrado de la señal. Este indicador será TrendRange, que muestra tanto los estados de tendencia, como los estados de mercado plano. Precisamente estos vamos a utilizar como filtro.
Parámetro | Descripción |
---|---|
Indicador utilizado | Percentage Crossover Channel |
Indicador utilizado | Trend Range |
Marco temporal | Cualquiera |
Condiciones de compra | Precio alcanzado en el borde inferior del canal y color gris del histograma de Trend Range |
Condiciones de venta | Precio alcanzado en el borde superior del canal y color gris del histograma de Trend Range |
Condiciones de salida | El precio alcanza el borde opuesto del canal |
Las condiciones de entrada en el mercado se muestran en la fig.6. El funcionamiento del indicador Percentage Crossover tiene algunas peculiaridades. El parámetro Percent, que representa la distancia límite cuya ruptura indica el comienzo de la construcción de un nuevo nivel, depende del marco temporal. Cuanto menor sea, menor porcentaje se deberá establecer. Por ejemplo, en el marco temporal de horas, el valor recomendado es 20 — 30. Valores más altos provocarán que el indicador sea demasiado selectivo.
Fig. 6. Condiciones de entrada según la estrategia de flat №4.
La estrategia se implementa como código de esta forma:
void OnTick() { //--- Comprobando las órdenes abiertas anteriormente por el asesor experto if(!Trade.IsOpenedByMagic(Inp_MagicNum)) { //--- Obteniendo los datos para el cálculo if(!GetIndValue()) return; //--- Apertura de una orden al darse la señal de compra if(BuySignal()) Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); //--- Apertura de una orden al darse la señal de venta if(SellSignal()) Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); } } //+------------------------------------------------------------------+ //| Condiciones de compra | //+------------------------------------------------------------------+ bool BuySignal() { if(pcc_low[0]>close[0] && tr_flat[0]>tr_range[0]) { tp=pcc_up[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Condiciones de venta | //+------------------------------------------------------------------+ bool SellSignal() { if(pcc_up[0]<close[0] && tr_flat[0]>tr_range[0]) { tp=pcc_low[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Obteniendo los valores actuales de los indicadores | //+------------------------------------------------------------------+ bool GetIndValue() { return(CopyBuffer(InpInd_Handle1,0,0,2,pcc_up)<=0 || CopyBuffer(InpInd_Handle1,2,0,2,pcc_low)<=0 || CopyBuffer(InpInd_Handle2,1,0,2,tr_flat)<=0 || CopyBuffer(InpInd_Handle2,2,0,2,tr_range)<=0 || CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0 )?false:true; } //+------------------------------------------------------------------+
Estrategia №5. Indicador Price Channel y RBVI como filtro
El indicador Price Channel construye un canal cuyos límites inferiores y superiores son definidos por el precio máximo y mínimo en el periodo. Las señales falsas serán filtradas por RBVI, que define el flat en el mercado.
Parámetro | Descripción |
---|---|
Indicador utilizado | Price Channel |
Indicador utilizado | RBVI |
Marco temporal | Cualquiera |
Condiciones de compra | Precio alcanzado en el borde inferior del canal y valor de RBVI por debajo del valor umbral para el flat |
Condiciones de venta | Precio alcanzado en el borde superior del canal y valor de RBVI por debajo del valor umbral para el flat |
Condiciones de salida | El precio alcanza el borde opuesto del canal |
En la fig.7 se muestran las condiciones de entrada. El valor umbral del indicador RBVI es 40. Este valor se podrá cambiar en los parámetros del asesor.
Fig. 7. Condiciones de entrada según la estrategia de flat №5.
La implementación de esta estrategia como código tiene el aspecto que sigue:
void OnTick() { //--- Comprobando las órdenes abiertas anteriormente por el asesor experto if(!Trade.IsOpenedByMagic(Inp_MagicNum)) { //--- Obteniendo los datos para el cálculo if(!GetIndValue()) return; //--- Apertura de una orden al darse la señal de compra if(BuySignal()) Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); //--- Apertura de una orden al darse la señal de venta if(SellSignal()) Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); } } //+------------------------------------------------------------------+ //| Condiciones de compra | //+------------------------------------------------------------------+ bool BuySignal() { if(pc_low[0]>close[0] && rbvi[0]<=Inp_level) { tp=pc_up[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Condiciones de venta | //+------------------------------------------------------------------+ bool SellSignal() { if(pc_up[0]<close[0] && rbvi[0]<=Inp_level) { tp=pc_low[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Obteniendo los valores actuales de los indicadores | //+------------------------------------------------------------------+ bool GetIndValue() { return(CopyBuffer(InpInd_Handle1,0,0,2,pc_up)<=0 || CopyBuffer(InpInd_Handle1,1,0,2,pc_low)<=0 || CopyBuffer(InpInd_Handle2,0,0,2,rbvi)<=0 || CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0 )?false:true; } //+------------------------------------------------------------------+
Estrategia №6. Indicador Williams Percent Range y ADX como filtro
El rango porcentual de Williams, que determina el estado de sobrecompra/sobreventa, se usará como puntos de entrada. Pero, puesto que nuestra tarea es comerciar en mercado plano o se presupone el retorno del precio a un cierto intervalo, el indicador de tendencia ADX se usará para determinar la ausencia de tendencia direccional.
Parámetro | Descripción |
---|---|
Indicador utilizado | Williams Percent Range |
Indicador utilizado | ADX |
Marco temporal | Cualquiera |
Condiciones de compra | El indicador WPR se encuentra en la zona de sobreventa (por debajo de -80) y el valor de ADX está por debajo del valor umbral establecido. |
Condiciones de venta | El indicador WPR se encuentra en la zona de sobrecompra (por encima de -20) y el valor de ADX está por debajo del valor umbral establecido. |
Condiciones de salida | Take-profit/Stop-loss |
Como se ve en la fig.8, la zona de flat en el indicador ADX está configurada por defecto en el valor 30. Pero en el código del asesor se ha pensado la posibilidad de configurarlo según el usuario.
Fig. 8. Condiciones de entrada según la estrategia de flat №6.
En la lista de abajo se muestra la implementación de esta estrategia. Aquí la variable Inp_FlatLevel es responsable del valor umbral de ADX, sobre el que hemos hablado antes.
void OnTick() { //--- Comprobando las órdenes abiertas anteriormente por el asesor experto if(!Trade.IsOpenedByMagic(Inp_MagicNum)) { //--- Obteniendo los datos para el cálculo if(!GetIndValue()) return; //--- Apertura de una orden al darse la señal de compra if(BuySignal()) Trade.BuyPositionOpen(Symbol(),Inp_Lot,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment); //--- Apertura de una orden al darse la señal de venta if(SellSignal()) Trade.SellPositionOpen(Symbol(),Inp_Lot,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment); } } //+------------------------------------------------------------------+ //| Condiciones de compra | //+------------------------------------------------------------------+ bool BuySignal() { return(wpr[0]<-80 && adx[0]<Inp_FlatLevel)?true:false; } //+------------------------------------------------------------------+ //| Condiciones de venta | //+------------------------------------------------------------------+ bool SellSignal() { return(wpr[0]>=-20 && adx[0]<Inp_FlatLevel)?true:false; } //+------------------------------------------------------------------+ //| Obteniendo los valores actuales de los indicadores | //+------------------------------------------------------------------+ bool GetIndValue() { return(CopyBuffer(InpInd_Handle1,0,0,2,wpr)<=0 || CopyBuffer(InpInd_Handle2,0,0,2,adx)<=0)?false:true; } //+------------------------------------------------------------------+
Estrategia №7. Canal de Keltner modificado e indicador Magic Trend como filtro
Aquí el retroceso del precio con respecto a los límites del canal de Keltner lo comprobaremos con la ayuda del indicador de tendencia Magic Trend, en los momentos en los que se identifica el mercado plano.
Parámetro | Descripción |
---|---|
Indicador utilizado | Canal de Keltner modificado |
Indicador utilizado | Magic Trend |
Marco temporal | Cualquiera |
Condiciones de compra | Precio alcanzado en el borde inferior del canal y línea de Magic Trend de color gris |
Condiciones de venta | Precio alcanzado en el borde superior del canal y línea de Magic Trend de color gris |
Condiciones de salida | El precio alcanza el borde opuesto del canal |
En la fig.9 se representa una demostración gráfica de esta estrategia comercial. Podemos ver que el valor del indicador Magic Trend en el flat no cambia: se representa con una línea horizontal gris. Esto significa que será necesaria una condición adicional aparte de la llegada del precio al límite del canal: que Magic Trend se encuentre en estado de flat cierto tiempo. Esta comprobación se implementará comparando los valores en la barra actual y la anterior: estas deberán ser iguales.
Fig. 9. Condiciones de entrada según la estrategia de flat №7.
En el código, esto se tiene en cuenta en las funciones que comprueban las condiciones de compra/venta:
void OnTick() { //--- Comprobando las órdenes abiertas anteriormente por el asesor experto if(!Trade.IsOpenedByMagic(Inp_MagicNum)) { //--- Obteniendo los datos para el cálculo if(!GetIndValue()) return; //--- Apertura de una orden al darse la señal de compra if(BuySignal()) Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); //--- Apertura de una orden al darse la señal de venta if(SellSignal()) Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); } } //+------------------------------------------------------------------+ //| Condiciones de compra | //+------------------------------------------------------------------+ bool BuySignal() { if(kc_low[0]>close[0] && mt[0]==mt[1]) { tp=kc_up[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Condiciones de venta | //+------------------------------------------------------------------+ bool SellSignal() { if(kc_up[0]<close[0] && mt[0]==mt[1]) { tp=kc_low[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Obteniendo los valores actuales de los indicadores | //+------------------------------------------------------------------+ bool GetIndValue() { return(CopyBuffer(InpInd_Handle1,0,0,2,kc_up)<=0 || CopyBuffer(InpInd_Handle1,2,0,2,kc_low)<=0 || CopyBuffer(InpInd_Handle2,0,0,2,mt)<=0 || CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0 )?false:true; } //+------------------------------------------------------------------+
Estrategia №8. Canal Donchian con confirmación del indicador Trinity Impulse
En esta estrategia intentaremos captar el momento de retroceso con respecto a los límites del canal Donchian, confirmándolo con el indicador de impulso Trinity Impulse en estado de movimiento lateral.
Parámetro | Descripción |
---|---|
Indicador utilizado | Canal Donchian |
Indicador utilizado | Trinity Impulse |
Marco temporal | Marcos temporales menores |
Condiciones de compra | Precio alcanzado en el borde inferior del canal y valor cero de Trinity Impulse |
Condiciones de venta | Precio alcanzado en el borde superior del canal y valor cero de Trinity Impulse |
Condiciones de salida | El precio alcanza el borde opuesto del canal |
La entrada en el mercado se representa en la fig.10. No es deseable usar la estrategia en los marcos temporales mayores, porque el filtro Trinity Impulse muestra el comportamiento con un trazo en forma de sierra, y las zonas de flat se representan con retraso. En este caso, además, su amplitud es muy pequeña, y esto hace la estrategia demasiado selectiva. La opción óptima es usar marcos temporales de 5 — 30 minutos.
Fig. 10. Condiciones de entrada según la estrategia de flat №8.
Implementación del asesor comercial según la estrategia:
void OnTick() { //--- Comprobando las órdenes abiertas anteriormente por el asesor experto if(!Trade.IsOpenedByMagic(Inp_MagicNum)) { //--- Obteniendo los datos para el cálculo if(!GetIndValue()) return; //--- Apertura de una orden al darse la señal de compra if(BuySignal()) Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); //--- Apertura de una orden al darse la señal de venta if(SellSignal()) Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); } } //+------------------------------------------------------------------+ //| Condiciones de compra | //+------------------------------------------------------------------+ bool BuySignal() { if(dc_low[0]>close[0] && ti[0]==0) { tp=dc_up[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Condiciones de venta | //+------------------------------------------------------------------+ bool SellSignal() { if(dc_up[0]<close[0] && ti[0]==0) { tp=dc_low[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Obteniendo los valores actuales de los indicadores | //+------------------------------------------------------------------+ bool GetIndValue() { return(CopyBuffer(InpInd_Handle1,0,0,2,dc_up)<=0 || CopyBuffer(InpInd_Handle1,1,0,2,dc_low)<=0 || CopyBuffer(InpInd_Handle2,0,0,2,ti)<=0 || CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0 )?false:true; } //+------------------------------------------------------------------+
Estrategia №9. Indicador ATR Channel y CCI Color Levels como filtro
ATR Channel basado en las desviaciones del indicador ATR respecto a la media móvil. CCI Color Levels es un CCI que representa en forma de histograma los valores umbral que representan señales de movimiento de precio. Lo usaremos como filtro de canal en estado de flat (cuando CCI se encuentra en el intervalo entre los valores umbral).
Parámetro | Descripción |
---|---|
Indicador utilizado | ATR Channel |
Indicador utilizado | CCI Color Levels |
Marco temporal | Cualquiera |
Condiciones de compra | Precio alcanzado en el borde inferior del canal y el valor de CCI Color Levels se encuentra en el intervalo entre los valores umbral |
Condiciones de venta | Precio alcanzado en el borde superior del canal y el valor de CCI Color Levels se encuentra en el intervalo entre los valores umbral |
Condiciones de salida | El precio alcanza el borde opuesto del canal |
En la fig. 11 se muestra cómo tiene lugar la entrada en el mercado. En ciertos casos, el precio sale de los límites del canal, sin embargo, el filtrado de la señal para encontrar el valor CCI en el intervalo indicado permite presuponer que el precio volverá al canal y alcanzará el take-profit establecido.
Fig. 11. Condiciones de entrada según la estrategia de flat №9.
El código del asesor según esta estrategia es el siguiente:
void OnTick() { //--- Comprobando las órdenes abiertas anteriormente por el asesor experto if(!Trade.IsOpenedByMagic(Inp_MagicNum)) { //--- Obteniendo los datos para el cálculo if(!GetIndValue()) return; //--- Apertura de una orden al darse la señal de compra if(BuySignal()) Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); //--- Apertura de una orden al darse la señal de venta if(SellSignal()) Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); } } //+------------------------------------------------------------------+ //| Condiciones de compra | //+------------------------------------------------------------------+ bool BuySignal() { if(atr_low[0]>close[0] && cci[0]<Inp_CCI_LevelUP && cci[0]>Inp_CCI_LevelDOWN) { tp=atr_up[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Condiciones de venta | //+------------------------------------------------------------------+ bool SellSignal() { if(atr_up[0]<close[0] && cci[0]<Inp_CCI_LevelUP && cci[0]>Inp_CCI_LevelDOWN) { tp=atr_low[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Obteniendo los valores actuales de los indicadores | //+------------------------------------------------------------------+ bool GetIndValue() { return(CopyBuffer(InpInd_Handle1,1,0,2,atr_up)<=0 || CopyBuffer(InpInd_Handle1,2,0,2,atr_low)<=0 || CopyBuffer(InpInd_Handle2,2,0,2,cci)<=0 || CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0 )?false:true; } //+------------------------------------------------------------------+
Estrategia №10. RSI en forma de histograma e indicador Flat como filtro
RSI en forma de histograma ha sido elegido para mayor visibilidad, porque la señal principal para la entrada en el mercado serán sus zonas de sobrecompra/sobreventa. El flat, a su vez, filtra las señales falsas.
Parámetro | Descripción |
---|---|
Indicador utilizado | RSI_Histogram |
Indicador utilizado | Flat |
Marco temporal | cualquiera |
Condiciones de compra | RSI se encuentra en la zona de sobreventa (por debajo del valor umbral) y Flat se encuentra en la zona de flat. |
Condiciones de venta | RSI se encuentra en la zona de sobrecompra (por encima del valor umbral) y Flat se encuentra en la zona de flat. |
Condiciones de salida | Take-profit/Stop-loss |
En la fig.12 se muestran de forma visual los puntos de entrada. La representación de RSI en forma de histograma hace más cómodo el monitoreo de las zonas de sobrecompra/sobreventa, así como la zona de flat del filtro Flat.
Fig. 12. Condiciones de entrada según la estrategia de flat №10.
La implementación del asesor comercial de la estrategia se muestra en la lista de abajo:
void OnTick() { //--- Comprobando las órdenes abiertas anteriormente por el asesor experto if(!Trade.IsOpenedByMagic(Inp_MagicNum)) { //--- Obteniendo los datos para el cálculo if(!GetIndValue()) return; //--- Apertura de una orden al darse la señal de compra if(BuySignal()) Trade.BuyPositionOpen(Symbol(),Inp_Lot,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment); //--- Apertura de una orden al darse la señal de venta if(SellSignal()) Trade.SellPositionOpen(Symbol(),Inp_Lot,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment); } } //+------------------------------------------------------------------+ //| Condiciones de compra | //+------------------------------------------------------------------+ bool BuySignal() { return(rsi[0]<Inp_LowLevel && fl[0]<Inp_FLowLevel)?true:false; } //+------------------------------------------------------------------+ //| Condiciones de venta | //+------------------------------------------------------------------+ bool SellSignal() { return(rsi[0]>Inp_HighLevel && fl[0]<Inp_FLowLevel)?true:false; } //+------------------------------------------------------------------+ //| Obteniendo los valores actuales de los indicadores | //+------------------------------------------------------------------+ bool GetIndValue() { return(CopyBuffer(InpInd_Handle1,0,0,2,rsi)<=0 || CopyBuffer(InpInd_Handle2,0,0,2,fl)<=0)?false:true; } //+------------------------------------------------------------------+
Simulación
Una vez hemos definido las 10 estrategias de flat y las hemos implementado en el código, elegiremos unas condiciones de simulación que sean lo más semejantes posibles.
- Intervalo: Último año.
- Pareja de divisas: EURUSD.
- Modo de comercio: Sin retrasos (Las estaretegias no se relacionan con las de alta precisión, por eso la influencia de los retrasos sería muy pequeña).
- Simulación: OHLC en М1 (La simulación preliminar con ticks reales ha resultado casi indistinguible de este modo).
- Depósito inicial: 1000 USD.
- Apalancamiento: 1:500.
- Servidor: MetaQuotes-Demo.
- Cotizaciones: de 5 dígitos.
Simulación de la estrategia №1 (Indicador Envelopes con filtro en forma de MFI)
Preinstalación:
input int Inp_StopLoss=500; //Stop Loss(points) //--- Parámetros del indicador MFI input ENUM_APPLIED_VOLUME Inp_applied_volume=VOLUME_TICK; // tipo de volumen MFI input int Inp_MFI_period=10; // periodo de MFI //--- Parámetros del indicador Envelopes input int Inp_ma_period=10; // periodo de la media Envelopes input ENUM_MA_METHOD Inp_ma_method=MODE_SMA; // tipo de suavizado de Envelopes input double Inp_deviation=0.1; // desviación de los límites con respecto a la media Envelopes
Resultado de la simulación:
Fig. 13. Resultados de la simulación de la estrategia de flat №1.
Simulación de la estrategia №2 (Indicador Bollinger Bands y dos Moving Average)
Preinstalación:
input int Inp_StopLoss=450; //Stop Loss(points) //--- Parámetros del indicador Bollinger Bands input int Inp_BBPeriod=14; //Periodo de BB input double Inp_deviation=2.0; //Desviación //--- Parámetros del indicador MA slow input int Inp_ma_period1=12; //Periodo de MA slow input ENUM_MA_METHOD Inp_ma_method1=MODE_SMMA; //Método de suavizado de MA slow //--- Parámetros del indicador MA fast input int Inp_ma_period2=2; //Periodo de MA fast input ENUM_MA_METHOD Inp_ma_method2=MODE_LWMA; //Método de suavizado de MA fast
Resultado de la simulación:
Fig. 14. Resultados de la simulación de la estrategia de flat №2.
Simulación de la estrategia №3 (WSO & WRO Channel con filtro en forma de Fractal Dimension Ehlers)
Preinstalación:
input int Inp_StopLoss=500; //Stop Loss(points) //--- Parámetros del indicador WSO & WRO Channel input int Inp_WsoWroPeriod=16; //Periodo de Wso & Wro Channel //--- Parámetros del indicador Fractal Dimension Ehlers input int Inp_FdiPeriod = 18; //Periodo de Fractal dimension input double Inp_FdiThreshold = 1.4; //Umbral de Fractal dimension input ENUM_APPLIED_PRICE Inp_Price = PRICE_CLOSE; //Precio aplicado
Resultado de la simulación:
Fig. 15. Resultados de la simulación de la estrategia de flat №3.
Simulación de la estrategia №4 (Indicador Percentage Crossover Channel y TrendRange como filtro)
Preinstalación:
input int Inp_StopLoss=500; //Stop Loss(points) //--- Parámetros del indicador Percentage_Crossover_Channel input double Inp_Percent=26.0; //Porcentaje de la distancia límite input ENUM_APPLIED_PRICE Inp_Price=PRICE_CLOSE; //Precio aplicado //--- Parámetros del indicador Trend Range input uint Inp_PeriodTR = 14; //Periodo de Trend Range input ENUM_MA_METHOD Inp_Method = MODE_EMA; //Método de suavizado input double Inp_Deviation = 1.0; //Desviación
Resultado de la simulación:
Fig.16. Resultados de la simulación de la estrategia de flat №4.
Simulación de la estrategia №5 (Indicador Price Channel y RBVI como filtro)
Preinstalación:
input int Inp_StopLoss=450; //Stop Loss(points) //--- Parámetros del indicador Price Channel input int Inp_ChannelPeriod=12; //Period //--- Parámetros del indicador RBVI input int Inp_RBVIPeriod=5; //periodo RBVI input ENUM_APPLIED_VOLUME Inp_VolumeType=VOLUME_TICK; //volumen input double Inp_level=40; //nivel de flat
Resultado de la simulación:
Fig. 17. Resultados de la simulación de la estrategia de flat №5.
Simulación de la estrategia №6 (Indicador Williams Percent Range y ADX como filtro)
Preinstalación:
input int Inp_StopLoss=50; //Stop Loss(points) input int Inp_TakeProfit=50; //Take Profit(points) //--- Parámetros del indicador WPR input int Inp_WPRPeriod=10; //Period WPR //--- Parámetros del indicador ADX input int Inp_ADXPeriod=14; //Period ADX input int Inp_FlatLevel=40; //Flat Level ADX
Resultado de la simulación:
Fig. 18. Resultados de la simulación de la estrategia de flat №6.
Simulación de la estrategia №7 (Canal de Keltner modificado e indicador Magic Trend como filtro)
Preinstalación:
input int Inp_SmoothCenter = 11; // Number of the periods to smooth the center line input int Inp_SmoothDeviation = 12; // Number of periods to smooth deviation input double Inp_F = 1.0; // Factor which is used to apply the deviation input ENUM_APPLIED_PRICE Inp_AppliedPrice = PRICE_CLOSE; // The center line applied price: input ENUM_MA_METHOD Inp_MethodSmoothing = MODE_SMA; // The center line smoothing method input ENUM_METHOD_VARIATION Inp_MethodVariation = METHOD_HL; // Variation Method //--- Parámetros del indicador Magic Trend input uint Inp_PeriodCCI = 60; // CCI period input uint Inp_PeriodATR = 5; // ATR period
Resultado de la simulación:
Fig. 19. Resultados de la simulación de la estrategia de flat №7.
Simulación de la estrategia №8 (Canal Donchian con confirmación del indicador Trinity Impulse)
Preinstalación:
input int Inp_StopLoss=500; //Stop Loss(points) //--- Parámetros del indicador de canal Donchian input int Inp_ChannelPeriod=12; //Doncian period //--- Parámetros del indicador Trinity Impulse input int Inp_Period= 5; //Indicator period input int Inp_Level= 34; //Smoothing level input ENUM_MA_METHOD Inp_Type=MODE_LWMA; //Averaging type input ENUM_APPLIED_PRICE Inp_Price=PRICE_WEIGHTED; //Price input ENUM_APPLIED_VOLUME Inp_Volume=VOLUME_TICK; //Volume type
Resultado de la simulación:
Fig. 20. Resultados de la simulación de la estrategia de flat №8.
Simulación de la estrategia №9 (Indicador ATR Channel y CCI Color Levels como filtro)
Preinstalación:
//--- Parámetros del indicador ATR Channel input ENUM_MA_METHOD Inp_MA_Method=MODE_SMA; //MA smoothing method input uint Inp_MA_Period=10; //MA period input uint Inp_ATR_Period=12; //ATR period input double Inp_Factor=1.5; //Number of deviations input ENUM_APPLIED_PRICE Inp_IPC=PRICE_LOW; //Applied price input int Inp_Shift=0; //Horizontal shift of the indicator in bars //--- Parámetros del indicador CCI Color Levels input int Inp_CCI_ma_period = 14; // Averaging period input double Inp_CCI_LevelUP = 90; // Level UP input double Inp_CCI_LevelDOWN =-90; // Level DOWN
Resultado de la simulación:
Fig. 21. Resultados de la simulación de la estrategia de flat №9.
Simulación de la estrategia №10 (RSI en forma de histograma e indicador Flat como filtro)
Preinstalación:
//--- Parámetros del indicador RSI Histogram input uint Inp_RSIPeriod=12; // periodo del indicador input ENUM_APPLIED_PRICE Inp_RSIPrice=PRICE_CLOSE; // precio input uint Inp_HighLevel=60; // nivel de sobrecompra input uint Inp_LowLevel=40; // nivel de sobreventa input int Inp_Shift=0; // desplazamiento horizontal del indicador en barras //--- Parámetros del indicador Flat input uint Inp_Smooth=10; // Smoothing period input ENUM_MA_METHOD Inp_ma_method=MODE_SMA; // Smoothing type input ENUM_APPLIED_PRICE Inp_applied_price=PRICE_CLOSE; // Price type input uint Inp_HLRef=100; input int Inp_FShift=0; // Horizontal shift of the indicator in bars input uint Inp_ExtraHighLevel=70; // Maximum trend level input uint Inp_FHighLevel=50; // Strong trend level input uint Inp_FLowLevel=30; // Weak trend level
Resultado de la simulación:
Fig. 22. Resultados de la simulación de la estrategia de flat №10.
Conclusiones sobre la comparativa
Según los resultados de la simulación y optimización de las estrategias de flat presentadas, podemos hacer las siguientes observaciones.
- La mayoría de las estrategias se ha construido en un sistema comercial de canal con filtrado de señales, esto significa que su principal defecto es la ruptura momentánea del canal.
- La simulación con marcos temporales demasiado pequeños o demasiado grandes ha conllevado pérdidas relacionadas con la activación frecuente de las condiciones de entrada en el mercado, o bien con un carácter demasiado selectivo, respectivamente.
- Al optimizar con la misma pareja de divisas y el mismo periodo, no se han detectado desviaciones especiales en la obtención de beneficios. Estos han resultado de un orden más o menos semejante en todas las estrategias.
En relación con ello, podemos sacar la siguiente conclusión general: a pesar de que se han seleccionado diversos sistemas de construcción del canal y su filtrado, las ventajas y desventajas de todas las estrategias han resultado similares.
Conclusión
Más abajo se muestra un recuadro que reúne los nombres de los expertos desarrollados y utilizados en el artículo, así como las clases auxiliares y la lista de los indicadores usados en las estrategias de tendencia actuales. Al final del artículo se adjunta un fichero con todos los archivos enumerados, clasificados por carpetas. Por eso, para que funcione correctamente, basta con colocar la carpeta MQL5 en la carpeta raíz del terminal.
Programas usados en el artículo:
# |
Nombre |
Tipo |
Descripción |
---|---|---|---|
1 |
Strategy_1.mq5 |
Experto |
Estrategia №1. Indicador Envelopes con filtro en forma de MFI |
2 |
Strategy_2.mql5 |
Experto |
Estrategia №2. Indicador Bollinger Bands y dos Moving Average |
3 |
Strategy_3.mq5 |
Experto | Estrategia №3. WSO & WRO Channel con filtro en forma de Fractal Dimension Ehlers |
4 |
Strategy_4.mq5 |
Experto |
Estrategia №4. Indicador Percentage Crossover Channel y TrendRange como filtro. |
5 |
Strategy_5.mq5 | Experto | Estrategia №5. Indicador Price Channel y RBVI como filtro. |
6 |
Strategy_6.mq5 |
Experto |
Estrategia №6. Indicador Williams Percent Range y ADX como filtro. |
7 | Strategy_7.mq5 |
Experto |
Estrategia №7. Canal de Keltner modificado e indicador Magic Trend como filtro. |
8 | Strategy_8.mq5 | Experto | Estrategia №8. Canal Donchian con confirmación del indicador Trinity Impulse. |
9 | Strategy_9.mq5 | Experto | Estrategia №9. Indicador ATR Channel y CCI Color Levels como filtro. |
10 | Strategy_10.mq5 | Experto | Estrategia №10 RSI en forma de histograma e indicador Flat como filtro |
11 | Trade.mqh | Biblioteca | Clase de funciones comerciales. |
13 | wwc.mq5 | Indicador | Se usa en la Estrategia №3. |
14 | fdi.mq5 | Indicador | Se usa en la Estrategia №3. |
15 | pcc.mq5 | Indicador | Se usa en la Estrategia №4. |
16 | trend_range.mq5 | Indicador | Se usa en la Estrategia №4. |
17 | price_channel.mq5 | Indicador | Se usa en la Estrategia №5. |
18 | rbvi.mq5 | Indicador | Se usa en la Estrategia №5. |
19 | customizable _keltner.mq5 | Indicador | Se usa en la Estrategia №7. |
20 | magic_trend.mq5 | Indicador | Se usa en la Estrategia №7. |
21 | donchian_channel.mq5 | Indicador | Se usa en la Estrategia №8. |
22 | trinity_impulse.mq5 | Indicador | Se usa en la Estrategia №8. |
23 | atr_channel.mq5 | Indicador | Se usa en la Estrategia №9. |
24 | cci_color_levels.mq5 | Indicador | Se usa en la Estrategia №9. |
25 | rsi_histogram.mq5 | Indicador | Se usa en la Estrategia №10. |
26 | flat.mq5 | Indicador | Se usa en la Estrategia №10. |
Traducción del ruso hecha por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/ru/articles/4534





- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso