Jag har profilerat detta med hjälp av Visual C profiler, och det står för cirka 35 av körtiden. Detta exponentiella glidande medel kallas mer än trillion gånger, eftersom det används upprepade gånger vid behandling av mer än 400 gigabyte data. Uppgifterna kommer från en RAID Level 0 Solid State disk array, så att läsa datakontona för mindre än 5 av tiden. Prisstorleken är cirka 100. Jag förstegrade det med en faktor 4 genom att förutbestämma så mycket data som möjligt. Då kunde jag öka det igen med en faktor ndash PaeneInsula 30 okt 11 kl 20:41 Jag kunde höja hastigheten igen med en faktor 12 genom multithreading den (dataens natur är sådan att den kan multithreaded i så att lasten är perfekt balanserad.) Och jag kör den på en i7 990x (som har 6 kärnor, överhettad av totalt 12), överklockade. ndash PaeneInsula 30 okt 11 kl 20:51 Visst kan multithreading hjälpa. Men du kan nästan säkert förbättra prestanda på en enda gängad maskin. Först beräknar du det i fel riktning. Endast de modernaste maskinerna kan göra negativa steg före förhämtning. Nästan alla machihnes är snabbare för enhetsteg. Dvs. Ändra riktningen för matrisen så att du skannar från låg till hög i stället för hög till låg är nästan alltid bättre. Därefter omskrivning lite - snälla tillåta mig att förkorta variabelnamnen för att göra det lättare att skriva: Förresten börjar jag använda shorthands p för pris och s för utjämning, för att spara typing. Jag är lat. men det är förmodligen snabbare att göra. Latensen mellan avgi och avgi-2 är då 1 multiplicera och en tillägg, snarare än en subtraktion och en multiplicering mellan avgi och avgi-1. Dvs. mer än dubbelt så fort. I allmänhet vill du skriva om återkommande så att avgiften beräknas i form av avgj för j så långt tillbaka som möjligt, utan att fylla i maskinen, antingen exekveringsenheter eller register. Du gör i stort sett flera multiplikationer för att få färre multipelkedjor (och subtraherar) på den kritiska vägen. Att hoppa från avgi-2 till avgi är lätt, du kan förmodligen göra tre och fyra. Exakt hur långt beror på vad din maskin är och hur många register du har. Och latens för floating point adder och multiplikator. Eller, ännu bättre, smaken av kombinerad multiplikationsanvisning du har - alla moderna maskiner har dem. T. ex. om MADD eller MSUB är 7 cykler lång kan du göra upp till 6 andra beräkningar i sin skugga, även om du bara har en enda flytpunktsenhet. Helt pipelinerad. Och så vidare. Mindre om pipelined varje andra cykel, vilket är vanligt för dubbel precision på äldre chips och GPU. Assembly-koden ska vara mjukvara pipelined så att olika loop-iterationer överlappar varandra. En bra kompilator bör göra det för dig, men du kanske måste skriva om C-koden för att få bästa möjliga prestanda. Förresten: Jag menar inte att föreslå att du ska skapa en rad avg. I stället skulle du behöva två medelvärden om avgi beräknas i form av avgi-2, och så vidare. Du kan använda en rad avgi om du vill, men jag tror att du bara behöver ha 2 eller 4 avgs, kallade, kreativa, avg0 och avg1 (2, 3.) och rotera dem. Denna typ av trick, dela upp en ackumulator eller medelvärde i två eller flera, som kombinerar flera steg av återkommandet, är vanligt i högprestandakod. Åh ja, precalculate ss, etc. Om jag har gjort det rätt, skulle det i oändlig precision vara identisk. (Dubbelkoll mig, tack.) I slutgiltiga precision FP kan dina resultat skilja sig, förhoppningsvis bara lite, på grund av olika avrundningar. Om upprollningen är korrekt och svaren är signifikant olika har du förmodligen en numeriskt instabil algoritm. Du är den som vilyld vet. Obs! Flyttningsfel med flytande punkt ändrar de låga bitarna i ditt svar. Båda på grund av omarrangering av koden och användning av MADD. Jag tror det är nog okej, men du måste bestämma. Obs! Beräkningarna för avgi och avgi-1 är nu oberoende. Så du kan använda en SIMD-instruktionsuppsättning, som Intel SSE2, vilket möjliggör drift på två 64 bitars värden i ett 128 bitars brett register åt gången. Det ska vara bra för nästan 2X, på en maskin som har tillräckligt med ALU. Om du har tillräckligt med register för att skriva omgi när det gäller avgi-4 (och jag är säker på att du gör det på iA64) kan du gå 4X bred om du har tillgång till en maskin som 256 bitars AVX. På en GPU. du kan gå för djupare återkommande, skriva omgi när det gäller avgi-8 och så vidare. Vissa GPU har instruktioner som beräknar AXB eller till och med AXBY som en enda instruktion. Även om det är vanligare för 32 bit än för 64 bitars precision. Vid något tillfälle skulle jag förmodligen börja fråga: vill du göra detta på flera priser i taget Inte bara hjälper det dig med multithreadning, det kommer också att passa det för att köra på en GPU. Och med bred SIMD. Mindre sen tillägg Jag är lite embarassed att inte ha tillämpat Horners Rule för uttryck som något effektivare. något annorlunda resultat med avrundning. I mitt försvar bör någon anständig kompilator göra det för dig. Men Hrners regel gör beroendeskedjan djupare när det gäller multiplikationer. Det kan hända att du slår av och pipelinerar slingan några gånger. Eller du kan göra där du precalculate Jag vet att detta kan uppnås med boost enligt: Men jag vill verkligen undvika att använda boost. Jag har googled och inte hittat några lämpliga eller läsbara exempel. I grund och botten vill jag spåra det rörliga genomsnittet av en pågående ström av en ström av flytande punkttal med de senaste 1000 siffrorna som ett dataprov. Vad är det enklaste sättet att uppnå detta jag experimenterade med att använda ett cirkulärt array, exponentiellt glidande medelvärde och ett enklare glidande medelvärde och fann att resultaten från den cirkulära gruppen passade mina behov bäst. frågade 12 juni 12 kl 4:38 Om dina behov är enkla kan du bara försöka använda ett exponentiellt glidande medelvärde. Enkelt, du gör en ackumulatorvariabel, och när din kod tittar på varje prov uppdateras koden med ackumulatorn med det nya värdet. Du väljer en konstant alfa som ligger mellan 0 och 1 och beräknar det här: Du behöver bara hitta ett värde av alfa där effekten av ett visst prov endast varar för cirka 1000 prover. Hmm, jag är inte säker på att det här är lämpligt för dig, nu när jag har lagt den här. Problemet är att 1000 är ett ganska långt fönster för ett exponentiellt rörligt medelvärde. Jag är inte säker på att det finns en alfa som skulle sprida genomsnittet över de senaste 1000 siffrorna, utan underflöde i flytpunktsberäkningen. Men om du ville ha ett mindre medelvärde, som 30 nummer eller så, är det här ett mycket enkelt och snabbt sätt att göra det. svarade den 12 juni 12 kl 4:44 1 på ditt inlägg. Det exponentiella glidande medlet kan låta alfabetet vara variabelt. Så här tillåter det att det används för att beräkna tidsbaserade medelvärden (t ex byte per sekund). Om tiden sedan den senaste ackumulatorns uppdatering är mer än 1 sekund, låter du alpha vara 1,0. Annars kan du låta alpha vara (usecs sedan senaste uppdateringen1000000). ndash jxh Jun 12 12 at 6:21 I grund och botten vill jag spåra det rörliga genomsnittet av en pågående ström av en ström av flytande punkttal med de senaste 1000 numren som ett dataprov. Observera att nedanstående uppdaterar summan som element som läggs till, vilket undviker kostnadskrävande O (N) - korsning för att beräkna summan som behövs för genomsnittet - efterfrågan. Totalt görs en annan parameter från T för att stödja t. ex. använder en lång lång när totalt 1000 lång s, ett int för char s, eller en dubbel till totalt float s. Det här är lite bristfälligt, eftersom numsamples kan gå förbi INTMAX - om du bryr dig att du kan använda en unsigned long long. eller använd en extra bool data medlem för att spela in när behållaren fylls första gången medan cykeltalsprover runt arrayen (bäst omnämndes något oskadd som pos). svarade den 12 juni 12 kl 5:19 antar man att kvoträttsoperatören (T-prov) citationstecken är faktiskt quotvoid operatorltlt (T-prov) citat. ndash oPless 8 juni 14 kl 11:52 oPless ahhh. välspotted. egentligen menade jag att det skulle vara tomt operatör () (T-prov) men självklart kan du använda vilken anteckning du helst tyckte. Kommer att fixa, tack. ndash Tony D Jun 8 14 at 14:27 Det är möjligt att genomföra ett glidande medelvärde i C utan att det behövs ett fönster i prover. Jag har funnit att jag kan optimera lite, genom att välja en fönsterstorlek som är en kraft av två för att tillåta lite - växling istället för att dela men inte behövde en buffert skulle vara trevligt. Finns det ett sätt att uttrycka ett nytt glidande medelresultat endast som en funktion av det gamla resultatet och det nya provet Definiera ett exempel glidande medelvärde, över ett fönster med 4 prov att vara: Lägg till nytt prov e: Ett glidande medel kan implementeras rekursivt , men för en exakt beräkning av glidande medelvärde måste du komma ihåg det äldsta inmatningsprovet i summan (dvs. a i ditt exempel). För ett längd N rörligt medelvärde beräknar du: var yn är utsignalen och xn är ingångssignalen. Eq. (1) kan skrivas rekursivt som Så du behöver alltid komma ihåg provet xn-N för att kunna beräkna (2). Som påpekat av Conrad Turner kan du använda ett (oändligt långt) exponentiellt fönster istället, vilket gör det möjligt att beräkna utmatningen endast från tidigare utmatning och aktuell ingång: men det här är inte ett vanligt (obetydligt) glidande medelvärde men exponentiellt viktade glidande medelvärde, där prov i det förflutna får en mindre vikt, men (åtminstone teoretiskt) glömmer du aldrig någonting (vikterna blir bara mindre och mindre för prover långt ifrån). Jag implementerade ett glidande medelvärde utan individuellt objektminne för ett GPS-spårningsprogram som jag skrev. Jag börjar med 1 prov och dela med 1 för att få nuvarande avg. Sedan lägger jag till ett prov och delar upp med 2 till den nuvarande avg. Detta fortsätter tills jag når längden på medeltalet. Varje gång efteråt lägger jag till i det nya provet, får medelvärdet och tar bort det genomsnittet från summan. Jag är inte matematiker men det verkade som ett bra sätt att göra det. Jag tänkte att det skulle vända på magen på en riktig matte kille men det visar sig att det är ett av de accepterade sätten att göra det. Och det fungerar bra. Kom bara ihåg att ju högre längden desto långsammare följer du vad du vill följa. Det kan inte ha betydelse för det mesta, men när du följer satelliter, kan du vara långsiktig, om det är långt ifrån det faktiska läget och det kommer att se dåligt ut. Du kan ha ett mellanrum mellan mitten och de efterföljande prickarna. Jag valde en längd på 15 uppdaterad 6 gånger per minut för att få tillräcklig utjämning och inte komma för långt från den faktiska lätta positionen med de släta spårpunkterna. svarat 16 november 16 kl 23:03 initialisera totalt 0, count0 (varje gång vi ser ett nytt värde) Då en inmatning (scanf), en lägg till totalnevValue, en ökning (räkning), en delningsgenomsnitt (totalantal) Detta skulle vara ett glidande medelvärde över alla ingångar För att beräkna medelvärdet över endast de senaste 4 ingångarna, skulle det behöva 4 ingångsvariabler, kanske kopiering av varje ingång till en äldre ingångsvariabel och sedan beräkning av det nya glidande medlet. Som summan av de fyra ingångsvariablerna dividerad med 4 (höger skift 2 skulle vara bra om alla ingångar var positiva för att få den genomsnittliga beräkningen besvarad 3 feb 15 kl 4:06 som faktiskt kommer att beräkna det totala genomsnittet och INTE det glidande genomsnittet. När räkningen blir större blir effekten av ett nytt ingångsprov försvinnande liten ndash Hilmar Feb 3 15 kl 13:53 Ditt svar 2017 Stack Exchange, Inc Jag är i färd med att skapa en Forex trading algoritm och ville försöka mitt skott för att beräkna EMA (Exponentential Moving Average). Mina resultat verkar vara korrekta (jämfört med calculatio ns gjorde jag för hand) så jag tror att följande metod fungerar, men ville bara få en extra uppsättning ögon för att se till att jag saknar något. Observera att detta bara returnerar EMA för det senaste priset, det returnerar inte en rad EMA-enheter, eftersom det inte är vad jag behöver för min ansökan. Rekursion är ett bra verktyg för rätt jobb, men här används det för att åstadkomma enkel looping. Som sådan koden. är svårare att läsa och motivera. är långsammare eftersom mycket av koden i ema bara behöver springa en gång. kommer att misslyckas med tillräckligt stort värde i fönstret på grund av överflödande Pythons call stack. Vänligen ange åtminstone parametrarna för varje funktion, t. ex. det här fönstret är längden på fönstret, och den positionen räknas bakåt från slutet av data. (Faktum är att saker skulle vara tydligare om positionen var ett normalt framåtriktat index i data) Höj ett undantag när du hittar en parameter har ett ogiltigt värde. Returnera None istället kommer bara att orsaka ett mer förvirrande undantag senare. Faktum är att om jag försöker indikatorer (). Ema (closeprices, 600) får jag oändlig recursion eftersom sma returnerar None. vilket gör ema call sma om och om igen. Den föregående punkten avslöjar också att om len (data) lt fönster 2 inte är rätt validitetskontroll. Den 1 i data-window2 1: - window 1 verkar inte korrekt för mig. Jag antar att du vill ha data-window2: - window Uttalandet returnera tidigareema är på en udda plats eftersom du då har beräknat ett nytt aktuellt ämne. Detta är basfallet av rekursionen, och det är vanligt att hantera basfallet först. Mitt förslag till ema: svarat 26 nov 14 kl 18:56 Ganska grundlig granskning: Du behöver inte skriva en klass för vad du gör (och jag föreslår att du tittar på den här videon). Din klass inkapslar inte någon data och du använder den bara för att få dina funktioner i samma enhet. Jag antar att saker skulle lättare förstå om du skulle definiera klassmetod för att göra det uppenbart att du inte kommer att förlita dig på någon som helst orsak. Men ett ännu bättre alternativ skulle vara att bara definiera funktioner i en indikatormodul. svarat nov 24 14 kl 18:04 Tack för de förslag som jag faktiskt hade dem som classmethods och debatterade gå fram och tillbaka mellan även med en klass eller bara definiera funktioner i en indikatormodul (som jag nu ska göra). ndash ChrisC Nov 25 14 at 19:12 Bara tittade på videon också, bra saker. ndash ChrisC Nov 25 14 på 19:43 Ditt svar 2017 Stack Exchange, Inc
01-02: Estrategias FOREX Qu son las Estrategias FOREX Quizs har inte fått några andra ord som kan tolkas av terminologin och se en strategi för Forex de manera equivocada. Existera metoder, system, strategier och tänkande. La metodologa ms efectiva es el Lenguaje del Precio (el Seguimiento de Tendencias). Combinada är en korrekt föreläsning för psykologer som är närvarande i dagslösningar. Sabemos que en los Mercados Burstiles existerar miles de estrategias. FOREX, allmänt om att återställa de löpande varumärkena, att presentera de olika strategierna som liknar varandra. Aprovechando patrones psicolgicos repetitivos. Primero, la metodologa del Lenguaje del Precio har skapat stora föreställningar och FOREX, och du kan alltid få mer information. Pero esta metodologa debe ser implementada dentro de un marco de conceptos avanzados de Mercados. Sin ovidkommande förlust av bakterier. Y trabajando duro da a da. Segundo, som är en del av de strategiska aktörerna, ger dig möjlighet att ansluta ...
Comments
Post a Comment