Problema com o indicador ZigZag - página 3

 
FMIC:


Como explicado anteriormente em um posto anterior, você não pode usar apenas o buffer Alto e Baixo para obter pontos ZigZag, pois eles também incluem pontos repintados (ciano e pontos cor-de-rosa na mina). No ZigZag padrão também é assim, mas você simplesmente não os vê. É por isso que meu indicador os mostra para que você possa entendê-los melhor.

Você tem que comparar os amortecedores Alto e Baixo com o primeiro que contém AMBOS Baixo e Alto, a fim de filtrar APENAS os pontos ZigZag.

NB! Você terá que 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 em ZigZag, e se ambos Buffer 1 e Buffer 2 são o mesmo, então é um ponto alto).

Se você quiser, anexe seu arquivo a um post, e eu o corrigirei para que você possa ver como usá-lo corretamente ( ATENÇÃO, não use SRC para não ser um post longo ).


Olá FMIC,

Obrigado por sua explicação e ajuda. Eu ainda não consegui obter os valores altos e baixos. A questão é que ele re-pinta (normalmente) e eu não consigo encontrar os altos e baixos históricos. Também estou usando o modo 0 e modo 1 ou modo 0 e modo 2 no indicador ziguezague original, porém todos os resultados já têm os dois valores. Quero dizer que não há uma única linha com zh (modo 1) ou zl (modo 2) com valores mas não zz (modo 0). Portanto, não consegui usar esse método.

Além disso, usei o índice da função iCustom() mas não pude ter sucesso. Parece muito simples, mas estou trabalhando nele mais de 1 dia, mas não consegui encontrar uma solução.

Por favor, encontre meu código no anexo (versão 5). Qualquer ajuda é muito apreciada.

Arquivos anexados:
 

Faço mais alguns testes e também faço testes visuais. Até coloquei o índice iCustom 100 ticks atrás para evitar a repintura, mas ele faz. A questão é que quando uma chamada o indicador ziguezagueia está olhando para os dados reais; 100 tic antes, 10 tic antes ou 1000 tic antes não tem nenhum impacto sobre ele. Portanto, é melhor usar o índice como 1.

Meu entendimento é que preciso fazer outro loop verificando as arrays e corrigindo os altos e baixos, eliminando os dados; como se houvesse dois altos consecutivos, eliminaria o mais baixo e faria o contrário para os baixos. Meu raciocínio inicial é novamente voltar atrás, dizer 100 dias na matriz e verificar se há altas e baixas consecutivas. Ainda não cheguei a uma conclusão sobre o algoritmo.

Você tem uma idéia melhor? Incluindo a utilização de uma abordagem completamente diferente para identificar os altos e baixos nos dados históricos?

 
aed71:

Faço mais alguns testes e também faço testes visuais. Até coloquei o índice iCustom 100 ticks atrás para evitar a repintura, mas ele faz. A questão é que quando uma chamada o indicador ziguezagueia está olhando para os dados reais; 100 tic antes, 10 tic antes ou 1000 tic antes não tem nenhum impacto sobre ele. Portanto, é melhor usar o índice como 1.

Meu entendimento é que preciso fazer outro loop verificando as arrays e corrigindo os altos e baixos, eliminando os dados; como se houvesse dois altos consecutivos, eliminaria o mais baixo e faria o contrário para os baixos. Meu raciocínio inicial é novamente voltar atrás, dizer 100 dias na matriz e verificar se há altas e baixas consecutivas. Ainda não cheguei a uma conclusão sobre o algoritmo.

Você tem uma idéia melhor? Incluindo a utilização de uma abordagem completamente diferente para identificar os altos e baixos nos dados históricos?


Olá aed71,

Acabo de voltar de um trabalho e é hora de ir para a cama. Darei uma olhada mais detalhada em seu código pela manhã e lhe fornecerei uma solução correta.

