ASCtrendAlert: O Indicador que Alerta Você no MetaTrader 5

Mike 2017.01.20 01:38 11 0 0
Anexo

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:

  1. 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
    
  2. Funções adicionadas: Foram incluídas 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 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));
    //----
      }
    
  3. Chamadas para as funções: Foram adicionadas chamadas para as funções BuySignal() e SellSignal() após os ciclos de cálculo do indicador no bloco OnCalculate():
    //---
    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.1. Indicador ASCtrendAlert no gráfico


Fig.2. Indicador BykovTrendAlert. Gerando alertas

Fig.2. Indicador BykovTrendAlert. Gerando alertas

Lista
Comentário 0