Overblog Suivre ce blog
Editer l'article Administration Créer mon blog
12 février 2008 2 12 /02 /février /2008 18:46

Trading Strategy Using Ehlers Filter.

 

Dans le fichier TSWorld05, téléchargeable sur le site de J. Ehlers, celui-ci présente et compare 8 filtres non-linéaires (ou moyennes mobiles adaptatives) :

 - KAMA (Kaufman Adaptative Moving Average).

 - VIDYA (Variable Index Dynamic Average).

 - MAMA (MESA Adaptative Moving Average).

 - Ehlers Filter.

 - Median Filter.

 - Median-MA Difference Filter.

 - FRAMA (Fractal Adaptative Moving Average).

 - Nonlinear Laguerre Filter.

 

L'auteur construit à partir de ces moyennes non-linéaires, une stratégie de trading fort simple.  Je reprends ici l'exemple de système donné par J. Ehlers dans son fichier.  Voici tout d'abord une vue d'un graphique (AMD) avec le "Ehlers Filter" (len=15) :

 

hk47.gif

 

Et le code pour Prorealtime, il faut introduire len (longueur du filtre) en variable :

 

rem len entre 5 et 25, conseillé entre 16 et 25
pr=MedianPrice
if barindex>1    then
    smooth=(pr+2*pr[1]+2*pr[2]+pr[3])/6
    dist=0
    for j= 1 to len-1 do
        dist=dist+SQUARE(smooth-smooth[j])
    next
    sumcoef=0
    num=0
    for i=0 to len-1 do
        sumcoef=sumcoef+dist[i]
        num=num+dist[i]*smooth[i]
    next
    filt=num/sumcoef  
endif
return filt

 

Ensuite, J. Ehlers applique à cette courbe une enveloppe fonction de la volatilité afin ,dit-il, de filtrer les périodes de range.  Dès que la courbe sort de l'enveloppe, un signal est donné.  Le système est de type SAR, on est tout le temps dans le marché.  Voici une vue de l'indicateur avec son enveloppe :

 

hk48.gif

 

Voici le code, on peut faire varier la largeur de l'enveloppe en introduisant le coefficient (frac) en variable :

 

rem len entre 5 et 25, conseillé entre 16 et 25
rem frac entre 2 et 15
pr=MedianPrice
if barindex>1    then
    smooth=(pr+2*pr[1]+2*pr[2]+pr[3])/6
    dist=0
    for j= 1 to len-1 do
        dist=dist+SQUARE(smooth-smooth[j])
    next
    sumcoef=0
    num=0
    for i=0 to len-1 do
        sumcoef=sumcoef+dist[i]
        num=num+dist[i]*smooth[i]
    next
    filt=num/sumcoef
   
    rng=0.1*Range+0.9*rng[1]
    val1=filt[1]+rng/frac
    val2=filt[1]-rng/frac
endif
return filt,val1,val2

 

Et le code pour la version en historigramme :

 

rem len entre 5 et 25, conseillé entre 16 et 25
rem frac entre 2 et 15
pr=MedianPrice
if barindex>1    then
    smooth=(pr+2*pr[1]+2*pr[2]+pr[3])/6
    dist=0
    for j= 1 to len-1 do
        dist=dist+SQUARE(smooth-smooth[j])
    next
    sumcoef=0
    num=0
    for i=0 to len-1 do
        sumcoef=sumcoef+dist[i]
        num=num+dist[i]*smooth[i]
    next
    filt=num/sumcoef
   
    rng=0.1*Range+0.9*rng[1]
    val1=filt[1]+rng/frac
    val2=filt[1]-rng/frac
endif
if filt crosses over val1 then
    flag=1
elsif filt crosses under val2 then
    flag=-1
endif
return flag

 

J'ai donc construit un système basé sur l'indicateur en historigramme.  Ehlers conseille d'ajouter un stop pour que la stratégie soit complète, je ne l'ai pas fait.  Tel système de trading peut , d'après l'auteur, être basé sur n'importe lequel des 8 filtres qu'il présente dans son fichier.  Voilà une vue du système sur AMD, optimisé et sans stop.

 

hk49.gif

 

Et pour être complet, le code en version "indicateur backtest", il faut entrer aa (len) et bb (frac) en variables à optimiser.  Attention, vu la construction du filtre, les tests peuvent prendre du temps !

 

REM Achat
indicator1 = CALL "ehlers filter historigramme"[aa, bb]
c1 = (indicator1 > 0.0)
IF c1 THEN
    BUY 10000 CASH AT MARKET THISBARONCLOSE
ENDIF
REM Vente
c2 = (indicator1 < 0.0)
IF c2 THEN
    SELL  AT MARKET THISBARONCLOSE
ENDIF
REM Vente à découvert
c3 = (indicator1 < 0.0)
IF c3 THEN
    SELLSHORT 10000 CASH AT MARKET THISBARONCLOSE
ENDIF
REM Rachat
c4 = (indicator1 > 0.0)
IF c4 THEN
    EXITSHORT  AT MARKET THISBARONCLOSE
ENDIF

 

 

Partager cet article

Repost 0

commentaires