Créer votre premier robot de trading pas à pas

Pour ce premier robot, nous allons coder une stratégie d’entrée très simple composée d’un test du MACD et de comparaisons de moyennes mobiles.
Cet article est la suite logique de l’article De l’intérêt de créer vos propres robots de trading.

Le contexte dans lequel le robot va être codé et testé est le suivant :

  • La plateforme de trading utilisée est celle de Prorealtime. Le langage de programmation est Probuilder.
  • Nous allons trader les CFD avec un capital de 10 000 €.
  • L’actif choisi est l’indice NASDAQ (US Tech 100 Cash chez IG).
  • L’unité de temps sera 5 minutes (M5).

Dans cet article, nous construirons pas à pas un premier robot de trading avec ProRealTime à partir d’une stratégie simple basée sur le MACD et trois moyennes mobiles.

1) On fixera d’abord les règles d’entrée en position sur le Nasdaq en unité de temps 5 minutes.

2) Le code ProBuilder sera détaillé ligne par ligne afin de permettre aux débutants de comprendre la logique de programmation d’un système de trading automatisé.

3) La stratégie sera ensuite soumise à un premier backtest sur deux années de données afin d’évaluer les performances, les points forts et les faiblesses de notre robot.

4) Nous analyserons ensuite les résultats obtenus et identifierons les améliorations à apporter.
Elles porteront sur l’ajout d’un Stop Loss, d’un Take Profit éventuel et d’un calendrier pour filtrer les jours de prises de position du robot.

Après avoir codé les conditions d’entrée, les conditions de sorties éventuelles et avoir testé cette stratégie avec différents Stop loss, nous déciderons d’ajouter ou pas ce robot à eux qui tournent en temps réel sur le compte d’Ikitrading.
Cette décision sera prise grâce à l’examen d’un certain nombre de métriques qui seront détaillées dans cet article puis dans le suivant. C’est l’occasion de faire connaissance avec les métriques élémentaires, celles qui disent clairement « stop ou encore » et celles un peu plus sophistiquées qui évaluent la robustesse de la stratégie.

Le choix de la stratégie, indicateur de retournement et filtres

La stratégie que j’ai choisie de coder est basée sur le MACD, des moyennes mobiles et la couleur de la bougie d’entrée.
Le MACD sera l’indicateur de retournement de tendance. Ensuite, son signal d’entrée sera filtré par 3 moyennes mobiles simples et ainsi qu’avec la couleur de la bougie qui porte le signal.

Le MACD étant le déclencheur du robot, je vais donner ci-dessous des explications résumées à son sujet.
Sinon, le MACD est largement traité dans cet article : MACD, des phares qui éclairent la route quelques mètres devant soi…
Les moyennes mobiles le sont dans celui-ci : Les Moyennes mobiles, c’est facile, pas cher et ça peut rapporter gros

Le MACD – Explications résumées

Le MACD (Convergence-Divergence des Moyennes Mobiles) est un indicateur de momentum et de suivi de tendance. Il aide à identifier les changements de force, de direction et de durée de la tendance du prix d’un actif.
Le MACD se compose de trois éléments :

la ligne MACD. Elle correspond à la différence entre une moyenne mobile exponentielle (EMA) à court terme et une EMA à long terme, généralement calculée comme suit : 
Ligne MACD = EMA 12 périodes − EMA 26 périodes

la ligne de signal. C’est une moyenne mobile exponentielle (EMA) à 9 périodes de la ligne MACD, qui permet d’identifier les signaux d’achat ou de vente. Lorsque la ligne MACD croise la ligne de signal par le haut, cela peut constituer un signal haussier (suggérant un achat) ; lorsqu’elle la croise par le bas, cela peut constituer un signal baissier (suggérant une vente).

– L’histogramme : L’histogramme représente visuellement la différence entre la ligne MACD et la ligne de signal. Il est essentiel pour examiner la dynamique de la tendance. Les valeurs positives de l’histogramme indiquent une dynamique haussière croissante, tandis que les valeurs négatives indiquent une dynamique baissière croissante.



