Fonctions utiles de KimIV - page 12

 

La fonction IndexByTicket().

Renvoie l'index (numéro ordinal dans la liste générale des ordres fixés ou des positions ouvertes) de l'ordre ou de la position sur le ticket. Si IndexByTicket() ne trouve pas d'ordre ou de position avec le ticket requis, il renvoie -1. Nous pouvons limiter la liste des ordres ou des positions à vérifier à l'aide des paramètres de la fonction :

  • sy - Nom de l'instrument. Si vous spécifiez ce paramètre, la fonction ne vérifiera que les ordres et les positions de l'instrument spécifié. NULL signifie l'instrument actuel, et "" (par défaut) signifie n'importe quel instrument.
  • op - Opération commerciale, type d'ordre ou de position en attente. Valeurs valides : OP_BUY, OP_BUYLIMIT, OP_BUYSTOP, OP_SELL, OP_SELLLIMIT, OP_SELLSTOP ou -1. La valeur par défaut de -1 indique un ordre ou une position quelconque.
  • mn - Identifiant d'un ordre ou d'une position (MagicNumber). La valeur par défaut -1 signifie n'importe quel MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 20.04.2007                                                     |
//|  Описание : Возвращает индекс ордера или позиции по тикету                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    ti - тикет ордера, позиции                                              |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int IndexByTicket(int ti, string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if ((mn<0 || OrderMagicNumber()==mn) && OrderTicket()==ti) return(i);
      }
    }
  }
  return(-1);
}
 

J'ai écrit la fonction IndexByTicket() dans un EA personnalisé. Je me souviens que je ne pouvais pas m'en passer, sinon pourquoi l'aurais-je écrit ? Mais je ne me souviens plus comment il était utilisé là-bas ni pourquoi je l'ai pratiquement écrit :-) Rechercher le code source du conseiller est ennuyeux. Il y en a des centaines.

De toute façon, je ne vois pas l'intérêt de donner des exemples comme ceux que j'ai déjà donnés. Si nous sommes intelligents, nous pouvons trouver où "mettre" les paramètres. Et si quelqu'un a une bonne idée d'utilisation de la fonction IndexByTicket(), postez-la ici. Je vais essayer de le réaliser.


Une courte annonce.

Fonctions SelectByTicket() et SelectByTicketFromHistory() I supprimées. Je ne les utiliserai pas moi-même, donc je ne vois pas l'intérêt de les publier. Ceux qui souhaitent discuter de ce sujet sont toujours les bienvenus. Je vais montrer tous mes délires tels quels.

 

La fonction NumberOfOrders().

Cette fonction renvoie le nombre de commandes et remplace complètement la fonction ExistOrders(). Pour remplacer la fonction ExistOrders() par la fonction NumberOfOrders(), il est nécessaire et suffisant de vérifier la valeur de retour pour qu'elle soit supérieure à zéro. Vous pouvez limiter la liste des ordres à vérifier à l'aide des paramètres de la fonction :

  • sy - Nom de l'instrument. Si ce paramètre est donné, la fonction ne vérifiera que les ordres de l'instrument spécifié. NULL signifie l'instrument actuel, et "" (par défaut) signifie n'importe quel instrument.
  • op - Type d'ordre en attente. Valeurs valides : OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP ou -1. La valeur par défaut de -1 indique un ordre quelconque.
  • mn - Identifiant de l'ordre (MagicNumber). La valeur par défaut -1 signifie n'importe quel MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает количество ордеров.                                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfOrders(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), ko=0, ot;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (ot>1 && ot<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ot==op)) {
          if (mn<0 || OrderMagicNumber()==mn) ko++;
        }
      }
    }
  }
  return(ko);
}
 

Exemples d'utilisation de la fonction NumberOfOrders().

  1. Obtenez le montant total de toutes les commandes
    NumberOfOrders();
  2. Obtenez le nombre d'ordres passés pour le symbole actuel.
    NumberOfOrders(NULL);
  3. Obtenir le nombre d'ordres BuyLimit pour tout symbole
    NumberOfOrders("", OP_BUYLIMIT);
  4. Obtenir le nombre d'ordres SellStop avec le numéro magique 123456 pour EURUSD
    NumberOfOrders("EURUSD", OP_SELLSTOP, 123456);
  5. Obtenez le nombre d'ordres avec un numéro magique 2345 pour le symbole actuel.
    NumberOfOrders(NULL, -1, 2345);

Vous trouverez ci-joint un autre script qui fonctionne avec les exemples ci-dessus.

Dossiers :
 
KimIV:

La fonction NumberOfOrders().

