Simulación de patrones de parejas de divisas: Uso y perspectivas para el trading real. Parte IV

25 junio 2018, 10:25
Andrei Novichkov
0
3 117

Introducción

Este artículo finaliza el estudio de la simulación de los patrones que surgen cuando comerciamos con las cestas de parejas de divisas, que empezamos aquí. Lo único que nos queda es analizar el patrón restante, es decir, el patrón de la intersección de la media móvil por el gráfico del indicador.

Antes, ya hemos analizado este patrón, pero considerando unas determinadas condiciones:

  • El trader recibe una señal para entrar en el cierre de la vela, cuando el gráfico del indicador combinado de una de las cestas de parejas de divisas se cruza por su propia media móvil. En total, hay dos señales de este tipo: cuando la media móvil cruza el gráfico de arriba abajo (venta) y cuando lo cruza de abajo arriba (compra).

Hemos aclarado que la propiedad positiva de este patrón es una gran cantidad de señales. La desventaja consiste en la necesidad de una filtración adicional.

Ahora, propongo simular este patrón en el gráfico de la diferencia entre los valores del indicador combinado para dos cestas: según la divisa base y la divisa de cotización (para más información, siga este enlace). El uso de dos cestas de parejas de divisas en vez de una puede servir del factor de filtración adicional.

Aparte de eso, en la segunda parte del artículo, hablaremos en detalle de la aplicación de todos los conocimientos obtenidos en el comercio real.

Patrón para las investigaciones

Recordaremos el requerimiento principal para el patrón: la ruptura de la media móvil por el gráfico del indicador combinado tiene que ser clara y evidente.

Patrón «bueno», el que que se busca (señal)
Sin patrón, una señal «mala»




Aquí, la línea verde es el gráfico del indicador combinado, la línea rosada es su media móvil.

Para una identificación unívoca del patrón es necesario que la distancia entre el gráfico del indicador combinado y la media móvil —antes y después del momento de la ruptura— no sea menos de la establecida (Delta1 y Delta2), en la imagen izquierda. Es evidente que en la imagen derecha, en el intervalo limitado con líneas verticales, esta condición no se cumple, por eso no vemos ningún patrón.

En las investigaciones posteriores, comprobaremos cómo se puede usar los patrones análogos a la imagen izquierda como señales de entrada. La aparición del mismo patrón pero con dirección opuesta nos puede servir de la señal de salida. No obstante, está táctica supone la presencia constante en el mercado, y es poco probable que eso traerá un resultado positivo. Por eso, la detección de los patrones «malos» puede ser propuesta como señales de salida: eso supone que las órdenes van a cerrarse sin que se abran las nuevas.

Herramientas para investigaciones

Ya disponemos de todas las herramientas. Las hemos creado en los artículos anteriores. Aunque el código casi no se ha cambiado, lo vamos a mostrar aquí. El Asesor Experto testEAbasket3.mq5 se usa como el principal:

//+------------------------------------------------------------------+
//|                                                 testEAbasket.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Trade\\Trade.mqh>


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
enum BSTATE
  {
   BCLOSE = 0,
   BBUY   = 1,
   BSELL  = 2
  };
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
input int wpr = 20;
input int ma  = 10;
input double lt=0.01; 

int h;
ulong  Ticket;

double m[1],ml;
double w[1],wl;

BSTATE g_state;

double g_dMinSize = 2.0;
double g_dMaxSize = 50.0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   h=iCustom(NULL,0,"testWPR&MA3",wpr,ma);
   if(h==INVALID_HANDLE) 
     {
      Print("Error while creating testWPR&MA3");
      return (INIT_FAILED);
     }

   g_state=BCLOSE;
   EventSetTimer(1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease(h);
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(IsNewCandle())
     {
      wl=w[0];
      CopyBuffer(h,0,1,1,w);
      ml=m[0];
      CopyBuffer(h,1,1,1,m);
      double d1 = MathAbs(w[0] - m[0]);
      double d2 = MathAbs(ml - wl);
      if(w[0]>m[0] && wl<ml) 
        {
         if(g_state!=BCLOSE) CloseAllPos();
         if(d1 >= g_dMinSize && d2 >= g_dMinSize &&
            d1 <= g_dMaxSize && d2 <= g_dMaxSize) 
           {
            EnterBuy(lt);
            g_state=BBUY;
           }
        }
      if(w[0]<m[0] && wl>ml) 
        {
         if(g_state!=BCLOSE) CloseAllPos();
         if(d1 >= g_dMinSize && d2 >= g_dMinSize &&
            d1 <= g_dMaxSize && d2 <= g_dMaxSize) 
           {
            EnterSell(lt);
            g_state=BSELL;
           }
        }
     }
  }
//+------------------------------------------------------------------+

