ou Revenez vite voir les dernières mises à jour...
Dans cette partie, nous allons développer le code ProBuilder/ProBackTest
qui permet à ProRealTime de générer
les ordres d'entrée et de placer les stops
de protection et ordres de sortie dès qu'un niveau
de profit est atteint.
Nous définirons également des paramètres
que nous pourrons modifier
à loisir afin d'évaluer la meilleure combinaison
possible
pour une performance optimale. Voici en résumé ce
que notre code ProBuilder/ProBackTest et ProRealTime doivent faire:
Setup
a) Calculer une Moyenne Mobile 8 et 40 barres. Les valeurs 8 et
40 sont des paramètres du
système;
b) Calculer le Range de chaque barre: le Range est défini
comme la hauteur d'un chandelier c'est à dire le prix le plus
haut - le prix le plus bas.
Entrées
Longues
a) Valider Ascenseur Haussier: La Barre courante a sa clôture
dans le quart haut du Range. La Barre précedente a sa clôture
dans le quart bas du range.
b) La Barre Courante doit clôturer au dessus de la moyenne mobile
8 barres et Moyenne Mobile 40 barres. 8 et 40 sont des valeurs
de départ que nous optimiserons.
c) Acheter sur et seulement sur la barre suivante à partir
d'un point de plus que le plus Haut formé par l'Ascenseur Haussier.
Ce plus haut est calculé comme le prix le plus haut entre le
plus Haut de la barre Courante et le plus Haut de la barre
Précédente.
Entrées Courtes (Vente A Découvert)
a) Valider Ascenseur Baissier: La Barre courante a sa clôture
dans le quart bas du Range. La Barre précedente a sa clôture
dans le quart haut du range.
b) La Barre Courante doit clôturer au dessus de la moyenne
mobile 8 barres et Moyenne Mobile 40 barres. Pour rappel 8
et 40 sont des paramètres que nous optimiserons.
c) Vendre A Découvert sur et seulement sur la
barre suivante à partir
d'un point de moins que le plus Bas formé par l'Ascenseur Baissier.
Ce plus Bas est le prix le plus bas entre le plus bas de la
barre Courante et le plus bas de la barre Précédente.
Stop et Sorties
a) Pour une entrée longue, calculer et placer le Stop de protection
au plus bas de l'Ascenseur Haussier moins 1 point.
Pour une Entrée Short, calculer et placer le Stop de protection
au plus haut de l'Ascenseur Baissier moins 1 point.
b) Calculer et placer l'ordre à Prix Limité pour sortir
quand le profit atteint 2 fois le risque; Cet ordre est un
ordre d'achat pour une position Courte et un ordre de vente
quand la position est longue. Le multiplicateur du risque qui détermine
le seuil de profit est un paramètre que l'on pourra optimiser.
Retour
 |
|
 |
Dans la dénomination ProRealTime, un Input
ou Paramètre en Français, permet à l'utilisateur
de contrôler
le calcul d'un indicateur, stratégie ou fonction sans avoir
besoin de "bidouiller" le code. Prenons l'exemple d'une Moyenne
Mobile qui est un indicateur des plus classiques. En tant qu'utilisateur
vous pouvez être habitués à travailler avec une
Moyenne Mobile 10 jours. Un autre utilisateur peut, lui, travailler
avec une Moyenne Mobile 40 jours. Pour rendre tout le monde
heureux, ProRealTime devrait donc fournir toutes les "longueurs"
possibles et imaginable de Moyenne Mobile. Ce serait vite
ingérable et ProRealTime serait vite obligé de limiter
le nombre de possibilités.
Pour éviter cette limitation, ProRealTime a créé un
indicateur générique Moyenne Mobile dont le calcul est
contrôlable
par l'utilisateur à l'aide du
paramètre "longueur" . Ainsi pour afficher une Moyenne
Mobile 10 jours, il suffit de spécifier 10 pour le paramètre
"longueur" et de spécifier 40 pour afficher
une Moyenne Mobile 40 jours.
Ce qui est valable pour un l'indicateur de type Moyenne Mobile est
valable pour tous les autres indicateurs mis à disposition
par ProRealTime ... et bien sûr toutes les stratégies que
nous développons en ProBuilder/ProBackTest. Ainsi dans tout système de
trading, nous pouvons définir autant de paramètres que nous
souhaitons puis les modifier pour voir la valeur qui génère
le profit maximum. Par exemple, est-ce que le système est plus
profitable avec une Moyenne Mobile 10 et 40 ou avec 5 et 30?
Ou encore, faut-il attendre un profit égal à 2 fois le risque
pour sortir ou bien 1,8 est un meilleur ratio ? Une fois ces paramètres
créés dans
notre code ProBuilder/ProBackTest, on y accède via l'interface de ProRealTime
et on peut non seulement les modifier individuellement, mais
également les optimiser. L'optimisation consiste à trouver la
valeur du paramètre EN UNE SEULE FOIS (et non pas par approximation
successive) qui génère le gain maximum. Ainsi, toujours dans
notre exemple, ProRealTime permet
de trouver la combinaison de valeur des Moyenne Mobile Court et Long
Terme qui génère le profit maximum. ProRealTime fait tout le travail
pour vous.
Grosso Modo vous vous dîtes "J"aimerai savoir quelle Moyenne
Mobiles CT, entre 5 et 20, ET Moyenne Mobile LT, entre 30 et 50, utiliser
dans mon système de trading".
ProRealTime teste alors toutes les combinaisons possibles
et édite un rapport
qui spécifie par exemple "La meilleure combinaison est CT =
17 et LT = 32". Bien sûr
tous les détails, tels le DrawDown le pourcentage de profitabilité,
etc sont listés. Et ce en une seule opération et en très peu
de temps.
Maintenant que nous comprenons l'utilité des paramètres,
voyons comment les définir dans notre code ProBuilder/ProBackTest.

Et Voilà. Pour définir nos paramètres, nous utilisons le mot réservé INPUTS: puis
nous définissons chaque paramètre du nom désiré. Chaque nouveau
paramètre est séparé du précédent par une virgule.
On termine la définition des paramètres par une point virgule.
Ci-dessus nous avons défini les paramètres Longueur_CT, Longueur_LT
et MultRisque.
Le 1er paramètre, Longueur_CT, servira de base
au calcul de la Moyenne Mobile Court terme. Entre parenthèses, nous
précisons
la valeur initiale
prise par ce paramètre, qui comme spécifié dans l'étude
de notre exemple Ascenseur, est à 10. Dans la suite du
code ProBuilder/ProBackTest nous pourrons utiliser le mot Longueur_CT à la
place de la valeur 10. Il faut bien
comprendre que Longueur_CT est un nom que l'on choisit et
on aurait très bien pû dénommer ce paramètre
Pierre, Paul ou Jacques. Cependant il est utile d'utiliser
un nom qui soit facile à se remémorer par la suite. Vous
pouvez utiliser des underscores '_' des traits d'union des
majuscules, des lettres et des chiffres pour le nom dans une
limite de 40 caractères. Cependant, faîtes
attention à la
consistance des noms donnés car cela aidera dans le développement.
Le second paramètre, Longueur_LT, servira de base au calcul de la Moyenne
Mobile Long terme. Comme spécifié dans l'étude de notre exemple
Ascenseur, sa valeur initiale est 40. Dans la suite du
code ProBuilder/ProBackTest nous pourrons utiliser le mot Longueur_LT
en lieu et place de la valeur 40.
Le troisième paramètre enfin, MultRisque,
servira de base au calcul du Profit à atteindre avant de sortir
d'une position. Il correspond au coefficient de multiplication
du risque d'où son
nom. Comme spécifié dans
l'étude
de notre exemple Ascenseur,
sa valeur initiale est 2. Dans la suite du code ProBuilder/ProBackTest
nous utiliserons le mot
MultRisque en lieu et
place de la valeur 2.
Retour
Pour comprendre le code que nous allons développer dans cette partie,
nous allons préalablement introduire le concept de Variables.
Les variables sont un réceptacle de valeurs
que l'on utilisera dans le code en utilisant le nom de la variable
au lieu de la valeur. Comme avec les Inputs, toutes nos variables
seront déclarés à la suite du mot réservé VARIABLES: Prenons
l'analogie d'un Verre pour mieux comprendre ce qu'est une
variable.
Avant d'utiliser un verre il faut l'acheter. Avant d'utiliser
une variable il faut la définir à l'aide du mot réservé VARIABLES:
Ma_Variable.
Avant d'utiliser votre Verre pour la 1ère fois, il faut en général
le nettoyer (chose pas forcément évidente pour nous les hommes,
mais bon !!). Avant d'utiliser une variable il faut soit l'initialiser à 0 - Ma_Variable(0) -
si
on souhaite stocker des valeurs numériques soit l'initialiser avec des
guillemets ouverts/fermés - Ma_Variable(" ") - pour
stocker
du texte. On peut enfin l'initialiser à Vrai ou Faux - Ma_Variable(False)
-si on souhaite
l'utiliser pour stocker le résultat d'une comparaison de type
Vrai/Faux.
Une fois prêt à l'emploi, on peut remplir notre
verre avec n'importe
quoi comme par exemple 250ml d'eau. Une fois initialisée on peut
stocker ce qu'on veut dans notre variable comme par exemple la valeur 250.
Pour cela il suffit d'assigner 250 à notre variable de la façon suivante Ma_Variable
= 250 ;
Si l'on veut se référer à un litre d'eau
on peut alors dire
que c'est équivalent à 4 verres pleins. Pour 1/2 litre, 2 Verres,
etc. Vous voyez où je veux en venir. Pour référencer la
valeur 1000, on peut alors dire que c'est égal à 4 fois notre variable.
De même pour 500, égal à 2 fois notre variable. Ainsi, une
fois déclarée, on ne référence plus la valeur 500
mais tout simplement le nom de la variable à la place. 1000 =
4 x Ma_Variable;
Finissons notre analogie. Tant que vous ne
buvez pas l'eau du verre celui-ci est toujours plein. Pour
y mettre du vin, vous devez d'abord vider son contenu (étape
douloureuse s'il s'agissait d'eau!) puis le remplir à nouveau.
Et bien c'est (presque) pareil avec une variable. Une fois qu'on lui assigne
une valeur (exemple 250) elle la stocke à moins qu'on lui dise de stocker
autre chose. La différence avec un verre est que vous n'êtes pas
obligés de vider la variable avant de l'utiliser avec une autre valeur.
Il suffit de lui assigner directement la nouvelle valeur à l'aide du signe égal. Ma_Variable = 500 ;
La différence d'une variable avec un paramètre est
que l'on ne contrôle la valeur d'une variable uniquement dans
le code ProBuilder/ProBackTest. On n'y accède pas de l'extérieur
comme avec un paramètre. Par
contre vous pouvez assigner différentes valeurs à votre
variable tout qu long du code ProBuilder/ProBackTest (stocker d'abord
1000 puis
200, etc.) ce qui est impossible avec un paramètre. On utilise
donc les variables pour stocker le résultat de calculs intermédiaires
et les paramètres comme constantes dont la valeur est spécifiée
à l'extérieur du code.
Maintenant que nous comprenons le concept des variables, voyons
un peu ce que nous devons calculer pour notre SetUp. D'abord
nous devons calculer la Moyenne Mobile Court et Long terme.
Nous devons ensuite vérifier
que la clôture
du chandelier courant est au-dessus de chacune d'entre elles
pour un Achat, et en dessous pour une Vente A découvert. Voyons
un peu à quoi
ressemble le code ProBuilder/ProBackTest dans ProRealTime
La première chose à faire est de déclarer et initialiser nos variables
qui serviront tout au long de nos calculs.
Comme nous devons
calculer une Moyenne Mobile Court et Long terme, nous déclarons
2 variables MoyM_CT (CT pour Court Terme) et MoyM_LT (LT pour
Long Terme), initialisés à 0
car elles doivent stocker des valeurs numériques.
Ces 2 variables stockeront nos 2 moyennes
mobiles.
Comme nous devons vérifier que la clôture du chandelier est supérieure/inférieure
aux Moyenne Mobiles, nous déclarons 2 variables conditionnelle
SetUp_L et SetUp_S pour la Vente A Découvert. Pour préciser à
ProBuilder/ProBackTest que ce sont des variables conditionnelles, nous
les initialisons à False. SetUp_L (L pour Long) passera à Vrai
si la clôture est supérieure aux Moyennes Mobiles. SetUp_S (S
pour Short) passera à Vrai
si la clôture est inférieure aux Moyennes Mobiles.
Maintenant que nos variables MoyM_CT et MoyM_LT sont
déclarées, nous
allons y assigner le résultat du calcul de leur Moyenne Mobile
respective via les instructions suivantes
MoyM_CT = average (close, Longueur_CT);
MoyM_LT = average (close, Longueur_LT);
La fonction Average retourne le calcul d'une Moyenne Mobile avec les
arguments passés entre parenthèses. Nous voulons une Moyenne
Mobile sur des prix de clôture donc nous passons Close comme
1er argument. Puis, remarquez l'utilisation du paramètre Longueur_CT
à la place de la valeur
10 en tant que 2ème argument. Même chose pour MoyM_LT.
Remarque: Maintenant que nos 2 variables stockent le résultat du calcul
des Moyennes Mobiles, il nous suffit d'utiliser les noms MoyM_CT
et MoyM_LT pour faire référence aux valeurs de chacune d'entre
elles.
L'étape suivante consiste à vérifier que la clôture du chandelier
courant est au-dessus/en-dessous des Moyennes Mobiles. Nous allons
stocker le résultat de la comparaison dans nos variables conditionnelles
SetUp_L et SetUp_S via les instructions suivantes
SetUp_L = Close > MoyM_CT AND Close > MoyM_LT;
SetUp_S = Close < MoyM_CT AND Close < MoyM_LT;
Ainsi SetUp_L est Vrai si et seulement si la Clôture est supérieure à la
Moyenne Mobile Court Terme (Close > MoyM_CT) ET (AND) que
la Clôture est également supérieure à la
Moyenne Mobile Long Terme (Close > MoyM_LT). Dans tous les autres
cas SetUp_L est Faux.
De même SetUp_S est Vrai si et seulement si la Clôture est inférieure à la
Moyenne Mobile Court Terme (Close < MoyM_CT) ET
(AND) que la Clôture est également supérieure à la
Moyenne Mobile Long Terme (Close < MoyM_LT). Dans tous
les autres cas SetUp_S est Faux.
Remarque: Toute instruction ProBuilder/ProBackTest se termine
toujours par un point-virgule ';'. Les accolades permettent d'inclure
des commentaires dans
votre code.
Retour
Voyons maintenant comment entrer en position. Pour entrer en position
longue, il faut vérifier en ProBuilder/ProBackTest que la combinaison
du chandelier courant et du chandelier précédent forment un
Ascenseur Haussier.
Puis si nous sommes en présence d'un Ascenseur Haussier et que la condition
de SetUp pour une Entrée Longue est respectée alors nous passons
un Ordre à Seuil de déclenchelement un point au dessus du plus
Haut de l'Ascenseur Haussier.
Pour se faire, notre code ProBuilder/ProBackTest doit calculer le Range de la barre
courante et de la barre précédente puis
stocker dans une variable lerésultat de la condition Ascenseur
Haussier. Nous devons également définir une variable qui
stockera le Prix de seuil pour notre ordre à seuil de déclenchement.
Voici le code

Sans surprise, la première étape consiste à définir les variables qui
vont servir à stocker des calculs intérmédiaires ou une valeur
booléenne de type Vrai/Faux.
Ainsi, on définit BarRange variable
qui servira à stocker le range du chandelier courant, c'est
à dire la différence entre le prix le Plus Haut et le plus
Bas. Cette variable est initialisée à 0 puisqu'elle stockera
une valeur numérique.
On définit ensuite Ascenseur_L (L pour Long), variable
qui servira à déterminer si les 2 derniers chandeliers forment
un Ascenseur Haussier. Comme cette variable une valeur booléenne,
elle est intialisée à False.
Enfin, on définit Seuil_L, variable qui stockera le Prix
de Seuil fixé au plus Haut de l'Ascenseur Haussier + 1. Cette
variable est numérique. Une fois ces variables définies,
utilisons les comme indiqué ci-dessous.
1) D'abord calculons
le Range et assignons le résultat à la variable BarRange.
Calculer le Range avec ProBuilder/ProBackTest et ProRealTime est on
ne peut plus simple. Il suffit d'écrire
BarRange = High - Low;
C'est tout ! Non seulement c'est très simple mais on peut en plus accéder
très facilement au Range de n'importe quelle barre précédente
en utilisant les crochets ouverts/fermés. Ainsi le Range
du chandelier précédent se référencera via
BarRange[1].
2) Maintenant qu'on est capable d'accéder au Range
du chandelier courant et précedent, il est assez simple
de vérifier que les 2 derniers chandeliers forment un
Ascenseur Long par l'instruction suivante
Ascenseur_L =
Close > High - (0.25 x BarRange)
AND
Close[1]
< Low[1] + (0.25 x BarRange[1])
La première expression retourne Vrai si la clôture du chandelier
courant est située entre 0 et 25% de son plus Haut.
La seconde expression retourne Vrai si la clôture du chandelier
précédent est située
entre 0 et 25% de son plus Bas.
Comme les 2 expressions sont séparées par le mot réservé AND,
Ascenseur_L est Vrai si et seulement les 2 expressions
sont vraies.
3) La troisième étape consiste à stocker dans la
variable Seuil_L le niveau de prix à partir duquel on peut acheter
la valeur. La seule difficulté consiste à trouver quel chandelier
a son le prix Haut le plus élevé. En utilisant les mots
réservés IF ... THEN (Si ... ALORS) nous
pourrions écrire:
Seuil_L = 0 ;
IF High[1] > High Then
Seuil_L = High[1] ;
IF High> High[1] Then Seuil_L = High ;
Cela est (assez) aisé quand il n'y a que 2 chandeliers. Mais si l'on
doit déterminer le prix le plus élevé des Plus Haut des
10 derniers chandeliers, tout de suite ça se complique!
ProRealTime et ProBuilder/ProBackTest proposent une librairie de
fonction utiles dans ces cas précis. Nous avons déjà utilisé
la fonction Average, et ici nous allons utiliser la fonction
HIGHEST. Cette fonction retourne le prix le plus élevé
d'une série de chiffres pour un nombre spécifié de chandeliers.
Ainsi pour connaître le prix le plus élevé parmi les prix
de Clôture des 10 derniers chandeliers, il suffit d"écrire:
HIGHEST (CLOSE, 10) ;
Dans notre exemple, nous avons besoin de connaître le prix le plus élevé
entre le prix le Plus Haut du chandelier précédent et courant.
On écrit donc HIGHEST (HIGH, 2) et on assigne ce résultat
à Seuil_L à l'aide du signe égal.
4) Dernière étape et non des moindres, l'Achat. Enfin, me direz-vous!
C'est bien beau tout ce qu'on a fait jusqu'à présent mais
il faudrait voir à rentrer en position sinon on a travaillé
pour rien. A présent qu'on a mis en place toutes les briques
cela va être très simple. Une fois encore on va avoir besoin
d'utiliser une instruction réservée de ProRealTime qui
s'appelle
BUY. Même si vous n'aimez pas l'anglais je crois que
vous arriverez à retenir ce mot, traduction exacte d'Achat.
Décortiquons donc l'instruction d'achat
IF Ascenseur_L=True And SetUp_L=True THEN
BUY ("Asc_L") 1 share Next Bar at Seuil_L stop;
Avant d'acheter on doit s'assurer que l'on est en présence d'un Ascenseur
Haussier et que notre condition de SetUp Long est respectée.
Comme les variables Ascenseur_L et SetUp_L stockent le
résultat des conditions (voire détails ci-dessus), on s'assure
que les 2 variables sont vraies grâce à l'utilisation
de IF ... THEN.
Si les 2 variables sont Vraies alors on achète (BUY) 1
action/contrat Future (Share ou Contract) sur la barre
suivante (Next Bar) à partir du prix Seuil_L (at Seuil_L).
Le type d'ordre est à seuil de déclenchement (Stop).
Et voilà, vous venez de suivre pas à pas tous les éléments
pour créer un système de trading qui passe à l'achat
suite à
un ascenseur Haussier si la clôture du chandelier est au
dessus de sa Moyenne Mobile court et Long terme. En plus
grâce aux fonctionnalités d'optimisation de ProRealTime,
on va être capable de déterminer la combinaison
de Moyennes Mobiles qui amène au profit maximum.
Retour
Maintenant que vous avez tout compris sur l'entrée longue,
il est préférable que vous essayiez vous-mêmes de développer
le code pour une entrée Short. Voici quelques indications:
- Créer une variable Ascenseur_S initialisée à False pour
déterminer si les 2 derniers chandeliers forment un Ascenseur
Baissier.
- Créer une variable Seuil_S initialisée à 0
pour stocker le niveau d'achat pour l'ordre de Vente
A Découvert
- Utiliser la fonction LOWEST et le mot réservé LOW pour
trouver le prix le plus bas entre le plus Bas du chandelier
courant et précédent. La fonction LOWEST est similaire
en tout point à la fonction HIGHEST
- Utiliser le mot réservé SELLSHORT pour passer un ordre
de Vente A Découvert. Ce mot réservé est similaire
au mot réservé BUY.
Ne vous inquiétez pas si vous n'y arrivez pas
du premier coup et avez besoin d'aide. Vous pouvez choisir
de télécharger
le code complet via le menu sur la gauche.