CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - SMA - poddaje się

SMA - poddaje się

dział ogólny

Re: SMA - poddaje się

Nowy postprzez polymorphism » niedziela, 16 stycznia 2011, 22:27

(...) niestety ten kod też powoduje błąd przepełnienia stosu

Czytaj uważniej. Napisałem, że uprościłem zapis, a nie że napisałem funkcję od nowa. Funkcja wygląda poprawnie, błędu szukałbym w innym miejscu.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: SMA - poddaje się

Nowy postprzez Corvis » poniedziałek, 17 stycznia 2011, 09:13

Nie no ja wiem, napisałem tylko dla informacji.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: SMA - poddaje się

Nowy postprzez Cyfrowy Baron » poniedziałek, 17 stycznia 2011, 10:27

Czyli jak się wylicza to SMA skoro moja ostatnia wersja rekurencyjna jest niepoprawna. Podaj wynik dla okresów: 10; 15; 20; 25; 30; 17 oraz sposób obliczania, matematyczny, czyli tak jakbyś to liczył ręcznie.



Co do zarzutu dlaczego rekurencja - dlatego że ogranicza liczbę wyliczeń do niezbędnego minimum, czyli np. 6 okresów - 6 obiegów funkcji. Jak pisałem funkcja sprawdza się dobrze do około 3000 okresów, powyżej następuje przepełnienie stosu wynikające z ograniczenia pojemności zmiennych.



Błąd powstaje prawdopodobnie w wektorze Dane. Wywołanie rekurencyjne przechodzi po kolei od rekordu do rekordu. Tutaj jednak odwołanie do wektora odbywa się w odniesieniu do różnych indeksów nie koniecznie po kolei. Ja w swoim kodzie nie bez powodu użyłem dwóch wektorów. Wektor zawierający okresy nie podlegał modyfikacji, a tutaj jego zawartość jest modyfikowana.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: SMA - poddaje się

Nowy postprzez Corvis » poniedziałek, 17 stycznia 2011, 10:48

Błąd powstaje prawdopodobnie w wektorze Dane. Wywołanie rekurencyjne przechodzi po kolei od rekordu do rekordu. Tutaj jednak odwołanie do wektora odbywa się w odniesieniu do różnych indeksów nie koniecznie po kolei. Ja w swoim kodzie nie bez powodu użyłem dwóch wektorów. Wektor zawierający okresy nie podlegał modyfikacji, a tutaj jego zawartość jest modyfikowana.


Sprawdzę to wieczorkiem bo teraz nie mam dostępu do kodu.

Odnośnie tego wyleczenia: Tak mi się wydaje !!!! bo i patrząc na wykres wygląda to dobrze

SMA(2) =

10 = (15+10)/2 = 12,5
15 = (20+15)/2 = 17,5
20 = (25+15)/2 = 20
25 = (30+25)/2 = 27,5
30 = (17+30)/2 = 23,5
17 = nie wiem co tutaj bo nie ma już wartości więc chyba to się pomija albo przepisuje

SMA(3) =

10 = (20+15+10)/3 = 15
15 = (25+20+15)/3 = 10
20 = (30+25+20)/3 = 25
25 = (17+30+25)/3 = 24
30 = nie ma już wartości
17 = nie ma już wartości

No moim zdaniem to powinno być tak liczone, dla każdego punktu z takim samym okresem (dodaje od tyłu bo taka była definicja w googlu, że jest to suma liczona od końca - chociaż nie wiem poco bo dodawanie jest przemienne :roll:) w sumie jest w tym sumowaniu od tyłu logika, bo jak czekam na przyjście danych to liczę dopiero wtedy średnią jak ilość danych będzie się równać okresowi czyli:

1
czekam

1
2
czekam

1
2
3

Mogę policzyć SMA(3) dla każdego elementu.


Oczywiście mogę się mylić. Wieczorem wstawię wykresy jakie otrzymuje to będzie można zobaczyć.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: SMA - poddaje się

Nowy postprzez Cyfrowy Baron » poniedziałek, 17 stycznia 2011, 10:54

Twoje wyliczenia nie zgadzają się z przykładem podanym na tej stronie: http://www.twojbiznes.org/narzedzia-srednie_ruchome.htm

a mamy tam taki przykład:

KOD text:     UKRYJ  
    * Dzień 1: 2.1250
    * Dzień 2: 2.1295
    * Dzień 3: 2.1345
    * Dzień 4: 2.1364
    * Dzień 5: 2.1389

SMA = (2,1250 + 2,1295 + 2,1345 + 2,1364 + 2,1389) / 5 = 2,1329
 
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: SMA - poddaje się

Nowy postprzez Cyfrowy Baron » poniedziałek, 17 stycznia 2011, 11:10

Na tej stronie podane są przykłady obliczania SMA: http://www.tutorvista.com/math/simple-average-calculation To pasuje idealnie do tego co ja podałem.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: SMA - poddaje się

Nowy postprzez Corvis » poniedziałek, 17 stycznia 2011, 11:11

Najlepiej to narysować na wykresie i od razu widać. Jeżeli się nie zgadzają to jaki sens ma ten parametr OKRES w średniej. Wieczorem ci wkleje jak wygląda wykres w twojej średniej SMA i jak wygląda mój ze zmiennym okresem. Moim sposobem twój wykres otrzymam dopiero wtedy jak dam bardzo wysoki parametr okresu.



Dodane:

No to jeżeli takie są przykłady - to jak wyliczyć SMA z okresem 3 dla 9 elementów ???
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: SMA - poddaje się

Nowy postprzez Cyfrowy Baron » poniedziałek, 17 stycznia 2011, 11:18

Moim sposobem twój wykres otrzymam dopiero wtedy jak dam bardzo wysoki parametr okresu.


To chyba zależy od tego jak rysujesz ten okres. Mój ostatni przykład opiera się na sześciu okresach i dla każdego okresu zostaje wyliczony punkt, więc można chyba zrobić wykres mając 6 punktów?!

Sprawdziłeś ostatni link: http://www.tutorvista.com/math/simple-average-calculation

Twoje obliczenia nie pasują do tych przykładów. Wciąż szukam nowych przykładów w sieci i wszędzie obliczenia są podawane w ten sam sposób. Jak znajdę jakiś kalkulator wtedy sprawdzę jak to wygląda naprawdę.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: SMA - poddaje się

Nowy postprzez Corvis » poniedziałek, 17 stycznia 2011, 11:24

No sprawdziłem ale nie znalazłem tam odpowiedzi:

Jak wyliczyć SMA z okresem 3 dla 9 elementów ???
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: SMA - poddaje się

Nowy postprzez Cyfrowy Baron » poniedziałek, 17 stycznia 2011, 11:27

Już chyba wiem. Patrz tutaj: http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:moving_averages
SMA wylicza się dla określonego okresu, np. dla 5 kolejnych dni wygląda to tak:

KOD text:     UKRYJ  
Daily Closing Prices: 11,12,13,14,15,16,17
First day of 5-day SMA: (11 + 12 + 13 + 14 + 15) / 5 = 13
Second day of 5-day SMA: (12 + 13 + 14 + 15 + 16) / 5 = 14
Third day of 5-day SMA: (13 + 14 + 15 + 16 + 17) / 5 = 15


To jednak cały czas nijak ma się do Twoich obliczeń.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Corvis
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: SMA - poddaje się

Nowy postprzez Cyfrowy Baron » poniedziałek, 17 stycznia 2011, 11:28

Jak wyliczyć SMA z okresem 3 dla 9 elementów ???


Odpowiedź w moim ostatnim poście.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: SMA - poddaje się

Nowy postprzez Corvis » poniedziałek, 17 stycznia 2011, 11:39

Cyfrowy Baron napisał(a): To jednak cały czas nijak ma się do Twoich obliczeń.



No chyba jednak to jest identyczne jak moje obliczenia tylko nie jest dodawane od tyłu.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: SMA - poddaje się

Nowy postprzez Cyfrowy Baron » poniedziałek, 17 stycznia 2011, 12:29

To zależy co miałeś na myśli, gdyż nie opisałeś dokładnie o co Tobie chodzi, tylko SMA(2), SMA(3) itd.
W każdym bądź razie w przypadku mojego kodu wyglądałoby to tak:

