
Gráfico líquido
Introducción
Una vez me he fijado en el echo de que los gráficos con el período H4 y los períodos superiores se ven diferentes con diferentes brokers. La razón consistía en diferentes husos horarios. En algunas ocasiones, determinadas zonas de los gráficos se diferenciaban considerablemente incluso teniendo una diferencia insignificante en los husos horarios. En un gráfico se distinguía perfectamente un patrón de reversa, y en la misma zona del otro gráfico había algo indeterminado.
Entonces se me ha ocurrido la idea de escribir un indicador que va a reconstruir el gráfico H1 de tal manera que a la derecha siempre haya una barra cerrada y terminada en cuanto al tiempo. El período M1 ha sido elegido como la fuente de los precios. Como resultado, el gráfico H1 se redibujaba cada minuto, y en una hora he obtenido 60 variedades del mismo gráfico H1. Su forma fluyente se cambiaba suavemente mostrando los patrones ocultos en los lugares donde no había ninguna alusión a ellos en el gráfico fuente.
Debido al aspecto distintivo del indicador, lo he llamado «gráfico líquido». Dependiendo del modo de su construcción, el gráfico «fluye» (se redibuja) bien cuando aparece una barra nueva del período base, o bien cuando se cambia el valor del desplazamiento estático. En este artículo analizaremos los principios de construcción del «gráfico líquido», escribiremos el indicador y también compararemos la eficacia de la aplicación de esta tecnología para los Asesores Expertos (EAs) que tradean con indicadores y los que tradean con patrones.
1. Principio de construcción
En primer lugar, vamos a aclarar los aspectos de terminología.
Desplazamiento es la diferencia en el tiempo por la que los precios de apertura de las barras del gráfico recibido se diferencian de los precios de apertura de las barras del gráfico fuente.
Período actual es el período del gráfico fuente.
Período base es el período por cuyos precios vamos a formar las barras del gráfico resultante.
El valor del período base no puede superar el valor del período actual. El período actual tiene que dividirse por el período base sin remanente. Cuanto más alta sea la relación del período actual respecto al período base, más variantes del gráfico resultante podremos obtener. Sin embargo, si la proporción es muy alta, los datos históricos del período base pueden ser insuficientes para construir el número necesarios de las barras del gráfico resultante.
Hay tres tipos de construcción.
- Gráfico con desplazamiento estático (Static Shift o SS).
- Gráfico con desplazamiento dinámico, modo de apertura (Dynamic Shift, just Open o DSO).
- Gráfico con desplazamiento dinámico, modo de cierre (Dynamic Shift, expected Close o DSC).
En el modo con desplazamiento estático las horas de apertura de las barras están desplazadas al tiempo establecido. El desplazamiento dinámico en el modo de apertura da el efecto como si la barra acaba de abrirse, y en el modo de cierre - como si va a cerrarse pronto.
Vamos a estudiarlo con más detalles.
1.1. Gráfico con desplazamiento estático
En este modo la hora de apertura de cada barra será desplazada al número de minutos que equivale al número establecido de los períodos base, que vamos a llamar el desplazamiento. De esta manera, si se establece el desplazamiento 0, el gráfico va a repetir el gráfico fuente. El desplazamiento 1, si el período base es de 15 minutos, va a ser igual a 15 minutos. El desplazamiento 2 va a ser igual a 30 minutos, etc.
El desplazamiento no puede superar el valor (k-1), donde k es la relación del período actual al período base. Eso significa que con el período actual H1 y el período base M1 el desplazamiento máximo permitido será igual a 60/1 - 1 = 59 de los períodos base, es decir, 59 minutos. Si el período base es M5, el desplazamiento máximo permitido será igual a 60/5 - 1 = 11 de los períodos base, es decir, 55 minutos.
Las horas de apertura de las barras, para el ejemplo del período actual H1 y desplazamiento de 15 minutos, van a tener los valores 00:15, 01:15, 02:15, etc. Para el período actual M15 y desplazamiento de 1 minutos, las horas de apertura de las barras van a tener los valores 00:31, 00:46, 01:01, etc.
Con los desplazamientos que se encuentran cerca de los valores límites, este gráfico va a diferenciarse muy poco del gráfico fuente. Las diferencias importantes se observan cuando los valores del desplazamiento están más cerca de la mitad del rango permitido.
Fig. 1. Ejemplo de formación de las barras H1 partiendo del período base M15 con el desplazamiento 1
1.2. Gráfico con desplazamiento dinámico, modo de apertura
En este modo el desplazamiento se recuenta cada vez que aparezca una nueva barra del período base. Además, el desplazamiento se calcula de tal manera que el tiempo de existencia de la barra al final del gráfico (los precios más recientes) no supere el valor del período base. En el ejemplo con el período actual H1 y el período base M5, eso tendrá el aspecto como si la barra más derecha se haya abierto no más de hace 5 minutos.
Fig. 2. Ejemplo de formación de las barras partiendo del período base M15 con el desplazamiento dinámico en modo de apertura
1.3. Gráfico con desplazamiento dinámico, modo de cierre
En este modo el desplazamiento también se recuenta cada vez que aparezca una nueva barra del período base. La única diferencia es que el desplazamiento se calcula de tal manera que el tiempo de existencia de la barra al final del gráfico (los precios más recientes) sea mayor o igual a la diferencia entre el período actual y base. En el ejemplo con el período actual H1 y el período base M5, eso tendrá el aspecto como si la barra más derecha tenga que cerrarse no más que dentro de 5 minutos.
Fig. 3. Ejemplo de formación de las barras partiendo del período base M15 con el desplazamiento dinámico en modo de cierre
2. Conversión de datos
Para convertir los datos históricos tomando en cuenta el desplazamiento establecido, ha sido escrita la función GetRatesLC(). Ella recibe los datos históricos modificados en el array de estructuras del tipo MqlRates, igual que la función CopyRates().
int GetRatesLC( int start_pos // de dónde copiar int len, // cuánto copiar MqlRates& rates[], // array en el que se copian los datos ENUM_TIMEFRAMES base_period, // período base int& shift // desplazamiento );
Parámetros
start_pos
[in] Número del primer elemento en el período actual a partir del cual se empieza la conversión y el copiado al Portapapele.
len
[in] Número de elementos a copiar.
rates[]
[out] Array del tipo MqlRates.
base_period
[in] Período base.
shift
[in] [out] Desplazamiento. Se puede poner los siguientes valores:
Valor | Descripción |
---|---|
-2 |
Calcular el desplazamiento en el modo de apertura (inicio de formación de la barra) |
-1 |
Calcular el desplazamiento en el modo de cierre (fin de formación de la barra) |
0 ... N |
Aplicar el desplazamiento indicado. Puede adquirir lo valores de 0 a N. N = Tcur/Tbase - 1. Donde Tcur es período actual, Tbase es período base. |
Tabla 1. Valores admisibles del parámetro shift
Al ejecutar con éxito la función, en shift se pone el valor del desplazamiento calculado, si ha sido transmitido el valor -2 o -1.
Valor devuelto
Número de elementos copiados o el código del error.
Código | Descripción |
---|---|
-1 |
Período base inválido |
-2 |
Desplazamiento inválido |
Tabla 2. Códigos de errores devueltos
A continuación, se muestra el código de la función GetRatesLC() desde el archivo liquidchart.mqh.
int GetRatesLC(int start_pos,int len,MqlRates &rates[],ENUM_TIMEFRAMES base_period,int& shift) { //--- cuantos períodos base caben en el período actual int k=PeriodSeconds()/PeriodSeconds(base_period); if(k==0) return(-1);//período base inválido //--- MqlRates r0[]; ArrayResize(rates,len); if(CopyRates(_Symbol,_Period,start_pos,1,r0)<1) return(0);// no hay datos //--- int sh; if(shift>=0) { //--- desplazamiento fijo if(shift<k) sh=shift; else return(-2);//--- desplazamiento inválido } else if(shift==-1) { //--- hay que calcular el desplazamiento (dinámico, inicio de formación de la barra) sh=int((TimeCurrent()-r0[0].time)/PeriodSeconds(base_period)); } else if(shift==-2) { //--- hay que calcular el desplazamiento (dinámico, fin de formación de la barra) sh=1+int((TimeCurrent()-r0[0].time)/PeriodSeconds(base_period)); if(sh>=k) sh = 0; } else return(-2);//desplazamiento inválido //--- hora de apertura de la barra del período base a partir de la cual se empieza a formarse la barra del período actual //--- respecto al tiempo tO se hace la sincronización de las horas de apertura de las barras datetime tO; //--- hora de cierre de la barra formada, es decir la hora de apertura de la última barra del período base en la serie datetime tC; tO=r0[0].time+sh*PeriodSeconds(base_period); if(tO>TimeCurrent()) tO-=PeriodSeconds(); tC=tO+PeriodSeconds()-PeriodSeconds(base_period); if(tC>TimeCurrent()) tC=TimeCurrent(); int cnt=0; while(cnt<len) { ArrayFree(r0); int l=CopyRates(_Symbol,base_period,tC,k,r0); if(l<1) break; //--- la hora de la barra con el índice (l-1) no siempre corresponde a tC //--- si la barra con la hora tC no existe, puede ser la barra más cercana //--- en cualquier caso, yo asigno su hora a la hora tC tC=r0[l-1].time; //--- ahora hay que comprobar si tO tiene un valor correcto y corregir si hace falta. while(tO>tC) tO-=PeriodSeconds(); //--- aquí las horas tO y tC ya tienen los valores actuales para la barra a formar int index=len-1-cnt; rates[index].close=0; rates[index].open=0; rates[index].high=0; rates[index].low=0; rates[index].time=tO; for(int i=0; i<l; i++) if(r0[i].time>=tO && r0[i].time<=tC) { if(rates[index].open==0) { rates[index].open= r0[i].open; rates[index].low = r0[i].low; rates[index].high= r0[i].high; }else{ if(rates[index].low > r0[i].low) rates[index].low=r0[i].low; if(rates[index].high < r0[i].high) rates[index].high=r0[i].high; } rates[index].close=r0[i].close; } //--- establecimiento de la hora de cierre de la barra siguiente en el ciclo tC=tO-PeriodSeconds(base_period); // cnt++; } if(cnt<len) { //-- hay menos datos que hacen falta, desplazamos al inicio del búfer int d=len-cnt; for(int j=0; j<cnt; j++) rates[j]=rates[j+d]; for(int j=cnt;j<len;j++) { //--- llenamos con ceros los elementos no utilizados del array rates[j].close=0; rates[j].open=0; rates[j].high=0; rates[j].low=0; rates[j].time=0; } } shift = sh; return(cnt); }
Cabe mencionar unos momentos importantes.
- La función no devuelve los volúmenes de tick. Se debe al hecho de que en el modo DSC la función nunca devolverá el volumen que es igual a uno, como sucede cuando se abre la barra. Es absolutamente lógico. Pero si su EA utiliza el volumen de tick igual a uno como la señal sobre la formación de nueva barra, nunca lo recibirá. Este modo se utiliza en el EA Moving Average de los ejemplos estándar. Usted puede insertar adicionalmente en la función el cálculo de los volúmenes de tick, pero no va a funcionar correctamente a 100%. Para que no haya confusiones, yo no calculo los volúmenes de tick en absoluto.
- La función devuelve el número de barras solicitado pero eso no significa que el intervalo de tiempo entre la primera y la última barra va a ser conmensurable con el intervalo correspondiente de tiempo en el gráfico fuente. En el intervalo continuo de datos históricos, sí que va a haber correspondencia. Pero si en este intervalo aparecen los días del fin de semana, en el límite pueden aparecer las «barras fantasmas».
En la imagen de abajo se muestra el ejemplo de una «barra fantasma». Esta barra ha salido del primer minuto del 27 de octubre que ha llegado a parar en la barra con la hora de apertura de 23:01 del 26 de octubre. Hay que tener en cuenta que después de estas barras el gráfico del indicador será desplazado hacia la izquierda en relación al gráfico fuente. Las barras con la hora correspondiente a la hora fuente (por ejemplo, 21:00 -> 21:01) van a tener otros índices.
Fig. 4. Barra fantasma del 2014.10.26 a las 23:01
3. Implementación del indicador
Vamos a escribir el indicador que muestra el «gráfico líquido» en la ventana adicional. Este indicador tiene que trabajar en los tres modos: desplazamiento estático, desplazamiento dinámico en el modo de apertura de la barra y desplazamiento dinámico en el modo de cierre de la barra. Además, el indicador debe tener los elementos de control para poder cambiar los modos y el valor de desplazamiento sin tener que abrir el diálogo de modificación de parámetros.
Para empezar, vamos a necesitar la función GetRatesLC() desde el archivo liquidchart.mqh. Vamos a llamarla desde la función RefreshBuffers(), la que a se vez se llama desde OnCalculate. También se puede llamarla OnChartEvent, si se ha cambiado el modo o desplazamiento y hace falta recalcular los búferes del indicador. La función OnChartEvent va a procesar los clics sobre los botones y cambiar los valores del desplazamiento y del modo.
Parámetros de entrada del indicador:
input ENUM_TIMEFRAMES BaseTF=PERIOD_M1; // LC Base Period input int Depth=100; // Depth, bars input ENUM_LC_MODE inp_LC_mode=LC_MODE_SS; // LC mode input int inp_LC_shift=0; // LC shift
donde Depth es el número de barras del gráfico resultante, y ENUM_LC_MODE es el tipo que describe los modos de construcción del indicador:
enum ENUM_LC_MODE {//modo de construcción LC_MODE_SS=0, // Static Shift LC_MODE_DSO=1, // Dynamic Shift, just Open LC_MODE_DSC=2 // Dynamic Shift, expected Close };Los parámetros inp_LC_mode y inp_LC_shift se duplican con las variables LC_mode y LC_shift, respectivamente. Eso se hace para que se pueda cambiar sus valores pulsando los botones. No vamos a considerar el dibujo y el procesamiento del clic de los botones ya que eso entra en el tema de este artículo. Vamos a analizar la función RefreshBuffers() con más detalles.
bool RefreshBuffers(int total, double &buff1[], double &buff2[], double &buff3[], double &buff4[], double &col_buffer[]) { MqlRates rates[]; ArrayResize(rates,Depth); //--- int copied=0; int shift=0; if(LC_mode==LC_MODE_SS) shift = LC_shift; //desplazamiento estático else if(LC_mode==LC_MODE_DSO) shift = -1; //calcular el desplazamiento (inicio de formación de la barra) else if(LC_mode==LC_MODE_DSC) shift = -2; //calcular el desplazamiento (fin de formación de la barra) else return(false); //--- copied=GetRatesLC(0,Depth,rates,BaseTF,shift); //--- if(copied<=0) { Print("No hay datos"); return(false); } LC_shift = shift; refr_keys(); //--- inicializaremos los búfers con valores vacíos ArrayInitialize(buff1,0.0); ArrayInitialize(buff2,0.0); ArrayInitialize(buff3,0.0); ArrayInitialize(buff4,0.0); //--- int buffer_index=total-copied; for(int i=0;i<copied;i++) { buff1[buffer_index]=rates[i].open; buff2[buffer_index]=rates[i].high; buff3[buffer_index]=rates[i].low; buff4[buffer_index]=rates[i].close; //--- if(rates[i].open<=rates[i].close) col_buffer[buffer_index]=1;//alcista o doji else col_buffer[buffer_index]=0;//bajista // buffer_index++; } // return(true); }
Primero hay que pasar el valor necesario de la variable shift a la función GetRatesLC(), dependiendo del modo que se usa. En el modo estático va a ser la copia del parámetro LC_shift, en el modo de apertura o cierre de la barra va a ser -1 o -2, respectivamente. Después de la ejecución con éxito, GetRatesLC() devolverá en la variable shift el valor actual del desplazamiento. Será recalculado ose quedará como antes. En cualquier caso, asignamos su valor a la variable LC_shift y redibujamos los elementos gráficos usando la función refr_keys().
Después de eso, actualizamos OHLC y el color de las barras en los búferes de indicadores.
El código completo del indicador se encuentra en el archivo liquid_chart.mq5. Una vez iniciado el indicador, tendrá el siguiente aspecto:
Fig. 5. Indicador Liquid Chart
Vamos a hablar un poco sobre los elementos de control.
- El botón SS cambia el indicador en el modo del desplazamiento estático. En este modo los botones con flechas estarán activos, se utilizan para establecer el valor necesario del desplazamiento.
- El botón DSO pasa el indicador en el modo del desplazamiento dinámico, inicio de formación de la barra. En este modo el desplazamiento se calcula, no se puede cambiar su valor manualmente.
- El botón DSC pasa el indicador en el modo del desplazamiento dinámico, fin de formación de la barra. En este modo tampoco se puede cambiar el valor del desplazamiento manualmente.
En el modo SS, con el valor del desplazamiento igual a 0, el indicador repite exactamente los valores del gráfico fuente. Intente cambiar el desplazamiento y verá como el gráfico se reconstruye. Con el valor igual a 28, ya se notan las diferencias notables. En vez de los «carriles» mal expresados aparecerá el «martillo» bien notable. ¿Ha llegado la hora de comprar?
Fig. 6. Indicador Liquid Chart, desplazamiento estático 28
Pase el indicador en el modo DSO, y a la derecha siempre habrá una barra recién formada. Y en el modo DSC habrá una barra a la que le queda no más de un período base para cerrarse.
4. Creación del Asesor Experto
Vamos a crear dos EAs. El primero va a tradear por las medias móviles, el segundo por el patrón de la «barra pin».
Como la base vamos a coger el EA Moving Average que forma parte del conjunto estándar de ejemplos (carpeta Experts\Examples\Moving Average). De esta manera, tendremos la posibilidad de comparar los resultados de optimización de dos estrategias completamente diferentes para comprender en qué ocasiones tiene sentido el uso del desplazamiento dinámico o estático.
4.1. EA que tradea por las medias móviles
En primer lugar, vamos a aclarar los parámetros de entrada. Al principio son cuatro:
input double MaximumRisk = 0.1; // Maximum Risk in percentage input double DecreaseFactor = 3; // Descrease factor input int MovingPeriod = 12; // Moving Average period input int MovingShift = 6; // Moving Average shift
A resultas de la optimización, aparecerán otros tres parámetros:
input ENUM_TIMEFRAMES BaseTF=PERIOD_M1; // LC Base Period input bool LC_on = true; // LC mode ON input int LC_shift = 0; // LC shift
El parámetro LC_on va a ser necesario si hace falta comprobar el funcionamiento correcto de GetRatesLC(). La combinación (LC_on == true && LC_shift == 0) tiene que dar el mismo resultado que (LC_on == false).
Para actualizar el EA Moving Average hecho con el uso del desplazamiento, primero hay que adjuntar el archivo liquidchart.mqh y sustituir las funciones CopyRates() por las funciones GetRatesLC() para los casos cuando el uso del desplazamiento está activado (parámetro de entrada LC_on es igual a true):
int copied; if(LC_on==true) { int shift = LC_shift; copied=GetRatesLC(0,2,rt,BaseTF,shift); } else copied = CopyRates(_Symbol,_Period,0,2,rt); if(copied!=2) { Print("CopyRates of ",_Symbol," failed, no history"); return; }
Eso hay que hacer en dos lugares: en la función CheckForOpen() y CheckForClose(). Además, nos vemos obligados a rechazar el uso de los handles del indicador, vamos a calcular las medias móviles «manualmente». Para eso tenemos la función CopyMABuffer():
int CopyMABuffer(int len,double &ma[]) { if(len<=0) return(0); MqlRates rates[]; int l=len-1+MovingPeriod; int copied; if(LC_on==true) { int shift = LC_shift; ArrayResize(rates,l); copied=GetRatesLC(MovingShift,l,rates,BaseTF,shift); } else copied=CopyRates(_Symbol,_Period,MovingShift,l,rates); // if(copied<l) return(0); // for(int i=0;i<len;i++) { double sum=0; for(int j=0;j<MovingPeriod;j++) { if(LC_on==true) sum+=rates[j+i].close; else sum+=rates[copied-1-j-i].close; } ma[i]=sum/MovingPeriod; } return(len); }
En el búfer ma[] ella devuelve el número solicitado de valores de la media móvil, o 0 si por alguna razón no se ha podido obtenerlos.
Otro momento importante es el control de la apertura de las barras. En la versión estándar del EA Moving Average eso está implementado basándose en el valor de los volúmenes de tick:
if(rt[1].tick_volume>1) return;
En nuestra caso no hay volúmenes de tick por eso para el control de la apertura de las barras vamos a escribir la función newbar():
bool newbar(datetime t) { static datetime t_prev=0; if(t!=t_prev) { t_prev=t; return(true); } return(false); }
El principio de funcionamiento es muy sencillo: se compara la hora de la apertura de la barra con su valor anterior. Vamos a sustituir la comprobación del volumen de tick por la llamada a la función newbar() en dos lugares: en la función CheckForOpen() y CheckForClose():
if(newbar(rt[1].time)==false) return;
El código completo del EA hecho se encuentra en el archivo moving_average_lc.mq5.
4.2. EA que tradea por el patrón de la «barra pin»
La Barra Pin, o la Barra de Pinocho es un patrón de tres barras. La barra central tiene que tener una sombra larga, así llamada «la nariz», que indica en la posible reversa del movimiento del precio. Las barras que quedan a los lados se se denaminan «los ojos». Sus extremos no tienen que sobresalir de la sombra de la barra central. Este patrón es bastante popular entre los traders que tradean con los patrones de velas.
Nuestra barra pin tiene que cumplir las siguientes condiciones (para el giro del movimiento del precio hacia abajo):
- La barra r[0] tiene que ser alcista.
- La barra r[2] tiene que ser bajista.
- El mayor de los valores del precio A y C no debe superar B, donde A y C son los valores High de las barras r[0] y r[2], respectivamente, y B es el precio High de la barra r[1].
- El cuerpo de la barra central, es decir el módulo de diferencia Open-Close (en la figura - OC) de la barra r[1], no debe superar el número de puntos establecido en el parámetro externo.
- La sombra de la barra central, es decir la diferencia entre el precio High y el valor mayor de los valores Open y Close de la barra r[1], no debe ser menor del número de puntos establecido en el parámetro externo.
- La correlación de la sombra de la barra central a su cuerpo no debe ser menor del valor establecido en el parámetro externo.
Vamos a comprobar el patrón en el momento de la apertura de la barra r[3].
Fig. 7. Patrón «Barra Pin»
El código que define la presencia de la barra pin para la reversa hacia abajo tendrá el siguiente aspecto:
if(r[0].open<r[0].close && r[2].open>r[2].close && r[1].high>MathMax(r[0].high,r[2].high)) { //--- ojos de la barra pin superior double oc=MathAbs(r[1].open-r[1].close)/_Point; if(oc>inp_pb_max_OC) return(0); double shdw=(r[1].high-MathMax(r[1].open,r[1].close))/_Point; if(shdw<inp_pb_min_shdw) return(0); if(oc!=0) { if((shdw/oc)<inp_pb_min_ratio) return(0); } return(1); }
Lo mismo pasa para la reversa hacia arriba. Entonces, la función de la comprobación de la presencia de la barra pin es la siguiente:
int IsPinbar(MqlRates &r[]) { //--- en el array r[] tiene que haber 4 valores if(ArraySize(r)<4) return(0); if(r[0].open<r[0].close && r[2].open>r[2].close && r[1].high>MathMax(r[0].high,r[2].high)) { //--- los ojos de la barra pin superior double oc=MathAbs(r[1].open-r[1].close)/_Point; if(oc>inp_pb_max_OC) return(0); double shdw=(r[1].high-MathMax(r[1].open,r[1].close))/_Point; if(shdw<inp_pb_min_shdw) return(0); if(oc!=0) { if((shdw/oc)<inp_pb_min_ratio) return(0); } return(1); } else if(r[0].open>r[0].close && r[2].open<r[2].close && r[1].low<MathMin(r[0].low,r[2].low)) { //--- ojos de la barra pin inferior double oc=MathAbs(r[1].open-r[1].close)/_Point; if(oc>inp_pb_max_OC) return(0); double shdw=(MathMin(r[1].open,r[1].close)-r[1].low)/_Point; if(shdw<inp_pb_min_shdw) return(0); if(oc!=0) { if((shdw/oc)<inp_pb_min_ratio) return(0); } return(-1); } return(0); }
El array de los datos históricos traspasado no puede tener menos de cuatro elementos. En caso de detectar la barra pin superior (es decir, la barra pin que supone la reversa hacia abajo), la función devolverá el valor 1. En caso de detectar la barra pin inferior (se supone la reversa hacia arriba), la función devolverá el valor -1. Si no se encuentra ninguna barra pin, la función devuelve 0. Además, la función utiliza los siguientes parámetros de entrada:
input uint inp_pb_min_shdw = 40; // Pinbar min shadow, point input uint inp_pb_max_OC = 20; // Pinbar max OC, point input double inp_pb_min_ratio = 2.0; // Pinbar shadow to OC min ratio
Vamos a eligir la estrategia más simple para tradear por la barra pin. Si se supone la reversa hacia abajo, vamos a vender, si es hacia arriba, vamos a comprar. Normalmente, también se requiere la confirmación de indicadores. Pero en esta ocasión no vamos a utilizarlos para mantener la integridad del experimento. Vamos a usar exclusivamente la barra pin
Que el EA que tradea por el patrón «barra pin» se base en nuestro EA que tradea por las medias móviles. Primero, hay que eliminar de él la función CopyMABuffer(), así como su llamada desde las funciones CheckForOpen() y CheckForClose(). El número de los datos históricos solicitados se aumenta de dos a cuatro y para la comprobación de la apertura de la barra nueva vamos a usar la hora de la barra r[3]:
int copied; if(LC_on==true) { int shift = LC_shift; copied=GetRatesLC(0,4,rt,BaseTF,shift); } else copied = CopyRates(_Symbol,_Period,0,4,rt); if(copied!=4) { Print("CopyRates of ",_Symbol," failed, no history"); return; } if(newbar(rt[3].time)==false) return;
La comprobación de la señal para la apertura de la posición va a tener el siguiente aspecto:
int pb=IsPinbar(rt); if(pb==1) // barra pin superior signal=ORDER_TYPE_SELL; // sell conditions else if(pb==-1) // barra pin inferior signal=ORDER_TYPE_BUY; // buy conditions
Para cerrar la posición por la barra pin opuesta:
if(type==(long)POSITION_TYPE_BUY && pb==1) signal=true; if(type==(long)POSITION_TYPE_SELL && pb==-1) signal=true;
Aquí hay que tener presente que si las condiciones de los parámetros de entrada son estrictas, la barra pin va a encontrarse bastante raramente. Por eso si cerramos la posición sólo por la barra pin opuesta, corremos el riesgo de perder el beneficio, o incluso cerrarse con pérdidas.
Entonces, añadiremos los niveles Take Profit y Stop Loss. Vamos a establecerlos usando los parámetros externos inp_tp_pp y inp_sl_pp, respectivamente:
double sl=0,tp=0,p=0; double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK); double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID); if(signal==ORDER_TYPE_SELL) { p=bid; if(inp_sl_pp!=0) sl=NormalizeDouble(ask+inp_sl_pp*_Point,_Digits); if(inp_tp_pp!=0) tp=NormalizeDouble(ask-inp_sl_pp*_Point,_Digits); } else { p=ask; if(inp_sl_pp!=0) sl=NormalizeDouble(bid-inp_sl_pp*_Point,_Digits); if(inp_tp_pp!=0) tp=NormalizeDouble(bid+inp_sl_pp*_Point,_Digits); } CTrade trade; trade.PositionOpen(_Symbol,signal,TradeSizeOptimized(),p,sl,tp);
Si el valor de inp_tp_pp o inp_sl_pp es igual a cero, el nivel correspondiente de Take Profit o de Stop Loss no va a establecerse.
Pues, las modificaciones están completadas, el EA está hecho. El código completo se encuentra en el archivo pinbar_lc.mq5.
5. Optimización de los Asesores Expertos
Para evaluar la efectividad de los gráficos con desplazamiento para diferentes estrategias, vamos a utilizar la optimización de los EAs con la posterior comparación de los mejores resultados. Los parámetros más importantes serán el beneficio, la reducción (drawdown) y el número de los trades. El EA que tradea por las medias móviles servirá de ejemplo para una estrategia de indicadores, y el EA que tradea por el patrón «barra pin» va a representar una estrategia sin indicadores.
Para la optimización vamos a utilizar las cotizaciones del servidor MetaQuotes-Demo para un intervalo de medio año. En el experimento van a participar los pares de EURUSD, GBPUSD y USDJPY. El depósito inicial es de 3000 USD, con apalancamiento de 1:100. El modo de prueba es «todos los ticks». El modo de optimización - rápida (algoritmo genético), Balance Max.
5.1. Análisis de los resultados de la optimización del EA que tradea por las medias móviles
Vamos a comparar los resultados de la optimización del EA durante su trabajo en diferentes modos: sin desplazamiento, con desplazamiento estático y desplazamiento dinámico (DSO y DSC).
La prueba se realiza para los pares EURUSD, GBPUSD y USDJPY, en el intervalo 2014.04.01 - 2014.10.25 (el último medio año). Período H1.
Parámetros de entrada del EA:
Parámetro |
Valor |
---|---|
Maximum Risk in percentage |
0.1 |
Decrease factor |
3.0 |
Moving Average period |
12 |
Moving Average shift |
6 |
BaseTF |
1 Minute |
LC_on |
true |
LC_shift |
0 |
Tabla 3. Parámetros de entrada del EA Moving Average LC
5.1.1. Optimización del EA en el modo sin desplazamiento
Parámetros a optimizar:
Parámetro |
Inicio | Paso | Stop |
---|---|---|---|
Moving Average period |
12 |
1 |
90 |
Moving Average shift |
6 |
1 |
30 |
Tabla 4. Parámetros de optimización del EA Moving Average LC en el modo sin desplazamiento
Gráfico de optimización del EA en el modo sin desplazamiento, EURUSD:
Fig. 8. Optimización del EA Moving Average LC en el modo sin desplazamiento, EURUSD
Los mejores resultados:
Resultado |
Beneficio | Drawdown % |
Total de trades |
MovingPeriod | MovingShift |
---|---|---|---|---|---|
3796,43 | 796,43 | 16,18 | 111 | 24 | 12 |
3776,98 | 776,98 | 17,70 | 77 | 55 |
22 |
3767,45 | 767,45 | 16,10 | 74 | 59 |
23 |
3740,38 | 740,38 | 15,87 | 78 | 55 |
17 |
3641,16 | 641,16 | 15,97 | 105 | 12 |
17 |
Tabla 5. Los mejores resultados de optimización del EA Moving Average LC en el modo sin desplazamiento, EURUSD
Gráfico de optimización del EA en el modo sin desplazamiento, GBPUSD:
Fig. 9. Optimización del EA Moving Average LC en el modo sin desplazamiento, GBPUSD
Los mejores resultados:
Resultado | Beneficio | Drawdown % |
Total de trades |
MovingPeriod | MovingShift |
---|---|---|---|---|---|
4025,75 | 1025,75 | 8,08 | 80 | 18 |
22 |
3857,90 | 857,90 | 15,04 | 74 | 55 |
13 |
3851,40 | 851,40 | 18,16 | 80 | 13 |
24 |
3849,48 | 849,48 | 13,05 | 69 | 34 |
29 |
3804,70 | 804,70 | 16,57 | 137 | 25 |
8 |
Tabla 6. Los mejores resultados de optimización del EA Moving Average LC en el modo sin desplazamiento, GBPUSD
Gráfico de optimización del EA en el modo sin desplazamiento, USDJPY:
Fig. 10 Optimización del EA Moving Average LC en el modo sin desplazamiento, USDJPY
Los mejores resultados:
Resultado |
Beneficio |
Drawdown % |
Total de trades |
MovingPeriod | MovingShift |
---|---|---|---|---|---|
5801,63 | 2801,63 | 11,54 | 48 |
65 |
23 |
5789,17 | 2789,17 | 14,03 | 50 |
44 |
27 |
5539,06 | 2539,06 | 17,14 | 46 |
67 |
27 |
5331,34 | 2331,34 | 15,05 | 61 |
70 |
9 |
5045,19 | 2045,19 | 12,61 | 48 |
83 |
15 |
Tabla 7. Los mejores resultados de optimización del EA Moving Average LC en el modo sin desplazamiento, USDJPY
5.1.2. Optimización del EA en el modo de desplazamiento estático
Parámetros a optimizar:
Parámetro |
Inicio | Paso | Stop |
---|---|---|---|
Moving Average period |
12 |
1 |
90 |
Moving Average shift |
6 |
1 |
30 |
LC_shift | 1 | 1 | 59 |
Tabla 8. Parámetros de optimización del EA Moving Average LC en el modo de desplazamiento estático
Gráfico de optimización del EA en el modo de desplazamiento estático, EURUSD:
Fig. 11. Optimización del EA Moving Average LC en el modo de desplazamiento estático, EURUSD
Los mejores resultados:
Resultado |
Beneficio |
Drawdown % |
Total de trades |
MovingPeriod |
MovingShift |
LC_shift |
---|---|---|---|---|---|---|
4385,06 |
1385,06 |
12,87 | 100 | 32 | 11 | 8 |
4149,63 |
1149,63 |
14,22 | 66 | 77 | 25 | 23 |
3984,92 |
984,92 |
21,52 | 122 | 12 | 11 | 26 |
3969,35 |
969,35 |
16,08 | 111 | 32 | 11 | 24 |
3922,95 |
922,95 |
12,29 | 57 | 77 | 25 | 10 |
Tabla 9. Los mejores resultados de optimización del EA Moving Average LC en el modo de desplazamiento estático, EURUSD
Gráfico de optimización del EA en el modo de desplazamiento estático, GBPUSD:
Fig. 12 Optimización del EA Moving Average LC en el modo de desplazamiento estático, GBPUSD
Los mejores resultados:
Resultado | Beneficio | Drawdown % |
Total de trades |
MovingPeriod | MovingShift | LC_shift |
---|---|---|---|---|---|---|
4571,07 | 1571,07 | 14,90 | 79 | 12 |
25 |
42 |
4488,90 | 1488,90 | 15,46 | 73 | 12 |
25 |
47 |
4320,31 | 1320,31 | 9,59 | 107 | 12 |
16 |
27 |
4113,47 | 1113,47 | 10,96 | 75 | 12 |
25 |
15 |
4069,21 | 1069,21 | 15,27 | 74 | 12 |
25 |
50 |
10. Los mejores resultados de optimización del EA Moving Average LC en el modo de desplazamiento estático, GBPUSD
Gráfico de optimización del EA en el modo de desplazamiento estático, GBPUSD:
Fig. 13 Optimización del EA Moving Average LC en el modo de desplazamiento estático, USDJPY
Los mejores resultados:
Resultado |
Beneficio |
Drawdown % |
Total de trades |
MovingPeriod |
MovingShift | LC_shift |
---|---|---|---|---|---|---|
6051,39 | 3051,39 | 15,94 | 53 |
76 |
12 |
31 |
5448,98 | 2448,98 | 10,71 | 54 |
44 |
30 |
2 |
5328,15 | 2328,15 | 11,90 | 50 |
82 |
13 |
52 |
5162,82 | 2162,82 | 10,46 | 71 |
22 |
26 |
24 |
5154,71 | 2154,71 | 14,34 | 54 |
75 |
14 |
58 |
11. Los mejores resultados de optimización del EA Moving Average LC en el modo de desplazamiento estático, USDJPY
5.1.3. Optimización del EA en el modo de desplazamiento dinámico
Parámetros de optimización:
Parámetro |
Inicio | Paso | Stop |
---|---|---|---|
Moving Average period |
12 |
1 |
90 |
Moving Average shift |
6 |
1 |
30 |
LC_shift | -2 | 1 | -1 |
Tab. 12. Parámetros de optimización del EA Moving Average LC en el modo de desplazamiento dinámico
Gráfico de optimización del EA en el modo de desplazamiento dinámico, EURUSD:
Fig. 14 Optimización del EA Moving Average LC en el modo de desplazamiento dinámico, EURUSD
Los mejores resultados:
Resultado |
Beneficio |
Drawdown % |
Total de trades |
MovingPeriod |
MovingShift |
LC_shift |
---|---|---|---|---|---|---|
3392,64 | 392,64 | 27,95 | 594 | 15 | 13 | -2 |
3140,26 | 140,26 | 23,35 | 514 | 12 | 17 | -2 |
2847,12 | -152,88 | 17,04 | 390 | 79 | 23 | -1 |
2847,12 | -152,88 | 17,04 | 390 | 79 | 12 | -1 |
2826,25 | -173,75 | 20,12 | 350 | 85 | 22 | -1 |
Tab. 13. Los mejores resultados de optimización del EA Moving Average LC en el modo de desplazamiento dinámico, EURUSD
Gráfico de optimización del EA en el modo de desplazamiento dinámico, GBPUSD:
Fig. 15 Optimización del EA Moving Average LC en el modo de desplazamiento dinámico, GBPUSD
Los mejores resultados:
Resultado | Beneficio |
Drawdown % |
Total de trades |
MovingPeriod |
MovingShift | LC_shift |
---|---|---|---|---|---|---|
5377,58 | 2377,58 | 19,73 | 391 | 12 |
26 |
-2 |
3865,50 | 865,50 | 18,18 | 380 | 23 |
23 |
-2 |
3465,63 | 465,63 | 21,22 | 329 | 48 |
21 |
-2 |
3428,99 | 428,99 | 24,55 | 574 | 51 |
16 |
-1 |
3428,99 | 428,99 | 24,55 | 574 | 51 |
15 |
-1 |
Tab. 14. Los mejores resultados de optimización del EA Moving Average LC en el modo de desplazamiento dinámico, GBPUSD
Gráfico de optimización del EA en el modo de desplazamiento dinámico, USDJPY:
Fig. 16 Optimización del EA Moving Average LC en el modo de desplazamiento dinámico, USDJPY
Los mejores resultados:
Resultado |
Beneficio |
Drawdown % |
Total de trades |
MovingPeriod |
MovingShift |
LC_shift |
---|---|---|---|---|---|---|
6500,19 | 3500,19 | 17,45 | 244 |
42 |
28 |
-2 |
6374,18 | 3374,18 | 19,91 | 243 |
54 |
24 |
-2 |
6293,29 | 3293,29 | 19,30 | 235 |
48 |
27 |
-2 |
5427,69 | 2427,69 | 17,65 | 245 |
90 |
8 |
-2 |
5421,83 | 2421,83 | 16,30 | 301 |
59 |
12 |
-2 |
Tab. 15. Los mejores resultados de optimización del EA Moving Average LC en el modo de desplazamiento dinámico, USDJPY
5.2. Análisis de los resultados de la optimización del EA que tradea por el patrón «barra pin»
Vamos a comparar los resultados de la optimización del EA durante su trabajo en diferentes modos: sin desplazamiento, con desplazamiento estático y desplazamiento dinámico (DSO y DSC). La prueba se realiza para los pares EURUSD, GBPUSD y USDJPY, en el intervalo 2014.04.01 - 2014.10.25. Período H1.
Parámetros de entrada del EA:
Parámetro | Valor |
---|---|
Maximum Risk in percentage |
0.1 |
Descrease factor |
3.0 |
Pinbar min shadow, points |
40 |
Pinbar max OC, points |
110 |
Pinbar shadow to OC min ratio |
1.4 |
SL, points (0 for OFF) |
150 |
TP, points (0 for OFF) |
300 |
LC Base Period |
1 Minute |
LC mode ON |
true |
LC shift |
0 |
Tab. 16. Parámetros de entrada del EA Pinbar LC:
Vamos a optimizar los parámetros que caracterizan la geometría de la barra pin. Se trata de la longitud de la «nariz», relación entre la longitud de la «nariz» y el cuerpo de la barra central, así como el tamaño máximo del cuerpo. Además, vamos a optimizar los niveles Take Profit y Stop Loss.
5.2.1. Optimización del EA en el modo sin desplazamiento
Parámetros de optimización:
Parámetro | Inicio | Paso | Stop |
---|---|---|---|
Pinbar min shadow, points |
100 |
20 |
400 |
Pinbar max OC, points |
20 |
20 |
100 |
Pinbar shadow to OC min ratio |
1 |
0.2 |
3 |
SL, points (0 for OFF) |
150 |
50 |
500 |
TP, points (0 for OFF) |
150 |
50 |
500 |
Tab. 17. Parámetros de optimización del EA Pinbar LC en el modo sin desplazamiento
Gráfico de optimización del EA en el modo sin desplazamiento, EURUSD:
Fig. 17 Optimización del EA Pinbar LC en el modo sin desplazamiento, EURUSD
Los mejores resultados:
Resultado |
Beneficio |
Drawdown % |
Total de trades |
Pinbar min shadow |
Pinbar max OC |
Pinbar shadow to OC min ratio |
SL | TP |
---|---|---|---|---|---|---|---|---|
3504,59 |
504,59 |
9,82 |
33 |
100 |
60 |
1.8 |
450 |
500 |
3428,89 |
428,89 |
8,72 |
21 |
120 |
60 |
2.8 |
450 |
350 |
3392,37 |
392,37 |
9,94 |
30 |
100 |
60 |
2,6 |
450 |
250 |
3388,54 |
388,54 |
9,93 |
31 |
100 |
80 |
2,2 |
450 |
300 |
3311,84 |
311,84 |
6,84 |
13 |
140 |
60 |
2,2 |
300 |
450 |
Tab. 18. Los mejores resultados de optimización del EA Pinbar LC en el modo sin desplazamiento, EURUSD
Gráfico de optimización del EA en el modo sin desplazamiento, GBPUSD:
Fig. 18 Optimización del EA Pinbar LC en el modo sin desplazamiento, GBPUSD
Los mejores resultados:
Resultado |
Beneficio |
Drawdown % |
Total de trades |
Pinbar min shadow |
Pinbar max OC |
Pinbar shadow to OC min ratio |
SL | TP |
---|---|---|---|---|---|---|---|---|
3187,13 |
187,13 |
11,10 |
13 |
160 |
60 |
2,6 |
500 |
350 |
3148,73 |
148,73 |
3,23 |
4 |
220 |
40 |
2,8 |
400 |
400 |
3142,67 |
142,67 |
11,27 |
17 |
160 |
100 |
1,8 |
500 |
350 |
3140,80 |
140,80 |
11,79 |
13 |
180 |
100 |
2 |
500 |
500 |
3094,20 |
94,20 |
1,62 |
1 |
260 |
60 |
1,6 |
500 |
400 |
Tab. 19. Los mejores resultados de optimización del EA Pinbar LC en el modo sin desplazamiento, GBPUSD
Gráfico de optimización del EA en el modo sin desplazamiento, USDJPY:
Fig. 19 Optimización del EA Pinbar LC en el modo sin desplazamiento, USDJPY
Los mejores resultados:
Resultado |
Beneficio |
Drawdown % |
Total de trades |
Pinbar min shadow |
Pinbar max OC |
Pinbar shadow to OC min ratio |
SL | TP |
---|---|---|---|---|---|---|---|---|
3531,99 |
531,99 |
9,00 |
6 |
160 |
60 |
2.2 |
450 |
500 |
3355,91 |
355,91 |
18,25 |
16 |
120 |
60 |
1,6 |
450 |
400 |
3241,93 |
241,93 |
9,11 |
4 |
160 |
40 |
2,8 |
450 |
500 |
3180,43 |
180,43 |
6,05 |
33 |
100 |
80 |
1,8 |
150 |
450 |
3152,97 |
152,97 |
3,14 |
6 |
160 |
80 |
2,8 |
150 |
500 |
Tab. 20. Los mejores resultados de optimización del EA Pinbar LC en el modo sin desplazamiento, USDJPY
5.2.2. Optimización del EA en el modo de desplazamiento estático
Parámetros de optimización:
Parámetro | Inicio | Paso | Stop |
---|---|---|---|
Pinbar min shadow, points |
100 |
20 |
400 |
Pinbar max OC, points |
20 |
20 |
100 |
Pinbar shadow to OC min ratio |
1 |
0.2 |
3 |
SL, points (0 for OFF) |
150 |
50 |
500 |
TP, points (0 for OFF) |
150 |
50 |
500 |
LC shift |
1 | 1 | 59 |
Tab. 21. Parámetros de optimización del EA Pinbar LC en el modo de desplazamiento estático
Gráfico de optimización del EA en el modo de desplazamiento estático, EURUSD:
Fig. 20 Optimización del EA Pinbar LC en el modo de desplazamiento estático, EURUSD
Los mejores resultados:
Resultado |
Beneficio |
Drawdown % |
Total de trades |
Pinbar min shadow |
Pinbar max OC |
Pinbar shadow to OC min ratio |
SL | TP | LC shift |
---|---|---|---|---|---|---|---|---|---|
4843,54 |
1843,54 |
10,14 |
19 |
120 |
80 |
1,6 |
500 |
500 |
23 |
4714,81 |
1714,81 |
10,99 |
28 |
100 |
100 |
1,6 |
500 |
500 |
23 |
4672,12 |
1672,12 |
10,16 |
18 | 120 |
80 |
1,8 |
500 |
500 |
23 |
4610,13 |
1610,13 |
9,43 |
19 |
120 |
80 |
1,6 |
450 |
450 |
23 |
4562,21 |
1562,21 |
13,94 |
27 |
100 |
100 |
1,6 |
500 |
400 |
25 |
Tab. 22. Los mejores resultados de optimización del EA Pinbar LC en el modo de desplazamiento estático, EURUSD
Gráfico de optimización del EA en el modo de desplazamiento estático, GBPUSD:
Fig. 21 Optimización del EA Pinbar LC en el modo de desplazamiento estático, GBPUSD
Los mejores resultados:
Resultado |
Beneficio |
Drawdown % |
Total de trades |
Pinbar min shadow |
Pinbar max OC |
Pinbar shadow to OC min ratio |
SL | TP | LC shift |
---|---|---|---|---|---|---|---|---|---|
4838,10 |
1838,10 |
5,60 |
34 |
100 |
40 |
2,4 |
450 |
500 |
24 |
4797,09 |
1797,09 |
5,43 |
35 |
100 |
40 |
2,6 |
400 |
500 |
24 |
4755,57 |
1755,57 |
7,36 |
42 |
100 |
100 |
2 |
400 |
500 |
24 |
4725,41 |
1725,41 |
8,35 |
45 |
100 |
80 |
1 |
400 |
500 |
24 |
4705,61 |
1705,61 |
8,32 |
41 |
100 |
100 |
2 |
450 |
500 |
24 |
Tab. 23. Los mejores resultados de optimización del EA Pinbar LC en el modo de desplazamiento estático, GBPUSD
Gráfico de optimización del EA en el modo de desplazamiento estático, GBPUSD:
Fig. 22 Optimización del EA Pinbar LC en el modo de desplazamiento estático, USDJPY
Los mejores resultados:
Resultado |
Beneficio |
Drawdown % |
Total de trades |
Pinbar min shadow |
Pinbar max OC |
Pinbar shadow to OC min ratio |
SL | TP | LC shift |
---|---|---|---|---|---|---|---|---|---|
4108,83 |
1108,83 |
6,45 |
9 |
140 |
40 |
1,4 |
500 |
450 |
55 |
3966,74 |
966,74 |
7,88 |
12 |
140 |
60 |
2,8 |
450 |
500 |
45 |
3955,32 |
955,32 |
9,91 |
21 |
120 |
80 |
2 |
500 |
500 |
45 |
3953,80 |
953,80 |
6,13 |
10 |
140 |
60 |
2,8 |
450 |
450 |
47 |
3944,33 |
944,33 |
6,42 |
6 |
160 |
100 |
2,6 |
500 |
400 |
44 |
Tab. 24. Los mejores resultados de optimización del EA Pinbar LC en el modo de desplazamiento estático, USDJPY
5.2.3. Optimización del EA en el modo de desplazamiento dinámico
Parámetros de optimización:
Parámetro | Inicio | Paso | Stop |
---|---|---|---|
Pinbar min shadow, points |
100 |
20 |
400 |
Pinbar max OC, points |
20 |
20 |
100 |
Pinbar shadow to OC min ratio |
1 |
0.2 |
3 |
SL, points (0 for OFF) |
150 |
50 |
500 |
TP, points (0 for OFF) |
150 |
50 |
500 |
LC shift |
-2 | 1 | -1 |
Tab. 25. Parámetros de optimización del EA Pinbar LC en el modo de desplazamiento dinámico
Gráfico de optimización del EA en el modo de desplazamiento dinámico, EURUSD:
Fig. 23 Optimización del EA Pinbar LC en el modo de desplazamiento dinámico, EURUSD
Los mejores resultados:
Resultado |
Beneficio |
Drawdown % |
Total de trades |
Pinbar min shadow |
Pinbar max OC |
Pinbar shadow to OC min ratio |
SL | TP | LC shift |
---|---|---|---|---|---|---|---|---|---|
4185,65 |
1185,65 |
13,22 |
49 |
200 |
100 |
1,8 |
450 |
500 |
-2 |
4011,80 |
1011,80 |
13,75 |
49 |
200 |
100 |
2 |
400 |
500 |
-2 |
3989,28 |
989,28 |
12,01 |
76 |
140 |
20 |
1,2 |
350 |
200 |
-1 |
3979,50 |
979,50 |
16,45 |
157 |
100 |
20 |
1 |
450 |
500 |
-1 |
3957,25 |
957,25 |
16,68 |
162 |
100 |
20 |
1 |
400 |
500 |
-1 |
Tab. 26. Los mejores resultados de optimización del EA Pinbar LC en el modo de desplazamiento dinámico, EURUSD
Gráfico de optimización del EA en el modo de desplazamiento dinámico, GBPUSD:
Fig. 24 Optimización del EA Pinbar LC en el modo de desplazamiento dinámico, GBPUSD
Los mejores resultados:
Resultado |
Beneficio |
Drawdown % |
Total de trades |
Pinbar min shadow |
Pinbar max OC |
Pinbar shadow to OC min ratio |
SL | TP | LC shift |
---|---|---|---|---|---|---|---|---|---|
4906,84 |
1906,84 |
10,10 |
179 |
120 |
40 |
1,8 |
500 |
500 |
-2 |
4316,46 |
1316,46 |
10,71 |
151 |
120 |
20 |
2,4 |
450 |
500 |
-1 |
4250,96 |
1250,96 |
12,40 |
174 |
120 |
40 |
1,8 |
500 |
500 |
-1 |
4040,82 |
1040,82 |
12,40 |
194 |
120 |
60 |
2 |
500 |
200 |
-2 |
4032,85 |
1032,85 |
11,70 |
139 |
140 |
40 |
2 |
400 |
200 |
-1 |
Tab. 27. Los mejores resultados de optimización del EA Pinbar LC en el modo de desplazamiento dinámico, GBPUSD
Gráfico de optimización del EA en el modo de desplazamiento dinámico, USDJPY:
Fig. 25 Optimización del EA Pinbar LC en el modo de desplazamiento dinámico, USDJPY
Los mejores resultados:
Resultado |
Beneficio |
Drawdown % |
Total de trades |
Pinbar min shadow |
Pinbar max OC |
Pinbar shadow to OC min ratio |
SL | TP | LC shift |
---|---|---|---|---|---|---|---|---|---|
5472,67 |
2472,67 |
13,01 |
138 |
100 |
20 |
2,4 |
500 |
500 |
-1 |
4319,84 |
1319,84 |
15,87 |
146 |
100 |
20 |
2,2 |
400 |
500 |
-1 |
4259,54 |
1259,54 |
19,71 |
137 |
100 |
20 |
2,4 |
500 |
500 |
-2 |
4197,57 |
1197,57 |
15,98 |
152 |
100 |
20 |
1 |
350 |
500 |
-1 |
3908,19 |
908,19 |
16,79 |
110 |
120 |
40 |
3 |
400 |
400 |
-1 |
Tab. 28. Los mejores resultados de optimización del EA Pinbar LC en el modo de desplazamiento dinámico, USDJPY
6. Comparación de los resultados de optimización
Para construir la tabla comparativa, vamos a seleccionar los valores máximos del beneficio, reducción y el número de los trades de cada una de las tablas de los mejores resultados. Al lado del valor recibido en el modo de desplazamiento estático y dinámico apuntaremos por cuántos por cientos se ha cambiado este valor respecto al valor del modo sin desplazamiento.
6.1. EA que tradea por las medias móviles
Beneficio:
Sin desplazamiento |
Desplazamiento estático |
Desplazamiento dinámico |
|
---|---|---|---|
EURUSD |
796,43 |
1385,06 (+74%) |
392,64 (-51%) |
GBPUSD |
1025,75 |
1571,07 (+53%) |
2377,58 (+132%) |
USDJPY |
2801,63 |
3051,39 (+9%) |
3500,19 (+25%) |
Tab. 29. Comparación de los valores máximos del beneficio a base de las tablas de los mejores resultados de optimización del EA Moving Average LC
Drawdown:
Sin desplazamiento |
Desplazamiento estático |
Desplazamiento dinámico |
|
---|---|---|---|
EURUSD |
17,7 |
21,52 (+22%) |
27,95 (+58%) |
GBPUSD |
18,16 |
15,46 (-15%) |
24,55 (+35%) |
USDJPY |
17,14 |
15,94 (-7%) |
19,91 (+16%) |
Tab. 30. Comparación de los valores máximos de la reducción a base de las tablas de los mejores resultados de optimización del EA Moving Average LC
Total de trades:
Sin desplazamiento |
Desplazamiento estático |
Desplazamiento dinámico |
|
---|---|---|---|
EURUSD |
111 |
122 (+10%) |
594 (+435%) |
GBPUSD |
137 |
107 (-22%) |
574 (+319%) |
USDJPY |
61 |
71 (+16%) |
301 (+393%) |
Tab. 31. Comparación de los valores máximos del número de trades a base de las tablas de los mejores resultados de optimización del EA Moving Average LC
Lo primero que salta a la vista es el aumento significante de los puntos de entrada en el modo de desplazamiento dinámico. Sin embargo, el drawdown también se ha aumentado bastante, y para el par EURUSD el beneficio ha bajado el doble.
El modo de desplazamiento estático conviene mucho mejor para este EA. Vemos la bajada del drawdown para GBPUSD y USDJPY, y un importante aumento del beneficio para EURUSD y GBPUSD.
6.2. EA que tradea por el patrón «barra pin»
Beneficio:
Sin desplazamiento |
Desplazamiento estático |
Desplazamiento dinámico |
|
---|---|---|---|
EURUSD |
504,59 |
1843,54 (+265%) |
1185,65 (+135%) |
GBPUSD |
187,13 |
1838,10 (+882%) |
1906,84 (+919%) |
USDJPY |
531,99 |
1108,83 (+108%) | 2472,67 (+365%) |
Tab. 32. Comparación de los valores máximos del beneficio a base de las tablas de los mejores resultados de optimización del EA Pinbar LC
Drawdown:
Sin desplazamiento |
Desplazamiento estático |
Desplazamiento dinámico |
|
---|---|---|---|
EURUSD |
9,94 |
13,94 (+40%) |
16,68 (+68%) |
GBPUSD |
11,79 |
8,35 (-29%) |
12,4 (+5%) |
USDJPY |
18,25 |
9,91 (-46%) |
19,71 (+8%) |
Tab. 33. Comparación de los valores máximos de la reducción a base de las tablas de los mejores resultados de optimización del EA Pinbar LC
Total de trades:
Sin desplazamiento |
Desplazamiento estático |
Desplazamiento dinámico |
|
---|---|---|---|
EURUSD |
33 |
28 (-15%) |
162 (+391%) |
GBPUSD |
17 |
45 (+165%) |
194 (+1041%) |
USDJPY |
33 |
21 (-36%) |
152 (+361%) |
Tab. 34. Comparación de los valores máximos del número de trades a base de las tablas de los mejores resultados de optimización del EA Pinbar LC
Aquí también observamos el aumento considerable del número de los trades en el modo de desplazamiento dinámico. Pero el aumento del drawdown tan importante como se veía para Moving Average LC, aquí se ve sólo para el par EURUSD. Para el resto de los pares el drawdown ha crecido ligeramente, unos 5-8%.
En el modo de desplazamiento estático la optimización ha mostrado el beneficio más moderado para GBPUSD y USDJPY. A pesar de eso, vemos la reducción del drawdown más notable para los mismos pares, y al revés, su aumento para EURUSD. En total, el modo de desplazamiento estático se ve menos atractivo para este EA.
Conclusión
En este artículo hemos considerado los principios de la construcción de un «gráfico líquido» y hemos comparado la influencia de sus modos de trabajo en los resultados de la optimización de los EAs que utilizan la estrategia de indicadores y la estrategia sin indicadores.
De aquí podemos deducir los siguiente:
- El modo de desplazamiento estático conviene mejor para los EAs que utilizan las estrategias de indicadores (por ejemplo, los que tradean por las medias móviles). Asegura la entrada en el mercado más precisa, lo que lleva a la reducción del drawdown y al aumento del beneficio.
- El modo de desplazamiento dinámico resulta más conveniente para los EAs que utilizan los patrones en el trading. Aumenta considerablemente el número de los puntos de entrada, pero por otro lado se aumenta también el drawdown.
- El modo de desplazamiento dinámico en combinación con la Gestión del Capital bien organizada puede asegurar unos resultados bastante buenos.
- El modo de desplazamiento estático, a pesar de ser bastante atractivo para las estrategias de indicadores, tiene un importante inconveniente. Es que el tamaño del desplazamiento que garantiza el mejor resultado es una variable más en la lista de los parámetros de entrada que hay que adivinar.
Traducción del ruso hecha por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/ru/articles/1208






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