Overblog Suivre ce blog
Administration Créer mon blog
11 février 2008 1 11 /02 /février /2008 20:46

Programmer sur la plateforme Prorealtime un indicateur pour le backtest.

 

C'est quoi avoir un avantage ?

 

Curtis Faith donne son point de vue : ici.

 

Voici un indicateur qui retourne le MFE et le MAE de la derniére opération divisé par l'ATR10. (1)

L'indicateur retourne également la somme des (1) divisée par le nombre d'opérations.

 

Pour connaître votre avantage, il faut faire le rapport entre les 2 sommes : h2/j et l2/j.

 

A vous d'encoder vos conditions d'entrées.

 

Vous pouvez modifier la période de l'ATR, le nombre de bougies pris en compte.

 

 

once h2=0
once l2=0
once j=0
i=i+1
//Rem : mettre les conditions d'entrées
//if xxxxxxxxxxxxx then
//   condition=-1 (pour la vente à découvert)
//else
//    if xxxxxxxxxxxxx then
//        condition=1 (pour l'achat)
//   else
//       condition=0 (on reste hors marché)
//    endif
//endif

// Rem : le calcul se fait sur la close de la bougie qui déclenche le signal

// Rem : on teste pour une période de 25 bougies

if condition<>0 and flag=0 then
    flag=1
    i=0
    entry=close
    h1=close
    l1=close
    w=AverageTrueRange[10](close)
    if condition=-1 then
        dic=-1
    else
        dic=1
    endif
else
endif
if flag=1and i>0 then
    if i<=25  then
        h1=max(h1,high)
        l1=min(l1,low)
    else
        flag=0
        mfe=h1-entry
        mae=entry-l1
        j=j+1
        if dic=-1 then
            k=mfe
            mfe=mae
            mae=k
        else
        endif
        mfe1=mfe/w
        mae1=mae/w
        h2=(h2+mfe1)
        l2=(l2+mae1)
       
    endif
endif
return mfe1,mae1,h2/j,l2/j,condition

Repost 0
11 février 2008 1 11 /02 /février /2008 20:37

Using Fisher Transform by John Ehlers.

 

Dans le numéro de novembre 2002 de S&C, il y a un article de Ehlers sur la transformation de Fisher.  Une copie en pdf se trouve ici, pour les explications.  Voici une vue de l'indicateur appliqué à la Société Générale (j'essaye de coller à l'actualité !).

 

hk34.gif

 

Et le code pour Prorealtime :

 

p=MedianPrice
len=10
maxh=highest[len](p)
minl=lowest[len](p)
if barindex<len then
    val1=2*((p-minl)/(maxh-minl)-0.5)
else
    val1=0.33*2*((p-minl)/(maxh-minl)-0.5)+0.67*val1[1]
endif
if val1>.99 then
    val2=.999
elsif val1<-0.99 then
    val2=-0.999
else
    val2=val1
endif
if barindex<len then
    fish=log((1+val2)/(1-val2))
else
    fish=0.5*log((1+val2)/(1-val2))+0.5*fish[1]
endif

return fish,fish[1],0

Repost 0
Published by hk_lisse - dans Indicateurs
commenter cet article
11 février 2008 1 11 /02 /février /2008 20:32

IIR Filter et FIR Filter by J. Ehlers.

 

Dans le numéro de S&C de janvier 2002, J. Ehlers présente 2 filtres dans un article "Zero-lag Data Smoothers" : Infinite Impulse Response (IIR) Filter et Finite Impulse Response (FIR) Filter.  Voici une vue de l'ES avec les différentes courbes, le zero-lag FIR (en blanc), le mini-lag FIR (en jaune), l'adjustable-lag FIR (en rouge avec lag=2.5) et le zero-lag IIR (en noir avec n=11) :

 

hk33.gif

 

Voici le code pour Prorealtime, il faut introduire le lag (lag) et la période (n) en variable :

 

