Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem bei Formel zur Aktienanalyse (https://www.delphipraxis.net/65935-problem-bei-formel-zur-aktienanalyse.html)

hincapie 22. Mär 2006 15:33


Problem bei Formel zur Aktienanalyse
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also, ich habe mich mal etwas näher mit der technischen Analyse von Aktienkursen beschäftigt.
z. B. Momentum = Berechnung aus der Differenz des heutigen Kurses zum Kurs vor z.B. 30 Tagen

Folgende Function berechnet das Momentum:
Delphi-Quellcode:
function TForm12.Momentum(Tage: integer): integer;
var
  value, value1: integer;
begin
  Value := Table3.FieldByName('Kurs').AsInteger;
  Table3.MoveBy(-Tage);
  Value1 := Table3.FieldByName('Kurs').AsInteger;
  Table3.MoveBy(Tage);
  result := Value - Value1;
end;
Die Darstellung des Momentums in einem TChart:
Delphi-Quellcode:
  Table3.First;
  Table3.MoveBy(Anzahl);
  for i := 0 to RecCount -1 do
  begin
    Value := Momentum(Anzahl);
    Series4.AddY(Value, Table3.FieldByName('Datum').AsString, clTeal);
    Table3.Next;
  end;
Dabei ist Anzahl die Zahl der Tage für die Berechnung des Momentums.
Soweit funktioniert auch anscheinend alles.

Mein Problem sind aber nun die Kurswerte am Ende der Tabelle.
(Siehe Anlage).

Die Berechnung funzt offenbar nicht mehr richtig, wenn die Anzahl der Kurse in der Table3 kleiner sind als die Variable Anzahl, d.h. die
Zahl der in der function momentum angegebenen Tage.

Bloß wie kann ich das ändern, dass auch für die letzten Werte eine korrekte Berechnung durchgeführt wird?

Frank Borland 22. Mär 2006 17:15

Re: Problem bei Formel zur Aktienanalyse
 
Zitat:

Zitat von hincapie
Also, ich habe mich mal etwas näher mit der technischen Analyse von Aktienkursen beschäftigt.
z. B. Momentum = Berechnung aus der Differenz des heutigen Kurses zum Kurs vor z.B. 30 Tagen

Moin!


Delphi-Quellcode:
  Table3.First;
  Table3.MoveBy(Anzahl);
  // an Ende sonst so oft wie Anzahl gegen den letzten Satz
  for i := RecCount-1-Anzahl to RecCount -1 do
  begin
    Value := Momentum(Anzahl);
    Series4.AddY(Value, Table3.FieldByName('Datum').AsString, clTeal);
    Table3.Next;
  end;
besser so:

Delphi-Quellcode:
  Table3.First;
  Table3.MoveBy(Anzahl);
  while not Table3.eof do begin
    Value := Momentum(Anzahl);
    Series4.AddY(Value, Table3.FieldByName('Datum').AsString, clTeal);
    Table3.Next;
  end; // while
wie immer ungetestet

Gruß

Malte

hincapie 23. Mär 2006 07:15

Re: Problem bei Formel zur Aktienanalyse
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hhhmm, ist schon ein bißchen was, aber noch nicht das was ich suche. :(
Bei diesem Code:

Zitat:

Zitat von Frank Borland
Delphi-Quellcode:
  Table3.First;
  Table3.MoveBy(Anzahl);
  // an Ende sonst so oft wie Anzahl gegen den letzten Satz
  for i := RecCount-1-Anzahl to RecCount -1 do
  begin
    Value := Momentum(Anzahl);
    Series4.AddY(Value, Table3.FieldByName('Datum').AsString, clTeal);
    Table3.Next;
  end;

kommt folgendes Ergebnis raus:
siehe Anhang ersterversuch.jpg :|

Der zweite Vorschlag ist schon besser

Zitat:

Zitat von Frank Borland
Delphi-Quellcode:
  Table3.First;
  Table3.MoveBy(Anzahl);
  while not Table3.eof do begin
    Value := Momentum(Anzahl);
    Series4.AddY(Value, Table3.FieldByName('Datum').AsString, clTeal);
    Table3.Next;
  end; // while

siehe Bild zweiterversuch.jpg :?

Aber die ideale Lösung ist das noch nicht.
Wie schaffe ich es, dass die Kurve mit vernünftigen Werten bis zum Ende
fortgeführt wird? :gruebel:

hincapie 23. Mär 2006 15:15

Re: Problem bei Formel zur Aktienanalyse
 
Also:
normalerweise müßte die Variable Anzahl doch, wenn nicht mehr genügend Datensätze in Table3 vorhanden sind, entsprechend auf die Zahl der noch auszulesenden Datensätze verringert werden, oder? :?:
Bloß wie stell ich das in einer Formel dar?
Immer einen Zähler (=Gesamtzahl der Datensätze von Table3) mitlaufen lassen (d.h. immer weiter verringern lassen) und mit Anzahl vergleichen?
Und wenn der Zähler kleiner ist als Anzahl, dann Anzahl entsprechend verringern? :gruebel:

Frank Borland 26. Mär 2006 23:32

Re: Problem bei Formel zur Aktienanalyse
 
Zitat:

Zitat von hincapie
Also:
normalerweise müßte die Variable Anzahl doch, wenn nicht mehr genügend Datensätze in Table3 vorhanden sind, entsprechend auf die Zahl der noch auszulesenden Datensätze verringert werden, oder? :?:

Es kann eigentlich gar nicht schlecht enden, es sei denn, es ging schon schlecht los :-)
Du mußt Kontrollstrukturen einfügen: Was passiert, wenn Du weniger Datensätze als "Anzahl" hast?
Ist in der Tabelle jeder Satz genau einem Datum zugeordnet und dieses auch noch aufsteigend?
Wie wird die Anzeige der x-Achse angepasst (Anzahl Sätze - "Anzahl")?


Gleichzeitig würde ich mit Zeiträumen arbeiten denn irgendwann passen die Daten auch nicht mehr auf 2 Monitore :-)

