Saturday 28 October 2017

Veid Bevegelig Gjennomsnitt Filter C


Et vektet flytte gjennomsnitt er et gjennomsnitt av data beregnet over en tidsperiode hvor større vekt er knyttet til de nyeste dataene. Det vektede flytende gjennomsnittet kan brukes med hvilken som helst pris, inkludert Hei, Lav, Åpent eller Lukk pris, og kan også brukes på andre indikatorer. Det vektede flytende gjennomsnittet utjevner en dataserie, som er viktig i et volatilt marked, da det bidrar til å identifisere trender mye lettere. Vekting beregnes ut fra summen av dager. Dundas Chart for Windows Forms har fire typer bevegelige gjennomsnitt, inkludert Simple. Eksponentiell. Trekantet. og vektet. Den viktigste forskjellen mellom de ovennevnte glidende gjennomsnitt er hvordan de vektlegger datapunktene sine. Vi anbefaler at du leser Bruke finansielle formler før du fortsetter videre. Bruke finansielle formler gir en detaljert forklaring på hvordan du bruker formler, og forklarer også de ulike alternativene som er tilgjengelige for deg når du bruker en formel. Et linjediagram er et godt valg når du viser et vektet glidende gjennomsnitt. Økonomisk tolkning: Det veide glidende gjennomsnittet brukes til å sammenligne en verdi med vektet glidende gjennomsnitt, og gir større innflytelse for nyere data og mindre innflytelse på tidligere data. Det viktigste elementet som brukes til å beregne det bevegelige gjennomsnittet, er en tidsperiode, som skal være lik den observerte markedssyklusen. Vektet glidende gjennomsnitt er forsinkende indikator, og vil alltid ligge bak prisen. Når prisen følger en trend, er vektet glidende gjennomsnitt svært nær prisen. Når en pris øker, vil det vektede glidende gjennomsnittet sannsynligvis bli lavere på grunn av påvirkning av de historiske dataene. Beregning: Det vektede glidende gjennomsnittet beregnes ved hjelp av en sum av indekser av tidsperioder (datapunkter). Vekt for hver periode beregnes som indeks (Antall datapunkter). Følgende tabell viser hvordan du beregner et 5-dagers veidende glidende gjennomsnitt: Er det mulig å implementere et glidende gjennomsnitt i C uten behov for et vindu med prøver Ive har funnet ut at jeg kan optimalisere litt ved å velge en vindusstørrelse som er en kraft av to for å tillate bit-shifting i stedet for å dele, men ikke trenger en buffer ville være fint. Er det en måte å uttrykke et nytt glidende gjennomsnittsresultat bare som en funksjon av det gamle resultatet og den nye prøven. Definer et eksempel glidende gjennomsnitt, over et vindu på 4 prøver å være: Legg til ny prøve e: Et glidende gjennomsnitt kan implementeres rekursivt , men for en nøyaktig beregning av det bevegelige gjennomsnittet må du huske den eldste innsatsprøven i summen (dvs. a i eksempelet ditt). For et lengde N bevegelige gjennomsnitt beregner du: hvor yn er utgangssignalet og xn er inngangssignalet. Eq. (1) kan skrives rekursivt som Så du må alltid huske prøven xn-N for å kunne beregne (2). Som påpekt av Conrad Turner, kan du bruke et (uendelig langt) eksponensielt vindu i stedet, som gjør det mulig å beregne utgangen bare fra tidligere utgang og gjeldende inngang: men dette er ikke et standard (uvevet) glidende gjennomsnitt, men eksponentielt vektet glidende gjennomsnitt, hvor prøver tidligere i det siste får en mindre vekt, men (i det minste i teorien) glemmer du aldri noe (vektene blir bare mindre og mindre for prøver langt i det siste). Jeg implementerte et glidende gjennomsnitt uten individuelt elementminne for et GPS-sporingsprogram jeg skrev. Jeg starter med 1 prøve og deler med 1 for å få dagens avg. Jeg legger til en prøve og deler med 2 til den nåværende avg. Dette fortsetter til jeg kommer til lengden av gjennomsnittet. Hver gang etterpå legger jeg til den nye prøven, får gjennomsnittet og fjerner det gjennomsnittet fra totalen. Jeg er ikke en matematiker, men dette virket som en god måte å gjøre det på. Jeg skjønte at det ville slå magen til en ekte matte fyr, men det viser seg at det er en av de aksepterte måtene å gjøre det på. Og det fungerer bra. Bare husk at jo høyere lengden jo tregere følger det du vil følge. Det kan ikke være noe som helst mesteparten av tiden, men når du følger satellitter, hvis du er treg, kan stien være langt fra den faktiske posisjonen, og det vil se dårlig ut. Du kan ha et mellomrom mellom lørdager og de etterfølgende prikkene. Jeg valgte en lengde på 15 oppdatert 6 ganger i minuttet for å få tilstrekkelig utjevning og ikke komme for langt fra den faktiske lette stillingen med glattestrekpunktene. besvart 16 nov 16 kl 23:03 initialiser totalt 0, count0 (hver gang vi ser en ny verdi) En innskriving (scanf), en legger til totalnewValue, ett inkrement (telle), en del av gjennomsnitt (totalt antall) Dette ville være et bevegelige gjennomsnitt over alle innganger For å beregne gjennomsnittet over bare de siste 4 inngangene, ville det kreve 4 inngangsvariabler, kanskje kopiering av hvert inngang til en eldre inputvariable og deretter beregning av det nye glidende gjennomsnittet. Som summen av de 4 inngangsvariablene delt med 4 (høyre skift 2 ville være bra hvis alle inngangene var positive for å gjøre gjennomsnittlig beregning besvart 3. februar klokken 4:06 som faktisk vil beregne gjennomsnittet og IKKE det bevegelige gjennomsnittet. Etter hvert som tellingen blir større, blir virkningen av en ny inngangsprøve forsvunnet liten ndash Hilmar Feb 3 15 kl 13:53 Ditt svar 2017 Stack Exchange, Inc Jeg prøver å beregne det bevegelige gjennomsnittet av et signal. Signalverdien (en dobbel) oppdateres i tilfeldige tider. Jeg ser etter en effektiv måte å beregne sitt tidsveide gjennomsnitt på ove r et tidsvindu, i sanntid. Jeg kunne gjøre det selv, men det er mer utfordrende enn jeg trodde. De fleste av ressursene jeg har funnet over Internett, er å beregne glidende gjennomsnitt av periodisk signal, men mine oppdateringer tilfeldigvis. Kjenner noen gode ressurser til det? Tricket er det følgende: Du får oppdateringer i tilfeldige tider via ugyldig oppdatering (int time, float value). Men du må også spore når en oppdatering faller av tidsvinduet, så du stiller en alarm som kalles på tidspunktet N som fjerner den forrige oppdateringen, fra å bli vurdert på nytt i beregningen. Hvis dette skjer i sanntid, kan du be om at operativsystemet skal ringe til en metode som ikke lenger kan hentes fra tid til annen. N Hvis dette er en simulering, kan du ikke få hjelp fra operativsystemet, og du må gjør det manuelt. I en simulering vil du ringe metoder med tiden som følger med som et argument (som ikke korrelerer med sanntid). En rimelig forutsetning er imidlertid at anropene er garantert slik at tidsargumentene øker. I dette tilfellet må du opprettholde en sortert liste over alarmtidsverdier, og for hver oppdatering og leseanrop må du kontrollere om tidsargumentet er større enn hodet til alarmlisten. Mens det er større gjør du den alarmrelaterte behandlingen (slipp av den eldste oppdateringen), fjern hodet og kontroller igjen til alle alarmer før den angitte tiden behandles. Oppdater deretter oppdateringen. Jeg har så langt antatt at det er åpenbart hva du ville gjøre for den faktiske beregningen, men jeg vil utarbeide bare i tilfelle. Jeg antar at du har en metodeflottslest (int tid) som du bruker til å lese verdiene. Målet er å gjøre denne anrop så effektiv som mulig. Så du beregner ikke det bevegelige gjennomsnittet hver gang lesemetoden kalles. I stedet forkalkulerer du verdien som for den siste oppdateringen eller den siste alarmen, og justerer denne verdien ved hjelp av et par flytende punktoperasjoner for å regne for tidsforløpet siden den siste oppdateringen. (dvs. et konstant antall operasjoner bortsett fra kanskje å behandle en liste over oppstartede alarmer). Forhåpentligvis er dette klart - dette burde være en ganske enkel algoritme og ganske effektiv. Ytterligere optimalisering. Et av de gjenværende problemene er at hvis et stort antall oppdateringer skjer i tidsvinduet, så er det lang tid som det ikke finnes, eller oppdateringer, og deretter kommer en lesing eller oppdatering. I dette tilfellet vil ovennevnte algoritme være ineffektiv i trinnvis oppdatering av verdien for hver av oppdateringene som faller av. Dette er ikke nødvendig fordi vi bare bryr oss om den siste oppdateringen utover tidsvinduet, så hvis det er en måte å effektivt slippe av alle eldre oppdateringer, ville det hjelpe. For å gjøre dette kan vi endre algoritmen for å gjøre et binært søk med oppdateringer for å finne den nyeste oppdateringen før tidsvinduet. Hvis det er relativt få oppdateringer som må slettes, kan man trinnvis oppdatere verdien for hver oppdatert oppdatering. Men hvis det er mange oppdateringer som må slettes, kan man rekomputere verdien fra bunnen av etter å ha slått av de gamle oppdateringene. Tillegg om inkrementell beregning: Jeg bør klargjøre hva jeg mener med inkrementell beregning over i setningen justere denne verdien ved hjelp av et par flytende punktoperasjoner for å regne for tidsovergangen siden siste oppdatering. Innledende ikke-inkrementell beregning: deretter iterate over relevant oppdateringer i rekkefølge av økende tid: movingaverage (sum siste oppdatert timesincelastupdate) windowlength. Nå dersom nøyaktig en oppdatering faller av vinduet, men ingen nye oppdateringer kommer, juster summen som: (Merk at det er forhåndsdatat som har tidsstempel endret til begynnelsen av det siste vinduet som begynner). Og hvis akkurat en oppdatering kommer inn i vinduet, men ingen nye oppdateringer faller av, juster summen som: Som det skal være klart, er dette en grov skisse, men forhåpentligvis viser den hvordan du kan opprettholde gjennomsnittet slik at det er O (1) operasjoner per oppdatering på amortisert basis. Men vær oppmerksom på ytterligere optimalisering i forrige avsnitt. Legg også merke til stabilitetsproblemer som refereres til i et eldre svar, noe som betyr at flytpunktsfeil kan akkumulere over et stort antall slike inkrementelle operasjoner slik at det er en avvik fra resultatet av den fullstendige beregningen som er viktig for applikasjonen. Hvis en tilnærming er OK, og det er en minimal tid mellom prøver, kan du prøve superprøving. Har en matrise som representerer jevnt fordelte tidsintervaller som er kortere enn minimumet, og i hver tidsperiode lagrer du den siste prøven som ble mottatt. Jo kortere intervallet, jo nærmere gjennomsnittet blir den sanne verdien. Perioden bør ikke være større enn halvparten av minimumet, eller det er en sjanse for å mangle en prøve. svarte des 15 11 kl 18:12 svarte des 15 11 kl 22:38 Takk for svaret. En forbedring som ville være nødvendig for å faktisk citerer verdien av det totale gjennomsnittet, slik at vi ikke slår hele tiden. Det kan også være et mindre punkt, men det ville ikke være mer effektivt å bruke en deque eller en liste for å lagre verdien, siden vi antar at oppdateringen kommer i riktig rekkefølge. Innsetting vil være raskere enn i kartet. ndash Arthur Dec 16 11 at 8:55 Ja, du kan cache verdien av summen. Trekk verdiene av prøvene du sletter, legg til verdiene av prøvene du legger inn. Også, en dequeltpairltSample, Dategtgt kan være mer effektiv. Jeg valgte kart for lesbarhet, og det enkle å påkalle kart :: overgående. Som alltid, skriv riktig kode først, og profil og måle trinnvise endringer. ndash Rob Dec 16 11 kl 15:00 Merk: Dette er tilsynelatende ikke veien til å nærme seg dette. Leaving det her for referanse om hva som er galt med denne tilnærmingen. Sjekk kommentarene. OPPDATERT - basert på Olis kommentar. Ikke sikker på om ustabiliteten han snakker om skjønt. Bruk et sortert kart over ankomsttider mot verdier. Ved ankomst av verdi legger du ankomsttid til det sorterte kartet sammen med verdien og oppdaterer glidende gjennomsnitt. advarsel dette er pseudokode: der. Ikke helt fleshed ut, men du får ideen. Ting å merke seg. Som jeg sa ovenfor er pseudokoden. Du må velge et passende kart. Ikke ta av parene ettersom du gjennomfører det, da du vil ugyldiggjøre iteratoren og må starte på nytt. Se Olis kommentar nedenfor også. besvart 15. desember kl 12:22 Dette virker ikke: det tar ikke hensyn til hvilken andel av vinduslengden hver verdi eksisterer for. Også denne tilnærmingen til å legge til og deretter subtrahere er bare stabil for heltalltyper, ikke flyter. ndash Oliver Charlesworth Dec 15 11 at 12:29 OliCharlesworth - beklager jeg savnet noen viktige punkter i beskrivelsen (dobbelt og tidsvektet). Jeg vil oppdatere. Takk. ndash Dennis Dec 15 11 at 12:33 Tidsvekten er enda et problem. Men det er ikke det jeg snakker om. Jeg refererte til det faktum at når en ny verdi først kommer inn i tidsvinduet, er dets bidrag til gjennomsnittet minimalt. Dens bidrag fortsetter å øke inntil en ny verdi går inn. ndash Oliver Charlesworth 15. desember kl 12: 35A Enkel Flytende Gjennomsnitt er et gjennomsnitt av data beregnet over en tidsperiode. Det glidende gjennomsnittet er den mest populære prisindikatoren som brukes i tekniske analyser. Dette gjennomsnittet kan brukes med hvilken som helst pris, inkludert Hei, Lav, Åpent eller Lukk, og kan også brukes på andre indikatorer. Et glidende gjennomsnittsløp utjevner en dataserie, som er svært viktig i et volatilt marked, da det bidrar til å identifisere viktige trender. Dundas Chart for ASP har fire typer bevegelige gjennomsnitt, inkludert Simple, Exponential. Trekantet. og vektet. Den viktigste forskjellen mellom de ovennevnte glidende gjennomsnitt er hvordan de vektlegger datapunktene sine. Vi anbefaler at du leser Bruke finansielle formler før du fortsetter videre. Bruke finansielle formler gir en detaljert forklaring på hvordan du bruker formler, og forklarer også de ulike alternativene som er tilgjengelige for deg når du bruker en formel. Et linjediagram er et godt valg når du viser et enkelt glidende gjennomsnitt. Finansiell fortolkning: Moving Average er brukt til å sammenligne en sikkerhetspris med sitt bevegelige gjennomsnitt. Det viktigste elementet som brukes til å beregne det bevegelige gjennomsnittet, er en tidsperiode, som skal være lik den observerte markedssyklusen. Det bevegelige gjennomsnittet er en forsinkende indikator, og vil alltid ligge bak prisen. Når prisen følger en trend, er det bevegelige gjennomsnittet svært nær sikkerhetsprisen. Når en pris går opp, vil det bevegelige gjennomsnittet trolig bli lavere på grunn av innflytelsen fra de historiske dataene. Beregning: Det bevegelige gjennomsnittet beregnes ved hjelp av følgende formel: I forrige formel representerer n-verdien en tidsperiode. De vanligste tidsperioder er: 10 dager, 50 dager og 200 dager. Et bevegelige gjennomsnitt beveger seg fordi siden hvert nytt datapunkt er lagt til, blir det eldste datapunktet tapt. Et enkelt glidende gjennomsnitt gir like vekt til hver datapunktspris. Dette eksempelet viser hvordan du beregner et 20-dagers Moving gjennomsnitt ved hjelp av formel-metoden.

No comments:

Post a Comment