Friday 3 November 2017

Flytte Gjennomsnittet Pseudo Kode


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 tidsvektede gjennomsnitt på over 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 Dec 15 11 på 12: 35C algoritme for null-ventetid eksponentiell glidende gjennomsnitt Sist endret: 2012-08-13 Jeg har prøvd å implementere en lavfrekvens cutoff i c som i hovedsak tar en strøm av tall og jevner ut produksjonen ( filtrerer ut høyfrekvent bevegelsesjitter), men det er viktig at de frontveide tallene blir vurdert umiddelbart da dataene er tidskritiske (det er å kontrollere en bevegelsessimulasjonsbase ved bruk av utgang fra litt spillprogramvare). Jeg har en arbeidsvektet glidende gjennomsnittlig algoitme, men kan gjøre med noe litt mer responsivt på forsiden, og jeg fant dette: - Pseudokoden er som følger: Inputs: Price (NumericSeries), Period (NumericSimple) Variabler: faktor (0), lag (0) hvis CurrentBar lt 1 deretter begynner ZLEMA Prisfaktor 2 (Period1) lag (Period 1) 2 End else start ZLEMA faktor (2Price-Pricelag) (1-faktor) ZLEMA1 ende Ive oversatt den til C og koden min er som følger: Men det virker ikke å oppføre seg ganske som jeg forventer. Det ser ut til å være nesten der, men noen ganger får jeg en litt lavere verdi enn alle elementene i køen (når de er alle høyere). Min kø og antall elementer i den er bestått som parametere, med den siste som er foran på alle tider, passerer jeg også en inkrementerende teller som starter ved 0 som kreves av funksjonen. Jeg er ikke sikker på at jeg har tolket betydningen av ZLEMA1 riktig, da den ikke er tydelig i sin pseudokode, så jeg antok at dette er de siste samtalene Zlema, og jeg antar at Pris faktisk betyr Pris0. Kanskje jeg har det galt Skal jeg kopiere den faktiske Zlema-kalkulerte verdiene tilbake til min opprinnelige kø før neste anrop, endrer jeg ikke den opprinnelige køen i det hele tatt enn bare skifter alle verdier en til enden og legger inn det siste i begynnelsen . Koden jeg bruker til å gjøre dette er: Ville være ekstremt takknemlig hvis noen med en bedre forståelse av matematikken kunne behage forstanden, sjekk dette for meg for å se om jeg har noe litt galt, takk så mye på forhånd hvis du kan hjelpe Først takk alt for Din innspill, mye verdsatt Det er fornuftig jeg antar, så jeg antar at det beste jeg kan håpe på, er bare et eksponentielt glidende gjennomsnitt, og aksepterer det vil være et lite lag, men dette vil bli minimert av tyngre frontvekt enn gitt i typisk vektet glidende gjennomsnitt Jeg har denne algoritmen også, men et lignende problem ved at verdiene ikke virker ganske riktige (med mindre dette er formens natur). For eksempel, si at mitt utvalg inneholder 16 verdier, alle 0.4775 - utgangen er 0.4983, men Id forventer at den skal være 0.4775 Ser dette ut til deg. Eksponentiell flytende gjennomsnitt. float ema (float vals, int numVals, int currentSample) statisk float faktor 0 statisk float lastema 0 float ema hvis (currentSample lt 1) ema vals0 faktor 2.0 ((float) numVals) 1.0) andre ema (faktor vals0) - faktor) lastema) lastema ema return ema Omvendt er produksjonen lavere enn hver av inngangene, selv om alle er høyere. Den kalles på samme måte som zlema (.) Ovenfor, med en økende teller. Formelen og pseudokoden for denne er her: - autotradingstrategy. wordpress20091130exponential-moving-average Takk igjen, unnskyld for min misforståelse av noen av grunnleggende: (Med vennlig hilsen, Chris J Som for koden jeg postet, har du rett om array størrelse Situasjonen. Det bør være lett å fikse. Som for dine spørsmål: 1) Filterkonstanten representerer en frekvens cutoff. Jeg brukte en digital signalbehandling (DSP) for denne teknikken. en. wikipedia. orgwi kiLow-pas sfilter er en enkel forklaring. Du vil ha avdelingen for diskret tid. I mitt tilfelle er A RC-Konstanten de snakker om. Så frekvensen som den kutter ut er over 1 (2piA). Hvis du ikke har en forståelse av Frequency-Domain teori, kan dette bli komplisert. I ditt tilfelle, jo høyere du lager A, desto lavere frekvens vil dette filteret tillate, noe som betyr at det vil jevne kurven ut mer og mer. Jo lavere du gjør det, jo mer støy som er tillatt i systemet. Husk at en må være større enn eller lik 1 for å være effektiv. Jeg reattached XLS igjen, denne gangen uten endring av rand () tallene. Juster A-konstanten og se hvordan den quotsmoothsquot (eller filter) ut høyfrekvensvariasjonene. 2) Det siste punktet i inngangsarrangementet har den nyeste verdien. 3) Det samme gjelder for utmatningsarrayen. Den siste er den nyeste verdien. 5) NUMVALS er vilkårlig. Du kan kontinuerlig legge til på input og output array så mange ganger du liker, og det ville ikke påvirke filteret. Spesielt brukte jeg 49 poeng. Men jeg kan enkelt slette de siste 20 og de første 29 utgangene vil forbli de samme. Funksjonen er ikke basert på hvor mange poeng blir brukt. Jeg vil nevne at jeg utviklet denne funksjonen for en engangskonvertering. Hvis du ønsket å gjøre en konvertering for den neste verdien på flyet, kan du prøve noe enklere (som vedlagt). Igjen er jeg rusten på c. Jeg håper dette er riktig. Det eneste du trenger å levere er inngang og filter konstant. Gi meg beskjed om dette hjelper. GjennomsnittSimple glidende gjennomsnitt GjennomsnittSimple glidende gjennomsnitt Du oppfordres til å løse denne oppgaven i henhold til oppgavebeskrivelsen, ved hjelp av hvilket språk du kanskje kjenner. Beregner det enkle glidende gjennomsnittet av en rekke tall. Opprett en stateful funksjonsklasseinstans som tar en periode og returnerer en rutine som tar et tall som argument og returnerer et enkelt bevegelige gjennomsnitt av sine argumenter så langt. Et enkelt glidende gjennomsnitt er en metode for å beregne et gjennomsnitt av en strøm av tall ved å bare gjennomsnitts de siste 160 P 160 tallene fra strømmen, 160 hvor 160 P 160 er kjent som perioden. Det kan implementeres ved å kalle en initialiseringsrutine med 160 P 160 som argument 160 I (P) 160, som deretter skal returnere en rutine som når det kalles med individuelle suksessive medlemmer av en strøm av tall, beregner gjennomsnittet av (opp til), de siste 160 P 160 av dem, lar vi ringe denne 160 SMA (). Ordet 160 stateful 160 i oppgavebeskrivelsen henviser til behovet for 160 SMA () 160 for å huske visse opplysninger mellom samtaler til den: 160 Perioden, 160 P 160 En bestilt beholder med minst de siste 160 P 160 tallene fra hver av sine individuelle samtaler. Statlig 160 betyr også at etterfølgende samtaler til 160 I (), 160 initialisereren, 160 skal returnere separate rutiner som gjør 160 ikke 160 delte lagrede tilstander, slik at de kan brukes på to uavhengige datastrømmer. Pseudo-kode for en implementering av 160 SMA 160 er: Denne versjonen bruker en vedvarende kø for å holde de nyeste p-verdiene. Hver funksjon som returneres fra init-moving-gjennomsnittet har sin tilstand i et atom som holder en køverdi. Denne implementeringen bruker en sirkulær liste for å lagre tallene i vinduet ved begynnelsen av hver iterasjonspeker refererer til listecellen som holder verdien bare flyttet ut av vinduet og erstattes med den verdiskapende verdien. Bruke en Closure-redigering For øyeblikket kan denne sma ikke være nok fordi den tildeler en lukning på bunken. Noen rømningsanalyser kan fjerne heapfordelingen. Bruke en Struktur-redigering Denne versjonen unngår brønnallokering av lukkingen som holder dataene i stakkrammen til hovedfunksjonen. Samme utgang: For å unngå at floating point-tilnærmingene fortsetter å vokse opp og vokse, kan koden utføre en periodisk sum på hele sirkulær køarrangementet. Denne implementeringen produserer to (funksjon) objekter delingstilstand. Det er idiomatisk i E for å skille inngang fra utgang (les fra skriv) i stedet for å kombinere dem til en gjenstand. Strukturen er den samme som implementeringen av Standard DeviationE. Eliksirprogrammet nedenfor genererer en anonym funksjon med en innebygd periode p, som brukes som perioden for det enkle glidende gjennomsnittet. Kjøringsfunksjonen leser numerisk inngang og overfører den til den nyopprettede anonyme funksjonen, og kontrollerer deretter resultatet til STDOUT. Utgangen vises nedenfor, med gjennomsnittet, etterfulgt av gruppert inngang, som danner grunnlaget for hvert glidende gjennomsnitt. Erlang har nedleggelser, men uutviklede variabler. En løsning er da å bruke prosesser og en enkel melding som passerer basert API. Matrix-språk har rutiner for å beregne glidningsavstandene for en gitt rekkefølge av elementer. Det er mindre effektivt å sløyfe som i følgende kommandoer. Fortløpende ber om en inngang I. som legges til enden av en liste L1. L1 kan bli funnet ved å trykke på 2ND1, og det finnes gjennomsnitt i ListOPS Trykk ON for å avslutte programmet. Funksjon som returnerer en liste som inneholder gjennomsnittlig data for det medfølgende argumentet Program som returnerer en enkel verdi ved hver påkalling: listen er listen som gjennomsnitt: p er perioden: 5 returnerer gjennomsnittslisten: Eksempel 2: Bruke programmet movinav2 (jeg , 5) - Initialisere glidende gjennomsnittlig beregning, og definer periode på 5 movinav2 (3, x): x - nye data i listen (verdi 3), og resultatet lagres på variabel x og vises movinav2 (4, x) : x - nye data (verdi 4), og det nye resultatet blir lagret på variabel x, og vises (43) 2. Beskrivelse av funksjonen movinavg: variabel r - er resultatet (gjennomsnittslisten) som vil bli returnert variabel i - er indeksvariabelen, og den peker mot slutten av underlisten listen er i gjennomsnitt. variabel z - en hjelpesvariabel Funksjonen bruker variabel i for å bestemme hvilke verdier av listen som skal vurderes i neste gjennomsnittlige beregning. Ved hver iterasjon peker variabel jeg på den siste verdien i listen som vil bli brukt i gjennomsnittlig beregning. Så vi trenger bare å finne ut hvilken vil være den første verdien i listen. Vanligvis må du vurdere p-elementer, så det første elementet vil være det som er indeksert av (i-p1). Men ved de første iterasjonene vil denne beregningen vanligvis være negativ, slik at følgende ligning vil unngå negative indekser: maks (i-p1,1) eller, ordne ekningen, maks (i-p, 0) 1. Men antall elementer på de første iterasjonene vil også være mindre, den riktige verdien vil være (sluttindeks - startindeks 1) eller, ordne ligningen, (i - (maks (ip, 0) 1) 1) og deretter , (i-max (ip, 0)). Variabel z har den vanlige verdien (max (ip), 0) slik at begynnelsesindeksen vil være (z1) og tallfeltene vil være (iz) midt (liste, z1, iz) returnere listen over verdi som vil være gjennomsnittlig sum .) vil summe dem summen (.) (iz) ri vil gjennomsnittlig dem og lagre resultatet på riktig sted i resultatlisten fp1 oppretter en delvis søknad som fastsetter (i dette tilfellet) andre og tredje parametereHull Moving Average The Hull Moving Gjennomsnitt gjør et glidende gjennomsnitt mer responsivt, samtidig som kurvejevnheten opprettholdes. Formelen for beregning av dette gjennomsnittet er som følger: HMAi MA ((2MA (inngang, periode2) 8211 MA (inngang, periode)), SQRT (periode)) hvor MA er et bevegelige gjennomsnitt og SQRT er kvadratroten. Brukeren kan endre inntastingen (lukk), perioden lengde og skift nummer. Denne indikator8217s definisjon er ytterligere uttrykt i den kondenserte koden gitt i beregningen nedenfor. Slik handler du ved hjelp av skrogets flytende gjennomsnittshastighet Gjennomsnittlig skroghastighet er en tilbakevendende trendindikator og kan brukes i sammenheng med andre studier. Ingen handelssignaler beregnes. Slik får du tilgang til MotiveWave Gå til toppmenyen, velg Study gtMoving AveragegtHull Moving Average eller gå til toppmenyen, velg Legg til studie. begynn å skrive inn dette studienavnet til du ser det vises i listen, klikk på studienavnet, klikk OK. Viktig Ansvarsfraskrivelse: Informasjonen som er gitt på denne siden, er strengt til informasjonsformål og skal ikke tolkes som råd eller anmodning om å kjøpe eller selge noen sikkerhet. Vennligst se vår utsagnserklæring for risikoopplysninger og ytelsesansvar. Beregning inngangspris, brukerdefinert, standard er nærmetall beveger gjennomsnittlig (ma), brukerdefinert, standard er WMA-periode brukerdefinert, standard er 20 skift brukerdefinert, standard er 0 wma vektet glidende gjennomsnitt, sqrt kvadrat rot indeks nåværende bar nummer, LOE mindre eller lik

No comments:

Post a Comment