Overblog Suivre ce blog
Administration Créer mon blog
14 février 2008 4 14 /02 /février /2008 13:45

Cycles : le Bandpass Filter.

 

Dans son dernier fichier (février 2007), J. Ehlers présente le Bandpass Filter et des conseils pour son utilisation.  Il faudrait faire varier les paramètres du filtre (espacement et largeur) afin de se constituer un échantillon.  Hors de ces résultats, on prend le filtre qui a la plus grande amplitude en sortie, celui-ci nous donne le cycle dominant actuellement pour les cours.  Il suffit alors d'introduire cette donnée dans nos indicateurs favoris pour obtenir des indicateurs adaptés aux conditions du marché.

 

Par exemple : RSI = 0.5 * cycle, STOCHASTIC = 0.5 * cycle, CCI = cycle, MACD 0.5 * cycle et 1 * cycle.

 

Voici une vue de l'ES avec le Bandpass Filter et les différents paramètres : 10,12,14,16,18,20.

 

hk75-copie-1.gif

hk76.gif

On constate bien les amplitudes changeantes suivant les conditions du marché, mais comment l'utiliser pour le trading ?

 

Voici le code du filtre pour Prorealtime, il faut introduire en variable la période (period, de 8 à ....) et le delta (0.05, 0.10,  0.25, ......), le programme retourne également la dernière amplitude (pour d'éventuelles comparaisons) :

 

pr=(high+low)/2
if barindex>1 then
    beta=cos(360/period)
    gama=1/cos(720*delta/period)
    alpha=gama-sqrt(gama*gama-1)
    bp=0.5*(1-alpha)*(pr-pr[2])+beta*(1+alpha)*bp[1]-alpha*bp[2]
    lead=(period/6.28318)*(bp-bp[1])
endif
if bp>bp[1] and bp[1]<bp[2] then
    rep1=rep
    rep=bp[1]
endif
if bp<bp[1] and bp[1]>bp[2] then
    rep1=rep
    rep=bp[1]
endif
ecart=abs(rep-rep1)
return bp,lead,0,ecart

 

Une documentation est téléchargeable ici.

Repost 0
Published by hk_lisse - dans Les Cycles
commenter cet article
14 février 2008 4 14 /02 /février /2008 13:05

Cycles : les publications de J. Ehlers, partie 3.

 

Dans le numéro d'août 2006 de S&C, on peut lire un article de J. Ehlers : "Modeling The Market = Building Trading Strategies".  Il y présente 3 indicateurs ainsi que 3 stratégies. 

 

Une vue du Bund avec les indicateurs : en fenêtre 1,  le cours avec l'Instantaneous Trendline (en blanc) et le Modeling The Market (en jaune), en fenêtre 2, l'indicateur Cyclic Component et en fenêtre 3, le StochasticRSI transformation appliqué au Model.

 

hk72.gif

 

Voici les codes pour Prorealtime, on peut faire varier le prix de référence (medianprice par défaut), la longueur de la moyenne (20 par défaut) ainsi que les paramètres du StochasticRSI :

 

pr=(high+low)/2
len=20
sma=average[len](pr)
sl=pr-pr[len-1]
ssl=(sl+2*sl[1]+2*sl[2]+sl[3])/6
itrend=sma+0.5*ssl

a=(1-SIN(360/len))/cos(360/len)
if barindex<50 then
   
    hp=exponentialaverage[2*len+1]((1+a)*(pr-pr[1]))
else
   
    hp=(0.5*(1+a)*(pr-pr[1]))+(a*hp[1])
endif

shp=(hp+2*hp[1]+2*hp[2]+hp[3])/6
model=itrend+shp

return itrend,model


----------------------------------------

 

pr=(high+low)/2
len=20
a=(1-SIN(360/len))/cos(360/len)
if barindex<50 then
    hp=exponentialaverage[2*len+1]((1+a)*(pr-pr[1]))
else
    hp=(0.5*(1+a)*(pr-pr[1]))+(a*hp[1])
endif
shp=(hp+2*hp[1]+2*hp[2]+hp[3])/6

return shp,0

 

-----------------------------------

 

pr=(high+low)/2
len=20
rlen=8
stolen=8
wlen=5
sma=average[len](pr)
sl=pr-pr[len-1]
ssl=(sl+2*sl[1]+2*sl[2]+sl[3])/6
itrend=sma+0.5*ssl

a=(1-SIN(360/len))/cos(360/len)
if barindex<50 then
    hp=exponentialaverage[2*len+1]((1+a)*(pr-pr[1]))
else
    hp=(0.5*(1+a)*(pr-pr[1]))+(a*hp[1])
endif
shp=(hp+2*hp[1]+2*hp[2]+hp[3])/6
model=itrend+shp

cu=0
cd=0
cu=max(0,model-model[1])
cd=max(0,model[1]-model)
cu1=average[rlen](cu)
cd1=average[rlen](cd)
if cuave<>-cdave then
    rsio=cuave/(cuave+cdave)
endif
if barindex >60 then
    cuave=(cuave[1]*(rlen-1)+cu1)/rlen
    cdave=(cdave[1]*(rlen-1)+cd1)/rlen
endif
if cuave<>-cdave then
    rsio=cuave/(cuave+cdave)
endif
mrs=rsio
hir=highest[stolen](mrs)
lor=lowest[stolen](mrs)
stor=(mrs-lor)/(hir-lor)
stari=0
div=0
for i=0 to wlen-1
    stari=stari+(wlen-i)*stor[i]
    div=div+i+1
next
stori=stari/div
trig=0.05+0.9*stori[1]
if stori>trig then
    flag=-.1
else
    flag=0
endif
if stori<trig then
    flagb=-.1
else
    flagb=0
endif

return stori,trig,flag,flagb

 

-----------------------------------

 

La première stratégie utilise uniquement l'Instantaneous Trendline.  On rentre à l'achat quand la courbe croise à la hausse l'indicateur retardé de 2 périodes.  Les conditions de vente sont inverses, on a un système SAR.  Sur la vue suivante, j'ai  optimisé la période de la moyenne et le nombre de barres de retard.  Voici l'EC avec len=27 et delay=3 (pas de slippage, frais de 4 eur A/R par contrat) :

 

hk73.gif

 

Et maintenant, le code du backtest pour Prorealtime :

 

pr=(high+low)/2
len=a
rem b=delay
sma=average[len](pr)
sl=pr-pr[len-1]
ssl=(sl+2*sl[1]+2*sl[2]+sl[3])/6
itrend=sma+0.5*ssl
REM Achat
c1 = (itrend CROSSES OVER itrend[b])
IF c1 THEN
    BUY 1 SHARES AT MARKET THISBARONCLOSE
ENDIF
REM Vente
c2 = (itrend CROSSES UNDER itrend[b])
IF c2 THEN
    SELL  AT MARKET THISBARONCLOSE
ENDIF
REM Vente à découvert
c3 = (itrend CROSSES UNDER itrend[b])
IF c3 THEN
    SELLSHORT 1 SHARES AT MARKET THISBARONCLOSE
ENDIF
REM Rachat
c4 = (itrend CROSSES OVER itrend[b])
IF c4 THEN
    EXITSHORT  AT MARKET THISBARONCLOSE
ENDIF

 

--------------------------------------------------------------------------------

 

La seconde stratégie consiste à prendre position au croisement du StochasticRSI avec son signal, c'est également un système SAR.  Voici une vue de l'EC avec les paramètres optimisés, len=19, rlen=16, stolen=19, wlen=7 (pas de slippage et 4 eur de frais A/R par contrat) :

 

hk74.gif

 

Et le code Prorealtime du backtest :

 

pr=(high+low)/2
len=aa
rlen=bb
stolen=cc
wlen=dd
sma=average[len](pr)
sl=pr-pr[len-1]
ssl=(sl+2*sl[1]+2*sl[2]+sl[3])/6
itrend=sma+0.5*ssl

a=(1-SIN(360/len))/cos(360/len)
if barindex<50 then
    hp=exponentialaverage[2*len+1]((1+a)*(pr-pr[1]))
else
    hp=(0.5*(1+a)*(pr-pr[1]))+(a*hp[1])
endif
shp=(hp+2*hp[1]+2*hp[2]+hp[3])/6
model=itrend+shp

cu=0
cd=0
cu=max(0,model-model[1])
cd=max(0,model[1]-model)
cu1=average[rlen](cu)
cd1=average[rlen](cd)
if cuave<>-cdave then
    rsio=cuave/(cuave+cdave)
endif
if barindex >60 then
    cuave=(cuave[1]*(rlen-1)+cu1)/rlen
    cdave=(cdave[1]*(rlen-1)+cd1)/rlen
endif
if cuave<>-cdave then
    rsio=cuave/(cuave+cdave)
endif
mrs=rsio
hir=highest[stolen](mrs)
lor=lowest[stolen](mrs)
stor=(mrs-lor)/(hir-lor)
stari=0
div=0
for i=0 to wlen-1
    stari=stari+(wlen-i)*stor[i]
    div=div+i+1
next
stori=stari/div
trig=0.05+0.9*stori[1]

REM Achat
c1 = (stori CROSSES OVER trig)
IF c1 THEN
    BUY 1 SHARES AT MARKET THISBARONCLOSE
ENDIF
REM Vente
c2 = (stori CROSSES UNDER trig)
IF c2 THEN
    SELL  AT MARKET THISBARONCLOSE
ENDIF
REM Vente à découvert
c3 = (stori CROSSES UNDER trig)
IF c3 THEN
    SELLSHORT 1 SHARES AT MARKET THISBARONCLOSE
ENDIF
REM Rachat
c4 = (stori CROSSES OVER trig)
IF c4 THEN
    EXITSHORT  AT MARKET THISBARONCLOSE
ENDIF

Repost 0
Published by hk_lisse - dans Les Cycles
commenter cet article
14 février 2008 4 14 /02 /février /2008 12:51

Cycles : les publications de J. Ehlers, partie 2.

 

Voici un second système présenté dans le fichier "TAG22 Rocket Science".  Les codes viennent toujours d'Arnaudbzh chez dakoté.  J'ai trouvé relativement peu d'information sur son utilisation.  Comme pour le système 1, il y a une trendline et un filtre mais le code est différent.  De même le calcul de la période et du rapport signal/bruit est autre.  Au final, les zones de cycle et de trend ne sont pas communes aux 2 systèmes.  L'indicateur Awesome est fait pour confirmer le signal sur le Sinewave.  La valeur du rapport signal/bruit négative me paraît bizarre.  J'ai corrigé la fonction ROUND en INTEGER, de même dans le fichier que j'ai, il n'est pas fait mention de la condition de bruit>6 dB codée par Arnaudbzh pour le Mode.

 

Voici une vue du CAC avec les indicateurs : en fenêtre 1, le prix avec la TRENDLINE et le filtre, en fenêtre 2, le MODE version Arnaudbzh, en fenêtre 3, le MODE version hk, en fenêtre 4,  l'indicateur CORE, en fenêtre 5, l'indicateur de PHASE, en fenêtre 6, l'indicateur SNR, en fenêtre 7, le SINEWAVE et en fenêtre 8, l'indicateur AWESOME.

 

hk71.gif

 

Et maintenant les codes :

 

REM CORE CODE - CYCLE PERIOD CODE
REM Indicateur "CORE"

Price = (High+Low)/2

IF Barindex > 5 THEN
   
    REM Compensating Hilbert Transforms
    Smoother = (4*Price + 3*Price[1] + 2*Price[2] + Price[3]) / 10
    Detrender = (0.25*Smoother + 0.75*Smoother[2] - 0.75*Smoother[4] - 0.25*Smoother[6]) * (0.046*Period [1] + 0.332)
   
    REM Compute InPhase and Quadrature components
    Q1 = (0.25*Detrender + 0.75*Detrender[2] - 0.75*Detrender[4] - 0.25*Detrender[6]) * (0.046*Period[1] + 0.332)
    I1 = Detrender[3]
   
    REM advance the phase of I1 and Q1 by 90 degrees
    JI = 0.25*I1 + 0.75*I1[2] - 0.75*I1[4] - 0.25*I1[6]
    JQ = 0.25*Q1 + 0.75*Q1[2] - 0.75*Q1[4] - 0.25*Q1[6]
   
    REM Phasor addition to equalize amplitude due to quadrature calculations (and 3 bar averaging)
    I2 = I1 - JQ
    Q2 = Q1 + JI
   
    REM Smooth the I and Q components before applying the discriminator
    I2 = 0.15*I2 + 0.85*I2[1]
    Q2 = 0.15*Q2 + 0.85*Q2[1]
   
    REM Homodyne Discriminator
    REM Complex Conjugate Multiply
    X1 = I2*I2[1]
    X2 = I2*Q2[1]
    Y1 = Q2*Q2[1]
    Y2 = Q2*I2[1]
    Re = X1 + Y1
    Im = X2 - Y2
   
    REM Smooth to remove undesired cross products
    Re = 0.2*Re + 0.8*Re[1]
    Im = 0.2*Im + 0.8*Im[1]
   
    REM Compute cycle period
    IF Im <> 0 and Re <> 0 THEN
        Period = 360/ATAN(Im/Re)
    ENDIF
   
    IF Period > 1.5*Period[1] THEN
        Period = 1.5*Period[1]
    ENDIF
   
    IF Period < 0.67*Period[1] THEN
        Period = 0.67*Period[1]
    ENDIF
   
    IF Period < 6 THEN
        Period = 6
    ENDIF
   
    IF Period > 50 THEN
        Period = 50
    ENDIF
   
    Period = 0.2*Period + 0.8*Period[1]
   
ENDIF

RETURN Period as "PERIOD" , Q1 as "Q1" , I1 as "I1"


-------------------------------------------------------------------

 

REM Measuring Phase
REM Indicateur "CORE PHASE2"


Price = (High + Low)/2
myPERIOD, myQ1,myI1 = CALL "CORE"

IF Barindex > 50 THEN
    p1=myperiod/10 MOD 10
    p2=myperiod mod 10
    int=p1*10+p2
   
    value5 =int
    RealPart = 0
    ImagPart = 0
   
    IF Value5 > 6 THEN
        For count = 0 To Value5 - 1
            RealPart = RealPart + Sin(360 * count / Value5) * (Price[count])
            ImagPart = ImagPart + Cos(360 * count / Value5) * (Price[count])
        NEXT
    ENDIF
   
    RealPart = 0.33*RealPart + 0.67*RealPart[1]
    ImagPart = 0.33*ImagPart + 0.67*ImagPart[1]
   
    IF ABS(ImagPart) > 0.001 THEN
        DCPhase = ATAN(RealPart / ImagPart)
    ENDIF
   
    If ABS(ImagPart) <= 0.001 THEN
        DCPhase = 90 *SGN(RealPart)
       
    ENDIF
   
    REM Compensate phase for smoothing lag prior to taking the arctangent
    DCPhase = DCPhase + 720 / myPERIOD
    DCPhase = DCPhase + 90
   
    IF ImagPart < 0 and myQ1 <> 500 and myI1 <> 500 THEN
        DCPhase = DCPhase + 180
    ENDIF
   
    IF DCPhase > 270 THEN
        DCPhase = DCPhase - 360
    ENDIF
   
ENDIF

RETURN DCPhase as "DCPhase"

----------------------------------------------------

 

REM Signal-to-Noise Indicator Code
REM Indicateur "CORE SNR"
REM Ajout ligne horizontale = 6

ignored, my1,my12 = CALL "CORE"

IF Barindex > 50 THEN
   
   
   
    REM Signal Amplitude Squared comes directly from the discriminator
    Signal = SQRT(my12*my12 + my1*my1)
   
    REM Noise is a 20 bar EMA of ranges squared
    Noise = 0.1*(High - Low)*(High - Low) + 0.9*Noise[1]
   
    REM Convert to dB and smooth with EMA
    IF Noise <> 0 and Signal <> 0  THEN
        SNR = 0.33*(10*Log(Signal/Noise)/Log(10)) + 0.67*SNR[1]
    ENDIF
   
ENDIF

RETURN SNR as "SNR",6

-----------------------------------------------------------

 

REM The Sinewave Indicator
REM Indicateur "CORE SINEWAVE"
REM Calcul du SINE et du LEAD_SINE
REM Sinus de la phase et ce même sinus avancé de 45°

myDCPhase = CALL "CORE PHASE2"

IF Barindex > 5 THEN
    SINE = SIN(myDCPhase)
    LEADSINE = SIN(myDCPhase + 45)
ENDIF


RETURN SINE as "SINE" , LEADSINE as "LEAD SINE"

----------------------------------------------------------------------

 

REM The Awesome Oscillator
REM Indicateur "CORE AWESOME"

Price = (High+Low)/2

IF Barindex > 12 THEN
   
    Value1 = (4*Price + 3*Price[1] + 2*Price[3] + Price[4])/10
    Value2 = Value1 + 0.088*Value2[6]
    Value3 = Value2 - Value2[6] + 1.2*Value3[6] - 0.7*Value3[12]
   
    Detrend = Value3[12] - 2*Value3[6] + Value3
    Smooth = 0.13785*(2*Detrend - Detrend[1]) + 0.0007*(2*Detrend[1] - Detrend[2])+ 0.13785*(2*Detrend[2] - Detrend[3]) + 1.2103*Smooth[1] - 0.4687*Smooth[2]
   
ENDIF

RETURN Detrend as "Detrend" , Smooth as "Smooth",0

 

------------------------------------------------------------------------------

 

REM Instantaneous Trendline Code
REM Indicateur "CORE TRENDLINE"

Price = (High + Low)/2
myPERIOD, ignored,ignored = CALL "CORE"

IF Barindex <= 50 tHEN
    aa = Close
ENDIF

IF Barindex > 50 THEN
    p1=myperiod/10 MOD 10
    p2=myperiod mod 10
    int=p1*10+p2
   
    value5 =int
   
    aa = 0
endif

FOR count = 0 TO Value5 - 1
    aa = aa + Price[count]
NEXT

IF Value5 <> 0 THEN
    aa = aa / Value5
   
    bb = 0.25*aa + 0.75*bb[1]
    Smooth = (7*Price + 6*Price[1] + 5*Price[2] + 4*Price[3] + 3*Price[4] + 2*Price[5] + Price[6])/28
   
ENDIF

return bb as "Trend", Smooth as "Smooth"

---------------------------------------------------------------

 

REM Market Mode Detector
REM Indicateur "CORE MODE2"

myDCPhase = CALL "CORE PHASE2"
myPERIOD, myQ1,myI1 = CALL "CORE"
//mySNR,ignored = CALL "core snr"

p1=myperiod/10 MOD 10
p2=myperiod mod 10
int=p1*10+p2

value5 =int

REM Rule 1: Sinewave Indicator Crossing initializes half cycle crossing timing when SNR > 6 dB
IF Sin(myDCPhase) Crosses Over Sin(myDCPhase + 45) OR Sin(myDCPhase) Crosses Under Sin(myDCPhase + 45) then//and mySNR > 6 THEN
    DaysInTrend = 0
    Trend = 0
    Cycles = 1
ENDIF

DaysInTrend = DaysInTrend + 1

REM Rule2: Phase rate of change must be within 50% of dominant cycle phase rate of change
IF Value5 <> 0 and myDCPhase - myDCPhase[1] > 0.67*360/Value5 and myDCPhase - myDCPhase[1] < 1.5*360/Value5 THEN
    Trend = 0
    Cycles = 1
ENDIF

IF DaysInTrend > 0.5*myPERIOD and myQ1 <> 500 and myI1 <> 500 THEN
    Trend = 1
    Cycles = 0
ENDIF

RETURN Trend as "Trend" , Cycles as "Cycles"

 

Repost 0
Published by hk_lisse - dans Les Cycles
commenter cet article
14 février 2008 4 14 /02 /février /2008 12:06

Cycles : les publications de J. Ehlers (partie 1).

 

J. Ehlers publie sur son site (mesasoftware.com)  une série de papiers, d'indicateurs et de systèmes sur le trading à base de cycles.  Je reprends, ici, pour un premier système, les codes écrits par Arnaudbzh pour Prorealtime chez dakoté ainsi que les explications de Smallcaps90 sur son fonctionnement.  Je ne suis pas convaincu de l'efficacité du système clefs en mains, mais la façon dont Ehlers aborde le problème des cycles devait figurer dans ce dossier.  Ce système est présenté dans le fichier "OWorld2000RocketScience".

 

Une vue du CAC avec les différents indicateurs.  En fenêtre 1, le cycle Prorealtime pour comparaison.  En fenêtre 2, le CAC avec l'indicateur TRENDLINE (magenta) et le filtre KALMAN (blanc).  En fenêtre 3,  l'indicateur de PERIODE.  En fenêtre 4, l'indicateur de PHASE.  En fenêtre 5, l'indicateur de RAPPORT SIGNAL/BRUIT (RSB).  En fenêtre 6, l'indicateur SINEWAVE et en fenêtre 7, l'indicateur de MODE CYCLE/TENDANCE.

 

hk70.gif

 

Les commentaires de Smallcaps90 :

 

"Le programme recherche le cycle dominant présent en calculant sa période, sa phase et le rapport signal/bruit en dB.  Il permet de déterminer le mode dans lequel les cours se trouvent : cycle ou tendance.  La méthode est basée sur la transformation de Hilbert et les travaux de J. P. Burg sur le "maximum d'entropie" pour extraire d'un signal sa composante sinusoïdale dominante.

 

Lorsque le filtre de Kalman croise la Trendline, on calcule la période.  Si la courbe Kalman ne recroise pas la Trendline avant un demi-cycle, alors on est en mode tendance.  Si on rentre à ce moment, le signal de sortie est le prochain croisement de Kalman avec la Trendline où on quitte le mode tendance pour le mode cycle.

 

En mode cycle, on prend position au croisement du Sinewave par la courbe Lead-Sinewave.  On ressort au croisement suivant.  Un rapport signal/bruit > 6 dB conforte l'hypothèse du mode cycle dominant.  Ehlers propose le critère suivant pour l'entrée : le rapport de la distance crête à creux (ou l'inverse) sur le filtre Kalman par la moyenne des longueurs des barres des cours sur la partie précédente de courbe comprise entre les croisements précédents du Sinewave et de son signal.  Si ce rapport est au moins de 2, une prise de position est possible (en fait un filtre sur la volatilité et l'amplitude du cycle) et l'amplitude attendue du futur mouvement serait suffisante.

 

Les règles de passage d'un mode à l'autre sont les suivantes :

-Un croisement Sinewave/Lead-Sinewave fait passer en mode cycle si le rapport signal/bruit est > 6 dB et si la phase du cycle est quasiment linéaire sur une période complète de ce cycle (Smallcaps90 utilise un taux de variation de la phase de 0.3).

-Lorsqu'un croisement entre la Trendline et le filtre Kalman apparaît, on enclenche un compteur qui s'incrémente à chaque barre.  Si le mode est tendance, la confirmation de celui-ci n'intervient qu'après un nombre de barres égale à la demi-période du cycle."

 

Les codes d'Arnaudbzh des indicateurs pour Prorealtime :

 

REM TRENDLINE DE J. EHLERS
REM Indicateur "MESA PERIODE"
REM Calcul de la période du cycle dominant

PRIX = (high + low) / 2

IF Barindex <= 5 THEN
    PERIODE = 0
    V5 = 0
ENDIf

IF Barindex > 5 THEn
    REM Détermination de la phase de chaque tic
    V1 = PRIX - PRIX[6]
    V2 = V1[3]
    V3 = 0.75*(V1-V1[6])+0.25*(V1[2]-v1[4])
    ENPHASE = 0.33*V2+0.67*ENPHASE[1]
    ENQUADRATURE = 0.2*V3 + 0.8*ENQUADRATURE[1]
    IF ABS(ENPHASE + ENPHASE[1]) > 0 THEN
        A = ABS((ENQUADRATURE + ENQUADRATURE[1]) / (ENPHASE+ENPHASE[1]))
        PHASEDEG = ATAN(A)
    endif
   
    REM Correction si autres quadrants
    IF ENPHASE < 0 AND ENQUADRATURE > 0 THEN
        PHASEDEG = 180 - PHAsedeg
    endif
   
    IF ENPHASE < 0 AND ENQUADRATURE < 0 THEN
        PHASEDEG = 180 + PHASEDeg
    endif
   
    IF ENPHASE > 0 AND ENQUADRATURE < 0 THEN
        PHASEDEG = 360 - PHASedeg
    endif
   
    REM Phase différentielle et corrections éventuelles
    DELTAPHASE = PHASEDEg[1]-phasedeg
    IF PHASEDEG[1] < 90 AND PHASEDEG > 270 THEN
        DELTAPHASE = 360 + DELTaphase
    endif
   
    IF DELTAPHASE < 1 THEN
        DELTAPhase=1
    endif
   
    IF DELTAPHASE > 60 THEN
        DELTAphase=60
    endif
   
    REM Calcul de la période instantanée du cycle actuel
    REM et correction éventuelle
    PERIODEINSTANT = 0
    V4 = 0
    J = 0
    WHILE J<41
        V4 = V4 + DELTAPHASE[J]
        IF V4>360 AND PERIODEINSTANT=0 THEN
            PERIODEINSTANT =J
        ENDIF
        J=J+1
    WEND
   
    IF PERIODEINSTANT=0 THEN
        PERIODEINSTANT = PERIODEINSTANT[1]
    ENDIF
   
    REM Calcul de la PERIODE
    V5 = 0.25 * PERIODEINSTANT +0.75*V5[1]
    periode=v5
ENDIF

RETURN PERIODE as "PERIODE" , DELTAPHASE as "deltaphase"

-------------------------------------------------------------------------------

REM TRENDLINE DE J. EHLERS
REM Indicateur "MESA PHASE"
REM Calcul de la phase du cycle dominant

IF Barindex > 5 THEN
   
    PRIX = (high + low) / 2
    myPERIODE, myDELTAPHASE = CALL "MESA PERIODE"
   
    PERIODE = ROUND(myPERIODE)
   
    PARTIEREELLE = 0
    PARTIEIMAGINAIRE = 0
   
    K = 0
    REM Calcul en degrés
    WHILE K < PERIODE
        PARTIEREELLE = PARTIEREELLE + SIN(360*K/PERIODE)*PRIX[K]
        PARTIEIMAGINAIRE = PARTIEIMAGINAIRE + COS(360*K/PERIODE)*PRIX[K]
        K = K+1
    WEND
   
    IF ABS(PARTIEIMAGINAIRE) > 0.001 THEN
        DCPHASEDEG = ATAN(PARTIEREELLE/PARTIEIMAGINAIRE)
    ENDIF
   
    IF ABS(PARTIEIMAGINAIRE) <= 0.001 THEN
        IF PARTIEREELLE >= 0 THEN
            SIGNEPARTIEREELLE=1
        ELSE
            SIGNEPARTIEREELLE=-1
        ENDIF
        DCPHASEDEG = 90*SIGNEPARTIEREELLE
    ENDIF
   
    DCPHASEDEG = DCPHASEDEG + 90
   
    IF PARTIEIMAGINAIRE<0 THEN
        DCPHASEDEG = DCPHASEDEG + 180
    ENDIF
   
    IF DCPHASEDEG>315 AND DCPHASEDEG<=360 and myDELTAPHASE <> 500 THEN
        DCPHASEDEG = DCPHASEDEG - 360
    ENDIF
   
    PHASE = DCPHASEDEG
       
ENDIF

RETURN PHASE as "PHASE"

-------------------------------------------------------------------------------------------

REM Indicateur "MESA RSB"
REM Calcul du rapport signal / bruit (RSB en dB)
REM Ajout ligne horizontale = 6


IF Barindex <= 8 THEN
    RSB = 0
    RANGERSB = 0
    ENPHASE = 0
    ENQUADRATURE = 0
ENdif

IF Barindex > 8 THEn
    PRIX = (high + low) /2
    REM Détermination des composantes en phase et en quadrature
    REM Transformation de Hilbert
    RANGERSB = 0.2*(high - low) + 0.8*RANGERSB[1]
    V1 = PRIX-PRIX[6]
    V2 = V1[3]
    V3 = 0.75*(V1-V1[6]) + 0.25*(V1[2]-V1[4])
    ENPHASE = 0.33*V2 + 0.67*ENPHASE[1]
    ENQUADRATURE = 0.2*V3 + 0.8*Enquadrature[1]
    REM Lissage du rapport signal/bruit
    V2 = 0.2*(square(ENPHASE) + square(ENQUADRATURE)) + 0.8*V2[1]
    REM Calcul du rapport signal/bruit lissé
    IF V2<0.001 THEN
        V2=0.001
    endif
   
    IF RANGE>0 THEN
        RSB = 0.25*(10* LOG(V2 / square(RANGERSB)) / LOG(10)+4.7) + 0.75*RSB[1]
    ENDif
endif

RETURN RSB as "Rapport Signal-Bruit"

---------------------------------------------------------------------------------------

REM TRENDLINE DE J. EHLERS
REM Indicateur "MESA SINEWAVE"
REM Calcul du SINEWAVE et du LEAD_SINEWAVE
REM Sinus de la phase et ce même sinus avancé de 45°

myPHASE = CALL "MESA PHASE"

IF Barindex > 5 THEN
    PHASE = myPHASE
    SINEWAVE = SIN(PHASE)
    LEADSINEWAVE = SIN(PHASE + 45)
ENDif

RETURN SINEWAVE as "SINEWAVE" , LEADSINEWAVE as "LEAD SINEWAVE"
------------------------------------------------------------------------------------------------

REM TRENDLINE DE J. EHLERS
REM Indicateur "MESA TRENDLINE"
REM Calcul de la TRENDLINE et du FILTRE DE KALMAN
REM Utilisés comme 2 moyennes mobiles adaptatives en mode Tendance

IF Barindex > 5 THEN
   
    PRIX = (high + low) /2
    myPERIODE, myDELTAPHASE = CALL "MESA PERIODE"
   
    PERIODE = ROUND(myPERIODE)
    TRENDLINE = 0
    J =0
    WHILE J < PERIODE+2
        TRENDLINE = TRENDLINE + PRIX[J]
        J = J+1
    wend
   
    IF PERIODE>0 THEN
        TRENDLINE = TRENDLINE / (PERIODE+2)
    endif
   
    REM Filtre de Kalman zero lag
    KALMAN = 0.33*(PRIX + 0.5*(PRIX - PRIX[3])) + 0.67*Kalman[1]
    IF Barindex<26 and myDELTAPHASE <> 500 THEN
        TRENDLINE = PRIX
        KALMAN =prix
    ENDIf
endif

RETURN TRENDLINE as "TRENDLINE" , KALMAN as "KALMan"
----------------------------------------------------------------------------------------

REM TRENDLINE DE J. EHLERS
REM Indicateur "MESA CYCLE TENDANCE"
REM Essai de détermination du mode cycle ou tendance
REM Variable P1 = 0.3

myPERIODE, myDELTAPHASE = CALL "MESA PERIODE"
mySINEWAVE, myLEADSINEWAVE = CALL "MESA SINEWAVE"
myTRENDLINE, myKALMAN = CALL "MESA TRENDLINE"
myRapportSignalBruit = CALL "MESA RSB"

P = myPERIODE
DEL = myDELTAPHASE
S = mySINEWAVE
LS = myLEADSINEWAVE
TL = myTRENDLINE
K = myKALMAN
RSB = myRapportSignalBruit

TENDANCE=1
CYCLES=0

REM Détecter un croisement LS/S et initialiser le mode cycle si RSB suffisant
IF LS crosses over S OR LS crosses under S AND RSB>6 THEN
    TENDANCE=0
    CYCLES=1
ENDIf

REM Vérifier progressivité de la variation de la phase
IF P<>0 AND DEL>(1-P1)*360 / P AND DEL<(1+P1)*360 / P THEN
    TENDANCE=0
    CYCLES=1
endif

REM Détecter un croisement K/TL et initialiser le compteur de jours
IF K crosses over TL OR K crosses under TL THEN
    NB=0
endif
REM Incrémenter compteur de jours
NB=nb+1
REM Confirmer mode cycle si compteur < une demi-période, sinon tendance
IF NB<P/2 THEN
    CYCLES=1
    TENDANCE=0
ELSE
    CYCLEs=0
    tendance=1
endif

RETURN CYCLES as "CYCLES", TENDANCE as "TENDANCE"

Repost 0
Published by hk_lisse - dans Les Cycles
commenter cet article
14 février 2008 4 14 /02 /février /2008 11:34

Cycles : le Relative Spread Strength (RSS).

 

Dans le numéro 10/06 de S&C, Ian Copsey présente le relative spread strenght (RSS) pour identifier les cycles.  Il applique le RSI de Wilder à la différence (spread) entre deux moyennes mobiles.  Les divergences entre les sommets/creux des cours et les sommets/creux du RSS peuvent être exploiter pour le trading.

 

J'ai appliquer la même technique pour créer un "spread stochastic".

 

Une vue du CAC avec pour comparaison en-dessous, le Detrend20 et le spread stochastic superposé, le RSS, le spread stochastic avec une SMA3 de celui-ci pour la visibilité, et enfin le cycle Prorealtime.

 

hk69.gif

 

Le code du relative spread strength :

 

z1=0
y1=0
m10=exponentialaverage[10](close)
m40=exponentialaverage[40](close)
spr1=m10-m40
chang1=spr1-spr1[1]
for i=0 to 4
    if chang1[i]>0 then
        z1=z1+chang1[i]
    endif
    if chang1[i]<0 then
        y1=y1-chang1[i]
    endif
next
if y1=0 then
    y1=.00001
endif
rs21=z1/y1
srsi21=average[5](100-(100/(1+rs21)))
return srsi21,20,30,50,70,80

 

Le code du "spread stochastic" :

 

ema1=exponentialaverage[10](close)
ema2=exponentialaverage[40](close)
spread=ema1-ema2
spr=spread-spread[1]
ll=lowest[5](spr)
hh=highest[5](spr)
stoc1=100*(spr-ll)/(hh-ll)
return average[5](stoc1),20,80,50

Repost 0
Published by hk_lisse - dans Les Cycles
commenter cet article
14 février 2008 4 14 /02 /février /2008 10:59

Cycles : le Double Stochastic.

 

Walter Bressert donne également une autre technique pour générer des signaux de trading basés sur les cycles.  Il utilise le double stochastic, c'est le stochastic d'un stochastic.   Il baptise DBS 10 un double stochastic exponentiel 10/3.

 

A l'achat, le signal est déterminé par un retournement de l'indicateur sous 40.  La barre est marquée.  Si le cours dépasse le high de cette barre, le signal est déclenché.  Stop sous le point bas du cycle.

 

A la vente, le signal est déterminé par un retournement au dessus de 70........puis procédure inverse de l'achat.

 

Voici une vue du CAC avec dans l'ordre : le cycle Prorealtime, le CAC avec les barres marquées, le Detrend20 avec superposé le DBS10 et enfin le DBS10 avec en jaune/vert, les signaux.

 

hk67.gif

 

Les signaux sont plus fréquents qu'avec le RSI3M3 et demandent donc un filtrage à mon avis.  Bressert utilise aussi un DBS5, double stochastic 5/3, avec  encore plus de signaux (signal au-dessus de 90 et en-dessous de 10).  Il préconise la simultanéité des signaux  ou la confirmation pour augmenter les chances de réussite.

 

Je mets le backtest du RSI3M3 et du DBS10 dans la to-do-list.

 

Trouvé sur le net, un autre indicateur utilisant le stochastic pour le cycle : comparaison avec le cycle Prorealtime.

 

hk68.gif

 

A creuser en faisant varier les valeurs des moyennes mobiles peut-être.  Voici le code :

 

slw=3
pds=7
ratio=ExponentialAverage[3](close)/ExponentialAverage[7](close)
divi=highest[pds](ratio)-lowest[pds](ratio)
a=exponentialaverage[slw]((ratio-lowest[pds](ratio))/divi)*100
divi2=highest[pds](a)-lowest[pds](a)
dss=exponentialaverage[slw]((a-lowest[pds](a))/divi2)*100
return dss,10,90

 

Repost 0
Published by hk_lisse - dans Les Cycles
commenter cet article
14 février 2008 4 14 /02 /février /2008 09:12

Cycles : le point de vue de Walter Bressert.

 

Walter Bressert a développé toute une théorie sur le trading à base de cycle.  A vous de vous faire une idée, son site : www.walterbressert.com/

 

Selon lui, les marchés ont un cycle dominant compris entre 14 et 25 barres et pour la plupart entre 18 et 22 barres, soit en moyenne 20 barres.  Les cycles se mesurent de  creux à creux.   Pour identifier les cycles, il utilise une moyenne mobile de même longueur que celle du probable cycle (on tatonne un peu, mais on prend en général 20 pour commencer).  Ensuite Bressert décale cette moyenne  au milieu du cycle en la reculant de (période/2) barres, donc pour une moyenne 20, on recule de 10 barres.  Il affiche alors l'écart du cours avec cette moyenne décalée.  L'indicateur DPO (Detrended Price Oscillator) est conçu pour cet usage.  Un exemple sur le CAC :

 

hk62.gif

hk63-copie-1.gif

Avec dans l'ordre, le cycle Prorealtime, le Detrend10  (un indicateur à ma sauce), le Detrend14, le Detrend20 et enfin le DPO20Close Prorealtime.  On peut ainsi visualiser les cycles du passé, malheureusement de part sa construction, l'indicateur s'arrête x barres avant la barre actuelle : ne nous renseignant pas précisement sur la phase en cours.  Il ne reste plus qu'à trouver un oscillateur qui nous renseigne sur le cycle en temps réel et pas uniquement sur ceux du passé.

 

hk64.gif

 

Ici, on voit que l'écart entre les creux, varie de 15 à 22 barres.  On peut  en déduire  les cycles précédents.

 

Bressert préconise d'utiliser le RSI3M3 comme oscillateur pour identifier le cycle.  Pour le construire, il applique une moyenne3 à un RSI3.  Il construit également un Detrended RSI qui est l'écart entre le RSI3M3 et une moyenne5 de celui-ci.

 

Voici une comparaison des différents oscillateurs superposés au Detrend20 : en 1, le Detrended RSI, en 2, le RSI3M3 et en 3, le cycle Prorealtime.

 

hk65.gif

 

Toujours les mêmes problèmes : les périodes de range ou de trend et l'intervention  contre tendance.

 

Walter Bressert génère automatiquement des signaux de trading avec le setup suivant (pour l'achat) :

- le RSI3M3 est sous le niveau 30.

- le RSI3M3 se retourne et la barre qui provoque ce retournement est marquée.

- un ordre stop à l'achat est entré  au-dessus du high de la barre marquée.

- une fois l'achat effectué, un ordre stop est passé sous le prix le plus bas du creux du cycle.

Un exemple sur le CAC :

 

hk66.gif

 

En haut, le RSI3M3 avec le signal, et en bas, le Detrend20 avec les creux de cycles.  Les signaux a,b,c,d,e, et f interviennent près d'un creux du cycle.  Le signal g ne se déclenche pas (high non dépassé), 5 signaux sur 6 déclenchés peuvent être gagnants.  Le système ne donne pas de signal lorsque le trend est fort (par exemple en h).  Dans ces cas là Bressert conseille l'emploi du DetrentedRSI, encore faut-il repérer les tendances fortes.  De plus, je trouve que le lag est plus important ainsi que le nombre de signaux.  Selon Bressert, il est plus efficace (je n'en doute pas) d'intervenir dans le sens du trend.  Pour le déterminer, il affiche deux EMA's (par exemple 25 et 50) ou alors il prend le cycle de l'UT supérieure (cycle primaire).

 

 

Je reviendrai sur le système développé par Bressert avec des stochastics lissés.

Repost 0
Published by hk_lisse - dans Les Cycles
commenter cet article
12 février 2008 2 12 /02 /février /2008 20:28

L'indicateur Cycle de Prorealtime.

 

La plateforme Prorealtime contient un indicateur de cycle, celui-ci vient d'Eric Lefort.  La formule est basée sur une combinaison de stochastics avec le calcul d'un premier indicateur STPMT.  La différence de cet indicateur STPMT avec une moyenne 9 simple donne l'indicateur cycle.

 

STPMT=(4,1*sto(5,3)+2,5*sto(14,3)+sto(45,14)+4*sto(75,20))/11.6

 

CYCLE=STPMT-moyenne 9 simple (STPMT)

 

Une vue du CAC :

 

hk60.gif

 

Le seconde fenêtre affiche le STPMT avec en jaune la M9 et en vert/rouge la M20.

La troisième fenêtre affiche le cycle, j'y ai ajouté une moyenne 3 simple pour  la visiblité.

La dernière fenêtre affiche les différents stochastics composant le STPMT.  On peut constater au final que le cycle se comporte comme un stochastic 5/3/3.

 

De mi-mars à mi-mai, le CAC évolue en tendance haussière et le cycle diverge, il faut attendre le croisement de la zéroligne.  De mi-mai à mi-juillet, l'indice reste en range, on peut utiliser les retournements du cycle.  Comme pour un stochastic, il est donc important de détecter les périodes de range et de tendance pour utiliser pleinement cet indicateur.  L'affichage du STPMT avec la moyenne 20 peut fournir une information.  Une autre solution est d'afficher le cycle de l'UT supérieure.

 

hk61.gif

Repost 0
Published by hk_lisse - dans Les Cycles
commenter cet article
12 février 2008 2 12 /02 /février /2008 20:24

Over / Under Divergence.

 

Sur le site de NQoos, il y a un setup de divergence sur Stochastics  :  "Over / Under Divergence by Birdman".  Toutes les informations nécessaires se trouvent sur la page, je vous déconseille d'aller sur Intellitraders.com, car l'anti-virus me donne une alerte.

 

Les conditions telles que je les ai codées sont :

 - Une divergence classique haussière sur le Stochastic 7,3.  La divergence est validée sur un simple zigzag du Stochastic.

 - Le premier creux du Stochastic 7,3 est inférieur au Stochastic 21,10 et le second supérieur.

 - La bougie précédant le signal doit marquer un plus bas de 7 barres.

 - La bougie du signal doit avoir un plus haut supérieur à celui de la barre précédente et Close>Open.

 

Il serait pertinent AMHA de backtester l'efficience de certaines conditions :

 - Nécessicité d'avoir une bougie verte.

 - Avoir le Stochastic 21,10 orienté à la hausse.

 - Valider la divergence non pas avec un zigzag mais avec le croisement de %K et %D.

 - Avoir le point bas sur la bougie[2] ou [0] et non pas la bougie[1].

 

Voici un exemple de signal :

 

hk59.gif

 

Il y a peu de signaux, c'est pour cela que je m'interroge sur l'utilité de toutes les conditions.

Il faut bien lire les 4 remarques à la fin de la page de NQoos, particulièrement celle sur le "Strong Trend".  Pour le higher timeframe, 5 ou 6 fois l'unité de temps devrait être correct.  Dans ce cas, il est intéressant de chercher sur celui-ci des figures telles que "Mof" ou "Slingshot" (voir Buffy sur Google, pour ceux qui ne connaissent pas encore).  Il faudrait regarder aussi  du côté du range de la bougie de manière à avoir un R/R jouable.

 

Voici le code pour Prorealtime de la version "achat", avec les conditions de base.  Je vous laisse faire la version "vente".

 

x=Stochastic[7,3](close)
z=stochastic[21,10](close)
if x<x[1] then
    lo=min(lo,x)
    lowco=min(lowco,min(low,low[1]))
endif
if x>x[1] and x[1]<x[2]  then
    zt1=zt
    zt=z[1]
    sto2=sto1
    sto1=lo
    lo=100
    p3=p1
    p2=min(p1,lowco1)
    p1=min(lowest[3](low),lowco)
    if p2=p1 then
        p2=min(p3,p4)
    endif
    lowco=100000
    lowco1=100000
endif
if x>x[1] then
    p4=lowco1
    lowco1=min(lowco1,low)
endif
c1=( p1<p2 and sto1 > sto2 and x>x[1] and x[1]<x[2])
c2=(c1 and sto2<zt1 and sto1>zt )
if c2 and low[1]=lowest[7](low) and high>high[1] and close>open then
    divi=3
else
    divi=0
endif
return divi

Repost 0
Published by hk_lisse - dans Les Divergences
commenter cet article
12 février 2008 2 12 /02 /février /2008 20:18

Copie d'un article publié le 12/12/07, présentant un exemple de divergence cachée.

Hidden Divergence sur le Nasdaq Composite.

 

Voici un exemple de divergence cachée, cela signifierait la poursuite de la baisse.

 

hk57.gif

 

Et pour le même prix, une ETE qui se profile en UT week !

 

hk58.gif

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