Fermeture des demi-lots. - page 13

 
Désolé, mais je ne comprends pas du tout comment cela pourrait m'aider. Ce qui se passe dans la boucle for et le void qui est appelé n'a pas d'importance. Ce qui compte, c'est ce que j'appelle en premier dans le "int start()", sûrement ?

Comme je l'ai collé ci-dessus, si je passe la moitié de la commande, peu importe ce qu'est le OrderTicket(), TOUT ouvert "OP_BUY" sera appelé encore et encore ?

J'ai besoin d'un moyen d'écrire le code de sorte que dans le "in start()" et ce code ci-dessus, il ne continuera pas à appeler le "OP_BUY" à chaque fois APRÈS avoir déjà fermé une moitié ?
 
DomGilberto:
Désolé, mais je ne comprends pas du tout en quoi cela peut m'aider. Ce qui se passe dans la boucle for et le vide qui est appelé n'a pas d'importance. Ce qui compte, c'est ce que j'appelle d'abord dans le "int start()", sûrement ?

Comme je l'ai collé ci-dessus, si je passe la moitié de la commande, peu importe ce qu'est le OrderTicket(), TOUT ouvert "OP_BUY" sera appelé encore et encore ?

J'ai besoin d'un moyen d'écrire le code de sorte que dans le "in start()" et ce code ci-dessus, il ne continuera pas à appeler le "OP_BUY" à chaque fois APRÈS avoir déjà fermé une moitié ?

Le void qui est appelé est juste une fonction qui est appelée à partir de start() ... c'est exactement la même chose que si le code était directement dans start().

pseudo code :

recherche des OP_BUYs

si trouvé - le TP est-il à BE ?

si le TP n'est pas au BE et Bid >= premier objectif déplacer le TP au BE et fermer la moitié de l'ordre

si le TP est au BE, ne rien faire

 

OUI ! !! Merci RaptorUK !

Désolé, je ne suis pas aussi stupide que ce que je fais paraître vous savez ;) - C'est juste que parfois les choses doivent être légèrement réitérées pour moi quand je suis nouveau dans quelque chose...

Je me suis rendu compte que tout le monde m'a dit cela il y a des pages - je m'excuse de ne pas l'avoir saisi ou compris !


DROIT ! Nous avons finalement réussi à fermer la moitié, à atteindre le seuil de rentabilité et à arrêter la fermeture continue des moitiés au même prix :D ! Donc c'est à peu près parfait !!

Tout ce que je vais faire maintenant, c'est de copier et coller ceci pour mes autres sorties et changer quelques règles et hay presto ! Bobs your uncle = c'est réglé :)

Je vais tout poster ici pour que les autres puissent l'utiliser s'ils le souhaitent - Après tout, beaucoup de patience de la part des autres m'a permis non seulement de le coder, mais aussi de le comprendre :)

 
C'est bizarre - parfois, lorsque je fais un backtest, le half close @ 1:1 ne fonctionne pas, mais ensuite, lorsque je fais un backtest plus court, il fonctionne ? Bizarre... est-ce parce que le testeur de stratégie est merdique, ou est-ce que j'ai un défaut dans le code ?
 
Oh, et que suggérerait-on de faire si le prix n'atteint pas le premier objectif de 1:1 MAIS que le stoploss est plus grand que l'entrée.... ? Comment pourrais-je créer une règle autour de cela alors....
 
DomGilberto:
Oh et que suggérerait-on de faire si le prix n'atteint pas le premier objectif de 1:1 MAIS que le stoploss est PLUS GRAND que l'entrée.... ? Comment pourrais-je créer une règle autour de cela alors....


Quand modifiez-vous le seuil de rentabilité ?

si la cible n'est pas atteinte la transaction sera fermée à OrderStopLoss()

 
deVries:


Quand modifiez-vous le seuil de rentabilité ?

Si l'objectif n'est pas atteint, la transaction sera fermée à OrderStopLoss().


Je ferme la moitié en utilisant OrderClose() et si cela retourne vrai, alors j'appelle le vide breakeven pour déplacer le stoploss au break even ? De cette façon, le reste de la position ouverte en lots ne sera pas fermé continuellement, car si la position a été déplacée vers le seuil de rentabilité, j'ai écrit qu'il n'y aura plus de fermeture de cette position jusqu'à ce qu'elle atteigne son prix fixe de prise de profit de 1:2.

Cependant, certains trades iront jusqu'à l'entrée ou au-delà du seuil de rentabilité AVANT que le trade n'ait atteint le premier objectif, ne déclenchant PAS la demi fermeture...

De plus, pour certaines transactions, le fait de sortir à moitié et de se déplacer vers le break even fonctionne parfaitement.... certaines transactions sur lesquelles cela devrait fonctionner, cela ne fait rien ? Est-ce que cela pourrait être dû à de mauvaises données et à un défaut du testeur de stratégie, ou y a-t-il une incohérence dans mon code ?

Oh et je reçois toujours OrderModify 1 - putain d'irritant...

 

Comment identifiez-vous l'ordre après l'avoir clôturé partiellement pour ensuite modifier le SL afin de rentrer dans vos frais ? Vous savez que vous ne pouvez pas utiliser le numéro de ticket original, n'est-ce pas ? Lorsque vous fermez partiellement un ordre, le numéro de ticket original est fermé. La partie restante reçoit un nouveau numéro de ticket. Une façon de l'identifier est de récupérer l'OrderOpenTime() avant la clôture partielle. Après la fermeture partielle d'une commande, la partie restante obtiendra un nouveau numéro de ticket mais l'OrderOpenTime() sera le même qu'avant.

Vous pouvez également utiliser cet OrderOpenTime() pour l'identifier et empêcher qu'il soit fermé partiellement encore et encore.

Vous pouvez également la modifier avant de la fermer partiellement. La partie restante de votre ordre conservera le SL ou TP modifié.

Voici un test. Ouvert à 0.09 fermé partiellement 0.07 laissant 0.02

Remarquez que le numéro de ticket change mais que l'heure d'ouverture reste la même :

23:42:48 2013.08.01 11:28 SDCMegaTrend EURUSD,M1 : ouvert #14 achat 0.09 EURUSD à 1.3240 sl : 1.3037 tp : 1.3737 ok
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1 : close #14 achat 0.07 EURUSD à 1.3240 sl : 1.3037 tp : 1.3737 au prix de 1.3253
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1 : Alerte : Ticket 14 OrderOpenTime avant la clôture de la partie : 1375356521
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1 : Alerte : Ticket 15 OrderOpenTime : 1375356521
23:42:48 2013.08.01 12:45 SDCMegaTrend EURUSD,M1 : close #15 achat 0.02 EURUSD à 1.3240 sl : 1.3037 tp : 1.3737 au prix de 1.3242

 
SDC:

Comment identifiez-vous l'ordre après l'avoir clôturé partiellement pour ensuite modifier le SL afin de rentrer dans vos frais ? Vous savez que vous ne pouvez pas utiliser le numéro de ticket original, n'est-ce pas ? Lorsque vous fermez partiellement un ordre, le numéro de ticket original est fermé. La partie restante reçoit un nouveau numéro de ticket. Une façon de l'identifier est de récupérer l'OrderOpenTime() avant la clôture partielle. Après la fermeture partielle d'une commande, la partie restante obtiendra un nouveau numéro de ticket mais l'OrderOpenTime() sera le même qu'avant.

Vous pouvez également utiliser cet OrderOpenTime() pour l'identifier et empêcher qu'il soit fermé partiellement encore et encore.

Vous pouvez également la modifier avant de la fermer partiellement. La partie restante de votre ordre conservera le SL ou TP modifié.

Voici un test. Ouvert à 0.09 fermé partiellement 0.07 laissant 0.02

Remarquez que le numéro de ticket change mais que l'heure d'ouverture reste la même :

23:42:48 2013.08.01 11:28 SDCMegaTrend EURUSD,M1 : ouvert #14 achat 0.09 EURUSD à 1.3240 sl : 1.3037 tp : 1.3737 ok
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1 : close #14 buy 0.07 EURUSD at 1.3240 sl : 1.3037 tp : 1.3737 at price 1.3253
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1 : Alerte : Ticket 14 OrderOpenTime avant la clôture de la partie : 1375356521
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1 : Alerte : Ticket 15 OrderOpenTime : 1375356521
23:42:48 2013.08.01 12:45 SDCMegaTrend EURUSD,M1 : close #15 acheter 0.02 EURUSD à 1.3240 sl : 1.3037 tp : 1.3737 au prix de 1.3242


Ah - Génial, merci. J'avais complètement oublié OrderOpenTime() - c'est une excellente façon de faire ! Merci pour le conseil - je vais l'expérimenter maintenant.

Suite à mon post précédent, j'ai réussi à le faire fonctionner beaucoup plus doucement maintenant - l'erreur 1 de OrderModify n'apparaît que rarement maintenant. Il semble que le fonctionnement soit plus fluide maintenant.

Le seul problème est que si j'ai une transaction où le stop loss est >= que OrderEntry() - (en supposant que nous parlons d'un long), alors il ne fermera pas la moitié de l'ordre parce que le critère principal pour fermer la moitié, n'a pas été rempli.

Ce code seul ici est ce qui initie la fermeture de la moitié des lots, et l'arrêt de la fermeture continue des moitiés au même prix - (Ce n'est pas la seule chose dans "in start()", je l'ai juste rendu plus facile à voir) :



   

int start()
{

   if(OpenOrdersThisPair(Symbol())>0) //If there is a trade open = do below, which ever is applicable.
      {
      if(OrderType()==OP_BUY && OrderOpenPrice() > OrderStopLoss())
         {
         CloseHalfOrder(); // Closes half at 1:1 - then calls another void to break even on the trade +3.
         }
      
      if(OrderType()==OP_SELL && OrderOpenPrice() < OrderStopLoss())
         {
         CloseHalfOrder1(); // Closes half at 1:1 - then calls another void to break even on the trade +3.
         }   
      } 
}
Comment puis-je incorporer la fonction OrderOpenTime() pour avoir un meilleur contrôle en m'assurant que chaque transaction ferme ses demi-lots à 1:1 SANS en manquer aucune où le stop est >= l'OrderOpen() ?
 

Il y a plusieurs façons de s'assurer que chaque ordre est partiellement fermé, ma façon préférée de le faire est de modifier le TP d'un pip lorsque je le ferme partiellement.

Par exemple, j'ai besoin d'un TP de 100 pips, j'ouvre donc l'ordre avec un TP de 99 pips. Je sais qu'avant que le take profit ne soit atteint, mon ordre sera partiellement fermé à 40 pips. Lorsque cela se produit, je modifie le TP à 100 pips. Par conséquent, tout ordre qui a un profit >= 40 pips et un TP < 100 pips doit être partiellement fermé. Tout ordre avec un TP > 99 pips a déjà été partiellement fermé. Si vous procédez de cette manière, la valeur du SL n'a aucune importance. Assurez-vous simplement de normaliser tous les doubles de prix des ordres avant d'effectuer des calculs sur eux.

Raison: