Freitag, 19. April 2024, 01:53 UTC+2

Sie sind nicht angemeldet.

  • Anmelden
  • Registrieren

Lenzelott Männlich

Experte

Registrierungsdatum: 30. Dezember 2002

Beiträge: 3 051

Wohnort: Giessen

21

Dienstag, 12. August 2008, 12:01

Potblitz Anke,
vielen Dank für den Hinweis.

Gerade umgestellt, leider kommt dann aber als Ergebnis:
"Die Formel kann nicht berechnet werden
Indikator Barssince
liefert kein Ergebnis ..."



Wobei ich im HS Daten von 1999 bis 2008 habe.

Allerdings nur, da ich ersterwert von -1 testweise auf 0 umgestellt hatte.

Mit -1 kommt folgendes Ergebnis heraus:


Ersterwert rollt quasi nicht rückwerts mit.
If you think it´s expensive to hire a professional, wait until you hire an amateur.

Wiwu Weiblich

Experte

Registrierungsdatum: 4. September 2002

Beiträge: 1 752

Wohnort: Neuenhagen b. Berlin

22

Dienstag, 12. August 2008, 12:21

Hallo,

Zitat

Ersterwert rollt quasi nicht rückwerts mit.




Anstelle von "Ersterwert" könntest du z.B. auch verwenden:

calc Tag: ValueWhen(DatePart(d),kapital<>#_keinwert#,1,V);

Ich kann deine Formel derzeit aber leider nicht selbst testen und weiß deshalb nicht, ob die restliche Berechnung damit funktioniert.
Falls nicht, teste am besten mal Step-by-Step bis zu welchem Zwischenschritt alles noch wie gewünscht klappt, dann lässt sich der Fehler leichter lokalisieren.
Viele Grüße von Anke

http://www.ascunia.de

Lenzelott Männlich

Experte

Registrierungsdatum: 30. Dezember 2002

Beiträge: 3 051

Wohnort: Giessen

23

Dienstag, 12. August 2008, 16:09

Hallo Anke,

teste ich gleich mal aus.

Ich hab´s zwischendurch auch mal mit VB probiert.
Das ist aber so unfassbar langsam, wenn man 300.000 Perioden im HS hat, da kommen einem die Tränen und Investox spuckt auch ne Fehlermeldung aus, weil die Berechnung so lange dauert. "Script Control: The script you are excecuting is taking longer than expected. ..."

Quellcode

1
2
3
4
5
6
7
8
9
10
11
Dim i,j
Dim Datumsfeld
getdatum Datumsfeld
for i= 1 to alleperioden
 for j= i to 1 step -1
   if   datumsfeld(j)<(datumsfeld(i)-365) then 
     ergebnis(i)=(daten(i)/daten(j)-1)*100
	 exit for
   end if
 next
next
If you think it´s expensive to hire a professional, wait until you hire an amateur.

Lenzelott Männlich

Experte

Registrierungsdatum: 30. Dezember 2002

Beiträge: 3 051

Wohnort: Giessen

24

Dienstag, 12. August 2008, 16:29

calc Tag: ValueWhen(DatePart(d),kapital<>#_keinwert#,1,V);


klappt leider nicht.
Barssince liefert dann kein Ergebnis. Habe mich gefragt, warum das so ist und bin in der Hilfe fündig geworden:

"Mit diesem Schlüsselwort können Bereiche gekennzeichnet werden, in denen die mit #_StopLevel# berechnete Anzeige des Stops im Chart unterdrückt werden soll. Das Schlüsselwort entspricht intern dem Wert -1234567."

-1234567 als Kapitalstand taucht bei mir zum Glück nicht auf.
If you think it´s expensive to hire a professional, wait until you hire an amateur.

Wiwu Weiblich

Experte

Registrierungsdatum: 4. September 2002

Beiträge: 1 752

Wohnort: Neuenhagen b. Berlin

25

Dienstag, 12. August 2008, 21:35

Hallo ,

Zitat

Barssince liefert dann kein Ergebnis.


Wo genau in deinem Code verwendest du denn "Barssince" ? Ich konnte es in den bisherigen Postings nicht finden ?

#_keinWert# kann auch ohne das Schlüsselwert #_Stoplevel# in Berechnungen verwendet werden.
Es entspricht dem "novalue" in Visual Basic.
Die KK muss nicht den internen Wert -1234567 annehmen, damit die Berechnung ein Ergebnis liefert.
Ein Ergebnis wird im vorliegenden Fall auch angezeigt, wenn der nächste Wert der KK noch unbekannt ist.
Dann wird der Tag des Monats als Ergebnis ausgegeben, an dem die KK letztmalig einen Wert anzeigt (in der Grafik unten also der 12.)
»Wiwu« hat folgendes Bild angehängt:
  • Formel.GIF
Viele Grüße von Anke

http://www.ascunia.de

Lenzelott Männlich

Experte

Registrierungsdatum: 30. Dezember 2002

Beiträge: 3 051

Wohnort: Giessen

26

Dienstag, 12. August 2008, 23:02

Hallo Anke,

sorry, ich habe aufgrund der Fehlermeldungen bisschen weiter rumexperimentiert gehabt mit barssince statt valuewhen.
Leider ist das Ergebniss das selbe.

Also hier der Code, den ich aktuell benutze:

Quellcode

1
2
3
4
5
6
7
calc kapital:Datenreihe(#kapitalkurve#);
calc jahr:ValueWhen(DatePart(yyyy),kapital<>#_keinwert#,1,V);
calc monat:ValueWhen(DatePart(m),kapital<>#_keinwert#,1,V);
calc tag:ValueWhen(DatePart(d),kapital<>#_keinwert#,1,V);
calc datum:DatePart(yyyy)*12*31+DatePart(m)*31+DatePart(d);
calc suchdatum:(jahr-1)*12*31+monat*31+tag;
ValueWhen(kapital,datum<=suchdatum,1,v)


und hier die Fehlermeldung:



ich bin traurig :(
If you think it´s expensive to hire a professional, wait until you hire an amateur.

Wiwu Weiblich

Experte

Registrierungsdatum: 4. September 2002

Beiträge: 1 752

Wohnort: Neuenhagen b. Berlin

27

Mittwoch, 13. August 2008, 00:18

Hallo Lenzelott,

das Problem liegt in deiner Berechnung von "Datum" und "Suchdatum".
Wenn du beide Teilberechnungen chartest, wirst du sehen, dass der Wert deiner Berechnung "Datum" an jedem Punkt der Zeitreihe größer ist, als der Wert der Berechnung "Suchdatum".
Die letzte Zeile deiner Berechnung

ValueWhen(kapital,datum<=suchdatum,1,v)

wird deshalb nie wahr.
Das ist der Grund für die Fehlermeldung.
Viele Grüße von Anke

http://www.ascunia.de

Lenzelott Männlich

Experte

Registrierungsdatum: 30. Dezember 2002

Beiträge: 3 051

Wohnort: Giessen

28

Mittwoch, 13. August 2008, 07:13

Deswegen habe ich ja auch versucht mit ersterwert zu arbeiten. Dann passiert genau das nämlich nicht.
Allerdings liefert die Funktion mir immer nur die wirklich letzte Periode des Systemes und daher kommt nicht das gewünschte Ergebnis raus.

Das Problem dass ich habe, liegt darin beründet dass ich das Datum der aktuellen Periode "einfrieren" muss für die valuewhen Abfrage des historischen 12 Monatswertes der KK, ansonsten passiert genau das was Du oben beschreibst.
valuewhen geht einen periode zurück und vergleicht die beiden Variablen, die sich aber dann beide verändert haben und ich finde nichts.
If you think it´s expensive to hire a professional, wait until you hire an amateur.

Investox

Administrator

Registrierungsdatum: 31. August 2002

Beiträge: 5 680

29

Mittwoch, 13. August 2008, 10:48

Hallo,

m.E. geht das 1:1 nur in einem VBScript. Dort könnte man die Rechenzeit deutlich verkürzen, wenn man die Suche nach dem Referenzpunkt optimiert (also nicht Periodenweise absuchen, sondern erst in gröberen, dann in feineren Schritten).

Begnügt man sich bei den Referenzpunkten z.B. mit Monatswechsel könnte man es mit einem Konstrukt wie folgt umsetzen:

calc Kapital: Datenreihe(#Kapitalkurve#);
calc Monatswechsel: ROC(DatePart(y), 1, $)<>0;
calc Perioden: -BarsSince(monatswechsel, 12);
(Kapital / RefVar(Kapital, Perioden) - 1) * 100

Viele Grüße

Andreas Knöpfel

Lenzelott Männlich

Experte

Registrierungsdatum: 30. Dezember 2002

Beiträge: 3 051

Wohnort: Giessen

30

Mittwoch, 13. August 2008, 11:02

Hallo Herr Knöpfel,

vielen danke für die Antwort.
Ich hab´s fast befürchtet.
Dann werde ich mal versuchen den VB Code zu beschleunigen.

Ansonsten wäre es nicht schlecht, wenn man für solche Fälle eine Funktion hat, die aus einer Zeitreihe einen Wert macht (den der aktuellen Periode). Ähnlich wie ersterwert, halt nur aktuellerwert.

Dann könnte man solche Dinge sehr einfach mit datemark lösen.
Es gibt bestimmt noch andere Anwendungsfälle bei denen die Funktion hilfreich ist.
If you think it´s expensive to hire a professional, wait until you hire an amateur.

Wiwu Weiblich

Experte

Registrierungsdatum: 4. September 2002

Beiträge: 1 752

Wohnort: Neuenhagen b. Berlin

31

Mittwoch, 13. August 2008, 11:48

Hallo Lenzelott,

Herr Knöpfel hat ja schon eine mögliche Lösung gepostet.
Mein Lösungsvorschlag auf Basis deines bisherigen Codes hätte ähnlich ausgesehen - ich schieb ihn nur der Vollständigkeit halber noch nach:

calc kapital:Datenreihe(#kapitalkurve#);
calc jahr:ValueWhen(DatePart(yyyy),kapital<>#_keinwert#,1,V);
calc monat:ValueWhen(DatePart(m),kapital<>#_keinwert#,1,V);
calc tag:ValueWhen(DatePart(d),kapital<>#_keinwert#,1,V);
calc datum:DatePart(yyyy)*12*31+DatePart(m)*31+DatePart(d);
calc suchdatum:(jahr-1)*12*31+monat*31+tag;
calc diff: datum-suchdatum;
(Kapital / RefVar(Kapital, - diff)-1) * 100
Viele Grüße von Anke

http://www.ascunia.de

Lenzelott Männlich

Experte

Registrierungsdatum: 30. Dezember 2002

Beiträge: 3 051

Wohnort: Giessen

32

Mittwoch, 13. August 2008, 15:36

Und so sieht das mit VB aus.
Funktioniert sogar "halbwegs" performant bei 300.000 Perioden.
Die Suchfunktion ist an Quicksort angelehnt.
Da der Datenbereich schon sortiert ist wird dieser solange halbiert und jeweils die richtige Hälfte zur weitersuche ausgewählt bis man beim Suchergebnis angekommen ist.
Eigentlich dürfte es keine Suchfunktion mit weniger Schritten geben.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Dim i,suchschritt
Dim Datumsfeld


getdatum Datumsfeld

lookback=365  ' wieviel Tage zurückschauen
Startindex = ErsteDatenPeriode(Daten)
Endindex = LetzteDatenPeriode(Daten)
ergebnis(startindex)=0

for i=startindex  to endindex 
  
suchschritt=1
linker_rand=startindex
rechter_rand=i
if (datumsfeld(linker_rand)> (datumsfeld(i)-lookback)) then
    ergebnis(i)=0
else 
do 
  mitte=int((linker_rand+rechter_rand)/2)
  if (datumsfeld(mitte)> (datumsfeld(i)-lookback)) then
    ' der Wert liegt links der Mitte -> es wird die linke Hälfte zur Suche weiter benutzt
    	rechter_rand=mitte
  else
    ' der Wert liegt rechts der mitte -> es wird die rechte Hälfte zur Suche weiter benutzt
        linker_rand=mitte
  end if
  suchschritt=suchschritt+1	 
loop until (rechter_rand-linker_rand)=1 or 2^(suchschritt-1)>i
if (datumsfeld(linker_rand)<=datumsfeld(i)-lookback) and (datumsfeld(linker_rand+1)>=datumsfeld(i)-lookback) then
  ergebnis(i)=(daten(i)/daten(linker_rand)-1)*100
else
  ergebnis(i)=ergebnis(i-1)
end if
end if
next
If you think it´s expensive to hire a professional, wait until you hire an amateur.

Lenzelott Männlich

Experte

Registrierungsdatum: 30. Dezember 2002

Beiträge: 3 051

Wohnort: Giessen

33

Mittwoch, 13. August 2008, 15:49

Hallo Lenzelott,

Herr Knöpfel hat ja schon eine mögliche Lösung gepostet.
Mein Lösungsvorschlag auf Basis deines bisherigen Codes hätte ähnlich ausgesehen - ich schieb ihn nur der Vollständigkeit halber noch nach:

calc kapital:Datenreihe(#kapitalkurve#);
calc jahr:ValueWhen(DatePart(yyyy),kapital<>#_keinwert#,1,V);
calc monat:ValueWhen(DatePart(m),kapital<>#_keinwert#,1,V);
calc tag:ValueWhen(DatePart(d),kapital<>#_keinwert#,1,V);
calc datum:DatePart(yyyy)*12*31+DatePart(m)*31+DatePart(d);
calc suchdatum:(jahr-1)*12*31+monat*31+tag;
calc diff: datum-suchdatum;
(Kapital / RefVar(Kapital, - diff)-1) * 100


Hallo Anke, vielen Dank.
Auf Tagesbar´s wird das auch "fast" funktionieren, ohne dass ich es getestet habe.
Aber leider nicht mehr auf Intraday Geschichten.
In obigem Code dürfte DIFF immer 12*31= 372 sein.
Bei 5 Minuten Bars schaue ich damit halt nur 31 Stunden zurück.
Wobei das je nach Underlying (Handelszeitbeschränkung) eine unterschiedliche Tagesanzahl ist.
Selbst beim gleichen Underlying (zb FESX oder FDAX) ändert sich halt auch das noch, da es da ja drastische Änderungen in der Handelszeit gab.
ich meine so war es:
09:00-17:00 am Anfang
09:00-17:30 ab dem 24.01.2000
08:00-20:00 ab dem 01.01.2002
08:00-22:00 ab dem 28.11.2005
If you think it´s expensive to hire a professional, wait until you hire an amateur.

Wiwu Weiblich

Experte

Registrierungsdatum: 4. September 2002

Beiträge: 1 752

Wohnort: Neuenhagen b. Berlin

34

Mittwoch, 13. August 2008, 22:55

Zitat

Aber leider nicht mehr auf Intraday Geschichten.


Hallo Lenzelott,

hierzu müsste man die 372 mit der Anzahl von Intraday-Perioden pro Tag multiplizieren und die unterschiedlichen Handelszeiten ggf. über zusätzliche If-Bedingungen ausfiltern.

Aber du hast dir ja inzwischen deine VBS-Variante programmiert, bei der die Periodenumrechnung entfallen kann.
Viele Grüße von Anke

http://www.ascunia.de

Lenzelott Männlich

Experte

Registrierungsdatum: 30. Dezember 2002

Beiträge: 3 051

Wohnort: Giessen

35

Mittwoch, 13. August 2008, 23:28

Hallo Anke,

erstmal ganz herzlichen Dank für Deine Tips.

genau das hatte ich auch anfänglich versucht.
Das Problem dabei sind die Übergangsphasen bei den Handelszeitverlängerungen.
Jeder Tag nach Datum x sind y Perioden und das in 4 Stufen gestaffelt. Am besten überschneiden sich solche Verlängerungen noch in einer 12 Monatsperiode...
Ich habe mir die Handelszeiten sogar als Titel angelgt, dafür.

Heute ist Tag z und wieviel Perioden sind denn nun tatsächlich 365 Tage??
Ich bin ehrlich: ich hab´s nicht ausgerechnet bekommen!!!
Ich war mindestens so erfolglos dabei wie die Versuche, die ich hier am Anfang gepostet habe.

P.S. Auf den "reverse" Quicksort suchalgo bin ich jetzt aber schon stolz... :D :D
Kann sein, dass da noch ein paar Unwägbarkeiten nicht abgefangen sind, aber bei meinen HS stimmt´s augenscheinlich.
If you think it´s expensive to hire a professional, wait until you hire an amateur.

Lenzelott Männlich

Experte

Registrierungsdatum: 30. Dezember 2002

Beiträge: 3 051

Wohnort: Giessen

36

Donnerstag, 21. August 2008, 19:07

So und jetzt habe ich den Indikator auch in die Datenbank hochgeladen.

Anstelle der festen 365 Tage habe ich einen zweiten Parameter eingebaut, der die Tage übergibt für die die prozentuale ROC berechnet werden soll.
Viel Spass beim ausprobieren.
Es sei erwähnt, dass bei einigen hundertausend Perioden die Berechnung trotzt Suchoptimierung doch einige Sekunden benötigt.
If you think it´s expensive to hire a professional, wait until you hire an amateur.