Vous devez filtrer les métiers. if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true) if (OrderSymbol()==Symbol()) if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001) PointValue = 0.0001; // These else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001) PointValue = 0.01;// four else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001) PointValue = 0.01; // lines else PointValue = MarketInfo(OrderSymbol(), MODE_POINT); // Execute only on Symbol orders. double lots = NormalizeDouble(OrderLots() * Multiplier, 2); // This and below are always executed if (OrderType() == OP_BUY) // Symbol is irrelevant.
Avec des accolades. if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true) if (OrderSymbol()==Symbol()) { // Rest of code executes only on Symbol orders. if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001) PointValue = 0.0001; else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001) PointValue = 0.01; else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001) PointValue = 0.01; else PointValue = MarketInfo(OrderSymbol(), MODE_POINT); double lots = NormalizeDouble(OrderLots() * Multiplier, 2); if (OrderType() == OP_BUY) : }
Sur un broker à 4 chiffres, point = 0.0001 if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001) PointValue = 0.0001; else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001) PointValue = 0.01; else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001) PointValue = 0.01; else PointValue = MarketInfo(OrderSymbol(), MODE_POINT);
Fixé et simplifié. PointValue = MarketInfo(OrderSymbol(), MODE_POINT); if(MarketInfo(OrderSymbol(), MODE_DIGITS) % 2 = 1) PointValue *= 10;
- Puisque tout ce qui se trouve à l'intérieur des accolades est Symbol(), chaque MarketInfo peut être remplacé par des variables prédéfinies
Ne codifiez pas les chiffres en dur. Vérifiez vos codes de retourQue sont les valeurs de retour des fonctions ? Comment les utiliser ? -MQL4 forum and Common Errors in MQL4 Programs and How to Avoid Them - MQL4 Articles | result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*0.0001, 0, "Original", magicNumber, 0, Blue); |
1. merci beaucoup pour votre aide. J'ai ajouté un support comme suggéré, mais l'EA n'ouvre toujours une transaction que sur une paire de devises. Il n'ouvrira pas de transaction sur aucun des autres graphiques même si les conditions d'achat ont été remplies. Je suis bloqué sur ce point depuis des semaines, pourriez-vous s'il vous plaît jeter un autre coup d'œil.
2) EDIT : Plus nécessaire
3) Mon code ressemble maintenant à ceci
int start() { { if (OrdersTotal() == 0) if(Close[1]>Close[2]) result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue); Print("Error setting Original order: ",GetLastError()); } for(int i=OrdersTotal()-1; i>=0; i--) { //calculate new lotsize of hedge based on lotsize of current open trade*Multiplier double lots = NormalizeDouble(OrderLots() * Multiplier, 2); if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true) if (OrderSymbol()==Symbol()) { if (OrderType() == OP_BUY) { if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits)) { if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits)) { if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits), OrderTakeProfit(), Blue)) Print("Error setting Buy trailing stop: ",GetLastError()); } } else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits)) if(OrdersTotal() == 1) result=OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Bid + Stoploss*Point*10, 0, "Hedge", 0, 0, Blue); Print("Error setting Sell Hedge: ", GetLastError()); }
if (OrdersTotal() == 0) if(Close[1]>Close[2]) result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*PointValue, 0, "Original", magicNumber, 0, Blue); Print("Error setting Original order: ",GetLastError());Si un ordre est ouvert sur une paire, il n'en ouvrira pas d'autre jusqu'à ce que OrdersTotal()==0 à nouveau.
Si un ordre est ouvert sur une paire, il n'en ouvrira pas d'autre jusqu'à ce que OrdersTotal()==0.
Je vous remercie pour votre aide. J'ai besoin de limiter le premier ordre original à une seule transaction. Je ne veux pas que l'EA continue à ouvrir des ordres lorsque la condition d'achat est remplie. J'ai donc ajouté l'Orderstotal pour limiter cela. Ce code, cependant, semble interférer avec le code suivant
else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits)) if(OrdersTotal() == 1) //<---------- result=OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Bid + Stoploss*Point*10, 0, "Hedge", 0, 0, Blue); Print("Error setting Sell Hedge: ", GetLastError());
Ici, je veux que l'EA n'ouvre qu'une seule couverture par transaction ouverte, donc OrderTotal ==1.
Quelle est donc la meilleure façon de limiter le nombre de transactions, c'est-à-dire une transaction initiale et une transaction de couverture ? Merci.
Trader3000: Quel est donc le meilleur moyen de limiter le nombre de transactions, c'est-à-dire une transaction originale et une transaction de couverture ? |
|
Merci beaucoup pour l'aide que vous m'avez apportée. J'ai résolu le problème et l'EA ouvre maintenant une transaction sur tous les graphiques lorsque la condition d'achat est remplie, mais rien ne fonctionne en dessous. L'EA n'appelle pas les fonctions Trailingstop ou Hedge. Quelqu'un pourrait-il jeter un coup d'œil et me dire ce que j'ai fait de mal, car je n'arrive pas à comprendre.
int start() { double Lots = NormalizeDouble(AccountEquity()*Percentage*Lotsize/100, 2); double lots = NormalizeDouble(OrderLots() * Multiplier, 2); total=0; for(i = OrdersTotal()-1; i >= 0 ; i--) if ( OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol()) { total++; } { if(total==0 ) if(Close[1]>Close[2]) { result=OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue); Print("Error setting Original order: ",GetLastError()); } if (OrderType() == OP_BUY) { if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits)) { if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits)) { if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits), OrderTakeProfit(), Blue)) Print("Error setting Buy trailing stop: ",GetLastError()); } } else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits)) if(total == 1) result=OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Bid + Stoploss*Point*10, 0, "Hedge", magicNumber, 0, Blue); Print("Error setting Sell Hedge: ", GetLastError()); }
double Lots = NormalizeDouble(AccountEquity()*Percentage*Lotsize/100, 2); double lots = NormalizeDouble(OrderLots() * Multiplier, 2);
Je ne sais pas exactement ce que vous faites, mais je vous suggère d'éviter de nommer 2 variables dont la seule différence est une majuscule. Il est facile de confondre les 2, surtout lorsque d'autres personnes qui lisent votre code peuvent très bien avoir adopté la convention selon laquelle les variables qui commencent par une lettre majuscule sont Globalscope.
Aucune commande n'a été sélectionnée, donc OrderLots() peut être n'importe quoi.
if (OrderType() == OP_BUY)
Ceci utiliserait les valeurs de la dernière commande sélectionnée dans la boucle précédente, il se peut que ce ne soit pas le nombre magique ou le symbole correct.
Merci pour votre réponse. Ce que j'essaie de faire, c'est que l'EA ouvre la première transaction originale dont la taille de lot est un pourcentage de mon capital. Si la transaction est défavorable, le hedge est déclenché au moment opportun.
L'EA doit ouvrir une couverture dans la direction opposée, mais ici la taille de lot doit être 3 fois la taille de lot d'origine (OrderLots).
J'ai maintenant placé les Lots directement dans la fonction OrderSend, mais ni le trailingstop ni les {} n'ont été utilisés.
le hedge est déclenché au moment opportun. Les deux fonctionnaient parfaitement avant que je n'ajoute ceci
total=0; for(i = OrdersTotal()-1; i >= 0 ; i--) if ( OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol()) { total++; }
int start() { double Lots = NormalizeDouble(AccountEquity()*Percentage*Lotsize/100, 2); total=0; for(i = OrdersTotal()-1; i >= 0 ; i--) if ( OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol()) { total++; } { if(total==0 ) if(Close[1]>Close[2]) result=OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue); Print("Error setting Original order: ",GetLastError()); } { if (OrderType() == OP_BUY) { if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits)) { if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits)) { if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits), OrderTakeProfit(), Blue)) Print("Error setting Buy trailing stop: ",GetLastError()); } } else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits)) if(total == 1) result=OrderSend(Symbol(), OP_SELL, NormalizeDouble(OrderLots() * Multiplier, 2), Bid, 3, Bid + Stoploss*Point*10, 0, "Hedge", magicNumber, 0, Blue); Print("Error setting Sell Hedge: ", GetLastError()); }
Je crois que mes accolades {} ne sont pas au bon endroit.
Merci beaucoup pour toute l'aide que vous m'avez apportée jusqu'à présent. Je progresse. Tout semble maintenant fonctionner comme il se doit, sauf que l'EA ne tient pas compte de la condition d'ouverture d'un hedge trade. Il ouvre parfois (mais pas toujours) une opération de couverture même si les conditions ne sont pas remplies. De même, le TrailingStop ne se déclenche pas toujours. Je pense qu'il me manque encore des accolades {} quelque part. Mon code ressemble maintenant à ceci. Quelqu'un peut-il y jeter un coup d'œil pour moi ? Merci.
int start() { total=0; for(i = OrdersTotal()-1; i >= 0 ; i--) if ( OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol()) { total++; } { if(total==0 ) if(Close[1]>Close[2]) { result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue); Print("Error setting Original order: ",GetLastError()); } if (OrderType() == OP_BUY) { if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits)) { if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits)) { if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits), OrderTakeProfit(), Blue)) Print("Error setting Buy trailing stop: ",GetLastError()); } } else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits)) //<------- THIS IS BEING IGNORED SOMETIMES (I THINK) if(total == 1) { result=OrderSend(Symbol(), OP_SELL, NormalizeDouble(OrderLots() * Multiplier, 2), Bid, 3, Bid + Stoploss*Point*10, 0, "Hedge", magicNumber, 0, Blue); Print("Error setting Sell Hedge: ", GetLastError()); } } // else if (OrderType() == OP_SELL) // ...
GumRai:
This would use the values from the last order selected in the previous loop, it may not be the correct magic number or symbol.
- 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
Bonjour à tous. J'ai essayé tous les conseils que j'ai pu trouver sur ce forum, mais aucun ne semble fonctionner. Quelqu'un peut-il m'aider ? Je pense que le problème vient de ma fonction OrderTotal. Je négocie 10 paires de devises, c'est-à-dire que j'ai ouvert l'EA sur 10 graphiques. Il s'agit d'une simple stratégie de couverture. Je veux que l'EA ouvre une transaction (longue ou courte) en fonction des signaux. Si le trade va dans mon sens, Trailingstop ou Take profit. Si, cependant, le trade va dans le sens contraire, je veux qu'il ouvre un trade dans la direction opposée. Le code que j'utilise semble fonctionner mais parfois il se bloque, c'est-à-dire qu'il n'ouvre plus aucun trade. De plus, quand il y a un ou deux trades ouverts sur une paire, il ne semble pas vouloir ouvrir de trades sur d'autres paires.
Voici mon code