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

 
Vitalie Postolache:
Les cycles doivent être comptés dans l'ordre inverse, deOrdersTotal()-1 à 0.
Lors de la fermeture d'une boucle.
 
Vitalie Postolache:
Les boucles doivent compter à rebours, deOrdersTotal()-1 à 0.
Ce sont les fonctions de Kim et elles fonctionnent sans manquer, le problème est autre.
 
Vous avez donc accidentellement allumé plusieurs conseillers sur le même symbole, beaucoup de gens l'ont fait.
 
Neron_76:
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.

 
Renat Akhtyamov:

À 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.

Cette limitation s'applique aux ordres ouverts et en cours. C'est le deuxième cas que je rencontre en un mois et demi ; tous les autres cas sont corrects.
 
Neron_76:
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 :

if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Buy<Low[1] && sar>Close[1]) {
  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);
}
 
Vitaly Muzichenko:

Essayez de cette façon :

if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Buy<Low[1] && sar>Close[1]) {
  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);
}
J'ai remplacé les fonctions, cela fonctionne bien sur 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, ces deux fonctions accomplissent la même tâche, c'est-à-dire répondre à la question de savoir s'il existe des ordres et des positions.
 
Neron_76:
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 je répète la double mise en place de l'ordre, alors la fonction"SetOrder" devrait être reconsidérée, peut-être qu'elle donne deux demandes, après la première demande il n'y a pas de sortie de la fonction, et elle a le temps d'envoyer la deuxième.
 
Vitaly Muzichenko:
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 se passe entre les ticks ? Je ne suis pas très doué pour ça.
 
Neron_76:
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.
Entre les ticks d'un symbole, il peut y avoir des ticks d'un autre symbole. Si l'EA est multi-devises, il voit les ticks d'un autre symbole. De plus, les événements des minuteurs - OnTimer() et OnChartEvent() - peuvent se produire entre les ticks - j'ai presque écrit "événements"... serait un coup monté...