Autor Original: dimeon
O ColorXdinMA é um indicador de média móvel de tendência que vem com alertas, enviando notificações por e-mail e push para dispositivos móveis.
Recentemente, foram realizadas algumas alterações no código do indicador para implementar esses alertas e notificações. Vamos dar uma olhada nas principais mudanças:
- Foi declarada uma enumeração para as opções de geração de sinais do indicador no escopo global antes das variáveis de entrada serem definidas.//+----------------------------------------------------+
//| Enumeração para opções de geração de sinais |
//+----------------------------------------------------+
enum ENUM_SIGNAL_MODE
{
MODE_SIGNAL, //Sinais de rompimento
MODE_TREND //Sinais de rompimento e tendência
}; - Novos parâmetros de entrada foram introduzidos://---- Variáveis de entrada para alertas
input ENUM_SIGNAL_MODE SignMode=MODE_SIGNAL; //Modo de geração de sinal
input uint NumberofBar=1; //Número da barra para gerar um sinal
input bool SoundON=true; //Habilitar alertas
input uint NumberofAlerts=2; //Número de alertas
input bool EMailON=false; //Habilitar envio de e-mail do sinal
input bool PushON=false; //Habilitar envio de sinal para dispositivos móveis - Adicionadas três novas funções ao final do código do indicador: BuySignal(), SellSignal() e GetStringTimeframe()//+------------------------------------------------------------------+
//| Função de sinal de compra |
//+------------------------------------------------------------------+
void BuySignal(string SignalSirname,// texto do nome do indicador para e-mail e mensagens push
double &ColorArray[],// buffer de índice de cor
int ColorIndex,// índice de cor no buffer de índice de cor para gerar um sinal
const int Rates_total, // o número atual de barras
const int Prev_calculated, // o número de barras no tick anterior
const double &Close[], // preço de fechamento
const int &Spread[]) // spread
{
//---
static uint counter=0;
if(Rates_total!=Prev_calculated) counter=0;
bool BuySignal=false;
bool SeriesTest=ArrayGetAsSeries(ColorArray);
int index,index1;
if(SeriesTest)
{
index=int(NumberofBar);
index1=index+1;
}
else
{
index=Rates_total-int(NumberofBar)-1;
index1=index-1;
}
if(SignMode==MODE_SIGNAL)
{
if(ColorArray[index1]!=ColorIndex && ColorArray[index]==ColorIndex) BuySignal=true;
}
else
{
if(ColorArray[index]==ColorIndex) BuySignal=true;
}
if(BuySignal && counter<=NumberofAlerts)
{
counter++;
MqlDateTime tm;
TimeToStruct(TimeCurrent(),tm);
string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
SeriesTest=ArrayGetAsSeries(Close);
if(SeriesTest) index=int(NumberofBar);
else index=Rates_total-int(NumberofBar)-1;
double Ask=Close[index];
double Bid=Close[index];
SeriesTest=ArrayGetAsSeries(Spread);
if(SeriesTest) index=int(NumberofBar);
else index=Rates_total-int(NumberofBar)-1;
Bid+=_Point*Spread[index];
string sAsk=DoubleToString(Ask,_Digits);
string sBid=DoubleToString(Bid,_Digits);
string sPeriod=GetStringTimeframe(ChartPeriod());
if(SignMode==MODE_SIGNAL || (SignMode==MODE_TREND && ColorArray[index1]!=ColorIndex))
{
if(SoundON) Alert("Sinal de COMPRA Ask=",Ask," Bid=",Bid," hora atual=",text," Símbolo=",Symbol()," Período=",sPeriod);
if(EMailON) SendMail(SignalSirname+": alerta de sinal de COMPRA","Sinal de COMPRA em Ask="+sAsk+", Bid="+sBid+", Data="+text+" Símbolo="+Symbol()+" Período="+sPeriod);
if(PushON) SendNotification(SignalSirname+": Sinal de COMPRA em Ask="+sAsk+", Bid="+sBid+", Data="+text+" Símbolo="+Symbol()+" Período="+sPeriod);
}
else
{
if(SoundON) Alert("Sinal de tendência de alta Ask=",Ask," Bid=",Bid," hora atual=",text," Símbolo=",Symbol()," Período=",sPeriod);
if(EMailON) SendMail(SignalSirname+": alerta de sinal de tendência de alta","Sinal de COMPRA em Ask="+sAsk+", Bid="+sBid+", Data="+text+" Símbolo="+Symbol()+" Período="+sPeriod);
if(PushON) SendNotification(SignalSirname+": Sinal de tendência de alta em Ask="+sAsk+", Bid="+sBid+", Data="+text+" Símbolo="+Symbol()+" Período="+sPeriod);
}
}
//---
}
//+------------------------------------------------------------------+
//| Função de sinal de venda |
//+------------------------------------------------------------------+
void SellSignal(string SignalSirname,// texto do nome do indicador para e-mail e push messages
double &ColorArray[], // buffer de índice de cor
int ColorIndex, // índice de cor no buffer de índice de cor para gerar um sinal
const int Rates_total, // o número atual de barras
const int Prev_calculated, // o número de barras no tick anterior
const double &Close[], // preço de fechamento
const int &Spread[]) // spread
{
//---
static uint counter=0;
if(Rates_total!=Prev_calculated) counter=0;
bool SellSignal=false;
bool SeriesTest=ArrayGetAsSeries(ColorArray);
int index,index1;
if(SeriesTest)
{
index=int(NumberofBar);
index1=index+1;
}
else
{
index=Rates_total-int(NumberofBar)-1;
index1=index-1;
}
if(SignMode==MODE_SIGNAL)
{
if(ColorArray[index1]!=ColorIndex && ColorArray[index]==ColorIndex) SellSignal=true;
}
else
{
if(ColorArray[index]==ColorIndex) SellSignal=true;
}
if(SellSignal && counter<=NumberofAlerts)
{
counter++;
MqlDateTime tm;
TimeToStruct(TimeCurrent(),tm);
string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
SeriesTest=ArrayGetAsSeries(Close);
if(SeriesTest) index=int(NumberofBar);
else index=Rates_total-int(NumberofBar)-1;
double Ask=Close[index];
double Bid=Close[index];
SeriesTest=ArrayGetAsSeries(Spread);
if(SeriesTest) index=int(NumberofBar);
else index=Rates_total-int(NumberofBar)-1;
Bid+=_Point*Spread[index];
string sAsk=DoubleToString(Ask,_Digits);
string sBid=DoubleToString(Bid,_Digits);
string sPeriod=GetStringTimeframe(ChartPeriod());
if(SignMode==MODE_SIGNAL || (SignMode==MODE_TREND && ColorArray[index1]!=ColorIndex))
{
if(SoundON) Alert("SINAL de VENDA Ask=",Ask," Bid=",Bid," hora atual=",text," Símbolo=",Symbol()," Período=",sPeriod);
if(EMailON) SendMail(SignalSirname+": alerta de sinal de VENDA","Sinal de VENDA em Ask="+sAsk+", Bid="+sBid+", Data="+text+" Símbolo="+Symbol()+" Período="+sPeriod);
if(PushON) SendNotification(SignalSirname+": Sinal de VENDA em Ask="+sAsk+", Bid="+sBid+", Data="+text+" Símbolo="+Symbol()+" Período="+sPeriod);
}
else
{
if(SoundON) Alert("Sinal de tendência de baixa Ask=",Ask," Bid=",Bid," hora atual=",text," Símbolo=",Symbol()," Período=",sPeriod);
if(EMailON) SendMail(SignalSirname+": alerta de sinal de tendência de baixa","Sinal de VENDA em Ask="+sAsk+", Bid="+sBid+", Data="+text+" Símbolo="+Symbol()+" Período="+sPeriod);
if(PushON) SendNotification(SignalSirname+": Sinal de tendência de baixa em Ask="+sAsk+", Bid="+sBid+", Data="+text+" Símbolo="+Symbol()+" Período="+sPeriod);
}
}
//---
}
//+------------------------------------------------------------------+
//| Obtendo o período como uma string |
//+------------------------------------------------------------------+
string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
{
//----
return(StringSubstr(EnumToString(timeframe),7,-1));
//----
} - Adicionadas chamadas para as funções BuySignal() e SellSignal() após os ciclos de cálculo do indicador no bloco OnCalculate()//---
BuySignal("ColorXdinMA_Alert",ColorXdinMA,1,rates_total,prev_calculated,close,spread);
SellSignal("ColorXdinMA_Alert",ColorXdinMA,2,rates_total,prev_calculated,close,spread);
//---
O ColorXdinMA é o nome do buffer de índice de cor que armazena as cores do indicador. Os valores 1 e 2 correspondem aos números de cores nesse buffer, onde a média móvel está em ascensão ou descida, respectivamente.
É importante ressaltar que será utilizada apenas uma chamada para as funções BuySignal() e SellSignal() no bloco OnCalculate() do código do indicador.
O indicador utiliza as classes da biblioteca SmoothAlgorithms.mqh (copie para <terminal_data_folder>\MQL5\Include). O uso dessas classes foi amplamente descrito no artigo "Média de Séries de Preço para Cálculos Intermediários Sem Usar Buffers Adicionais".

Fig1. O indicador ColorXdinMA_Alert no gráfico

Fig.2. O indicador ColorXdinMA_Alert. Gerando alerta para sinal de rompimento

Fig.3. O indicador ColorXdinMA_Alert. Gerando alerta para sinal de tendência
Publicações relacionadas
- Calendário Econômico: Monitoramento e Cache para Testes de Estratégia no MetaTrader 5
- Buffers Horários para Coleta de Dados no MetaTrader 5
- Índice de Preferência do Investidor: Um Guia Prático para Traders
- Utilitário de Informações de Séries e Taxas para MetaTrader 5: Maximize Seu Trading
- Oscilador Maravilhoso e Divergências: Um Guia para MetaTrader 5