[ARQUIVO]Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por ela. Não posso ir a lugar nenhum sem você - 5. - página 29

 
hoz:

Você pode me dizer como tirar valores de um indicador zig-zag? Como isso é implementado em geral? Isto é, se eu quiser pegar um certo extremo, não apenas o último.

Por exemplo, agora eu quero anexar este ziguezague ao meu consultor especializado:

Entendo que preciso usar a funçãoiCustom, pois ela é normalmente usada para abordar um indicador personalizado, mas a questão é como conectar os nós...

O buffer está procurando o valor NEUTRAL(EMPTY_VALUE) de acordo com o princípio:

//+-------------------------------------------------------------------------------------+
//| Поиск последнего элемента ZZBuf с непустым значением                                |
//+-------------------------------------------------------------------------------------+
int GetLastIndexNoEmptyValue(int index)
{
   while (ZZBuf[index] == EMPTY_VALUE && index < Bars)// Поиск по графику справа налево
      index++;                                     // Пока не будет найден экстремум или
                                                   // ..пока не достигнем конца истории
   return(index);                                  // Индекс бара с непустым значением..
                                                   // ..зиг-зага
}
e acesso ao buffer indicador via iCustom().
 
TarasBY:

O buffer está procurando um valor VAZIO_VALOR de acordo com o princípio:

//+-------------------------------------------------------------------------------------+
//| Поиск последнего элемента ZZBuf с непустым значением                                |
//+-------------------------------------------------------------------------------------+
int GetLastIndexNoEmptyValue(int index)
{
   while (ZZBuf[index] == EMPTY_VALUE && index < Bars)// Поиск по графику справа налево
      index++;                                     // Пока не будет найден экстремум или
                                                   // ..пока не достигнем конца истории
   return(index);                                  // Индекс бара с непустым значением..
                                                   // ..зиг-зага
}

e o buffer indicador é acessado via iCustom().


Faz sentido. Mas será procurado desta forma até encontrarmos um valor não vazio. E se, por exemplo, eu, e, de fato, não quero o último valor não vazio, ou seja, não o último extremo, mas outro... Por exemplo, aqui na imagem da tela:

 
hoz:


Faz sentido. Mas desta forma, a busca será até encontrarmos um valor não vazio. E se, por exemplo, eu, e, de fato, não quero o último valor não vazio, ou seja, não o último extremo, mas outro... Por exemplo, aqui na imagem da tela:

Deve-se introduzir o contador de extremos no laço e quebrar o laço pelo número do extremo (valor não vazio em uma fileira).
 
TarasBY:
Insira um contador de extremos no laço e no número de extremos (valor não vazio em uma linha), quebre o laço.

Entendi. Obrigado. Agora precisamos aplicar tudo isso na prática. Eu entendo o essencial, mas minha mente está cheia de filtros que fazem meu cérebro ferver.
 
hoz:

Entendi. Obrigado. Agora precisamos aplicá-lo na prática. Eu tive a idéia, mas há tantos filtros em minha mente que meu cérebro está fervendo...

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(n>1)  

         if(ind!=0) n--;

         else

         if(ind!=0) return(ind);

      }

   }


Se você precisar do número de barra do pico, mude o tipo de função para int e ao invés de return(ind); escreva return(i);

Observe também, se você usar i em seu código, especialmente em buscas (como no tutorial), então mude i nesta função para qualquer outra variável, por exemplo k.

E certifique-se de configurar o iCustom dentro da função para seu indicador.

 
keep87:

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(n>1)  

         if(ind!=0) n--;

         else

         if(ind!=0) return(ind);

      }

   }


Se você precisar do número de barra do pico, mude o tipo de função para int e ao invés de return(ind); escreva return(i);

Observe também, se você usar i em seu código, especialmente em buscas (como no tutorial), então mude i nesta função para qualquer outra variável, por exemplo k.

E certifique-se de configurar o iCustom dentro da função para seu indicador.

Nikolay, é interessante, é claro, você tem a condição escrita. Olho para ela e penso...

if(ind!=0) n--;

else

if(ind!=0) return(ind);

Acontece que se o buffer do indicador personalizado retornou o valor zero, então n--, e se obuffer do indicador personalizado retornou o valor zero, então ... devolvemos o valor do tampão indicador.

Mas as condições são as mesmas. E aí e assim se não for zero...

 
hoz:

Nikolai, é interessante, é claro, você tem a condição escrita. Ao olhar para ele, acho...

Acontece que se o buffer indicador personalizado retornou um valor zero, então n--, e se obuffer indicador personalizado retornou um valor zero, então ... devolvemos o valor do tampão indicador.

Mas as condições são as mesmas. E aí e assim se não for zero...

Os suportes caíram enquanto tentavam inserir o código corretamente:

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(n>1) {

         if(ind!=0) n--;

         }else{

         if(ind!=0) return(ind);

         } 

      }

   }

Se n>1 {

se o buffer não estiver vazio, então subtraia 1 de n

} o inverso

se o buffer não estiver vazio, devolva seu valor

}

 

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(ind!=0) {

         if(n>1) n--; else return(ind);

         }

      }

   }


ou assim, o que é mais sucinto. Sou obcecado pela velocidade e beleza do código, não se importe comigo )
 
keep87:

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(ind!=0) {

         if(n>1) n--; else return(ind);

         }

      }

   }


ou assim, o que é mais sucinto. Estou obcecado com a velocidade e a beleza do código, não se importe comigo).


Em geral, tudo está bem nos dois sentidos. Estou acostumado a escrever código um pouco diferente, é mais fácil de ler desta maneira enquanto o seu é diferente. O primeiro parêntese em cada um de seus códigos não se move. Coloquei-o em meu EDITOR e tudo está em seu lugar dessa maneira:

double get_extrem(int n)
{
   for(int i=1;;i++)
   {
     double ind=iCustom(Symbol(),0,"indicator_name",0,i);
       if(n>1)
        {
          if(ind!=0) n--;
        }
        else
        {
          if(ind!=0) return(ind);
        } 
   }
}
 
hoz:


Basicamente, tudo está bem nos dois sentidos. Estou acostumado a escrever código de uma maneira diferente: é mais fácil de ler desta maneira, enquanto que a sua é diferente. O primeiro parêntese em cada um de seus códigos não se move. Coloquei-o no Editor e tudo está em seu lugar nesta forma:


quando o código passa de 1000 linhas, você começa a escrever de forma compacta).

também no MT4 o desempenho sofre, especialmente quando se realizam testes. A versão lacônica tem um desempenho mais rápido.