Autor real:
Rafael Jimenez Tocino
Indicador RJTX_Matches_Smoothed que incluye alertas, correos electrónicos y notificaciones push para smartphones.
Se han realizado varios cambios en el código del indicador para implementar alertas, mensajes de correo electrónico y notificaciones push:
- Se añadieron nuevas variables de entrada al indicador
input uint NumeroDeBarras=1; // Número de barras para activar la señal input bool SonidoActivado=true; // Habilitar alertas input uint NumeroDeAlertas=2; // Número de alertas input bool CorreoActivado=false; // Habilitar el envío de señales por correo input bool NotificacionPushActivada=false; // Habilitar el envío de señales a dispositivos móviles
- Se agregaron tres nuevas funciones al final del indicador: BuySignal(), SellSignal() y GetStringTimeframe()
//+------------------------------------------------------------------+ //| Función de señal de compra | //+------------------------------------------------------------------+ void BuySignal(string NombreSeñal, // texto del nombre del indicador para correos y mensajes push double &FlechaCompra[], // buffer del indicador con señales de compra const int TotalBarras, // número actual de barras const int &Prev_calculated, // número de barras en el tick anterior const double &Cierre[], // precio de cierre const int &Spread[]) // spread { //--- static uint contador=0; if(TotalBarras!=Prev_calculated) contador=0; bool SeñalCompra=false; bool PruebaSerie=ArrayGetAsSeries(FlechaCompra); int indice,indice1; if(PruebaSerie) { indice=int(NumeroDeBarras); indice1=indice+1; } else { indice=TotalBarras-int(NumeroDeBarras)-1; indice1=indice-1; } if(!FlechaCompra[indice1] && FlechaCompra[indice]) 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); PruebaSerie=ArrayGetAsSeries(Cierre); if(PruebaSerie) indice=int(NumeroDeBarras); else indice=TotalBarras-int(NumeroDeBarras)-1; double Preguntar=Cierre[indice]; double Pedir=Cierre[indice]; PruebaSerie=ArrayGetAsSeries(Spread); if(PruebaSerie) indice=int(NumeroDeBarras); else indice=TotalBarras-int(NumeroDeBarras)-1; Pedir+=Spread[indice]*_Point; string sPedir=DoubleToString(Pedir,_Digits); string sPedir=DoubleToString(Pedir,_Digits); string sPeriodo=GetStringTimeframe(ChartPeriod()); if(SonidoActivado) Alert("Señal de COMPRA Pedir=",Pedir," Bid=",Pedir," tiempo actual=",texto," Símbolo=",Symbol()," Period=",sPeriodo); if(CorreoActivado) SendMail(NombreSeñal+": Alerta de señal de COMPRA","Señal de COMPRA en Pedir="+sPedir+", Bid="+sPedir+", Fecha="+texto+" Símbolo="+Symbol()+" Period="+sPeriodo); if(NotificacionPushActivada) SendNotification(NombreSeñal+": Señal de COMPRA en Pedir="+sPedir+", Bid="+sPedir+", Fecha="+texto+" Símbolo="+Symbol()+" Period="+sPeriodo); } //--- } //+------------------------------------------------------------------+ //| Función de señal de venta | //+------------------------------------------------------------------+ void SellSignal(string NombreSeñal, // texto del nombre del indicador para correos y mensajes push double &FlechaVenta[], // buffer del indicador con señales de venta const int TotalBarras, // número actual de barras const int Prev_calculated, // número de barras en el tick anterior const double &Cierre[], // precio de cierre const int &Spread[]) // spread { //--- static uint contador=0; if(TotalBarras!=Prev_calculated) contador=0; bool SeñalVenta=false; bool PruebaSerie=ArrayGetAsSeries(FlechaVenta); int indice,indice1; if(PruebaSerie) { indice=int(NumeroDeBarras); indice1=indice+1; } else { indice=TotalBarras-int(NumeroDeBarras)-1; indice1=indice-1; } if(!FlechaVenta[indice1] && FlechaVenta[indice]) 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); PruebaSerie=ArrayGetAsSeries(Cierre); if(PruebaSerie) indice=int(NumeroDeBarras); else indice=TotalBarras-int(NumeroDeBarras)-1; double Pedir=Cierre[indice]; double Bid=Cierre[indice]; PruebaSerie=ArrayGetAsSeries(Spread); if(PruebaSerie) indice=int(NumeroDeBarras); else indice=TotalBarras-int(NumeroDeBarras)-1; Bid+=Spread[indice]*_Point; string sPedir=DoubleToString(Pedir,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriodo=GetStringTimeframe(ChartPeriod()); if(SonidoActivado) Alert("Señal de VENTA Pedir=",Pedir," Bid=",Bid," tiempo actual=",texto," Símbolo=",Symbol()," Period=",sPeriodo); if(CorreoActivado) SendMail(NombreSeñal+": Alerta de señal de VENTA","Señal de VENTA en Pedir="+sPedir+", Bid="+sBid+", Fecha="+texto+" Símbolo="+Symbol()+" Period="+sPeriodo); if(NotificacionPushActivada) SendNotification(NombreSeñal+": Señal de VENTA en Pedir="+sPedir+", Bid="+sBid+", Fecha="+texto+" Símbolo="+Symbol()+" Period="+sPeriodo); } //--- } //+------------------------------------------------------------------+ //| Obtención del 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("RJTX_Matches_Smoothed_Alert",FlechaCompra,total_barras,prev_calculated,cierre,spread); SellSignal("RJTX_Matches_Smoothed_Alert",FlechaVenta,total_barras,prev_calculated,cierre,spread); //---
Donde FlechaCompra y FlechaVenta son los nombres de los buffers del indicador para almacenar las señales de compra y venta. Se deben agregar ceros o EMPTY_VALUE a los buffers del indicador como valores vacíos.
Se asume que solo se utilizará una llamada a cada una de las funciones BuySignal() y SellSignal() en el código del indicador en el bloque OnCalculate().
El indicador utiliza las clases de la biblioteca SmoothAlgorithms.mqh (que deben copiarse en la carpeta <directorio_de_datos_del_terminal>\MQL5\Include). El uso de estas clases se describió a fondo en el artículo Promediando Series de Precios para Cálculos Intermedios sin Usar Buffers Adicionales.
Este indicador se implementó por primera vez en MQL4 y se publicó en la Base de Código el 23 de diciembre de 2015.

Fig.1. Indicador RJTX_Matches_Smoothed_Alert en el gráfico
Fig. 2. Indicador RJTX_Matches_Smoothed_Alert. Alertando

Comentarios 0