Einloggen Suche | Aktive Themen
Datum in Liste ermitteln Optionen
Norbert
Geschrieben: Tuesday, January 6, 2015 5:38:23 PM
Gruppen: Kunde

Beiträge: 3

Hallo zusammen,

in einer Listenspalte habe ich den Abstand vom Kursmaximum der letzten 200 Tage eingetragen und möchte nun das dazugehörige Datum (des Kursmaximums) ermitteln und in die nächste Spalte eintragen.
Die Datumsermittlung macht mir allerdings Probleme. Für eine Hilfestellung wäre ich deshalb dankbar.

Gruß
Gerd-2
Geschrieben: Tuesday, January 6, 2015 6:59:43 PM
Gruppen: Kunde

Beiträge: 3

Hallo Norbert,
Eine ähnliche Aufgabe hatte ich mir vor kurzem auch schon gestellt.
In meinem Fall habe ich das Kursminimum (oder Kursmaximum) in einem
wählbaren Bereich ermittelt, in einer Listenspalte angezeigt und wollte in
der zweiten Listenspalte das Datum des jeweiligen Kursminimums ausgeben.
Leider konnte ich das Problem auch nicht lösen.
Wenn ich es richtig verstanden habe, ist das Datum in einer Arrayvariablen
gespeichert. Um die Arrayvariable zu bestimmen, wird der Index des Arrayplatzes
benötigt. Und dies erfordert anscheinend ziemlich gute Kenntnisse des Programms.
Vielleicht bekommen wir jetzt Hilfe von Lesern mit fortgeschrittenen Kenntnissen
oder von den Entwicklern.
Von Zeit zu Zeit werde ich hier mal nachsehen.
Noch ein kleiner Hinweis: Gibt man in einer Listenspalte den Wert eines Indikators
(z.B. Momentum) an, so kann man in einem Abfragekästchen durch ein Häckchen
die Anzeige des Datum aktivieren. Das Datum wird dann in der gleichen Listenspalte
vor dem Indikatorwert angegeben.
Im Einstellungsmenü für die Listenspalte "Kursmaximum ... " fehlt diese Einstellmöglichkeit jedoch.
(Hoffe das ich jetzt nichts falsches behauptet habe, weil ich die Angaben noch aus der Erinnerung
gemacht habe.)
Viele Grüße
Gerd-2
Norbert
Geschrieben: Tuesday, January 6, 2015 10:26:09 PM
Gruppen: Kunde

Beiträge: 3

Hallo Gerd-2,

zunächst vielen Dank für die Antwort.

Vielleicht ist das Problem mit den vordefinierten Listenfeldern nicht zu lösen und eine Formel erforderlich.

Gruß Norbert
Steffen Vohswinkel
Geschrieben: Thursday, January 8, 2015 1:12:52 PM

Gruppen: Kunde

Beiträge: 371

Tai-Pan End-of-Day
{Formel KursMAXMIN}
// Bestimmung des KursMAXMIN in einem bestimmten Zeitraum mit Datum
// Test

debug
a0 := Count(C); // liefert Anzahl der Close-Werte
a1 := Date(); // liefert ein Array mit Datumswerten und zeigt Daten an
a2 := a1[7000]; // liefert für Index den Datumswert, hier als Beipsiel nur zur Ansicht
a3 := DateToStr(a2); // liefert für den Datumswert das Datum als Zeichenkette
KursMAX := HHV(C, 10); // liefert den MAX Closewert der letzten 10 Perioden Achtung: dieser könnte auch mehrfach vorkommen
a4 := FindPREV(C,7005,LastValue(KursMAX)); // liefert den Indexwert für das MAXimum
Result := KursMAX;
debug

{
Hinweise:
1. Auf das Datum kann man in der Tai-Pan Formelsprache nicht direkt zugreifen.
In der Formelsprache wird für jedes Datum ein Datumswert erzeugt.
Den kann man sich anzeigen lassen.
2. Es gibt auch keine Funktion zur Anzeige eines MAX/MIN innerhalb eines
gewünschten Zeitraumes. Will man ein MAX/MIN innerhalb eines Zeitraumes
innerhalb einer Kursreihe(Array) finden, muß man diesen durch einen Periodendurchlauf
innerhalb des gewünschten Zeitraumes finden und das Datum wie oben beschrieben ermitteln.
Das Programm-Beispiel oben soll die einzelnen Funktionen und deren Anwendung
erläutern. Es ist keine Lösung, aber so könnte man vorgehen.}

