Programmer des screeners simples avec les Moyennes mobiles, code pour débuter

Cet article propose une première approche de l’écriture de screeners utilisant les Moyennes mobiles. Ces screeners sont de forme simple et sont très abordables pour débuter en ProBuilder, le langage de programmation de la plate-forme ProRealTime.

The Bull Bar – Key West – Floride – USA

Un screener est un programme qui va scanner un ensemble de titres sur la plateforme Prorealtime et retourner la liste des titres qui remplissent les conditions définies dans le screener.

Ce programme sera écrit en ProScreener, une extension de ProBuilder, le langage de programmation de la plateforme Prorealtime. Ce langage est très proche du langage Basic.

Coder comment tester des Moyennes mobiles est simple. Il faut juste savoir quelles sont les conditions qui retournent les titres les plus intéressants à trader en Swing trading ou en day trading.
Nous allons proposer plusieurs types de conditions que nous appellerons « tests » et dont nous allons examiner les qualités et les défauts.

Je mets une touche pédagogique pour expliquer ce que je comprends et ce que je fais. Cet article va donc enfoncer des portes ouvertes pour certains et rendre service à d’autres.

Objets de ces screeners

Etre une aide à la détection de titres de rêves pour moi tels que décrits dans la Stratégie super simple des 3 moyennes mobiles courtes.
Mais on va opérer progressivement, d’abord en testant le comportement d’une Moyenne mobile puis de 2 Moyennes mobiles courtes.

Table des matières de l’article Coder des screeners simples avec l’indicateur Moyenne mobile

Iki le dragon trader du site Ikitrading

Rôle d’un screener

Le rôle d’un screener ou scan de marché est de retourner des titres qui remplissent des conditions que vous avez fixées.
Dans ce but, on va examiner les cours récents de chaque titre car analyser les cours antérieurs donne des pistes pour tenter de déduire ce qui va se passer « le jour d’après ».

Dans nos exemples de screeners, il s’agit d’essayer de déduire ce qui pourrait se passer au jour J+1, c’est à dire demain, en examinant l’état des cours aux jours J, J-1, J-2 et J-3, soit les cours des 4 jours précédents.
On va donc écrire ces screeners ou petits programmes de scan de marchés, les lancer et examiner chaque titre de la liste qu’ils vont retourner.
Et pour chaque titre on va se poser la question suivante : au vu de son graphique, vais-je entrer en position ou pas ?
L’objet de cet article est juste l’écriture de ces petits programmes. L’entrée en position (ou pas) est un autre exercice.

Ma première étape : trouver juste des titres en tendance haussière

Je veux créer un screener qui retourne des titres sur lesquels on peut observer que le pattern de Stratégie des 3 Moyennes courtes se met en place.
Mais l’écriture de ce screener semble difficile quand on débute en programmation.

Aussi, la première étape pour moi sera donc de trouver des titres dont la tendance est haussière depuis un certain nombre de jour, rien de plus pour le moment, c’est un début.

Pour savoir comment fonctionnent les Moyennes mobiles et comment on peut s’en servir pour entrer en position, on peut lire l’article Les Moyennes mobiles, c’est facile, pas cher et ça peut rapporter gros

Informations préalables

  • On va travailler sur des cours en journalier mais ces screeners sont transposables sur toutes les unités de temps. Il peut suffire aussi de changer d’unité de temps dans l’affichage des graphiques.
  • Ces screeners sont utilisables pour le Swing trading sur actions. Ne pas oublier que quand le Swing trading sur actions françaises est poussif, on peut trader les actions américaines.
  • On va rechercher des titres en hausse sur les 4 derniers jours mais ce screener est transposable à la recherche de titres en baisse pour les shorter. Il suffit de retourner l’opérateur « > » en « < » chaque fois qu’on le rencontre.
  • On va donner les spécifications et les instructions de 3 screeners. On part d’un screener de base et on en fait des variantes.
    On va examiner pour chaque screener ce qu’il nous apporte. On décidera ensuite pour chacun s’il est digne d’intérêt.
  • L’intérêt global des screeners de marché qui fonctionnent bien, c’est qu’ils retournent des titres, même quand la période semble sinistrée type Période de la guerre en Ukraine.

Iki le dragon trader du site Ikitrading

On va aller chercher la valeur des cours ou des Moyennes mobiles dans les unités de temps précédentes.

On identifie la tendance actuelle en utilisant la valeur des cours à la clôture des unités de temps précédentes.
Pour faire apparaitre clairement cette tendance, on va utiliser ici les moyennes mobiles appliquées aux cours.
Pour faire ceci dans un programme écrit en Prorealcode, on indice chaque bougie avec le paramètre close[n] dans le programme.

Prenons l’exemple d’une unité de temps journalière.
Le cours du jour J est noté : « close ».
(On peut écrire aussi « close[0] » mais en général on écrit juste « close ».)
Le cours de la veille, c’est à dire J-1 est noté : close[1].
Le cours de J-2 est noté : close[2].
Le cours de J-3 est noté : close[3].
Le cours de J-4 est noté : close[4].

Voici une représentation très claire issue du site Prorealtime.

La relation entre l’indice close et les bougies d’un graphique

Mais on va appliquer le close aux valeurs antérieures des différentes Moyennes mobiles que l’on va utiliser dans nos screeners.
On ne sera plus en « close » du prix mais en « close » de la Moyenne mobile donc en valeur de la Moyenne mobile à la clôture.
Rappel : le but de ces screeners est d’afficher des titres en hausse sur les 4 derniers jours.

Iki le dragon trader du site Ikitrading

Voici le pattern idéal que l’on va chercher, largement décrit dans La stratégie super simple des 3 moyennes mobiles courtes :

Le pattern idéal que nos screeners vont aider à repérer

On va tester dans un code la valeur de la moyenne mobile courte, d’abord la Moyennes mobile la 5 périodes puis celle à 20 périodes, c’est à dire les Moyennes mobiles rouges et bleues.
La suite fera l’objet d’un autre article.

On va écrire 5 screeners successivement et on va étudier ce que chacun nous apporte.

La condition essentielle sur laquelle repose ces screeners : Une moyenne mobile est haussière si sa valeur actuelle est supérieure à sa valeur sur la période précédente.

But de premier screener : afficher les titres dont la Moyenne mobile Simple 5 périodes (MM 5) est haussière depuis au moins 4 jours.

On veut que la hausse soit établie depuis 4 jours : J, J-1, J-2, J-3.
On va donc remonter dans le temps à partir du jour J.

Déclaration des variables

On a besoin d’une variable qui va stocker la valeur de la MM 5 d’un jour pour la comparer avec la valeur de la MM 5 de la veille. Le but est de vérifier que la valeur du jour est supérieure à celle de la veille.

La MM à 5 périodes est à déclarer ainsi en langage ProBuilder : average[5](close)
c’est-à-dire valeur de la MM 5 à la clôture.

On va déclarer une seule variable pour ce screener que l’on va appeler : « MMCourte ».
On la déclare ainsi : MMCourte = Average[5](close)
MMCourte va être alimentée successivement avec les différentes valeurs de la MM 5 sur les 4 derniers jours. L’interpréteur du programme va comparer les valeurs successives et créer un historique pour chaque titre.
NB : on peut mettre dans MMCourte n’importe quelle autre Moyenne mobile.

Les tests ou écriture des conditions que doivent remplir les titres.

Quelle est la condition qui fait qu’on va retenir un titre ?

Il faut que sa MM soit ascendante et donc que, pour chaque jour étudié, la valeur du Jour soit > à la valeur de la Veille. C’est-à-dire que la MM 5 du jour soit supérieure à la MM 5 de la veille.

Donc on va comparer chaque jour au précédent et chaque fois que la condition est remplie, on va positionner un drapeau dans une variable résultat.
Ce drapeau voudra dire « Ok, condition remplie pour ce jour ».

Ces variables sont de type booléen, c’est à dire qu’elles ne peuvent prendre comme valeurs que 1 ou 0, c’est à dire « vrai » ou « faux ».
On ne les déclare pas.
On va appeler ces variables Cond1, Cond2, Cond3, Cond4.

Si les 4 drapeaux sont positionnés à « vrai » à la fin des tests, le titre sera mis dans une liste et cette liste sera affichée par la fonction Proscreener qui s’appelle « screener ».

Autrement dit : On compare la valeur de la MM 5 au jour J avec la valeur de la MM 5 à la veille du jour J et si c’est vrai, on met automatiquement un drapeau positionné à « vrai » dans Cond1.

Ceci sera fait grâce à cette instruction :
Cond1 = MMCourte[0] > MMCourte[1]
La valeur de la MM 5 du jour J qui porte l’indice 0 doit être supérieur à la valeur du jour J-1 qui porte l’indice 1

On compare ensuite la valeur du jour J-1 avec la valeur de la veille du jour J-1.
Cette valeur est contenue dans la variable Jour[2] et si la condition est remplie, on met un drapeau « vrai » dans Cond2 :
On écrit : Cond2 = MMCourte[1] > MMCourte[2]

Idem pour le jour J-2 comparé avec la veille du jour J-2, c’est Jour[3] et si la condition est remplie, on met un drapeau « vrai » dans Cond3 :
Cond3 = MMCourte[2] > MMCourte[3]

idem pour le jour J-3 comparé avec la veille du jour J-3, c’est Jour[4] et si la condition est remplie, on met un drapeau « vrai » dans Cond4.
Cond4 = MMCourte[3] > MMCourte[4].

On va ajouter une condition supplémentaire : le volume de transactions.

On veut que le volume de transactions soit assez important pour ces titres pour ne pas récupérer des petites valeurs peu échangées donc peu liquides.

On ne veut retenir que les titres dont le nombre de transactions du jour J est supérieur à 10000.
Je ne teste le volume que le jour où je fais tourner le screener. En principe, ça suffit.

Deux façons d’installer cette condition supplémentaire dans le programme.

1. L’ajouter à la liste des conditions : Cond5 = VOLUME > 10000

VOLUME est une fonction de ProBuilder, c’est-à-dire un petit programme dont il suffit d’appeler le nom pour qu’il fasse le job.

Ce programme renvoie dans la variable du même nom, « VOLUME », le nombre de transactions au jour J

2. Ou déclarer une variable que je vais appeler Volmini dont la valeur sera déclarée à 10000 et que je vais tester ensuite.

Déclaration des variables
Volmini = 10000

Dans les instructions du programme : Cond5 = VOLUME > Volmini

Lancement du screener.

Je n’ai plus qu’à ajouter l’instruction qui permet de lancer le screener avec les conditions que j’ai décrites. C’est l’instruction SCREENER.
On va donc demander que soient affichés les titres dont toutes les variables de conditions ont reçu un drapeau égal à « vrai » :
SCREENER [cond1 and cond2 and cond3 and cond4 and Cond5]

Voici le code du screener appelé : # MM Screener 1 – A copier / coller dans ProRealtime

NB : Donner un nom commençant par # permet de reconnaitre plus facilement les screeners qu’on écrit soi-même parmi ceux que fournit la plateforme ProRealtime.

// Code de base pour un screener qui retourne des titres avec une Moyenne mobile courte haussière

MMCourte = Average[5](close)
Volmini = 10000

Cond1 = MMCourte[0] > MMCourte[1]

Cond2 = MMCourte[1] > MMCourte[2]

Cond3 = MMCourte[2] > MMCourte[3]

Cond4 = MMCourte[3] > MMCourte[4]

Cond5 = VOLUME > volmini

SCREENER [cond1 and cond2 and cond3 and cond4 and Cond5]

Autre façon d’écrire ce screener

Remarques :
On aurait pu aussi écrire ainsi :
Conditions = MMCourte > MMCourte[1] AND MMCourte[1] > MMCourte[2] AND  MMCourte[2] > MMCourte[3] AND  MMCourte[3] > MMCourte[4] AND VOLUME > volmini

Dans ce cas-là, le lancement se fait ainsi : SCREENER [Conditions]

NB : On n’a pas besoin d’indicer le Jour J avec zéro, par défaut MMCourte veut dire MMCourte[0].

Examinons les titres retournés par le screener et leur intérêt.

Voici un exemple très clair du défaut de ce screener visible sur ce graphique.
Il montre les courbes de 3 Moyennes mobiles sur un graphique des prix :
la MM 5 est rouge, : la MM exponentielle 13 est verte, la MM20 est bleue.

