Calcolo delle differenze, esempi. - pagina 4

 
Yousufkhodja Sultonov:

Quando si aumenta il campione a N=100, l'equazione di 4° grado dà il seguente risultato:



Matematicamente parlando, i confini della tua ricerca sono molto sfumati. Potresti per favore spiegarmi come si presenta?

 
Nikolai Semko:

Sì, mi sono sbagliato. Credevo che usasse davvero l'approssimazione. Ho dato un'occhiata più da vicino al tuo codice e mi sono reso conto che non è un'approssimazione, ma solo una media banale, anche se molto insolita. Dopo di che si sposta la linea viola e la linea rossa di 72 barre a sinistra e si finisce di disegnare la coda rossa di 92 barre, e viene ridisegnata con ogni nuova barra. La linea blu è formata dalla linea viola spostata. E a proposito, è più corretto usare il prezzo di chiusura piuttosto che quello di apertura. Se si passa alla chiusura, si può immediatamente vedere che ad ogni tick la coda rossa di 92 barre salta.

Spostare le medie mobili a sinistra non ha alcuna utilità e applicazione pratica. Serve solo per la bellezza, la forma e il fascino.

Dobbiamo capire la differenza tra approssimazione e smoothing (media). L'approssimazione calcola i coefficienti di una funzione (polinomiale, Fourier, Bezier, spline, ecc.) su un dato intervallo di dati e questi coefficienti di regola cambiano tutto quando cambia almeno un valore di dati, quindi la funzione viene ridisegnata sull'intervallo di dati osservato. Ma nel caso della media, viene considerato solo un punto corrente sulla base dei dati precedenti; quindi, la media (smoothing) non viene ridisegnata, ma rimane sempre indietro rispetto ai dati, a differenza dell'approssimazione.
E non capisco cosa c'entrino il polinomio di qualche grado e il binomio di Newton, se non ci sono nemmeno gradi nel codice.

))

Uh-huh, e ora anche una sinusoide senza una funzione Sin esplicita.

L'equazione della differenza per il 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] ;  }}

Il calcolo delle onde sinusoidali con periodo 144 è evidenziato. Il primo è vicino alla costante (verde nella figura), il secondo è vicino alla linea inclinata (rosso nella figura).

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

Probabilmente avrei dovuto allegare subito una "lista di lettura" al ramo. ))

C'è molta letteratura sull'argomento, quindi vi suggerirò un paio di libri sottili di mio gusto:

Calcolo delle differenze finite di Leonid Kuzmich Lakhtin.

Sequenze di ritorno di Markushevich A.I.

 
Aleksey Panfilov:

))

Uh-huh, e ora anche una sinusoide senza una funzione Sin esplicita.

L'equazione della differenza per il seno:https://dxdy.ru/post1247421.html#p1247421

Il calcolo delle sinusoidi con periodo 144 è evidenziato. Il primo è vicino alla costante (verde nella figura), il secondo è vicino alla linea inclinata (rosso nella figura).


Grazie, Alexey per la letteratura. Ammetto che la ricorsione può essere utile e applicata con successo per accelerare alcune funzioni o algoritmi, ma a dire il vero non ne sono così sicuro.
Sto solo sostenendo che le cose dovrebbero essere chiamate con i loro nomi propri e si dovrebbe usare la terminologia convenzionale, in modo che non ci sia confusione. Secondo me, sarebbe stato più logico menzionare la ricorsione all'inizio di questo thread, e non menzionare l'interpolazione, l'approssimazione e i polinomi, poiché non sono mostrati nel tuo esempio. E sarebbe stato meglio concentrarsi sullo spostamento dell'indicatore a sinistra, per non ingannare gli altri con un'eccessiva correttezza delle forme, perché non a tutti piace capire il codice degli altri, ci sono cascato anch'io.

Alexey, per quanto ho capito sei un professionista in materia di ricorsione. Personalmente sono completamente all'oscuro di tutto. Ho una domanda, una richiesta e un suggerimento. Potete usare i vostri metodi per accelerare l'approssimazione con il metodo di Fourier? Qualcosa mi dice che è possibile. Se ci riuscite, sarà wOW!!! e l'uso pratico sarà enorme. Allego un esempio di approssimazione con estrapolazione di Fourier su MT5 (funziona molto più velocemente e semplicemente meglio). Ho preso questo esempio da qui e l'ho migliorato un po' per chiarezza aggiungendo il controllo del mouse con il tasto Ctrl (che cambia la posizione iniziale) e Shift (che cambia il periodo di osservazione con il cambio simultaneo del numero di armoniche). Puoi fare una prova?

Questo indicatore è il seguente: per prima cosa, cliccate sul grafico con il mouse (per attivare la finestra), premete Ctrl (e rilasciatelo) e spostate il mouse per cambiare la posizione iniziale; per finire il processo, premete qualsiasi tasto (tranne Ctrl e Shift). Lo stesso vale per il tasto Shift per cambiare il periodo (intervallo di barre per la funzione di approssimazione).

File:
Fourier.mq5  16 kb
 

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Calcolo delle differenze, esempi.

