O que as funções mais baixas e mais altas retornam - página 2

 
nen
Não consegui responder (eu estava fora). Afixe o código que você precisa analisar para falar de uma coisa.
ZS Naquele ziguezague não foi um erro, mas um erro de digitação (comparado ao código em MT3), encontrei apenas este erro de digitação e não corrigi mais nada.
 
Vladislav, por alguma razão, seu código não funciona em todos os prazos. Funciona em alguns períodos de tempo, mas não em outros. É estranho. Funciona.
 
Rosh, aqui está o código do codebase.mql4.com. Eu tenho o mesmo. Se for possível superá-la com o mundo inteiro, ficarei muito grato. Eu não serei o único. Obrigado antecipadamente por sua ajuda.

Acumulei agora um grande número dessas ou de outras edições. Eles funcionam muito bem. Entretanto, o primeiro raio - aquele que começa da barra zero ou qualquer uma das primeiras barras - falha com erros nas funções de identificação dos extremos. E o indicador funciona de forma instável.

//+------------------------------------------------------------------+
//| Média móvel personalizada.mq4 |
//| Copyright © 2005, MetaQuotes Software Corp.
//| https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#direitos autorais "Copyright © 2005, MetaQuotes Software Corp."
#link da propriedade "https://www.metaquotes.net/

#janela_do_cartão_indicador de propriedade
#property indicator_buffers 1
#indicador de propriedade_cores1 Vermelho
//---- parâmetros indicadores
intDepth=12;
ExtDeviação Externa Interna=5;
ExtBackstep ExtBackstep=3;
//---- buffers indicadores
duplo ExtMapBuffer[];
duplo ExtMapBuffer2[];

//+------------------------------------------------------------------+
//| Função de inicialização do indicador personalizado |
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers(2);
//---- definições de desenho
SetIndexStyle(0,DRAW_SECTION);
//---- mapeamento de buffers indicadores
SetIndexBuffer(0,ExtMapBuffer);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexEmptyValue(0,0,0.0);
//---- indicador nome curto
IndicatorShortName("ZigZag("+ExtDepth+", "+ExtDeviation+", "+ExtBackstep+")"));
//---- inicialização feita
retorno(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
int shift,back,lasthighpos,lastlowpos;
duplo val,res;
duplo curlow,curhigh,lasthigh,lastlow;

for(shift=Bars-ExtDepth; shift>=0; shift--)
{
val=Low[Lowest(NULL,0,MODE_LOW,ExtDepth,shift)];
if(val===lastlow) val=0,0;
senão
{
lastlow=val;
if((Low[shift]-val)>(ExtDeviation*Point)) val=0,0;
senão
{
for(back=1; back<=ExtBackstep; back++)
{
res=ExtMapBuffer[shift+back];
if((res!=0)&&(res>val)) ExtMapBuffer[shift+back]=0,0;
}
}
}
ExtMapBuffer[shift]=val;
//--- alto
val=Alto[Alto[NULL,0,MODE_HIGH,ExtDepth,shift)];
if(val===lasthigh) val=0,0;
senão
{
lasthigh=val;
if((val-High[shift])>(ExtDeviation*Point)) val=0,0;
senão
{
for(back=1; back<=ExtBackstep; back++)
{
res=ExtMapBuffer2[shift+back];
if((res!=0)&&(res<val)) ExtMapBuffer2[shift+back]=0,0;
}
}
}
ExtMapBuffer2[shift]=val;
}

// corte final
lasthigh=-1; lasthighpos=-1;
lastlow=-1; lastlowpos=-1;

for(shift=Bars-ExtDepth; shift>=0; shift--)
{
curlow=ExtMapBuffer[shift];
curhigh=ExtMapBuffer2[shift];
if((curlow==0)&&(curhigh==0)) continua;
//---
if(curhigh!=0)
{
if(lasthigh>0)
{
if(lasthigh<curhigh) ExtMapBuffer2[lasthighpos]=0;
senão ExtMapBuffer2[shift]=0;
}
//---
if(lasthigh<curhigh || lasthigh<0)
{
lasthigh=curhigh;
lasthighpos=shift;
}
lastlow=-1;
}
//----
if(curlow!=0)
{
if(lastlow>0)
{
if(lastlow>curlow) ExtMapBuffer[lastlowpos]=0;
senão ExtMapBuffer[shift]=0;
}
//---
if((curlow<lastlow)|||(lastlow<0))
{
lastlow=curlow;
lastlowpos=shift;
}
lasthigh=-1;
}
}

for(shift=Bars-1; shift>=0; shift--)
{
if(shift>=Bars-ExtDepth) ExtMapBuffer[shift]=0.0;
senão
{
res=ExtMapBuffer2[shift];
if(res!=0.0) ExtMapBuffer[shift]=res;
}
}
}
 
Vladislav, por alguma razão, seu código não funciona em todos os prazos. Funciona em alguns períodos de tempo, mas não em outros. É estranho. Funciona. <br / translate="no">


Funciona em outros períodos de tempo, mas não em outros. Parece funcionar para mim. Sim, e não é meu código - a partir do fornecimento padrão parece ser. Pelo menos eu tenho em todas as versões de MT.
 
