Code « Hull Cross »

Bonjour à tous,

 

« Patrick » m’a soumis sa stratégie, qui consiste à trader les croisements de moyennes mobiles de Hull.
Avec son accord, je diffuse ici son codage optimisé pour la paire EUR/USD, en graphes D1.

 

On voit ici une assez belle courbe de progression de capital, mais je vais émettre 2 réserves :

  • étant donné qu’il s’agit d’une optimisation de moyennes mobiles, la stratégie a été clairement optimisée pour la période de test (toutes les données historiques au tick par tick).
  • j’ai déjà vu ce code de stop suiveur, je ne peux pas en garantir l’absence de bugs (contradictions entre backtest et réel, entrées et sorties au même niveau).

 

Cependant, à première vue il ne semble pas y avoir de problème avec l’utilisation de ce stop suiveur (comme j’avais déjà remarqué dans d’autres codes), il semble bien fonctionner en backtest, lorsque l’on regarde au niveau de l’historique détaillé des positions.

 

On peut donc penser qu’il peut y avoir moyen d’adapter cette stratégie à d’autres valeurs / d’autres timeframes, d’ajouter quelque chose qui pourrait éviter une « suroptimisation ».

 

A vos claviers !

 

 

Voici le code du BACKTEST :

(J’ai laissé inchangé le code original, avec les remarques en allemand, la langue de Patrick).

 

DEFPARAM CumulateOrders = false
defparam preloadbars = 1000

Nlong = 3
Nshort = 3

//HULL Einstieg
Periodel = 35 //21
innerel = 2*weightedaverage[ round( Periodel/2 ) ](close)-weightedaverage[Periodel](close)
MMHULLel = weightedaverage[ round( sqrt(Periodel) ) ]( innerel )

Periodes = 28 //21
inneres = 2*weightedaverage[ round( Periodes/2 ) ](close)-weightedaverage[Periodes](close)
MMHULLes = weightedaverage[ round( sqrt(Periodes) ) ]( inneres )

//hullle = (mmhulle > mmhulle[1])
//hullse = (mmhulle < mmhulle[1])

c1 = close crosses over mmhullel
c2 =close crosses under mmhulles

//HULL Ausstieg
Perioda = 5 //21
innera = 2*weightedaverage[ round( Perioda/2 ) ](close)-weightedaverage[Perioda](close)
MMHULLa = weightedaverage[ round( sqrt(Perioda) ) ]( innera )

hulll = (mmhulla < mmhulla[1])
hulls = (mmhulla > mmhulla[1])

IF not onmarket and c1 THEN //and emal
BUY Nlong shares at market
SET STOP %LOSS 2.2
Set target %profit 1.4
ENDIF

if longonmarket and hulll then //hulll or
sell at market
endif

IF not onmarket and c2 THEN //and emas
sellshort Nshort shares at market
SET STOP %LOSS 2.6
Set target %profit 1.45
ENDIF

if shortonmarket and hulls then //hulls or
exitshort at market
endif

// ************* trailing stop function ************* 
trailingstartL = 11 //30 15 trailing will start @trailinstart points profit
trailingstartS = 84 //30 15 trailing will start @trailinstart points profit
trailingstepL = 20 //2 1 trailing step to move the "stoploss"
trailingstepS = 11 //2 1 trailing step to move the "stoploss"
//reset the stoploss value
IF NOT ONMARKET THEN
newSL=0
ENDIF
//manage long positions
IF LONGONMARKET THEN
//first move (breakeven)
IF newSL=0 AND close-tradeprice(1)>=trailingstartL*pipsize THEN
newSL = tradeprice(1)+trailingstepL*pipsize
ENDIF
//next moves
IF newSL>0 AND close-newSL>=trailingstepL*pipsize THEN
newSL = newSL+trailingstepL*pipsize
ENDIF
ENDIF
//manage short positions
IF SHORTONMARKET THEN
//first move (breakeven)
IF newSL=0 AND tradeprice(1)-close>=trailingstartS*pipsize THEN
newSL = tradeprice(1)-trailingstepS*pipsize
ENDIF
//next moves
IF newSL>0 AND newSL-close>=trailingstepS*pipsize THEN
newSL = newSL-trailingstepS*pipsize
ENDIF
ENDIF
//stop order to exit the positions
IF newSL>0 THEN
SELL AT newSL STOP
EXITSHORT AT newSL STOP
ENDIF