Créer facilement un indicateur / screener / backtest

Bonjour à tous,

Quasiment toutes les semaines, je reçois la même demande :
Comment créer un  indicateur / un screener / un backtest sur ProRealTime ?
Je vais donc rédiger cet article afin que tout le monde en bénéficie, et aussi que je n’aie pas à réécrire à chaque fois la même chose. Si vous lisez cet article, c’est que vous avez probablement été renvoyé à cette page par mes soins.

 

Evidemment, tout dépend de la complexité de la stratégie ou de l’indicateur à définir.

Mais de façon générale, la structure commune est très simple.

Je vais vous monter comment procéder à partir d’une stratégie simplissime : création d’une stratégie à partir du croisement de moyennes mobiles simples 10 et 20 périodes.

.

..

Définition des VARIABLES

Il nous faut tout d’abord définir les variables utilisées par la stratégie.

Ici, nous avons en toute simplicité, pour 2 moyennes mobiles simples à 10 et 20 périodes :

MM10 = average[10](close)
MM20 = average[20](close)

Ces variables sont à mettre en début de code.

.

Création de l’INDICATEUR PERSONNALISE

1ère possibilité :

Nous souhaitons que l’indicateur passe à +1 si on a un croisement haussier, ou à -1 si on a un croisement baissier.

Indicateur = 0
MM10 = average[10](close)
MM20 = average[20](close)
IF MM10 crosses over MM20 THEN
Indicateur = 1
ENDIF

IF MM10 crosses under MM20 THEN
Indicateur = -1
ENDIF

RETURN indicateur

Dans les 2 cas, l’indicateur passe à -1 ou +1 lors du croisement puis retourne à la valeur 0 à la bougie suivante.

.

2ème possibilité :

Nous souhaitons que l’indicateur reste à la valeur +1 ou -1, en fonction de la position de la moyenne mobile 10 par rapport à la moyenne mobile 20.

Nous supprimons donc la première ligne.

Nous pouvons optionnellement changer  « crosses over » ou « crosses under » par « > » ou « <« .

MM10 = average[10](close)
MM20 = average[20](close)

IF MM10 > MM20 THEN
Indicateur = 1
ENDIF

IF MM10 < MM20 THEN
Indicateur = -1
ENDIF

RETURN indicateur

.

En fait, nous pourrions très bien créer une condition de sortie de trade, qui mettrait notre indicateur à la valeur 0.

Par exemple :

MM10 = average[10](close)
MM15 = average[15](close)

IF MM10 crosses under MM15 THEN
Indicateur = 0
ENDIF

.

CREATION du SCREENER

Le screener est un programme qui détecte et affiche les opportunités.

Nous avons 2 possibilités :

  • créer un screener qui affiche aussi bien les conditions d’indicateur à +1 ET à -1, sans différenciation
  • créer 2 screeners, un pour chacune des 2 conditions

.

1er cas : 

Ce screener ne fait pas la différence entre les positifs et les négatifs

MM10 = average[10](close)
MM20 = average[20](close)

IF MM10 crosses over MM20 THEN 
Indicateur = 1
ENDIF 

IF MM10 crosses under MM20 THEN 
Indicateur = 1 
ENDIF 

SCREENER[Indicateur]

Notez que le screener ne fonctionnera que si la valeur de « Indicateur » est positive.

 

On peut aussi écrire :

MM10 = average[10](close)
MM20 = average[20](close)

c1 = MM10 crosses over MM20
c2 = MM10 crosses under MM20
screener[c1 or c2]

.

2e cas :

On va créer 2 screeners différents, pour les 2 possibilités.
Ce qui nous donne :

MM10 = average[10](close)
MM20 = average[20](close)

c1 = MM10 crosses over MM20
screener[c1]

.

Et :

MM10 = average[10](close)
MM20 = average[20](close)

c2 = MM10 crosses under MM20
screener[c2]

.

CREATION du BACKTEST

Nous allons prendre l’exemple bête d’un vulgaire croisement de moyennes mobiles.

Evidemment, cette stratégie n’est pas bonne, mais c’est juste pour l’exemple.

Il va nous falloir ajouter 2 paramètres :

  • signaler s’il y a ou non un cumul de positions
  • déterminer la taille des positons

Pour l’exemple, je vais rajouter une moyenne mobile15 périodes.

Defparam cumulateorders = false   // ce qui signifie : pas de cumul de positions

n = 2   // nombre d'unités à acheter

MM10 = average[10](close)
MM15 = average[15](close)
MM20 = average[20](close)

// ACHAT
IF MM10 crosses over MM20 THEN
buy n shares at market
ENDIF

// SORTIE ACHAT
IF MM10 crosses under MM15 THEN
sell at market
ENDIF

// VENTE A DECOUVERT
IF MM10 crosses under MM20 THEN
sellshort n shares at market
ENDIF

// SORTIE VENTE
IF MM10 crosses over MM15 THEN
exitshort at market
ENDIF

 

Donc :

pour acheter = BUY

pour sortir d’un achat = SELL

pour vendre à découvert = SELLSHORT

pour sortir de vente à découverte = EXITSHORT

 

Libre à vous de rajouter un stop loss / un take profit.
Par exemple :

set stop %loss 5    // stop loss à 5%
set target profit 30    // take profit à 30 points

.

.

Vous voyez, c’est simple !
Maintenant que vous connaissez la structure de base, il vous suffit d’adapter vos indicateurs / votre stratégie.

 

Enfin, pour ceux qui ont un peu de mal à « visualiser » sans un support vidéo, tout est expliqué dans la vidéo suivante :

 

 

 

 

Share Button