Cette fonction renvoie le nombre de commandes et remplace complètement la fonction ExistOrders(). Pour remplacer la fonction ExistOrders() par la fonction NumberOfOrders(), il est nécessaire et suffisant de vérifier la valeur de retour pour qu'elle soit supérieure à zéro. Vous pouvez limiter la liste des ordres à vérifier à l'aide des paramètres de la fonction :

  • sy - Nom de l'instrument. Si ce paramètre est donné, la fonction ne vérifiera que les ordres de l'instrument spécifié. NULL signifie l'instrument actuel, et "" (par défaut) signifie n'importe quel instrument.
  • op - Type d'ordre en attente. Valeurs valides : OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP ou -1. La valeur par défaut de -1 signifie un ordre quelconque.
  • mn - Identifiant de l'ordre (MagicNumber). La valeur par défaut de -1 signifie n'importe quel MagicNumber.

Je suis un peu confus. Pour une raison quelconque, je vois une contradiction. Juste ici :

"...il est nécessaire et suffisant de vérifier que la valeur de retour est supérieure à zéro."

Si vous cochez "ceci et seulement ceci", alors la fonction sur le nombre de commandes n'a aucun sens !

C'est pourquoi j'ai commencé à m'y intéresser. J'ai inséré cette fonction dans mon conseiller expert. J'ai défini m=1 dans les paramètres et la condition pour ouvrir des positions.