Entretanto, como nota rápida, você não precisa olhar para trás 1000 ou 100 barras, apenas o suficiente para contemplar os parâmetros de"profundidade" e "retrocesso".

Além disso, como você está apenas coletando e analisando os dados, considere um Script para avançar instantaneamente sobre todos os dados do histórico, ao invés de um EA usando intervalos de tempo. Desta forma, você não terá que se preocupar em repintar.

Amanhã eu lhe darei uma explicação mais completa.

Com os melhores cumprimentos,
FMIC

 

Olá FMIC,

Desde ontem estou trabalhando no algoritmo de como eliminar os falsos altos e baixos e codifiquei a versão em anexo para isso. Ele de alguma forma elimina os falsos sinais, mas às vezes apaga o original onde NÃO deveria fazê-lo.

O princípio por trás do código é:

Se houver um alto; ele volta até o último baixo conhecido e verifica passo a passo se o alto atual é maior do que o anterior, então ele apagará o alto anterior.

O mesmo vale para a parte baixa. Eu coloquei algumas explicações para o código.

Pelo menos eu não tenho mais altos ou baixos simultâneos :-)

Agora eu preciso encontrar o bug onde ele apaga os pontos altos/baixos originais.

Se você puder dar uma olhada no meu código pode ser que você possa entender o bug em um curto espaço de tempo. Estou muito concentrado pode ser que não consiga ver os bugs nem mesmo os bugs simples.

Obrigado novamente por sua ajuda.

Arquivos anexados:
 

Bom dia "aed71",

Ainda não analisei seu arquivo mais recente, mas aqui está meu Script (não Indicador, não EA) para revisar um determinado período de tempo e emitir o ZigZag Highs and Lows para um arquivo CSV.

Basta anexar o Roteiro a um gráfico e ele será executado em segundos. Depois basta rever o arquivo CSV que é gerado na pasta "MQL4\Files". Incluí um exemplo executado no EURUSD Daily Chart para o ano de 2013.

Como este é um Script, você não precisa se preocupar com repintura.

Com os melhores cumprimentos,
FMIC

PS! Vou revisar o arquivo mais recente a seguir e dar-lhe meus comentários.

EDIT: Dei uma olhada em seu último código e ele está em todos os lugares. Basta dar uma olhada no meu código e ver que o teste de Highs an Lows é muito mais simples. Não há necessidade de toda essa confusão em seu código. Aqui está um extrato (código completo no arquivo ZIP):

if( dblZigZagPoint > 0 )  // Test if a ZigZag Point is found
{
   intZZCount++;  // Increment ZigZag Counter

   // Test if it is a High, Low or Unknown
   string strZZType = strZZUnknown;
   if( dblZigZagHigh > 0 ) strZZType = strZZHigh;
   else if( dblZigZagLow > 0 ) strZZType = strZZLow;
               
   // Output the ZigZag Point Data to CSV File
   FileWrite( intCSVFileHandle, intZZCount, strZZType, DoubleToString( dblZigZagPoint, intDigits ), Time[ intBarShift ] );
}
Arquivos anexados:
 
FMIC:

Bom dia "aed71",

Ainda não analisei seu arquivo mais recente, mas aqui está meu Script (não Indicador, não EA) para revisar um determinado período de tempo e emitir o ZigZag Highs and Lows para um arquivo CSV.

Basta anexar o Roteiro a um gráfico e ele será executado em segundos. Depois basta rever o arquivo CSV que é gerado na pasta "MQL4\Files". Incluí um exemplo executado no EURUSD Daily Chart para o ano de 2013.

Como este é um Script, você não precisa se preocupar com repintura.

Com os melhores cumprimentos,
FMIC

PS! Vou revisar seu último arquivo a seguir e dar-lhe meus comentários.

EDIT: Dei uma olhada em seu último código e ele está em todos os lugares.
Basta dar uma olhada no meu código e ver que o teste de Highs an Lows é muito mais simples.