Gruß

Malte

hincapie 27. Mär 2006 05:49

Re: Problem bei Formel zur Aktienanalyse
 
Zitat:

Zitat von Frank Borland
Es kann eigentlich gar nicht schlecht enden, es sei denn, es ging schon schlecht los :-)
Du mußt Kontrollstrukturen einfügen: Was passiert, wenn Du weniger Datensätze als "Anzahl" hast?
Ist in der Tabelle jeder Satz genau einem Datum zugeordnet und dieses auch noch aufsteigend?
Wie wird die Anzeige der x-Achse angepasst (Anzahl Sätze - "Anzahl")?

Hallo,
das ist ja genau mein Problem. Nach so einer Kontrollstruktur suche ich ja!
Was soll ich machen, wenn die Anzahl der verbleibenden Datensätze kleiner ist als Anzahl?
Ich würde nun, um die Kurve einigermaßen sinnvoll zuende zu bekommen, die Variable Anzahl an die Zahl der Datensätze anpassen.
Das würde zwar etwas das Ergebnis verfälschen, aber die Berechnung würde wenigstens bis zum Ende durchgeführt werden.

Frank Borland 27. Mär 2006 19:01

Re: Problem bei Formel zur Aktienanalyse
 
Das while-not-eof-Konstrukt stellt sicher, daß es ein definiertes Ende gibt. Wenn aber
Anzahl>RecordCount ist mußt Du Anzahl:=RecordCount setzen um wenigstens einen Wert zu bekommen.


Delphi-Quellcode:
if (Anzahl>RecordCount)
 then Anzahl:= RecordCount;

Table3.First;
  Table3.MoveBy(Anzahl);
  while not Table3.eof do begin
    Value := Momentum(Anzahl);
    Series4.AddY(Value, Table3.FieldByName('Datum').AsString, clTeal);
    Table3.Next;
  end; // while
Die X-Achse muß RecordCount-Anzahl+1 Werte aufnehmen können.

Und wenn jeder Datensatz in Table3 genau einen Tag darstellt sollte das klappen.

Gruß


Malte


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz