Eksponentiell Bevegelse Gjennomsnittet Perl
Med vektvektor mener jeg vektoren med vekter at du må multiplisere observasjonene i vinduet som glir over dataene dine med, så hvis du legger til disse produktene, returnerer du verdien av EMA på høyre side av vinduet. For et lineært vektet glidende gjennomsnitt er formelen for å finne vektvektoren: (1: n) sum (1: n) (i R-kode). Denne serien av lengde n legger opp til 1. For n10 blir det 0,01818182 0,03636364 0.05454545 0.07272727 0.09090909 0.10909091 0.12727273 0.14545455 0.16363636 0.18181818 tallene 1 til 10 55, med 55 summen av tallene 1 til 10. Hvordan beregner du vektvektoren for et eksponentielt glidende gjennomsnitt (EMA) med lengden n hvis n er lengden av vinduet, deretter alfalt-2 (n1) og ilt-1: n så EmaWeightVectorlt - ((alfa (1-alfa) (1-i)) ) Er dette riktig Selv om EMA ikke er veldig begrenset til et vindu med en start og en slutt, bør ikke vektene legge opp til 1 akkurat som med LWMA Takk Jason, noen poeng på hvordan å justere EMA-filteret til ønsket presisjon ved å tilnærme det med et langt nok FIR-filter. Det er et perl-skript på en. wikipedia. orgwikihellip som gjorde bildet av EMA vektvektoren, men jeg skjønner ikke det: Hvis de setter antall vekter til 15, hvorfor er det 20 rød barer i stedet for 15 ndash MisterH Des 19 12 på 22: 40Stock markedet investerer: Moving avera ges (SMA, EMA, MACD) Dette er en referanseside av hva jeg vet om å flytte gjennomsnitt i børsinvesteringer. Dette inkluderer enkle glidende gjennomsnitt. eksponentielle glidende gjennomsnitt. og hvordan du bruker disse dataene til å støtte kjøp og salg av aksjer. Jeg berører også MACD. Bakgrunn Generelt tror jeg på en Warren Buffett-måte å investere hvor du: Tenk på å kjøpe en aksje som om du skal kjøpe hele virksomheten. Du baserer din kjøpsbeslutning på verdien av aksjen. Når du gjør det, holder du lager for alltid Teorien er at fra tid til annen vil en aksje falle ut av favør med aksjemarkedet, og når prisen kommer til et visst lavt nivå, blir det en verdi å kjøpe. Du kan tenke på denne strategien som å være som å kjøpe en ny bil. Hvis du kjøper en ny bil når den første er introdusert, og modellen er veldig populær, vil forhandleren ønske seg mye penger for det. Omvendt, hvis du venter og kjøper den modellen 11 måneder senere når neste nye modell skal komme ut, vil du kunne kjøpe samme bil til en mye lavere pris. Jeg nevner dette fordi jeg er i ferd med å skrive om bevegelige gjennomsnitt. og glidende gjennomsnitt har ingenting å gjøre med en Warren Buffett-stil for å investere. Flytte gjennomsnitt kan være bra for folk som driver mye handel, og de kan også brukes til å identifisere tak og gulvpriser på aksjer. En viktig ide er at gulvprisen på en aksje som bruker et glidende gjennomsnitt kan brukes til å sette et stoppfall på lager. Fordi jeg generelt følger Buffett-stilen med å investere, bruker jeg ikke bevegelige gjennomsnitt som et hovedverktøy, men jeg liker å vite hvordan de fungerer, og jeg bruker dem som en måte å støtte min andre forskning på. Nylig har jeg funnet ut at de er hyggelige fordi jeg kan se på en haug med produksjon fra Finviz eller andre nettsteder, og se at 20-dagers SMA for en aksje er 2,8. Det forteller meg på et øyeblikk at aksjekursen er trending opp. Fordi jeg ikke bruker glidende gjennomsnitt mye, er denne siden ikke helt grundig. Vennligst se Investopedia sidene jeg lenker til for mer informasjon. Dette er bare en påminnelsesside for meg. Gitt den bakgrunnen, heres hva jeg vet om å flytte gjennomsnitt. Definisjon: Hva er et enkelt flytende gjennomsnitt (SMA) Med noen få endringer fra meg, definerer Investopedia SMA slik: Et enkelt glidende gjennomsnitt (SMA) er et aritmetisk gjennomsnitt som beregnes ved å legge til sluttkurs for sikkerheten for en rekke tidsperioder og deretter dele denne summen med antall tidsperioder. Kortsiktige gjennomsnitt reagerer raskt på endringer i prisen på underliggende, mens langsiktige gjennomsnitt er sakte å reagere. Senere fortsetter de: Med andre ord er dette gjennomsnittlig aksjekurs over en viss tidsperiode. Merk at likevekt er gitt til hver daglig pris. En ulempe med en SMA er at den gir lik vekt til alle prisene som brukes til å beregne verdien. Så i en 20-dagers SMA har aksjekursen fra 20 dager siden samme vekt som prisen i går. For noen formål er det mer nyttig hvis den siste prisen har høyere vekt (mer verdi), og som et resultat oppfunnet folk EMAs. Definisjon: Hva er et eksponentielt flytende gjennomsnitt (EMA) Denne Investopedia-siden beskriver EMA slik: Et eksponentielt glidende gjennomsnitt (EMA) er en type bevegelige gjennomsnitt som ligner på et enkelt bevegelige gjennomsnitt, bortsett fra at mer vekt er gitt til det siste data. De legger til senere: Denne typen bevegelige gjennomsnitt reagerer raskere på de siste prisendringene enn en SMA. De 12 og 26-dagers EMAene er de mest populære kortsiktige gjennomsnittene, og de brukes til å skape indikatorer som den flytende gjennomsnittlige konvergensdivergensen (MACD) og den prosentvise prisoscillatoren (PPO). EMA fordeler i forhold til SMA: EMAs reagerer raskere på prisendringer enn SMAer. Tilbake til toppenVilkårene for bevegelige gjennomsnitt (MA) De generelle fordelene ved MA vurderer årsakene til at de eksisterer: De filtrerer ut støyen av kursutviklingen. De viser trender. Kortsiktige SMAs (5 til 20 dager) viser kortsiktige trender, og langsiktige SMA (20 til 200 dager) viser langsiktige trender. En stigende MA indikerer en uptrend (prisøkning eller tyren). En fallende MA indikerer en downtrend (prisnedgang eller bjørn). Lengre SMAer kan vise støtte for hva den laveste prisen på en aksje skal teoretisk være, dvs. gulvet. Andre verktøy som jeg forklarer snart, inkludert overganger, tak og gulv. Tilbake til toppenUnderstandene ved å bruke bevegelige gjennomsnitt Før du kommer inn i hvordan du bruker flytende gjennomsnitt for å kjøpe og selge aksjer, er det viktig å vite at de har noen ulemper: De er kun basert på historisk data (trender). De er egentlig ikke forutsigbare. De er bare gode med sterke trender som går opp eller ned. De er ikke nyttige når en aksjekurs går sidelengs. Du kan få falske positive, spesielt når du ser på kortere tidsrammer. Disse utsagnene vil gi mer mening når jeg forklarer hvordan handelsmenn bruker bevegelige gjennomsnitt. Bruk: Viser trender Flytende gjennomsnitt kan brukes til å vise trender. Deres verdi i denne forbindelse er at de jevner ut støyen når en aksje er litt flyktig. Bruk: Kjøpe og selge signaler (overganger og trender) Prisovergang Noen investorer bruker flytende gjennomsnitt for å se etter kjøp og salg av signaler. I den enkleste formen, når en daglig aksjekurs beveger seg over eller under et glidende gjennomsnitt, kalles dette prisovergang, og det kan indikere et kjøpesignal: Når aksjekursen beveger seg under et glidende gjennomsnitt, kan det indikere en tid til å selge . Når aksjekursen beveger seg over et glidende gjennomsnitt, kan det indikere en tid å kjøpe. Når flere bevegelige gjennomsnitt krysser over Et annet signal er når et kortsiktig glidende gjennomsnitt krysser over et langsiktig glidende gjennomsnitt: Når kortere MA krysser over lengre MA, er dette et kjøpesignal, og er merket som et gyldent kryss. Når kortere MA krysser under den lengre MA, er dette et selgesignal, og er merket et dødskors. Tre SMA-signaler Dette eksemplet fra Yahoo Finance for Volkswagen viser tre SMA-signaler, og hvordan deres kryssord kan brukes til å kjøpe og selge VLKAY. Merk at jeg vanligvis bruker en rød farge for å vise den korteste tidsrammen (den er varm), en gul farge for mellomlang tidsramme og en blå farge for den lengste tidsperioden (det er kult): SMA signal vs EMA signal Dette Andre eksempel viser hva en SMA-20 ser ut i forhold til en EMA-20 for VLKAY: Som jeg nevnte, kjøper jeg egentlig ikke aksjer på denne måten, så jeg er ikke ekspert på hvilken tidsperiode som er best. For eksempel kan det være bedre å bruke en kort EMA (20 dager) mot en lengre SMA (50 dager). En aksje anses å være i en uptrend når (a) dagens pris ligger over et glidende gjennomsnitt, og (b) gjennomsnittet er skråt oppover. Tilbake til toppen: Støtte og motstand (tak og gulv) Denne Investopedia-siden gir disse definisjonene av støtte og motstand i forhold til bevegelige gjennomsnitt: Støtte er etablert når en pris går nedover. Det er et punkt der salgstrykket avtar og kjøpere er villige til å gå inn. Med andre ord er et gulv etablert. Motstand skjer når en pris trender oppover. Det kommer et poeng når kjøpsstyrken minker og selgerne går inn. Dette er et tak. Teorien er at aksjer vanligvis vil hoppe av gulvet eller taket, men det er viktig å vite at dette ikke alltid er tilfelle. 200-dagers SMA ser ut til å bli brukt som et tak og etasje. Bruk: Stock screener I de siste månedene har jeg brukt bevegelige gjennomsnitt som lager med Barchart nettsiden. Dette bildet viser hvordan Barchart viser VLKAY akkurat nå (24. april 2016): Som du kan se, viser Barchart en rekke stocksignaler på en side. Personlig kjøper og selger jeg ikke noe ved å se på denne ene siden, men jeg bruker det som et signal, eller en screener. Volkswagen er på min radar fordi de ble funnet å være cheaters på sine utslippstester sist sommerfall, som tanket deres lager. Så mine nåværende interesser er: Vil aksjekursen komme tilbake Hvis ja, kommer det tilbake nå Disse signalene gir meg et hint om det andre spørsmålet. Flytende gjennomsnittlig konvergensdivergens (MACD) Rask oppsummering Jeg bruker ikke MACD veldig ofte, og jeg er ikke ekspert på å bruke den, men her er noen korte notater: Når MACD er positiv er kortsiktig gjennomsnitt over det langsiktige gjennomsnittet. Dette indikerer oppadgående prismoment (prisen øker). En negativ verdi indikerer at momentet er nede. Et trekk over null kan indikere et kjøp, og et trekk under null kan indikere en salg. MACD kan også brukes med en signallinje. men jeg har ikke brukt det ennå. MACD-detaljer MACD er mer komplisert enn å bruke enkle bevegelige gjennomsnitt, men når du forstår det, bidrar det til å vise trender bedre enn flytte gjennomsnitt alene. (Jeg er ikke en MACD-ekspert ennå, siden jeg vanligvis ikke lager handler basert på disse teoriene, bruker jeg bare dem til å støtte min andre undersøkelser.) Denne Investopedia-siden definerer MACD slik: MACD er en trend-følende momentumindikator som viser forholdet mellom to flytende gjennomsnitt av prisene. MACD beregnes (vanligvis) ved å subtrahere det 26-dagers eksponentielle glidende gjennomsnittet (EMA) fra 12-dagers EMA. Denne Investopedia-siden beskriver det litt bedre: Konseptet bak MACD er ganske enkelt. I hovedsak beregner det forskjellen mellom et instrument 26-dagers og 12-dagers eksponentielle glidende gjennomsnitt (EMA). Av de to bevegelige gjennomsnittene som utgjør MACD, er 12-dagers EMA åpenbart den raskeste, mens 26-dagene er langsommere. De fortsetter på den siden: På MACD-diagrammet er en 9-dagers EMA av MACD selv plottet, og det virker som en utløser for kjøp og salg av beslutninger. MACD genererer et bullish signal når det beveger seg over sin egen 9-dagers EMA, og den sender et salgstegn når det beveger seg under sin 9-dagers EMA. Du trenger virkelig å se på diagrammer for å forstå MACD, så jeg foreslår at du ser på de to koblingene. Flere notater fra den første lenken: Crossovers - Når MACD faller under signallinjen, er det et bearish signal som indikerer at det kan være tid til å selge. Omvendt, når MACD stiger over signallinjen, gir indikatoren et bullish signal, noe som tyder på at prisen på aktivet sannsynligvis vil oppleve oppadgående momentum. Mange forhandlere venter på et bekreftet kryss over signallinjen før de går inn i en posisjon for å unngå å bli faket ut eller gå inn i en posisjon for tidlig, som vist ved den første pilen. Divergens - Når sikkerhetsprisen avviker fra MACD. Det signaliserer slutten av den nåværende trenden. Dramatisk økning - Når MACD stiger dramatisk - det vil si at kortere glidende gjennomsnitt trekker seg bort fra det langsiktige glidende gjennomsnittet - det er et signal om at sikkerheten er overkjøpt og snart kommer tilbake til normale nivåer. MACDs popularitet er i stor grad på grunn av sin evne til raskt å få øye på økende kortsiktig momentum. Mange tradere vil se etter et kortsiktig glidende gjennomsnitt for å krysse over et langsiktig glidende gjennomsnitt og bruke dette til å signalere økende oppadgående fart. Denne bullish crossover antyder at prisen nylig har steget raskere enn den har tidligere, så det er et vanlig teknisk kjøpesignal. (Se på grafen på den linken) Legg merke til hvordan de bevegelige gjennomsnittene avviker vekk fra hverandre i figur 1 som styrkeens styrke øker. MACD ble utviklet for å dra nytte av denne divergensen ved å analysere forskjellen mellom de to eksponentielle glidende gjennomsnittene. Spesifikt blir verdien for det langsiktige glidende gjennomsnittet trukket fra det kortsiktige gjennomsnittet, og resultatet er plottet på et diagram. (Likning for hver dag EMA12 - EMA26) En positiv MACD-verdi, opprettet når kortsiktig gjennomsnitt er over lengre sikt, brukes til å signalere økende oppadgående momentum. Denne verdien kan tyde på at handelsmenn kanskje vil avstå fra å ta korte stillinger til et signal tyder på at det er hensiktsmessig. På den annen side tyder fallende negative MACD-verdier på at nedgangen blir sterkere, og at det kanskje ikke er den beste tiden å kjøpe. Det har blitt standard å plotte et separat bevegelige gjennomsnitt sammen med MACD, som brukes til å skape et klart signal om å skifte momentum. MACD-fordeler Signaler tolkes lett. Kan inkorporeres i en hvilken som helst kortsiktig handelsstrategi. Hjelper handelsfolk til å sikre at kortsiktige retninger jobber til deres fordel. MACD-ulemper False-positive, hva Investopedia-siden kaller en whipsaw-effekt Tilbake til toppenTroen om at en forandring vil være lett å gjøre riktig, gjør det mindre sannsynlig at endringen vil bli gjort riktig. En XP-programmer skriver en enhetstest for å avklare hans intensjoner før han gjør en endring. Vi kaller denne testdrevne designen (TDD) eller test-første programmering. fordi en API39s design og implementering styres av sine testtilfeller. Programmereren skriver testen slik han ønsker at API skal virke, og han implementerer API for å oppfylle forventningene som er utført av testen. Testdrevet design hjelper oss med å finne testbare og brukbare grensesnitt. På mange måter er testbarhet og brukervennlighet en i det samme. Hvis du ikke kan skrive en test for en API, vil det nok være vanskelig å bruke, og omvendt. Testdrevet design gir tilbakemelding om brukervennlighet før tiden går tapt på implementeringen av en vanskelig API. Som en bonus dokumenterer testen hvordan API-en fungerer, ved eksempel. Alt ovenfor er gode ting, og få ville argumentere for dem. En åpenbar bekymring er at testdrevet design kan redusere utviklingen. Det tar tid å skrive tester, men ved å skrive testene først får du innsikt i implementeringen, noe som gir rask utvikling. Feilsøking av implementeringen er raskere også, takket være umiddelbar og reproduserbar tilbakemelding som bare en automatisert test kan gi. Kanskje de største tidsbesparelsene fra enhetstesting kommer noen måneder eller år etter at du har skrevet testen, når du må utvide API. Enhetstesten gir deg ikke bare pålitelig dokumentasjon for hvordan API-en fungerer, men det validerer også forutsetningene som gikk inn i utformingen av API. Du kan være ganske sikker på at en endring ikke brøt noe hvis endringen passerer alle enhetstester skrevet før den. Endringer som fiddle med grunnleggende API antagelser forårsaker de mest kostbare feilene å feilsøke. En omfattende enhetstestpakke er trolig det mest effektive forsvaret mot slike uønskede endringer. Dette kapittelet introduserer testdrevet design gjennom implementering av et eksponentielt glidende gjennomsnitt (EMA), en enkel men nyttig matematisk funksjon. Dette kapittelet forklarer også hvordan man bruker CPAN-modulene Test :: Mer og Test :: Unntak. Enhetstester En enhetstest validerer programmeringsprogrammets visning av programmet. Dette er ganske forskjellig fra en godkjenningstest, som er skrevet fra kundens perspektiv og tester sluttbrukerfunksjonalitet, vanligvis gjennom det samme grensesnittet som en vanlig bruker bruker. En enhetstest utfører i prinsippet en API, formelt kjent som en enhet. Vanligvis tester vi en hel Perl-pakke med en enkelt enhetstest. Perl har en sterk tradisjon for enhetstesting, og nesten alle CPAN-moduler kommer med en eller flere enhetstester. Det er også mange testrammer tilgjengelig fra CPAN. Dette og de etterfølgende kapitlene bruker Test :: Mer. en populær og godt dokumentert testmodul.2 Jeg bruker også Test :: Unntak for å teste avvikssaker som resulterer i samtaler til å dø .3 Test først, etter intensjon Testdrevet design tar enhetstesting til det ytterste. Før du skriver koden, skriver du en enhetstest. For eksempel, her er det første testfallet for EMA (eksponentiell glidende gjennomsnittlig) modul: Dette er den minimale Test :: More testen. Du forteller Test :: Mer hvor mange tester du kan forvente, og du importerer modulen med useok som det første testet. BEGIN sikrer at modulens prototyper og funksjoner er tilgjengelige under kompilering av resten av enhetstesten. Det neste trinnet er å kjøre denne testen for å sikre at den mislykkes: På dette stadiet kan du tenke, Duh Selvfølgelig svikter det. Testdrevet design innebærer mange dukker i begynnelsen. Barnetrinnene er viktige, fordi de bidrar til å sette deg i tankene om å skrive en liten test etterfulgt av bare nok kode for å tilfredsstille testen. Hvis du har vedlikeholdsprogrammeringsopplevelse, kan du allerede være kjent med denne prosedyren. Vedlikeholdsprogrammerne vet at de trenger en test for å være sikker på at endringen deres løser det de tror er ødelagt. De skriver testen og kjører den før de fester noe for å sikre at de forstår en feil og at deres reparasjon fungerer. Testdrevet design tar denne praksisen til det ytterste ved å klargjøre din forståelse av alle endringer før du gjør dem. Nå som vi har klargjort behovet for en modul som heter EMA (duh), implementerer vi den: Og du, testen passerer: Yeeha Time å feire med en dobbel cappuccino slik at vi ikke sovner. Det er alt som er til testdrevet designsløyfe: skriv en test, se den mislykkes, tilfredsstille testen, og se den passere. For kortfattet grunnlag, utelukker resten av eksemplene testkjøringen og de tilhørende duhene og yeehasene. Det er imidlertid viktig å huske å inkludere disse enkle trinnene når test-første programmering. Hvis du ikke husker, vil programmeringspartneren din sannsynligvis.4 Eksponentiell flytende gjennomsnitt Vår hypotetiske kunde for dette eksempelet vil opprettholde et løpende gjennomsnitt av sluttkursene på nettstedet hennes. En EMA er vanligvis brukt til dette formålet, fordi det er en effektiv måte å beregne et løpende gjennomsnitt på. Du kan se hvorfor hvis du ser på den grunnleggende beregningen for en EMA: dagens pris x vekt gårsdagens gjennomsnitt x (1 vekt) Denne algoritmen produserer et vektet gjennomsnitt som favoriserer nyere historie. Effekten av en pris på gjennomsnittet faller eksponentielt over tid. Det er en enkel funksjon som bare behøver å opprettholde to verdier: igår39s gjennomsnitt og vekten. De fleste andre typer bevegelige gjennomsnitt, krever mer datalagring og mer komplekse beregninger. Vekten, vanligvis kalt alfa. beregnes i form av ensartede tidsperioder (dager, i dette eksemplet): 2 (antall dager 1) For effektivitet blir alfa vanligvis beregnet en gang og lagret sammen med gjeldende verdi av gjennomsnittet. Jeg valgte å bruke et objekt for å holde disse dataene og en enkel metode for å beregne gjennomsnittet. Test ting som kan bryte Siden det første kuttdesignet krever et stateful-objekt, må vi instantiere det for å bruke det. Neste sak tester objekt opprettelse: Jeg glemmer noen ganger å returnere forekomsten (selv) slik at testen ringer ok for å kontrollere at ny returnerer noe ikke-null-verdi. Denne saken tester hva jeg tror kan bryte. En alternativ, mer omfattende test er: Denne saken kontrollerer at nye returnerer en velsignet referanse til klassen EMA. For meg er denne testen unødvendig kompleks. Hvis ny returnerer noe, er det sannsynligvis en forekomst. Det er rimelig å stole på det enklere tilfellet på det grunnlag alene. I tillegg vil det være andre testtilfeller som vil bruke forekomsten, og disse testene vil mislykkes hvis ny ikke returnerer en forekomst av klasse EMA. Dette punktet er subtilt, men viktig, fordi størrelsen på en enhetstestpakke er viktig. Jo større og langsommere suiten, jo mindre nyttig vil det være. En treg enhet test suite betyr at programmerere vil nøle før de kjører alle tester, og det vil bli flere sjekker som bryterenhet og eller aksepttester. Husk, programmerere er lat og utålmodige, og de liker ikke å bli holdt tilbake av deres programmeringsmiljø. Når du bare teste hva som kan gå i stykker, vil din testenhet være et lett og effektivt utviklingsverktøy. Vær oppmerksom på at hvis du og din partner er ny til testdrevet design, er det sannsynligvis bedre å feire på forsiktighetssiden og å teste for mye. Med erfaring får du vite hvilke tester som er overflødige og som er spesielt nyttige. Det finnes ingen magiske formler her. Testing er en kunst som tar tid å mestre. Tilfredsstill testen, ikke prøv det. Tilbake til vårt eksempel, er implementeringen av ny som tilfredsstiller denne saken: Dette er den minimale koden som tilfredsstiller testen ovenfor. lengden trenger ikke lagres, og vi trenger ikke å beregne alfa. Vi kommer til dem når vi trenger det. Men vent, du sier, ville ikke følgende kode tilfredsstille testen, også Ja, du kan lure noen test. Det er imidlertid hyggelig å behandle programmerere som voksne (selv om vi ikke alltid gjør det slik). Ingen kommer til å se over skulderen for å sikre at du ikke snyder din egen test. Den første implementeringen av ny er den riktige mengden kode, og testen er tilstrekkelig til å bidra til å gjennomføre denne implementeringen. Designet krever et objekt å holde tilstanden, og et objekt opprettelse er det som trengs for å bli kodet. Test Base Cases Først Det vi har testet så langt er basissaker. det vil si tester som bekrefter de grunnleggende forutsetninger for API. Når vi først tester grunnleggende antagelser, arbeider vi mot den fullstendige kompleksiteten av den komplette implementeringen, og det gjør testen mer lesbar. Test-første design fungerer best når implementeringen vokser sammen med testene. Det er to grunnleggende tilfeller for beregningsfunksjonen. Den første basissaken er at den opprinnelige verdien av gjennomsnittet bare er selve tallet. Det er også tilfelle av å legge inn en verdi som er lik gjennomsnittet, noe som bør gi gjennomsnittet uendret. Disse tilfellene er kodet som følger: Det er funksjonen fra Test :: Mer kan vi sammenligne skalarverdier. Legg merke til endringen i instantiation test saken som tillater oss å bruke forekomsten (ema) for senere saker. Gjenbruk av resultater fra tidligere tester forkorter testen, og gjør det lettere å forstå. Implementeringen som tilfredsstiller disse sakene er: Initialiseringen av alfa ble lagt til ny. fordi beregne trenger verdien. ny initierer tilstanden til objektet, og beregne implementerer EMA-algoritmen. selv-gt er i utgangspunktet undef slik at saken kan detekteres. Selv om implementeringen er ferdig, har vi ikke gjort testing. Ovennevnte kode kan være defekt. Begge beregne test tilfeller bruker samme verdi, og testen ville passere selv om for eksempel selvbilde og verdi ble byttet ved et uhell. Vi må også teste at gjennomsnittet endres når det er gitt forskjellige verdier. Testen som den står er for statisk, og det fungerer ikke som et godt eksempel på hvordan en EMA fungerer. Velg selvsagt data I et testdrevet miljø bruker programmører tester for å lære hvordan API-en fungerer. Du kan høre at XPers ikke liker dokumentasjon. Det er ikke helt sant. Det vi foretrekker er selvvaliderende dokumentasjon i form av tester. Vi tar vare på å skrive tester som er lesbare og demonstrere hvordan du bruker API. En måte å lage lesbare tester på er å velge gode testdata. Vi har imidlertid et lite oppstartsproblem: For å velge gode testdata trenger vi gyldige verdier fra resultatene av en EMA-beregning, men vi trenger en EMA-implementering for å gi oss disse verdiene. En løsning er å beregne EMA-verdiene for hånd. Eller vi kunne bruke en annen EMA-implementering for å komme opp med verdiene. Mens noen av disse valgene ville fungere, ville en programmerer som leser testfeltene måtte stole på dem eller for å beregne dem for å bekrefte at de er riktige. For ikke å nevne at vi må ha presisjonen akkurat for vår målplattform. Bruk algoritmen, Luke Et bedre alternativ er å jobbe bakover gjennom algoritmen for å finne ut noen selvinnlysende testdata.5 For å oppnå dette behandler vi EMA-algoritmen som to likninger ved å fastsette noen verdier. Målet vårt er å ha heltallverdier for resultatene, slik at vi unngår flytende punktspesifikasjonsproblemer. I tillegg gjør integerverdier det lettere for programmereren å følge hva som skjer. Når vi ser på ligningene, ser vi at alfa er den mest begrensede verdien: dagens gjennomsnittlig dagens pris på 39 x alfa i går39s gjennomsnitt x (1 - alfa) alfa 2 (lengde 1) Derfor er det fornuftig å prøve å finne ut en verdi av alfa som kan produsere heltallresultater gitt heltallpriser. Begynner med lengde 1, reduseres alfaverdiene som følger: 1, 23, 12, 25, 13, 27 og 14. Verdiene 1, 12 og 25 er gode kandidater, fordi de kan representeres nøyaktig i binær flytpunkt . 1 er en degenerert sak, gjennomsnittet av en enkelt verdi er alltid seg selv. 12 er ikke ideell fordi alpha og 1-alfa er identiske, noe som skaper en symmetri i den første ligningen: dagens gjennomsnittlig dagens pris x 0,5 i gårsdagens gjennomsnitt x 0,5 Vi vil ha asymmetriske vekter slik at feil, for eksempel bytte dagens pris og i gårsdagens gjennomsnitt, vil bli oppdaget. En lengde på 4 gir en alfa på 25 (0.4), og gjør ligningen asymmetrisk: dagens39s gjennomsnittlige pris for dag39 x 0,4 i gårsdagens gjennomsnitt x 0,6 Med alfasett på 0,4, kan vi velge priser som gjør dagens39s gjennomsnitt et heltall. Spesifikt, multipler av 5 fungere pent. Jeg liker prisene å gå opp, så jeg valgte 10 for dagens pris og 5 for i gårsdagens gjennomsnitt. (opprinnelig pris). Dette gjør dagens gjennomsnitt til 7, og vår test blir: Igjen har jeg revidert basissakene for å holde testen kort. Enhver verdi i basissaker vil fungere, så vi kan også lagre testtid gjennom gjenbruk. Vår test og gjennomføring er egentlig fullført. Alle baner gjennom koden blir testet, og EMA kan brukes i produksjon hvis den brukes riktig. Det vil si at EMA er komplett hvis alt vi bryr oss om, er conformant atferd. Implementeringen ignorerer for øyeblikket hva som skjer når ny er gitt en ugyldig verdi for lengde. Selv om EMA er en liten del av søknaden, kan det få stor innvirkning på kvaliteten. For eksempel, hvis ny er bestått en lengde på -1, kaster Perl et divid-to-zero unntak når alfa beregnes. For andre ugyldige verdier for lengde. Slik som -2, nye aksepterer tydelig errantverdien, og beregne produserer trofaste ikke-sensuelle verdier (negative gjennomsnitt for positive priser). Vi kan ganske enkelt ignorere disse sakene. Vi må ta en beslutning om hva vi skal gjøre når lengden er ugyldig. En tilnærming ville være å påta seg søppel-inn søppel-out. Hvis en ringer leverer -2 for lengde. det er den som ringer opp. Likevel er dette ikke hva Perl39s deling fungerer, og det er ikke hva som skjer, når du prøver å de-referere en skalar som ikke er en referanse. Perl-tolken kaller dø. og jeg har allerede nevnt i kapitlet Kodingstil som jeg foretrekker å svikte fort, i stedet for å vente til programmet kan gjøre noen skader. I vårt eksempel vil kundens nettsted vise et ugyldig glidende gjennomsnitt, og en av hennes kunder kan foreta en feil investeringsbeslutning basert på denne informasjonen. Det ville vært dårlig. Det er bedre for nettstedet å returnere en serverfeilside enn å vise misvisende og feil informasjon. Ingen liker programkrasj eller serverfeil. Å ringe dø er en effektiv måte å kommunisere semantiske grenser (koblinger) i applikasjonen. UI-programmereren, i vårt eksempel, kan ikke vite at en EMA39s lengde må være et positivt heltall. Han finner ut når søknaden dør. Han kan da endre utformingen av sin kode og EMA-klassen for å gjøre denne grensen synlig for sluttbrukeren. Fail fast er en viktig tilbakemelding mekanisme. Hvis vi møter en uventet dør. det forteller oss at applikasjonsdesignet må forbedres. Deviance Testing For å teste for en API som feiler fort, må vi kunne hente samtaler til å dø og deretter ringe ok for å validere samtalen endte faktisk i et unntak. Funksjonen diesok i modulen Test :: Unntak gjør dette for oss. Siden dette er vår siste gruppe testfall i dette kapittelet, her er hele enhetstesten med endringene for de nye avvikssakerene uthevet: Det er nå 9 tilfeller i enhetstesten. Den første avvikssaken validerer at lengden kan være negativ. Vi vet allerede at -1 vil dø med et divid-to-zero-unntak så -2 er et bedre valg. Null-saken kontrollerer grenseverdien. Den første gyldige lengden er 1. Lengder må være heltall, og 2,5 eller et annet flytende punktnummer er ikke tillatt. lengden har ingen eksplisitt øvre grense. Perl konverterer automatisk heltall til flytende punktnummer hvis de er for store. Testen kontrollerer allerede at flytende punktnumre ikke er tillatt, så det kreves ingen eksplisitt øvre grensekontroll. Gjennomføringen som tilfredsstiller denne testen følger: Den eneste endringen er tillegg av et anrop til å dø med en mindre bestemmelse. Denne enkle, uklare klausulen kompliserer ikke koden eller senker APIen, og likevel forhindrer det subtile feil ved å konvertere en antagelse til en påstand. Test bare den nye API En av de vanskeligste delene av testing er å vite når du skal stoppe. Når du har blitt testinfisert, vil du kanskje fortsette å legge til tilfeller for å være sikker på at APIen er perfekt. For eksempel, et interessant test tilfelle ville være å passere et NaN (ikke et tall) for å beregne. men det er ikke en test av EMA. Flytpunktsimplementeringen av Perl oppfører seg på en bestemt måte med hensyn til NaNs6. og Bivio :: Math :: EMA vil overholde den oppførselen. Testing at NaNs håndteres på riktig måte, er en jobb for Perl-tolkens testpakke. Hver API er avhengig av en enorm mengde eksisterende kode. Det er ikke nok tid til å teste alle eksisterende APIer og din nye API også. Akkurat som en API skal skille bekymringer, så må en test. Når du tester en ny API, bør din bekymring være API og ingen andre. Solid Foundation I XP gjør vi den enkleste tingen som muligens kan fungere slik at vi kan levere forretningsverdi så raskt som mulig. Selv når vi skriver testen og gjennomføringen, er vi sikker på at koden vil endre seg. Når vi møter et nytt kundebehov, reflekterer vi koden, om nødvendig, for å lette tilleggsfunksjonen. Denne iterative prosessen kalles kontinuerlig design. som er gjenstand for neste kapittel. Det er som å renovere huset ditt når dine behov endres. 7 Et system eller hus trenger et solid fundament for å støtte kontinuerlig renovering. Enhetstester er grunnlaget for et XP-prosjekt. Ved kontinuerlig utforming sørger vi for at huset ikke faller ned ved å kjøre enhetstester for å validere alle antagelser om en implementering. Vi vokser også grunnlaget før du legger til nye funksjoner. Vår testpakke gir oss tillit til å omfavne endring. Kvalitetsprogramvarehåndtering: Vol. 1 Systems Thinking. Gerald Weinberg, Dorset House, 1991, s. 236. Del av test-enkel distribusjon, tilgjengelig på search. cpan. orgsearchqueryTest-Simple Jeg brukte versjon 0.47 for denne boken. Bare en vennlig påminnelse om å programmere i par, spesielt når du prøver noe nytt. Takket være Ion Yadigaroglu for å lære meg denne teknikken. I noen implementeringer vil bruk av NaNs forårsake en run-time-feil. I andre vil de føre til at alle etterfølgende resultater blir NaN. Ikke la tanken på kontinuerlig renovering av huset skremme deg. Programmører er mye roligere og mindre rotete enn byggearbeidere.
Comments
Post a Comment