Cálculo da diferença, exemplos. - página 4

 
Yousufkhodja Sultonov:

Quando se aumenta a amostra para N=100, a equação do 4º grau dá o seguinte resultado:



Matematicamente falando, os limites da sua busca são muito confusos. Poderia, por favor, explicar melhor como é que é?

 
Nikolai Semko:

Sim, eu estava enganado. Pensei que estavas mesmo a usar a aproximação. Dei uma olhada mais de perto no seu código e percebi que não é uma aproximação, mas apenas uma média trivial, embora muito incomum. Depois disso você desloca a linha roxa e a linha vermelha 72 barras para a esquerda e termina desenhando a cauda vermelha de 92 barras, e ela é redesenhada com cada nova barra. A linha azul é formada a partir da linha púrpura deslocada. E a propósito, é mais correcto usar o preço fechado do que o aberto. Se você mudar para fechar, você pode ver imediatamente que a cada tic tac de 92 barras a cauda vermelha salta.

Mudar as médias móveis para a esquerda não tem utilidade e aplicação prática. Serve apenas para a beleza, a forma e o encanto.

Precisamos entender a diferença entre aproximação e suavização (média). A aproximação calcula os coeficientes de uma função (polinomial, Fourier, Bezier, spline, etc.) num dado intervalo de dados e esses coeficientes como regra mudam tudo quando pelo menos um valor de dados muda, portanto a função é redesenhada sobre o intervalo de dados observado. Mas no caso da média, apenas um ponto atual com base nos dados anteriores é considerado; portanto, a média (suavização) não é redesenhada, mas sempre fica atrás dos dados, ao contrário da aproximação.
E eu não entendo o que polinomial de algum grau e o Binom de Newton tem a ver com isso, se não há nem mesmo nenhum grau no código.

))

Uh-huh, e agora também um sinusoidal sem uma função de Pecado explícita.

A equação da diferença para seno:https://dxdy.ru/post1247421.html#p1247421

      a1_Buffer[i]=((open[i] - Znach)    +5061600*a1_Buffer[i+1 ]-7489800   *a1_Buffer[i+2 ]+4926624*a1_Buffer[i+3 ]-1215450*a1_Buffer[i+4 ])/1282975;

      a2_Buffer[i]=  2701*a1_Buffer[i]   -5328   *a1_Buffer[i+1 ]    +  2628 *a1_Buffer[i+2 ];

      a4_Buffer[i+92]=a1_Buffer[i];   if(i<=1) { for(z=92-1;z>=0;z--){        a4_Buffer[i+0+z]=  5*a4_Buffer[i+1+z]  -  10*a4_Buffer[i+2+z]   +   10*a4_Buffer[i+3+z]  -  5*a4_Buffer[i+4+z]  +  1*a4_Buffer[i+5+z];  }}

      a3_Buffer[i+292]=a1_Buffer[i];   if(i<=1) { for(z=292-1;z>=0;z--){         a3_Buffer[i+0+z]=  2.998096443*a3_Buffer[i+1+z]  -  2.998096443*a3_Buffer[i+2+z]   +   1*a3_Buffer[i+3+z]   ;  }}

      a5_Buffer[i+92]=a1_Buffer[i];   if(i<=1) { for(z=92-1;z>=0;z--){        a5_Buffer[i+0+z]=  3*a5_Buffer[i+1+z]  -  3*a5_Buffer[i+2+z]   +   1*a5_Buffer[i+3+z]   ;  }}

      a6_Buffer[i+292]=a1_Buffer[i];   if(i<=1) { for(z=292-1;z>=0;z--){         a6_Buffer[i+0+z]=  3.998096443*a6_Buffer[i+1+z]  -  5.996192886*a6_Buffer[i+2+z]   +   3.998096443*a6_Buffer[i+3+z]  -  1*a6_Buffer[i+4+z] ;  }}

O cálculo das ondas sinusoidais com o período 144 é destacado. A primeira está perto da constante (verde na figura), a segunda está perto da linha inclinada (vermelho na figura).

Рекуррентная формула для синуса : Дискуссионные темы (М) - Страница 7
  • dxdy.ru
В принципе, используется и рекуррентное вычисление через возвратное уравнение второго порядка, и через комплексную экспоненту. Первое менее расходно по ресурсам (умножение и два сложения и две ячейки памяти) по сравнению со вторым (два умножения, четыре сложения, две ячейки памяти при постоянной частоте), но накапливается погрешность быстрее...
Arquivos anexados:
 

Eu provavelmente deveria ter anexado uma "lista de leitura" ao ramo imediatamente. ))

Há muita literatura sobre o assunto, por isso vou sugerir alguns livros finos a meu gosto:

