Indicadores: Trends Accumulator

 

Trends Accumulator:

Acumulador de los movimientos del precio. Determina el comienzo y el final de una tendencia.

Autor: Diogo Seca

 
Buenos días Diego, estoy utilizando el acumulador de tendencias, me gustaría una modificación personalizada, ¿podemos hablar?
 

Es necesario especificar en la descripción qué dibuja el indicador.

 

¿Se pueden añadir alertas sonoras cuando cambia la tendencia?

 
Añadir sonido de recordatorio
 

Hola Diogo,


¿Por casualidad tienes disponible la versión para MT4? Gracias

 
El indicador es perfecto, pero veo un problema..... El repintado!
¿Es posible arreglar esto?
 

Con Colores:


//propiedades

#property copyright "Copyright 2016, quebralim"

#property enlace "https://www.mql5.com/en/users/quebralim"

#property version "1.4"

#property description "Acumulador de tendencias"

#property indicador_separar_ventana

#propiedad indicator_buffers 4

#propiedad indicator_plots 1

#property indicator_type1 DRAW_COLOR_HISTOGRAM

#propiedad indicator_colour1 clrBlue,clrRed

#propiedad indicator_width1 10

#property indicator_label1 "Acumulador de tendencias"

//entradas

input uint Umbral =40; //Umbral (en puntos)

input uint MA_Period =10; //Periodo MA (en barras)

input ENUM_MA_METHOD MA_Method =MODE_EMA; //Método MA

input ENUM_APPLIED_PRICE MA_Price =PRICE_TYPICAL; //Precio MA

//globales

double bTA[]; //Buffer TA

double bMA[]; // Memoria intermedia MA

int hMA; // Manejador MA

double cTA[]; // Buffer Clr

double xTA[]; // Buffer TA Clr



//+------------------------------------------------------------------+

//| Función de Inicialización del Indicador

//+------------------------------------------------------------------+

int OnInit()

{

//comprobación de entradas

if(MA_Period<1)

return INIT_PARAMETERS_INCORRECT;


//índice inits

SetIndexBuffer(0,xTA,INDICATOR_DATA);

SetIndexBuffer(1,cTA,INDICATOR_COLOR_INDEX);

SetIndexBuffer(2,bMA,INDICATOR_CALCULATIONS);

SetIndexBuffer(3,bTA,INDICATOR_CALCULATIONS);

PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);

PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,MA_Period);

//nombre del indicador init

IndicatorSetString(INDICATOR_SHORTNAME, "Acumulador de tendencia ("+(cadena)Umbral+", "+(cadena)Periodo_MA+")");


//Inicio de MA

hMA=iMA(_Símbolo,_Periodo,MA_Periodo,0,MA_Método,MA_Precio);

if (hMA == INVALID_HANDLE){

Print("¡Ha fallado la inicialización del indicador MA!");

return INIT_FAILED;

}

/¡éxito!

return INIT_SUCCEED;

}

//+------------------------------------------------------------------+

//| Función de cálculo

//+------------------------------------------------------------------+

int OnCalculate(const int rates_total,

const int prev_calculado,

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[])

{

//¿hay suficientes datos?

if(rates_total<=(int)MA_Period)

{

return 0;

}


//¿está MA lista para copiar?

ResetLastError();

if(BarsCalculated(hMA)<tasa_total)

{

Print("No se han calculado todos los datos de MA. Error #",GetLastError());

return prev_calculado;

}


/¿qué cantidad de MA debemos copiar?

int to_copy;

if(prev_calculado>tasa_total || prev_calculado<=0)

{

a_copiar=tasa_total;

}

else

{

to_copy=total_tarifas-prev_calculado+2;

}


//comprobar si se ha detenido antes de la operación grande

if(IsStopped())

{

return 0;

}


//copiar búfer MA

ResetLastError();

if(CopyBuffer(hMA,0,0,to_copy,bMA)<=0)

{

Print("¡Fallo al obtener MA! Error #",GetLastError());

return prev_calculado;

}


//calcular inicio

int i;

if(prev_calculado<=(int)Periodo_MA)

{

i=(int)Periodo_MA;

}

else

{

i=prev_calculado-1;

}


//calcular TA a través de inicio...i...tasas_total

int iMax;

while(i<total_tasas-1)

{

//cláusula de parada

if(IsStopped())

{

return 0;

}


//primer valor

bTA[i]=bTA[i-1]+bMA[i]-bMA[i-1];

xTA[i]=bTA[i];

if(xTA[i]<0)

{

xTA[i]=xTA[i]*(-1);

}

cTA[i]=0;

if(bTA[i]<0)

{

cTA[i]=1;

}


//último valor máximo

if(bTA[i]*bTA[i-1]>0)

{

iMax=MaxAround(i);

}

else

{

iMax=AlrededorMáximo(i-1);

}


//reescribir si es necesario

if((bTA[iMax]>0 && bTA[iMax]-bTA[i]>=Umbral*_Punto) //si ha bajado demasiado

|| (bTA[iMax]<0 && bTA[i]-bTA[iMax]>=Umbral*_Punto))

{ //si ha subido demasiado

bTA[iMax+1]=bMA[iMax+1]-bMA[iMax];

xTA[iMax+1]=bTA[iMax+1];

if(xTA[iMax+1]<0)

{

xTA[iMax+1]=xTA[iMax+1]*(-1);

}

cTA[iMax+1]=0;

if(bTA[iMax+1]<0)

{

cTA[iMax+1]=1;

}

for(int k=iMax+2; k<=i;++k)

{

bTA[k]=bTA[k-1]+bMA[k]-bMA[k-1];

xTA[k]=bTA[k];

if(xTA[k]<0)

{

xTA[k]=xTA[k]*(-1);

}

cTA[k]=0;

if(bTA[k]<0)

{

cTA[k]=1;

}

}

}


//incremento

++i;

}

//estimar sólo la última señal

bTA[i]=bTA[i-1]+bMA[i]-bMA[i-1];

xTA[i]=bTA[i];

if(xTA[i]<0)

{

xTA[i]=xTA[i]*(-1);

}

cTA[i]=0;

if(bTA[i]<0)

{

cTA[i]=1;

}


//hecho

return i;

}

//+------------------------------------------------------------------+

//| Max Alrededor | |

//+------------------------------------------------------------------+

//Devuelve: el índice del valor máximo absoluto dentro de la Tendencia actual

int MaxAround(int i)

{

int iMax=i;

//versión positiva

if(bTA[i]>0)

{

while(i > 0 && bTA[--i]>0)

{

if(bTA[i]>bTA[iMax])

{

iMax=i;

}

}

}

//versión negativa

else if(bTA[i]<0)

{

while(i > 0 && bTA[--i]<0)

{

if(bTA[i]<bTA[iMax])

{

iMax=i;

}

}

}

//devolución

return iMax;

}

//+------------------------------------------------------------------+