void CloseAllPos()
  {

   CTrade Trade;
   Trade.LogLevel(LOG_LEVEL_NO);
   Trade.PositionClose(Ticket);
   g_state=BCLOSE;

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void EnterBuy(double lot)
  {

   CTrade Trade;
   Trade.LogLevel(LOG_LEVEL_NO);
   Trade.Buy(lot,_Symbol);
   Ticket=Trade.ResultDeal();
   g_state=BBUY;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void EnterSell(double lot)
  {

   CTrade Trade;
   Trade.LogLevel(LOG_LEVEL_NO);
   Trade.Sell(lot,_Symbol);
   Ticket=Trade.ResultDeal();
   g_state=BSELL;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsNewCandle()
  {
   static int candle=-1;
          int t1=0;
   switch(_Period)
     {
      case PERIOD_H1:  t1 = Hour();   break;
      case PERIOD_H4:  t1 = Hour4();  break;
      case PERIOD_D1:  t1 = Day();    break;
     }
     
   if(t1!=candle) {candle=t1; return(true);}
   return (false);
  }
            
  int Hour4(){return((int)Hour()/4);}

int Day()
  {
   MqlDateTime tm;
   TimeCurrent(tm);
   return(tm.day);
  }

int Hour()
  {
   MqlDateTime tm;
   TimeCurrent(tm);
   return(tm.hour);
  }

Representa una versión del EA testEAbasket.mq5 desde este artículo, modificada para entrar en una pareja de divisas, en vez de la cesta entera de divisas. El EA utiliza los datos del indicador personalizado testWPR&MA3.mq5, que representa una versión del indicador testWPR&MA.mq5 desde este artículo:

//+------------------------------------------------------------------+
//|                                                      testWPR.mq5 |
//|                                        MetaQuotes Software Corp. |
//|                                               http://fxstill.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_minimum -100
#property indicator_maximum 100


#property indicator_buffers 2
#property indicator_plots   2

input int WPR       = 20; //Period WPR
input int maperiod  = 10; //Period MA
input color   clr   = clrGreen;
input color   clrMA = clrMagenta;


int h,h1;
double ind[],ma[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
      h = iCustom(NULL,0,"testWPReur",WPR);
      if (h == INVALID_HANDLE) {
         Print("Error while creating testWPR");
         return (INIT_FAILED);
      }
      h1 = iCustom(NULL,0,"testWPRusd",WPR);
      if (h1 == INVALID_HANDLE) {
         Print("Error while creating testWPR");
         return (INIT_FAILED);
      }  
 

   IndicatorSetString(INDICATOR_SHORTNAME,"testWPRusd");
   IndicatorSetInteger(INDICATOR_DIGITS,2);
   IndicatorSetInteger(INDICATOR_LEVELS,2);
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,0,STYLE_SOLID);
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,1,STYLE_SOLID);
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrRed);
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrRed);
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,0,1);
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,1,1);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-60);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,60);

   ArraySetAsSeries(ind,true);
   SetIndexBuffer(0,ind);
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID);
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,2);
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,clr);
   PlotIndexSetString(0,PLOT_LABEL,"_tstWPRusd_");

   ArraySetAsSeries(ma,true);
   SetIndexBuffer(1,ma);
   PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE);
   PlotIndexSetInteger(1,PLOT_LINE_STYLE,STYLE_SOLID);
   PlotIndexSetInteger(1,PLOT_LINE_WIDTH,1);
   PlotIndexSetInteger(1,PLOT_LINE_COLOR,clrMA);
   PlotIndexSetString(1,PLOT_LABEL,"Middle_Basket_line_MA");