Cálculo de diferenças finitas por Leonid Kuzmich Lakhtin.

Markushevich A.I. Sequências de Retorno

 
Aleksey Panfilov:

))

Uh-huh, e agora também um sinusoidal sem uma função de Pecado explícita.

A equação da diferença para seno:https://dxdy.ru/post1247421.html#p1247421

O cálculo dos sinusoidais com o período 144 é destacado. A primeira está perto da constante (verde na figura), a segunda está perto da linha inclinada (vermelho na figura).


Obrigado, Alexey, pela literatura. Admito que a recorrência pode ser útil e aplicada com sucesso para acelerar algumas funções ou algoritmos, mas para dizer a verdade não tenho tanta certeza sobre isso.
Estou apenas defendendo que as coisas devem ser chamadas pelos nomes próprios e que a terminologia convencional deve ser usada, para que não haja confusão. Na minha opinião, teria sido mais lógico mencionar a recorrência no início deste fio e não mencionar a interpolação, aproximação e polinómios, já que eles não são mostrados no seu exemplo. E teria sido melhor focar no deslocamento do indicador para a esquerda, para não enganar os outros por excesso de correcção de formas, porque nem todos gostam de compreender o código dos outros, eu também caí nessa.

Alexey, tanto quanto sei você é um profissional em matéria de recursividade. Pessoalmente, não faço ideia. Eu tenho uma pergunta, um pedido e uma sugestão. Você pode usar seus métodos para acelerar a aproximação pelo método de Fourier? Algo me diz que é possível. Se você puder fazer isso, será wOW!!! e o uso prático será tremendo. Anexo um exemplo de aproximação com a extrapolação de Fourier no MT5 (só funciona muito mais rápido e simplesmente melhor). Tomei este exemplo a partir daqui e melhorei um pouco a clareza ao adicionar o controle do mouse com a tecla Ctrl (que muda a posição inicial) e Shift (que muda o período de observação com a mudança simultânea do número de harmônicas). Podes tentar?

Este indicador é o seguinte: primeiro, clique no gráfico com o mouse (para ativar a janela), pressione Ctrl (e solte-o) e mova o mouse para mudar a posição inicial; para finalizar o processo, pressione qualquer tecla (exceto Ctrl e Shift). O mesmo vale para a tecla Shift para alterar o período (intervalo de barras para a função de aproximação).

Arquivos anexados:
Fourier.mq5  16 kb
 

Fórum sobre negociação, sistemas de negociação automatizados e testes de estratégia de negociação

Cálculo da diferença, exemplos.

Nikolai Semko, 2018.01.12 00:43


Estou simplesmente defendendo que as coisas devem ser chamadas pelos seus nomes próprios e que a terminologia geralmente aceita deve ser usada, para que não haja confusão. Na minha opinião, teria sido mais lógico mencionar a recorrência no início deste fio e não mencionar a interpolação, aproximação e polinómios, já que eles não são mostrados no seu exemplo. E teria sido mais correto focar no deslocamento do indicador para a esquerda, para não enganar os outros pela exatidão excessiva das formas, porque nem todos gostam de olhar para o código dos outros, eu também tinha caído nessa.


Nikolai, obrigado pelo posto e pelo indicador anexo.

E eu concordo plenamente, antes de mais nada deve haver uma compreensão inequívoca dos termos e nomes.

Deixa-me explicar a minha posição.

Você pode traçar uma linha por dois pontos, o que significa que você pode encontrar qualquer ponto desta linha dentro do intervalo entre os pontos (interpolação) ou fora do intervalo entre os pontos (extrapolação).

Você pode desenhar uma curva de valor único correspondente, por exemplo, a uma parábola quadrada expressa em um sistema de coordenadas cartesianas por uma equação quadrática linear. Isto significa que também é possível encontrar qualquer ponto desta curva dentro do intervalo entre os pontos extremos (interpolação) ou fora deste intervalo (extrapolação). A lei segundo a qual estes pontos são traçados permanece polinomial. Devo acrescentar também que, pelo menos por três pontos, é possível desenhar uma única onda de pecado, se assumirmos uma lei de onda de pecado, ou um círculo, se assumirmos a sua presença.

Assim, a interpolação por um polinômio do segundo grau sobre três pontos (no nosso caso, dois dos quais acumulam o histórico anterior e o terceiro traz novas informações) do quarto, revela-se necessária (pode haver outras leis) e suficiente definição da ação ou processo.

A menos, claro, que sugira outros termos para isso.

Dito isto, concordo plenamente que se se quiser traçar uma curva pelo número de valores que excedam o número mínimo exigido, deve-se usar métodos estatísticos (ou não) sólidos de ponderação dos valores, incluindo a regressão.
 
Aleksey Panfilov:


Nikolai, obrigado pelo posto e pelo indicador anexo.

E eu concordo plenamente, antes de mais nada é necessária uma compreensão clara dos termos e nomes.

Deixa-me explicar a minha posição.

Você pode traçar uma linha em dois pontos, significa encontrar qualquer ponto desta linha, seja dentro do intervalo entre os pontos (interpolação), ou fora do intervalo entre os pontos (extrapolação).

Você pode desenhar uma curva de valor único correspondente, por exemplo, a uma parábola quadrada que no sistema de coordenadas cartesianas é expressa por uma equação linear-quadrada. Isto significa que também é possível encontrar qualquer ponto desta curva dentro do intervalo entre os pontos extremos (interpolação) ou fora deste intervalo (extrapolação). A lei segundo a qual estes pontos são traçados permanece polinomial. Devo acrescentar também que, pelo menos por três pontos, é possível desenhar uma inequívoca onda de pecado, se assumirmos uma lei de onda de pecado, ou um círculo, se assumirmos a sua presença.

Assim, a interpolação por um polinômio do segundo grau sobre três pontos (no nosso caso, dois dos quais acumulam o histórico anterior e o terceiro traz novas informações) do quarto, revela-se necessária (pode haver outras leis) e suficiente definição da ação ou processo.

A menos, claro, que sugira outros termos para isso.

Dito isto, concordo plenamente que se você precisa traçar uma curva para um número de valores que exceda o número mínimo exigido, você precisa usar métodos estatisticamente (ou não) justificados de ponderação de valores, incluindo a regressão.

Como construir uma curva polinomial por três pontos que implementei recentemente neste código . Sugiro que dês uma vista de olhos.

Mas o seu código não calcula o polinómio por três pontos:

Aleksey Panfilov:

É o que parece no gráfico:

A linha azul-vermelha é interpolação (encontrar um ponto dentro de um intervalo) por um polinómio de 4º grau com um ombro de 72.

a1_Buffer[i]=((open[i] - Znach)    +5061600*a1_Buffer[i+1 ]-7489800   *a1_Buffer[i+2 ]+4926624*a1_Buffer[i+3 ]-1215450*a1_Buffer[i+4 ])/1282975;

A fina linha azul é a extrapolação (encontrar um ponto fora do intervalo) pelo polinômio de grau 2 com alavancagem 78.

a2_Buffer[i]=  3160*a1_Buffer[i]   -6240   *a1_Buffer[i+1 ]    +  3081*a1_Buffer[i+2 ];

A linha vermelha é a linha de construção do polinómio de potência 4. É redesenhado e baseado no último ponto de abertura do bar.

a4_Buffer[i+92]=a1_Buffer[i];   if(i<=10) { for(z=92-1;z>=0;z--){        a4_Buffer[i+0+z]=  5*a4_Buffer[i+1+z]  -  10*a4_Buffer[i+2+z]   +   10*a4_Buffer[i+3+z]  -  5*a4_Buffer[i+4+z]  +  1*a4_Buffer[i+5+z];  }}


O que se chama um polinómio de 2º grau e um polinómio de 4º grau não são polinómios.

Desde que a fórmula para um polinómio de 2º grau

Price = a+b*i+c*i²

mas a fórmula de um polinómio de 4º grau:

Price = a+b*i+c*i²+d*i³+f*i⁴

onde

a,b,c,d,f - coeficientes a serem calculados

i é o número do bar.

E você tem uma forma ornamentada de fazer a média, na qual (usando o exemplo do que você chama um polinômio de grau 2) o ponto atual de uma linha i é calculado a partir dos últimos três pontos (i,i+1 e i+2) de outra linha com coeficientes de peso diferentes. A isto se chama cálculo da média (ou alisamento). Por isso você deslocou o gráfico 72 barras para a esquerda, a fim de esconder o atraso que ocorre como resultado da média.

No meuexemplo, o cálculo do polinômio por três pontos é claramente visível.

 
Nikolai Semko:

No meuexemplo, porém, o cálculo do polinômio sobre os três pontos é clara e claramente visível.

O seu indicador é muito bom.

Se você tiver o mesmo para um quatro, então prenda-o a quaisquer três pontos da linha indicadora cinza do poste 23 deste fio.

Esta linha (cinza) é calculada no buffer:

 a5_Buffer[i+92]=a1_Buffer[i];   if(i<=1) { for(z=92-1;z>=0;z--){        a5_Buffer[i+0+z]=  3*a5_Buffer[i+1+z]  -  3*a5_Buffer[i+2+z]   +   1*a5_Buffer[i+3+z]   ;  }}
1*Y1-3*Y2+3*Y3-1*Y4=0 - equação de diferença da parábola de segundo grau. Para pontos equidistantes.
 
