BrainTrend2Sig é um indicador de sinal que traz alertas, notificações por e-mail e push, facilitando a vida do trader.
Para integrar esses recursos ao código do indicador, várias mudanças foram realizadas. Confira abaixo as principais atualizações:
- Novos parâmetros de entrada foram adicionados:
input uint NumeroDeBarras=1;//Número de barras para o sinal input bool SomON=true; //Ativar alertas input uint NumeroDeAlertas=2;//Número de alertas input bool EmailON=false; //Ativar envio de e-mails do sinal input bool PushON=false; //Ativar envio de sinal para dispositivos móveis
- Três novas funções foram adicionadas ao final do código do indicador: BuySignal(), SellSignal() e GetStringTimeframe()
//+------------------------------------------------------------------+ //| Função de sinal de compra | //+------------------------------------------------------------------+ void BuySignal(string NomeDoSinal, // texto do nome do indicador para mensagens de e-mail e push double &SetaCompra[], // buffer do indicador com sinais de compra const int TotalDeBarras, // o número atual de barras const int Prev_calculado, // o número de barras no tick anterior const double &Fechamento[], // preço de fechamento const int &Spread[]) // spread { //--- static uint contador=0; if(TotalDeBarras!=Prev_calculado) contador=0; bool SinalCompra=false; bool TesteSerie=ArrayGetAsSeries(SetaCompra); int indice; if(TesteSerie) indice=int(NumeroDeBarras); else indice=TotalDeBarras-int(NumeroDeBarras)-1; if(NormalizeDouble(SetaCompra[indice],_Digits) && SetaCompra[indice]!=EMPTY_VALUE) SinalCompra=true; if(SinalCompra && contador<=NumeroDeAlertas) { contador++; MqlDateTime tm; TimeToStruct(TimeCurrent(),tm); string texto=TimeToString(TimeCurrent(),TIME_DATE)+" "++string(tm.hour)+":"+string(tm.min); TesteSerie=ArrayGetAsSeries(Fechamento); if(TesteSerie) indice=int(NumeroDeBarras); else indice=TotalDeBarras-int(NumeroDeBarras)-1; double Ask=Fechamento[indice]; double Bid=Fechamento[indice]; TesteSerie=ArrayGetAsSeries(Spread); if(TesteSerie) indice=int(NumeroDeBarras); else indice=TotalDeBarras-int(NumeroDeBarras)-1; Bid+=Spread[indice]; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriodo=GetStringTimeframe(ChartPeriod()); if(SomON) Alert("Sinal de COMPRA \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",texto,"\n Símbolo=",Symbol()," Period=",sPeriodo); if(EmailON) SendMail(NomeDoSinal+": alerta de sinal de COMPRA","Sinal de COMPRA em Ask="+sAsk+", Bid="+sBid+", Data="+texto+" Símbolo="+Symbol()+" Period="+sPeriodo); if(PushON) SendNotification(NomeDoSinal+": Sinal de COMPRA em Ask="+sAsk+", Bid="+sBid+", Data="+texto+" Símbolo="+Symbol()+" Period="+sPeriodo); } //--- } //+------------------------------------------------------------------+ //| Função de sinal de venda | //+------------------------------------------------------------------+ void SellSignal(string NomeDoSinal, // texto do nome do indicador para mensagens de e-mail e push double &SetaVenda[], // buffer do indicador com sinais de venda const int TotalDeBarras, // o número atual de barras const int Prev_calculado, // o número de barras no tick anterior const double &Fechamento[], // preço de fechamento const int &Spread[]) // spread { //--- static uint contador=0; if(TotalDeBarras!=Prev_calculado) contador=0; bool SinalVenda=false; bool TesteSerie=ArrayGetAsSeries(SetaVenda); int indice; if(TesteSerie) indice=int(NumeroDeBarras); else indice=TotalDeBarras-int(NumeroDeBarras)-1; if(NormalizeDouble(SetaVenda[indice],_Digits) && SetaVenda[indice]!=EMPTY_VALUE) SinalVenda=true; if(SinalVenda && contador<=NumeroDeAlertas) { contador++; MqlDateTime tm; TimeToStruct(TimeCurrent(),tm); string texto=TimeToString(TimeCurrent(),TIME_DATE)+" "++string(tm.hour)+":"+string(tm.min); TesteSerie=ArrayGetAsSeries(Fechamento); if(TesteSerie) indice=int(NumeroDeBarras); else indice=TotalDeBarras-int(NumeroDeBarras)-1; double Ask=Fechamento[indice]; double Bid=Fechamento[indice]; TesteSerie=ArrayGetAsSeries(Spread); if(TesteSerie) indice=int(NumeroDeBarras); else indice=TotalDeBarras-int(NumeroDeBarras)-1; Bid+=Spread[indice]; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriodo=GetStringTimeframe(ChartPeriod()); if(SomON) Alert("Sinal de VENDA \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",texto,"\n Símbolo=",Symbol()," Period=",sPeriodo); if(EmailON) SendMail(NomeDoSinal+": alerta de sinal de VENDA","Sinal de VENDA em Ask="+sAsk+", Bid="+sBid+", Data="+texto+" Símbolo="+Symbol()+" Period="+sPeriodo); if(PushON) SendNotification(NomeDoSinal+": Sinal de VENDA em Ask="+sAsk+", Bid="+sBid+", Data="+texto+" Símbolo="+Symbol()+" Period="+sPeriodo); } //--- } //+------------------------------------------------------------------+ //| Obtendo o timeframe como uma string | //+------------------------------------------------------------------+ string GetStringTimeframe(ENUM_TIMEFRAMES timeframe) { //---- return(StringSubstr(EnumToString(timeframe),7,-1)); //---- }
- Chamadas para as funções BuySignal() e SellSignal() foram adicionadas após os ciclos de cálculo do indicador no bloco OnCalculate() //---
BuySignal("BrainTrend2SigAlert",SetaCompra,total_de_barras,prev_calculado,fechamento,spread);
SellSignal("BrainTrend2SigAlert",SetaVenda,total_de_barras,prev_calculado,fechamento,spread);
//---
Onde SetaCompra e SetaVenda são os nomes dos buffers do indicador para armazenar os sinais de compra e venda. Os valores devem ser zeros ou EMPTY_VALUE nos buffers do indicador.
É importante ressaltar que deve haver apenas uma chamada para as funções BuySignal() e SellSignal() no bloco OnCalculate() do código do indicador.

Fig.1. Indicador BrainTrend2SigAlert no gráfico

Fig.2. Indicador BrainTrend2SigAlert. Gerando alertas
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
- Utilitário de Informações de Séries e Taxas para MetaTrader 5: Maximize Seu Trading
- Divergência no Awesome Oscillator: O Guia Completo para Traders
- Oscilador Maravilhoso e Divergências: Um Guia para MetaTrader 5