Es necesario especificar en la descripción qué dibuja el indicador.
¿Se pueden añadir alertas sonoras cuando cambia la tendencia?
Hola Diogo,
¿Por casualidad tienes disponible la versión para MT4? Gracias
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;
}
//+------------------------------------------------------------------+
- 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
Trends Accumulator:
Acumulador de los movimientos del precio. Determina el comienzo y el final de una tendencia.
Autor: Diogo Seca