|
Gruppen: Kunde
Beiträge: 72
|
Hallo Freunde,
ich benötige die Max/Min-Kurse von Wertpapieren innerhalb eines Zeitraumes, der durch Datum1 und Datum2 festgelegt ist (für Katalog-Modul). Wer kann helfen?
Besten Dank KK
|
|
Gruppen: Kunde
Beiträge: 371
|
Hallo Klaus,
nutze die Funktionen für Charts:
- Chart.StartDatum und - Chart.EndeDatum
Grüße
|
|
Gruppen: Kunde
Beiträge: 104
|
Hallo Klaus,
dazu müssen die Zahl der Tage im Bereich ermittelt werden und die Zahl der Tage, die seit dem Ende des gewünschten Zeitraums vergangen sind. Dann läßt sich mit der HHV- / LLV-Funktion der Höchst- oder Tiefstwert des Bereichs ausgeben, wobei mit der Ref-Funktion der Startpunkt der Suche von heute auf das Ende des Zeitraums zurückverlegt wird.
Beispiel: "Zeitraum" hat 20 Börsentage (etwa 1 Kalendermonat). Seit dem Ende des Zeitraums sind 40 Börsentage "verflossen", also 2 Kalendermonate.
Die Formel hieße dann für den Höchstwert der Schlußkurse "Ref(HHV(Close,Zeitraum),-verflossen)"
Da müßtest du im Katalogmodul rechts, wo die Einzelwerte des gewählten Katalogs stehen, erstmal eine neue Spalte definieren. Also: Rechtsklick oben auf irgendeinen Spaltentitel > unter "Verfügbare Spalten" auf "Neu" klicken. Der Dialog "Formel bearbeiten" öffnet sich, hier unter dem Reiter "Formel" einen aussagekräftigen Namen vergeben. Z.B. "Bereich Max".
Dann unter dem Reiter "Parameter" erstmal 2 festlegen. Hier werden dann das Anfangsdatum und das Enddatum des gewünschten Bereichs angegeben, in dem der gesuchte Höchstwert liegt. Als "Typ" wählen wir deshalb bei beiden "Datum". Standardmäßig steht da dann "Datum" als Parameter1 (oben) und drunter "Datum1" als Parameter2. Zum Probieren hab ich mal den Januar genommen, also oben "01.01.2012" und unten "31.01.2012".
Wieder zum Reiter "Formel". Das "Result := "";" stört erstmal und kann nach unten geklickt werden werden.
Jetzt ordnen wir den beiden Parametern einen verständlichen Namen zu, z.B.:
Anfang:= Para1; // das Startdatum des gewünschten Bereichs heißt ab jetzt "Anfang" Ende:= Para2; // das Enddatum heißt sinnigerweise jetzt "Ende"
Jetzt brauchts erstmal die Anzahl der Tage im Bereich.
Wenn wir jetzt unten als Formelabschluß schreiben würden
Result:= Ende-Anfang;
würde als Tagesanzahl in der Spalte "30" ausgegeben werden. Also: "Ende-Anfang+1". Jetzt stimmt mit "31" erstmal die Anzahl der Tage.
Mit "KT_Bereich:= Ende-Anfang+1" wird hier der Anzahl der KalenderTage des Bereichs ein griffiger Name zugewiesen.
Jetzt müssen wir aus den Kalendertagen die Zahl der Tage ohne Kurs herausrechnen, im Normalfall also Samstage + Sonntage. Also pro Kalenderwoche (alle 7 KTage) 2 Tage abziehen. Das Ergebnis sind die Börsentage BT. ( Siehe Anmerkung unten )
BT_Bereich:= KT_Bereich - (Int(KT_Bereich / 7) * 2);
Im Einzelnen: "KT_Bereich / 7" teilt die Anzahl der KalenderTage im Bereich durch 7 und ergibt die Zahl der Wochen.
"Int(KT_Bereich / 7)" schneidet die Kommastellen weg. 10 KT sind dann eben 1 Woche und nicht 10/7 = 1,428 Wochen.
Die Wochenzahl wird dann mit 2 multipliziert, weil pro Woche mit Samstag und Sonntag im Normalfall 2 KalenderTage abgezogen werden müssen.
Dann müssen noch die verstrichenen Tage "Ende" bis heute ( = "SystemDate()" ) errechnet werden. Wichtig sind hier wieder die BörsenTage = Kurstage ohne Sams- und Sonntage.
Das fertige Ergebnis für die Max-Kurse eines zu wählenden Zeitbereiches sieht dann so aus (kannst du einfach kopieren und im Formeleditor einfügen):
Anfang:= Para1; // das Startdatum des gewünschten Bereichs Ende:= Para2; // das Enddatum heißt sinnigerweise jetzt "Ende"
KT_Bereich:= Ende - Anfang + 1; //ergibt die Anzahl der KalenderTage im Bereich BT_Bereich:= KT_Bereich - (Int(KT_Bereich / 7) * 2); //liefert die BörsenTage im Bereich, indem pro KW 2 Tage abgezogen werden
KT_verflossen:= SystemDate() - Ende; // Zahl der vergangenen KalenderTage seit Ende des Bereichs BT_verflossen:= KT_verflossen - (Int(KT_verflossen / 7) * 2); // die Wochenendtage werden abgezogen, ergibt die BörsenTage
Result:= Ref(HHV(Close,BT_Bereich),-BT_verflossen) // zeigt den höchsten Schlußkurs im gewählten Bereich
Für den Minimalwert im Bereich eine neue Spalte definieren und "HHV" im Result:= gegen "LLV" austauschen. Rest bleibt gleich.
Wenn du beim Formeltest eine Fehlermeldung kriegst, hast du wahrscheinlich vergessen, die beiden Parameter zu definieren. Siehe oben. Falls das alte "Result := "";" vom ursprünglichen Eingabefenster steht noch drunter steht, das muß weg.
Anm. zum Rausrechnen der Sams-und Sonntage: Das ist eine pauschale Möglichkeit, die kursfreien Tage abzuziehen. Eine Ungenauigkeit bleibt aber: Jeder kursfreie Werktag (Feiertag) im Zeitraum verschiebt den "ausgelesenen" Bereich um einen Tag in die Vergangenheit, weil er in der Berechnung nicht erfaßt ist. Die HHV-/LLV-Funktion wie auch die Ref-Funktion zählen nur die Anzahl der Kursdaten = Börsentage, nicht die Kalendertage. Je weiter der Bereich zurückliegt, umso mehr macht sich die Abweichung bemerkbar. Wenn ich z.B. den Bereich 1.1.11 bis 31.1.11 auswerten möchte, werden Min- oder Max-Kurse angegeben, die noch Ende Dezember 2010 liegen können.
Genaue Ergebnisse würde man bekommen, wenn man mit der "barssince()"-Funktion oder einer vergleichbaren die genaue Anzahl der Kurstage seit dem Start- und Endedatum auslesen könnte. Dann könnte man die Rechnerei mit den Kalender-/ Börsentagen ganz vergessen.
Hab ich leider nicht hinbekommen, vielleicht hat jemand einen Tip...
Frohes Weitertüfteln,
Michael
|
|
Gruppen: Kunde
Beiträge: 72
|
Hallo Michael,
ich danke dir für deine Fleißarbeit. Ich bewundere solche Menschen wie dich, die trotzdem einen Weg suchen und finden. Auch, wenn es ganz sicher einfachere Lösungen gibt (nämlich Direkteingabe der zwei "Datums").
Trotzdem: ich habe diese Lösung in mein Programm übernommen. Es bringt brauchbare Ergebnisse, wenngleich durch Fortschreiten der Zeit und für andere Märkte die Formel immer mal wieder angepasst werden muss.
Aber, alle Dinge dieser Welt sind verbesserungswürdig, -fähig. Was sagt L&P??
Beste Grüße KK
PS: Zukünftig kannst du bei mir voraussetzen, wie Formeln einzubinden sind (Großteil deines Beitrages).
|
|
Gruppen: Kunde
Beiträge: 104
|
Hallo Klaus,
ich hatte auch überlegt, ob ich das drumrum weglasse. Mir persönlich ist es aber lieber, wenn ich ein Problem habe, daß ich nicht nur an die Lösung komme, sondern wenns geht auch den Weg dahin verstehe. Ich weiß noch gut, daß selbst solche Sachen wie neue Spalten erstellen mich am Anfang mit Tai-Pan viel Zeit und Nerven gekostet haben. Andere fangen vielleicht auch grade an und sind froh, wenns ausführlicher beschrieben ist.
Viele Grüße,
Michael
|
|
Gruppen: Kunde
Beiträge: 371
|
Hallo Michael,
ganz allgemein umgeht man den den Kalender durch Verwendung einer Close-Reihe. Diese enthält alle bisherigen Börsentage. Feiertage und Wochenendtage sind nicht mehr enthalten. Man rechnet über den Index.
Grüße
|
|
Gruppen: Kunde
Beiträge: 104
|
Hallo Taxus, machs doch bitte konkret. Ich hab mit den verschiedenen Funktionen hin und her überlegt und bin zu keinem besseren Ergebnis gekommen. Daran ist aber eher mein begrenzter Horizont schuld als die Formelsprache von Tai-Pan . Über eine konkrete Zählfunktion der vorhandenen Kurse seit einem gegebenen Datum würde ich mich aus reinem Interesse schon freuen, und Klaus könnte seine Formel noch etwas verfeinern... Gruß Michael
|
|
Gruppen: Kunde
Beiträge: 104
|
@ taxus, hat sich erledigt, danke für den Tip mit dem Index. Das war genau das, was ich gesucht hatte / @ Klaus, mit dieser Formel paßt es jetzt wirklich taggenau, egal wie weit zurück der Zeitraum liegt. Anfang:= Para1; // erstes Datum des Bereichs Ende:= Para2; // letztes Datum des Bereichs heute:= SystemDate(); // aktuelles Datum Bereich:= IndexofDateTime(C,Ende,0) - IndexofDateTime(C,Anfang,0) + 1; // Anzahl Kurstage im Bereich vergangen:= IndexOfDateTime(C,heute) - IndexOfDateTime(C,Ende) - 1; // vergangene Kurstage seit Folgetag des Enddatums Result := Ref(HHV(Close,Bereich),-vergangen); // höchster Schlußkurs im Bereich Und wieder was dazugelernt / Michael
|
|
Gruppen: Kunde
Beiträge: 72
|
Hallo Michael,
so allmählich kommen wir der Sache schon näher. Die Formel ist gut, aber nicht perfekt. Sie gibt auch Werte aus, wenn das Wertpapier in der angegebenen Zeitspanne (noch) gar nicht existiert. Das darf unbedingt nicht sein!
Jedoch dieses einzupflegen dürfte für dich Experten aber keine so große Hürde sein. Lass' von dir hören.
Beste Grüße Klaus
|
|
Gruppen: Kunde
Beiträge: 104
|
Hallo Klaus,
ich bin alles andere als ein Experte, aber interessiert an solchen Problemen.
Sag mir bitte genau, wo du einen Fehler entdeckt hast. Ich habe die Formeln für den Min + den Max-Wert bei etwa 10 verschiedenen Aktien in 2 Zeitbereichen durchgetestet (1.1.12 - 31.1.12 und 1.1.10 - 31.1.10).
Sowohl Min- als auch Max-Werte haben bei allen Aktien auf den Tag genau gestimmt. Knackpunkt sind immer die Tiefst- oder Höchstwerte, die direkt am Anfang oder am Ende des Zeitraums auftreten. Wie gesagt, keine Fehler bei mir.
Gruß Michael
|
|
Gruppen: Kunde
Beiträge: 72
|
.....ja, ermittle mal die Extrema der Jahre 2007/2008 in einem Katalog. Dann bringt die Formel auch Werte für jene Papiere, deren Kurse erst 2009 beginnen. Das ist natürlich falsch/lästig.
MfG KK
|
|
Gruppen: Kunde
Beiträge: 104
|
Stimmt, das darf nicht sein.
Nimm das:
Anfang:= Para1; // erstes Datum des Bereichs Ende:= Para2; // letztes Datum des Bereichs heute:= SystemDate(); // aktuelles Datum Bereich:= IndexofDateTime(C,Ende) - IndexofDateTime(C,(Anfang-1)); // Anzahl Kurstage im Bereich vergangen:= IndexOfDateTime(C,heute) - IndexOfDateTime(C,Ende); // vergangene Kurstage seit Folgetag des Enddatums
Result := Ref(HHV(Close,Bereich),-vergangen); // höchster Schlußkurs im Bereich
und das
Anfang:= Para1; // erstes Datum des Bereichs Ende:= Para2; // letztes Datum des Bereichs heute:= SystemDate(); // aktuelles Datum Bereich:= IndexofDateTime(C,Ende) - IndexofDateTime(C,(Anfang-1)); // Anzahl Kurstage im Bereich vergangen:= IndexOfDateTime(C,heute) - IndexOfDateTime(C,Ende); // vergangene Kurstage seit Folgetag des Enddatums
Result := Ref(LLV(Close,Bereich),-vergangen); // niedrigster Schlußkurs im Bereich
Besser?
Gruß Michael
|
|
Gruppen: Kunde
Beiträge: 72
|
Michael schrieb:Hallo Klaus, ich bin alles andere als ein Experte, aber interessiert an solchen Problemen. Gruß Michael Jedenfalls bist du ein GROßER für mich. Alles bestens, wie gewünscht. Danke.
Beste Grüße Klaus
|
|
Gruppen: Kunde
Beiträge: 104
|
Freut mich, daß es jetzt klappt!
Michael
|
|
Guest |