Autor original:
Ramdass - Conversão apenas
O BykovTrend é um indicador semáforo que oferece alertas, enviando notificações por e-mail e push para dispositivos móveis.
Para implementar os alertas, mensagens por e-mail e notificações push, foram feitas as seguintes alterações no código do indicador:
- Novos parâmetros de entrada foram introduzidos:
input uint NumeroDeBarras=1;//Número da barra 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-mail 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, // número atual de barras const int Prev_calculado, // número de barras no tick anterior const double &Fechar[], // preço de fechamento const int &Spread[]) // spread { //--- static uint contador=0; if(TotalDeBarras!=Prev_calculado) contador=0; bool SinalCompra=false; bool TesteSeries=ArrayGetAsSeries(SetaCompra); int indice; if(TesteSeries) 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); TesteSeries=ArrayGetAsSeries(Fechar); if(TesteSeries) indice=int(NumeroDeBarras); else indice=TotalDeBarras-int(NumeroDeBarras)-1; double Ask=Fechar[indice]; double Bid=Fechar[indice]; TesteSeries=ArrayGetAsSeries(Spread); if(TesteSeries) 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 Ask=",Ask," Bid=",Bid," currtime=",texto," Símbolo=",Symbol()," Período=",sPeriodo); if(EMailON) SendMail(NomeDoSinal+": Alerta de SINAL DE COMPRA","Sinal de COMPRA em Ask="+sAsk+", Bid="+sBid+", Data="+texto+" Símbolo="+Symbol()+" Período="+sPeriodo); if(PushON) SendNotification(NomeDoSinal+": Sinal de COMPRA em Ask="+sAsk+", Bid="+sBid+", Data="+texto+" Símbolo="+Symbol()+" Período="+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, // número atual de barras const int Prev_calculado, // número de barras no tick anterior const double &Fechar[], // preço de fechamento const int &Spread[]) // spread { //--- static uint contador=0; if(TotalDeBarras!=Prev_calculado) contador=0; bool SinalVenda=false; bool TesteSeries=ArrayGetAsSeries(SetaVenda); int indice; if(TesteSeries) 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); TesteSeries=ArrayGetAsSeries(Fechar); if(TesteSeries) indice=int(NumeroDeBarras); else indice=TotalDeBarras-int(NumeroDeBarras)-1; double Ask=Fechar[indice]; double Bid=Fechar[indice]; TesteSeries=ArrayGetAsSeries(Spread); if(TesteSeries) 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 Ask=",Ask," Bid=",Bid," currtime=",texto," Símbolo=",Symbol()," Período=",sPeriodo); if(EMailON) SendMail(NomeDoSinal+": Alerta de SINAL DE VENDA","Sinal de VENDA em Ask="+sAsk+", Bid="+sBid+", Data="+texto+" Símbolo="+Symbol()+" Período="+sPeriodo); if(PushON) SendNotification(NomeDoSinal+": Sinal de VENDA em Ask="+sAsk+", Bid="+sBid+", Data="+texto+" Símbolo="+Symbol()+" Período="+sPeriodo); } //--- } //+------------------------------------------------------------------+ //| Obtendo o período 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("BykovTrendAlert",SetaCompra,total_de_barras,prev_calculado,fechar,spread); SellSignal("BykovTrendAlert",SetaVenda,total_de_barras,prev_calculado,fechar,spread); //---
Onde SetaCompra e SetaVenda são os nomes dos buffers do indicador para armazenar os sinais de compra e venda. Os valores vazios nos buffers do indicador devem ser definidos como zeros ou EMPTY_VALUE.
Assume-se que apenas uma chamada para as funções BuySignal() e SellSignal() será utilizada no bloco OnCalculate() do código do indicador.
Este indicador foi implementado pela primeira vez em MQL4 e publicado na Base de Códigos em 28.09.2007.

Fig1. O indicador BykovTrendAlert no gráfico
Fig.2. O indicador BykovTrendAlert 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
- Índice de Preferência do Investidor: Um Guia Prático para Traders
- Convergência e Divergência Estocástica: O Indicador para MetaTrader 5 que Você Precisa Conhecer
- Oscilador Maravilhoso e Divergências: Um Guia para MetaTrader 5