rem zerolag fir filter by J. Ehlers
rem entrer le lag compris entre 0 et 2.5
rem entrer la periode 11 ou 9 recommandé (n)
////////////////  Zero-lag F I R  FILTER
pr=close
fir=(pr+2*pr[1]+3*pr[2]+3*pr[3]+2*pr[4]+pr[5])/12
///////////////  Mini-lag F I R  FILTER
mini=(pr+3.5*pr[1]+4.5*pr[2]+3*pr[3]+0.5*pr[4]-0.5*pr[5]-1.5*pr[6])/10.5
////////////// Adjustable-lag F I R  FILTER
firvar=(pr+(2+lag)*pr[1]+(3+lag)*pr[2]+3*pr[3]+(2-lag)*pr[4]+(1-lag)*pr[5]+(0-lag)*pr[6])/(12-lag)
////////////////  Zero-lag I I R  FILTER
k=2/(n+1)
x=(n-1)/2
x=round(x)
if barindex > 50 then
    ema=k*(2*pr-pr[x])+(1-k)*ema[1]
endif

return fir, mini,firvar,ema

Repost 0
Published by hk_lisse - dans Indicateurs
commenter cet article
11 février 2008 1 11 /02 /février /2008 20:27

La Sine-Weighted Moving Average (SWMA).

 

Patrick Lafferty présente dans un article intitulé "How Smooth Is Your Data Smoother ?" du numéro de juin 1999 de S&C, un moyen original de lisser les cours : il s'agit de la SWMA (Sine-Weighted Moving Average).  Voici un graphe de l'ES avec la moyenne :

 

hk32.gif

 

Et le programme pour Prorealtime :

 

sd=180/6
pr=close
s1=sin(sd)*pr
s2=sin(sd*2)*pr[1]
s3=sin(sd*3)*pr[2]
s4=sin(sd*4)*pr[3]
s5=sin(sd*5)*pr[4]
num=s1+s2+s3+s4+s5
den=sin(sd)+sin(2*sd)+sin(3*sd)+sin(4*sd)+sin(5*sd)
swma=num/den
return swma

Repost 0
Published by hk_lisse - dans Indicateurs
commenter cet article
11 février 2008 1 11 /02 /février /2008 20:14

Tillson's T3 and IE/2.

 

Tim Tillson a écrit dans le S&C de janvier 1998, un article intitulé "Smoothing Techniques For More Accurate Signals".  Il y présente 2 indicateurs : T3 et IE/2.  Ce sont des indicateurs de lissage à utiliser comme filtre.

 

Voici le code du T3, il faut introduire p en variable de la période (3, 5, 6 ou 8 recommandé) :

 

period=p
price=close
vfactor=.7
x1=(exponentialaverage[period](price))*(1+vfactor)
x2=(exponentialaverage[period](exponentialaverage[period](price)))*vfactor
gd=x1-x2
x11=(exponentialaverage[period](gd))*(1+vfactor)
x21=(exponentialaverage[period](exponentialaverage[period](gd)))*vfactor
gd1=x11-x21
x12=(exponentialaverage[period](gd1))*(1+vfactor)
x22=(exponentialaverage[period](exponentialaverage[period](gd1)))*vfactor
gd2=x12-x22
return gd2

 

Une vue du CAC avec p=3 (noire), p=5 (jaune) et p=8 (blanc).

 

hk30.gif

 

Voici le code de IE/2, il faut entrer p en variable de la période :

 

ilrs=LinearRegressionSlope[p](close)+average[p](close)
epma=LinearRegression[p](close)
ie=(ilrs+epma)/2
return ie

 

Et un vue du CAC avec p=15 (jaune) et p=7 (blanc).

 

hk31.gif

Repost 0
Published by hk_lisse - dans Indicateurs
commenter cet article
11 février 2008 1 11 /02 /février /2008 20:08

Le MACD normalisé.

 

Voici un petit programme tiré du forum Safir qui retourne un MACD "normalisé", ce qui permet de comparer la valeur de cet indicateur d'une action à l'autre.

 

Une vue sur le CAC, avec en fenêtre 2, le MACD normalisé et en fenêtre 3, le MACD ordinaire.

 

hk29.gif

 

Et maintenant le code pour Prorealtime, il faut entrer a, b, c pour les différentes longueurs des moyennes du MACD :

 

value1=exponentialaverage[a](close)
value2=exponentialaverage[b](close)
value3=value1/value2
value4=exponentialaverage[c](value3)
macdborne=value3/value4-1
return macdborne,value3-1,value4-1

Repost 0
Published by hk_lisse - dans Indicateurs
commenter cet article
11 février 2008 1 11 /02 /février /2008 20:00

Le zigzag "rock", version 2.

 

Voici en quelques sortes la version "remasterisée" de l'indicateur zigzag "rock 'n' roll".  Ici, le programme trace tout seul le zigzag.  On peut donc mettre l'indicateur directement sur les prix.  Attention, pour la construction, j'avais besoin des barres du futur et donc l'indicateur ne fonctionne pas en temps réel.......Il faut que le graphe soit figé avec des données EOD. 

 

Les principes sont les mêmes que dans la première version, à savoir :

-high>high[1] et low>=low[1]...........hausse.

-high>=high[1] et low>low[1]...........hausse.

-low<low[1] et high<=high[1]...........baisse.

-low<=low[1] et high<high[1]...........baisse.

-pour les outsidebar's, je reprends la tendance précédente.

-pour les insidebar's, j'inverse la tendance sauf si l'extrême (dans le sens de la tendance) de la barre suivante est supérieur à l'extrême de la barre précédente (j'ai un peu changé par rapport à la version 1), on reste alors dans la tendance.

 

Une vue du CAC avec l'indicateur sur prix :

 

hk28.gif

 

Normalement le programme semble OK mais si vous avez des remarques, il existe une file commentaires.

 

Le code pour Prorealtime :

 

d48=DPO[48](close)
if d48=d48[1] and d48[1]=d48[2] and d48[2]<>d48[3] then
    fin=barindex+23
endif
once b=1
j=j+1
k=50
n=(k*2)-4
p=(n/2)-1
h1=DPO[n](high)
moyh=high-h1
hi=(moyh-moyh[1]+(high[p])/n)*n
hi=(round(hi*100))/100
l1=dpo[n](low)
moyl=low-l1
lo=(moyl-moyl[1]+(low[p])/n)*n
lo=(round(lo*100))/100
if barindex>100 then
    for i= 1 to 49
        if barindex[49-i]=fin-48 then
            if b=1 then
                a=hi[49-i+1]
            else
                a=lo[49-i+1]
            endif
            break
        else
            if b=1 then
                if lo[49-i]<=lo[49-i+1] and hi[49-i]<hi[49-i+1] then
                    if i=1 then
                        b=-1
                        j=0
                    endif
                    a=hi[49-i+1]
                    break
                endif
                if lo[49-i]<lo[49-i+1] and hi[49-i]<=hi[49-i+1] then
                    if i=1 then
                        b=-1
                        j=0
                    endif
                    a=hi[49-i+1]
                    break
                endif
                if lo[49-i]>lo[49-i+1] and hi[49-i]<hi[49-i+1] then
                    if hi[49-i-1]<=hi[49-i+1] then
                        if i=1 then
                            b=-1
                            j=0
                        endif
                        a=hi[49-i+1]
                        break
                    endif
                endif
            endif
            if b=-1 then
                if hi[49-i]>hi[49-i+1] and lo[49-i]>=lo[49-i+1] then
                    if i=1 then
                        b=1
                        j=0
                    endif
                    a=lo[49-i+1]
                    break
                endif
                if hi[49-i]>=hi[49-i+1] and lo[49-i]>lo[49-i+1] then
                    if i=1 then
                        b=1
                        j=0
                    endif
                    a=lo[49-i+1]
                    break
                endif
                if lo[49-i]>lo[49-i+1] and hi[49-i]<hi[49-i+1] then
                    if lo[49-i-1]>=lo[49-i+1] then
                        if i=1 then
                            b=1
                            j=0
                        endif
                        a=lo[49-i+1]
                        break
                    endif
                endif
            endif
        endif
    next
else
    a=high
endif
if j=0 then
    rep=a
endif
if a[1]=rep[1] then
    coef=i
endif
zig=rep+(a-rep)*j/coef
return zig

 

Edit le 10/11 : je prévois déjà une version 3, il faudra changer la logique sur certaines outsidebar's comme pour fin octobre sur le CAC.

Repost 0
Published by hk_lisse - dans Indicateurs
commenter cet article
11 février 2008 1 11 /02 /février /2008 19:24

Le Zigzag "Rock 'n' Roll".

 

Voici un indicateur qui retourne une image différente de la représentation des cours.  A l'origine, j'avais en tête de backtester les fourchettes d'Andrews.  J'avais besoin de détecter les pics et les creux pour y appliquer un zigzag.  Malheureusement le logiciel Prorealtime ne permet pas d'appliquer un zigzag sur un indicateur utilisateur dans un programme (mais je ne désespère pas de trouver une parade).  L'indicateur dans sa phase actuelle ne peut servir que comme aide visuelle à la formation des fourchettes.  Dans sa version complète, on peut aller jusqu'à imaginer la détection de figures chartistes et donc le backtest de celles-ci.

 

La construction de l'indicateur :

- détecter la tendance : higher/high et higher/low = tendance haussière, l'inverse pour la baisse.

- gèrer les outsidebar's : si la tendance est à la hausse, je prends le high, l'inverse pour la baisse.  (1)

- gèrer les insidebar's : si la tendance est à la hausse, je prends le low, l'inverse pour la baisse.  (2)

Ces choix (1 et 2) sont arbitraires, on pourrait en  faire d'autres (par exemple  en fonction de la couleur de la bougie ou du niveau de cloture).

 

La gestion de l'écran (3) : on fait apparaître l'indicateur dans une nouvelle fenêtre, on y ajoute l'indicateur de barcharts colorées (pas le prix car c'est impossible sur un indicateur, et si on commence par le prix, le zigzag se calculera sur le prix et non sur l'indicateur) puis on ajoute le zigzag Prorealtime et enfin on rend invisible l'indicateur.  (vous suivez ?)

 

Voici une vue de l'écran avec l'indicateur brut : en haut, appliqué sur les cours et en bas, seul avec  un zigzag.

 

hk25.gifhk26.gif

 

Une autre vue du CAC au 16/10 avec comme expliqué (3), l'indicateur barcharts colorées en plus (zigzag à 3%) :

 

hk27.gif

 

On constate bien que le zigzag s'applique alternativement sur le low puis sur le high.  Et maintenant le code :

 

once a=high
once b=1
// determination de la bougie
if high>=high[1] and low>low[1] then
    //code=1 // hausse
    a=high
    b=1
endif
if high>high[1] and low>=low[1] then
    a=high
    b=1
endif

if low<=low[1] and high<high[1] then
    //code=2 // baisse
    a=low
    b=-1
endif
if low<low[1] and high<=high[1] then
    a=low
    b=-1
endif
if high>high[1] and low<low[1] then
    //code=3 // outsidebar
    if b=1 then
        a=high
    else
        a=low
    endif
endif
if high<high[1] and low>low[1] then
    //code=4 //insidebar
    if b=1 then
        a=low
        b=-1
    else
        a=high
        b=1
    endif
   
endif
return a

 

PS : j'ai aussi essayé un zigzag à pas variable, mais ça marche pas avec Prorealtime.

Repost 0
Published by hk_lisse - dans Indicateurs
commenter cet article
10 février 2008 7 10 /02 /février /2008 18:17

Programmation du RWI pour Prorealtime.

 

Voici un code pour le RWI de Michael Poulos (Random Walk Index) :

 

b=0
d=0
for i=1 to n do
    a=(high-low[i])/((averagetruerange[i](close[1]))/SQRT(i))
    b=max(b,a)
next
for i = 1 to n do
    c=(high[i]-low)/((averagetruerange[i](close[1]))/sqrt(i))
    d=max(c,d)
next
if b<1 then
    e=-1
else
    if d< 1 then
        e=1
    else
    endif
endif
f=-2
ligne=1
return b as "rwi high",ligne as "ligne1",d as "rwi low",f coloured by e

 

Il faut introduire la période n.

 

Voici une vue du CAC avec l'indicateur RWI de période 7, 20 et 60.

hk24.gif

Repost 0
Published by hk_lisse - dans Indicateurs
commenter cet article
10 février 2008 7 10 /02 /février /2008 17:58

Divergences : Partir d'un cas concret.

 

Cette semaine (article publié la première fois le 08/12/07) dans la sélection de titres US, est tombé PDLI.  L'action présentait une divergence stochastic ainsi qu'une MACD possible.  Je propose de partir du graphe pour établir un setup et voir si cette situation est reproductible.  Voici le  graphe :

 

hk23.gif

 

Les paramètres sont : stochastic 14/3/5 simple et MACD 9/19/6.

Le setup : divergence haussière sur le stochastic, la validation se fait par le croisement de la courbe (noire) et du signal (rouge).  Le MACD croise son signal une barre plus tard, il faut prendre en compte la "possibilité" de la divergence haussière.  Le stochastic croise donc avant le MACD.  On a une reversalbar, la pertinence de cet élément sera étudié.

 

Je vais démarrer avec des programmes le plus simple possible et les corriger au besoin.

 

A suivre..........

Repost 0
Published by hk_lisse - dans Les Divergences
commenter cet article