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

 
Vitaly Muzichenko:

La fonction passe en revue et sélectionne le plus récent en fonction du temps, c'est-à-dire le dernier.

Ensuite, nous avons une sélection, et nous la substituons dans la fonctioniBarShift(sym, tf, oot ,true);

La fonction renvoie le numéro de barre par heure. C'est tout.

Je ne peux malheureusement pas le vérifier, mais lorsque je l'ai utilisé, il a parfaitement fonctionné, ainsi que toutes les fonctions publiées ici par I. Kim.

et si j'ai un ticket attribué lorsque j'ouvre une commande et que la fonction sélectionne un numéro séquentiel, est-ce que c'est correct ?
 
Вадим Мотеюнас:
Ecriture d'une erreur indiquantsi( iOpen[0] != time_open )'iOpen' - identifiant non déclaré

J'ai écrit quelque chose d'un peu faux, un peu dans le sens contraire de la pensée. Remplacez iOpen[0] par Open[0]. Corrigé. Pour le dire simplement. Lorsque j'ouvre un bar, je me souviens de l'heure d'ouverture du bar et aucune commande n'est déjà prise sur ce bar.

 

Il est également écrit dans la description de la fonction que

La sélection des positions à prendre en compte est fixée par des paramètres externes :

  • sy- Nom de l'instrument de marché. Si vous définissez ce paramètre, la fonction ne prendra en compte que les positions de l'instrument spécifié. La valeur par défaut -NULL signifie l'instrument de marché actuel.
  • tf- Période de temps. La valeur par défaut0 signifie l'horizon temporel actuel.
  • op- Opération commerciale, type de poste. Valeurs valides :OP_BUY,OP_SELL ou-1. La valeur par défaut-1 signifie une position quelconque.
  • mn- Identificateur de position, MagicNumber. La valeur par défaut-1 signifie n'importe quel identifiant.
Ces valeurs devraient être déclarées avant la première fonction spéciale, c'est-à-dire que le fait qu'elles soient incluses dans la description de la fonctionNumberOfBarOpenLastPos() elle-mêmen'est pas suffisant ?

 
Вадим Мотеюнас:

Il est également écrit dans la description de la fonction que

La sélection des positions à prendre en compte est fixée par des paramètres externes :

  • sy- Nom de l'instrument de marché. Si vous définissez ce paramètre, la fonction ne prendra en compte que les positions de l'instrument spécifié. La valeur par défaut -NULL signifie l'instrument de marché actuel.
  • tf- Période de temps. La valeur par défaut0 signifie l'horizon temporel actuel.
  • op- Opération commerciale, type de poste. Valeurs valides :OP_BUY,OP_SELL ou-1. La valeur par défaut-1 signifie une position quelconque.
  • mn- Identificateur de position, MagicNumber. La valeur par défaut-1 signifie n'importe quel identifiant.
Par des paramètres externes ? est-il nécessaire de les déclarer avant la première fonction spéciale ? c'est-à-dire qu'ils sont dans la description de la fonctionNumberOfBarOpenLastPos() elle-mêmen'est pas suffisante ?

Assez. Dans les paramètres externes vous pouvez entrer les valeurs dont vous avez besoin : Majik, quelles positions vous recherchez, si vous voulez BUY(0) et SELL(1) - alors écrivez "-1".

 
Konstantin Nikitin:

J'ai écrit quelque chose d'un peu faux, un peu dans le sens contraire de la pensée. Remplacez iOpen[0] par Open[0]. Corrigé. Pour le dire simplement. Lorsque j'ouvre une barre, il se souviendra de l'heure d'ouverture de la barre et aucun ordre ne sera ouvert sur cette barre.

beaucoup d'ordres sont ouverts et il semble que la condition if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0) avant l'ouverture d'un non-ordre soit remplie puisque NumberOfBarOpenLastPos retourne -1

 
Вадим Мотеюнас:

beaucoup d'ordres sont ouverts, et il semble que la condition if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0) soit remplie avant qu'un non-ordre ne soit ouvert, car NumberOfBarOpenLastPos renvoie -1

Si vous recherchez des ordres, vous devez utiliser la fonction dans sa version complète, c'est-à-dire avec la possibilité d'effectuer des recherches par ordres, et pas seulement par positions :

int NumberOfBarOpenLastPos(string sym="",int tf=0,int op=-1,int mn=-1)
  {
   datetime oot=0; // Инициализируем нулём
   int      i,k=OrdersTotal();

   if(sym=="") sym=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==sym)
           {
            if(OrderType()<6) // Ищем и по ордерам
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime(); // Ищем последнее
                    }
                 }
              }
           }
        }
     }
   return(iBarShift(sym, tf, oot, true));
  }
 
Vitaly Muzichenko:

C'est suffisant. Dans les paramètres externes vous pouvez entrer les valeurs requises : Majik, quelles positions sont recherchées, peut-être seulement BUY, si BUY(0) et SELL(1) sont nécessaires - alors nous écrivons "-1".

lorsque je démarre dans le testeur, il n'y a pas d'ordres ouverts, c'est peut-être pour cela que -1 est renvoyé, ce qui explique pourquoi la condition if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0) ne tient pas ?

 
Вадим Мотеюнас:

Lorsque l'on démarre dans le testeur, il n'y a pas d'ordres ouverts, c'est peut-être pour cela que -1 est renvoyé et donc que la condition if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0) n'est pas remplie ?

Je vais le vérifier maintenant.

 
Vitaly Muzichenko:

Si vous recherchez des ordres, vous devez utiliser la fonction dans sa version complète, c'est-à-dire avec la possibilité d'effectuer des recherches par ordres, et pas seulement par positions :

renvoie toujours -1

 
Вадим Мотеюнас:

renvoie toujours -1

Cela fonctionne parfaitement !

De deux positions, il a choisi la dernière, qui se trouve à la barre 11, comme vous pouvez le voir dans la capture d'écran :


Vérifiez le code :

 void OnTick() 
  {
   ...
   Comment( NumberOfBarOpenLastPos("",0,-1,-1) );
   ...
  }

int NumberOfBarOpenLastPos(string sym="",int tf=0,int op=-1,int mn=-1)
  {
   datetime oot=0; // Инициализируем нулём
   int      i,k=OrdersTotal();

   if(sym=="") sym=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==sym)
           {
            if(OrderType()<6) // Ищем и по ордерам
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime(); // Ищем последнее
                    }
                 }
              }
           }
        }
     }
   return(iBarShift(sym, tf, oot, true));
  }