[ARCHIVE !] Toute question de débutant, pour ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 4. - page 579

 

eh...pourquoi la condition pour vérifier les ordres ouverts ne pourrait-elle pas être écrite comme ceci :

si OrdersTotal() > 0

tout est clair et compréhensible... ce serait...

Cela fait une heure que j'essaie de trouver comment écrire cette condition...

 
lottamer:

eh...pourquoi la condition pour vérifier les ordres ouverts ne pourrait-elle pas être écrite comme ceci :

si OrdersTotal() > 0

tout est clair et compréhensible... ce serait...

Cela fait une heure que j'essaie de trouver comment écrire cette condition...


Pourquoi pas ? Vous pouvez le faire, mais il sera déclenché s'il y a des ordres ouverts ou en attente sur un symbole.
 
rigonich:

Pourquoi pas ? Vous pouvez le faire, mais il sera déclenché s'il y a des ordres ouverts ou en attente sur un instrument.


J'aimerais que cela fonctionne - j'ai un poste et un outil.

Mais ça ne marche pas !

Ça dit qu'il y a une erreur dans le code.

à ce

---------------------------

int start()

{

//----

si OrdersTotal()>0

PlaySound ("alert.wav") ;

//----

retour(0) ;

}

-----------------------------

donne 8 erreurs !!!

 

//---------------------------

int start()

  {

//----

   if (OrdersTotal()>0)

PlaySound ("alert.wav");

//----

  }

 return(0);

 
//-----------------------------

Que pensez-vous de ça ?
 
BeerGod:

Que pensez-vous de ça ?


:)))))))))))))))))))

Magnifique ! Merci.

 
Desead:


Ainsi, deinit est appelé lorsque je supprime un robot d'un graphique - je ne peux pas suivre cette condition d'une autre manière..... il est probablement plus facile d'écrire un script séparé qui supprime tous les robots restants en attente, il n'y a pas d'autre moyen.

Au fait, une autre réflexion sur le sujet :

Je pense avoir résolu le problème de la suppression des commandes en attente. Je détermine la quantité d'ordres "nécessaires" (à retirer) dans une fonction séparée, appelée cette fonction et ensuite while avec la condition (Total>0), puis le cycle de retrait for(int i=Total-1;i<=0l ; i--), calculant à nouveau le"nécessaire" et le compteur de tentatives de retrait avec sortie dewhile lorsque le niveau donné est atteint. De cette façon, tout est supprimé.

Une boucle infinie peut se produire ici si l'un des ordres disparaît après le moment du comptage pour une raison quelconque.


Pourquoi cela ne peut pas être fait ? Par exemple, créez une variable globale au niveau du terminal, attribuez-lui une valeur et vérifiez le démarrage et la modification de la valeur de cette variable via le service -->variables globales avant qu'elle ne soit désactivée.
 
BeerGod:

Et alors ?


Et puis-je demander, qu'est-ce qu'ils essaient de faire avec ça ?

for(int i=0 ; i<OrdersTotal() ; i++)

on dirait qu'ils essaient de compter les positions ouvertes en utilisant la méthode de force brute...

 

Bonne journée ! !! Je n'arrive pas à trouver une bonne solution à cette situation. Voici un cadre de commande typique. Mais si je donne zéro à mon robot dans les paramètres, c'est-à-dire pas de stops et de takeprofits, rien ne fonctionnera.

 if(!srabotka){
           OrderSend (Symbol( ), OP_BUY, lot ,NormalizeDouble(Ask, Digits), 5, NormalizeDouble( Ask- (stop*Point),Digits),   NormalizeDouble( Ask+( 45*Point),Digits), NULL, 450, 0, CLR_NONE);
           int Error=GetLastError();if (Error==0){  
           Sleep(2000); RefreshRates(); 
           OrderSend (Symbol( ), OP_SELL,  lot ,NormalizeDouble(Bid, Digits), 5, NormalizeDouble( Bid+ (stop*Point),Digits), NormalizeDouble( Bid-( 45*Point),Digits), NULL, 450, 0, CLR_NONE); 
           Error=GetLastError();
           if (Error==0){  profit = NormalizeDouble( Ask+( 45*Point),Digits); //tsena=Ask; perenos = false;  
           srabotka= true; }}}
           
           if (Error!=0){ string errorcomment = "Ошибка открытия  ордера OP_BUY"  + " " + Symbol() +  " " + ErrorDescript(Error); 
            Print (errorcomment);}
 

Nous pouvons également définir un if et saisir un ordre avec des zéros pour la deuxième fois, mais c'est un peu lourd.

 
lottamer:


Et puis-je demander ce qu'ils essaient de faire ici ?

for(int i=0 ; i<OrdersTotal() ; i++)

on dirait qu'il essaie de compter les positions ouvertes...


Eh bien, il sélectionne les commandes selon les paramètres spécifiés.

Par exemple, https://www.mql5.com/ru/forum/131859/page3#434221

Fonction NumberOfPositions().

Cette fonction renvoie le nombre de positions ouvertes à ce moment. Une sélection plus précise des positions comptées est spécifiée par des paramètres externes :

  • sy - Nom de l'instrument de marché. Si ce paramètre est défini, la fonction ne prendra en compte que les positions de l'instrument spécifié. La valeur par défaut "" signifie tout instrument de marché. NULL signifie l'instrument 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 - identifiant de la position, MagicNumber. La valeur par défaut de -1 signifie n'importe quel identifiant.
  • //+----------------------------------------------------------------------------+
    //|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
    //+----------------------------------------------------------------------------+
    //|  Версия   : 19.02.2008                                                     |
    //|  Описание : Возвращает количество позиций.                                 |
    //+----------------------------------------------------------------------------+
    //|  Параметры:                                                                |
    //|    sy - наименование инструмента   (""   - любой символ,                   |
    //|                                     NULL - текущий символ)                 |
    //|    op - операция                   (-1   - любая позиция)                  |
    //|    mn - MagicNumber                (-1   - любой магик)                    |
    //+----------------------------------------------------------------------------+
    int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
      int i, k=OrdersTotal(), kp=0;
    
      if (sy=="0") sy=Symbol();
      for (i=0; i<k; i++) {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
          if (OrderSymbol()==sy || sy=="") {
            if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
              if (op<0 || OrderType()==op) {
                if (mn<0 || OrderMagicNumber()==mn) kp++;
              }
            }
          }
        }
      }
      return(kp);
    }

 
lottamer:


Et puis-je demander ce qu'ils essaient de faire avec ça ?

for(int i=0 ; i<OrdersTotal() ; i++)

on dirait qu'ils essaient de compter les postes ouverts...

...Ne cédez pas à vos sentiments, mais suivez les règles. Dans ce cas, la boucle essaie des paramètres (dans la "liste" des commandes) impliquant une variable entière i, et sa valeur est incrémentée de 1 à chaque itération. On essaie le numéro de la commande. :)))
Raison: