Medias Móviles Aceleradas.

Como sacar el máximo provecho a las medias móviles para extraer un mayor número de señales positivas en un período de tiempo reducido.

El gran dilema con el que siempre nos encontramos a la hora de elegir alguna media móvil está entre seleccionar un periodo que nos de señales algo más fiables o por el contrario alguno que nos de señales mucho más rápidas.

Como todos sabemos, los periodos más cortos nos darán más señales aprovechando mejor los movimientos, pero con la desventaja de tener un alto índice de señales falsas.

Por eso, he querido intentar mezclar lo mejor de los dos periodos, aprovechar mejor los movimientos pero con las menores señales falsas posibles. Para esto, lo primero que tenemos que hacer es intentar suavizar los precios con el menor retraso posible. En el gráfico 1 puedes ver en una gráfica diaria tres tipos de medias diferentes.

  • Color verde: una EMA de 10 días (media móvil exponencial). El gran inconveniente que tenemos con este periodo a pesar de ser corto, es que cuando la tendencia se confirma suele transcurrir una media de una semana. Necesitamos menos tiempo, para poder saber cuando una tendencia se ha confirmado, y no perdernos así gran parte del movimiento.
  • Color rojo: una TEMA ( media móvil exponencial triple).Como se puede observar, la respuesta al movimiento del precio es muy rápida, no obstante, no está lo suficientemente suavizada a precios de cierre.
  • Color azul: formada por una TEMA de 10 días basada en los precios de cierre del indicador heiken así- en este caso, vemos como además de rápida está lo suficientemente suavizada, no dando tantas señales falsas.

La TEMA y medias Heihin Ashi

MetaStock® y MetaTrader4
TEMA average
TEMA, la triple media movil exponencial fue publicada por primera vez en la revista Stocks&Commodities de febrero de 1994 por Patrick Mulloy. El precio pasa por diferentes time frames siendo filtrados y combinados.

TEMA = 3*EMA – 3*EMA(EMA) + EMA(EMA(EMA))

MetaStock ® tiene una función incorporada con la media TEMA. Si necesita construir una media TEMA (el máximo más el mínimo más el cierre dividido entre 3), puedes escribir la fórmula de MetaStock® así :Tema(Typ(), 30)

Para MetaTrader4 puedes usar la siguiente fórmula

(SVE_TEMA_Typ.mq4):
// ————–SVE_TEMA_Typ.mq4: a TEMA average on the Typical price——————–

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Blue
extern int EMA_period=30;
double TemaBuffer[];
double Ema1[];
double Ema2[];
double Ema3[];
// Initialization function
int init()
{
IndicatorBuffers(4);
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,TemaBuffer);
SetIndexBuffer(1,Ema1);
SetIndexBuffer(2,Ema2);
SetIndexBuffer(3,Ema3);
IndicatorShortName(“TEMA(“+EMA_period+”)”);
return(0);
}
// Custom indicator iteration function
int start()
{
int i,limit1,limit2,limit3,counted_bars=IndicatorCounted();
if (counted_bars==0)
{
limit1=Bars-1;
limit2=limit1-EMA_period;
limit3=limit2-EMA_period;
}
if (counted_bars>0)
{
limit1=Bars-counted_bars-1;
limit2=limit1;
limit3=limit2;
}
for (i=limit1;i>=0;i–) Ema1[i]=iMA(NULL,0,EMA_period,0,MODE_EMA,PRICE_TYPICAL,i);
for (i=limit2;i>=0;i–) Ema2[i]=iMAOnArray(Ema1,0,EMA_period,0,MODE_EMA,i);
for (i=limit3;i>=0;i–) Ema3[i]=iMAOnArray(Ema2,0,EMA_period,0,MODE_EMA,i);
for (i=limit3;i>=0;i–) TemaBuffer[i]=3*Ema1[i]-3*Ema2[i]+Ema3[i];
return(0);
}
// —————————–TEMA average function END————————————–

Media TEMA Heikin Ashi

para MetaStock® y MetaTrader4:

Heikin ashi, en japonés “barra promedio”, es una técnica usada especialmente en gráficos de velas que permite visualizar mejor las tendencias. Esta técnica fue introducida por Dan Valcu en febrero de 2004 en la revista Stocks&Commodities

El cálculo original de las velas heikin así es el siguiente:

xClose = (Open+High+Low+Close)/4; o el precio medio de la barra actual.
xOpen = [xOpen(Previous Bar) + Close(Previous Bar)]/2; o el punto medio de la barra anterior.
xHigh = Max(High, xOpen, xClose); el valor más alto en conjunto.
xLow = Min(Low, xOpen, xClose); el valor más bajo en conjunto.

Sin embargo, dado que el componente xClose es siempre menor o igual al componente High, es redundante dentro de la función MAX de xHigh y la xHigh modificada se puede definir como: xHigh modificada = Max (high, xOpen); El mismo planteamiento es válido para la función xLow: xLow modificada = Min (low, xOpen), a continuación puedo calcular el precio de cierre promedio heikin ashi como resultado de: (+ + xOpen xHigh xClose xLow +) / 4

Puedes utilizar la siguiente formula de MetaStock® para calcular la media TEMA en los precios de cierre de las velas heikin ashi(SVE_TEMA_haC):

average:=Input(“TEMA Average?”,2,200,10);
haOpen:=(Ref((O+H+L+C)/4,-1) + PREV)/2;
haClose:=((O+H+L+C)/4+haOpen+Max(H,haOpen)+Min(L,haOpen))/4;
Tema(haClose(), average)

Para MetaTrader4 puedes utilizar esta otra (SVE_TEMA_haC):

// SVE_TEMA_haC.mq4
// A TEMA average indicator on the heikin ashi average closing price

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Blue
#property indicator_width1 1
//—- input parameters
extern int EMA_period=20;
//—- buffers
double TemaBuffer[];
double Ema1[];
double Ema2[];

double Ema3[];
double TEMA1[];

// Custom indicator initialization function
int init()
{
//—- indicators
IndicatorBuffers(5);
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,TemaBuffer);
SetIndexBuffer(1,Ema1);
SetIndexBuffer(2,Ema2);
SetIndexBuffer(3,Ema3);
SetIndexBuffer(4,TEMA1);
IndicatorShortName(“TEMA_haC(“+EMA_period+”)”);
return(0);
}
// Custom indicator deinitialization function
int deinit()
{
return(0);
}

// Custom indicator SVE_TEMA_haC function
int start()
{
int i,limit,counted_bars=IndicatorCounted();
//—-
if (counted_bars==0)
{
limit=Bars-1;
}
if (counted_bars>0)
{
limit=Bars-counted_bars-1;
}
for (i=limit;i>=0;i–) TEMA1[i]=iCustom(NULL,0,”SVE_haC”,0,i);
for (i=limit;i>=0;i–) Ema1[i]=iMAOnArray(TEMA1,0,EMA_period,0,MODE_EMA,i);
for (i=limit;i>=0;i–) Ema2[i]=iMAOnArray(Ema1,0,EMA_period,0,MODE_EMA,i);
for (i=limit;i>=0;i–) Ema3[i]=iMAOnArray(Ema2,0,EMA_period,0,MODE_EMA,i);
for (i=limit;i>=0;i–) TemaBuffer[i]=3*Ema1[i]-3*Ema2[i]+Ema3[i];
return(0);
}
//+———————————END OF FUNCTION——————————————+

¡Rapidez con retraso cero!

La técnica utilizada para suavizar los datos y conseguir que tengan un retraso menor o como se ha llegado a llamar la técnica de “retraso cero” fue publicada en la revista Stocks&Commodities por Patrick Mulloy en febrero de 1994 y por John Ehlers en marzo del 2000. Esta técnica se utiliza para compensar el retraso que las medias móviles tienen:

En la figura 2 se puede ver un gráfico diario en el que comparamos tres medias móviles:

– color rojo-Media TEMA de 10 periodos (Media Móvil Exponencial Triple) en los precios de cierre.

– color azul –Media TEMA de 10 periodos calculada sobre precios de cierre heikin ashi.

– color verde Media TEMA “retraso cero” de 10 periodos calculada sobre precios de cierre heikin ashi.

Como se puede ver en la gráfica esta última, la media TEMA “retraso cero” se muestra mucho más rápida a la hora de mostrar puntos de inflexión que, incluso, la media basada en precios de cierre Heiken Ashi sin “retraso cero”. Es claramente la mejor, suavizando el movimiento del precio pero mostrándose rápida a los cambios. Lo que todos buscamos en una media móvil.

Fórmulas para crear los Indicadores
“Cero Retraso”

Media TEMA Heikin Ashi “retraso cero”
para MetaStock® and MetaTrader4

En MetaStock® la TEMA con “retraso cero” basada en el precio normal, no en Heikin Ashi, se programa de la siguiente manera (SVE_Typ_TEMA_ZL) :
period := Input(“¿ te pide el pediodo de la TEMA? “,1,250,30);
TMA1:= Tema(Typ(),period);
TMA2:= Tema(TMA1,period);
Difference:= TMA1 – TMA2;
TypTemaZl:= TMA1 + Difference;
TypTemaZl

Fórmula para MetaTrader4
(SVE_Typ_TEMA_ZL)

// SVE_Typ_TEMA_ZL.mq4
// media TEMA con “retraso cero” basada en el precio normal.
// ¡necesitas tener la función “SVE_TEMA_Typ” habilitada! —-

#property copyright “Copyright © 2010, Sylvain Vervoort”
#property link “http://stocata.org/”
#property indicator_chart_window
#property indicator_buffers 1
extern int TEMA_period=30;
double TEMA1[];
double Diff[];
double Ema1[];
double Ema2[];
double Ema3[];
double ZlCl[];
// Custom indicator initialization function
int init()
{
IndicatorBuffers(6);
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ZlCl);
SetIndexBuffer(1,Ema1);
SetIndexBuffer(2,Ema2);
SetIndexBuffer(3,Ema3);
SetIndexBuffer(4,TEMA1);
SetIndexBuffer(5,Diff);
IndicatorShortName(“Typ_TEMA_ZL(“+TEMA_period+”)”);
return(0);
}
// Typical TEMA zero-lagging price calculation
int start()
{
int i,limit,counted_bars=IndicatorCounted();
//—-
if (counted_bars==0)
{
limit=Bars-1;
}
if (counted_bars>0)
{
limit=Bars-counted_bars-1;
}
for (i=limit;i>=0;i–) TEMA1[i]=iCustom(NULL,0,”SVE_TEMA_Typ”,TEMA_period,0,i);
for (i=limit;i>=0;i–) Ema1[i]=iMAOnArray(TEMA1,0,TEMA_period,0,MODE_EMA,i);
for (i=limit;i>=0;i–) Ema2[i]=iMAOnArray(Ema1,0,TEMA_period,0,MODE_EMA,i);
for (i=limit;i>=0;i–) Ema3[i]=iMAOnArray(Ema2,0,TEMA_period,0,MODE_EMA,i);
for (i=limit;i>=0;i–) Diff[i]=TEMA1[i]-(3*Ema1[i]-3*Ema2[i]+Ema3[i]);
for (i=limit;i>=0;i–) ZlCl[i]=TEMA1[i]+Diff[i];
return(0);
}
//——END of Function SVE_Typ_TEMA ————————————–

Media TEMA con “retraso cero” calculada sobre Heikin Ashi para MetaStock® y MetaTrader4.

Fórmula para MetaStock®
(SVE_HA_TEMA_ZL)

period := Input(“Required TEMA period? “,1,250,30);
haOpen:=(Ref((O+H+L+C)/4,-1) + PREV)/2;
haClose:=((O+H+L+C)/4+haOpen+Max(H,haOpen)+Min(L,haOpen))/4;
TMA1:= Tema(haClose,period);
TMA2:= Tema(TMA1,period);
Difference:= TMA1 – TMA2;
HaTemaZl:= TMA1 + Difference;
haTemaZl

Para MetaTrader4 (SVE_HA_TEMA_ZL):

// SVE_haC_Tema_ZL.mq4
// Copyright © 2010, Sylvain Vervoort – http://stocata.org/
// A zero-lagging TEMA average indicator on the average heikin ashi price
// You need also the “SVE_haC” function
// and the “SVE_TEMA_haC” function that are called by this function
// Note that you need about 5 times the choosen TEMA average before getting a usefull signal!!!

#property copyright “Copyright © 2010, Sylvain Vervoort”
#property link “http://stocata.org/”
#property indicator_chart_window
#property indicator_buffers 1
extern int TEMA_period=30;
double TEMA1[];
double Diff[];
double Ema1[];
double Ema2[];
double Ema3[];
double ZlCl[];
// initialization function
int init()
{
IndicatorBuffers(6);
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ZlCl);
SetIndexBuffer(1,Ema1);
SetIndexBuffer(2,Ema2);
SetIndexBuffer(3,Ema3);
SetIndexBuffer(4,TEMA1);
SetIndexBuffer(5,Diff);
IndicatorShortName(“haC_TEMA_ZL(“+TEMA_period+”)”);
return(0);
}
// Custom indicator SVE_haC_Tema_ZL function
int start()
{
int i,limit,limit2,limit3,counted_bars=IndicatorCounted();
if (counted_bars==0)
{
limit=Bars-1;
limit2=limit-TEMA_period;
limit3=limit2-TEMA_period;
}
if (counted_bars>0)
{
limit=Bars-counted_bars-1;
limit2=limit;
limit3=limit2;
}
for (i=limit;i>=0;i–) TEMA1[i]=iCustom(NULL,0,”SVE_TEMA_haC”,TEMA_period,0,i);
for (i=limit;i>=0;i–) Ema1[i]=iMAOnArray(TEMA1,0,TEMA_period,0,MODE_EMA,i);
for (i=limit;i>=0;i–) Ema2[i]=iMAOnArray(Ema1,0,TEMA_period,0,MODE_EMA,i);
for (i=limit;i>=0;i–) Ema3[i]=iMAOnArray(Ema2,0,TEMA_period,0,MODE_EMA,i);
for (i=limit;i>=0;i–) Diff[i]=TEMA1[i]-(3*Ema1[i]-3*Ema2[i]+Ema3[i]);
for (i=limit;i>=0;i–) ZlCl[i]=TEMA1[i]+Diff[i];
return(0);
}
//———–END of Function SVE_haC_Tema_ZL——————