Je vais décortiquer la méthode pas à pas.

Note au sujet des backtests

Veuillez noter que je effectue les backtests sur des périodes relativement courtes de 24 mois qui correspondent à 150 000 bougies (150K) de 5 minutes.
Vous pourrez reprendre le code de ce robot et le tester sur une période beaucoup plus longue. La limite est la quantité d’historique dont vous disposez pour effectuer vos tests.

A) Les heures d’ouverture mini et maxi d’ouverture et de fermeture d’un trade
On va écrire en tête du code les heures minimum d’ouverture et maximum de fermeture d’une position.
La différence avec les heures de négociation
Il ne faut ne pas confondre ces heures mini et maxi avec les heures de négociation. Celles-ci servent à interdire l’ouverture d’une position après une certaine heure.
Exemple : Ne pas ouvrir de position après 20H
On ne va pas s’en servir dans ce code. Nous allons permettre l’entrée en position à tout moment quand le Nasdaq est ouvert.

Le Nasdaq est ouvert au trading de 15H30 à 22H.
Dans le code, il n’y aura pas d’ouverture de position avant 15H30.
Concernant l’heure de fermeture d’une position en cours, j’ai choisi (après tests) de fermer la position éventuellement en cours à 21H.
Les tests sur l’heure de fermeture ont révélés un Drawdown plus important si la fermeture a lieu à 22H.
Je reviendrai sur le Drawdown dans la suite de cet article.

B) On va limiter la possibilité que le code n’ouvre qu’une seule position en même temps.

Voici le code qui donne ces instructions :

Elles sont au nombre de 4 :

  • La ligne de MACD croise à la hausse la ligne de Signal,
  • La moyenne mobile 7 croise à la hausse la moyenne mobile 10. J’ai choisi ces deux MM à la suite de tests,
  • La bougie clôture au-dessus de la MM20,
  • La bougie est verte c’est à dire que la valeur du prix de la fermeture est supérieure à la valeur du prix de l’ouverture).

Déclaration des variables utilisées par les indicateurs

On va mettre les lignes suivantes dans une partie du programme que je vais appeler « Déclaration des variables » pour annoncer à ProBuilder quels indicateurs seront utiliser dans le robot.
Il s’agit donc du MACD et de 3 moyennes mobiles : MM7, MM10, MM20.

Au sujet de la façon de déclarer les Moyennes mobiles, vous pouvez lire
Programmer des screeners simples avec les Moyennes mobiles, code pour débuter
Partie : – Screener N°1 – Déclaration des variables

// ****************************************
// Déclaration des variables Indicateurs
// ****************************************
// —- Déclaration des variables du MACD —-
Ligne = MACDLine[12,26,9](close)
Signal = MACDSignal[12,26,9](close)

// —- Déclaration des Moyennes mobiles —-
MM7 = average[7](close)
MM10 = average[10](close)
MM20 = average[20](close)

« Close » signifie qu’on compare la valeur de la ligne MACD et de la ligne de Signal à la clôture de la bougie.

Déclaration des zones intermédiaires de rangement des résultats

Nous avons besoin de zones de résultats de type « est-ce que la condition est remplie ou pas ? ».
Elles sont mises à zéro avant l’étude de chaque bougie.

// *************************************************************************
// Déclaration des Variables variables résultat : condition remplie ou pas
// *************************************************************************
condAchatLong = 0
Cond1 = 0
Cond2 = 0
Cond3 = 0
Cond4 = 0

Voici la façon dont nous allons tester chaque indicateur, MACD, moyennes mobiles et couleur de la dernière bougie.

// La ligne MACD croise à la hausse la ligne de Signal – condition n°1
Cond1 = Ligne crosses over Signal
// La MM7 croise à la hausse la MM10 – condition n°2
Cond2 = MM7 crosses over MM10
// La bougie clôture au-dessus de la MM20 – condition n°3
Cond3 = close > MM20
// La bougie est verte – condition n°4
Cond4 = close > open

Le test des conditions, comment ça marche ?

A propos des variables Cond1, Cond2, Cond3, Cond4.
J’ai choisi de les nommer ainsi. La majuscule n’est jamais obligatoire.
Elles 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 ».
Si la condition n°1 est remplie, c’est à la dire si la Ligne de MACD croise à la hausse la Ligne de Signal, la variable Cond1 recevra la valeur 1. Si elle n’est pas remplie, la variable restera à la valeur 0 (zéro).
On va tester la valeur de ces 4 variables pour décider d’une entrée en position ou pas..

La condition d’entrée en position LONG

La variable CondAchatLong va agréger les résultats des 4 variables de condition.
Si les 4 variables sont à 1, CondAchatLong sera positionnée à 1 donc CondAchatLong est vrai.
Si l’une des variables est à 0, CondAchatLong sera positionnée à 0 donc CondAchatLong est faux.

// *************************************
// Condition d’entrée en position
// *************************************
CondAchatLong = Cond1 AND Cond2 AND Cond3 AND Cond4

Le test final d’entrée en position du robot

Si CondAchatLong est vrai, on va acheter un CFD si d’autres conditions sont vraies également.

A) On va tester la valeur de CondAchatLong :

On fait un test « SI » mais pas besoin de tester : IF CondAchatLong = 1…
« IF CondAchatLong » suffit.
Cette formulation sous-entend : « SI CondAchatLong est vraie. »

B) Il doit être au moins 15H30, heure d’ouverture du Nasdaq.
Mais on l’a déjà défini avec DEFPARAM plus haut.

C) Une position Long n’est pas en cours actuellement
On utilise la fonction LongOnMarket.
Elle va retourner 0 ou 1 mais on ne se préoccupe pas de la programmer.
On va juste la tester. Elle fait partie du code natif de ProBuilder.

Si toutes les conditions sont réunies, on va entrer en position sur la bougie qui suit celle pour laquelle les conditions sont remplies.

// ***********************************
// L’achat d’une position LONG
// ***********************************

IF NOT LongOnMarket AND CondAchatLong THEN
BUY 1 contracts AT MARKET
ENDIF

Nous allons faire un premier backtest pour savoir si nous devons consacrer du temps à peaufiner cette stratégie.

Conditions du backtest :

  • 170 K (170 000) bougies de 5 minutes,
  • sur une période de 2 ans du 01/05/2024 au 30/04/2026
  • avec un capital de 10 000 €. ( Mais un backtest suivant montre que « ça passe » avec 5000 €)

Rappel des conditions d’entrée en position :

  • La ligne MACD croise à la hausse la ligne de Signal – condition n°1
  • La MM7 croise à la hausse la MM10 – condition n°2
  • La bougie clôture au-dessus de la MM20 – condition n°3
  • La bougie en cours est verte – condition n°4

Caractéristiques :
Pas de condition de sortie, pas de Stop Loss, pas de Take profit, pas de calendrier.

Tableau des résultats du backtest n°1 :

J’ai résumé les résultats essentiels dans un tableau ci-dessous.

Test N°GainNombre de trades% de trades gagnantsDrawdown MAXGain/ DD Max
15078 €30259,60 %1635 €3,49

Voici le Rapport détaillé de la plateforme ProrealTime après ce premier backtest :

La première analyse est favorable. On observe une bonne performance de notre robot au travers de ces 5 métriques:
– Le gain est intéressant.
– Le pourcentage de trades gagnants est quasiment de 60%.
MAIS :
– Le Drawdown est très élevé (-1635 €) bien que le gain lui soit 3,5 fois supérieur.
Un Drawdown de cette importance est un très mauvais moment à passer. Il faut avoir les reins solides en terme de capital et de mental.
– Le ratio gain moyen / perte moyenne est de 1,59, ce qui n’est pas très satisfaisant.
– La perte maxi est très élevé (-872 €).

Nous étudierons dans un article suivant quelles sont les autres métriques à observer pour décider de la mise en production de notre robot.

Le but est de pouvoir effectuer vos propres backtests.
Vous pouvez reproduire celui détaillé ci-dessus ou, comme exercice si c’est votre premier robot
.

Il y a deux versions du code ci-dessous :
– Une version du code complet à lire qui assemble toutes les parties expliquées ci-dessus.
– Une version du code qui sera à copier / coller et à tester sur la plateforme ProRealTime.

Je l’ai nommé # ALGO NANA – MACD – 3 MM.
Comme je l’ai dit dans l’article De l’intérêt de créer vos robot de trading, j’appelle mes robots des « Nanas » en référence à Nono le Robot.
Je fais débuter le nom par le caractère « # » mais c’est une habitude.
Mais vous pourrez appeler ce robot comme vous le désirez.
Après ou avant vos tests, lisez le paragraphe « Le code de notre robot est terminé mais n’est pas tout à fait complet » pour voir ce qui manquerait pour lui assurer plus de robustesse.

// ******************************************
// * Déclaration des variables Indicateurs *
// ******************************************
// —- Déclaration des variables du MACD —-
Ligne = MACDLine[12,26,9](close)
Signal = MACDSignal[12,26,9](close)

// —- Déclaration des Moyennes mobiles —-
MM7 = average[7](close)
MM10 = average[10](close)
MM20 = average[20](close)

// *****************************************************************************
// * Déclaration des Variables variables résultat : condition remplie ou pas *
// *****************************************************************************
condAchatLong = 0
Cond1 = 0
Cond2 = 0
Cond3 = 0
Cond4 = 0

// ****************************
// * Corps du programme *
// ****************************
// La ligne MACD croise à la hausse la ligne de Signal – condition n°1
Cond1 = Ligne crosses over Signal
// La MM7 croise à la hausse la MM10 – condition n°2
Cond2 = MM7 crosses over MM10
// La bougie clôture au-dessus de la MM20 – condition n°3
Cond3 = close > MM20
// La bougie est verte – condition n°4
Cond4 = close > open

// *************************************
// * Condition d’entrée en position *
// *************************************
CondAchatLong = Cond1 AND Cond2 AND Cond3 AND Cond4

// ***********************************
// * Achat d’une position LONG *
// ***********************************

IF NOT LongOnMarket AND CondAchatLong THEN
BUY 1 contracts AT MARKET
ENDIF

Ce robot n’a pas de conditions de sortie de position.

Ou plus si, il y a en a une : la position sera clôturée à 21H (voir plus haut DEFPARAM). Donc si le robot ouvre une position à 15H31, elle sera fermée pour le meilleur ou pour le pire à 21H. Ce temps long passé dans le marché peut multiplier les risques de perte.

Ce robot n’a pas de Stop Loss.

C’est un risque énorme à prendre mais nous allons le prendre pour déjà vérifier ce que vaut cette stratégie. La mise en place d’un Stop Loss viendra par la suite.

Ce robot n’a pas de Take Profit.

Là, deux écoles s’opposent : ceux qui mettent systématiquement un Take Profit, ceux qui n’en mettent pas pour laisser courir les gains, comme en trading manuel en fait. Nous verrons cette possibilité plus tard.

Ce robot prend des positions tous les jours.

Il entrera tous les jours en position sauf les samedis et dimanches car l’indice ne cote pas.
Or certains jours, le marché se prête moins bien au trading comme les jours fériés aux USA (peu de mouvement) ou les jours de réunions du Comité monétaires de la FED (le FOMC) (risque de forte volatilité).
Dans les deux cas, il y a des risques de multiplication des faux signaux.
Il est possible d’ajouter un code qui évite les entrées en position ces jours-là.

Ce robot mérite a priori d’être conservé et approfondi.
Nous lui ajouterons dans un article suivant un Stop loss grâce au lancement d’un Rapport d’optimisation qui permettra de choisir une valeur de Stop loss en adéquation avec les mouvements brutaux du Nasdaq et sa forte volatilité.
Nous étudierons aussi quelles sont les autres métriques à observer pour décider de la mise en production de notre robot.

DERNIERS ARTICLES PUBLIES

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