Programmation Trailing stop évolutif avec resserrement du pas
Forums › ProRealTime forum Français › Support ProOrder › Programmation Trailing stop évolutif avec resserrement du pas
- This topic has 14 replies, 3 voices, and was last updated 4 years ago by Nicolas.
-
-
05/12/2020 at 8:45 AM #131242
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
05/12/2020 at 3:27 PM #131330Donc 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.
1234567891011121314151617181920defparam cumulateorders=falseonce trailingstop=30if not onmarket thenbuy at marketx0 = close-trailingstop*pointsizenewtrailing = x0endifif onmarket thenht=max(ht,high)c0 = tradepricea = (c0-x0)/(ht-x0)newtrailing = max(newtrailing,close-(trailingstop*pointsize)*a)sell at newtrailing stopendifgraph agraphonprice newtrailing coloured(255,0,0)05/13/2020 at 10:40 AM #131459Super 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
05/14/2020 at 4:46 PM #131683Bonjour 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:
12345678910111213141516171819202122232425// IndicateursSignal = CALL "signalJK"cap = Volume*closeTrend = CALL "Aimant"//Cv = (Trend < 0) and (signal <0) and (Cap > 1000000)//// Position achatif Cv thenif not onmarket thensellshort N shares at marketnewtrailing = dLossht = tradepriceendifendif//// Stops et Objectifsif onmarket thenlt=min(lt,low)c0 = tradepricex0 = c0 + dLossa = (c0-x0)/(lt-x0)newtrailing = -min(newtrailing,dLoss*a)set stop ptrailing newtrailingendifBonne journée Nicolas
05/14/2020 at 4:56 PM #131684Bonjour, 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.
05/14/2020 at 5:07 PM #131690Merci 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!
VADE actions123456789101112131415161718192021222324Signal = CALL "signalJK"cap = Volume*closeTrend = CALL "Aimant"//Cv = (Trend < 0) and (signal <0) and (Cap > 1000000)//// Position achatif Cv thenif not onmarket thensellshort N shares at marketnewtrailing = dLosslt = tradepriceendifendif//// Stops et Objectifsif onmarket thenlt=min(lt,low)c0 = tradepricex0 = c0 + dLossa = (c0-x0)/(lt-x0)newtrailing = -min(newtrailing,dLoss*a)set stop ptrailing newtrailingendif05/14/2020 at 6:08 PM #13169505/15/2020 at 12:10 AM #131719Bonjour 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!
Stop évolutif12345678910111213141516171819202122232425262728// Définition des paramètres du codeDEFPARAM CumulateOrders = False // Cumul des positions désactivé// Détermination du nombre d'actions en fonction du risqueatr = AverageTrueRange[14](close)Risk = 1000RatioL = 1dLoss = RatioL*atrN = Risk/dLoss// IndicateursSignal = CALL "signalJK"Trend = CALL "Aimant"C1 = (Trend > 0) and (signal > 0)//Position ACHATIF C1 THENif not onmarket thenbuy N shares at marketx0 = close-dLossnewtrailing = x0endifENDIF// Stops et objectifsif onmarket thenht=max(ht,high)c0 = tradepricea = (c0-x0)/(ht-x0)newtrailing = max(newtrailing,close-dloss*a)sell at newtrailing stopendif05/15/2020 at 8:14 AM #13173205/15/2020 at 12:29 PM #131761Bonjour 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…
1234567891011121314151617181920212223242526272829// Définition des paramètres du codeDEFPARAM CumulateOrders = False // Cumul des positions désactivé// Détermination du nombre d'actions en fonction du risqueatr = AverageTrueRange[14](close)Risk = 1000RatioL = 1dLoss = RatioL*atrN = Risk/dLoss// IndicateursSignal = CALL "signalJK"Trend = CALL "Aimant"C1 = (Trend > 0) and (signal > 0)//Position ACHATIF C1 THENif not onmarket thenbuy N shares at marketx0 = close-dLossnewtrailing = x0endifENDIF// Stops et objectifsif onmarket thenht=max(ht,high)c0 = tradepricea = (c0-x0)/(ht-x0)newtrailing = max(newtrailing,close-dloss*a)GRAPHONPRICE newtrailing coloured(255,0,0)sell at newtrailing stopendif05/15/2020 at 12:50 PM #131765Si ç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.
05/15/2020 at 1:28 PM #131771OK 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…
1234567891011121314151617181920defparam cumulateorders=falseonce trailingstop=30if not onmarket thenbuy at marketx0 = close-trailingstop*pointsizenewtrailing = x0endifif onmarket thenht=max(ht,high)c0 = tradepricea = (c0-x0)/(ht-x0)newtrailing = max(newtrailing,close-(trailingstop*pointsize)*a)sell at newtrailing stopendifgraph agraphonprice newtrailing coloured(255,0,0)05/15/2020 at 3:17 PM #131781En 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 :
123456789101112131415161718192021defparam cumulateorders=falseonce trailingstop=30if not onmarket thenbuy at marketx0 = close-trailingstop*pointsizenewtrailing = x0sell at newtrailing stopendifif onmarket thenht=max(ht,high)c0 = tradepricea = (c0-x0)/(ht-x0)newtrailing = max(newtrailing,close-(trailingstop*pointsize)*a)sell at newtrailing stopendifgraph agraphonprice 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)”
05/16/2020 at 12:57 AM #131838Merci 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é!
12345678910111213141516171819202122232425262728293031323334353637// Définition des paramètres du codeDEFPARAM CumulateOrders = False // Cumul des positions désactivé// Détermination du nombre d'actions en fonction du risqueTIMEFRAME(daily)atr = AverageTrueRange[14](close)Risk = 1000RatioL = 1dLoss = RatioL*atrN = Risk/dLoss// IndicateursSignal = CALL "signalJK"Trend = CALL "Aimant"oh = openhourC1 = (Trend > 0) and (signal > 0) and (oh <= 0910000)//Position ACHAT//dLos1 = dLoss[1]TIMEFRAME(10mn)if not onmarket thenIF C1 THENbuy N shares at marketendifendif// Stops et objectifs//if onmarket thenc0 = tradepricex0 = tradeprice-dlos1ht=max(ht,high)a = (c0-x0)/(ht-x0)newtrailing = max(newtrailing,ht-dlos1*a)sell at newtrailing stopGRAPHONPRICE newtrailing coloured(255,0,0)GRAPHONPRICE x0 coloured(205,0,0)GRAPHONPRICE ht coloured(225,0,0)GRAPHONPRICE c0 coloured(225,0,0)endif05/18/2020 at 8:59 AM #132079Tu peux faire une différence entre le BARINDEX et le TRADEINDEX par exemple pour comparer les signaux avec les numéros des chandeliers.
-
AuthorPosts
Find exclusive trading pro-tools on