English Русский 中文 Deutsch 日本語 Português
Simulación de patrones que surgen al comerciar con cestas de parejas de divisas. Parte II

Simulación de patrones que surgen al comerciar con cestas de parejas de divisas. Parte II

MetaTrader 5Trading | 15 diciembre 2017, 15:18
1 685 0
Andrei Novichkov
Andrei Novichkov

Introducción

Seguimos con el tema de la simulación de los patrones que surgen al negociar con cestas de los pares de divisas. En el artículo anterior, consideramos el patrón de la ruptura de los niveles de sobrecompra y sobreventa. La ruptura de estos niveles fue estudiada tomando como ejemplo el indicador WPR combinado. Se puede divulgar esta experiencia en otros indicadores combinados construidos a base de los osciladores. Se puede suponer que el resultado va a ser parecido.

Recordaré que la estimación de la ubicación de los niveles de sobrecompra y sobreventa fue el resultado de la simulación realizada. Para el nivel de sobrecompra este nivel se encuentra en el diapasón 60% - 70%, y el de sobreventa, entre -60% y -70%. La prueba del trabajo del propio patrón demostró su rentabilidad en el marco temporal H4 en todas las cestas de los pares de divisas. En H1 se registraró una cantidad insignificante de las transacciones. El timeframe H1 demostró unas pérdidas considerables.

En el presente artículo, intentaremos aplicar la media móvil (MA) a los gráficos de los indicadores combinados y usar eso en el trading. Como antes, vamos a atenernos tanto al análisis técnico estándar, como a las métodologías ya desarrolladas por nosotros.

Herramientas de investigaciones

La herramienta principal para nuestras investigaciones es el indicador ya bien conocido «WPR combinado» con el período 20. Vamos a colocar la MA con el período 20 en su gráfico. Este período tan corto ha sido elegido porque no tenemos por objeto monitorear los procesos globales: nos interesan las tendencias globales. Por esa razón, los períodos largos no se consideran.

Igual como en el artículo anterior, estudiaremos tres marcos temporales (timeframe): H1, H4 y D1. Recordamos como el primer patrón se comportó en ellos, será lógico considerar el siguiente en estos timeframes también. Y claro que no vamos a olvidar que la experiencia acumulada puede ser usada para las investigaciones en cualquier otro timeframe y cesta de divisas.

La terminología básica y los principios de la metodología se explican aquí.

Patrones para las investigaciones

Este patrón es bien conocido desde el análisis técnico clásico. Ya lo hemos descrito, por eso aquí, simplemente recordaremos los principales momentos y detalles que son típicos para el trading con cestas de parejas de divisas:

  • El trader recibe una señal para entrar en el mercado, cuando el gráfico del indicador combinado cruza el gráfico de la media móvil.

Sólo hay dos señales:

  • Señal de compra de una cesta de parejas de divisas — cuando el gráfico de MA se cruza con el gráfico del indicador combinado de abajo arriba.
  • Señal de venta de una cesta de parejas de divisas — cuando el gráfico de MA se cruza con el gráfico del indicador combinado de arriba abajo.
  • El trader entra en el mercado con la compra o la venta de la cesta de parejas de divisas para la que ha sido recibida la señal.
  • El trader sale del mercado cuando recibe la señal opuesta a la señal de la entrada.

Aparte de eso, hay que tener en la mente que las señales de la media móvil tienen la propiedad de retrasarse.

Desde la experiencia de la aplicación de la MA a los gráficos de las parejas de divisas comunes, recordamos que siempre hay una cantidad de señales de entrada bastante grande para las medias móviles rápidas. Podemos esperar que en nuestro caso no habrá menos señales de este tipo. Para comprobar esta afirmación, ha sido escrito el indicador testWPR&MA.mq5. Se puede verlo en los archivos adjuntos al artículo.

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


#define LG 7

#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;

string pair[]={"EURUSD","GBPUSD","AUDUSD","NZDUSD","USDCAD","USDCHF","USDJPY"};
bool bDirect[]={false,false,false,false,true,true,true};

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

int iUp,iDw;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   for(int i=0; i<LG; i++)
     {
      h[i]=iWPR(pair[i],0,WPR);
     }

   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");

   iUp=iDw=0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double GetValue(int shift)
  {
   double dBuf[1];
   double res=0.0;
   for(int i=0; i<LG; i++)
     {
      CopyBuffer(h[i],0,shift,1,dBuf);
      if(bDirect[i]==true)
         res+=dBuf[0];
      else
         res+=-(dBuf[0]+100);
     }//end for (int i = 0; i < iCount; i++)      
   res=res/LG;
   return (NormalizeDouble((res + 50) * 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);
        }
      rt--;
      for(int i=1; i<rt; i++)
        {
         if(ind[i] > ma[i] && ind[i+1] < ma[i+1]) {iUp++; continue;}
         if(ind[i] < ma[i] && ind[i+1] > ma[i+1]) {iDw++; continue;}
        }
      PrintFormat("BUY count: %d SELL count: %d",iUp,iDw);
     }
   else
     {
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

void OnDeinit(const int reason)
  {
   for(int i=0; i<LG; i++)
     {
      if(h[i]!=INVALID_HANDLE) IndicatorRelease(h[i]);
     }
   string text;
   switch(reason)
     {
      case REASON_PROGRAM:
         text="Indicator terminated its operation by calling the ExpertRemove() function";break;
      case REASON_INITFAILED:
         text="This value means that OnInit() handler "+__FILE__+" has returned a nonzero value";break;
      case REASON_CLOSE:
         text="Terminal has been closed"; break;
      case REASON_ACCOUNT:
         text="Account was changed";break;
      case REASON_CHARTCHANGE:
         text="Symbol or timeframe was changed";break;
      case REASON_CHARTCLOSE:
         text="Chart was closed";break;
      case REASON_PARAMETERS:
         text="Input-parameter was changed";break;
      case REASON_RECOMPILE:
         text="Program "+__FILE__+" was recompiled";break;
      case REASON_REMOVE:
         text="Program "+__FILE__+" was removed from chart";break;
      case REASON_TEMPLATE:
         text="New template was applied to chart";break;
      default:text="Another reason";
     }
   PrintFormat("%s",text);
  }
//+------------------------------------------------------------------+

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 calcula el número de las intersecciones de la media móvil por el indicador combinado durante todo el historial que tenemos. Colocamos el indicador en el gráfico EURUSD y obtenemos los datos sobre la cesta USD para los timeframes que nos interesan:

  Señales recibidos
H1 H4 D1
Buy Sell Buy Sell Buy Sell
EURUSD 8992 8992 2448 2449 550 551
Profundidad del historial 2005.09.08 2004.10.11 2000.02.28

Vemos que hay suficientes señales. Supongamos que la imagen será la misma también en otras divisas de las cestas, no vamos a comprobarlas.

Ilustraremos el trabajo del indicador con captura de pantalla:

Inmediatamente salta a la vista una grán cantidad de señales potenciales. Es obvio que habrá muchas señales falsas entre ellas, pero es pronto para pensar en ello. Simplemente, vamos a marcar las señales de compra para entrar con el color azul, y con el rojo marcaremos las señales de venta.

Definiremos la siguiente lógica para las próximas investigaciones:

  • Recibimos la señal para entrar, entramos. Salimos al recibir la señal opuesta. Entramos en la dirección contraria. Repetimos la secuencia al recibir las señales correspondientes.

Es evidente que la metodología supone la presencia constante en el mercado si no hay ninguna filtración adicional. Lo más probable que nos hará falta esta filtración, pero de esta cuestión hablaremos más tarde. Mientras tanto, salta a los ojos que la calidad de señales en la captura de pantalla es evidentemente diferente.

  • las señales bien claras en los puntos 7 y 8 (azul);
  • una buena señal en el punto 5 (rojo);
  • una acumulación de señales con direcciones opuestas en los puntos 2, 3, 4 (rojo).

Vamos a introducir las reglas de distinción de las señales «buenas» de las «malas». En las siguientes dos imagenes, vemos los indicios que revelan las señales «buenas» con absoluta claridad:

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





En estas imágenes, el gráfico del WPR combinado para USD se muestra con línea verde, la línea carmesí se usa para la media móvil, las líneas verticales azules marcan los límites del patrón.

Aceptemos que los valores de las distancias Delta1 y Delta2 no deben ser menos de un 5% para los patrones de entrada.

Pero también usamos los patrones «malos» (como en la imagen de la derecha). No van a dar señales para la entrada, pero van a avisar sobre un posible cambio o ralentización de la tendencia. Por tanto, se puede usarlos para salir del mercado o para la filtración, lo que vamos a hacer.

Inicio de la simulación

Para el siguiente trabajo, necesitaremos un Asesor Experto cuyo código se puede encontrar en el archivo adjunto testEAbasket.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>

#define LG 7

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

string pair[]={"EURUSD","GBPUSD","AUDUSD","NZDUSD","USDCAD","USDCHF","USDJPY"};
bool bDirect[]={false,false,false,false,true,true,true};

int h;
ulong  Ticket[LG];

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

BSTATE g_state;

double g_dMinSize = 5.0;

int OnInit()
  {
   h = iCustom(NULL,0,"testWPR&MA",wpr,ma);
   if (h == INVALID_HANDLE) {
      Print("Error while creating testWPReur");
      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 OnStart()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| 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 ( w[0] > m[0] && wl < ml) {
            if (g_state != BCLOSE) CloseAllPos();
            if ( w[0] - m[0] >= g_dMinSize && ml - wl >= g_dMinSize) {
               EnterBuy(lt);
               g_state = BBUY;
            }   
         }     
         if ( w[0] < m[0] && wl > ml) {
            if (g_state != BCLOSE) CloseAllPos();
            if ( m[0] - w[0] >= g_dMinSize && wl - ml >= g_dMinSize) {
               EnterSell(lt);
               g_state = BSELL;
            }   
         }            
     }      
  }
//+------------------------------------------------------------------+
  
void CloseAllPos() 
  {

   CTrade Trade;
   Trade.LogLevel(LOG_LEVEL_NO);

   for(int i=0; i<LG; i++) 
     {

      Trade.PositionClose(Ticket[i]);
     }

     g_state = BCLOSE;

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

   CTrade Trade;
   Trade.LogLevel(LOG_LEVEL_NO);

   for(int i=0; i<LG; i++) 
     {
      if(bDirect[i]) 
        { //send buy
         Trade.Buy(lot,pair[i]);
         Ticket[i]=Trade.ResultDeal();
        }
      else 
        { //send sell
         Trade.Sell(lot,pair[i]);
         Ticket[i]=Trade.ResultDeal();
        }
     }
     g_state = BBUY;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void EnterSell(double lot) 
  {

   CTrade Trade;
   Trade.LogLevel(LOG_LEVEL_NO);

   for(int i=0; i<LG; i++) 
     {
      if(bDirect[i]) 
        { //send sell
         Trade.Sell(lot,pair[i]);
         Ticket[i]=Trade.ResultDeal();
        }
      else 
        { //send buy
         Trade.Buy(lot,pair[i]);
         Ticket[i]=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);
  }  

Vamos a testearlo en el Probador de estrategias usando los datos del último año en los timeframes H1, H4 y D1. Analizamos la cesta de parejas de divisas de USD.

Los resultados del análisis se encuentran en el archivo adjunto testEAbasket.zip en forma de los informes estándar. Desde el principio, se puede decir que los resultados de la simulación son negativos. Con los ajustes existentes, el EA muestra pérdidas en los tres timeframes. Es un resultado negativo pero esperado. Es difícil suponer que se puede conseguir un beneficio importante, teniendo una cantidad tan grande de las transacciones que ha sido determinada antes. Las siguientes circunstancias también han influido en el resultado:

  • El patrón con la media móvil siempre retrasa (por definición).
  • En el análisis técnico estándar, la decisión sobre la entrada en el mercado no se toma en base del comportamiento de una sola media móvil rápida.
  • En el EA, tenemos prevista la mínima filtración de las señales en base de la «calidad» de los patrones. Está claro que eso no es suficiente, cuanto más que el criterio de la «calidad» de este patrón está definido sólo previamente y puede no ser exacto.

No obstante, a pesar de un resultado negativo en general, se puede divisar unos momentos esperanzadores. En la primera parte del artículo, se podía ver que el patrón considerado trabaja bien en el timeframe H4. El patrón del que estamos hablando ahora se comporta respectivamente bien en el timeframe H1. El resultado es negativo, pero el beneficio también ha tenido lugar, la tendencia de la disminución de la rentabilidad no es tan radical:

Se puede suponer que si modificamos un poco el propio EA y sus configuraciones, tenemos perspectivas. Vemos que el balance entraba en el beneficio durante la simulación. El número de las transacciones era bastante grande, pero la curva tiene unas caídas bastante profundas, lo que indica en las secuencias de los resultados negativos. ¡Pero también podemos observar las secuencias de los resultados positivos! Intentaremos aumentar la rentabilidad del patrón en este timeframe introduciendo unas modificaciones en el código del EA.

Corrección de la forma del patrón

Lo primero que surge en la cabeza es la modificación de la forma del patrón, a saber, los valores de los parámetros Delta1 y Delta2. Desde el principio, hemos elegido un 5%. ¿Tal vez intentemos cambiarlo? Si lo disminuimos, eso aumentará la cantidad de entradas en e mercado. Si lo aumentamos, la cantidad de entradas se reducirá, pero al mismo tiempo crecerá la «fuerza» del patrón, la velocidad del movimiento, y por consiguiente, el «impulso en el cambio de la tendencia».

¡Pues, no se puede ni aumentar ni disminuir este valor! También es erroneo pensar que el valor elegido es óptimo. Pero si empezamos a optimizarlo en esta etapa, corremos el riesgo de obtener un valor que trabaje bien en un determinado intervalo temporal, en un determinado timeframe y en un determinado par de divisas. En otras palabras, no habrá ninguna garantía de que el valor obtenido sea universal.

Sin embargo, tiene sentido hacer otro paso en esta dirección. Es necesario limitar los valores Delta1 y Delta2 «de arriba», establecer sus valores máximos. Eso será justificado lógicamente porque un patrón demasiado «grande» puede agotar la dinámica del movimiento ya dentro de sí mismo, es decir, «extenuarse». Entonces, después de entrar en el mercado, el trader no va a esperar la continuación del movimiento, sino el flat o el cambio de la tendencia. Es más, un patrón «grande» puede acabarse definitivamente cerca del límite del lado opuesto del rango de WPR combinado, lo cual también es muy malo para la entrada en el mercado para la continuación de la tendencia existente.

Por eso, aceptamos que el valor máximo para Delta1 y Delta2 será un 10%. Entonces, el «tamaño" del propio patrón será Delta1 + Delta2 = 20%. Eso no es demasiado. Modificamos el EA:

1. Añadiremos la variable global:

double g_dMaxSize = 10.0;

2. Cambiamos la función del procesamiento de eventos del temporizador:

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;
           }
        }
     }
  }


Continuamos la simulación con el EA modificado en el timeframe H1. Se puede encontrar su resultado en el fichero anexo testEAbasket1.zip. Demostración del resultado:


Los cambios positivos se ven inmediatamente. El resultado sigue siendo negativo, pero en términos absolutos, la pérdida es mucho menos. Se ha cambiado la tendencia en cuanto a la pérdida del depósito, ahora se ve un movimiento lateral, oscilatorio, no estable. Hay unas caídas importantes, pero después de ellas, se observa la recuperación. Desde luego, esta prueba es insuficiente en absoluto para hacer conclusiones definitivas, pero se puede reconocer que la aplicación del filtro por los valores máximos Delta1 y Delta2 es justificada y positiva. Por eso, guardamos los cambios introducidos en el código del EA.

A continuación, no vamos a cambiar los valores obtenidos de Delta1 y Delta2. Vuelvo a decir que no se puede afirmar que estos valores son óptimos. Pero teniendo en la mente que luego habrá que pasarlos en otros timeframes y otras cestas, por ahora, nos contenemos con el resultado obtenido.

Segundo filtro

El siguiente paso que hay que hacer es evidente:

  • Es necesario entrar en el mercado con cuidado por la tendencia cuando el gráfico del WPR combinado (igual de cualquier otro oscilador) se acerca a sus límites.

Es necesario propagar esta regla conocida del uso de los indicadores técnicos estándar también a los indicadores combinados. En los artículos anteriores, ya hemos dicho que en este caso es posible una reversión de la tendencia, su ralentización considerable o el movimiento lateral. Nos queda materializar estas ideas en el segundo filtro del EA.

WPR combinado oscila dentro del rango de -100% a +100%. No podemos orientarnos directamente a estas cifras, porque el indicador se acerca a estos límites pero nunca va a alcanzarlos. Por otro lado, tenemos los límites ya conocidos de sobrecompra/sobreventa. En el artículo anterior, hemos considerado la ruptura de estos límites y tenemos los datos de su ubicación. Pues, vamos a usarlos.

Vamos a definir nuestra tarea más exactamente.

  • El trader NO va a comprar la cesta de divisas 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 la cesta de divisas si el gráfico de WPR combinado ha tocado o ha roto el límite de sobreventa de arriba abajo.

Hemos definido la posición de los límites de sobrecompra en el rango 60% - 70%, y de sobreventa, en el rango -60% ... -70%. Para el nuevo filtro, vamos a coger el valor bajo de los límites: 60% y -60%. Aceptemos que para entrar en el mercado para comprar la cesta, la curva de WPR combinado debe encontrarse por debajo del límite del filtro, y para vender la cesta, por encima de ella. Es decir, no vamos a intentar encontrar un patrón «perfecto» de la intersección de la media móvil, sino nos limitaremos a la filtración que se aplica en el análisis técnico estándar:

  • Vamos a tomar en cuenta la posición recíproca de la media móvil y el gráfico del indicador según el tipo «por encima-por debajo».

Para su implementación vamos a introducir cambios mínimos en el bloque del código respecto a las condiciones de la entrada en el mercado:

       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;
           }
        }


Vamos a probar nuestro EA en el intervalo temporal y el timeframe H1 elegidos antes. Aquí tenemos el resultado de la simulación:


El fichero completo con los resultados se encuentra en el archivo comprimido adjunto testEAbasket2.zip. Podemos ver que los resultados no se diferencian mucho de los anteriores, aunque se observan ciertas mejoras de la situación.

¿A qué se debe eso? Puede ser que eso está relacionado con una definición no suficientemente exacta de la sobrecompra/sobreventa. Tal vez, con una cantidad insuficiente de las transacciones filtradas. O quizá, con ambas situaciones.

¿Significa el resultado obtenido que la aplicación del filtro es inútil? No, eso no es así. Se puede hacer esta conclusión sólo después de aplicar el filtro en todas las cestas, en todos los timeframes seleccionados, y usando los intervalos temporales considerablemente más grandes que un año. Por eso, dejaremos este filtro en el código del EA, pero su aplicación se quedará en suspenso.

Conclusión del trabajo con el patrón

Hemos realizaso nuestros planes respecto al trabajo con el patrón arriba descrito en la cesta con USD. La versión definitiva del Asesor Experto utilizado se puede encontrar en el archivo adjunto testEAbasketFinal.mq5. A base de las pruebas realizadas, se puede hacer la principal conclusión:

  • No se debe usar este patrón como señal para entrar en el mercado.

Así que de inmediato surge la pregunta: ¿Si merece la pena realizar las pruebas en el resto de las cestas? El resultado es predicible con mayor grado de probabilidad.

La principal consideración que nos permitirá realizar las simulaciones en otras cestas es que los patrones basados en la ruptura de la única MA prácticamente no se usan como una señal independiente para la entrada en el análisis técnico estándar durante el trading práctico. Por eso, ahora intentaremos usar el patrón de la intersección de la media móvil por el gráfico de WPR combinado, como filtro. El patrón de la ruptura de los niveles de sobrecompra/sobreventa por el mismo indicador combinado será considerado como la señal principal para la entrada. Nuestro objetivo es averiguar como semejante filtro influirá en la rentabilidad.

Uso de esta patrón como filtro

Vamos a formular la tarea inicial.

  • El gráfico del WPR combinado rompe el nivel de sobrecompra de abajo arriba. La ruptura se registra en el cierre de la vela. El trader entra en el mercado, comprando la cesta 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 de la cesta, la situación tiene que ser diametralmente contraria que en el punto anterior.
  • Para salir del mercado, se usa el hecho del alcance de la zona en el nivel 0% por el gráfico de WPR combinado.

Es fácil de notar que va a utilizarse de nuevo la versión «simplificada» del patrón, en vez del patrón «de pleno valor» (filtro «por encima-por debajo» aplicado a la posición recíproca de la media móvil y el gráfico WPR combinado).

Vamos a modificar el EA testEAbasket.mq5 para la simulación. Le añadimos los datos iniciales para la descripción del nivel de sobrecompra/sobreventa y las condiciones de la aplicación del patrón como filtro:

input int SELLPROFIT =   0;
input int SELL1LIMIT =  70;
input int SELL2FROM  =  60;
input int SELL2TO    =  50;

input int BUYPROFIT  =   0;
input int BUY1LIMIT  = -70;
input int BUY2FROM   = -60;
input int BUY2TO     = -50;

//...................................................................

//+------------------------------------------------------------------+
//| 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;        
        }
    }
  }

El código completo del EA se encuentra en el archivo adjunto testEAbasket1.mq5.

Para la simulación se usa el tiemframe H1. En este timeframe fue registrado el mayor número de las transacciones, además, el resultado fue muy negativo. Se puede ver este resultado en el artículo anterior, por eso no vamos a repetir la simulación aquí.

Hagamos la simulación usando el patrón de este artículo como filtro en el intervalo de un año. Obtenemos los siguientes resultados:

¡La aplicación del patrón como filtro de este artículo ha proporcionado unos resultados evidentemente positivos! Hemos obtenido una curva bastante suave, con una tendencia evidente para el aumento del beneficio. Lástima que no hay muchas transacciones como nos gustaría. Y esta cántidad se disminuye aún más al aplicar el EA a los timeframes mayores.

El informe completo sobre la simulación se encuentra en el archivo adjunto Tester_EURUSD_Filter.zip.

Conclusión

Hemos terminado la simulación de los patrones que aparecen al aplicar los indicadores combinados en base de los osciladores para una determinada divisa de la cesta. WPR combinado ha sido usado como base, pero se puede extender los resultados a RSI y a Stoch.

No obstante, hay que reconocer que hasta la aplicación práctica de los patrones todavía está muy lejos. Es evidente que la estadística acumulada no es suficiente. Eso se refiere tanto a los intervalos temporales de la simulación, como a los parámetros de los propios patrones. La selección del período de la MA de este artículo también queda bastante discutible.

Al mismo tiempo, hemos obtenido unos resultados interesantes.

  1. Hemos estimado la ubicación de los niveles de sobrecompra/sobreventa y hemos comprobado la perspectiva del trabajo con ellos.
  2. Hemos estimado la perspectiva de la aplicación del patrón de la intersección de las medias móviles por el gráfico del indicador combinado.
  3. Hemos evaluado la posibilidad del uso combinado desdee dos puntos anteriores.

Se puede decir que hemos hecho el primer paso hacia la aplicación de dicha metodología con fines prácticos.

Los programas usados en el artículo:

 # Nombre
Tipo
 Descripción
1 testWPR&MA.mq5 Indicador
Indicador para comprobar el número de intersecciones de la media móvil por el gráfico del indicador combinado.
2
testEAbasket.mq5 Asesor Experto
Asesor para la simulación.
3
testEAbasket.zip Archivo Informes estándar en el formato html sobre el trabajo del EA testEABasket.mq5 con la cesta de USD.
 4 testEAbasket1.zip Archivo Informe estándar en el formato html sobre el trabajo del EA testEABasket.mq5 con la cesta de USD y el primer filtro.
5
testEAbasket2.zip Asesor Experto Informe estándar en el formato html sobre el trabajo del EA testEABasket.mq5 con la cesta de USD y dos filtros.
 6  testEAbasketFinal.mq5 Asesor Experto
La versión definitiva del EA testEAbasket.mq5 .
7 testEAbasket1.mq5
Asesor Experto Asesor Experto para la simulación.
8  Tester_EURUSD_Filter.zip Archivo Archivo con los informes de la simulaci”on del EA testEAbasket1.mq5.


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

Archivos adjuntos |
testWPRuMA.mq5 (6.02 KB)
Tester_EURUSD.zip (276.97 KB)
testEAbasket1.mq5 (5.14 KB)
testEAbasket.mq5 (5.29 KB)
testEAbasket1.zip (148.42 KB)
testEAbasket2.zip (145.62 KB)
testEAbasket.zip (581.26 KB)
Indicador NRTR y módulos comerciales en su base para el Asistente de MQL5 Indicador NRTR y módulos comerciales en su base para el Asistente de MQL5
En este artículo se describe el indicador NRTR y el sistema comercial creado en su base. Para este propósito, se crea el módulo de las señales comerciales a través de las cuales se crean las estrategias basadas en las combinaciones del NRTR e indicadores comerciales que confirman la tendencia.
Comparación de diferentes tipos de media móvil en el comercio Comparación de diferentes tipos de media móvil en el comercio
Se han analizado 7 tipos de medias móviles (MA), asimismo, se ha desarrollado una estrategia comercial para trabajar con ellas. Se ha realizado la simulación y la comparación de diferentes MA en una estrategia comercial, dando una característica comparativa de la efectividad del uso de las diferentes MA.
Evaluación del riesgo en la secuencia de transacciones con un activo. Continuación Evaluación del riesgo en la secuencia de transacciones con un activo. Continuación
Este artículo desarrolla las ideas propuestas en la parte anterior y continua su análisis. Aquí se describen las cuestiones de la distribución de los beneficios, la modelación y el estudio de las regularidades estadísticas.
Mini emulador del mercado o Probador de estrategias manual Mini emulador del mercado o Probador de estrategias manual
El mini emulador del mercado es un indicador que sirve para la emulación parcial del trabajo en el terminal. Supuestamente, se puede usarlo para la simulación de las estrategias «manuales» del análisis y el trading en el mercado.