Não há necessidade de toda essa confusão em seu código.


Um grande trabalho, bem trabalhado, deve ser incluído na base de código.... Obrigado.

Tenho duas perguntas se você não se importa:

1-) Meus dados que eu baixei e vi no gráfico estavam mostrando 4 dígitos, mas a saída do script era de 5 dígitos. Como isso pode ser possível? Quero dizer 5 dígitos sem zero no final.

Contagem,Tipo,Preço,DataTempo

1,H,1.34962,2013.11.04 00:30:00

2,L,1.34861,2013.11.04 02:15:00

3,H,1.35015,2013.11.04 03:00:00

4,L,1.34417,2013.11.04 05:15:00

5,H,1.35127,2013.11.04 11:15:00

6,L,1.34910,2013.11.04 15:45:00

7,H,1.35236,2013.11.04 18:15:00

8,L,1.35045,2013.11.04 19:45:00

9,H,1.35203,2013.11.04 22:45:00

2-) O roteiro é muito útil, porém esta foi a primeira parte do meu projeto onde analisei os dados históricos. Posteriormente planejava incluir o código ao meu especialista e, de alguma forma, encontrar a correlação entre a história recente e decidir por uma maior otimização das variáveis atuais de acordo. Em outras palavras, eu preciso executar algo semelhante no especialista também. Então, como seria possível convertê-lo em especialista?

Obrigado novamente por sua ajuda :-)


 
aed71:


Um grande trabalho, bem trabalhado, deve ser incluído na base de código.... Obrigado.

Tenho duas perguntas se você não se importa:

1-) Meus dados que eu baixei e vi no gráfico estavam mostrando 4 dígitos, mas a saída do script era de 5 dígitos. Como isso pode ser possível? Quero dizer 5 dígitos sem zero no final.

2-) O script é muito útil, porém esta foi a primeira parte do meu projeto onde analisei os dados históricos. Depois disso, planejava incluir o código ao meu especialista e, de alguma forma, encontrar a correlação entre a história recente e decidir por uma maior otimização das variáveis atuais de acordo. Em outras palavras, eu preciso executar algo semelhante no especialista também. Então, como seria possível convertê-lo em especialista?

Obrigado novamente por sua ajuda :-)

  1. Se você tiver um corretor de 5 dígitos, então os dados terão os 5 dígitos. O problema em muitos Indicadores é que eles não usam a função "IndicatorDigits()", portanto acabam exibindo apenas o número padrão de dígitos, independentemente do que é fornecido pelo corretor. Se você olhar para meu código ZigZagZug, verá que eu defini isto explicitamente, para corrigir o problema, algo que a MetaQuotes falhou em fazer em seu próprio código:

    // Set Number of Digits (Precision)
       IndicatorDigits( Digits );

  2. Quanto ao uso do código em um especialista, isso realmente depende de muitas coisas, tais como a estratégia e como as repinturações o afetarão. Algumas estratégias não são afetadas pelas repinturações, outras são muito sensíveis a elas. Não serei capaz de oferecer muitos conselhos para uma estratégia "desconhecida". Nesse caso, seria preciso ser específico sobre isso. Mas lembre-se, que você não precisa olhar para trás 1000 barras. Se você aprender como o ZigZag funciona e como ele usa break-outs altos e baixos e como ele procura para trás, às vezes você só precisa olhar para trás para uma distância de (Profundidade + Backstep) barras - dependendo da estratégia pode ser um pouco mais ou até menos, mas nunca as 1000 ou 100 que você usa.

 

Obrigado pelas informações sobre os dígitos. É uma dor de cabeça para mim, eu preciso ler e entender os detalhes...

Deixe-me elaborar mais o que estou tentando alcançar. Tenho sido um especialista bastante rentável (atualmente) que testei nos últimos 10 anos. Entretanto, o especialista não está se comportando bem em cada condição, não é muito ruim, mas não é promissor em alguns anos/motores. Ele tem algumas variáveis pré-optimizadas que afetam sua lucratividade. Estou disposto a encontrar uma correlação entre a história recente e a de hoje, a fim de auto-otimizar as variáveis.

Portanto, o que eu preciso é encontrar os picos e baixos nos dados históricos para calcular os períodos e a amplitude dos dados históricos. Vou tentar encontrar manualmente uma correlação entre os dados históricos recentes e as variáveis lucrativas atuais do especialista. Se eu puder encontrá-lo de alguma forma, adicionarei um código similar ao meu especialista, todos os dias ele verificará os dados estatísticos da última semana e de acordo com as constantes correlacionadas, ele se auto-optimizará as variáveis do especialista.

Portanto, esta é a estratégia. Trabalhei em muitos outros tópicos para analisar os dados históricos, incluindo Fourier, Hurts Cycles, Goertzel, MESA, etc., mas concluí que usando um método que passa por cima dos dados existentes será muito melhor.

Portanto, não preciso de uma análise alta-baixa em tempo real, em conjunto de dados de 15M, estou pronto para perder dados de meio dia (quase 45 ticks). O mais provável é que eu olhe os últimos 5 dias e 4,5 dias de mudança é o suficiente para encontrar os novos valores otimizados.

Com relação ao meu código, acho que o problema é; enquanto está verificando os valores máximos anteriores, deve parar no valor mais baixo local. Ainda estou trabalhando nisso, pois preciso da parte especializada da ferramenta.

 
aed71:

Obrigado pelas informações sobre os dígitos. É uma dor de cabeça para mim, eu preciso ler e entender os detalhes...

Deixe-me elaborar mais o que estou tentando alcançar. Tenho sido um especialista bastante rentável (atualmente) que testei nos últimos 10 anos. Entretanto, o especialista não está se comportando bem em cada condição, não é muito ruim, mas não é promissor em alguns anos/motores. Ele tem algumas variáveis pré-optimizadas que afetam sua lucratividade. Estou disposto a encontrar uma correlação entre a história recente e a de hoje, a fim de auto-otimizar as variáveis.

Portanto, o que eu preciso é encontrar os picos e baixos nos dados históricos para calcular os períodos e a amplitude dos dados históricos. Vou tentar encontrar manualmente uma correlação entre os dados históricos recentes e as variáveis lucrativas atuais do especialista. Se eu puder encontrá-lo de alguma forma, adicionarei um código similar ao meu especialista, todos os dias ele verificará os dados estatísticos da última semana e, de acordo com as constantes correlatas, ele se auto-optimizará as variáveis do especialista.

Portanto, esta é a estratégia. Trabalhei em muitos outros tópicos para analisar os dados históricos, incluindo Fourier, Hurts Cycles, Goertzel, MESA, etc., mas concluí que usando um método que passa por cima dos dados existentes será muito melhor.

Portanto, não preciso de uma análise alta-baixa em tempo real, em conjunto de dados de 15M, estou pronto para perder dados de meio dia (quase 45 ticks). O mais provável é que eu olhe os últimos 5 dias e 4,5 dias de mudança é o suficiente para encontrar os novos valores otimizados.

Com relação ao meu código, acho que o problema é; enquanto está verificando os valores máximos anteriores, deve parar no valor mais baixo local. Ainda estou trabalhando nisso, pois preciso da parte especializada da ferramenta.


O que você descreveu não ajuda realmente a entender a natureza da EA para poder lhe dar conselhos.

Se desejar, envie-me uma mensagem particular com os detalhes e eu posso dar uma boa olhada em sua EA e sugerir o código necessário para isso.

Alternativamente, tudo o que posso sugerir é que você tente implementá-lo o melhor possível e, quando tiver um problema específico que precise resolver, volte ao fórum e poste uma consulta específica para ele e veja se os usuários podem ajudar.

 

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.

Razão: