Dienstag, 16. April 2024, 08:21 UTC+2

Sie sind nicht angemeldet.

  • Anmelden
  • Registrieren

VBS

Fortgeschrittener

Registrierungsdatum: 9. November 2008

Beiträge: 109

1

Donnerstag, 10. März 2016, 23:13

Overflow in VBS

Hallo,

der Nachbau eines Bandpass Filters von Ehlers in Investox Formelsprache funktioniert:

#_FastPrev#

calc Daten: Close;
const Perioden: 20;
const Delta: 0.1;

const beta: Cos(360/Perioden);
const gam: 1/Cos((720*Delta)/Perioden);
calc alpha: gam-SQR(gam*gam-1);
calc bp: 0.5*(1-alpha)*(Daten-Ref(Daten,-2))+beta*(1+alpha)*PREV-alpha*Ref(PREV,-1);

bp




In VBScript bekomme ich immer eine Overflow Fehlermeldung! Woran kann das liegen?


Daten: Close;
Perioden: 20;
Delta: 0.1;


Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Option explicit

Dim startindex,endindex,i
Dim Beta, Gamma, Alpha, BP()

startindex= erstedatenperiode(Daten)
endindex=letztedatenperiode(Daten)

redim BP(endindex)

for i=startindex + Perioden to endindex

Beta=Cos(360/Perioden)
Gamma=1/Cos(720*Delta1/Perioden)
Alpha=Gamma-SQR((Gamma*Gamma)-1)

BP(i)=0.5*(1-Alpha)*(Daten(i)-Daten(i-2))+ Beta*(1+Alpha)* BP(i-1)- Alpha*BP(i-2)

ergebnis(i)= BP(i)


next

Bernd

Experte

Registrierungsdatum: 5. Juni 2005

Beiträge: 4 070

Wohnort: Iringsweg

2

Samstag, 12. März 2016, 14:56

Hallo VBS

Ich habe den VBS Code mal in den Chart geworfen, und bekomme bei Perioden >200 schnell Werte jenseits von Krieg und Frieden, hier im DAX endlos auf 5-Min. Komprimierung schon nach knapp 300 Perioden sehe ich diese Werte, direkt vor dem Overflow konnte Investox noch diese Zahlen rausleiern:
Alpha=-1.60859426242323, Alpha*BP(i-2)=2.95008746993625E+38

Also liegt es höchstwahrscheinlich am letzten Teil Deiner Formel, dem "- Alpha*BP(i-2)".

Mit dem Ehlers seinen Bypässen 8o hab' ich mich zwar nicht beschäftigt bisher, aber falls Deine Umsetzung korrekt wäre, könnten m.E. solche Zahlen-Extreme kaum zu sinnvollen Reultaten führen? Wie auch immer, ein Overflow kommt von dieser Berechnung, die VBScripzt Hilfe sagt dazu:


> der Nachbau eines Bandpass Filters von Ehlers in Investox Formelsprache funktioniert
Ob das Formelsprachen Konstrukt jetzt gleichwertig ist zu Deinem VBS Code, habe ich nicht geprüft. Denke, da muss man wegen der #_FastPrev# Lauf-Zeiten dann echt Zeit investieren. Jedenfalls sagt die Infestox Hilfe selber:

Zitat

Testen Sie in jedem Fall, ob FastPrev die Berechnung nicht verfälscht.


Ich habe also keine Idee, ob FastPrev in der Formelsprache z.B. auf Double runter-Castet, um einen Laufzeitfehler zu verhindern, oder ob Herr Knöpfel in der Formelsprache mit einem mehrfachen von Double rechnen kann. Jedenfalls innerhalb von VBScript wird wohl double das Maximale sein, was man rechnen kann, aus der VBScript Hilfe:

Zitat

Enthält eine Fließkommazahl doppelter Genauigkeit von -1,79769313486232E308 bis -4,94065645841247E-324 für negative Werte und von 4,94065645841247E-324 bis 1.79769313486232E308 für positive Werte.


Du könntest mit ON ERROR RESUME NEXT herumspielen und versuchen, wenn es grösser oder kleiner wird als double den Wert an den Maxima fest-zu-machen. Um den Laufzeitfehler zu beheben, aber ob das dann noch korrekt rechnet, bei solchen Extrama, in Folgeperioden?

Oder vielleicht kannst Du die Werte-Teile vor der Berechnung in übliche Gefilde zurück-Normalisieren und dann trotzdem noch Umsetzungs-Konform in den Original-Formeln des herzkranken Erfinders unterbringen?

Oder die Formel ist doch nicht so korrekt, wie gesagt, wenn es für den Bau eines Oszillators in solche Extreme geht, da müsste einer unserer Mathematker oder Physiker im Forum ran; jedenfalls ist der praktische Wert solcher Extrem-Berechnungen im täglichen Markt dann jenseits meiner aktuellen Vorstellungskraft :wacko:
Gruss
Bernd

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Bernd« (12. März 2016, 15:18)


Bernd

Experte

Registrierungsdatum: 5. Juni 2005

Beiträge: 4 070

Wohnort: Iringsweg

3

Samstag, 12. März 2016, 16:03

Bezogen auf meinen Vorschlag, den Wertebereich einzugrenzen, habe ich mal das probiert:

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
Option explicit

Dim startindex,endindex,i
Dim Beta, Gamma, Alpha, BP()

const keinWert=-1234567
const maxWert=1000000000

startindex= erstedatenperiode(Daten)
endindex=letztedatenperiode(Daten)



redim BP(endindex)

for i=startindex to startindex + (Perioden-1)
	ergebnis(i) = keinWert
	BP(i) = 0
next

for i=startindex + Perioden to endindex

	Beta=Cos(360/Perioden)
	Gamma=1/Cos(720*Delta1/Perioden)
	Alpha=Gamma-SQR((Gamma*Gamma)-1)

	BP(i)=0.5*(1-Alpha)*(Daten(i)-Daten(i-2))+ Beta*(1+Alpha)* BP(i-1)- Alpha*BP(i-2)
	
	 If BP(i) > maxWert then BP(i) = 0 
	 If BP(i) < -maxWert then BP(i) = 0

	 ergebnis(i)=BP(i)

next


Damit kommen keine Abbruchmeldungen mehr, und man kann das Verhalten einwenig untersuchen. Wobei ich immer noch keine Ahnung habe, was man mit sowas machen will?

Jedenfalls bei Perioden-Einstellungen < 16 und > 50 kommen bei mir solche Bilder zustande, das sieht ja ganz brauchbar aus vom Wertebereich:


Bei Perioden im Bereich 17 bis 49 dagegen solche sieht es dagegen recht unbrauchbar aus:


So, jetzt mach' Dir nen Reim drauf :D
Gruss
Bernd

VBS

Fortgeschrittener

Registrierungsdatum: 9. November 2008

Beiträge: 109

4

Samstag, 12. März 2016, 17:24

Hallo Bernd,

herzlichen Dank für deine unermüdliche Hilfe :thumbsup:

Wofür das Ganze ..., das kann hier nachgelesen werden: http://www.mesasoftware.com/papers/Empir…composition.pdf

Ich habe mit EMD a la Dürschner experimentiert, aber EMD "repaints".....!!!

Jetzt wollte ich mal Ehlers Zyklus Filter ausprobieren, aber da gibts diese Überflüsse... Habe auch schon verschiedene Codierungen probiert, aber nichts funktionierendes gefunden.

Der ganz oben gepostete Code in Investox Formelsprache kommt der Sache schon nahe, aber ist halt sehr langsam...

Vielen Dank auch für den Hinweis zu Fast_Prev - das wußte ich nicht. (Andere Ehlers Filter liefern auch den overflow)

Den Wertebereich einschränken bringt doch ganz schön starke Verzerrungen.

Ich probiers weiter, mal schaun...

VBS

Bernd

Experte

Registrierungsdatum: 5. Juni 2005

Beiträge: 4 070

Wohnort: Iringsweg

5

Samstag, 12. März 2016, 22:54

Hallo VBS

Jetzt wo wir wissen (*), dass das Ding urspünglich in EasyLanguage codiert war, kann man ein paar Vergleiche anstellen:
* EasyLanguage arbeitet, zumindest intern, mit dem Datentyp double (ich bin kein EL Experte, aber mein Freund google hat das hier auf Seite 39 gefunden)
* Die google Suche nach EasyLanguage und Float hat bei mir keine brauchbaren Treffer ergeben, scheints ist in EL also float auch keine Option
* VBSCript rechnet intern maximal auch mit double, meines Wissens nach (float ist gemäss meiner VBScript Doku für künftige Versionen wenigstens schon mal als Schlüsselwort reserviert ...)
* weist man in beiden Programmiersprachen einer Variablen einen Wert jenseits des double Bereiches zu, muss es also einen Overflow geben
* bei der Zuweisung einer double Variablen an das Ergbnis() in Investox kann man keine double-Variable weitergeben, jedenfalls wirft das nach meinen Tests einen (weiteren) Overflow - den man aber soft abfangen kann, um intern mit double weiter-zu-rechnen
* der Wert vom Typ Currency scheint in VBScript das maximale zu sein - und man kann solche Werte auch an das Investox ergebnis() durchreichen (ob mehr geht, habe ich nicht getestet, weil mir solche Wertebereiche dann eh zu theoretisch werden; hier könntest Du mit dem Coding unten ja selber weiter testen)

Mit diesen Erkenntnissen war es nun einfach, den Indikator zu erstellen und eine (angenommene) Fehlerrate auszuweisen. Das sieht dann so aus:

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
Option explicit

Dim startindex,endindex,i
Dim Beta, Gamma, Alpha, BP()

Dim Err6_Anz_Script_intern, Err6_Anz_Script_ergebnis
Err6_Anz_Script_intern = 0
Err6_Anz_Script_ergebnis = 0

const keinWert=-1234567
const maxErgebnis=922337203685477.5807		'min/max Werte des Types Currency
const minErgebnis=-922337203685477.5808 

startindex= erstedatenperiode(Daten)
endindex=letztedatenperiode(Daten)

redim BP(endindex)

for i=startindex to startindex + (Perioden-1)
	BP(i) = 0
	ergebnis(i) = keinWert
next

for i=startindex + Perioden to endindex

	Beta=Cos(360/Perioden)
	Gamma=1/Cos(720*Delta1/Perioden)
	Alpha=Gamma-SQR((Gamma*Gamma)-1)

	' double Overflow hart abfangen
	on error resume next
		BP(i)=0.5*(1-Alpha)*(Daten(i)-Daten(i-2))+ Beta*(1+Alpha)* BP(i-1)- Alpha*BP(i-2)
		if cInt(Err.Number)=6 then 
			BP(i) = 0
			Err.Clear
			Err6_Anz_Script_intern = Err6_Anz_Script_intern + 1
		end if
	on error goto 0

	' overflow unterhalb von double weich abfangen
	if BP(i) > maxErgebnis then 
		ergebnis(i) = maxErgebnis
		Err6_Anz_Script_ergebnis = Err6_Anz_Script_ergebnis + 1
	elseif BP(i) < minErgebnis then 
		ergebnis(i) = minErgebnis
		Err6_Anz_Script_ergebnis = Err6_Anz_Script_ergebnis + 1
	else
		ergebnis(i) = BP(i)
	end if

next

if Err6_Anz_Script_intern > 0 or Err6_Anz_Script_ergebnis > 0 then
	LogbuchMeldung 2, 0, "Bandpass Err.Number=6 Report", _
							"Anzahl berechnete Perioden: " + _
							cStr(endindex-startindex) + vbcrlf + _
							"Anzahl Überlauffehler Script intern (double Berechnung): " + _
							cStr(Err6_Anz_Script_intern) + vbcrlf + _
							"Anzahl Überlauffehler bei Zuweisung an ergebnis-Array: " + _
							cStr(Err6_Anz_Script_ergebnis) + vbcrlf + _
							"interne Fehlerrate in Prozent: " + _
							cStr( Err6_Anz_Script_intern*100/(endindex-startindex+0.0000001)) + vbcrlf + _
							"Fehlerrate in Prozent bei Weiterberechnung mit diesem Ergebnis: " + _
							cStr( (Err6_Anz_Script_intern+Err6_Anz_Script_ergebnis)*100/(endindex-startindex+0.0000001))
end if


Nun habe ich das Coding mal wieder auf den DAX in 5 Min. Komprimierung geworfen. Mit manchen Perioden-Einstellungen sieht das Ergebnis prima aus, bei anderen (z.B. den 20 Perioden die Du eingangs vermerkt hast) sieht es im Chart oben und unten weiterhin abgeschnitten aus, allerdings ist es jetzt nicht mehr willkürlich abgeschnitten wie in meinem ersten Beispiel.

Jetzt kann man Aussagen über die Güte eines Ergebnisses treffen, und es mit möglichen Ergebnissen zur EasyLanguage vergleichen. Denn falls ein Overflow auftritt, gibt es nun einen detaillierten Report im INV Logbuch. Der sieht im genannten Beispiel z.B. so aus:


Diese Zahlen interpretiere ich jetzt mal so:
* die Fehlerrate beim Berechnen mit double liegt bei 0.11%, und diese müsste auch in EL vorhanden sein, wenn sie wie angenommen mit double rechnen; führt dies zu keinem erkennbaren Overflow dort, wird der Fehler von den EL-Mädels wohl "irgendwie" unter den Teppich gekehrt
* die Fehlerrate von 95% bei der Weitergabe an das INV Ergebnis kann solange unbeachtet bleiben, wie man diesen Indikator nicht in weiteren Indikatoren zu "Sub-Berechnungen" zwingt
* solange Du diesen Indi also nur chartest oder Trigger anlegst, die dann irgendwas auslösen, sollte es keine Probleme geben
* allerdings würde ich Parameter-Settings, die in solche Extrema führen, dass der Infikator Fehlerraten ausweist, lieber meiden


PS *: ich weiss, schreckliches Deutsch, aber mit Ersatz-Konstrukt zu "wo" klingts einfach gestelzt
Gruss
Bernd

VBS

Fortgeschrittener

Registrierungsdatum: 9. November 2008

Beiträge: 109

6

Sonntag, 13. März 2016, 11:20

Hallo Bernd,

ich glaube, ich habe den Fehler gefunden.

Laut VBScript wird die sin Funktion folgendermaßen definiert:



Mit dem verbesserten Code sieht der Bandpass-Filter deutlich besser aus!

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
Option explicit

Dim startindex,endindex,i, pi
Dim Beta, Gamma, Alpha, BP()

startindex= erstedatenperiode(Daten)
endindex=letztedatenperiode(Daten)

redim BP(endindex)

for i=startindex + Perioden to endindex

pi = 3.14159

Beta=Cos(360*pi/180/Perioden)
Gamma=1/Cos(720*Delta1*pi/180/Perioden)
Alpha=Gamma-SQR((Gamma*Gamma)-1)

BP(i)=0.5*(1-Alpha)*(Daten(i)-Daten(i-2))+ Beta*(1+Alpha)* BP(i-1)- Alpha*BP(i-2)

ergebnis(i)= BP(i)


next




VBS

VBS

Fortgeschrittener

Registrierungsdatum: 9. November 2008

Beiträge: 109

7

Sonntag, 13. März 2016, 11:47

Hallo Bernd,

noch mal vielen Dank für deine Hilfe und Unterstützung! Wofür das Ganze....?

Aus: Ehlers: Cycle Analytics for Traders, 2013, S. 61 steht u.a. folgendes:




Jetzt muß Herr Knöpfel nur noch einen Spectrum Finder für Zyklen einbauen, dann können wir schön prognostizieren
:thumbsup:

Grüße
VBS