Bonjour à tous, je suis nouveau sur le forum et je souhaiterais utiliser une stratégie de trading qui utiliserait un trailing stop évolutif qui serait de plus en plus serré au fur et à mesure que la valeur du titre augmente.
En gros si le cours d’achat est C0, que le cours à l’instant t est C(t),
Si mon trailing stop à l’ouverture est de X0, (c’est à dire que ma position est vendue au départ pour un cours à C0-X0)
et que le plus haut depuis l’ouverture de ma position en cours est H(t),
le trailing stop X(t) que je souhaiterais programmer est le suivant :
X(t) = a(t)*X0
avec a(t) = (C0 – X0)/(H(t)-X0) compris entre 1 et 0, et tend vers 0 lorsque le plus haut du cours augmente.
Pensez-vous qu’on peut programmer un tel trailing stop sur ProBacktest?
Merci de vos réponses, Eddy
Donc en gros, plus on s’éloigne du prix d’achat, plus le pas du trailing stop diminue. Avec la formule que tu proposes, on voit la valeur de a (ligne blanche) qui en effet diminue avec le temps et vient vers 0.
Je l’utilise ensuite comme facteur pour faire varier le pas du trailing stop du début (ici à 30 points).
La ligne rouge sur le graphique du prix affiche le seuil du stoploss qui donc diminue avec le temps. Je pense ne pas avoir fait d’erreur.
defparam cumulateorders=false
once trailingstop=30
if not onmarket then
buy at market
x0 = close-trailingstop*pointsize
newtrailing = x0
endif
if onmarket then
ht=max(ht,high)
c0 = tradeprice
a = (c0-x0)/(ht-x0)
newtrailing = max(newtrailing,close-(trailingstop*pointsize)*a)
sell at newtrailing stop
endif
graph a
graphonprice newtrailing coloured(255,0,0)
Super Merci Nicolas! Je vais tester ce trailing stop je l’utilise en manuel pour l’instant dans le jeu ABC bourse et ça donne de bons résutats : Exemple achat hier de Genfit à l’ouverture à 5.04 et revente sur trailing stop avec resserrement du pas à 8.18 ! (60% en intraday bon c’est pas tous les jours que ça arrive hein!)
Bonne journée Eddy
Bonjour Nicolas, j’ai programmé le trailing stop avec ton programme, mais j’ai du le modifier car je l’utilise sur des actions, mais le programme ne donne pas ce que je sohaite, le trailng stop n’est pas bien calculé et les sorties ne se font pas notamment à la vente : Est-ce que tu pourrais jeter un oeil dessus si tu as le temps? Ici trailing stop pour la VADE d’actions:
// Indicateurs
Signal = CALL "signalJK"
cap = Volume*close
Trend = CALL "Aimant"
//
Cv = (Trend < 0) and (signal <0) and (Cap > 1000000)
//
// Position achat
if Cv then
if not onmarket then
sellshort N shares at market
newtrailing = dLoss
ht = tradeprice
endif
endif
//
// Stops et Objectifs
if onmarket then
lt=min(lt,low)
c0 = tradeprice
x0 = c0 + dLoss
a = (c0-x0)/(lt-x0)
newtrailing = -min(newtrailing,dLoss*a)
set stop ptrailing newtrailing
endif
Bonne journée Nicolas
Bonjour, localisation du bouton “insert prt code” pour les nouveaux dans image ci-jointe. Pas besoin de reposter pour cette fois, je vais reformater le code ci-dessus. Merci de penser à utiliser le bouton pour insérer du code dans les prochains posts.
Merci du rappel Noobywan, c’est vrai je suis newbie 😉
J’avais fait une petite erreur (c’est lt et non ht la variable en ligne 13)
Mais ça ne change pas mes résultats qui sont toujours étranges,
Merci!
Signal = CALL "signalJK"
cap = Volume*close
Trend = CALL "Aimant"
//
Cv = (Trend < 0) and (signal <0) and (Cap > 1000000)
//
// Position achat
if Cv then
if not onmarket then
sellshort N shares at market
newtrailing = dLoss
lt = tradeprice
endif
endif
//
// Stops et Objectifs
if onmarket then
lt=min(lt,low)
c0 = tradeprice
x0 = c0 + dLoss
a = (c0-x0)/(lt-x0)
newtrailing = -min(newtrailing,dLoss*a)
set stop ptrailing newtrailing
endif
Il ne faut pas utiliser l’instruction set stop ptrailing, mon code est un trailing stop à lui tout seul qui utilise un ordre conditionnel de type STOP, il faut donc l’utiliser tel que conçu.
Bonjour Nicolas je me suis donc largement inspiré de ton code pour tester sur quelques actions, et à vrai dire, ça réagit pas comme j’aimerais, (j’ai peut être fait une erreur de programmation? ci dessous le code)
Je souhaiterais que le trailing stop se mette à jour dès la prise de position et ce n’est pas le cas :
Exemple sur Biomerieux (cf Copie d’écran ci joint)
- Signal d’achat le 23 Mars sur grande Bougie verte : clôture à 94,6
- Achat le 24 Mars à l’ouverture à 120, le Stop initial doit normalement mis 5,05 euros sous ce cours (correspond à l’ATR du 23/Mars) donc à 114,95 euros
- Le cours monte à 125.1 => le stop remis à jour aurait du être placé, d’après notre formule à 120,25 => après baisse du cours depuis ce plus haut, le stop aurait du s’enclencher et la perte aurait dû normalement être de : 0,25€
- Mais au lieu d’être déclenché le jour même du 24 Mars, le code n’a déclenché le stop que le lendemain, et à la valeur de 89,5 qui semble correspondre à un stop loss qui aurait été défini par rapport au cours de cloture du 23 Mars (pas de prise en compte du plus haut récent de 125, et déclenchement trop tardif)! Cela génére une perte de 30,5 € par action sur 2 journées au lieu des 0,25€ en intraday dans la stratégie que je souhaiterais programmer.
Quelle modification seraient à apporter du coup, y a t’il une erreur de code? CI dessous le backtest tel que je l’ai programmé en s’inspirant de ton code, merci d’avance!
// Définition des paramètres du code
DEFPARAM CumulateOrders = False // Cumul des positions désactivé
// Détermination du nombre d'actions en fonction du risque
atr = AverageTrueRange[14](close)
Risk = 1000
RatioL = 1
dLoss = RatioL*atr
N = Risk/dLoss
// Indicateurs
Signal = CALL "signalJK"
Trend = CALL "Aimant"
C1 = (Trend > 0) and (signal > 0)
//Position ACHAT
IF C1 THEN
if not onmarket then
buy N shares at market
x0 = close-dLoss
newtrailing = x0
endif
ENDIF
// Stops et objectifs
if onmarket then
ht=max(ht,high)
c0 = tradeprice
a = (c0-x0)/(ht-x0)
newtrailing = max(newtrailing,close-dloss*a)
sell at newtrailing stop
endif
Grâce à l’instruction GRAPHONPRICE tu pourras débugger ta variable et voir comment elle est calculé :
GRAPHONPRICE newtrailing
Bonjour Nicolas
J’ai mis ton instruction dans le code mais ça n’affiche rien (cf code ci dessous)…
J’ai peut être une idée : peut être faudrait il gérer en 2 timeframe :
L’achat à l’open (timeframe daily) suite à signal à la cloture jour précédent,
la gestion de la position en timeframe 30 minutes avec des stops qui se remettent à jour toutes les 30 minutes,
J’ai essayé mais je coince aussi sur la programmation.
Ce serait possible de faire un skype pour essayer d’y voir plus clair?
C’est dommage que je n’arrive pas à programmer le système que j’ai dans la tête et qui semble bien marcher en manuel…
// Définition des paramètres du code
DEFPARAM CumulateOrders = False // Cumul des positions désactivé
// Détermination du nombre d'actions en fonction du risque
atr = AverageTrueRange[14](close)
Risk = 1000
RatioL = 1
dLoss = RatioL*atr
N = Risk/dLoss
// Indicateurs
Signal = CALL "signalJK"
Trend = CALL "Aimant"
C1 = (Trend > 0) and (signal > 0)
//Position ACHAT
IF C1 THEN
if not onmarket then
buy N shares at market
x0 = close-dLoss
newtrailing = x0
endif
ENDIF
// Stops et objectifs
if onmarket then
ht=max(ht,high)
c0 = tradeprice
a = (c0-x0)/(ht-x0)
newtrailing = max(newtrailing,close-dloss*a)
GRAPHONPRICE newtrailing coloured(255,0,0)
sell at newtrailing stop
endif
Si ça n’affiche rien, c’est que le calcul de ton trailing stop n’est pas correct, d’où l’utilité de cette instruction pour débugger ! 🙂
C’est peut être que la valeur que tu calcules est trop petite pour coller à celle du prix, dans ce cas tu peux aussi utiliser GRAPH à la place. Sinon CTRL+D pour avoir la palette des informations des valeurs affichées sur l’écran.
L’assistance privé est facturée, je ne peux pas Skyper avec chacun des 30000 membres du forum et ça ne participe pas à aider la communauté toute entière, je préférerai qu’on continue à discuter ici de ton problème.
Je pense que tu devrais repartir de zéro en reprenant mon code et en y intégrant ta stratégie.
OK Nicolas, je vais essayer de réutiliser ton code, mais je ne comprends pas tout ton code ci dessous:
pourrais tu m’expliquer à quoi correspond ton instruction :
once trailingstop=30 que je n’ai pas réutilisé faute de compéhension
et que veut dire pointsize dans ton expression trailingstop*pointsize?
J’ai cru comprendre que pointsize c’était pour le forex, mais je trade les actions…
defparam cumulateorders=false
once trailingstop=30
if not onmarket then
buy at market
x0 = close-trailingstop*pointsize
newtrailing = x0
endif
if onmarket then
ht=max(ht,high)
c0 = tradeprice
a = (c0-x0)/(ht-x0)
newtrailing = max(newtrailing,close-(trailingstop*pointsize)*a)
sell at newtrailing stop
endif
graph a
graphonprice newtrailing coloured(255,0,0)
En fait je donne une valeur au pas du trailing stop, soit 30 points sous le prix d’ouverture de l’ordre. Pour convertir 30 points dans la valeur d’1 point pour l’instrument présent, je le multiplie par la valeur constante de ce qu’est un point. Par exemple pour le forex, 0.0010 c’est 10 points/pips, donc si je fais 10*0.0001 (0.0001 qui est la valeur du point), alors je peux me permettre d’utiliser le même code pour tous les sous-jacents, d’où l’universalité du code, comme ici pour toi avec les actions.
Il y a une petite coquille dans mon code, lors de l’ouverture de l’ordre le stoploss ne sera pas mis, il faudra attendre 1 chandelier, donc il faut le placer aussi tout de suite à l’ouverture :
defparam cumulateorders=false
once trailingstop=30
if not onmarket then
buy at market
x0 = close-trailingstop*pointsize
newtrailing = x0
sell at newtrailing stop
endif
if onmarket then
ht=max(ht,high)
c0 = tradeprice
a = (c0-x0)/(ht-x0)
newtrailing = max(newtrailing,close-(trailingstop*pointsize)*a)
sell at newtrailing stop
endif
graph a
graphonprice newtrailing coloured(255,0,0)
Donc à chaque calcul du nouveau pas, on utilise la valeur la plus haute du stoploss calculé grâce à la ligne “newtrailing = max(newtrailing,close-(trailingstop*pointsize)*a)”
Merci Nicolas,
Tes conseils pour tester mes indicateurs avec la commande GRAPHONPRICE m’ont été très utiles, du coup j’ai réussi à mettre au point ce que je voulais, mais j’ai dû utiliser 2 time frames : le daily pour les signaux et le 10 minutes pour gérer les positions.
Car si j’ai bien compris, le stop ne peut se mettre à jour qu’une fois : à l’ouverture de la barre (donc une seule fois dans la journée lorsqu’on est en UT daily) => donc nécessité pour moi d’une UT 10min pour faire varier les stops dans la journée avec suffisamment de précision.
J’ai encore un problème à régler cependant : lorsque la position est clôturée par stop en cours de journée, le système relance des achats sur les barres suivantes, car il doit surement considérer que le signal daily est encore valable…! Alors que je souhaiterais clôturer la position pour le restant de la journée et ce jusqu’à ce qu’un nouveau signal daily arrive. (même pas forcément le jour suivant donc).
J’ai essayé de gérer ça en ajoutant une condition sur le temps dans le signal l’ordre d’achat qui ne doit se faire qu’à l’ouverture du jour :
oh = openhour
C1 = (Trend > 0) and (signal > 0) and (oh <= 0910000)
Mais ça ne fonctionne pas, malgré cette condition le système continue à acheter en cours de journée lorsque la position précédente est soldée. (cf copie d’écran)
Pourrais tu m’orienter encore là dessus pour résoudre ce problème? Après je pense que mon système sera bien programmé!
// Définition des paramètres du code
DEFPARAM CumulateOrders = False // Cumul des positions désactivé
// Détermination du nombre d'actions en fonction du risque
TIMEFRAME(daily)
atr = AverageTrueRange[14](close)
Risk = 1000
RatioL = 1
dLoss = RatioL*atr
N = Risk/dLoss
// Indicateurs
Signal = CALL "signalJK"
Trend = CALL "Aimant"
oh = openhour
C1 = (Trend > 0) and (signal > 0) and (oh <= 0910000)
//Position ACHAT
//
dLos1 = dLoss[1]
TIMEFRAME(10mn)
if not onmarket then
IF C1 THEN
buy N shares at market
endif
endif
// Stops et objectifs
//
if onmarket then
c0 = tradeprice
x0 = tradeprice-dlos1
ht=max(ht,high)
a = (c0-x0)/(ht-x0)
newtrailing = max(newtrailing,ht-dlos1*a)
sell at newtrailing stop
GRAPHONPRICE newtrailing coloured(255,0,0)
GRAPHONPRICE x0 coloured(205,0,0)
GRAPHONPRICE ht coloured(225,0,0)
GRAPHONPRICE c0 coloured(225,0,0)
endif
Tu peux faire une différence entre le BARINDEX et le TRADEINDEX par exemple pour comparer les signaux avec les numéros des chandeliers.