Se você está em busca de um indicador que te mantenha sempre atualizado sobre as movimentações do mercado, o ASCtrend é uma excelente opção. Este indicador de semáforo conta com alertas, notificações por email e push para te ajudar a não perder nenhuma oportunidade.
Recentemente, algumas melhorias foram feitas no código do indicador para implementar essas funcionalidades de alerta. Vamos dar uma olhada nas principais mudanças:
- Novos parâmetros de entrada:
input uint NumeroDeBarras=1;//Número de barras para o sinal input bool SomON=true; //Habilitar alertas input uint NumeroDeAlertas=2;//Número de alertas input bool EmailON=false; //Habilitar envio de email do sinal input bool PushON=false; //Habilitar envio de sinal para dispositivos móveis
- Funções adicionadas: Foram incluídas três novas funções ao final do código do indicador:
BuySignal(),SellSignal()eGetStringTimeframe().//+------------------------------------------------------------------+ //| Função de Sinal de Compra | //+------------------------------------------------------------------+ void BuySignal(string NomeDoSinal, // texto do nome do indicador para mensagens de email 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 TesteDeSerie=ArrayGetAsSeries(SetaCompra); int indice; if(TesteDeSerie) 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); TesteDeSerie=ArrayGetAsSeries(Fechar); if(TesteDeSerie) indice=int(NumeroDeBarras); else indice=TotalDeBarras-int(NumeroDeBarras)-1; double Ask=Fechar[indice]; double Bid=Fechar[indice]; TesteDeSerie=ArrayGetAsSeries(Spread); if(TesteDeSerie) 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 Simbolo=",Symbol()," Period=",sPeriodo); if(EmailON) SendMail(NomeDoSinal+": alerta de sinal de COMPRA","Sinal de COMPRA em Ask="+sAsk+", Bid="+sBid+", Data="+texto+" Simbolo="+Symbol()+" Period="+sPeriodo); if(PushON) SendNotification(NomeDoSinal+": Sinal de COMPRA em Ask="+sAsk+", Bid="+sBid+", Data="+texto+" Simbolo="+Symbol()+" Period="+sPeriodo); } //--- } //+------------------------------------------------------------------+ //| Função de Sinal de Venda | //+------------------------------------------------------------------+ void SellSignal(string NomeDoSinal, // texto do nome do indicador para mensagens de email 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 TesteDeSerie=ArrayGetAsSeries(SetaVenda); int indice; if(TesteDeSerie) 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); TesteDeSerie=ArrayGetAsSeries(Fechar); if(TesteDeSerie) indice=int(NumeroDeBarras); else indice=TotalDeBarras-int(NumeroDeBarras)-1; double Ask=Fechar[indice]; double Bid=Fechar[indice]; TesteDeSerie=ArrayGetAsSeries(Spread); if(TesteDeSerie) 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 Simbolo=",Symbol()," Period=",sPeriodo); if(EmailON) SendMail(NomeDoSinal+": alerta de sinal de VENDA","Sinal de VENDA em Ask="+sAsk+", Bid="+sBid+", Data="+texto+" Simbolo="+Symbol()+" Period="+sPeriodo); if(PushON) SendNotification(NomeDoSinal+": Sinal de VENDA em Ask="+sAsk+", Bid="+sBid+", Data="+texto+" Simbolo="+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: Foram adicionadas chamadas para as funções
BuySignal()eSellSignal()após os ciclos de cálculo do indicador no blocoOnCalculate()://---
BuySignal("ASCtrend",BuyBuffer,total_de_barras,prev_calculado,fechar,spread);
SellSignal("ASCtrend",SellBuffer,total_de_barras,prev_calculado,fechar,spread);
//---
Os buffers BuyBuffer e SellBuffer são usados para armazenar os sinais de compra e venda. É importante garantir que os valores vazios sejam representados por zeros ou EMPTY_VALUE nos buffers do indicador.
Vale lembrar que as funções BuySignal() e SellSignal() devem ser chamadas apenas uma vez no bloco OnCalculate() do código do indicador.

Fig.1. Indicador ASCtrendAlert no gráfico

Fig.2. Indicador BykovTrendAlert. Gerando alertas
Comentário 0