//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double GetValue(int shift)
  {
   double dBuf[1], dBuf1[1];
   double res=0.0;
   CopyBuffer(h,0,shift,1,dBuf);
   CopyBuffer(h1,0,shift,1,dBuf1);
   return (NormalizeDouble((dBuf[0] - dBuf1[0])/2, _Digits) );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   if(prev_calculated==0 || rates_total>prev_calculated+1)
     {
      int rt=rates_total-WPR;
      for(int i=1; i<rt; i++)
        {
         ind[i]=GetValue(i);
        }
      rt-=maperiod;
      for(int i=1; i<rt; i++)
        {
         ma[i]=GetMA(ind,i,maperiod,_Digits);
        }
     }
   else
     {
         ind[0] = GetValue(0);
         ma[0]  = GetMA(ind, 0, maperiod, _Digits);        
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

void OnDeinit(const int reason)
  {
      if(h!=INVALID_HANDLE) IndicatorRelease(h);
      if(h1!=INVALID_HANDLE) IndicatorRelease(h1);
  }
//+------------------------------------------------------------------+

double GetMA(const double &arr[],int index,int period,int digit) 
  {
   double m=0;
   for(int j=0; j<period; j++) m+=arr[index+j];
   m/=period;
   return (NormalizeDouble(m,digit));
  }
//+------------------------------------------------------------------+

El indicador ha sido modificado al mínimo para corresponder a las condiciones de la identificación del patrón descritas más arriba. Todas las herramientas utilizadas se encuentran en el fichero anexo test.zip.

Antes, estas investigaciones se empezaban con la definición del número potencial de entradas en el mercado. Aquí, no vamos a hacer eso, ya que nuestra experiencia de la simulaión de los patrones similares predice que el número de las transacciones será más que suficiente.

Antes de empezar la simulación, especificaremos la forma del patrón. Hemos dedicado bastante tiempo a esta cuestión, a saber, a los valores determinados de los parámetros Delta1 y Delta2. Estos valores ya han sido encontrados, y como resultado, ha aparecido una filtración restricta de las señales de entrada en el mercado. Aquí, vamos a aflojar un poco las limitaciones. Eso aumentará el número de las entradas sin perjudicar el principio en el que se basa el patrón: Delta1 y Delta2 no tienen que ser menos de 2% y no más de 50%.

Eligiremos una de dos estrategias de la simulación.

  • Presencia constante en el mercado. El trader entra en el mercado usando la señal, y espera la señal de entrada en la dirección opuesta. Luego, cierra las órdenes abiertas, entra en la dirección opuesta, etc. No vamos a usar esta estrategia, ya que ha demostrado que no es rentable.
  • Salida del mercado sin abrir órdenes nuevas. El trader entra en el mercado usando la señal, y espera la señal de salida cuyo papel desempeña el patrón «malo». No da señales de entrada, pero avisa sobre una posible ralentización de la tendencia y su reversión. Vamos a usar esta estrategia durante la simulación.

Y por último, aclararemos con el marco temporal (timeframe). En los artículos anteriores, probabamos el patrón en H1, H4 y D1. Pero habían muy pocas transacciones en D1, por eso, no vamos a simular el patrón en este timeframe. Usaremos sólo H1 y H4, empezando la simulación con EURUSD.

Simulación del patrón

Después de la simulación en las cotizaciones del último año en H1, obtenemos los siguientes resultados:

En timeframe H4:

Igual como en las pruebas anteriores, hemos obtenido las pérdidas en H1 y las ganancias en H4.

Vamos a probar el patrón en todas las parejas de divisas principales: EURUSD, GBPUSD, AUDUSD, NZDUSD, USDCAD, USDCHF, USDJPY.

No hemos visto las sorpresas durante esta simulación, el resultado es parecido a los datos obtenidos antes: resultados prometedores en H4 y pérdidas en H1. Los informes sobre la simulación se encuentran en el fichero adjunto testhtml.zip.

Ya tenemos la experiencia de aumentar el beneficio usando la filtración adicional de las señales de entrada. Usamos el segundo filtro que ha sido aplicado en este artículo:

  • El trader NO va a comprar si el gráfico de WPR combinado ha tocado o ha roto el límite de sobrecompra de abajo arriba.
  • El trader NO va a vender si el gráfico de WPR combinado ha tocado o ha roto el límite de sobreventa de arriba abajo.

El código módificado del EA se encuentra en el archivo adjunto test1.zip. No voy a mostrarlo aquí completamente ya que casi repite el código mostrado antes. Mostraré sólo la función que identifica el patrón:

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(IsNewCandle())
     {
      wl=w[0];
      CopyBuffer(h,0,1,1,w);
      ml=m[0];
      CopyBuffer(h,1,1,1,m);
      double d1 = MathAbs(w[0] - m[0]);
      double d2 = MathAbs(ml - wl);
      if(w[0]>m[0] && wl<ml) 
        {
         if(g_state!=BCLOSE) CloseAllPos();
         if(d1 >= g_dMinSize && d2 >= g_dMinSize &&
            d1 <= g_dMaxSize && d2 <= g_dMaxSize && w[0] < 60) 
           {
            EnterBuy(lt);
            g_state=BBUY;
           }
        }
      if(w[0]<m[0] && wl>ml) 
        {
         if(g_state!=BCLOSE) CloseAllPos();
         if(d1 >= g_dMinSize && d2 >= g_dMinSize &&
            d1 <= g_dMaxSize && d2 <= g_dMaxSize && w[0] > -60) 
           {
            EnterSell(lt);
            g_state=BSELL;
           }
        }
     }
  }
//+------------------------------------------------------------------+

Surge la pregunta, ¿donde van a encontrarse los niveles de sobrecompra y sobreventa? En los artículos anteriores, hemos mostrado que se puede reducir un poco los valores estándar del indicador combinado a base del WPR para las condiciones de simulación (+60 el nivel de sobrecompra y -60 el nivel de sobreventa). Aparte de la opción con los valores estándar, vamos a probar los valores +50% y -50% para los niveles de sobrecompra y sobreventa, respectivamente. Los informes sobre la prueba para EURUSD en H1 y H4 se encuentran en los archivos testhtml50.zip y testhtml60.zip.

Vemos que no se diferencian prácticamente de dos primeras pruebas mostradas antes. Eso concuerda con los resultados desde el artículo anteriores, dedicado a la simulación de este patrón. Aquel entonces, esta filtración tampoco dio resultados importantes.  Por eso no vamos a probar este patrón en las demás parejas, pasaremos directamente a la parte final: su uso como filtro.

Recordaremos la idea de la situación.

  • El gráfico del WPR combinado rompe el nivel de sobreventa de abajo arriba. La ruptura se registra en el cierre de la vela. El trader entra en el mercado para la compra sólo en el caso si la media móvil se encuentra «por debajo» del gráfico del indicador combinado.
  • Para entrar en el mercado con la venta, la situación tiene que ser diametralmente contraria que en el punto anterior.
  • El trader sale del mercado cuando el WPR combinado llega a 0%.

Para la simulación usamos el EA testEAbasket5.mq5:

//+------------------------------------------------------------------+
//|                                                 testEAbasket.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Trade\\Trade.mqh>



enum BSTATE
  {
   BCLOSE = 0,
   BBUY   = 1,
   BSELL  = 2
  };
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
input int wpr = 20;
input int ma  = 10;
input double lt=0.01; //lot

int SELLPROFIT =   0;
int SELL1LIMIT =  50;
int SELL2FROM  =  40;
int SELL2TO    =  20;
int BUYPROFIT  =   0;
int BUY1LIMIT  = -50;
int BUY2FROM   = -40;
int BUY2TO     = -20;


int h;
ulong  Ticket;

double m[1],ml;
double w[1],wl;

BSTATE g_state;

double g_dMinSize = 2.0;
double g_dMaxSize = 50.0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   h=iCustom(NULL,0,"testWPR&MA3",wpr,ma);
   if(h==INVALID_HANDLE) 
     {
      Print("Error while creating testWPR&MA3");
      return (INIT_FAILED);
     }

   g_state=BCLOSE;
   EventSetTimer(1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease(h);
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(IsNewCandle())
     {
      wl=w[0];
      CopyBuffer(h,0,1,1,w);
      ml=m[0];
      CopyBuffer(h,1,1,1,m);


      if(g_state==BBUY && (w[0]>=BUYPROFIT))
        {
         CloseAllPos();
        }
      if(g_state==BSELL && (w[0]<=SELLPROFIT))
        {
         CloseAllPos();
        }
      if(g_state==BCLOSE && w[0]>=BUY2FROM && w[0]<=BUY2TO && wl<=BUY1LIMIT && w[0] > m[0])
        {
            EnterBuy(lt);
            return;        
        }
        
 
      if(g_state==BCLOSE && w[0]<=SELL2FROM && w[0]>=SELL2TO && wl>=SELL1LIMIT && w[0] < m[0])
        {
            EnterSell(lt);
            return;        
        }
     }
  }
//+------------------------------------------------------------------+

void CloseAllPos()
  {

   CTrade Trade;
   Trade.LogLevel(LOG_LEVEL_NO);
   Trade.PositionClose(Ticket);
   g_state=BCLOSE;

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void EnterBuy(double lot)
  {

   CTrade Trade;
   Trade.LogLevel(LOG_LEVEL_NO);
   Trade.Buy(lot,_Symbol);
   Ticket=Trade.ResultDeal();
   g_state=BBUY;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void EnterSell(double lot)
  {

   CTrade Trade;
   Trade.LogLevel(LOG_LEVEL_NO);
   Trade.Sell(lot,_Symbol);
   Ticket=Trade.ResultDeal();
   g_state=BSELL;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsNewCandle()
  {
   static int candle=-1;
          int t1=0;
   switch(_Period)
     {
      case PERIOD_H1:  t1 = Hour();   break;
      case PERIOD_H4:  t1 = Hour4();  break;
      case PERIOD_D1:  t1 = Day();    break;
     }
     
   if(t1!=candle) {candle=t1; return(true);}
   return (false);
  }
            
  int Hour4(){return((int)Hour()/4);}

int Day()
  {
   MqlDateTime tm;
   TimeCurrent(tm);
   return(tm.day);
  }

int Hour()
  {
   MqlDateTime tm;
   TimeCurrent(tm);
   return(tm.hour);
  }

La simulación se empieza como antes en EURUSD y en H1 y H4.

Resultudas en timeframe H1:

En timeframe H4:

Se observa una cantidad de transacciones no muy grande. Ya discutimos este caso, e incluso supusimos sus razones. En el resto de las parejas, la cantidad de tranzacciones puede ser aún menor. Por eso, terminamos la simulación y pasamos a las conclusciones.

Resultados de las investigaciones

  1. Hemos conocido la tecnología del trading con el uso de las cestas de parejas de divisas. Hemos demostrado los principios y conceptos generales, modos de ejecución de los calculos principales.
  2. Han sido descritos algunos patrones simples que surgen al comerciar con cestas de parejas de divisas.
  3. Hemos considerado de paso las construcciones más complejas en cuanto al uso de las cestas, a saber: el uso simultáneo de los indicadores construidos especialmente para trabajar con las cestas de parejas de divisas e indicadores técnicos estádar; el uso simultáneo de osciladores e indicadores de tendencia.
  4. La utilidad de los patrones encontrados ha sido comprobada en el Probador de Estrategias.

Hemos obtenido una herramienta que permite analizar el mercado de una manera nueva, argumentada y lógica. Pero la simulación de los patrones no ha demostrado unos resultados convincentes. ¿Pero qué otra cosa podíamos esperar? Es que los axiomas del trading declaran que para tomar una decisión sobre la entrada, hacen falta varias señales, mientras que nosotros tomábamos esta decisión a base de un patrón. La experiencia nos dice que es muy arriesgado negociar basándose en los patrones simples (por ejemplo, en la intersección de la media simple por el gráfico). No obstante, hemos usado precisamente los patrones simples.

A pesar de eso, hemos obtenido resultados prometedores en algunas ocasiones. Además, hay que recordar que obtener un EA rentable no era nuestro objetivo. Queríamos obtener una señal argumentada para combinarla con las demás, y tomar decisiones a base de eso.

Vamos a evaluar las perspectivas, marcaremos posibles opciones para aplicar la tecnología descrita en la práctica habitual y el trading automático.

Perspectivas y aplicación en el trading real

Trabajando en este tema, es imposible contentarse con los indicadores de prueba y Asesores Expertos. Necesitamos los ejemplos del uso de las herramientas que trabajan de forma estable. Algunos de ellos ya existen en el Market, otros aparecerán ahí pronto. En este artículo, mostraré sólo los ejemplos del trabajo de estos programas sin especificar sus nombres reales. 

El tema del uso de los patrones de cestas es muy amplio. Nuevas técnicas, metodologías y esquemas del trading aparecen y van a aparecer cada día. Es imposible meterlos en un solo artículo. Pero se puede completarlo haciendo adiciones en forma de comentarios, capturas de pantalla y plantillas. Mi blog ya contiene algunas cosas respecto a este tema. Vos a seguir completando este array de información.

Entrada y salida en detalles

Analizaremos los detalles de la entrada y salida del mercado en NZDUSD, H1. El indicador combinado ha detectado una señal para entrar en la compra que ha resultado rentable (línea azul vertical).



A la izquierda, se muestra el gráfico de la diferencia entre los valores del indicador combinado para la cesta de divisa base y de la divisa de cotización. La «pseudofórmula» de este indicador se podría escribir así:

Indicador (NZDUSD) = Indicador (NZD) — Indicador (USD)

Admitamos que esta forma de visualización es predefinida para todos los indicadores combinados en adelante, si no se especifica aparte.

Posibles variantes de la entrada.

  1. La línea roja inferior horizontal es el nivel de sobreventa. Vemos que primero se forma el patrón de rotura de este nivel por el gráfico del indicador. Este sitio está marcado con la línea verde vertical, el patrón se identifica cuando se abre la vela №1. En este sitio ya se puede abrir la orden de compra, porque la tendencia bajista ya ha agotado sus posibilidades y empieza a dar la vuelta. El trader capta el principio de este movimiento y tiene la posibilidad de «coger» la tendencia alcista entera. Ya hemos probado este patrón. Es bastante arriesgado y no se encuentra con mucha frecuencia. El riesgo está relacionado con el hecho de que la tendencia bajista puede continuar después de la corrección. En este caso, el trader puede sufrir pérdidas, pero no muy grandes. Aquí, se podría usar el Stop Loss «corto».
  2. Pero en la captura de pantalla, podemos observar que la nueva tendencia alcista empieza a coger fuerza. Se forma un nuevo patrón (la ruptura de la media móvil por el gráfico del indicador). Es una buena señal-filtro después de la ruptura del nivel de sobreventa. Reduce el riesgo de la continuación de la tendencia bajista. El patrón también está marcado con una línea vertical verde y puede ser identificado cuando se abre la vela №2. Se puede entrar en el mercado aquí. En cualquier caso, el Stop Loss tiene que ser mayor; por cuánto, será determinado por los parámetros de la media móvil.
  3. La tendencia alcista ha tomado la fuerza, y aparece un nuevo patrón (la ruptura de la media móvil «rápida» del gráfico por la media móvil «lenta»). Este patrón se identifica cuando se abre la vela №3. El riesgo será el mínimo, en comparación con dos casos anteriores. Pero el beneficio será menor, mientras que el Stop Loss será mayor. Nótese que la distancia entres las medias móviles se aumenta después de la detección del patrón. Eso significa la continuación y el aumento de la tendencia (una señal favorable para el trader). Mientras que la reducción de esta distancia indica en la ralentización y aflojamiento (la captura de pantalla de la izquierda).

Obsérvese que dos primeras variantes de la entrada con patrones son típicas para todos los tipos de osciladores y se conocen bien. El tercer patrón se conoce menos. También va a funcionar en todos los osciladores, y aquí se considera como ejemplo de la entrada en el mercado según una tendencia consolidada y desarrollada.

Los tres variantes de la entrada se basan en una potente señal inicial (ruptura del nivel de sobreventa). Pero la señal de este tipo es bastante rara. Vamos a analizarla brevemente otra vez.

  • La captura de pantalla de la derecha demuestra la situación cuando el gráfico del indicador aparece en la zona de sobreventa (sobrecompra). La zona necesaria está marcada con el rectángulo verde. En la ventana del indicador, el mismo indicador está marcado de otra manera: para la cesta NZD (línea azul claro) y USD (línea verde oscuro), por separado. Se puede observar que en algún momento la cesta USD ha resultado sobrecomprada y la cesta NZD se mantenía sobrevendida un bastante tiempo. La combinación simultánea de estos estados de las cestas crea la imagen como en la captura de pantalla de la izquierda —cuando el gráfico del indicador combinado para NZDUSD sale en la zona de sobrecompra con la ruptura posterior del nivel de sobrecompra y la vuelta de la tendencia.

Pero estas combinaciones favorables de los eventos ocurren con poca frecuencia. ¿Tendremos que esperar la señal semanas enteras? No es necesario. Se puede aceptar que los niveles de sobrecompra/sobreventa se encuentran en otros valores, un poco más pequeños. Cada pareja y cada timeframe pueden tener su propio valor. Pero parece que en la mayoría de los casos, se puede limitarse con los niveles +50% y -50%. Desde luego, eso aumentará el riesgo. Echamos un vistazo de nuevo a la imagen derecha. La nueva posición de niveles va a significar que una de dos cestas (o incluso ambas) no ha agotado todavía su movimiento. Entonces, puede continuar, y el trader arriesga entrar contra la tendencia. Por eso, el patrón №3, que supone la entrada por la tendencia, tiene un significado especial. Pero en este caso, también hay «escollos», es decir, la divergencia.



En la captura de pantalla derecha vemos que la MA alcista rápida rompe la lenta, cuando el propio indicador muestra el movimiento ascendiente. En la captura de pantalla izquierda observamos una divergencia: los gráficos del indicador y de la MA se mueven en direcciones opuestas. ¡La señal con divergencia, sin duda alguna, tiene que ser omitida! En mi Fuente de Noticias hay otros ejemplos de diferentes patrones con divergencia y sin ella.

Ahora hablaremos sobre diferentes modos de salir del mercado (cierre de órdenes).

Supongamos que el trader ha entrado en el mercado usando uno de los tres modos descritos. Puede orientarse a la señal de la dirección opuesta para cerrar las órdenes por completo o parcialmente o pasarlas al punto muerto (breakeven).

1. Por ejemplo, la entrada del indicador en la zona de sobreventa es un argumento de peso para cerrar las órdenes de compra o pasarlas al punto muerto (para las compras, lo contrario).

2. Cuando el trader tiene las órdenes abiertas, puede detectar una ruptura de la MA por el gráfico del indicador en la dirección opuesta a las órdenes abiertas antes.

3. El trader puede detectar la ralentización de la tendencia por la disminución de la distancia entre la media móvil rápida y la lenta.

4. Finalmente, la señal de cierre / pase al breakeven puede ser cuando el indicador alcance los valores que NO son los niveles de sobrecompra/sobreventa. Por ejemplo, eso puede ser el nivel 0%. Este nivel significa la «igualdad» de ambas cestas de divisas, y aquí el indicador suele «tropezarse». Entonces, este nivel representa la resistencia:

Los niveles de Fibonacci también pueden desempeñar este papel en los indicadores combinados. 

5. Y por último, el trader puede colocar el Stop Loss y Take Profit por sus razones, o bien, basándose en el análisis técnico.

Pues bien, hemos considerado los modos de apertura y de cierre de las órdenes. Ahora, pasamos a la búsqueda de los patrones en el gráfico y a su análisis.

Trabajo con indicadores combinados


Con el fin de identificar los patrones detectados, colocamos el indicador combinado en el gráfico y vemos los resultados. Este es el ejemplo durante el último tiempo para NZDUSD, H1 (el gráfico está partido en dos imágenes por causa de limitaciones del tamaño):


Preste atención en los lugares donde los patrones № 3 y 7 han sido detectados cerca de la salida de las zonas de sobrecompra/sobreventa. Aquí, no hay divergencia y se puede destacar un movimiento seguro del indicador hacia las ventas, inclusive el cruce del nivel nulo en la zona del indicador №3. Por otro lado, los movimientos en la zona del patrón N7 son evidentemente vacilantes. Al principio, un buen movimiento se ha disminuido, se ha retrocedido; el gráfico no ha atravesado el nivel cero y será capaz de rebotar de él (lo que estamos obseravdo).

El patrón №8 demuestra el rebote del nivel de sobreventa. El gráfico lo ha tocado, ha dado la vuelta y se ha dirigido con seguridad en la dirección de las compras, formando un patrón. El nivel cero ha sido pasado, se puede entrar en la compra. Pero el gráfico del indicador y el precio dan la vuelta y se van en dirección contraria. El trader tendrá la posibilidad de cerrar la orden más tarde con pérdidas mínimas, pero si no lo hace, la pérdida podrás ser bastante importante.

El patrón №6 no es muy prometedor, es que, el potencial del movimiento para la venta está prácticamente agotado, el nivel de sobreventa ha sido alcanzado. Existe el riesgo de una próxima reversión. Pero en la práctica, tenemos presente un movimiento lateral (flat) prolongado que prácticamente no trae beneficios. El movimiento descendiente se empieza de nuevo, pero mucho más tarde: ahí, el patrón puede ser considerado de desecho.

El patrón №5 es muy prometedor, con las condiciones semejantes con el № 6. Por eso, no merece la pena rechazar unívocamente los patrones que son encontrados por el indicador al alcance de las zonas de sobrecompra/sobreventa, cuando la tendencia puede continuar el movimiento en el momento de su detección.

El patrón №4 tampoco se mueve con seguridad en la zona del nivel cero, sin romperlo. No hay divergencia, el gráfico del indicador se mueve horizontalmente.

El patrón №2 es prometedor. El movimiento descendiente se ha disminuido y ha dado la vuelta, sin alcanzar el nivel cero. No hay divergencia, el gráfico todavía no ha alcanzado el nivel de sobreventa. Y aunque el indicador pasa al movimiento lateral, el patrón sigue trayendo un buen beneficio.

No vamos a analizar el patrón №1, es que, no sabemos lo que ha pasado antes de su formación.

Aparte de los patrones encontrados, merece la pena prestar atención en las zonas semejantes a las que están marcadas con la flecha azul. Es un movimiento potente desde el nivel de sobreventa hacia las compras, regular, con la ruptura del nivel cero y entrada en la zona de sobrecompra. El indicador no ha encontrado el patrón, aunque las ambas MAs han sido rotas. No hay ninguna divergencia. Desde luego, e trader debe considerar la cuestión sobre la entrada en el mercado, cuando el indicador ha roto el nivel cero: cuanto que esta ruptura coincide en el tiempo con la ruptura de la MA rápida por la lenta.

Obsérvese, nuestro modo del análisis es espinoso. Tiene bastantes dudas y ambigüedades.  Por lo menos, podríamos sufrir pérdidas una vez (o ha sido así). Para aumentar las posibilidades del análisis a través de los indicadores combinados, merece la pena acceder a la siguiente fase, al análisis «avanzado».


Trabajo avanzado con indicadores combinados

El uso de dos instancias de un indicador combinado en el mismo gráfico es de lo que hablaremos primero. Ya hemos mencionado oblicuamente esta posibilidad en el apartado anterior, ahora vamos a considerarla en detalle.

  • En el gráfico se encuentran dos instancias del indicador combinado, con los mismos ajustes pero con diferentes modos de visualización:
    1. Por defecto — ventana V1.
    2. Como dos gráficos separados para la cesta de divisa base y de la divisa de cotización (ventana V2).

Aquí se muestran los indicadores en USDCAD. En la ventana V2, la línea verde oscura dibuja el estado de la cesta USD, la naranja marca CAD.

El indicador ha encontrado dos patrones para entrar en la venta en la ventana V1 (№1 y №2). Se observa que en ambos casos no hay divergencia, y la entrada en el mercado puede ser rentable.

Echemos un vistazo a la ventana V2, patrón №1. Aquí se ve que la cesta CAD ha sido sobrecomprada y ahora se afloja, acercándose al nivel cero. La cesta USD también se aflojaba, saliendo de la sobrecompra. Pero luego, el aflojamiento se ha parado, ha pasado en el movimiento horizontal -y en momento de la detección del patrón, tiene la tendencia para el acrecentamiento. De esta manera, la entrada en la compra es completamente justificada.

Ahora, pasamos al punto №2. Aquí, la situación es más arriesgada porque ambas cestas de la venta V2 atraviesan las sección horizontal. Por tanto, cualquiera de ellas puede ir en cualquier dirección trayendo una posible pérdida.

Además, el trader puede prestar atención en el punto №3. Ahí no hay patrón, pero en la ventana V2 se observa que ambas zonas salen de la zona de sobrecompra y sobreventa al encuentro. Eso significa que tal vez el trader pueda captar el principio de la tendencia que acaba de dar la vuelta.

Pues, en este caso el trader busca los patrones en el gráfico del indicador «por defecto», y luego precisa la imagen usando otra manera de visualizar los datos con la segunda instancia del mismo indicador.

Otro modo interesante del trabajo con los indicadores combinados consiste en su uso común con los indicadores estándar. Aquí tenemos un ejemplo del uso del indicador combinado construido a base del WPR, con el WPR estándar habitual:

Es prácticamente la misma parte del gráfico USDCAD. Antes, ya hemos aclarado que el patrón №1 conviene para la entrada en el mercado, mientras que №2 supone muchos riesgos. Ahora, echamos un vistazo al patrón №3, el que también es fallado. No hay divergencia pero tampoco trae beneficios. Desde la ventana con el WPR estándar se hace claro por qué ocurre eso: WPR se encuentra en la zona de sobrecompra. Como resultado, la pareja hace el movimiento lateral, el cual puede ser seguido de una corrección, o incluso la reversión de la tendencia. El patrón №2 aquí también demuestra el movimiento lateral con la corrección posterior. Mientras que el patrón №1 sigue siendo bueno. Tenemos la entrada por la tendencia, el indicador WPR tiene la reserva de marcha hasta la zona de sobrecompra, el nivel cero ya está pasado. Todo indica en la rentabilidad potencial del patrón, lo que se confirma a continuación.

Ahora, mostraremos el ejemplo de una «colaboración» menos impresionante. Tenemos la misma pareja de divisas USDCAD, la misma sección y timeframe. En el gráfico se ubica STOCH combinado y WPR estándar. Como referencia, han sido dejadas dos líneas verticales que marcan los patrones encontrados anteriormente:


STOCH combinado no nos ha ofrecido ningunos patrones significativos. Igual como WPR, él considera los patrones № 1 y 3 convenientes para la entrada. Mientras que en el patrón №2 se ha formado una divergencia, lo que significa que la entrada aquí está prohibida. Nótese: las zonas consideradas por WPR como zonas de sobrecompra, STOCH las considera más bien como zonas del movimiento lateral. Aquí tenemos otro ejemplo de la combinación de indicadores.

Los modos de trabajo con los indicadores combinados que hemos visto no son únicos posibles, pero son bastante reconocibles, evidentes y dan resultados.

Conclusión

Pues bien, hemos discutido la manera de trabajar con los patrones que surgen al comerciar usando las cestas de divisas. Tenemos marcada la táctica de la entrada y salida del mercado, con fundamentos importantes del trabajo con esta metodología.

Par la mayoría de los ejemplos e ilustraciones se usaba el WPR combinado. Pero existen otro indicadores combinados, a saber, STOCH, RSI, TDI, etc. Todos ellos componen la estrategia de indicadores para el trading con las cestas de parejas de divisas. No es una estrategia simple y la puede dominar sólo un trader experimentado que tiende a reflexionar.

¿Si existen las posibilidades de su desarrollo? Claro que sí. Y sin falta serán descritas.


Los programas usados en el artículo:

 # Nombre
Tipo
 Descripción
1 test.zip Archivo
Herramientas para la simulación del patrón.
2
testhtml.zip Archivo Resultados de la simulación con herramientas desde el fichero test.zip.
3 test1.zip Archivo Código del Asesor Experto para la simulación con filtro.
4 testhtml50.zip Archivo Resultados de la simulación con herramientas desde el fichero test1.zip.
5
testhtml60.zip Archivo
Resultados de la simulación con herramientas desde el fichero test1.zip.
 6 testEAbasket5.mq5 Asesor Experto Asesor Experto para la simulación.


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

Archivos adjuntos |
test.zip (15.54 KB)
testhtml.zip (1197.56 KB)
testhtml50.zip (226.91 KB)
testhtml60.zip (200.84 KB)
testEAbasket5.mq5 (4.81 KB)
Cómo crear un panel gráfico de cualquier nivel de complejidad Cómo crear un panel gráfico de cualquier nivel de complejidad

En el artículo se analiza con detalle cómo crear un panel basado en la clase CAppDialog y cómo añadir al mismo los elementos de control. Asimismo, se describe la estructura del panel y el esquema de herencia de los objetos en este. Se muestra qué es necesario para procesar eventos y cómo estos se distribuyen a los elementos de control subordinados. Se dan ejemplos de cambio de los siguientes parámetros del panel: el tamaño y el color del fondo.

Construimos el indicador Zigzag usando osciladores. Ejemplo de ejecución de la tarea técnica Construimos el indicador Zigzag usando osciladores. Ejemplo de ejecución de la tarea técnica

En este artículo, se demuestra el desarrollo del indicador ZigZag de acuerdo con uno de los ejemplos de la tareas descrito en el artículo «Cómo crear una Tarea Técnica al encargar un indicador». El indicador se construye por los extremos que se definen a través del oscilador. En el indicador está prevista la posibilidad de usar uno de cinco osciladores a elegir: WPR, CCI, Chaikin, RSI, Stochastic Oscillator.

Neuroredes profundas (Parte VI). Conjunto de clasificadores de redes neuronales: bagging Neuroredes profundas (Parte VI). Conjunto de clasificadores de redes neuronales: bagging

Vamos a ver los métodos de construcción y entrenamiento de conjuntos de redes neuronales con la estructura bagging. También vamos a definir las peculiaridades de la optimización de los hiperparámetros de los clasificadores de redes neuronales individuales que componen el conjunto. Asimismo, compararemos la calidad de la red neuronal optimizada obtenida en el artículo anterior de la serie, y el conjunto creado de redes neuronales. Para finalizar, analizaremos las diferentes opciones para mejorar aún más la calidad de clasificación del conjunto.

Mejorando el trabajo con Paneles: cómo añadir transparencia, cambiar el color del fondo y heredar a partir de CAppDialog/CWndClient Mejorando el trabajo con Paneles: cómo añadir transparencia, cambiar el color del fondo y heredar a partir de CAppDialog/CWndClient

Vamos a continuar estudiando el funcionamiento de CAppDialog. Ahora vamos a aprender cómo establecer el color de fondo, el borde y el encabezado para un panel gráfico. Veremos paso a paso cómo agregar transparencia a la ventana de la aplicación al desplazar esta por el gráfico. A continuación, analizaremos la creación de descendientes de CAppDialog o CWndClient y veremos nuevos detalles importantes al trabajar con los controles. Finalmente, echaremos un vistazo desde una nueva perspectiva a nuevos proyectos.