Friday, October 21, 2016

Eksponensiële Moving Average Algoritme C

Is dit moontlik om 'n bewegende gemiddelde in C te implementeer sonder die behoefte aan 'n venster van monsters Ive het bevind dat ek 'n bietjie kan optimaliseer, deur die keuse van 'n venster grootte dis 'n krag van twee voorsiening te maak vir bietjie-verskuiwing in plaas van verdeel, maar nie nodig 'n buffer sal lekker wees. Is daar 'n manier om 'n nuwe bewegende gemiddelde resultaat slegs as 'n funksie van die ou gevolg en die nuwe monster te druk definieer 'n voorbeeld bewegende gemiddelde, oor 'n venster van 4 monsters te wees: Voeg nuwe monster e: 'n bewegende gemiddelde kan rekursief geïmplementeer , maar vir 'n presiese berekening van die bewegende gemiddelde jy die oudste insette monster in die som (dws die 'n in jou voorbeeld) onthou. Vir 'n lengte N bewegende gemiddelde wat jy bereken: waar yn is die uitsetsein en xn is die insetsein. Aand. (1) kan rekursief geskryf word as sodat jy altyd moet die monster xn-N onthou om te bereken (2). Soos uitgewys deur Conrad Turner, kan jy 'n (oneindig lank) eksponensiële venster plaas, wat dit moontlik maak om die uitset net uit die verlede uitset en die huidige insette te bereken gebruik, maar dit is nie 'n standaard (ongeweegde) bewegende gemiddelde, maar 'n eksponensieel geweegde bewegende gemiddelde, waar monsters verder in die verlede kry 'n kleiner gewig, maar (ten minste in teorie) wat jy nooit iets vergeet nie (die gewigte kry net kleiner en kleiner vir monsters ver in die verlede). inisialiseer totale 0, count0 (elke keer sien 'n nuwe waarde toe een insette (scanf), een totalnewValue, een inkrement (telling), een kloof gemiddelde (totale / telling voeg) Dit sou 'n bewegende gemiddelde oor alle insette Om die gemiddelde bereken word oor net die laaste 4 insette, sal vereis 4 inputvariables, miskien kopiëring elke insette om 'n ouer inputvariable, dan berekening van die nuwe bewegende gemiddelde. as som van die 4 inputvariables, gedeel deur 4 (regs skuif 2 sal goed wees as al die insette was positiewe te maak die gemiddelde calculationI ek probeer om die bewegende gemiddelde van 'n sein te bereken. die sein waarde ( 'n dubbel) is opgedateer na willekeur keer. Ek is op soek na 'n doeltreffende manier om sy tyd geweegde gemiddelde oor 'n tyd venster te bereken, in die werklike tyd. Ek kan dit doen my self, maar dit is meer uitdagend as wat ek gedink het. die meeste van die hulpbronne Ive gevind oor die internet is die berekening van bewegende gemiddelde van periodieke sein, maar my updates na willekeur tyd. is daar iemand weet goed hulpbronne vir daardie die truuk is die volgende: Jy kry updates na willekeur keer per leemte update (int tyd, float waarde). Maar jy moet ook ook dop wanneer 'n update val af die tyd venster, sodat jy 'n alarm wat genoem ten tye N wat die vorige update van wat ooit in die berekening weer oorweeg verwyder gestel. As dit gebeur in real-time kan jy die bedryfstelsel versoek om 'n oproep om 'n metode leemte dropoffoldestupdate (int tyd) genoem te word ten tye N As dit 'n simulasie, kan jy nie die hulp van die bedryfstelsel te kry en wat jy nodig het om die hand te doen nie. In 'n simulasie sal jy metodes met die verskaf as 'n argument (wat nie ooreenstem met die werklike tyd) tyd bel. Maar 'n redelike aanname is dat die oproepe is gewaarborg sodanig dat die tyd argumente is aan die toeneem is. In hierdie geval moet jy 'n gesorteerde lys van alarm tyd waardes te handhaaf, en vir elke werk en lees noem jy kyk of die tyd argument is groter as die hoof van die alarm lys. Terwyl dit is 'n groter doen jy die alarm verwante verwerking (drop off die oudste update), verwyder die kop en kyk weer totdat al alarms voor die gegewe tyd verwerk. Doen dan die update oproep. Ek het tot dusver aanvaar is dit duidelik wat jy vir die werklike berekening sou doen, maar ek sal uitbrei net in geval. Ek neem aan jy het 'n metode float lees (int tyd) wat jy gebruik om die waardes te lees. Die doel is hierdie oproep so doeltreffend as moontlik te maak. So jy hoef nie te bereken die bewegende gemiddelde elke keer as die lees metode genoem. In plaas jy precompute die waarde soos op die laaste update of die laaste alarm, en tweak die waarde van 'n paar drywende punt bedrywighede om rekenskap te gee van die verloop van tyd sedert die laaste update. (I. E. 'N konstante aantal operasies behalwe miskien die verwerking van 'n lys van opgestapel alarms). Hopelik is dit duidelik - dit moet 'n baie eenvoudige algoritme en baie doeltreffend wees. Verdere optimalisering. een van die oorblywende probleme is as 'n groot aantal updates binne die venster gebeur, dan is daar 'n lang tyd waarvoor daar nie lees of updates, en dan 'n lees of werk kom saam. In hierdie geval, sal die bogenoemde algoritme ondoeltreffende in inkrementeel opdatering van die waarde vir elk van die updates wat val af wees. Dit is nie nodig nie, want ons het net omgee vir die laaste update oor die tyd venster so as daar 'n manier om al ouer updates doeltreffend af te laai, sal dit help. Om dit te doen, kan ons die algoritme om te doen 'n binêre soek na updates vir die mees onlangse update voor die tyd venster vind verander. As daar relatief min updates wat gevolg moet word laat val dan kan 'n mens geleidelik werk die waarde vir elke gedaal update. Maar as daar is baie opgraderings wat aangespreek moet word laat val dan kan 'n mens die waarde recompute van nuuts af na die val van die ou updates. Addendum op Inkrementele Berekening: Ek moet verduidelik wat ek bedoel met inkrementele berekening hierbo in die sin aanpas hierdie waarde met 'n paar drywende punt bedrywighede om rekenskap te gee van die verloop van tyd sedert die laaste update. Aanvanklike nie-inkrementele berekening Toe Itereer oor relevantupdates in volgorde van toenemende tyd: movingaverage (som lastupdate timesincelastupdate) / windowlength. Nou as presies een update val af by die venster uit, maar geen nuwe updates kom, pas som as: (let op dit priorupdate wat sy tyd stempel het verander om te begin van verlede venster begin). En as presies een werk gaan by die venster uit, maar geen nuwe updates afval, pas som as: Soos duidelik behoort te wees, dit is 'n rowwe skets, maar hopelik sal dit wys hoe jy die gemiddelde sodanig dat dit O (1) operasies per update kan handhaaf op 'n geamortiseerdekostebasis. Maar let op verdere optimalisering is in die vorige paragraaf. Let ook op stabiliteit kwessies verwys na in 'n ouer antwoord, wat beteken dat drywende punt foute kan versamel oor 'n groot aantal van sulke inkrementele bedrywighede soos dat daar 'n afwyking van die uitslag van die volle berekening wat wesenlik tot die aansoek. As 'n benadering is OK en Theres 'n minimum tyd tussen monsters, kan jy probeer super-steekproefneming. Het jy 'n skikking wat eweredig gespasieer tydintervalle wat korter as die minimum is verteenwoordig, en by elke tydperk winkel die nuutste monster wat ontvang is. Hoe korter die interval, sal die nader die gemiddelde wees om die werklike waarde. Die tydperk moet nie groter as die helfte van die minimum wees of daar is 'n kans van die vermiste 'n monster. antwoord 15 Desember 11 van die 18:12 beantwoord 15 Desember 11 van die 22:38 Dankie vir die antwoord. Een verbetering wat dit nodig sou wees om werklik quotcachequot die waarde van die totale gemiddelde sodat ons don39t lus al die tyd. Ook, kan dit 'n geringe punt nie, maar sal dit nie meer doeltreffend om 'n deque of 'n lys te gebruik om die waarde te stoor, aangesien ons aanvaar dat werk sal in die korrekte volgorde te kom. Invoeging sal vinniger as in die kaart wees. â € Arthur 16 Desember 11 van die 08:55 Ja, jy kan die waarde van som kas. Trek die waardes van die monsters wat jy vee, voeg die waardes van die monsters wat jy voeg. Ook, ja, 'n dequeltpairltSample, Dategtgt kan meer doeltreffend wees. Ek verkies kaart vir leesbaarheid, en die gemak van beroep kaart :: Maximum. Soos altyd, skryf die korrekte kode eerste, dan profiel en inkrementele veranderinge meet. uitvoering maak Rob 16 Desember 11 om 15:00 Nota: Blykbaar is dit nie die manier om dit te benader. Verlaat dit hier vir verwysing op wat fout is met hierdie benadering is. Kyk op die kommentaar. UPDATED - gebaseer op Olis kommentaar. nie seker oor die onstabiliteit wat hy al praat. Gebruik 'n gesorteer kaart van aankoms tye teen waardes. By aankoms van 'n waarde toe te voeg die aankoms tyd om die gesorteerde kaart saam met die waarde daarvan en werk die bewegende gemiddelde. waarsku dit is pseudo-kode: Daar. Nie ten volle aangevul maar jy kry die idee. Dinge om daarop te let. Soos ek gesê het die bogenoemde is pseudo-kode. Jy moet 'n geskikte kaart te kies. Moenie verwyder die pare as jy Itereer deur as jy die iterator sal ongeldig en moet weer begin. Sien Olis kommentaar hieronder ook. antwoord 15 Desember 11 van die 12:22 Dit doesn39t werk: dit doesn39t in ag neem watter gedeelte van die venster-lengte elke waarde bestaan ​​vir. Ook hierdie benadering van die toevoeging en dan trek net stabiel vir heelgetal tipes, nie dryf. uitvoering maak Oliver Charles 15 Desember 11 by 00:29 OliCharlesworth - jammer ek gemis 'n paar belangrike punte in die beskrywing (dubbel en-time geweeg). Ek sal werk. Dankie. â € Dennis 15 Desember 11 by 12:33 Die tydbeswaringsfaktor is nog 'n probleem. Maar that39s nie wat I39m praat. Ek het verwys na die feit dat wanneer 'n nuwe waarde eers die tyd venster binnekom, sy bydrae tot die gemiddelde is minimaal. Sy bydrae gaan voort om te verhoog tot 'n nuwe waarde betree. uitvoering maak Oliver Charles 15 Desember 11 by 12: 35I weet dit is haalbaar met hupstoot volgens: Maar ek wil graag om te verhoed dat die gebruik van hupstoot. Ek het googled en nie gevind nie enige geskikte of leesbare voorbeelde. Eintlik wil ek die bewegende gemiddelde van 'n deurlopende stroom van 'n stroom van drywende punt getalle met behulp van die mees onlangse 1000 getalle as 'n data monster op te spoor. Wat is die maklikste manier om dit wat ek eksperimenteer met die gebruik van 'n omsendbrief skikking, eksponensiële bewegende gemiddelde en 'n meer eenvoudige bewegende gemiddelde en bevind dat die resultate van die omsendbrief array geskik my behoeftes beste te bereik. gevra 12 Junie 12 aan 04:38 As jou behoeftes is eenvoudig, kan jy net probeer om met behulp van 'n eksponensiële bewegende gemiddelde. Eenvoudig gestel, jy maak 'n akkumulator veranderlike, en as jou kode kyk na elke monster, die kode updates die akkumulator met die nuwe waarde. Jy kies 'n konstante alfa wat tussen 0 en 1, en bereken die volgende: Jy hoef net 'n waarde van alfa vind waar die effek van 'n gegewe voorbeeld net duur vir ongeveer 1000 monsters. Hmm, Ek is nie eintlik seker dit is geskik vir jou, noudat Ive het dit hier. Die probleem is dat 1000 is 'n mooi lang venster vir 'n eksponensiële bewegende gemiddelde Ek is nie seker daar is 'n alfa dat die gemiddelde van die afgelope 1000 getalle sou versprei, sonder onderloop in die drywende punt berekening. Maar as jy 'n kleiner gemiddelde, wou soos 30 nommers of so, dit is 'n baie maklike en vinnige manier om dit te doen. antwoord 12 Junie 12 by 04:44 1 op jou post. Die eksponensiële bewegende gemiddelde kan nie toelaat dat die alfa tot wisselvallig wees. So dit kan dit gebruik word om tyd basis gemiddeldes bereken (bv grepe per sekonde). As die tyd sedert die laaste akkumulator update is meer as 1 sekonde, jy laat Alpha wees 1.0. Anders, kan jy laat Alpha wees (usecs sedert verlede update / 1000000). â € jxh 12 Junie 12 aan 06:21 Eintlik wil ek die bewegende gemiddelde van 'n deurlopende stroom van 'n stroom van drywende punt getalle met behulp van die mees onlangse 1000 getalle as 'n data monster op te spoor. Let daarop dat die onderstaande updates die totale soos elemente soos bygevoeg / vervang, vermy duur O (N) traversal om die som te bereken - wat nodig is vir die gemiddelde - op aanvraag. Totaal gemaak 'n ander parameter van T te ondersteun bv met behulp van 'n lang lang wanneer altesaam 1000 lank s, 'n int vir char s, of 'n dubbel totale float s. Dit is 'n bietjie gebrekkig deurdat numsamples kon verby INTMAX - as jy omgee wat jy kan gebruik om 'n unsigned long lank. of gebruik 'n ekstra Bool data lid aan te teken wanneer die houer eerste gevul terwyl fietsry numsamples rondom die skikking (beste herdoop dan iets onskuldig soos POS). antwoord 12 Junie 12 aan 05:19 aanvaar word dat quotvoid operateur (T monster) quot is eintlik quotvoid operatorltlt (T monster) quot. â € oPless 8 Junie 14 by 11:52 oPless ahhh. goed raakgesien. eintlik het ek bedoel dat dit nietig operateur () (T monster), maar natuurlik jy kan gebruik wat ook al notasie jy graag. Sal los, te danke. â € Tony D 8 Junie 14 by 14: 27What is die eksponensiële bewegende gemiddelde (EMA) formule en hoe word die EMO bereken Die eksponensiële bewegende gemiddelde (EMA) is 'n geweegde bewegende gemiddelde (WBA) wat meer gewig, of belang, gee aan onlangse prys data as die eenvoudige bewegende gemiddelde (SMA) doen. Die EMO reageer vinniger onlangse prysveranderings as die SMA. Die formule vir die berekening van die EMO behels net die gebruik van 'n vermenigvuldiger en begin met die SMA. Die berekening vir die SMA is baie eenvoudig. Die SMA vir enige gegewe aantal tydperke is eenvoudig die som van die sluitingstyd pryse vir daardie aantal tydperke, gedeel deur dieselfde nommer. So, byvoorbeeld, 'n 10-dag SMA is net die som van die sluitingstyd pryse vir die afgelope 10 dae, gedeel deur 10. Die drie stappe om die berekening van die EMO is: Bereken die SMA. Bereken die vermenigvuldiger vir weeg die EMO. Bereken die huidige EMO. Die wiskundige formule, in hierdie geval vir die berekening van 'n 10-tydperk EMO, lyk soos volg: SMA: 10 tydperk som / 10 Die berekening van die gewig vermenigvuldiger: (2 / (geselekteerde periode 1)) (2 / (10 1)) 0,1818 (18,18) die berekening van die EMO: (Sluitingsprys-EMO (vorige dag)) x vermenigvuldiger EMO (vorige dag) die gewig wat aan die mees onlangse prys is groter vir 'n korter tydperk EMO as vir 'n langer tydperk EMO. Byvoorbeeld, is 'n 18,18 vermenigvuldiger toegepas op die mees onlangse prys data vir 'n 10 EMO, terwyl 'n 20 EMO, slegs 'n 9,52 vermenigvuldiger gewig word gebruik. Daar is ook effense variasies van die EMO wat verkry word deur die gebruik van die oop, hoog, laag of mediaanprys in plaas van die gebruik van die sluitingsprys. Gebruik die eksponensiële bewegende gemiddelde (EMA) om 'n dinamiese forex strategie te skep. Leer hoe EMA baie benut kan word. Lees Antwoord Hier is die belangrikste potensiële voordele van die gebruik 'n eksponensiële bewegende gemiddelde wanneer handel, in plaas van 'n eenvoudige verskuiwing. Lees Antwoord Leer oor eenvoudige bewegende gemiddeldes en eksponensiële bewegende gemiddeldes, wat hierdie tegniese aanwysers meet en die verskil. Lees Antwoord Hier is die formule vir die bewegende gemiddelde konvergensie divergensie momentum aanwyser en uit te vind hoe om die MACD bereken. Lees Antwoord Vind die primêre verskille tussen eksponensiële en eenvoudige bewegende gemiddelde aanwysers, en wat nadele EMA kan. Lees Antwoord Meer inligting oor verskillende tipes bewegende gemiddeldes, asook bewegende gemiddelde CROSSOVER, en verstaan ​​hoe dit gebruik word in lees Beantwoord Eksponensiële bewegende gemiddelde -. EMO laai die speler. Afbreek van Eksponensiële bewegende gemiddelde - EMO Die 12- en 26-dag EMA is die gewildste kort termyn gemiddeldes, en hulle word gebruik om aanwysers soos die bewegende gemiddelde konvergensie divergensie (MACD) en die persentasie prys ossillator (PPO) te skep. In die algemeen, is die 50- en 200-dag EMA as seine van 'n lang termyn tendense. Handelaars wat tegniese ontleding diens vind bewegende gemiddeldes baie nuttig en insiggewend wanneer dit korrek toegepas word, maar skep chaos wanneer onbehoorlik gebruik of verkeerd verstaan. Al die bewegende gemiddeldes wat algemeen gebruik word in tegniese ontleding is, volgens hulle aard, sloerende aanwysers. Gevolglik moet die afleidings wat op die toepassing van 'n bewegende gemiddelde op 'n bepaalde mark grafiek wees om 'n mark skuif bevestig of om sy krag te toon. Heel dikwels is, teen die tyd dat 'n bewegende gemiddelde aanwyser lyn het 'n verandering aan 'n beduidende stap in die mark weerspieël gemaak het die optimale punt van toegang tot die mark reeds geslaag. 'N EMO nie dien om hierdie dilemma te verlig tot 'n mate. Omdat die EMO berekening plaas meer gewig op die jongste data, dit drukkies die prys aksie 'n bietjie stywer en reageer dus vinniger. Dit is wenslik wanneer 'n EMO word gebruik om 'n handels inskrywing sein herlei. Interpretasie van die EMO Soos alle bewegende gemiddelde aanwysers, hulle is baie meer geskik vir trending markte. Wanneer die mark is in 'n sterk en volgehoue ​​uptrend. die EMO aanwyser lyn sal ook 'n uptrend en andersom vir 'n down tendens toon. A waaksaam handelaar sal nie net aandag te gee aan die rigting van die EMO lyn, maar ook die verhouding van die tempo van verandering van die een bar na die volgende. Byvoorbeeld, as die prys aksie van 'n sterk uptrend begin plat en reverse, van die EMAS tempo van verandering van die een bar na die volgende sal begin om te verminder tot tyd en wyl die aanwyser lyn plat en die tempo van verandering is nul. As gevolg van die sloerende uitwerking, deur hierdie punt, of selfs 'n paar bars voor, die prys aksie moet reeds omgekeer. Dit volg dus dat die waarneming van 'n konsekwente verminderde in die tempo van verandering van die EMO kon self gebruik word as 'n aanduiding dat die dilemma wat veroorsaak word deur die sloerende uitwerking van bewegende gemiddeldes verder kon teen te werk. Algemene gebruike van die EMO EMA word algemeen gebruik word in samewerking met ander aanwysers aan beduidende mark beweeg bevestig en om hul geldigheid te meet. Vir handelaars wat intraday en vinnig bewegende markte handel te dryf, die EMO is meer van toepassing. Dikwels handelaars gebruik EMA om 'n handels vooroordeel bepaal. Byvoorbeeld, as 'n EMO op 'n daaglikse grafiek toon 'n sterk opwaartse neiging, kan 'n intraday handelaars strategie wees om net handel van die lang kant op 'n intraday grafiek.


No comments:

Post a Comment