Assista a como baixar robôs de negociação gratuitos
Encontre-nos em Twitter!
Participe de nossa página de fãs
Script interessante?
Coloque um link para ele, e permita que outras pessoas também o avaliem
Você gostou do script?
Avalie seu funcionamento no terminal MetaTrader 5
Indicadores

ZigZag Ideal - indicador para MetaTrader 5

Visualizações:
4699
Avaliação:
(61)
Publicado:
2014.01.15 09:06
Atualizado:
2016.11.22 07:33
Precisa de um robô ou indicador baseado nesse código? Solicite-o no Freelance Ir para Freelance

Este é um ZigZag simples, mas muito rápido.

Sem picos suspensos ou errados. O tempo de recuperação de picos foi otimizado.

ZigZag Ideal

Vantagens:

  1. A função mais dispendiosa nos cálculos é a iBarShift. Substitui totalmente todos os ciclos necessários para recuperação dos picos. Por isso foi substituída pela ArrayBSearch. Isso significa que o indicador vai ser mais eficiente do que o seu equivalente em MQL4;
  2. Todos os dados necessários para cada barra é acessível em todos os momentos e também disponível para um EA em qualquer momento do histórico;
  3. Sem picos suspensos;
  4. Método eficiente para encontrar picos sem pesquisar os valores dos indicadores;
  5. Muito rápido;
  6. Funciona corretamente em inserções do histórico e quando são mudados os timeframes;
  7. Perfeito para usar em EAs.

Desvantagens:

  1. Memória requerida. ZigZag precisa de 2 buffers (um não é suficiente por causa de atrasos) para fazer o desenho correto, enquanto 5 buffers são usados aqui. Na minha opinião este inconveniente é completamente ofuscado pela vantagem #6. Nenhum dos ZigZags rápido pode processar corretamente inserções de história em dois buffers.
  2. Linhas adicionais estão disponíveis. Isso é necessário para tornar os dados visíveis num Expert Advisor. Essas linhas nunca devem ser visíveis.

Princípio:

ZigZag é desenhada pelo princípio da canalização. A largura do canal pode ser definido em pontos (IdealZZ) ou em termos percentuais (IdealZZP)

Recuperação de picos:

input int ChannelWidth=100;
#property indicator_chart_window
datetime LastTime;
int ZZHandle;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador personalizado               |
//+------------------------------------------------------------------+
void OnInit()
  {
   LastTime = 0;
   ZZHandle = iCustom(_Symbol, Period(), "IdealZZ", ChannelWidth);
  }
//+------------------------------------------------------------------+
//| Obter valor                                                      |
//+------------------------------------------------------------------+
bool GetValue(double dir,int bar,int prevBar,double &peak,
             int &peakBar,datetime &peakTime,const datetime &T[])
  {
   if(dir<0)
     {
      double t[1];
      if(0>=CopyBuffer(ZZHandle,2,bar,1,t)) return false;
      int i= ArrayBsearch(T, (datetime)t[0]);

      if(i==prevBar)
        {
         if(0>=CopyBuffer(ZZHandle,2,bar+1,1,t)) return false;
         i=ArrayBsearch(T,(datetime)t[0]);
        }

      double v[1];
      if(0>=CopyBuffer(ZZHandle,1,i,1,v)) return false;

      if(v[0]==EMPTY_VALUE)
        {
         if(0>=CopyBuffer(ZZHandle,2,bar+1,1,t)) return false;
         i=ArrayBsearch(T,(datetime)t[0]);
         if(0>=CopyBuffer(ZZHandle,1,i,1,v)) return false;
        }

      peak=v[0];
      peakBar=i;
      peakTime=(datetime)t[0];
     }
   else if(dir>0)
     {
      double t[1];
      if(0>=CopyBuffer(ZZHandle,3,bar,1,t)) return false;
      int i= ArrayBsearch(T, (datetime)t[0]);

      if(i==prevBar)
        {
         if(0>=CopyBuffer(ZZHandle,3,bar+1,1,t)) return false;
         i=ArrayBsearch(T,(datetime)t[0]);
        }

      double v[1];
      if(0>=CopyBuffer(ZZHandle,0,i,1,v)) return false;

      if(v[0]==EMPTY_VALUE)
        {
         if(0>=CopyBuffer(ZZHandle,3,bar+1,1,t)) return false;
         i=ArrayBsearch(T,(datetime)t[0]);
         if(0>=CopyBuffer(ZZHandle,0,i,1,v)) return false;
        }

      peak=v[0];
      peakBar=i;
      peakTime=(datetime)t[0];
     }
   else
     {
      return(false);
     }

   return(true);
  }
//+------------------------------------------------------------------+
//| Obter Valor                                                      |
//+------------------------------------------------------------------+
void SetPt(string name,double price,datetime time)
  {
   ObjectCreate(0,name,OBJ_ARROW,0,time,price);
   ObjectSetInteger(0,name,OBJPROP_ARROWCODE,108);
   ObjectSetDouble(0,name,OBJPROP_PRICE,price);
   ObjectSetInteger(0,name,OBJPROP_TIME,time);
  }
//+------------------------------------------------------------------+
//| Função de iteração do indicador personalizado                    |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &T[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(LastTime==T[0]) return(rates_total);
   LastTime=T[0];

   ArraySetAsSeries(T,true);

   double dir_[1];
   if(0>=CopyBuffer(ZZHandle,4,1,1,dir_)) return rates_total;
   double dir=dir_[0];
   double rdir=-dir;

   if(dir==EMPTY_VALUE) return(rates_total);

   double v1,v2,v3,v4,v5;
   int    i1,i2,i3,i4,i5;
   datetime t1,t2,t3,t4,t5;

   if(
      GetValue(dir,1,0,v1,i1,t1,T) && 
      GetValue(rdir,i1,0,v2,i2,t2,T) && 
      GetValue(dir,i2,i1,v3,i3,t3,T) && 
      GetValue(rdir,i3,i2,v4,i4,t4,T) && 
      GetValue(dir,i4,i3,v5,i5,t5,T)
      )
     {
      SetPt("1",v1,t1);
      SetPt("2",v2,t2);
      SetPt("3",v3,t3);
      SetPt("4",v4,t4);
      SetPt("5",v5,t5);
      Print(v1,"   ",v2,"  ",v3,"  ",v4," ",v5," ",i1,"  ",i2,"  ",i3," ",i4," ",i5);
     }
   else
     {
      Print("Seems to be error available...");
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+

Este é um exemplo de indicador mostrando as linhas (uma vez por barra) dos primeiros cinco picos (incluindo a atual formando uma).

Atenção! O código pode funcionar de forma incorreta, se o modo "zero bar" for habilitado

Modo Barra Zero:

O modo pode ser ativado no código da variável DrawZeroBar. Está desabilitada por padrão. Não é recomendado habilitá-lo, especialmente se o indicador é usado em Expert Advisor.

Aproveite e use o indicador. Por favor, me informar de qualquer inconveniente que aparecer.

Traduzido do russo pela MetaQuotes Ltd.
Publicação original: https://www.mql5.com/ru/code/925

Triângulo de Cobertura Triângulo de Cobertura

Abre uma posição de cobertura virtual no MetaTrader 5.

Weather Vane Weather Vane

Este indicador calcula o último preço médio de um símbolo e determina a direção de sua tendência, desse modo, é possível utilizá-lo como um sinal de negociações.

Versão do EA Jolly Roger Versão do EA Jolly Roger

Inspirado pelo Expert Advisor Pirat no Campeonato de Negociação Automatizada 2011.

Exemplo de uso do IndicatorParameters() Exemplo de uso do IndicatorParameters()

Este Expert Advisor ilustra o uso da função IndicatorParameters() para obter informações sobre o número de parâmetros de entrada, seus tipos e valores.