Nikolai Semko, 2018.01.12 00:43


Sto semplicemente sostenendo che le cose dovrebbero essere chiamate con i loro nomi propri e dovrebbe essere usata una terminologia generalmente accettata, in modo che non ci sia confusione. Secondo me, sarebbe stato più logico menzionare la ricorsione all'inizio di questo thread, e non menzionare l'interpolazione, l'approssimazione e i polinomi, poiché non sono mostrati nel tuo esempio. E sarebbe stato più corretto concentrarsi sullo spostamento dell'indicatore a sinistra, per non ingannare gli altri con un'eccessiva correttezza delle forme, perché non a tutti piace guardare nel codice degli altri, ci ero cascato anch'io.


Nikolai, grazie per il post e l'indicatore allegato.

E sono completamente d'accordo, prima di tutto c'è bisogno di una comprensione non ambigua dei termini e dei nomi.

Lasciatemi spiegare la mia posizione.

Si può tracciare una linea per due punti, il che significa che si può trovare qualsiasi punto di questa linea sia all'interno dell'intervallo tra i punti (interpolazione) sia all'esterno dell'intervallo tra i punti (estrapolazione).

Si può disegnare una curva a valore singolo corrispondente, per esempio, a una parabola quadrata espressa in un sistema di coordinate cartesiane da un'equazione quadratica lineare. Ciò significa che è anche possibile trovare qualsiasi punto di questa curva sia all'interno dell'intervallo tra i punti estremi (interpolazione) sia al di fuori di questo intervallo (estrapolazione). La legge secondo la quale questi punti sono tracciati rimane polinomiale. Dovrei anche aggiungere che, almeno per tre punti, è possibile disegnare una sinusoide univoca, se assumiamo una legge sinusoidale, o un cerchio, se assumiamo la sua presenza.

Così l'interpolazione di un polinomio di secondo grado su tre punti (nel nostro caso, due dei quali accumulano la storia precedente e il terzo porta nuove informazioni) del quarto, risulta essere una definizione necessaria (ci possono essere altre leggi) e sufficiente dell'azione o processo.

A meno che, ovviamente, non suggerisca altri termini per definirlo.

Detto questo, sono pienamente d'accordo che se si vuole tracciare una curva in base al numero di valori che superano il numero minimo richiesto, si dovrebbero usare metodi statisticamente (o altrimenti) validi per ponderare i valori, compresa la regressione.
 
Aleksey Panfilov:


Nikolai, grazie per il post e l'indicatore allegato.

E sono completamente d'accordo, prima di tutto è necessaria una chiara comprensione dei termini e dei nomi.

Lasciatemi spiegare la mia posizione.

Si può tracciare una linea su due punti, significa trovare qualsiasi punto di questa linea, sia all'interno dell'intervallo tra i punti (interpolazione), sia all'esterno dell'intervallo tra i punti (estrapolazione).

Si può disegnare una curva a valore singolo corrispondente, per esempio, a una parabola quadrata che nel sistema di coordinate cartesiane è espressa da un'equazione lineare al quadrato. Ciò significa che è anche possibile trovare qualsiasi punto di questa curva sia all'interno dell'intervallo tra i punti estremi (interpolazione) sia al di fuori di questo intervallo (estrapolazione). La legge secondo la quale questi punti sono tracciati rimane polinomiale. Dovrei anche aggiungere che, almeno per tre punti, è possibile disegnare una sinusoide univoca, se assumiamo una legge sinusoidale, o un cerchio, se assumiamo la sua presenza.

Così l'interpolazione di un polinomio di secondo grado su tre punti (nel nostro caso, due dei quali accumulano la storia precedente e il terzo porta nuove informazioni) del quarto, risulta essere una definizione necessaria (ci possono essere altre leggi) e sufficiente dell'azione o processo.

A meno che, ovviamente, non suggerisca altri termini per definirlo.

Detto questo, sono totalmente d'accordo che se hai bisogno di tracciare una curva per un numero di valori superiore al numero minimo richiesto, devi usare metodi statisticamente (o altrimenti) giustificati di ponderazione dei valori, inclusa la regressione.

Come costruire una curva polinomiale da tre punti che ho recentemente implementato in questo codice. Vi suggerisco di dargli un'occhiata.

Ma il tuo codice non calcola il polinomio per tre punti:

Aleksey Panfilov:

Sul grafico appare così:

La linea blu-rossa è l'interpolazione (trovare un punto in un intervallo) con un polinomio di 4° grado con una spalla di 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;

La sottile linea blu è l'estrapolazione (trovare un punto al di fuori dell'intervallo) tramite il polinomio di grado 2 con leva 78.

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

La linea rossa è la linea di costruzione del polinomio di potenza 4. È ridisegnato e basato sul punto di apertura dell'ultima barra.

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];  }}


Quello che lei chiama un polinomio di 2° grado e un polinomio di 4° grado non sono polinomi.

Poiché la formula per un polinomio di 2° grado

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

ma la formula di un polinomio di 4° grado:

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

dove

a,b,c,d,f - coefficienti da calcolare

i è il numero della barra.

