Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 15

Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
Les cycles doivent être comptés dans l'ordre inverse, deOrdersTotal()-1 à 0.
Les boucles doivent compter à rebours, deOrdersTotal()-1 à 0.
Bonjour, j'ai installé mon robot forex sur mon compte de démonstration et il fonctionne depuis deux mois. J'ouvre le terminal aujourd'hui et j'ai deux ordres ouverts par un signal, bien que je n'aie placé qu'un seul ordre auparavant. J'ai une restriction sur le nombre de commandes. Quelle peut en être la raison ?
À en juger par le code, il semble que vous ayez un ordre en attente plutôt qu'un ordre au marché.
La restriction du nombre d'ordres ouverts ne s'applique qu'aux ordres au marché.
C'est pourquoi il n'y a pas d'erreur et donc pas de problème.
À en juger par le code, il semble que vous ayez un ordre en attente plutôt qu'un ordre au marché.
La limite du nombre d'ordres ouverts ne s'applique qu'aux ordres au marché.
Il n'y a donc pas d'erreur et donc pas de problème.
La restriction s'applique aux ordres ouverts et en attente. C'est la deuxième fois en un mois et demi, tous les autres cas sont comme ils devraient être.
Essayez de cette façon :
SetOrder(NULL,OP_BUYSTOP,Lts,sar,sar-SL*Point(),sar+TP*Point(),Magik_number);
return(0);
}
if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Sell>High[1] && sar<Close[1]) {
SetOrder(NULL,OP_SELLSTOP,Lts,sar,sar+SL*Point(),sar-TP*Point(),Magik_number);
return(0);
}
//===============================================================================================
//------------------------------- Возвращает количество позиций --------------------------------+
//===============================================================================================
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
int kp=0;
if(sy=="") sy=Symbol();
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if(OrderType()==OP_BUY || OrderType()==OP_SELL) {
if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
return(kp);
}
//===============================================================================================
//------------------------------- Возвращает количество ордеров --------------------------------+
//===============================================================================================
int NumberOfOrders(string sy="", int op=-1, int mn=-1) {
int kp=0;
if(sy=="") sy=Symbol();
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if(OrderType()>1 && OrderType()<6) {
if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
return(kp);
}
Essayez de cette façon :
SetOrder(NULL,OP_BUYSTOP,Lts,sar,sar-SL*Point(),sar+TP*Point(),Magik_number);
return(0);
}
if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Sell>High[1] && sar<Close[1]) {
SetOrder(NULL,OP_SELLSTOP,Lts,sar,sar+SL*Point(),sar-TP*Point(),Magik_number);
return(0);
}
//===============================================================================================
//------------------------------- Возвращает количество позиций --------------------------------+
//===============================================================================================
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
int kp=0;
if(sy=="") sy=Symbol();
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if(OrderType()==OP_BUY || OrderType()==OP_SELL) {
if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
return(kp);
}
//===============================================================================================
//------------------------------- Возвращает количество ордеров --------------------------------+
//===============================================================================================
int NumberOfOrders(string sy="", int op=-1, int mn=-1) {
int kp=0;
if(sy=="") sy=Symbol();
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if(OrderType()>1 && OrderType()<6) {
if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
return(kp);
}
Les fonctions ont été remplacées, ça se passe bien dans le test. Voyons comment cela se passe dans le trading sur la démo. Mais pour une raison quelconque, il me semble que dans mon cas, les deux fonctions effectuent la même tâche, c'est-à-dire qu'elles répondent à la question de savoir s'il existe des ordres et des positions.
Si la double mise en place de l'ordre se reproduit, alors la fonction"SetOrder" doit être revue, peut-être donne-t-elle deux demandes, après la première demande il n'y a pas de sortie de la fonction, et parvient à envoyer la seconde.
Si c'est le cas, pourquoi cela ne se produit-il pas toujours, quelque chose entre les tics ? Je ne suis pas très doué pour ça.