Schöne Neujahrsgrüße
Steffen
Gerd-2
Geschrieben: Friday, January 9, 2015 12:31:36 AM
Gruppen: Kunde

Beiträge: 3

Hallo Norbert, Hallo Herr Vohswinkel,

Die Aufgabe ist nach Anregung durch ein Beispiel
aus dem Handbuch zur Filterentwicklung von S. Vohswinkel, Seite 19
und ergänzend TaiPan Formelsprache Referenzhandbuch Seite 39
mit nachfolgendem Programmcode gelöst worden.


TagesBereich:= 10;
// Der Auswertebereich umfaßt 10 Tage

TageVomEnde:= 5;
// Die letzten 5 Tage gehören nicht mehr zum Auswertebereich
// Wenn TageVomEnde = -0, dann einschließlich letzter Tag, wenn = -1, dann bis Vortag
// Wenn TageVomEnde = -2, dann Auswertebereich endet vor 2 Tagen usw.

MaxCKurs := Ref(HHV(C,TagesBereich),-TageVomEnde);

// MaxCKurs wird mit HighestHighValue (HHV) ermittelt und ist der höchste C(lose)Kurs
// innerhalb eines 10 tagelangen Bereiches, der 10+5 = 15 Tage vor dem letzten Kurs beginnt
// und 5 Tage vor dem letzten Kurs endet.

IndexLetzter := Count(C);
// liefert Anzahl der Close-Werte = entsprechend dem Zahlenwert des höchsten Indices'.

AlleDatumswerte := Date();
// Die Arrayvariable AlleDatumswerte wird mit den Datumswerten belegt.

ZielIndex := FindPrev(C,IndexLetzter, LastValue(MaxCKurs));

// FindPrev findet im Array der C(lose)-Werte,
// beginnend beim Wert mit dem ersten Index (Angabe nicht nötig und nicht möglich ?)
// bis zum Wert mit dem letzten Index IndexLetzter
// den letzten? (prevailing = maßgebenden, ausschlaggebenden ?) Index
(= ZielIndex) beim Vergleich
// der C(lose)-Werte mit dem Wert MaxCKurs.

ZielDatum := AlleDatumswerte[ZielIndex];

// Die Variable ZielDatum erhält den Wert des Datums mit dem Zielindex im internen Datumsformat
// Wichtig: Wenn man im obigen Ausdruck runde, statt eckige Klammern schreibt, dauert die Lösung der
// Aufgabe deutlich länger und kostet mehr Nerven. lachen !

Anzeigedatum := DateToStr(ZielDatum):

// Das Datum wird jetzt in das anzeigenübliche (String-)Format umgewandelt.

Result := Anzeigedatum
// Das Datum wird in lesbarem Format in der Listenspalte angezeigt.


Das vorstehende Programm gibt das gewünschte Datum in der zweiten Spalte aus.
Den gesuchten Max-Wert kann man mit einem Teil des Programms errechnen, der die ersten Zeilen bis MaxCkurs := …
und zusätzlich
Result := MaxCKurs enthält.

Hinweis: Die Fehlerfreiheit des Programm ist noch nicht ausreichend kontrolliert. Bitte melden, wenn Fehler entdeckt werden.

(Ohne die Tipps hätte ich die Lösung nicht gefunden, Danke!!
- gehe jetzt schlafen)

Viele Grüße von Gerd-2




Steffen Vohswinkel
Geschrieben: Friday, January 9, 2015 12:43:09 PM

Gruppen: Kunde

Beiträge: 371

Tai-Pan End-of-Day
Hallo Gerd-2,

vielen Dank.
Grad wollte ich noch eine Möglichkeit ergänzen:
Es gibt noch die Funktion DateAt().

In meinem Beispiel könnte man folgende Zeile noch ergänzen und zwar wieder nur zur
Anwendungsinfo.

a4 := DateAt(C, 7000); // liefert Datum als im Datenformat Date zur Indexposition

Schöne Grüße
Steffen
Norbert
Geschrieben: Saturday, January 10, 2015 11:00:42 AM
Gruppen: Kunde

Beiträge: 3

Hallo Gerd-2, Hallo Herr Vohswinkel,

