Tout d'abord, je sais, Raptor, que tu as déjà soulevé ce problème avec moi, mais je ne me souviens pas où tu l'as écrit et, plus important encore, je ne comprends pas où je me trompe ?
Pour autant que je sache, je l'ai écrit correctement pour que l'EA attaché à une paire correspondante puisse toujours travailler sur cette paire uniquement. En ce moment, j'ai remarqué que GBPCAD et GBPUSD ne semblent pas s'entendre, ce qui signifie que le stoploss GBPCAD pense que son calcul est effectué par la paire GBPUSD... ainsi, lorsqu'un ordre en attente est déclenché, le stoploss passe des valeurs GBPCAD au câble.....
J'utilise magicnumber==1234 ;
Si vous avez des suggestions ou si vous pensez que je suis un idiot, n'hésitez pas à me le signaler :(
Votre problème est clair, mais il peut être un peu difficile à voir en raison de la façon dont vous utilisez les accolades, l'indentation et les conditions . ... vous faites ça :
for(int b=OrdersTotal()-1; b>=0; b--) { if(!OrderSelect(b,SELECT_BY_POS,MODE_TRADES))continue; if(OrderType()==OP_BUYSTOP) if(OrderMagicNumber()==MagicNumber) if(OrderSymbol()==Symbol()) // if the symbol matches do . . . if(OrderStopLoss()<iMA(NULL,60,MA_Period,0,1,0,0)-ATR) // . . . . this { Stored_BuyPrice = OrderOpenPrice(); // and this DeleteOrder = OrderDelete(OrderTicket()); // and this } if(OpenOrdersThisPair(Symbol())==0 && DeleteOrder==True)// If there are no open orders = place a new order. // this happens even if the symbol didn't match . . . { int NewBuyOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,Stored_BuyPrice,3,BuyStopPrice,btp,NULL,MagicNumber,0,Green); if(NewBuyOrder == -1)Print("New Buy Order Last Error = ",GetLastError()); } }
Je pense que ce que tu voulais dire était ceci...
for(int b=OrdersTotal()-1; b>=0; b--) { if(!OrderSelect(b, SELECT_BY_POS, MODE_TRADES)) continue; if( OrderType() == OP_BUYSTOP && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() ) { if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR) { Stored_BuyPrice = OrderOpenPrice(); DeleteOrder = OrderDelete(OrderTicket()); } if(OpenOrdersThisPair(Symbol()) == 0 && DeleteOrder) // If there are no open orders = place a new order. { int NewBuyOrder = OrderSend(Symbol(), OP_BUYSTOP, LotSize, Stored_BuyPrice, 3, BuyStopPrice, btp, NULL, MagicNumber, 0, Green); if(NewBuyOrder == -1) Print("New Buy Order Last Error = ", GetLastError()); } } }
Merci d'avoir repéré cette partie pour moi :)
Ah ok - une si petite chose que j'ai manqué là. De plus, lorsque la première fonction OrderSend() est appelée, est-ce que je fais quelque chose de mal ? Je demande cela parce que j'essaie de réfléchir logiquement à la question de savoir si oui ou non, à ce moment-là, la paire à laquelle les commandes doivent être envoyées est connue ? C'est peut-être une question stupide, mais je ne fais rien de mal dans cette partie, n'est-ce pas ? La partie de la fonction d'envoi "BuyTicketOrder" ?
Merci d'avoir repéré cette partie pour moi :)
//+----------------------------------------------------------------------------------------------------------------------------------------+ //Moving Average Trailing Stop Function //+----------------------------------------------------------------------------------------------------------------------------------------+ void MA_Trail() { double ATR = iATR(NULL,60,14,1); double MA = iMA(NULL,60,MA_Period,0,1,0,1); double BuyStopPriceMath = MA - ATR; double SellStopPriceMath = MA + ATR; double BuyStopPrice = NormalizeDouble(BuyStopPriceMath,5); double SellStopPrice = NormalizeDouble(SellStopPriceMath,5); //buy order section - This is where the stop will trail based upon a fixed point value stated on the EA. It will trail with price. for(int b=OrdersTotal()-1; b>=0; b--) { if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES)) if(OrderMagicNumber()==MagicNumber) if(OrderSymbol()==Symbol()) if(OrderType()==OP_BUY) { if(OrderStopLoss() > BuyStopPrice)break; if(OrderStopLoss() < BuyStopPrice) bool BuyModify = OrderModify(OrderTicket(),OrderOpenPrice(),BuyStopPrice,OrderTakeProfit(),0,CLR_NONE); if(BuyModify < 0)Print(" Buy Trailing Stop Failed: ", GetLastError()); } } //sell order section - This is where the stop will trail based upon a fixed point value stated on the EA. It will trail with price. for(int s=OrdersTotal()-1; s>=0; s--) { if(OrderSelect(s,SELECT_BY_POS,MODE_TRADES)) if(OrderMagicNumber()==MagicNumber) if(OrderSymbol()==Symbol()) if(OrderType()==OP_SELL) { if(OrderStopLoss() < SellStopPrice)break; if(OrderStopLoss() > SellStopPrice) bool SellModify = OrderModify(OrderTicket(),OrderOpenPrice(),SellStopPrice,OrderTakeProfit(),0,CLR_NONE); if(SellModify < 0)Print(" Sell Trailing Stop Failed: ", GetLastError()); } } }Ok - Je pense que c'est ce qui causait le problème. Je viens de mettre à jour le code sur cette partie et il semble qu'il a maintenant arrêté de clignoter sur chaque tick du câble aux prix GBPCAD... Il est maintenant bloqué sur un prix d'arrêt jusqu'à ce qu'il se mette à jour sur cette fermeture horaire ... donc je vais confirmer.
Cela vous semble-t-il correct ? Aussi, parce que j'ai ces clôtures partielles d'ordre, je suppose que je dois probablement vérifier deux fois que les accolades sont dans la bonne position par rapport à "OrderSymbol()==Symbol())" ?
if(OpenOrdersThisPair(Symbol()) == 0Combien de fois voulez-vous l'appeler ? Pour chaque ordre (votre code) ? Pour chaque ordre en attente sur le graphique actuel (code de RaptorUK) ? Ou UNE SEULE fois, APRÈS avoir enregistré et supprimé l'ordre en attente ?
Ok - Je pense que c'est ce qui a causé le problème. J'ai juste mis à jour le code sur cette partie et il semble qu'il a maintenant arrêté de clignoter sur chaque tick du câble aux prix GBPCAD... Il est maintenant bloqué sur un prix d'arrêt jusqu'à ce qu'il se mette à jour sur cette fermeture horaire ... donc je vais confirmer.
Cela vous semble-t-il correct ? Aussi, parce que j'ai ces clôtures partielles d'ordre, je suppose que je dois probablement vérifier deux fois que les accolades sont dans la bonne position par rapport à "OrderSymbol()==Symbol())" ?
Cela semble correct, oui, vérifiez toujours vos accolades, et facilitez-vous la vie autant que possible, si cela signifie ajouter des accolades, faites-le, mais essayez d'être cohérent avec les accolades et l'indentation.
Vous n'avez pas besoin de deux boucles, une seule suffit . . .
//+----------------------------------------------------------------------------------------------------------------------------------------+ //Moving Average Trailing Stop Function //+----------------------------------------------------------------------------------------------------------------------------------------+ void MA_Trail() { double ATR = iATR(NULL,60,14,1); double MA = iMA(NULL,60,MA_Period,0,1,0,1); double BuyStopPriceMath = MA - ATR; double SellStopPriceMath = MA + ATR; double BuyStopPrice = NormalizeDouble(BuyStopPriceMath,5); double SellStopPrice = NormalizeDouble(SellStopPriceMath,5); for(int b=OrdersTotal()-1; b>=0; b--) { if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES)) if(OrderMagicNumber()==MagicNumber) if(OrderSymbol()==Symbol()) { //buy order section - This is where the stop will trail based // upon a fixed point value stated on the EA. It will trail with price. if(OrderType()==OP_BUY) { if(OrderStopLoss() > BuyStopPrice) break; if(OrderStopLoss() < BuyStopPrice) bool BuyModify = OrderModify(OrderTicket(),OrderOpenPrice(),BuyStopPrice,OrderTakeProfit(),0,CLR_NONE); if(!BuyModify)Print(" Buy Trailing Stop Failed: ", GetLastError()); } // sell order section - This is where the stop will trail based // upon a fixed point value stated on the EA. It will trail with price. if(OrderType()==OP_SELL) { if(OrderStopLoss() < SellStopPrice) break; if(OrderStopLoss() > SellStopPrice) bool SellModify = OrderModify(OrderTicket(),OrderOpenPrice(),SellStopPrice,OrderTakeProfit(),0,CLR_NONE); if(!SellModify)Print(" Sell Trailing Stop Failed: ", GetLastError()); } } }
OrderModify() retourne un bool, vrai ou faux, pas un int... donc SellModify ne sera jamais inférieur à 0... J'ai écrit la même chose hier sur ForexFactory .
Chaque fois que l'ordre a été supprimé - ce que je veux, c'est que l'ordre en attente soit supprimé à CHAQUE clôture de barre d'une heure, puis qu'un nouvel ordre soit ouvert avec les mêmes paramètres, OU, le cas échéant, de nouveaux arrêts, de nouvelles cibles et une taille de lot basée sur "if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR) "
La seule chose que j'ai besoin de stocker pour le NOUVEL ordre en attente (après la suppression), est le prix d'entrée initial sur cette configuration particulière.(Stored_BuyPrice = OrderOpenPrice() ;)
C'est drôle parce que le premier bout de code ci-dessus est également en rapport avec un autre fil que j'étais sur le point de poster. Plutôt que de poster un nouveau sujet avec une question similaire, je vais la poser ici, si cela vous convient ? Regardez le lien ci-dessous - juste une vidéo de quelques minutes expliquant le problème que j'ai et que je trouve difficile à résoudre...
J'ai écrit tellement de code, mais je commence maintenant à me rendre compte que c'est un cas d'inefficacité que je dois réparer...
Vidéo : http://screencast.com/t/4nl8AaH8Sag
Si j'ai rendu les choses vraiment ambiguës en ne fournissant qu'une quantité limitée de code, alors je vais en ajouter d'autres ?
Chaque fois que l'ordre a été supprimé - ce que je veux, c'est que l'ordre en attente soit supprimé à CHAQUE clôture de barre d'une heure, puis qu'un nouvel ordre soit ouvert avec les mêmes paramètres, OU, le cas échéant, de nouveaux arrêts, de nouvelles cibles et une taille de lot basée sur "if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR) "
La seule chose que j'ai besoin de stocker pour le NOUVEL ordre en attente (après la suppression), est le prix d'entrée initial sur cette configuration particulière.(Stored_BuyPrice = OrderOpenPrice() ;)
C'est drôle parce que le premier bout de code ci-dessus est également en rapport avec un autre fil que j'étais sur le point de poster. Plutôt que de poster un nouveau sujet avec une question similaire, je vais la poser ici, si cela vous convient ? Regardez le lien ci-dessous - juste une vidéo de quelques minutes expliquant le problème que j'ai et que je trouve difficile à résoudre...
J'ai écrit tellement de code, mais je commence maintenant à me rendre compte que c'est un cas d'inefficacité que je dois réparer...
Vidéo : http://screencast.com/t/4nl8AaH8Sag
Si j'ai rendu les choses vraiment ambiguës en ne fournissant qu'une quantité limitée de code, alors je vais en ajouter d'autres ?
Le repli sur la EMA 21 ne se produit qu'une seule fois. À partir de là, il cessera de chercher des replis vers la MME 21. Ce qu'il devrait faire cependant, c'est s'assurer que l'ordre PENDING ouvert est précisément à jour avec les lots, les stops et les prises de bénéfices APRÈS la clôture de chaque heure. Cependant, je n'arrive pas à comprendre pourquoi parfois il fonctionne parfaitement, et met à jour l'ordre en attente après chaque clôture H1, et d'autres fois il ne le fait pas ? La raison pour laquelle l'ordre en attente se met à jour est que ""if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR) ".
Si cela n'est pas vrai, alors il ne le fera pas - CEPENDANT, il y a d'innombrables fois où cela est vrai, pourtant il ne supprimera pas l'ordre et en placera un nouveau avec les nouvelles valeurs ?
Je ne suis pas sûr que vous puissiez voir quelque chose dans ce code ci-dessus par rapport à la vidéo ? (Premier code que vous avez corrigé). J'espère que c'est plus clair ?
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Vous acceptez la politique du site Web et les conditions d'utilisation
Pour autant que je sache, je l'ai écrit correctement pour que l'EA attaché à une paire correspondante puisse toujours travailler sur cette paire uniquement. En ce moment, j'ai remarqué que GBPCAD et GBPUSD ne semblent pas s'entendre, ce qui signifie que le stoploss GBPCAD pense que son calcul est effectué par la paire GBPUSD... ainsi, lorsqu'un ordre en attente est déclenché, le stoploss passe des valeurs GBPCAD au câble.....
J'utilise magicnumber==1234 ;
Si vous avez des suggestions ou si vous pensez que je suis un idiot, n'hésitez pas à me le signaler :(