Bewegende Gemiddelde Sonder Buffer


Meta Trader 5 - Indicators Berekening van gemiddelde prys reeks vir Intermediêre Berekenings sonder die gebruik van addisionele Buffers Inleiding In my artikel die beginsels van Ekonomiese Berekening van Indicators ek gemaak redelik oortuigende toetse wat die feit dat nie elke enkele oproep van 'n persoonlike of tegniese aanwyser in 'n kode is die bewys mees optimale manier van die uitvoering van intermediêre berekeninge in 'n ontwikkelde aanwyser. Die finale snelheid van die uitvoering kan verskyn baie laer te wees, in vergelyking met wat ons sou hê as ons die kode vir intermediêre berekeninge geplaas reg in ons aanwyser. Hierdie soort benadering tot die skryf van 'n kode sal baie aantreklik wees, al is dit eenvoudig genoeg was. Trouens, dit lyk na 'n ernstige komplikasie van 'n kode met die beskrywing van bykomende buffers gebruik vir die berging van intermediêre resultate van berekening. Ten spyte van die verskeidenheid van intermediêre berekeninge, die nodigste in hulle verskillende algoritmes van gemiddeld. In die meeste gevalle, vir hulle wat ons kan eenvoudig en heelal persoonlike funksies wat die taak van die skryf van so 'n kode aansienlik vereenvoudig gebruik. Die proses van die skep van hierdie funksies en werk saam met hulle sal in hierdie artikel beskryf. 1. Die algemene idee van funksies van berekening van gemiddelde wat werk met 'n Bar Die klassieke benadering tot gemiddeld op 'n huidige bar bestaan ​​in 'n intermediêre aanwyser buffer, wat ons vul met vereiste inligting, en kies dan 'n verskeidenheid van vorige waardes, wat gelyk is aan die gemiddelde tydperk, en bereken die gemiddelde waarde. Die prosedure van die verwerking van hierdie seleksie lyk soos volg: SmoothVar (bar) funksie (. Var (bar - (N-1)), Var (bar - (N-2)) Var (bar)) SmoothVar (bar) gemiddeld parameter bar getal van 'n bar, waarvoor die berekening uitgevoer word Var (bar - (n-1)) gemiddelde parameters met 'n skof op (n-1) bars n aantal bars oor gemiddelde. Sulke benadering tot gemiddeld, in ons geval, lei tot die verskyning van twee siklusse van berekening. In die eerste siklus, is die data bereken en sit in 'n intermediêre buffer. In die tweede siklus, is die gemiddelde gebruik van 'n ander siklus van bykomende soek na selle van die aanwyser buffer uitgevoer op die basis van die formule hierbo voorgestel. Hierdie berekening sal baie makliker lyk as ons versamel die keuse van intermediêre data binne die funksie self. In hierdie geval, sal die funksie van gemiddelde kyk soos volg: SmoothVar (bar) funksie (Var (bar), bar) 'n nuwe waarde Var (bar) is geskryf om die keuse van waardes binne die funksie op 'n huidige bar, en die waardes van Var (bar - N) wat onnodig geword is weggelaat uit die seleksie. Met hierdie benadering, 'n kode van gemiddeld lyk redelik triviaal en nie die geval addisionele aanwyser buffers. Binne-in die funksie, die skikking slaan die presiese nodige hoeveelheid data wat nodig is vir die berekening van 'n bar, nie die hele geskiedenis data. In hierdie geval is, is daar ook net een siklus van berekening data. Dit sal opgemerk word dat ten einde hierdie funksie van gemiddeld op 'n huidige bar noem, moet jy dit 'n beroep op alle vorige bars eerste 2. Die Classic Berekening van gemiddelde as 'n voorbeeld van die implementering van 'n funksie wat werk met een Bar Sulke funksies van gemiddeld moet bevat veranderlikes wat hul waardes tussen die oproepe van daardie werksaamhede mustnt verloor. Daarbenewens kan die enkel-tipe gemiddelde met verskillende parameters word gebruik in 'n kode vir baie keer dus 'n konflik van die gebruik van gedeelde geheue hulpbronne te voorkom, moet ons daardie funksies as klasse te implementeer en dis wat Ive gedoen. Die algoritmes van klassieke gemiddelde word in die klas CMovingAverage: Hierdie klas is afgelei van die basis klas CMovSeriesTools dat bykomende beskerm funksies-metodes en 'n tjek van korrektheid van tydperk van bewegende gemiddeldes bevat. Die basis klas bevat 'n bykomende universele kode wat gebruik word in alle klasse Ek stel voor, en daar is geen punt in die kopiëring van dit vir baie keer na die afgeleide klasse. In Toegepaste take van die gebruik van die gemiddelde, is die beskermde klas lede nie gebruik word in eksplisiete vorm, so laat skors hul oorsig vir die oomblik. Die klas CMovingAverage bestaan ​​uit vyf enkel-tipe funksies van gemiddeld, wie se name spreek vanself, en hulle hoef nie in besonderhede te beskryf. Die eerste funksie MASeries () is 'n integrale versameling van vier ander funksies wat toelaat dat die keuse van 'n algoritme van gemiddeld met behulp van die parameter MAMethod. Die kode van die algoritmes van gemiddeld is geskik vir maksimum prestasie, en dit is die rede waarom die hoof parameters van funksies (Duur, reeks, bar) word aangevul met bykomende parameters begin, prevcalculated, ratestotal en stel, wie se doel is absoluut identies aan die aanwyser veranderlikes met dieselfde name. Die parameter stel stel die vlag van kruip van elemente van 'n prys reeks reeks in die funksies van gemiddeld tot dieselfde as die skikkings van veranderlikes wees. Ons moet dink dat al die gemiddelde funksies van hierdie klas het die parameter Lengte vaste en dit kan nie verander word wanneer die program kode uitgevoer word Die funksie EMASeries () van die klas CMovingAverage het hierdie parameter van die tipe dubbel Nou, as ons het kennis gemaak met die klas CMovingAverage. Ons kan begin om dit te gebruik in aanwysers. Om dit te doen, met behulp van die sluit richtlijn voeg die inhoud van die MASeriesCls. mqh lêer op die globale omvang van die kode van aanduiding dat jy die ontwikkeling van: Dan moet die nodige aantal gemiddelde prosedures in die aanwyser Kode te bepaal, en dan in die OnCalculate () deel (voor die lus operateurs en accolades) verklaar die statiese veranderlikes van die CMovingAverage klas volgens die vereiste aantal prosedures van gemiddeld. Daar moet 'n aparte veranderlike van die klas en 'n aparte sel in die skikking van die klas vir elke prosedure van gemiddeld wees. Die veranderlikes van die klas in die OnCalculate () funksie is verklaar as statiese kinders, omdat hulle waardes tussen die oproepe van hierdie funksie gehou moet word. Nou kan ons begin werk met homself gemiddeld. As 'n voorbeeld, Im gaan vier agtereenvolgende prosedures van gemiddelde prys reeks wys - SMA / EMO / SMMA / LWMA (die aanwyser MAx4.mq5): Die resultaat van elke vorige gemiddelde (met uitsondering van die laaste een) word gebruik in die volgende algoritme van gemiddelde en die finale uitslag is geslaag om die aanwyser buffer. Ek dink, die belangrikste deel van hierdie kode is baie versigtig voorlopige inisialisering van veranderlikes van indekse wat die begin van 'n betroubare bars wys. In hierdie situasie, sal dit lyk soos volg: Let dat in hierdie situasie, die LWMA algoritme van gemiddeld is die laaste een en dit alles beïnvloed nie die geval, maar as dit werent die laaste een, dan die verskuiwing van aanvang van betroubare inligting sal gelyk wees om Length41, nie Length4 Ek wil byvoeg, as sy nie duidelik uit die vorige kode, wat die nommer van die betroubare inligting begin van, neem 'n groter aantal en dan verminder dit eksperimenteel as dit nodig is. 3. Vergelyk die aanwyser geskep met behulp van klasse met sy analoë wat gebruik maak Tegniese en Custom Indicators Dit sou baie interessant wees om die prestasie van die geskape aanwyser MAx4.mq5 met sy identiese analoog (iMAx4.mq5) dat die tegniese aanwyser IMA gebruik vergelyk () . Wel, sodra ons besluit om die toets uit te voer, sal dit redelik om 'n ander aanwyser (MAx3x1.mq5) soortgelyk aan MAx4.mq5 toets wees, maar nadat die eerste gemiddelde gemaak met behulp van die oproep van die tegniese aanwyser IMA () en die ander drie met behulp van die klas CMovingAverage. En sodra die standaard stel aanwysers van die kliënt terminale sluit die Custom Moving Average. mq5 aanwyser, het ek 'n ander analoog aanwyser het op sy voetstukke vir toetsdoeleindes (cMAx4.mq5). Vir die komende ontleding voorberei ek vir toets Expert Adviseurs: MAx4Test. mq5, iMAx4Test. mq5, onderskeidelik MAx3x1Test. mq5 en cMAx4Test. mq5. Die voorwaardes van die uitvoer van sulke toetse is beskryf in besonderhede in die die beginsels van Ekonomiese Berekening van Indicators artikel. In hierdie artikel, Ek is nie van plan om die besonderhede van die toets beskryf, maar Im gaan die finale uitslag van die bestuur van al vier Expert adviseur in die strategie tester wys vir die afgelope 12 maande op EURUSD 4 met modelle van elke tik en die waarde van die tydperk insette parameters van alle gebiede wat gelyk is aan 500. die ergste resultate in ons toetse getoon deur die aanduiding dat persoonlike aanwysers doen 'n beroep, hierdie variant van die skryf van 'n kode kan slegs aanbeveel om die lui mense natuurlik 'n ander leier kom laaste maar een wat gebaseer is op oproepe van tegniese aanwysers het baie beter resultate, maar hulle is te ver van 'n ideale. Die ware leier van die toetse is die aanwyser wat ontwikkel met behulp van klasse die baster wat gebruik klasse en tegniese aanwysers het die tweede plek, maar dit nie die geval gebeur altyd as die tyd van die toets van 'n aanduiding is van kardinale belang, dan is sy beter om sulke variante check persoonlik vir elke situasie. Oorsig van Geïmplementeer Klasse die gemiddeld van die voorheen beskryf klas CMovingAverage sluit vyf algoritmes van gemiddeld. Die klas CCMO bevat algoritmes van gemiddelde en ossillator. Die ander klasse sluit in enkele algoritmes van gemiddeld. Die ideologie van die gebruik van enige van die voorgestelde klasse is absoluut dieselfde om die proses van die gebruik van die klas CMovingAverage hierbo beskryf. Die kode van alle gemiddeld algoritmes die (behalwe vir die paraboliese een) is geskik vir 'n maksimum spoed van uitvoering. Die kode van paraboliese gemiddelde is nie new, te danke aan die kompleksiteit van hierdie proses. Die laaste drie algoritmes nie 'n gemiddeld verteenwoordig. Ive het bygevoeg hulle as gevolg van hul hoë gewildheid en verenigbaarheid met die werke van die gewilde tegniese ontleders. Vir makliker begrip van inligting, sy beter om die gemiddelde algoritmes in 'n aparte. mqh lêers en vir praktiese gebruik verteenwoordig, die beste variant is om dit te hê in 'n enkele lêer. Vir die gebruik van aanwysers, is al die voorgestelde klasse gepak om die enkele lêer SmoothAlgorithms. mqh. Benewens dit, is die lêer aangevul met die funksies van die lêer iPriceSeries. mqh. Slegs die PriceSeries () funksie word gebruik in voorbeelde van hierdie artikel: Hierdie funksie is bedoel vir die werk met aanwysers basisse op die gebruik van die tweede tipe roeping van die funksie OnCalculate (). Die hoofgedagte van die skep van hierdie funksie is om die stel prys tijdreeksen van die opsomming ENUMAPPLIEDPRICE met persoonlike variante te brei. Die funksie gee terug Die waarde van 'n prys tijdreeksen deur sy getal wat van 1 tot 11. 4. Praktiese Voorbeelde van die implementering van 'n programkode met behulp van die Berekening van gemiddelde Klasse As sy genoeg om nog 'n voorbeeld van die gebruik van die ander klasse wys, om seker te wees wat wissel alles gedoen in die dieselfde manier as met die viervoudige gemiddelde. Im gaan 'n variant van die implementering van die funksie OnCalculate () in 'n analoog van die CCI aanwyser met behulp van die klasse CJJMA en CJurX (JCCX. mq5) Maar hierdie keer het ek die toepaslike klasse van 'n ander lêer bygevoeg op die globale omvang in die kode te wys van die aanwyser: Nou, ek wil jou aandag te hou op 'n ander ding. Die saak is 'n groot aantal aanwysers voorgestel kan word as funksies van een bar, wat werklik gemaklik om te werk met deur die gebruik van klasse is. Byvoorbeeld, sou dit interessant wees om die Bollinger kanaal op grond van die bewegende gemiddelde Vidya van Tushar Chande trek. In hierdie geval, twee klasse CCMO en CStdDeviation gebruik. Die gebruik van die eerste klas, kry ons die waarde van die bewegende gemiddelde Vidya en die gebruik van die tweede een, wat ons bereken die waarde van standaard afwyking van die prys reeks vir die bewegende gemiddelde. Daarna gebruik ons ​​hierdie afwyking vir die berekening van die boonste en onderste grens van die kanaal: So, ons het 'n eenvoudige en klein klas Die laaste drie insette parameters van die funksie VidyaBandsSeries () slaag die nodige waardes van die kanaal deur 'n skakel . Ek wil graag om daarop te let dat in hierdie geval, kan jy nie die veranderlikes van klasse te verklaar binne die funksie VidyaBandsSeries () en maak hulle staties nie, want statiese veranderlikes in klasse het 'n heel ander betekenis. Dis hoekom hierdie verklaring moet gedoen word op die globale omvang van die klas: In 'n normale Bollinger kanaal, die tydperk van gemiddelde van die bewegende gemiddelde en die tydperk van gemiddelde van die kanaal self is altyd gelyk. In hierdie klas, Ive het die parameters te skei om jou meer vryheid (EMAperiod en BBLength) gee. Die aanwyser self (VidyaBBands. mq5) op grond van hierdie klas is so eenvoudig in die gebruik van die klas CVidyaBands dat ons nie nodig het om sy kode in die artikel ontleed. Sulke klasse aanwyser funksies moet in 'n aparte mqh lêer geplaas word. Ek het so 'n funksie in die lêer IndicatorsAlgorithms. mqh geplaas. 5. Vergelyk prestasie van 'n aanwyser dat Klasse Gebruik met 'n Mens wat nie die geval In die eerste plek wil ek om uit te vind hoe die gebruik van klasse in die skryf van 'n kode van 'n aanwyser daal sy prestasie Vir hierdie doel, die kode van die aanwyser JJMA. mq5 is sonder die gebruik van die klasse (JMA. mq5) geskryf. dan is dit is getoets op dieselfde voorwaardes as in die vorige toets. Die finale uitslae van die toetse hoef nie 'n groot verskil: Natuurlik is daar is 'n paar bykomende koste vir die gebruik van die klasse nie, maar hulle is nie beduidende vergelyk met die voordele wat hulle lewer. 6. Voordele van die gebruik van die Klasse van berekening van gemiddelde Een voordeel van die gebruik van hierdie algoritmes, wat eintlik oortuigend, is dat die vervanging van oproepe van tegniese en persoonlike aanwysers lei tot 'n groot toename van prestasie van die ontwikkelde kode hierbo beskryf. Nog 'n praktiese voordeel van sodanige klasse is 'n groot gerief van die gebruik van hulle. Byvoorbeeld, alles wat beskryf word in die gewilde boek deur William Blau Momentum, rigting en divergensie lyk na 'n ware toets grond vir hierdie soort benadering tot die skryf aanwysers wees. Die kode van aanwysers uitkom as maksimaal saamgeperste, verstaanbaar en dikwels in die vorm van 'n enkele siklus van herberekening van bars. Jy kan maklik ontwikkel enige aanwyser - 'n klassieke of tegniese een, met behulp van die alternatiewe metodes van gemiddeld. 'N mooi wye verskeidenheid van die algoritmes van gemiddelde bied wye moontlikhede vir die skep van nie-tradisionele handel stelsels, dikwels met 'n vroeë opsporing van tendense en kleiner aantal valse verwek. 7. 'n paar aanbevelings oor hoe om die Berekening van gemiddelde Algoritmes in 'n spesifieke aanwyser Kode N vinnige enkele blik op enige aanwyser ontwikkel met behulp van verskillende gemiddelde algoritmes wat hier beskryf word, is genoeg om te verstaan ​​hoe verskillende mense algoritmes is. Daarom sou dit redelik wees om te veronderstel dat nie almal van die voorgestelde algoritmes is ewe goed in elke situasie. Al is dit moeilik om 'n streng beperking van die gebruik van een of ander algoritme bepaal sou wees, is dit moontlik om jou te voorsien met 'n paar algemene aanbevelings oor die gebruik van hulle. Byvoorbeeld, is die algoritmes van Tushar Chande en Kaufman bedoel vir die bepaling van tendens situasies en is nie geskik vir bykomende glad met die doel om geraas filter. Daarom is dit beter om insette óf onverwerkte prys reeks of aanwyser waardes sonder gemiddeld van hierdie algoritmes. Hier is die resultaat van die verwerking van waardes van die aanwyser Momentum met behulp van die Kaufmans algoritme (die aanwyser 4cMomentumAMA. mq5) Ek dink dat die algoritmes van klassieke gemiddelde enige spesiale aanbevelings nie nodig. Hul aansoek area is redelik wyd. Oral waar hierdie algoritmes gebruik, kan jy suksesvol gebruik die vier links algoritmes (JMA, T3, ultralinear en paraboliese). Hier is 'n voorbeeld van die MACD aanwyser waar EMO en SMA vervang met die JMA gemiddeld (die aanwyser JMACD. mq5): En hier is die resultaat van gladstryking van die berekende aanwyser in plaas van die verandering van sy algoritme van gemiddeld vir 'n beter kwaliteit van die bepaling van die huidige tendens (die aanwyser JMomentum. mq5): dit is nie 'n verrassing dat die gedrag van die markte verander voortdurend dus, sou dit naïef wees om te dink dat jy die een en die enigste ideale algoritme vir 'n sekere deel van die finansiële markte nou kan vind en vir ewig Ag Niks in hierdie wêreld vir ewig duur Tog, net soos vir my byvoorbeeld op hierdie ewig veranderende mark gebruik ek dikwels die aanwysers van 'n vinnige en medium termyn tendense soos JFATL. mq5 en J2JMA. mq5. Im redelik tevrede is met voorspellings op hul grond. Nog 'n ding wat ek wil byvoeg. Die gemiddelde algoritmes is herbruikbare. Goeie resultate kan verkry word by die toepassing van herhaalde gemiddelde reeds gemiddeld waardes. As 'n saak van die feit, in hierdie artikel het ek die ontleding van die proses van tekening van aanwyser daaruit (die aanwyser MAx4.mq5). 8. Die algemene idee van komponeer Kode van die algoritmes van hulpbronne en nou, aan die einde van die artikel wil ek om jou aandag te skenk aan die meganisme van die funksies van hulself gemiddeld. In die eerste plek, die meeste van die algoritmes van gemiddelde sluit dinamiese skikkings van veranderlikes van die tipe mSeriesArray vir die berging van die waardes van die invoer parameter reeks. Sodra die inligting betekenisvol vir berekening verskyn, moet jy die geheue vir so 'n skikking te wys vir 'n tyd. Dit word gedoen met behulp van die funksie SeriesArrayResize () van die klas CMovSeriesTools. Toe op elke maat jy moet die huidige waarde van die prys reeks reeks om die oudste waarde van die skikking te skryf en memoriseer die getal van sy posisie in die veranderlike mcount. Dit word gedoen met behulp van die funksie RecountArrayZeroPos () van die klas CMovSeriesTools. En nou, as ons moet 'n element met 'n relatiewe skuif na die huidige element vind, ons moet die funksie RecountArrayNumber () van die klas CMovSeriesTools gebruik: Gewoonlik in so 'n situasie, die nuutste element is geskryf om 'n nul posisie en die ander ( behalwe die oudste een) is voorlopig oorskryf na die volgende posisies deur sy beurt egter, is dit nie die redding van die rekenaar hulpbronne, en die meer komplekse benadering hierbo beskryf blyk meer rasionele Benewens die algoritmes van gemiddeld, die liggame van diegene funksies bevat om te wees die oproepe van funksies wat gebruik word vir die bepaling van bar posisies relatief tot die begin van die berekening van bars: die oomblik wanneer daar genoeg inligting vir die begin inisialisering van veranderlikes en situasies wanneer die laaste bar is gesluit: die eerste tjek bepaal 'n situasie wanneer daar is nie genoeg bars vir die gemiddelde funksie om te werk, en dit gee 'n leë gevolg. Sodra die tweede tjek suksesvol geslaag en daar is genoeg data vir die eerste berekening, is die inisialisering van veranderlikes uitgevoer vir 'n tyd. Twee laaste tjeks is wat nodig is vir die korrekte verskeie verwerking van waardes op die huidige unclosed bar. Ek het dit beskryf wat reeds in my artikel gewy aan die optimalisering van 'n program kode. En nou 'n paar woorde oor die optimalisering van die program kode van sodanige funksies vir die maksimum prestasie. Byvoorbeeld, impliseer die SMA algoritme gemiddeld die gekose waardes van 'n tydperk van 'n prys reeks op elke maat. Diegene waardes letterlik opgesom en gedeel deur die tydperk op elke staaf. Maar die verskil tussen die bedrag op die vorige bar en die som van die huidige bar is die eerste een is opgesom met die waarde van die prys reeks met 'n skof op 'n tydperk relatief tot die huidige tydperk en die tweede een - met die huidige waarde . Daarom sal dit baie rasionele om so 'n bedrag bereken slegs een keer tydens die inisialisering van funksies wees, en dan op elke maat voeg net nuwe waardes van die prys reeks om hierdie bedrag en trek die oudste waardes daaruit. Dit is presies wat in so 'n funksie. Gevolgtrekking Voorgestelde in die artikel implementering van die algoritmes van gemiddeld met behulp van die klasse is eenvoudig, enkel-tipe en universele, sodat jy gewoond enige probleme hulle studeer. Die argiewe verbonde aan die artikel bevat 'n baie voorbeelde vir makliker begrip van hierdie benadering tot die skryf van kode van aanwysers. In die argief Includeen. zip al die klasse is versprei in lêers. Die argief Includeen. zip bevat slegs twee lêers wat voldoende is om al die aanwysers in die argief Indicators. zip stel is. Die Expert Adviseurs vir die toets is in die argief Experts. zip. I ek probeer om 'n Matlab opdrag projek met die volgende vraag te beantwoord: Skryf 'n funksie genoem movingaverage dat 'n skalaar genoem x neem as 'n inset argument en gee 'n skalaar. Die funksie maak gebruik van 'n buffer om vorige insette te hou, en die buffer kan 'n maksimum van 25 insette te hou. Spesifiek, moet die funksie die mees onlangse 25 insette te red in 'n vektor (die buffer). Elke keer as die funksie genoem word, is dit afskrifte van die insette argument in 'n element van die buffer. As daar reeds 25 insette gestoor in die buffer, dit terug gooi die oudste element en slaan die huidige een in die buffer. Nadat dit die insette in die buffer gestoor, dit gee die gemiddeld van al die elemente in die buffer. Die oplossing wat ek aan die volgende: Volgens die motor gradeerder my funksie korrek verrig wanneer waardes 1-50 opeenvolgend verby, maar misluk wanneer waardes van 'n raserige sinusgolf agtereenvolgens is verby (wat ek in kennis gestel is dat kan wees as gevolg van 'n paar soort van 'n ronde af fout). Ek sal dankbaar wees as enige van julle my kan voorsien 'n paar wenke met betrekking tot die moontlike fout stappe in my kode (bo aangeheg). Dankie by advanceA eenvoudige en algemene metode vir die invul van ontbrekende data, as jy loop van 'n volledige data het, is om Lineêre regressie gebruik. Sê jy 1000 lopies van 5 in 'n ry met geen ontbreek. Stel die 1000 x 1 vektor y en 1000 x 4 matriks X: Regressie sal jy 4 nommers A B C D wat 'n beste wedstryd gee vir jou 1000 rye data mdash verskillende data, anders A B C D gee. Dan gebruik jy hierdie A B C D om te skat (voorspel, interpoleer) ontbreek wt0. (Vir menslike gewigte, Id verwag ABCD aan almal rondom 04/01 wees.) (Daar is Honderde boeke en artikels oor regressie, op alle vlakke. Vir die verband met interpolasie, al is, ek weet nie van 'n goeie inleiding iemand) Ek 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: 27Is dit moontlik om te implementeer 'n bewegende gemiddelde in C 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 - shifting in plaas van skeidslyn, maar nie dat daar '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 na die gemiddelde berekening te maak

Comments

Popular Posts