English Русский 中文 Deutsch 日本語 Português
Análisis comparativo de 10 estrategias de flat

Análisis comparativo de 10 estrategias de flat

MetaTrader 5Sistemas comerciales | 24 septiembre 2018, 09:29
8 828 0
Alexander Fedosov
Alexander Fedosov

Contenido

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

Archivos adjuntos |
10Flat.zip (60.96 KB)
950 sitios web transmiten el calendario económico de MetaQuotes 950 sitios web transmiten el calendario económico de MetaQuotes
La adición del widget proporciona a los sitios web un horario de publicación detallado de 500 índices e indicadores de las mayores economías mundiales. De esta forma, los tráders, aparte del contenido principal del sitio web, reciben de manera operativa información actual sobre todos los eventos importantes, complementada con explicaciones y gráficos.
Experto comercial con interfaz gráfica: Llenando la funcionalidad (Parte II) Experto comercial con interfaz gráfica: Llenando la funcionalidad (Parte II)
Tiene ante usted la segunda parte del artículo sobre la creación de un experto de señal multisímbolo para el comercio manual. Ya hemos creado la interfaz gráfica. En esta parte del artículo hablaremos sobre cómo conectar dicha interfaz con la funcionalidad del programa necesario.
Representación personalizada de la historia comercial y creación de gráficos para los informes Representación personalizada de la historia comercial y creación de gráficos para los informes
En el artículo se describen varios métodos personalizados de valoración de la historia comercial. Para ello, se describen dos clases para su descarga y análisis. La primera reúne la historia comercial en un breve recuadro. El segundo se ha pensado para los cálculos estadísticos: calcula una serie de índices y construye los gráficos con cuya ayuda se valora el rendimiento de las transacciones de forma más cómoda.
14 000 robots comerciales en MetaTrader Market 14 000 robots comerciales en MetaTrader Market
En la mayor tienda de aplicaciones comerciales ya tiene a su disposición 13 970 productos. Entre ellos, encontrará 4 800 robots, 6 500 indicadores, 2 400 utilidades y otras soluciones. En este caso, además, la mitad de las aplicaciones (6 000) se pueden alquilar. Una cuarta parte del total de los productos (3 800) es de acceso gratuito.