KOD cpp:     UKRYJ  
/*

SMA1 = (10 + 15 + 20)                = 45  / 3 = 15;
SMA2 = (15 + 20 + 25)                = 60  / 3 = 20
SMA3 = (20 + 25 + 30)                = 75  / 3 = 25
SMA4 = (25 + 30 + 17)                = 70  / 4 = 24
*/

void sum(vector<long double> P, vector<long double> &graphPoints,
                                   int size, long double value, int count)
{
  static int c = 0;
  static int p = 0;

  if(size > P.size() - count)
  {
   c = 0;
   p = 0;
   return;
  }

  if(p < count)
  {
   value = value + P[c];
   c += 1;
   p += 1;
  }
  else
  {
   long double sma = value / count ;
   size++;
   graphPoints.push_back( ( sma ) );
   c = size;
   p = 0;
   value = 0;
  }
  sum(P, graphPoints, size, value, count);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonSMAClick(TObject *Sender)
{
 vector<long double> P;
 P.push_back(10);
 P.push_back(15);
 P.push_back(20);
 P.push_back(25);
 P.push_back(30);
 P.push_back(17);

 vector<long double> graphPoints;

 sum(P, graphPoints, 0, 0, 3); // dla 3 dni

 /* sprawdzam co zawiera vektor graphPoint  */
 for(int i = 0; i < graphPoints.size(); i++)
 {
  ListBox1->Items->Add( FloatToStr( graphPoints[i] ) );
 }

}


Posłużyłem się oczywiście rekurencją, gdyż bazuję na tym samym kodzie. Rekurencja nie jest tutaj już jednak tak wydajna, gdyż liczba wywołań jest równa liczbie okresów pomnożonych przez liczbę dni minus - 1 ( (n * d) -1 ). W przykładzie dla wyliczenia SMA dla 3 dni z 6 okresów liczba wywołań wyniesie 17. Możesz to sobie robić jako iteracje jak radzi polymorphism, gdyż w przypadku tego kodu liczba możliwych wywołań spadła do 800, co wynika jak sądzę z rekurencji, a nie ograniczenia pojemności zmiennych.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Corvis
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: SMA - poddaje się

Nowy postprzez Corvis » poniedziałek, 17 stycznia 2011, 12:44

Dzięki, sprawdzę wieczorem i wrzucę rezultaty.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: SMA - poddaje się

Nowy postprzez Corvis » poniedziałek, 17 stycznia 2011, 18:00

KOD cpp:     UKRYJ  
void LiczSMA3(std::vector<Tik> P, std::vector<long double> &wynik, int size, long double value, int count,int AdresSMA)
{
  static int c = 0;
  static int p = 0;

  if(size > P.size() - count)
  {
   c = 0;
   p = 0;
   return;
  }

  if(p < count)
  {
   value = value + P[c].WartosciTikow[AdresSMA];   // Tutaj zmieniłem żeby dostać się dobrze do struktury
   c += 1;
   p += 1;
  }
  else
  {
   long double sma = value / count ;
   size++;
   wynik.push_back( ( sma ) );
   c = size;
   p = 0;
   value = 0;
  }

  LiczSMA3(P, wynik, size, value, count, AdresSMA);
}


Wywołanie:

KOD cpp:     UKRYJ  
  int okres = 3;
  int adres = 0;
  std::vector<long double> tmp;
  LiczSMA3(DanePrzeliczone, tmp, 0, 0, okres, adres); // dla 3 dni


Struktura TIK i deklaracja wektora DanePrzeliczone

KOD cpp:     UKRYJ  
struct Tik {
        TDateTime DataGodzina;
        std::vector<long double> WartosciTikow; };
std::vector<Tik> DanePrzeliczone;


Tak to u mnie wygląda niestety ten kod co mi dałeś nie działa :| mam taki błąd:

First chance exception at $75E4FBAE. Exception class std::bad_alloc with message 'Exception Object Address: 0xD170B2'. Process WykresyGiełdowe.exe (1208)

Musiałem go przerobić trochę do swoich potrzeb. Jeżeli deklaracja nagłówki LiczSMA3 wygląd tak jak teraz to nie działa jeżeli robię:

void LiczSMA3(std::vector<Tik> &P ..... ) to działa ale przepełnia stos moment tak jak było wcześniej.
Może te całe przepełnienie stosu wynika z tej mojej struktury ???
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Poprzednia stronaNastępna strona

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 3 gości

cron