E avete un modo ornato di fare la media, in cui (usando l'esempio di quello che chiamate un polinomio di grado 2) il punto corrente di una linea i è calcolato dagli ultimi tre punti (i,i+1 e i+2) di un'altra linea con coefficienti di peso diversi. Questo si chiama media (o smoothing). Ecco perché hai spostato il grafico di 72 barre a sinistra per nascondere il ritardo che si verifica come risultato della media.

Nel mioesempio, il calcolo del polinomio per tre punti è chiaramente visibile.

 
Nikolai Semko:

Nel mioesempio, tuttavia, il calcolo del polinomio sui tre punti è chiaro e ben visibile.

Il tuo indicatore è molto buono.

Se avete lo stesso per un quattro, allora attaccatelo a qualsiasi tre punti della linea grigia dell'indicatore dal post 23 di questo thread.

Questa linea (grigia) è calcolata nel 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 - equazione della differenza della parabola di secondo grado. Per punti equidistanti.
 
Aleksey Panfilov:

Il tuo indicatore è molto buono.

Se avete lo stesso per un quattro, allora attaccatelo a tre punti qualsiasi della linea grigia dell'indicatore del post 23 di questo thread.

Questa linea (grigia) è calcolata nel buffer:

1*Y1-3*Y2+3*Y3-1*Y4=0 è l'equazione della differenza di una parabola di secondo grado. Per punti equidistanti.

Ho il codice per MT4 più in basso nei commenti

Sì, la linea grigia che avete è un polinomio. E la coda rossa di 92 barre da 2 messaggio che si ridisegna alla media spostata è anche un polinomio ed è appena ridisegnata. Ma voi chiamate tutto il resto un polinomio e allo stesso tempo sostenete che il vostro polinomio non è ridisegnato. E non lo fa. Ecco perché vi chiedo di chiamare le cose con il loro nome.

E a proposito, nel mio esempio la formazione dei prossimi punti del polinomio è fatta attraverso il calcolo dei coefficienti e questo algoritmo è più veloce del tuo "calcolo della differenza", anche se anch'io applico la differenza con il valore precedente:

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

la tua opzione:

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:

Ho il codice per MT4 più in basso nei commenti

Sì, la tua linea grigia è un polinomio. E la coda rossa di 92 barre del 2° messaggio, che si disegna alla media spostata, è anche un polinomio ed è sovrastimata. Ma voi chiamate tutto il resto un polinomio e allo stesso tempo sostenete che il vostro polinomio non è ridisegnato. E non lo fa. Ecco perché vi chiedo di chiamare le cose con il loro nome.


Sì, sono d'accordo con il polinomio di secondo grado, solo 4 punti coinvolti nella costruzione, o 6 punti per il polinomio di quarto grado. L' intera linea ottenuta e non ridisegnata non è ovviamente un polinomio, è solo costruita nei casi considerati usando un polinomio di un certo grado.

Le linee sottili visualizzano solo i polinomi con cui viene costruito il punto successivo.

Sembra che siamo d'accordo sui termini. :)


E comunque nel mio esempio la formazione dei punti successivi nel polinomio è fatta attraverso il calcolo dei coefficienti e questo algoritmo è più veloce del tuo "calcolo della differenza", anche se anch'io applico la differenza con il valore precedente:

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

la tua opzione:

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]   ;  }

Per quanto riguarda la velocità probabilmente hai ragione.

Suggerisco di non toccare i problemi di prestazione e forse la sciatteria (la mia prima di tutte:)) ) nella codifica, ovviamente, se non sono critici.

 
Nikolai Semko:

Puoi usare i tuoi metodi per accelerare l'approssimazione di Fourier? Qualcosa mi dice che è possibile. Se ci riuscite, sarà un wow!!! e i benefici pratici saranno enormi. Allego un esempio di approssimazione con estrapolazione di Fourier su MT5 (funziona molto più velocemente e semplicemente meglio). Ho preso questo esempio da qui e l'ho migliorato un po' per chiarezza aggiungendo il controllo del mouse con il tasto Ctrl (che cambia la posizione iniziale) e Shift (che cambia il periodo di osservazione con il cambio simultaneo del numero di armoniche). Puoi fare una prova?

Questo indicatore è il seguente: per prima cosa, cliccate sul grafico con il mouse (per attivare la finestra), premete Ctrl (e rilasciatelo) e spostate il mouse per cambiare la posizione iniziale; per finire il processo, premete qualsiasi tasto (tranne Ctrl e Shift). Lo stesso con il tasto Shift per cambiare il periodo (intervallo di barre per calcolare la funzione approssimativa).


Per quanto riguarda Fourier, l'argomento è ricco. Se c'è interesse, lo toccheremo di tanto in tanto.

Molto probabilmente, le domande principali sorgeranno dalla dichiarazione del problema (a causa dell'altro metodo). Ora, per quanto ho capito, l'indicatore seleziona le frequenze di maggiore ampiezza dallo spettro di Fourier.

Ho avuto l'idea di imbullonare un indicatore diFourier su una linea polinomiale già mediata. Ho il sospetto che le sue letture estrapolate cambieranno più lentamente.

Motivazione: