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