if (NumberOfOrders("", -1, MagicNumber)<m) {//если открытых позиций МЕНЬШЕ m

Mais c'est comme si le conseiller expert ne voyait pas cette limitation ! Et il ouvre des ordres à chaque signal.

Quel peut être le problème ici ?

 
rid писал (а):
Je suis un peu confus. Pour une raison quelconque, je vois une certaine contradiction. Juste ici :
"...il est nécessaire et suffisant de vérifier que la valeur de retour est supérieure à zéro".
Si nous vérifions "ceci et seulement ceci", alors la fonction pour le nombre de commandes n'a pas de sens !

hmm... Vous ne semblez pas prêter attention à la quantité d'informations renvoyées par chacune des fonctions ExistOrders() et NumberOfOrders(). La fonction ExistOrders() ne renvoie que des informations sur l'existence des ordres, et la fonction NumberOfOrders() renvoie des informations sur le nombre d'ordres. L'information sur le nombre d'ordres contient l'information sur l'existence d'ordres. Lorsque nous devons répondre à la question de savoir si une commande existe ou non, l'information sur le nombre de commandes est redondante. C'est pourquoi j'ai dit que si nous voulons remplacer la fonction ExistOrders() par la fonction NumberOfOrders(), nous devons vérifier la valeur renvoyée par la fonction NumberOfOrders() pour nous assurer qu'elle est supérieure à zéro. En effet, il est clair que si cette valeur est égale à zéro, il n'y a pas d'ordres, et que si cette valeur est supérieure à zéro, les ordres sont présents. La fonction ExistOrders() peut être utilisée lorsque nous n'avons pas besoin d'informations sur la quantité de la commande, tandis que la fonction NumberOfOrders() peut être utilisée lorsque nous n'avons pas besoin d'informations sur la quantité de la commande et lorsque nous en avons besoin. En ce sens, la fonction NumberOfOrders() remplace complètement la fonction ExistOrders().

rid:

Voici pourquoi j'ai commencé à m'y intéresser. J'ai inséré cette fonction dans mon conseiller expert. J'ai défini m=1 dans les paramètres et la condition pour ouvrir des positions.

if (NumberOfOrders("", -1, MagicNumber)<m) {//если открытых позиций МЕНЬШЕ m

Mais c'est comme si le conseiller expert ne voyait pas cette contrainte ! Et il ouvre des ordres à chaque signal.

Quel peut être le problème ici ?

Donc... et là vous semblez confondre les positions et les mandats. Pour moi, ce sont des choses différentes. Que sont les positions ? Il s'agit de transactions OP_BUY et OP_SELL, alors que les ordres sont, selon moi, des transactions OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT et OP_SELLSTOP. J'ouvre des positions et je passe des ordres. Et qu'est-ce que vous ouvrez ? La fonction NumberOfOrders() est conçue pour fonctionner avec des commandes.
 

Merci. J'ai tout. Tant sur la première question que sur la seconde.

En d'autres termes, la fonction "étendue" NumberOfOrders() comprend déjà essentiellement la fonction IndexByTicket() .

Oui, en effet. J'ai ouvert OP_BUY et OP_SELL !

Il reste à donner un exemple de votre prochaine fonction qui fonctionne exactement avec les positions. (pas avec les commandes).

Je me souviens que vous l'avez déjà posté quelque part sur ce forum. Je n'arrive pas à le trouver.

 
rid писал (а):
Il reste à donner un exemple de votre prochaine fonction qui fonctionne exactement avec les positions. (pas avec les commandes)

J'en ai fini avec les fonctions pour les commandes. Viennent ensuite les fonctions des postes. Il y en a une trentaine.


rid a écrit (a) :
Je me souviens que quelque part sur le forum vous l'avez déjà posté. Je ne le trouve pas.

recherche

 

Cher Igor, je te demande de m'aider ! J'ai besoin d'ajouter un EA pour qu'il puisse prendre des positions sur plusieurs instruments. Il y a 2 EAs qui fonctionnent, MACD standard et Ema, chacun avec 6 positions, mais une seule position s'ouvre... J'ai lu vos commentaires à ce sujet, mais comme je ne maîtrise pas la langue, je n'arrive pas à comprendre où ajouter quoi... Si vous le voulez bien, aidez-nous... a copié le conseiller Ema... Merci !



//+------------------------------------------------------------------+
//| Parabolic.mq4 |
//| Vitalik |
//| wwwita@mail.ru |
//+------------------------------------------------------------------+
extern double Lots=0.1 ;
extern double Pip=5 ;
extern double MoveBack=3 ;
extern int chk=0 ;
extern double SL=20 ;
//+------------------------------------------------------------------+
//|
//+------------------------------------------------------------------+
int start()
{
double hi=High[1] ;
double lo=Low[1] ;
double EMA, EMA1, EMA2, EMA3 ;
int cnt=0, ticket, total ;
EMA=iMA(0,0,5,0,MODE_EMA,PRICE_MEDIAN,1) ;
EMA1=iMA(0,0,10,0,MODE_EMA,PRICE_MEDIAN,1) ;
EMA2=iMA(0;0;5;0;MODE_EMA;PRICE_MEDIAN;0) ;
EMA3=iMA(0;0;10;0;MODE_EMA;PRICE_MEDIAN;0) ;
total=OrdersTotal() ;
if(total<1)
{
if(AccountFreeMargin()<(1000*Lots))
{
Print("Vous n'avez pas d'argent. Fonds libres = ", AccountFreeMargin()) ;
return(0) ;
}
si((EMA>EMA1) && (EMA2<EMA3)) || ((EMA<EMA1) && (EMA2>EMA3))
{
chk=1 ;
Print("La position est possible !") ;
}
if(chk==1)
{
if(EMA3-EMA2>2*Point && Bid>=(lo+MoveBack*Point))
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,
"Position EMA :",16385,0,Red) ;
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Ordre VENTE ouvert : ",OrderOpenPrice()) ;
chk=0 ;
}
else
{
Print("Error opening SELL order : ",GetLastError()) ;
return(0) ;
}
}
if(EMA2-EMA3>2*Point && Ask<=(hi-MoveBack*Point))
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,
"Position EMA :",16385,0,Green) ;
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Ordre BUY ouvert : ",OrderOpenPrice()) ;
chk=0 ;
}
else
{
Print("Order BUY open error : ",GetLastError()) ;
return(0) ;
}
}
}
return(0) ;
}
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) ;
if(OrderType()<=OP_SELL && // est-ce une position ouverte? OP_BUY ou OP_SELL
OrderSymbol()==Symbol()) // correspondance des outils ?
{
if(OrderType()==OP_BUY) // position longue ouverte
{
// vérifions s'il est déjà temps de fermer ?
if(Bid>=(OrderOpenPrice()+Pip*Point))
{
chk=0 ;
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet) ; // clôture de la position
return(0) ; // exit
}
if(Bid<=(OrderOpenPrice()-SL*Point)))
{
chk=0 ;
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet) ; // clôture de la position
return(0) ; // exit
}
}
else // sinon, il s'agit d'une position courte
{
// vérifier s'il est déjà temps de clôturer ?
if(Ask<=(OrderOpenPrice()-Pip*Point))
{
chk=0 ;
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet) ; // clôture de la position
return(0) ; // exit
}
if(Ask>=(OrderOpenPrice()+SL*Point))
{
chk=0 ;
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet) ; // fermer la position
return(0) ; // sortir
}
}
}
}
return(0) ;
}
//+------------------------------------------------------------------+
 

Igor, je vous ai posé une question dans la "Bibliothèque de fonctions pour travailler avec les fichiers INI", mais vous n'avez pas répondu :(