Hallo Anke,
wow für diese Antwort mit den Grafiken.
Im Prinzip will ich schon genau das machen was Dur beschrieben hast und "würde" das auch genau so machen. Da ich nicht genau weiß wie die Lösung aussieht nach der ich suche war meine Erklärung auch nicht punktgenau in der Hinsicht,
dass Du völlig recht hast es geht nämlich ohne VBS (siehe Edit). Um Code übersichtlicher zu schreiben mag ich es Datumsangaben in Variablen zu speichern. Wenn ich in IV eine Zeitspanne dann erst berechnen lassen will, die ich dann wieder einsetzen kann ich nach Deinem Code z. B. schreiben:
|
Quellcode
|
1
2
3
4
5
6
|
global calc DatumAnfang: DateMark(24, 05, 2016, 0, 0);
global calc DatumEnde: DateMark(17, 12, 2017, 0, 0); //bis zu dem Datum wird Korr ber
global calc Zähler: CUM(close<>0);
global calc Laufzeit1: ValueWhen(Zähler, DatumEnde=1, 1, V)-ValueWhen(Zähler, DatumAnfang=1, 1, V);
|
Der Code produziert als Endziel eine Differenz zwischen 2 Datumgsgaben gemessen in Perioden bei mir aktuell die Zahl: "232". Dieser Code hat allerdings den Nachteil, dass hier sehr viel unnötiger Speicherplat belegt wird (das meinte ich mit "verschwenderisch). Geht man vom Extremfall aus, dass man 20 Jahre EOD-Daten hat, belegt:
DatumAnfang: ca. 5000 Datenfelder weil Zeitreihe
DatumEnde: 5000 Datenfelder
Zähler: 5000Datenfelder
Laufzeit1: Berechnung wird 5000mal ausgeführt, belegt 5000 Datenfelder
Das ist etwas einen Milchmädchenrechnung/worst case und übertreibt wahrscheinlich etwas weil ich nicht weiß wie IV das genau handelt mit Laufzeit weil das nur zwischen zwei Datenpunkten berechnet werden muss, aber irgendwie denke ich dass das ja zumindest in jedem Zeitpunkt überprüft werden muss wegen Datemark .
Man kann jetzt auch argumentieren, dass Datum Anfang & Ende + Zähler gleich eingesetzt werden können in VW, richtig das spart Platz, geht aber auf Kosten der Übersichtlichkeit. Was bleibt ist das je nach Berechnungsmethode mindestens 5000mal bis (so wie ich es eigentlich gerne schreiben würde): 20.000 mal etwas in einem Array gespeichert werden muss (und 5000 mal berechnet) für eine Datumsdifferenz die "eigentlich" eine Konstante ist.
Zum Vergleich in Excel wäre das so aufgebaut
DatumAnfang= 1Zelle= 1 Wert
DatumdEnde=1 Zelle = 1Wert
Laufzeit1= DatumAnfang- DatumEnde = 1 Berechnung/1Datenfeld
In der Summe also 3 Datenfelder belegt und 1 Berechnung, fertig vs. 20.000 Datenfelder belegt und 5000Berechnungen.
Deswegen bin ich häufig dazu übegangen Datumsdifferenzen in Excel zu berechnen und dann einzusetzen.
für die Lesbarkeit von Code wäre es allerdings schöner wenn das alles in IV geschieht.
Der 2. Nachteil von dem Code oben ist, dass die Variable Laufzeit1, eine Variable ist.
Das stimmt ich kann diese Variable in den Indikator Correl z. B. einsetzen. Edit: Nein das geht nicht und produziert einen Typfehler. Ende Edit. Ich meine aber dass ich in der Vergangenheit häufiger einen Typfehler bekommen habe, dass dieser für Parameter den Wert einer Konstanten erwartet.Ich meine das auch gelesen zu haben, dass Indikatoren in IV "normalerweise" Konstanten für Parameter erwarten. Ich weiß jetzt nicht ob sich das mit IV 7 generell geändert hat oder nur bei Correl funktioniert.
Zusammenfassung: Gibt es nich einen Weg in IV das mehr wie in "Excel" zu berechnen? Also Datum1= Konstante - Datum2=Konstante Laufzeit1 wird berechnet und dann =Konstante gespeichert und die Konstante kann ich ja dann auch in allen Indikatoren einsetzen.
Hoffe ich habe mich klarer ausgedrückt, ist aber auch nicth so einfach das ganze zu erklären, da ich ja wie gesagt auch nicht genau weiß wie eine Lösung aussehen könnte bzw. ob das so überhaupt in IV geht....
Lieben Gruß an Dich Anke
Edit:Kam erst jetzt dazu es nochmal nachzuprüfen, es ist doch so dass in Correl für Laufzeit1 ein Typfehler kommt. Es ist doch so wie im Eingangsposting beschrieben Man muss also doch den Umweg über _vbs_const gehen um die anzahl der Perioden berechnen zu lassen.
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »LowTrader« (15. August 2019, 20:36)