Le problème : Il retourne des titres dont la MM 5 est ascendante sur les 4 derniers jours mais dont la MM 20 est encore baissière.
C’est normal, quand la tendance se dessine, seules les MM très courtes réagissent d’abord
Donc la tendance haussière est encore incertaine. Elle ne peut être confirmée car c’est trop tôt.

La MM 5 rouge commence sa hausse mais la MM 20 bleue est encore baissière.

Que faire ? :
Il faut tester en plus une MM plus longue. Si la MM plus longue est elle-même haussière, ce sera le signe que la tendance est installée.

On veut que la tendance haussière soit très récente mais on veut aussi que le titre monte sans ambiguïté. Alors comment faire pour associer ces deux qualités ?
On va ajouter une Moyenne mobile simple plus longue, la MM 20 périodes par exemple.

Avec ProBuilder, on la déclare ainsi : average[20](close) ou simplement average[20] car par défaut la valeur pour calculer la Moyenne mobile est celle de la clôture du l’unité de temps.
Rappel : (close) sans rien derrière entre crochets indique par défaut le jour de lancement du screener.

On déclare donc 2 variables, que l’on appelle MMCourte et MMLongue.
Rappel : pour que les Moyennes mobiles soient haussières, on teste que la valeur du jour est supérieure à la valeur de la veille.

Ex : Cond1 = MMCourte > MMCourte[1] AND MMLongue > MMLongue[1]
MMCourte est la valeur de la MM5 au jour J.
MMLongue est la valeur de la MM20 au jour J.
Mais on pouvait écrire MMCourte[0] et MMLongue[0].

On aurait pu tester aussi la même chose avec 2 tests :
Cond1 = MMCourte > MMCourte[1]
Cond1bis = MMLongue > MMLongue[1]
Mais on garde le test en 4 conditions pour que le programme soit plus court et on va les grouper 2 à 2.

Voici le code du screener appelé : # MM Screener 2 – A copier / coller dans ProRealtime

// Code de base pour screener avec 2 Moyennes mobiles courtes haussières

MMCourte = Average[5](close)
MMLongue = Average[20](close)
Volmini = 10000

Cond1 = MMCourte > MMCourte[1] AND MMLongue > MMLongue[1]

Cond2 = MMCourte[1] > MMCourte[2] AND MMLongue[1] > MMLongue[2]

Cond3 = MMCourte[2] > MMCourte[3] AND MMLongue[2] > MMLongue[3]

Cond4 = MMCourte[3] > MMCourte[4] AND MMLongue[3] > MMLongue[4]

Cond5 = VOLUME > Volmini

SCREENER [Cond1 and Cond2 and Cond3 and Cond4 and Cond5]

Résultat et remarques sur le Screener n°2

Il y a en principe moins de titres retournés que quand on lance le screener # MM Screener 1.
Mais tous les titres remontés par le screener sont garantis en tendance haussière.
Donc à regarder !

Pour étudier le registre des possibles, voyons une autre façon de tester si un titre monte.
On ajoute la condition : la MM très courte doit être au-dessus d’une plus lente.

Est-ce une bonne façon de faire ? Est-ce que le résultat de ce screener sera équivalent au screener précédent ?
Nous allons le voir et apprendre un peu plus au passage.

On garde la même déclaration de variables avec 2 Moyennes mobiles : MM 5 et MM 20.
On garde la condition : la MM 5 doit être haussière.
Mais on va modifier ce qu’il y a derrière le AND pour chaque test : pour un jour donné, la valeur de la MM courte doit être supérieure à la valeur de la MM longue.

Voici le code du screener appelé : # MM Screener 3 – A copier / coller dans ProRealtime

// Code d’un screener avec 2 Moyennes mobiles courtes, vérification que la courte est haussière et que la courte est au-dessus de la longue.

MMCourte = Average[5](close)
MMLongue = Average[20](close)
Volmini = 10000

Cond1 = MMCourte > MMCourte[1] AND MMCourte > MMLongue

Cond2 = MMCourte[1] > MMCourte[2] AND MMCourte[1] > MMLongue [1]

Cond3 = MMCourte[2] > MMCourte[3] AND MMCourte[2] > MMLongue [2]

Cond4 = MMCourte[3] > MMCourte[4] AND MMCourte[3] > MMLongue [3]

Cond5 = VOLUME > Volmini

SCREENER [Cond1 and Cond2 and Cond3 and Cond4 and Cond5]

Résultat obtenu avec le Screener N°3

Le résultat n’est pas assez pertinent ou en fait moins pertinent qu’avec le Screener N°2. La MM5 est au-dessus de la MM 20 mais ça ne veut pas dire que la MM20 est ascendante aussi.

Voici un titre retourné en testant la MM 5 ascendante et au-dessus de la MM 20 sans tester la MM20.

Or, il nous faut l’ascendance des 2 Moyennes mobiles pour s’assurer que le titre monte bien.
Donc tester les 2 Moyennes mobiles ascendantes est plus efficace
comme dans le Screener 2.

Les variables sont les mêmes.
On reprend # MM Screener 2 qui teste si les 2 Moyennes mobiles sont haussières, la MM 5 et la MM 20.
On ajoute pour chaque ligne le test : MM 5 > à MM 20.

Voici le code du screener appelé : # MM Screener 4 – A copier / coller dans ProRealtime

// Code d’un screener avec 2 Moyennes mobiles courtes, les 2 sont haussières et vérification que la courte est au-dessus de la longue.

MMCourte = Average[5](close)
MMLongue= Average[20](close)
Volmini = 10000

Cond1 = MMCourte[0] > MMCourte[1] AND MMLongue[0] > MMLongue[1] AND MMCourte[0] > MMLongue[0]

Cond2 = MMCourte[1] > MMCourte[2] AND MMLongue[1] > MMLongue[2] AND MMCourte[1] > MMLongue[1]

Cond3 = MMCourte[2] > MMCourte[3] AND MMLongue[2] > MMLongue[3] AND MMCourte[2] > MMLongue[2]

Cond4 = MMCourte[3] > MMCourte[4] AND MMLongue[3] > MMLongue[4] AND MMCourte[3] > MMLongue[3]

Cond5 = VOLUME > Volmini

SCREENER [Cond1 and Cond2 and Cond3 and Cond4 and Cond5]

Résultat obtenu avec le Screener N°4

C’est le screener qui retourne les titres les plus intéressants à trader.
Les titres sont haussiers à coup sûr.

L’attribut alt de cette image est vide, son nom de fichier est IKI-logo.jpg.

Nous allons tester encore une autre piste d’amélioration du screener :
– On teste que les 2 Moyennes mobiles sont haussières.
– On ajoute : tester que toutes les bougies des jours précédents ont clôturé au-dessus de la MM 5
Il s’agit de poser comme condition : le cours du titre à la clôture a été supérieur à la valeur de la MM 5.

Voici un exemple où toutes les bougies clôturent au-dessus de la MM 5 lors d’une tendance haussière. On est rentré à la flèche verte et on est sorti de la position quand le cours est passé sous la MM 5.

Est-ce que tester que toutes les bougies clôturent au-dessus de la MM courte est une bonne idée ?

Ecriture du Screener
On part du screener # MM Basic 2 qui retourne les titres ayant la MM 5 et la MM 20 haussières.

On ajoute derrière chaque condition : close[J] > JourC[J].
Close[J] est la valeur du titre à la clôture au jour J, c’est une variable dite « constante » de ProBuilder.
Elle est indicée par le numéro de jour en remontant dans le passé comme les variables qui retournent la valeur de la Moyenne mobile.
Comme elle est donnée automatiquement par ProBuilder, on a pas besoin de la déclarer.
Dans le vocabulaire ProBuilder, on dit que c’est une constante car elle est alimentée d’après le cours, et non pas par un calcul ou le résultat d’un test.

MMCourte[J] est la variable qui contient la valeur de la MM 5 au jour J.
MMLongue[J] est la variable qui contient la valeur de la MM 20 au jour J.
Celles-ci sont à déclarer.

C’est lé premier screener de notre liste qui fait entrer de cours du titre en ligne de compte.

Voici le code du screener appelé # MM Screener 5 – A copier / coller dans Prorealtime

// Code de base pour screener avec 2 Moyennes mobiles et test du cours qui clôture au-dessus de la MM 5

MMCourte = Average[5](close)
MMLongue = Average[20](close)
Volmini = 10000

Cond1 = MMCourte[0] > MMCourte[1] AND MMLongue[0] > MMLongue[1] AND close[0] > MMCourte[0]

Cond2 = MMCourte[1] > MMCourte[2] AND MMLongue[1] > MMLongue[2] AND close[1] > MMCourte[1]

Cond3 = MMCourte[2] > MMCourte[3] AND MMLongue[2] > MMLongue[3] AND close[2] > MMCourte[2]

Cond4 = MMCourte[3] > MMCourte[4] AND MMLongue[3] > MMLongue[4] AND close[3] > MMCourte[3]

Cond5 = VOLUME > volmini

SCREENER [cond1 and cond2 and cond3 and cond4 and Cond5]

Résultat obtenu avec le Screener N°5 et remarques

Le résultat n’est pas totalement convainquant :
– Moins de titres sont retournés en général (mais ça dépend de l’état du marché),
– Il est dommage d’exclure un titre qui a clôturé une fois au-dessous de la MM 5 dans les 4 jours et qui a pris son envol ensuite.
Mais ce screener n’est pas à écarter car il peut remonter des titres intéressants toujours selon l’état du marché.

Ce titre a clôturé une fois au dessous de la MM 5 et il a été exclu du screener alors qu’il poursuit son envolée.

Intérêt relatif de ce screener : on élimine les titres pas mûrs.

Alternative : On pourrait juste tester que juste au jour J, le cours clôture au-dessus de la MM 5.

Et le meilleur screener est…

  • Les Screeners n° 1 et n°3 ne sont pas pertinents.
  • Les Screeners n°2 et n°4 sont pertinents. On obtient des titres haussiers à coup sûr. Ils peuvent retourner parfois tous les deux les mêmes titres selon les conditions de marché.
    Quitte à choisir, préférons donc le Screener n°4.
  • Le Screener n°5 est à considérer pour avoir des titres en pleine ascension.

Ce que je vais améliorer dans les prochains articles sur la programmation appliquée au trading

  • Je vais réécrire ces screeners en incluant une boucle qui va permettre de tester beaucoup plus de jours antérieurs sans multiplier les lignes de code.
  • Ces screeners retournent des titres qui sont parfois haussiers depuis longtemps et c’est trop tard pour rentrer. Donc il faut tester la présence d’un croisement de Moyennes mobiles dans un passé récent.
    Prochain objectif : repérer un croisement de Moyennes mobiles avec un programme en langage ProBuilder.

Ce qu’on peut modifier dans ces screeners.

  • On peut choisir des Moyennes mobiles de périodes plus longues, comme tester la MM 10 et la MM 20 ou la MM 20 et la MM 50. Tout dépend de sa stratégie et de la durée en position que l’on envisage.
  • Une autre solution est de tester sur une période plus longue, par exemple 10 jours au lieu de 4 jours. Dans ce cas, il est mieux de remplacer le test « jour après jour » par une boucle.
    Mais on risque de rater le début de la hausse des cours et d’avoir un signal d’entrée trop tardif..
  • L’inconvénient de ces diverses modifications est que les screeners retournent des titres qui sont parfois haussiers depuis encore plus longtemps et c’est trop tard plus rentrer.
    Avoir plus de signaux implique toujours avoir plus de faux signaux.

Ce qui m’a plu dans ces expériences d’écriture de screeners.

  • Pouvoir travailler sur le code ProBuilder.
  • Expliquer ce que je comprends.
  • Avancer un peu dans mon projet de trouver de screener idéal qui retourne des titres qui correspondent au pattern de la stratégie des 3 Moyennes mobiles courtes.

Diane Dulac
hellodiane@ikitrading.com

En écrivant à cette adresse email, vous pouvez : signaler une erreur, donner une piste d’amélioration de ce screener, demander des explications, me donner les résultats de vos tests, proposer une stratégie à transformer en screener ou en indicateur …

Iki au travail by Alex M.
© Tous droits réservés

Auteure
Diane Dulac
hellodiane@ikitrading.com

Inspirée par IKI
Dragon trader

Laisser un commentaire