Problema com o indicador ZigZag - página 4

 
aed71:

OK, obrigado FMIC.

Na verdade, meu problema era sobre o especialista que compartilhei no fórum. Seu script funciona muito bem, mas basicamente preciso dele na forma de um especialista que também possa trabalhar em modo quase em tempo real.

Suas perguntas originais sobre este tópico foram:

  1. Como acessar corretamente os dados do indicador ZigZag através do uso da função "iCustom"?
  2. Como coletar e processar os pontos altos e baixos do ZigZag para análise estatística?

Meu script lhe forneceu o código de exemplo e o conhecimento para responder a ambas as consultas, de modo que agora você pode aplicar esse conhecimento a outros usos, como um EA que você deseja desenvolver. Tudo que você precisa fazer é usar meu código para o uso do iCustom() e para testar os pontos altos e baixos do ZigZag e aplicá-lo ao seu código EA.

Entretanto, a outra consulta, que você mencionou posteriormente, sobre como usar os dados ZigZag em uma EA específica para as necessidades de otimização de uma estratégia que você já tem em funcionamento em outra EA, não foi apresentada ou descrita aqui com detalhes suficientes sobre este tópico. Portanto, em essência, não posso oferecer-lhe conselhos ou ajuda porque não sei o que é que você precisa.

Se você ler o artigo que acompanha meu indicador ZigZagZug na base de código, você verá que usar o ZigZag em estratégias e EAs não é fácil por causa da constante repintura, e requer uma compreensão cuidadosa de como ele funciona e como ele pode ser usado em diferentes estratégias e EAs.

Em outras palavras, o casamento entre os dados ZigZag e uma estratégia EA é complexo e precisa ser bem definido. Portanto, sem saber nada sobre sua estratégia atual ou como ela deve ser otimizada, não posso lhe oferecer mais ajuda ou conselhos.

Uma vez que é compreensível que você talvez não queira ser mais próximo publicamente, ofereci até mesmo a oportunidade de fazê-lo em particular, e sem nenhum custo. Sou um Desenvolvedor de Software e normalmente cobro por estes serviços.

Além do que já lhe ofereci, não posso mais fazer ou oferecer-lhe mais conselhos sem compreender a natureza do problema que você quer resolver.

 

Hi,

Eu consegui corrigir meu código. Houve um erro na lógica dos loops, agora ele funciona bem até onde eu testei.

Aqueles que estão interessados poderiam usá-lo. Ele foi projetado para ser usado como especialista e usa metaquotas do indicador padrão ZigZag.

O que ele faz basicamente encontra os pontos altos e baixos reais no indicador ziguezague. Pode ser usado para encontrar pontos baixos e altos em dados históricos também para análise de período e amplitude.

Não é em tempo real! Ele volta aos últimos valores altos e baixos, portanto, dependendo da duração da última tendência, ele pode voltar e corrigir os valores. Não o utilize antes de um teste rápido no testador de estratégia.

FMIC, obrigado por seus esforços e ajuda.

Arquivos anexados:
 

Olá aed71,

Ainda há alguns bugs lógicos em seu código.

  1. Seu chamado "tick loop", na verdade é uma "Nova Condição de Barra", já que você está testando o "Tempo[0]" para uma mudança no tempo, a fim de detectar uma nova barra. Sugiro mudar o comentário de modo a não deturpar o código.
  2. Você está atribuindo valores à matriz antes das condições de teste e depois está testando certas variáveis várias vezes sem necessidade, a fim de apagá-la novamente. Isso só retardará seu código e também tornará difícil seguir a lógica.
  3. Sua maneira de encontrar pontos de repintura está incorreta e não é nada robusta. Você deve realmente estudar como o ZigZag funciona a fim de encontrar os pontos de repintura corretamente. Leia seu código, ou o do ZigZagZug (que é sempre mais fácil para você seguir) a fim de entender sua lógica.
  4. Você está armazenando valores nulos na matriz sem necessidade. Por que continuar incrementando o contador e adicionando ao array mesmo quando não há nenhum ponto ZigZag disponível? Você está apenas desperdiçando recursos valiosos (ciclos de RAM e CPU) sem necessidade. Isso irá retardar sua execução do código. Ao invés de usar matrizes dinamicamente crescidas em vez de estáticas, pois você não pode garantir um certo tamanho de exigência de antemão.
  5. Para analisar os dados posteriormente, tais como períodos de ondas ou freqüências, você também precisará acompanhar o índice de tempo e/ou o índice de deslocamento de barras.

Com os melhores cumprimentos,
FMIC

 
FMIC:

Olá aed71,

Ainda há alguns bugs lógicos em seu código.

  1. Seu chamado "tick loop", na verdade é uma "Nova Condição de Barra", já que você está testando o "Tempo[0]" para uma mudança no tempo, a fim de detectar uma nova barra. Sugiro mudar o comentário de modo a não deturpar o código.
  2. Você está atribuindo valores à matriz antes das condições de teste e depois está testando certas variáveis várias vezes sem necessidade, a fim de apagá-la novamente. Isso só retardará seu código e também tornará difícil seguir a lógica.
  3. Sua maneira de encontrar pontos de repintura está incorreta e não é nada robusta. Você deve realmente estudar como o ZigZag funciona a fim de encontrar os pontos de repintura corretamente. Leia seu código, ou o do ZigZagZug (que é sempre mais fácil para você seguir) a fim de entender sua lógica.
  4. Você está armazenando valores nulos na matriz sem necessidade. Por que continuar incrementando o contador e adicionando ao array mesmo quando não há nenhum ponto ZigZag disponível? Você está apenas desperdiçando recursos valiosos (ciclos de RAM e CPU) sem necessidade. Isso irá retardar sua execução do código. Ao invés de usar matrizes dinamicamente crescidas em vez de estáticas, pois você não pode garantir um certo tamanho de exigência de antemão.
  5. Para analisar os dados posteriormente, tais como períodos de ondas ou freqüências, você também precisará acompanhar o índice de tempo e/ou o índice de deslocamento de barras.