Vladislav, é claro que este não é o seu código. Eu tenho o código que forneci em minha entrega.
Em que prazos não é exibido. BC - Brezan.
GBP-CHF
Não é mostrado nos m1 e m15. É mostrado em todos os outros.
EUR-USD
Não é mostrado - m1, m5
AUD-USD - todos eles são mostrados.
Não sei por que parece ser assim.

Talvez você tenha o código que Slava retrabalhou no verão. Mas eu não gostei de seu retrabalho. Algumas questões não foram resolvidas ali.
================
GODZILLA (Nikolay) fez um bom trabalho. Mas tem apenas dois problemas resolvidos.
1) Recálculo em cada carrapato. Ele o reduziu drasticamente
2) Acrescentou um algoritmo de remoção de corcunda. As saliências aparecem principalmente devido à presença de mínimo e máximo em uma barra. O algoritmo de ziguezague deixa apenas altos. Isto muitas vezes resulta em várias elevações consecutivas.

Tenho algumas variantes de melhoria de indicadores fixadas pela GODZILL. As dobras penduradas no ar foram removidas. Entretanto, suponho que a operação incorreta das funções de busca extrema ainda persiste nos dois primeiros raios. É por causa deste problema que eu trouxe este tópico à tona aqui.

Entretanto, talvez a função de busca funcione corretamente, mas não há uma descrição clara desta função. É por isso que ele é usado incorretamente.
 
Tenho-o exibido em todos os t\f nos pares especificados. Não me lembro de onde veio este código - pensei que estava na entrega do 197 build - eu o tenho em todas as MTs por algum motivo :). Vou verificar isso amanhã.
 
Envergonhado em dizer que nunca me interessei seriamente por ziguezagues antes :). O código no correio de nen 18.10.06 17:46
Ainda não consigo entender. Parece-me que deveria ser algo como ...
// val=Highest[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)]; highpos=Highest(NULL,0,MODE_HIGH,ExtDepth,shift); val=High[highpos]; if(MathAbs(val-lastlow) < Ponto) val=0
.
0; // if(val==lasthigh) val=0,0; else { lasthigh=val; if(highpos!=shift) val=0,0; // if((val-High[shift])>(ExtDeviation*Point)) val=0,0; else { ...


Aqui o código "extra" antigo é comentado. Embora eu possa ainda não entender totalmente a idéia do ziguezague. Em qualquer caso, este código não produz extrema pendente. Se esta variante de código se encaixa, mas não foi inventada por mim :), peço desculpas pela falta de referência.

 
Candidato, obrigado. Vou ver como funciona. Mas a pergunta no título do tópico não desaparece. O simples ziguezague revelou o problema do trabalho "incompreensível" de funções em busca de extrema. A linha highpos=Highest(NULL,0,MODE_HIGH,ExtDepth,shift); ajuda a encontrar um extremo. No entanto, o índice de altos postos retornado pela função Mais Alta quando executado no código ziguezague é frequentemente aleatório. Há um desvio da verdadeira posição da barra. Em outras palavras, os highpos serão, por exemplo, 15. Mas na verdade, a barra terá um índice diferente: 13 ou 16 ou qualquer outra coisa. Assim, você obtém a diferença. Portanto, o ziguezague com pequenos valores de parâmetros e em intervalos de tempo "pequenos" (1 minuto, 5 minutos ...) começa a funcionar instável.

Muito bem. Não importa o ziguezague. A questão não é sobre o ziguezague. A questão é que as funções da linguagem MQ4 devem funcionar de forma estável e previsível.

E este é o PRINCIPAL PROBLEMA. As funções de busca não são utilizadas apenas no ZigZag. Mas também em muitos outros indicadores.

O ziguezague é um caso especial. Mas isso ajuda a destacar o problema. Muitos indicadores são baseados em ziguezagues. O ziguezague funciona instável. Não é um segredo para ninguém. Muitas pessoas têm que gastar seu tempo programando seus próprios ziguezagues para suas próprias necessidades. Quanto tempo é desperdiçado. Em vão. Devido a uma falta de compreensão da raiz do problema.
 
Candidato, suas palavras: Vergonha de dizer, ..... O código no correio de nen 18.10.06 17:46 ainda não foi compreendido.

Essas são palavras de ouro. Você não é o primeiro a dizer isso. No entanto, as idéias por trás do ziguezague e parcialmente implementadas neste código são muito boas. Estas idéias devem ser levadas à prática.
 
2 nen:
Quando movemos a janela (shift,shift+ExtDepth) enquanto calculamos o indicador, a aparência de um novo extremo pode estar relacionada tanto ao novo preço quanto ao fato de que o antigo extremo deixou a janela. Este ponto precisa ser tratado. Para este fim, minha inserção contém a linha if(highpos!=shift) val=0,0; . Como isto é feito no código padrão, eu não entendo. A julgar pela falta de extrema na minha versão, ou isso é feito de forma incorreta ou não é feito de forma alguma.
E o que é exatamente a instabilidade do ziguezague?
Razão: