Avoir un Stop Loss placé en fonction de l’ouverture d’une bougie
Forums › ProRealTime forum Français › Support ProOrder › Avoir un Stop Loss placé en fonction de l’ouverture d’une bougie
- This topic has 15 replies, 3 voices, and was last updated 4 years ago by thomas_price.
-
-
07/27/2020 at 11:06 AM #140183
Bonjour,
J’ai actuellement un algorithme qui prend des positions de la manière suivante :
12345IF Condition1 AND Condition2 AND Condition3 AND Condition4 AND NOT ONMARKET THENBUY 2 SHARES AT MARKETSET STOP %LOSS 0.25SET TARGET %PROFIT 1ENDIFLorsque je fais un backtest, le prix d’ouverture d’une position correspond toujours parfaitement au prix d’ouverture de la bougie sur laquelle le système à ouvert une position, ce qui est complétement normal. Cependant en trading réel il arrive très souvent (notamment à cause du slippage) qu’il y ait une différence de quelques points entre le prix d’ouverture de la position et le prix d’ouverture de la bougie. Comme le Stop Loss et le Take Profit sont calculés en fonction du prix d’ouverture de la position, ils n’ont donc pas les mêmes niveaux en trading réel et en backtest, sauf dans le cas ou le prix d’ouverture de la position est égale au prix d’ouverture de la bougie.
Pour pallier à ce problème et avoir toujours les mêmes niveaux de Stop Loss et de Take Profit en trading réel et en backtest, j’aimerais que le Stop Loss et le Takes Profit soient calculés en fonction du prix d’ouverture de la bougie et non pas du prix d’ouverture de la position.
J’ai d’abord essayé de la manière suivante :
12345IF Condition1 AND Condition2 AND Condition3 AND Condition4 AND NOT ONMARKET THENBUY 2 SHARES AT MARKETSET STOP LOSS (((0.25/100)*OPEN[BARINDEX-TRADEINDEX])+(TRADEPRICE-OPEN[BARINDEX-TRADEINDEX]))SET TARGET PROFIT (((1/100)*OPEN[BARINDEX-TRADEINDEX])-(TRADEPRICE-OPEN[BARINDEX-TRADEINDEX]))ENDIFMalheureusement ça ne fonctionne pas, les valeurs du Stop Loss et du Take profit ne sont pas bien calculés, comme ci le système n’arrivait pas à détecter la nouvelle position. J’ai utilisé GRAPH pour regarder les valeurs des différentes variables et elles ne sont pas bonnes, notamment TRADEPRICE qui ne se met pas à jour avec la nouvelle position.
J’ai donc essayé autrement en essayant de laissant le temps au système de bien prendre en compte la nouvelle position :
12345678IF Condition1 AND Condition2 AND Condition3 AND Condition4 AND NOT ONMARKET THENBUY 2 SHARES AT MARKETENDIFIF LONGONMARKET THENSET STOP LOSS (((0.25/100)*OPEN[BARINDEX-TRADEINDEX])+(TRADEPRICE-OPEN[BARINDEX-TRADEINDEX]))SET TARGET PROFIT (((1/100)*OPEN[BARINDEX-TRADEINDEX])-(TRADEPRICE-OPEN[BARINDEX-TRADEINDEX]))ENDIFLes résultats sont bien meilleurs, sauf pour les positions qui s’ouvrent et se ferment sur une seule bougie (la première du coup). Vu le résultat, je suppose donc que les variables comme TRADEPRICE ne s’actualisent qu’a la fin de la première bougie et non pas au moment de l’ouverture de la position ce qui est bien dommage.
Pour l’instant je me suis arrêté là, je pense peut être avoir recours au MULTI TIME FRAME, pour essayé de récupérer les bonnes variables (TRADEPRICE et les autres) sur des UT plus petites (1 seconde par exemple) mais je ne sais pas si c’est possible de faire ça, je n’ai encore jamais utilisé le MULTI TIME FRAME. Si cette solution fonctionne, c’est quand même une solution très compliquée pour un problème qui est très simple à la base, n’y aurait-il pas un autre moyen ?
07/27/2020 at 12:26 PM #140190TRADEPRICE ne sera renseigné avec la valeur prix d’ouverture de l’ordre qu’à la bougie suivante, puisque dans le code, juste après l’instruction BUY, on ne peut toujours pas savoir son prix d’ouverture puisque il faudra attendre l’ouverture (Open) de la bougie suivante.
Donc il convient d’utiliser un TP/SL basé sur le Close actuel au moment de passer l’ordre et de le modifier si tu es au marché dés la bougie suivante (ON MARKET).
1 user thanked author for this post.
07/27/2020 at 12:27 PM #14019107/27/2020 at 1:51 PM #140202Donc il convient d’utiliser un TP/SL basé sur le Close actuel au moment de passer l’ordre et de le modifier si tu es au marché dés la bougie suivante (ON MARKET).
Ce n’est pas déjà ce que je fais dans mon derniers exemple ?
J’attends bien que la position soit prise et que LONGONMARKET soit TRUE, avant d’utiliser les variables dont j’ai besoin (TRADEPRICE et autres), mais même en faisant cela, il me semble que sur la première bougie (la bougie ou le trade commence, en général aux alentours de son OPEN), les variables n’ont pas les bonnes valeurs. D’ailleurs je n’arrive pas bien à comprendre ce phénomène, comment LONGONMARKET peut être TRUE et en même temps avoir un TRADEPRICE qui n’a pas la bonne valeur ? Mon algorithme fonctionne sur du M15, donc pendant les 15 min suivant l’ouverture de la positon, j’ai un TRADEPRICE qui n’a pas la bonne valeur, alors que la position est bien ouverte. Suite à cela la bougie ce clôture, et ce n’est qu’à ce moment là que TRADEPRICE obtient la bonne valeur.
07/27/2020 at 3:25 PM #140208C’est logique puisque le code est lu à la clôture, puisque l’ordre vient de s’ouvrir, il faut attendre une bougie supplémentaire pour que TRADEPRICE du dernier ordre soit connu. Sinon ce sera celui de l’ordre juste avant, d’où ton incompréhension sur sa valeur.
07/27/2020 at 3:55 PM #140213Effectivement, comme vous le dites, le code est lu à la clôture, donc TRADEPRICE n’est actualisé qu’à partir de ce moment là. Mais alors dans ce cas, pourquoi LONGONMARKET est TRUE ? Pourquoi n’est-il pas FALSE sur la première bougie, puis TRUE à la cloture de celle ci ? Pourquoi n’a t-il pas le même comportement que TRADEPRICE ?
Comment savoir à l’avance quel variable se comportera comme TRADEPRICE (actualisation à la clôture) ou comme LONGONMARKET (actualisation dés la prise de position) ?
07/28/2020 at 10:05 PM #140345Bon du coup j’ai un peu essayé les différentes solutions proposées :
Dans un premier temps j’ai essayé de résoudre la problème via le MTF, mais j’ai assez rapidement arrêté. J’ai l’impression que le MTF est plutôt fait pour aller sur des UT supérieurs à notre UT principale, plutôt que vers des UT inférieurs (ce dont j’ai besoin pour résoudre mon problème) ou alors il faut descendre notre UT principale ce qui est assez contraignant.
Peu après cela, j’ai donc essayé l’autre solution, celle proposée par Nicolas que je remercie beaucoup parce que je ne l’aurais surement pas trouvé tout seul. Ainsi à l’ouverture d’une position, j’utilise dans un premier temps le CLOSE de la bougie précédente pour déterminé mon Stop Loss et mon Take Profit, puis une fois la bougie actuel clôturé, je réajuste le Stop Loss et le Take Profit grâce à son OPEN. Bien que cette solution ne soit pas parfaite, puisque que j’aurais aimé pouvoir définir mon Stop Loss et mon Take Profit en exploitant directement le OPEN ce qui n’est pas possible sur la première bougie, elle est quand même satisfaisante puisqu’elle me permet théoriquement d’avoir des niveaux de Stop Loss et de Take Profit identique en backtest et en Trading réel ce qui était mon objectif à la base.
Merci beaucoup de m’avoir aidé.
1 user thanked author for this post.
08/03/2020 at 8:14 PM #140792D’ailleurs je n’arrive pas bien à comprendre ce phénomène, comment LONGONMARKET peut être TRUE et en même temps avoir un TRADEPRICE qui n’a pas la bonne valeur ?
Je crois que je commence à comprendre !
Début Bougie 1– A la fin de cette Bougie, le cours rempli les conditions de trade.Fin de Bougie 1 :– le code s’exécute
– Les conditions d’entrer au marché sont réunies
– Un ordre est envoyé au broker d’acheter.– Un ordre Stop loss est aussi envoyé au Broker. Tu ne sais pas à combien il va acheter mais tu peux lui dire à quelle distance mettre le STOP LOSS en fonction du close de la bougie.– L’ordre est envoyé, il ne faut pas renvoyer un ordre au broker à la fin de la bougie suivante : onmarket = true (sinon risque envoi second ordre)Début Bougie 2– Durant la bougie 2, un ordre se déploie rapidement chez le Broker.– Le stop Loss en fonction de la Bougie 1 se déploie rapidement chez le Broker– On est onmarket = true pour pas renvoyer un ordre à la fin de la bougieFin de bougie 2– L’ordre a été filled.– Le Stop Loss a été mis en place– Le code s’exécute– On regarde déjà si les conditions de sortie sont réunies.– LE STOP LOSS peut être modifié en fonction de l’open de la bougie 2, proche surement du tradeprice mais je pense que tu as reçu tradeprice de la part du Broker et que tu dois pouvoir l’utiliser.Début Bougie 3– Un nouveau Stop Loss se met en place chez le BrokerFin Bougie 3– Un nouveau Stop Loss est en place depuis le Début de la bougie 3– Le code s’exécute– On regarde si les conditions de sortie sont réunies.Qu’est ce que tu en penses ?08/04/2020 at 10:09 AM #140823Fin de Bougie 1 :– L’ordre est envoyé, il ne faut pas renvoyer un ordre au broker à la fin de la bougie suivante : onmarket = true (sinon risque envoi second ordre)Donc pour vous, ONMARKET = TRUE avant même que l’ordre soit exécuté par le broker et donc avant même que la position soit ouverte ? Imaginons que pour une raison quelconque le broker ne parvienne pas à exécuter l’ordre, ONMARKET sera TRUE alors qu’il n’y a aucun ordre sur le marché. Cela me paraît assez risqué, personnellement j’aurais plus tendance à penser que ONMARKET devient TRUE au moment de l’ouverture de la position (sans avoir à attendre la clôture de la bougie) mais ce n’est qu’une supposition.Fin de Bougie 1 :– L’ordre est envoyé, il ne faut pas renvoyer un ordre au broker à la fin de la bougie suivante : onmarket = true (sinon risque envoi second ordre)Imaginons que ONMARKET soit FALSE pendant la bougie suivante, puis TRUE à sa clôture, pourquoi y aurait-il l’envoi d’un second ordre ? Si à la clôture de la bougie suivante, ONMARKET est actualisé (passe de FALSE à TRUE) avant le système de transmission d’ordre, à mon sens il n’y aurait pas de problème de second ordre.Fin de bougie 2– LE STOP LOSS peut être modifié en fonction de l’open de la bougie 2, proche surement du tradeprice mais je pense que tu as reçu tradeprice de la part du Broker et que tu dois pouvoir l’utiliser.Oui à ce moment là, le TRADEPRICE est accessible et utilisable en tant qu’humain. Mais ce qui est un peu étrange avec le système, c’est que la machine a accès au TRADEPRICE (le bon TRADEPRICE, pas celui avec une mauvaise valeur) dés l’ouverture de la positon et donc bien avant nous. Si je reprends mon tout première exemple :12345IF Condition1 AND Condition2 AND Condition3 AND Condition4 AND NOT ONMARKET THENBUY 2 SHARES AT MARKETSET STOP %LOSS 0.25SET TARGET %PROFIT 1ENDIFCe code fonctionne et la machine place parfaitement le Stop Loss et le Take Profit. Pour pouvoir le faire, elle a forcément accès au prix d’ouverture de la position (une sorte de TRADEPRICE en interne) sans avoir besoin d’attendre la clôture de la bougie. Malheureusement en tant qu’humain ce “TRADEPRICE interne” nous est inaccessible vu que la variable TRADEPRICE n’est actualisé qu’à la clôture de la bougie et non à l’ouverture de la position. Ainsi ce code là :
12345IF Condition1 AND Condition2 AND Condition3 AND Condition4 AND NOT ONMARKET THENBUY 2 SHARES AT MARKETSET STOP LOSS (0.25/100)*TRADEPRICESET TARGET PROFIT (1/100)*TRADEPRICEENDIFNe fonctionnera pas bien (mauvaise valeur du Stop Loss et du Take Profit à cause de la non actualisation du TRADEPRICE), alors qu’en théorie ces deux exemples sont censé faire la même chose (à un arrondi près).
08/04/2020 at 1:28 PM #140863Merci de ton retour.
Tu as bien expliqué, je me range à cet avis, le plus pertinent c’est d’avoir le onmarket = true à la fin de la bougie 2, quand on a confirmation du trade de la part du broker, accompagné du tradeprice et avant l’exécution du code de bougie 2. Plutôt qu’à la fin de l’exécution du code de bougie 1. Mais du coup tu as onmarket = true et le tradeprice disponible en début de code en fin de bougie 2 donc tu n’as pas de moment où tu as tradeprice indisponible et onmarket = true en même temps comme tu le déplorais au final.
Sur l’histoire du tradeprice interne. Sur le code suivant :
12345IF Condition1 AND Condition2 AND Condition3 AND Condition4 AND NOT ONMARKET THENBUY 2 SHARES AT MARKETSET STOP %LOSS 0.25SET TARGET %PROFIT 1ENDIFtu envois au broker un STOP LOSS et un TARGET PROFIT avec un pourcentage. Pour moi c’est le Broker qui place le STOP LOSS avec le prix d’achat qu’il connaît et évalue avec le STOP LOSS en pourcentage, pas pro real time qui calcule les valeurs de cours correspondant aux STOP LOSS et TAKE PROFIT en pourcentage et les enverrai au broket car effectivement Prorealtime ne connaît pas le tradeprice en fin de Bougie 1.
Tu peux aussi la calculer en points mais à ce moment là tu prends close de la bougie 1 et dès la fin de la bougie tu as une valeur de STOP LOSS que tu peut tracer sur ta courbe de prix avec graphonprice.
Sur le Code :
12345IF Condition1 AND Condition2 AND Condition3 AND Condition4 AND NOT ONMARKET THENBUY 2 SHARES AT MARKETSET STOP LOSS (0.25/100)*TRADEPRICESET TARGET PROFIT (1/100)*TRADEPRICEENDIFIl ne peut donc marcher correctement qu’avec onmarket = true à partir de la fin de la bougie 2 quand Prorealtime reçoit du Broker le Tradeprice Avant On market = 1, tradeprice = 0 si c’est le premier ordre ou alors la valeur de clôture de trade précédent.
Est ce que le code suivant n’actualiserai pas ton stop loss chez le Broker à partir de la bougie 3 pour avoir un stop loss avec le tradeprice réel ? J’ai jamais essayé
12345678910IF Condition1 AND Condition2 AND Condition3 AND Condition4 AND NOT ONMARKET THEN // fin bougie 1BUY 2 SHARES AT MARKETSET STOP %LOSS (0.25/100)SET TARGET %PROFIT (1/100)ENDIFIF ONMARKET THEN // fin bougie 2SET STOP LOSS (0.25/100)*TRADEPRICESET TARGET PROFIT (1/100)*TRADEPRICEENDIFAprès si tu veux avoir le même STOP LOSS en réel et en BACKTEST, oui c’est un STOP LOSS réel en fonction de l’open qu’il te faut puisque qu’apparemment tradeprice = open en backtest. Quelque chose comme cela peut-être :
123456789101112IF Condition1 AND Condition2 AND Condition3 AND Condition4 AND NOT ONMARKET THENBUY 2 SHARES AT MARKETSET STOP %LOSS (0.25/100)SET TARGET %PROFIT (1/100)UPDATEREQUIRED = 1ENDIFIF ONMARKET and UPDATEREQUIRED = 1 THENSET STOP LOSS (0.25/100)*openSET TARGET PROFIT (1/100)*openUPDATEREQUIRED = 0ENDIFQu’est tu en penses ? je suis pas spécialiste, je suis nouveau la dedans.
08/04/2020 at 10:20 PM #140899Effectivement, comme vous l’avez dit, les instructions comme “SET STOP %LOSS 0.25″ sont surement calculées chez le broker qui lui possède un TRADEPRICE utilisable directement, contrairement aux instructions comme “SET STOP LOSS (0.25/100)*TRADEPRICE” qui elles sont calculées par ProRealTime qui lui ne possède pas la bonne valeur du TRADEPRICE avant la clôture de la bougie. Merci, cela semble être une explication cohérente et ça expliquerait la différence de comportement entre ces instructions.
Est ce que le code suivant n’actualiserai pas ton stop loss chez le Broker à partir de la bougie 3 pour avoir un stop loss avec le tradeprice réel ? J’ai jamais essayé
Je ne comprends pas trop ce que vous voulez dire par “tradeprice réel”.
En regardant le code, je remarque une petite erreur au niveau des “SET” au lieu (0.25/100) et (1/100), il faudrait mettre 0.25 et 1 :
12345678910IF Condition1 AND Condition2 AND Condition3 AND Condition4 AND NOT ONMARKET THEN // fin bougie 1BUY 2 SHARES AT MARKETSET STOP %LOSS 0.25SET TARGET %PROFIT 1ENDIFIF ONMARKET THEN // fin bougie 2SET STOP LOSS (0.25/100)*TRADEPRICESET TARGET PROFIT (1/100)*TRADEPRICEENDIFSinon à mes yeux, il faudrait enlever le deuxième “IF”, le premier fait déjà le boulot et calcul les bonnes valeurs de Stop Loss et de Take Profit (comme ce sont des ordres de protections, il vont rester jusqu’à la fin du trade). Le deuxième “IF” en plus de refaire le même boulot que le premier (à un arrondi près), va venir saboter (que sur la bougie 2) ce boulot. Comme sur la bougie 2, ONMARKET sera TRUE, le TRADEPRICE récupéré pour calculer le Stop Loss et le Take Profit n’aura pas la bonne valeur. Ainsi, sur la bougie 2, le deuxième “IF” va remplacer les bonnes valeurs de Stop Loss et Take Profit calculé par le premier “IF” par des valeurs erronées.
De la même manière avec ce code là :
123456789101112IF Condition1 AND Condition2 AND Condition3 AND Condition4 AND NOT ONMARKET THENBUY 2 SHARES AT MARKETSET STOP %LOSS 0.25SET TARGET %PROFIT 1UPDATEREQUIRED = 1ENDIFIF ONMARKET and UPDATEREQUIRED = 1 THENSET STOP LOSS (0.25/100)*openSET TARGET PROFIT (1/100)*openUPDATEREQUIRED = 0ENDIFJe pense qu’il y aura également quelques problèmes pour les mêmes raisons évoquées plus haut.
Mais attention, tous ce que je viens de dire n’est pas sûr à 100%, je n’ai fait que lire le code, je n’ai rien testé, peut être que je me trompe complétement. Je base mon raisonnement sur le code que j’avais mis dans mon premiers message :
12345678IF Condition1 AND Condition2 AND Condition3 AND Condition4 AND NOT ONMARKET THENBUY 2 SHARES AT MARKETENDIFIF LONGONMARKET THENSET STOP LOSS (((0.25/100)*OPEN[BARINDEX-TRADEINDEX])+(TRADEPRICE-OPEN[BARINDEX-TRADEINDEX]))SET TARGET PROFIT (((1/100)*OPEN[BARINDEX-TRADEINDEX])-(TRADEPRICE-OPEN[BARINDEX-TRADEINDEX]))ENDIFIci dès l’ouverture de la position, le programme entre dans le deuxième “IF” et place le Stop Loss et le Take Profit (avant le clôture de la bougie 2). Ce code est similaire au votre, donc je suppose que le comportement est le même.
Comme vous, j’avais moi même essayé des chose comme “UPDATEREQUIRED” (avec un nom différent bien sûr), qui vaut 1 puis ensuite 0 comme vous l’avez fait, ça n’avait pas bien fonctionné dans mes souvenirs. La chose qui a réglé mes problèmes c’est de remplacé les “SET STOP LOSS …” par des “SELL AT … STOP”. Par exemple dans mon algorithme actuel j’ai quelque chose comme ça :
12345678910IF Condition1 AND Condition2 AND Condition3 AND Condition4 AND NOT ONMARKET THENBUY 2 SHARES AT MARKETSELL AT CLOSE-((0.25/100)*CLOSE) STOP //CLOSE de la bougie 1SELL AT CLOSE+((1/100)*CLOSE) LIMITENDIFIF LONGONMARKET THENSELL AT OPEN[BARINDEX-TRADEINDEX]-((0.25/100)*OPEN[BARINDEX-TRADEINDEX]) STOP //OPEN de la bougie 2SELL AT OPEN[BARINDEX-TRADEINDEX]+((1/100)*OPEN[BARINDEX-TRADEINDEX]) LIMITENDIFCela fonctionne parfaitement. Attention les “SELL ATT …” ne durent qu’une seule bougie.
08/05/2020 at 7:01 AM #140907Dans le code actuel qui est utilisé actuellement, est ce que les premier SELL STOP/LIMIT pendant not onmarket vont marcher ? Est ce qu’on peut placer un SELL alors qu’on est not onmarket ? Est ce qu’en réel ou démo ça place un ordre de vente STOP/Limit qui sera en fonction durant la bougie 2 ? Si oui tant mieux car le risque c’est qu’il n’y ait pas d’ordre de vente pendant la bougie 2 et donc pas de protection.
08/05/2020 at 8:27 AM #140923Dans le code actuel qui est utilisé actuellement, est ce que les premier SELL STOP/LIMIT pendant not onmarket vont marcher ?
Oui ils fonctionnent parfaitement en démo comme en réel.
Est ce qu’on peut placer un SELL alors qu’on est not onmarket ?
Je ne sais pas. J’ai jamais essayé.
Est ce qu’en réel ou démo ça place un ordre de vente STOP/Limit qui sera en fonction durant la bougie 2 ?
Oui, j’ai vérifié en démo, je suis allez voir les trades qui ne durent qu’une bougie (la bougie 2), ils ont bien un Stop Loss et un Take Profit et ils sont parfaitement calculés (avec le CLOSE de la bougie 1). J’ai également vérifié en réel la semaine dernière, le Stop Loss et le Take Profit sont bien en fonction durant la bougie 2.
Comme vous, j’avais peur en utilisant “SELL ATT …” qu’il n’y ai pas de Stop Loss, ni de Take Profit sur la bougie 2, mais en pratique il est bien là. Il se met en place à la clôture de la bougie 1 j’imagine (donc possiblement avant que l’ordre d’achat soit exécuté, ou au même moment peut être). Une fois que la bougie 2 se clôture, le Stop Loss et le Take Profit sont bien réajustés (avec le OPEN de la bougie 2), je l’ai également vérifié en démo et je l’ai vu de mes yeux en réel.
08/05/2020 at 10:17 AM #140928Ca doit prendre le SELL à la bougie 2 parce que il y a un Buy qui est pris juste avant. sinon un SELL tout seul ne serait peut-être pas pris, je crois qu’il n’est associé à qu’à un ordre BUY. Sur d’autres plateforme, SELL aurait pu vouloir dire placer un short au marché. Et si notre Buy n’est pas pris et que le Sell est pris, alors on placerait un ordre dans le sens inverse au sens voulu. Mais ça c’est sur une plateforme sur laquell SELL placerait un Short. Ici un short c’est SELLSHORT
Bon ben c’est pas mal alors. Est ce qu’il nous reste un soucis ? Sinon, on a bien avancé la compréhension de Pro Real Code
08/05/2020 at 12:44 PM #140931 -
AuthorPosts
Find exclusive trading pro-tools on