vielen Dank für die Unterstützung.

Jetzt funktioniert es. Allein hätte ich es vorerst nicht geschafft.

Viele Grüße
Norbert
Gerd-2
Geschrieben: Saturday, January 10, 2015 7:12:46 PM
Gruppen: Kunde

Beiträge: 3

Nachtrag – Fehlerberichtigung

Hallo Norbert, Hallo Herr Vohswinkel,

beim Test des Programms ist mir ein Fehler aufgefallen, der in selteneren Fällen bei der Auswertung eines Kursbereiches auftreten kann. Er kann umso häufiger auftreten, je weiter der Kursbereich vor dem Ende der gesamten Kursreihe liegt.

Dieser Fehler wird durch die folgende Zeile

IndexBereichEnde := IndexLetzter - TageVomEnde;

und die Verwendung der Variablen IndexBereichEnde

in der Funktion FindPrev korrigiert.


ZielIndex := FindPrev(C,IndexBereichEnde, LastValue(MaxCKurs));
// FindPrev findet im Array der C(lose)-Werte,
// beginnend beim Wert mit dem ersten Index (Angabe nicht nötig und nicht möglich ?)
// bis zum Wert mit dem Index IndexBereichEnde
// den letzten? (prevailing = maßgebenden, ausschlaggebenden ?) Index (= ZielIndex)beim Vergleich
// der C(lose)-Werte mit dem Wert MaxCKurs.


Außerdem kann es vorkommen, daß die Datumspalte bei einem Wert kein Datum erhält oder ein Datum angezeigt wird, daß vor dem Auswertebereich liegt.
Als Ursache für den ersten Fall vermute ich, daß mehr als einmal durch FindPrev Gleichheit festgestellt wurde.

Herr Vohswinkel hatte dies in den Hinweisen schon angedeutet.

Die Ursache für den zweiten Fall, könnte darauf zurückzuführen sein, dass FindPrev den Bereich von Index 1 bis IndexBereichEnde prüft und den ersten Index ausgibt, für den Gleichheit feststellt wird.
Falls dies richtig ist, kann ich den Fehler nicht korrigieren, falls FindPrev den Start- (bzw. End-)index intern bestimmt und nicht bei der Übergabe erhalten kann.
Ich denke man kann dies zunächst mal tolerieren.
Bis zum Auftauchen der nächsten Überraschungen wünsche ich viel Spaß ( habe ich auch gehabt ).
Viele Grüße
Gerd-2
Steffen Vohswinkel
Geschrieben: Sunday, January 11, 2015 11:40:51 AM

Gruppen: Kunde

Beiträge: 371

Tai-Pan End-of-Day
Hallo Gerd-2 und alle Interessentinnen und Interessenten,

also ich korrigiere mich gerne und habe nochmal nachgeschaut was da genau passiert mit dem FindPrev.
Euch liegt zumindest die Tai-Pan-Formelsprache von L+P vor.
Das steht:
"FindPrev(Data:Atrray; LastPos: Integer; Value: Double=1.0):Integer
Sucht das vorherige Vorkommen von Value im Array Data vor der letzten Position LastPos.
Mit LastPos =-1 wird die Suche am Ende des Arrays data gestartet.
Gibt 1 bis Count (Data) für eine gefundene Positin zurück, sonst 0."

Also mit FindPrev wird nur nach dem Vorkommen des eingestellten Wertes im Array gesucht und mehr nicht. Sorry, daß ich das nicht einfach richtig geprüft habe.
Für die Aufgabe zur Suche des MAX/MIN in einem Berich geht das mit FindPrev nicht.

Bemerkt habe ich es erst, als ich eine zweite FindPrev-Anweisung eingefügt und dann im Debugger nachgeschaut habe. Das kann ich immer wieder nur empfehelen. So steigt man am besten und am schnellsten hinter die TPF.

Ich würde also sagen, es muß der Bereich Periode für Periode durchsucht werden.

Schöne Grüße
Steffen
Benutzer die diese Diskussion aktuell lesen
Guest

Powered by Yet Another Forum.net version 1.9.1.8 (NET v4.0) - 3/29/2008
Copyright © 2003-2008 Yet Another Forum.net. All rights reserved.

Durch die Nutzung der Webseite stimmen Sie der Verwendung von Cookies zu. Weitere Informationen zum Datenschutz finden Sie hier