Dienstag, 16. April 2024, 16:50 UTC+2

Sie sind nicht angemeldet.

  • Anmelden
  • Registrieren

sten

Experte

Registrierungsdatum: 6. September 2002

Beiträge: 2 879

1

Sonntag, 8. April 2012, 14:33

suche Kalman-Filter zur Trenderkennung

Hallo,

leider konnte ich das Kalman-Filter als Investox-Indikator nicht finden.

Habe den Kalman-Filter als MT4-Code gefunden:
http://codebase.mql4.com/ru/source/3310

Die 4 Inputwerte für das Kalman-Filter sind:
extern int Mode=6; --> in Investox: Name=kurse, Typ=Datenreihe, Standard=z.B. Close
extern double K=1;
extern double Sharpness=1;
extern int draw_begin=500;

Der Rückgabewerte des Investox-KalmanIndis könnte so aussehen:
a)
+1...weiter steigende Kurse (entspricht "grün" im Bild)
-1 ... weiter fallende Kurse (entspricht "rot" im Bild)

b) der geglättete Kalman-Kurswert
--> zwei Rückgabewerte bei einem Indikator, könnte schwierig werden

Zitat


double iValue(int mode, int shift){
switch (mode) {
case 0:
return (iClose(NULL,0,shift));
case 1:
return (iOpen(NULL,0,shift));
case 2:
return (iHigh(NULL,0,shift));
case 3:
return (iLow(NULL,0,shift));
case 4:
return ((iHigh(NULL,0,shift)+iLow(NULL,0,shift))/2);
case 5:
return ((iHigh(NULL,0,shift)+iLow(NULL,0,shift)+iClose(NULL,0,shift))/3);
case 6:
return ((iHigh(NULL,0,shift)+iLow(NULL,0,shift)+iClose(NULL,0,shift)+iClose(NULL,0,shift))/4);
default:
return (0);
}
}

Den Codeteil kann man stark vereinfachen, indem man einfach in Investox eine Datenreihe einsetzt. Dann kann Close, Open, usw. übergeben.

Zitat


int start()
{
if(Bars<=draw_begin) return(0);
int i;
double Velocity=0;
double Distance=0;
double Error=0;
double value = iValue(Mode,draw_begin+1);

for(i=draw_begin;i>=0;i--) {
Distance = iValue(Mode,i) - value;
Error = value + Distance * MathSqrt(Sharpness*K/100);
Velocity = Velocity + Distance*K/100;
value = Error+Velocity;

//color lines
if (Velocity>0) {
ExtMapBufferUp = value;
//ExtMapBufferUp[i] = S;
ExtMapBufferDown[i] = EMPTY_VALUE;

if (ExtMapBufferUp[i+1] == EMPTY_VALUE) ExtMapBufferUp[i+1] = ExtMapBufferDown[i+1];
} else {
ExtMapBufferUp[i] = EMPTY_VALUE;
ExtMapBufferDown[i] = value;
//ExtMapBufferDown[i] = S;

if (ExtMapBufferDown[i+1] == EMPTY_VALUE) ExtMapBufferDown[i+1] = ExtMapBufferUp[i+1];
}
}
//---- done
return(0);
}

Die eigentliche Kalman-Berechnung findet hier statt. Die Formatierung geht verloren, deshalb habe ich es auch als Bild angehängt. Leider reicht mein MQL4-Codewissen nicht aus, um die Berechnung in die Investox-Formelsprache zu überführen.
Sehr Ihr hier eine Chance?

Viele Grüße
Sten

PS:
Das Kalman-Filter wirkt dann so, siehe Bild.
»sten« hat folgende Bilder angehängt:
  • 120408_chartbild_mitKalmanFilter.GIF
  • 120408_KalmanFilter-Berechnung.GIF

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »sten« (9. April 2012, 20:54)


Registrierungsdatum: 4. September 2007

Beiträge: 311

Wohnort: Stuttgart

2

Dienstag, 10. April 2012, 13:19

Hi Sten,

weis nicht ob es Dir was bringen könnte aber hier mal der Code für Tradestation und Metastock, ohne das ich natürlich weis ob sie funktionieren.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{Function name= KF}
INPUT:
   K1(Numeric),
   BP(NumericSeries);
VARS:
   Pred(BP),
   Smooth(0),
   Velo(0),
   DeltaK(0),
   stderr(0),
   error(0),
   sumerr(0)  ; 
IF currentbar > 1 then BEGIN

DeltaK = BP -Pred;
Smooth = Pred + DeltaK* SquareRoot( (K1/10000)*2 ) ;
Velo= Velo + ((K1/10000)*Deltak) ;
Pred =  Smooth + Velo ;

KF=Pred;
END;


Quellcode

1
2
3
4
5
6
7
8
9
10
PRICEE:=C;
Smooth:=.13785*(2*PriceE - Ref(PriceE,-1)) + .0007*(2*Ref(PriceE,-1) - Ref(PriceE,-2)) + .13785*(2*Ref(PriceE,-2) -Ref(PriceE,-3)) + 
1.2103*PREV - .4867*Ref(PREV,-1);

SMOOTH;

ti:= 15;
pr:= MP();
coef:= Abs(pr - Ref(pr,-5));
Sum(coef*pr,ti)/Sum(coef,ti)
Bei dem Metastock-Code irritieren mich die vorgegebenen Zahlen!


Hier noch ein Link zu tradesignal: [url]http://www.tradesignalonline.com/l…d=Kalman+Filter[/url] (hoffe ich darf den Posten)
Grüße aus dem Schwabenland
Arend

sten

Experte

Registrierungsdatum: 6. September 2002

Beiträge: 2 879

3

Sonntag, 15. April 2012, 20:31

Hallo trader-hawk,

Danke, für das Zusammensuchen der Kalman-Codestücke für Tradestation und Metastock. Hmm, ist jetzt aber auch nicht so meine Welt.

Denke in Investox müsste sich die for-Schleife für das Kalman-Filter am leichtesten mit VBScript innerhalb eines ganz normalen Inv-Indikators umsetzen.

einfacher Beispielcode mit einer for-Schleife:

Zitat


dim i
dim myfeld
getdaten "High",myfeld
for i= 1 to alleperioden
ergebnis(i)=myfeld(i)
next


Habe jetzt alle Puzzels zusammen gesucht. Mal sehen wann ich dazu komme die Puzzels zusammenzusetzen.
Danke.

Viele Grüße
Sten

Investox

Administrator

Registrierungsdatum: 31. August 2002

Beiträge: 5 680

4

Montag, 16. April 2012, 08:39

Hallo,

hier eine mögliche Umsetzung mit einem VBScript-Indikator:
http://www.investoxforum.de/index.php?pa…BData&dataID=83

Zu beachten ist die lange "Einschwingphase" des Indikators.

Viele Grüße
Andreas Knöpfel

sten

Experte

Registrierungsdatum: 6. September 2002

Beiträge: 2 879

5

Montag, 16. April 2012, 14:06

Hallo Hr. Knöpfel,

vielen Dank für die Umsetzung. Super.

Viele Grüße
Sten