Com os melhores cumprimentos,
FMIC

Mais uma vez, obrigado por seus comentários;

Eu não sou um bom programador, então o código em si pode não ser perfeito :-) No entanto, deixe-me tentar explicar minha lógica;

1-) A parte dos comentários poderia ser mudada para "cada nova barra".

2-) 4-) 5-) A lógica de usar grandes matrizes é que depois com um novo processo contarei as barras de valor zero entre altos ou entre altos e baixos para encontrar o período, a amplitude, etc. Portanto, preciso inicializar a matriz antes de usá-la e não preciso lidar com o índice de tempo, etc. Apenas mais buffer, o que não é um grande problema para meu projeto atualmente.

3-) Eu rastreei o ziguezague e o ziguezague várias vezes. em ziguezague, embora você tenha valores muito altos e baixos no final, se você colocar esses valores em um array, você verá que há entre baixos e altos. Você não pode evitá-los e não pode usar a combinação mode0 e mode1/mode2. Sempre há entre baixos e altos. Em zig-zagzug você pode ver claramente esses pontos. Além disso, vejo que há casos em que o modo0 é zero, mas o modo1 ou o modo2 são maiores que zero, que são pontos incorretos. Portanto, decidi colocar um código extra para evitar estes pontos.

Como mencionei, este pode não ser o melhor código para encontrar pontos em ziguezague, entretanto o código que ele mesmo está funcionando corretamente em meus testes. Eu já testei várias vezes. Eu sempre recomendo que aqueles que querem usá-lo testem antes.

Você já o testou? Ele não dá os pontos corretos. Quando você diz que não é robusto ou que está incorreto, presumo que seus testes falharam, não é mesmo?

Obrigado.

 
aed71:

Mais uma vez, obrigado por seus comentários;

Eu não sou um bom programador, então o código em si pode não ser perfeito :-) No entanto, deixe-me tentar explicar minha lógica;

1-) A parte dos comentários poderia ser mudada para "cada nova barra".

2-) 4-) 5-) A lógica de usar grandes matrizes é que depois com um novo processo contarei as barras de valor zero entre altos ou entre altos e baixos para encontrar o período, a amplitude, etc. Portanto, preciso inicializar a matriz antes de usá-la e não preciso lidar com o índice de tempo, etc. Apenas mais buffer, o que não é um grande problema para meu projeto atualmente.

3-) Eu rastreei o ziguezague e o ziguezague várias vezes. em ziguezague, embora você tenha valores muito altos e baixos no final, se você colocar esses valores em um array, você verá que há entre baixos e altos. Você não pode evitá-los e não pode usar a combinação mode0 e mode1/mode2. Sempre há entre baixos e altos. Em zig-zagzug você pode ver claramente esses pontos. Além disso, vejo que há casos em que o modo0 é zero, mas o modo1 ou o modo2 são maiores que zero, que são pontos incorretos. Portanto, decidi colocar um código extra para evitar estes pontos.

Como mencionei, este pode não ser o melhor código para encontrar pontos em ziguezague, entretanto o código que ele mesmo está funcionando corretamente em meus testes. Eu já testei várias vezes. Eu sempre recomendo que aqueles que querem usá-lo testem antes.

Você já o testou? Ele não dá os pontos corretos. Quando você diz que não é robusto ou que está incorreto, presumo que seus testes falharam, não é mesmo?

Obrigado.


Você está perdendo o ponto! O código que lhe forneci mostra como identificar corretamente os pontos ZigZag Alto/Baixo; no entanto, você opta por ignorá-lo e fazê-lo de sua própria maneira que torna o código mais difícil de entender e mais lento, além de utilizar mais recursos do que é necessário. Por quê?
 
Fernando Carreiro #:

Você está usando o ZigZag incorretamente em seu exemplo iCustom. O ZigZag padrão por MetQuotes tem TRÊS (não dois) Buffers (Modos ou Índice de Linha no iCustom)

  1. Modo = 0: Mantenha os pontos ZigZag alto e baixo.
  2. Mode = 1: Pontos altos mas não necessariamente apenas pontos ZigZag (pois também detém pontos de repintura).
  3. Mode = 2: Pontos baixos mas não necessariamente apenas pontos ZigZag (pois também detém pontos de repintura).

Você precisará comparar o primeiro buffer (Modo 0) com os outros 2 buffers para decidir se é um ponto alto ou um ponto baixo (por exemplo, se ambos Buffer 1 e Buffer 3 têm o mesmo valor, então é um ponto baixo ZigZag, e se ambos Buffer 1 e Buffer 2 são o mesmo, então é um ponto alto).

Além disso, para entender melhor como funciona um ZigZag e como ele pinta novamente, sugiro brincar com meu indicador ZigZagZug. Entretanto, em seu código, use o MetaQuotes ZigZag, pois ele é mais rápido. Minha versão faz mais processamento por causa das características extras e é, portanto, mais lenta.

PS! Se o Buffer 1 (Modo = 0) tem um valor de 0,0, mas os outros buffers têm valores não zero, então eles são pontos de repintura mais antigos e NÃO pontos ZigZag.

Em seu código você está usando o Buffer Mode 0 como o Buffer Baixo e o Buffer Mode 1 como o Alto. Isso é totalmente incorreto.

u não vai acreditar o quanto isso me ajudou a agradecer muito