Aleksey Panfilov:

O seu indicador é muito bom.

Se tiver o mesmo para um quatro, fixe-o a quaisquer três pontos da linha indicadora cinzenta do poste 23 deste fio.

Esta linha (cinza) é calculada no buffer:

1*Y1-3*Y2+3*Y3-1*Y4=0 é a equação de diferença de uma parábola de segundo grau. Para pontos equidistantes.

Eu tenho o código para MT4 mais abaixo nos comentários

Sim, a linha cinzenta que você tem é um polinómio. E a cauda vermelha de 92 bar de 2 mensagens que você redesenhar para a média deslocada também é um polinômio e é apenas redesenhado. Mas você chama tudo o resto de polinómio e ao mesmo tempo afirma que o seu polinómio não é redesenhado. E não tem. É por isso que lhe peço que chame as coisas pelos nomes próprios.

E a propósito, no meu exemplo a formação dos próximos pontos no polinómio é feita através do cálculo de coeficientes e este algoritmo é mais rápido que o seu "cálculo da diferença", embora eu também aplique a diferença com o valor anterior:

for(i=1; i<=Bar[0]; i++) { ArcDownBuffer[i]=ArcDownBuffer[i-1]+D2; D2+=2*C2;}

a sua opção:

for(z=92-1;z>=0;z--){        a5_Buffer[i+0+z]=  3*a5_Buffer[i+1+z]  -  3*a5_Buffer[i+2+z]   +   1*a5_Buffer[i+3+z]   ;  }
 
Nikolai Semko:

Eu tenho o código para MT4 mais abaixo nos comentários

Sim, a linha cinzenta que você tem é um polinómio. E a cauda vermelha de 92 barras da 2ª mensagem, que você extrai para a média deslocada, também é um polinômio e é extraída a descoberto. Mas você chama tudo o resto de polinómio e ao mesmo tempo afirma que o seu polinómio não é redesenhado. E não tem. É por isso que lhe peço que chame as coisas pelos nomes próprios.


Sim, concordo com o polinômio do segundo grau, apenas 4 pontos envolvidos na construção, ou 6 pontos para o polinômio do quarto grau. Toda a linha que é obtida e não redesenhada não é, naturalmente, um polinómio, apenas é construída nos casos considerados utilizando um polinómio de certo grau.

As linhas finas apenas visualizam aqueles polinómios com os quais o próximo ponto é construído.

Parece que concordamos com os termos. :)


E a propósito no meu exemplo a formação dos próximos pontos no polinómio é feita através do cálculo de coeficientes e este algoritmo é mais rápido que o seu "cálculo da diferença", embora eu também aplique a diferença com o valor anterior:

for(i=1; i<=Bar[0]; i++) { ArcDownBuffer[i]=ArcDownBuffer[i-1]+D2; D2+=2*C2;}

a sua opção:

for(z=92-1;z>=0;z--){        a5_Buffer[i+0+z]=  3*a5_Buffer[i+1+z]  -  3*a5_Buffer[i+2+z]   +   1*a5_Buffer[i+3+z]   ;  }

Em relação à velocidade, você provavelmente tem razão.

Proponho não discutir questões de desempenho e provavelmente desleixo (o meu em primeiro lugar:)) ) na codificação, claro, se eles não forem críticos.

 
Nikolai Semko:

Você pode usar seus métodos para acelerar a aproximação de Fourier? Algo me diz que é possível. Se você conseguir, será um uau!!... e os benefícios práticos serão enormes. Anexo um exemplo de aproximação com a extrapolação de Fourier no MT5 (apenas funciona muito mais rápido e simplesmente melhor). Tomei este exemplo daqui e melhorei-o um pouco, para maior clareza, adicionando controlo do rato com a tecla Ctrl (que muda a posição inicial) e Shift (que muda o período de observação com mudança simultânea do número de harmónicos). Podes tentar?

Este indicador é o seguinte: primeiro, clique no gráfico com o mouse (para ativar a janela), pressione Ctrl (e solte-o) e mova o mouse para mudar a posição inicial, para finalizar o processo, pressione qualquer tecla (exceto Ctrl e Shift). O mesmo com a tecla Shift para alterar o período (intervalo de barras para calcular a função de aproximação).


Em relação a Fourier, o tema é rico. Se houver interesse, vamos tocá-lo de vez em quando.

Muito provavelmente, as principais questões surgirão a partir da declaração do problema (devido ao outro método). Agora, tanto quanto sei, o indicador selecciona a maioria das frequências de amplitude do espectro de Fourier.

Tive a ideia de aparafusar o indicador deFourier a uma linha polinomial já com média. Suspeito, que as suas leituras extrapoladas vão mudar mais lentamente.

Razão: