Je ne parviens pas à programmer un backtest qui comprendrait les conditions suivantes:
- soit une action X
- Si mes conditions d’achat sont réunies, j’achète pour 1000 euros d’actions X
- Dans ce cas, mon programme de backtest fait état d’un objectif de 20 %.
- A contrario, si l’action part du mauvais côté, je me protège avec un stop à – 5%.
Jusque là je suis en mesure de programmer ce backtest qui pourrait s’écrire ainsi:
DEFPARAM cumulateOrders = true
c1 = A
c2 = B
c3 = C
Achat = c1 and c2 and c3
If ACHAT then
buy 1000 cash at market
set stop %loss 5
//ENDIF
La programmation que j’aimerais ajouter est la suivante:
Si le cours progresse comme je le souhaite, c’est à dire en hausse et dépasse un seuil de 8%, puis rechute jusqu’à toucher un autre seuil fixé à 4%, je coupe ma position.
Et là, je “sèche” pour terminer la programmation de ce backtest.
Pouvez-vous m’aider à la rédiger svp ?
Ton code semble bon donc je ne vois que 2 explications possibles :
-> Soit tes conditions sont trop restrictives pour prendre ne serait-ce qu’une seule position.
-> Soit l’actif que tu trades n’est pas une action. En effet l’instruction CASH n’est pas utilisable avec le forex ou les futurs. A ta place je remplacerait l’instruction CASH par SHARES.
Je me suis vraisemblablement mal expliqué . Non, le problème n’est pas dans mes conditions qui pourraient, effectivement, être trop restrictives. Mais, de toute façon, les conditions, quelles qu’elles soient, ne sont pas en cause. Le début de ma programmation est correcte (encore que j’ai oublié de placer le code de l’objectif, ce que je corrige ici):
DEFPARAM cumulateOrders = true
c1 = A
c2 = B
c3 = C
Achat = c1 and c2 and c3
If ACHAT then
buy 1000 cash at market
set stop %loss 5
set target %profit 20
endif
Ce que je voudrais, c’est INSERER dans le corps de la programmation de ce backtest, un code qui COMMANDE CLOTURER LA POSITION si le cours de l’action, une fois l’achat de 1000 € effectué, monte de +8% ou davantage ( sans atteindre l’objectif de 20%), puis chute jusqu’à atteindre un seuil de +4 % (par rapport au niveau de l’achat), de telle façon qu’on puisse sécuriser ce niveau de +4%.
Merci pour votre aide
JSParticipant
Veteran
Bonjour,
Tu peux ajouter deux conditions supplémentaires qui suivent la « PositionPerformance » en pourcentage (PositionPerf * 100)…
If PositionPerf*100>=8 then
T8=1
EndIf
If T8=1 and PositionPerf*100<=4 then
Sell at Market
T8=0
EndIf
JSParticipant
Veteran
P.S. Si tu ne veux pas placer des ordres cumulatifs (renforcer une position), « DefParam CumulateOrders= » doit être réglé sur « False »…
@Lamericain oups désolé, j’ai lu trop vite. Pas beaucoup dormi cette nuit et je suis dans le coaltar depuis ce matin. Ca aurait pu me jouer des tours dans mon trading mais heureusement je m’en sors bien avec un peu de chance.
Pour revenir à ta demande voici le code (à essayer) :
Performance=(high-tradeprice)/tradeprice*100
if performance>=8 then
objectif8=1
endif
if longonmarket and objectif8=1 and performance<=4 then
sell at market
objectif8=0
endif
La première ligne est à mettre au début de ton code, en tout cas avant la prise de position. Ensuite le reste va à la fin.
Le code de @JS semble pas mal mais sauf erreur il ne prend en compte que la clôture et non le plus haut de la bougie qui vient de clôturer.
merci JS . Ton concours m’est précieux, et grâce à toi j’ai obtenu le code correspondant à ma demande. Mes remerciements !
Quant à ton PS : “
JS
Participant
Veteran
P.S. Si tu ne veux pas placer des ordres cumulatifs (renforcer une position), « DefParam CumulateOrders= » doit être réglé sur « False »…”, il devance une autre de mes difficultés en matière de codage des backtests :
Lorsqu’on rédige un codage de n’importe quel backtest , on peut utiliser , en première ligne, la précision suivante :
- soit, DefParam CumulateOrders= false : cela signifie que si une valeur réunit les conditions requises et que, avant que cette première prise de position atteigne son objectif ou soit stoppée, une nouvelle prise de position soit rendue possible sur cette même valeur ( les conditions étant, là-aussi, réunies),, le backtest ne retient pas cette deuxième prise de position potentielle.
- soit, DefParam CumulateOrders= true, cela signifie que si une valeur réunit les conditions requises et que, avant que cette première prise de position atteigne son objectif ou soit stoppée, une nouvelle prise de position soit rendue possible sur cette même valeur ( les conditions étant, là-aussi, réunies), on observe que les deux prises de position sont CUMULEES et l’objectif de ce cumul devient CELUI DE LA DEUXIEME POSITION ( le stop également).
Personnellement, je souhaiterais savoir s’il existe une troisième option possible ( au lieu de DefParam CumulateOrders= false ou DefParam CumulateOrders= true) qui permettre que le backtest prenne en compte, lorsque les réunions de tri d’un backtest sont réunies, deux ( ou davantage) prises de position sur une même valeur , et les faire vivire indépendamment l’une de l’autre même si la deuxième prise de position intervient à un moment où la première n’a atteint ni son objectif, ni a été stoppée.
Je n’ai trouvée aucune formule de backtest qui permette de faire la synthèse de stratégies qui seraient ainsi conçues….
Y-a t’il une possibilité de coder une telle façon de réaliser des backtests svp ?
JSParticipant
Veteran
Malheureusement, cette troisième option n’existe pas…
À ma connaissance, les positions cumulées dans le backtest sont toujours fusionnées en une seule position avec un seul « PositionPrice »…