
Introduction
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).
Le plan de l’article
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.
La table des matières
- La démarche de création du robot
- 1) La stratégie à coder : un retournement de tendance.
- 2) Codage des différentes parties du robot pas à pas.
- 3) Les conditions d’entrée
- 4) Premier backtest pour juger la stratégie
- 5) Le code complet du robot à lire
- 6) Retrouver ici le code complet du robot à copier / coller sur votre plateforme ProrealTime.
- 7) Le code de notre robot est complet mais pas terminé
- 8) Conclusion et suite à venir

La démarche de création 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.
Les notes en bleu réfèrent particulièrement à l’aide technique à la création de robot. Elles donnent des informations au sujet de la rédaction du code.

1) La stratégie de trading choisie, un retournement de tendance
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.

2) Codage des différentes parties du robot pas à pas
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.
Les préalables à inscrire dans le code
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 :
// Début du code pour heures d’ouverture et de fermeture de positions et une seule position à la fois
// On interdit la prise de plus d’une position en même temps
DEFPARAM CUMULATEORDERS = false
// Prise de position qu’aux heures d’ouverture du marché
DEFPARAM FLATBEFORE = 153000
DEFPARAM FLATAFTER = 210000
Les mentions précédées de // sont des commentaires.
Les conditions d’entrée en position : déclaration des variables d’entrée et de résultat
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ébut de la déclaration des variables qui contiendront les valeurs prises par les indicateurs
// ****************************************
// 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)
Note d’aide au codage :
« 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ébut du code déclaration des variables résultat : condition remplie ou pas
// *************************************************************************
// Déclaration des Variables variables résultat : condition remplie ou pas
// *************************************************************************
condAchatLong = 0
Cond1 = 0
Cond2 = 0
Cond3 = 0
Cond4 = 0

3) Les conditions d’entrée en position, on teste les indicateurs
Voici la façon dont nous allons tester chaque indicateur, MACD, moyennes mobiles et couleur de la dernière bougie.
// Code de test des indicateurs pour savoir si nous allons rentrer en position en pas
// 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 ?
Note d’aide au codage :
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.
// Le test qui réunit les 4 conditions. On rentre en position si toutes les conditions sont à Vrai
// *************************************
// 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 :
Note d’aide au codage :
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.
// Code entrée en position à effectuer
// ***********************************
// 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.

4) Premier backtest pour juger 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° | Gain | Nombre de trades | % de trades gagnants | Drawdown MAX | Gain/ DD Max |
| 1 | 5078 € | 302 | 59,60 % | 1635 € | 3,49 |
Voici le Rapport détaillé de la plateforme ProrealTime après ce premier backtest :

Conclusion du backtest n°1
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.

5) Le code complet du robot # ALGO NANA – MACD – 3 MM
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.
// Le code complet de # ALGO NANA – MACD – 3 MM pour relecture
// Début du code pour heures d’ouverture et de fermeture de positions et une seule position à la fois
// On interdit la prise de plus d’une position en même temps
DEFPARAM CUMULATEORDERS = false
// Prise de position qu’aux heures d’ouverture du marché
DEFPARAM FLATBEFORE = 153000
DEFPARAM FLATAFTER = 210000
// Début du code déclaration des variables qui contiendront les valeurs prises par les indicateurs
// ******************************************
// * 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ébut du code déclaration des variables résultat : condition remplie ou pas
// *****************************************************************************
// * Déclaration des Variables variables résultat : condition remplie ou pas *
// *****************************************************************************
condAchatLong = 0
Cond1 = 0
Cond2 = 0
Cond3 = 0
Cond4 = 0
// Code de test des indicateurs pour savoir si nous allons rentrer en position en pas
// ****************************
// * 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
// Le test qui réunit les 4 conditions. On teste si toutes les conditions sont à Vrai
// *************************************
// * Condition d’entrée en position *
// *************************************
CondAchatLong = Cond1 AND Cond2 AND Cond3 AND Cond4
// Code entrée en position à effectuer si toutes les conditions sont vraies et on n’est pas déjà en position
// ***********************************
// * Achat d’une position LONG *
// ***********************************
IF NOT LongOnMarket AND CondAchatLong THEN
BUY 1 contracts AT MARKET
ENDIF
// Fin du code

6) Le code à copier / coller sur ProrealTime
// Début du code
// On interdit la prise de plus d’une position en même temps
DEFPARAM CUMULATEORDERS = false
// Prise de position qu’aux heures d’ouverture du marché
DEFPARAM FLATBEFORE = 153000
DEFPARAM FLATAFTER = 210000
// *****************************************************************************************
// Déclaration des variables qui contiendront les valeurs prises par les 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 : Test de la valeur des indicateurs
// ************************************************************
// 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 finale d’entrée en position :
// On teste si toutes les conditions sont à Vrai
// *************************************************
CondAchatLong = Cond1 AND Cond2 AND Cond3 AND Cond4
// ********************************************************************
// Achat d’une position LONG si toutes les conditions sont vraies
// ********************************************************************
IF NOT LongOnMarket AND CondAchatLong THEN
BUY 1 contracts AT MARKET
ENDIF
// Fin du code
Ne copier pas au-delà de // Fin du code

7) Le code de notre robot est terminé mais n’est pas tout à fait complet
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à.
Conclusion et suite à venir
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
- Créer votre premier robot de trading pas à pas
- De l’intérêt de créer ses propres robots de trading
- Un des patterns du bonheur en trading
- Actualités Ikitrading
- Une question existentielle de trader – quel est le plus profitable ?

© Tous droits réservés
Auteure
Diane Dulac
hellodiane@ikitrading.com
Inspirée par IKI
Dragon trader
