¡Hola, traders! Hoy quiero hablarles sobre el JBrainTrend1Stop, un indicador de tendencia que incorpora alertas, correos electrónicos y notificaciones push. Si buscas mejorar tu estrategia de trading, este indicador es justo lo que necesitas.
A continuación, les detallo las modificaciones que se han hecho en el código del indicador para implementar estas funcionalidades:
- Se han introducido nuevos parámetros de entrada:
input uint NumeroDeBarras=1;//Número de barra para la señal input bool SonidoActivado=true; //Habilitar alertas input uint NumeroDeAlertas=2;//Número de alertas input bool CorreoActivado=false; //Habilitar envío de correos input bool NotificacionPushActivada=false; //Habilitar envío de notificaciones móviles
- Se añadieron tres nuevas funciones al final del código del indicador: BuySignal(), SellSignal() y GetStringTimeframe(). Aquí te detallo cómo funcionan:
//+------------------------------------------------------------------+
//| Función de señal de compra |
//+------------------------------------------------------------------+
void BuySignal(string NombreSeñal, // texto del nombre del indicador para correos y mensajes
double &FlechaCompra[], // buffer del indicador con señales de tendencia al alza
double &FlechaVenta[], // buffer del indicador con señales de tendencia a la baja
const int TotalDeBarras, // número actual de barras
const int AnteriorCalculado, // número de barras en el tick anterior
const double &Cierre[], // precio de cierre
const int &Spread[]) // spread
{
//---
static uint contador=0;
if(TotalDeBarras!=AnteriorCalculado) contador=0;
bool SeñalCompra=false;
bool VerificarSerie=ArrayGetAsSeries(FlechaCompra);
int indice, indice1;
if(VerificarSerie)
{
indice=int(NumeroDeBarras);
indice1=indice+1;
}
else
{
indice=TotalDeBarras-int(NumeroDeBarras)-1;
indice1=indice-1;
}
if(FlechaVenta[indice1] && FlechaVenta[indice1]!=EMPTY_VALUE && FlechaCompra[indice] && FlechaCompra[indice]!=EMPTY_VALUE) SeñalCompra=true;
if(SeñalCompra && contador<=NumeroDeAlertas)
{
contador++;
MqlDateTime tm;
TimeToStruct(TimeCurrent(),tm);
string texto=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
VerificarSerie=ArrayGetAsSeries(Cierre);
if(VerificarSerie) indice=int(NumeroDeBarras);
else indice=TotalDeBarras-int(NumeroDeBarras)-1;
double PedidoCompra=Cierre[indice];
double PedidoVenta=Cierre[indice];
VerificarSerie=ArrayGetAsSeries(Spread);
if(VerificarSerie) indice=int(NumeroDeBarras);
else indice=TotalDeBarras-int(NumeroDeBarras)-1;
PedidoVenta+=_Point*Spread[indice];
string sPedidoCompra=DoubleToString(PedidoCompra,_Digits);
string sPedidoVenta=DoubleToString(PedidoVenta,_Digits);
string sPeriodo=GetStringTimeframe(ChartPeriod());
if(SonidoActivado) Alert("Señal de COMPRA \n PedidoCompra=",PedidoCompra,"\n PedidoVenta=",PedidoVenta,"\n hora actual=",texto,"\n Símbolo=",Symbol()," Periodo=",sPeriodo);
if(CorreoActivado) SendMail(NombreSeñal+": Alerta de señal de COMPRA","Señal de COMPRA en PedidoCompra="+sPedidoCompra+", PedidoVenta="+sPedidoVenta+", Fecha="+texto+" Símbolo="+Symbol()+" Periodo="+sPeriodo);
if(NotificacionPushActivada) SendNotification(NombreSeñal+": Seña de COMPRA en PedidoCompra="+sPedidoCompra+", PedidoVenta="+sPedidoVenta+", Fecha="+texto+" Símbolo="+Symbol()+" Periodo="+sPeriodo);
}
//---
}
//+------------------------------------------------------------------+
//| Función de señal de venta |
//+------------------------------------------------------------------+
void SellSignal(string NombreSeñal, // texto del nombre del indicador para correos y mensajes
double &FlechaVenta[], // buffer del indicador con señales de tendencia a la baja
double &FlechaCompra[], // buffer del indicador con señales de tendencia al alza
const int TotalDeBarras, // número actual de barras
const int AnteriorCalculado, // número de barras en el tick anterior
const double &Cierre[], // precio de cierre
const int &Spread[]) // spread
{
//---
static uint contador=0;
if(TotalDeBarras!=AnteriorCalculado) contador=0;
bool SeñalVenta=false;
bool VerificarSerie=ArrayGetAsSeries(FlechaVenta);
int indice, indice1;
if(VerificarSerie)
{
indice=int(NumeroDeBarras);
indice1=indice+1;
}
else
{
indice=TotalDeBarras-int(NumeroDeBarras)-1;
indice1=indice-1;
}
if(FlechaCompra[indice1] && FlechaCompra[indice1]!=EMPTY_VALUE && FlechaVenta[indice] && FlechaVenta[indice]!=EMPTY_VALUE) SeñalVenta=true;
if(SeñalVenta && contador<=NumeroDeAlertas)
{
contador++;
MqlDateTime tm;
TimeToStruct(TimeCurrent(),tm);
string texto=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
VerificarSerie=ArrayGetAsSeries(Cierre);
if(VerificarSerie) indice=int(NumeroDeBarras);
else indice=TotalDeBarras-int(NumeroDeBarras)-1;
double PedidoCompra=Cierre[indice];
double PedidoVenta=Cierre[indice];
VerificarSerie=ArrayGetAsSeries(Spread);
if(VerificarSerie) indice=int(NumeroDeBarras);
else indice=TotalDeBarras-int(NumeroDeBarras)-1;
PedidoVenta+=_Point*Spread[indice];
string sPedidoCompra=DoubleToString(PedidoCompra,_Digits);
string sPedidoVenta=DoubleToString(PedidoVenta,_Digits);
string sPeriodo=GetStringTimeframe(ChartPeriod());
if(SonidoActivado) Alert("Señal de VENTA \n PedidoCompra=",PedidoCompra,"\n PedidoVenta=",PedidoVenta,"\n hora actual=",texto,"\n Símbolo=",Symbol()," Periodo=",sPeriodo);
if(CorreoActivado) SendMail(NombreSeñal+": Alerta de señal de VENTA","Señal de VENTA en PedidoCompra="+sPedidoCompra+", PedidoVenta="+sPedidoVenta+", Fecha="+texto+" Símbolo="+Symbol()+" Periodo="+sPeriodo);
if(NotificacionPushActivada) SendNotification(NombreSeñal+": Señal de VENTA en PedidoCompra="+sPedidoCompra+", PedidoVenta="+sPedidoVenta+", Fecha="+texto+" Símbolo="+Symbol()+" Periodo="+sPeriodo);
}
//---
}
//+------------------------------------------------------------------+
//| Obteniendo el timeframe como string |
//+------------------------------------------------------------------+
string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
{
//----
return(StringSubstr(EnumToString(timeframe),7,-1));
//----
} - Se añadieron un par de llamadas a las funciones BuySignal() y SellSignal() después de los ciclos de cálculo del indicador en el bloque OnCalculate():
//---
BuySignal("JBrainTrend1Stop_Alert",FlechaCompra,FlechaVenta,total_de_barras,anterior_calculado,cierre,spread);
SellSignal("JBrainTrend1Stop_Alert",FlechaVenta,FlechaCompra,total_de_barras,anterior_calculado,cierre,spread);
//---
Donde FlechaCompra y FlechaVenta son los nombres de los buffers del indicador para almacenar señales de tendencia al alza y a la baja (líneas de stop para largos y cortos). Si no hay una tendencia apropiada, el valor debe ser cero o EMPTY_VALUE en los buffers del indicador.
Se asume que solo se utilizará una llamada a las funciones BuySignal() y SellSignal() en el bloque OnCalculate() del código del indicador.
Asegúrate de colocar el archivo compilado del indicador JMA.mq5 en la carpeta MQL5\Indicators.

Fig.1. Indicador JBrainTrend1Stop_Alert en el gráfico

Fig.2. Indicador JBrainTrend1Stop_Alert. Generando alertas
Publicaciones relacionadas
- Cruce de Líneas de Tendencia: Un Indicador Esencial para MetaTrader 5
- Índice Genérico: Crea Tus Propios Índices de Divisas en MetaTrader 5
- Líneas de Retroceso: Un Indicador Esencial para MetaTrader 5
- Alertas de Señales con el Indicador Iin_MA para MetaTrader 5
- iStochKomposterAlert: El Indicador de Señales para MetaTrader 5 con Alertas