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

 
Fox_RM:
Bonjour !
J'ai rencontré un problème lors de l'ouverture d'un certain nombre de commandes (défini par l'utilisateur).
J'ai écrit un petit code pour résoudre ce problème.
Mais il arrive qu'un nombre arbitraire d'ordres soit ouvert, généralement vers la fin du test.

Voici le code lui-même.

Si vous avez une solution plus simple, je serais heureux de recevoir des commentaires.


C'est probablement mieux.

extern string Kolichestvo_orderov = "Количество единовременно открытых ордеров";
extern int OrederBuy = 1;
extern int OrederSell = 1;


int OrdS,OrdB,ticketBuy,ticketSell,lastticketSell=0,lastticketBuy=0;
//========================================================================================================//
                                //Подсчет количества ордеров BUY & SELL//
//========================================================================================================//
    for(int i = OrdersTotal()-1; i>=0; i--)
       {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
        if(OrderType()==OP_BUY)
            {
            OrdB++
            }
        if(OrderType()==OP_SELL)
            {
            OrdS++
            }
          }
       }   
//========================================================================================================//     
                                  //---- Открытие ордеров SELL ----//
//========================================================================================================//

  if(OrdS<=OrederSell)
    { //----- start 
    if(trendDn==true && SthFast>88.2 && SthSlow<38.2)
       {
      ticketSell=OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0,0,magick,0,Blue); //--- Если ордер открыт параметр OrdS увеличиваю 
       }
     } //-----end
          
//========================================================================================================//  
                                   //----Открытие ордеров BUY ----//
//========================================================================================================//  

   if(OrdB<=OrederBuy)
     { //-----start
     if(trendUp==true && SthFast<11.8 && SthSlow>61.8)
        {
        ticketBuy=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,0,magick,0,Red); //--- Если ордер открыт параметр OrdB увеличиваю
        }
      } //------end
//========================================================================================================//  
 
Lians:
Merci, mais c'est un peu compliqué pour moi, et votre fonction sort 4 messages à la fois, alors que j'ai besoin d'un seul. Il s'avère que pas plus de 64 caractères dans une ligne ?

Non. Vous prenez votre long message et le divisez en autant de parties que vous pouvez lire à l'écran, mais pas plus de quatre. L'essentiel est que chaque partie ne dépasse pas 64 caractères. Si votre message est court, vous pouvez le transmettre à une fonction en une seule partie.

Regardez, j'ai attaché un tuyau dans la remorque pour tester cette fonction. Exécutez-le dans le testeur en mode visuel et mettez l'indicateur Win_Inform sur le graphique de visualisation (il est dans mon message précédent dans le trailer). Vous verrez immédiatement comment cette fonction fonctionne.

Dossiers :
 
r772ra:


C'est probablement mieux.

C'est à peu près le code que j'ai utilisé pour commencer à améliorer le mien. Il y a 3 problèmes dans votre version :

- dès que les ordres OP_BUY et OP_SELL sont ouverts, les paramètres OrdB et OrdS vont automatiquement augmenter à chaque tick, j'ai donc ajouté la condition de recalcul uniquement sur le changement du tick correspondant (vente ou achat) ;

- le recalcul de tous les ordres conduit à l'erreur OrdB et Ord, il suffit de prendre en compte la dernière modification des ordres;

- dans votre version il n'y a pas de diminution des paramètres OrdB et Ord pour l'ouverture ultérieure des ordres if (OrdB<=OrederBuy),if(OrdS<=OrederSell).

Cela semble être le cas.

 
Fox_RM:

C'est à peu près le code que j'ai utilisé pour commencer à améliorer le mien. Il y a 3 problèmes dans votre version :

- dès que les ordres OP_BUY et OP_SELL sont ouverts, les paramètres OrdB et OrdS vont automatiquement augmenter à chaque tick, j'ai donc ajouté la condition de recalcul uniquement sur le changement du tick correspondant (vente ou achat) ;

- le recalcul de tous les ordres conduit à l'erreur OrdB et Ord, il suffit de prendre en compte la dernière modification des ordres;

- dans votre version il n'y a pas de diminution des paramètres OrdB et Ord pour l'ouverture ultérieure des ordres if (OrdB<=OrederBuy),if(OrdS<=OrederSell).

Il semble que ce soit la même chose.

Bien, nous devons remettre à zéro les compteurs des commandes avant la boucle for.

//========================================================================================================//
                                //Подсчет количества ордеров BUY & SELL//
//========================================================================================================//
     OrdS=0;
     OrdB=0;
    
    for(int i = OrdersTotal()-1; i>=0; i--)
       {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
        if(OrderType()==OP_BUY)
            {
            OrdB++
            }
        if(OrderType()==OP_SELL)
            {
            OrdS++
            }
          }
       }   


 

Bonjour, aidez-moi à comprendre la fonction de Kim :

 
double FindNearFractal(string sy="0", int tf=0, int mode=MODE_LOWER) {
 if (sy=="" || sy=="0") sy=Symbol();
  double f=0;
  int d=MarketInfo(sy, MODE_DIGITS), s;
  if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;
 
  for (s=2; s<100; s++) {
    f=iFractals(sy, tf, mode, s);
    if (f!=0) return(NormalizeDouble(f, d));
  }
  Print("FindNearFractal(): Фрактал не найден");
  return(0);
}

Je ne comprends pas la ligne

if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;

Pourquoi il n'y a pas de signes après le premier si, que se passe-t-il quand une expression est écrite comme ceci. Que fait StringFind, et pourquoi la chaîne est recherchée par JPY ? Comment d = 0, et dans quel cas 2 est attribué et dans quel cas 4 ? Je serai très reconnaissant de la réponse, merci d'avance))))

 
r772ra:

C'est vrai, avant la boucle for, vous devez remettre les compteurs de commandes à zéro.

)) Pour une raison quelconque, je n'y ai pas pensé moi-même, j'ai commencé à tâtonner.
 
Fox_RM:
)) Pour une raison quelconque, je n'ai pas pensé à ça moi-même, j'ai commencé à m'essouffler.

Bon débarras.
 
Lisi4ka330: pourquoi il n'y a pas de signes après le premier si, que se passe-t-il si l'expression est écrite comme ceci... Comment d = 0, et dans quel cas 2 est attribué et dans quel cas 4 ? Je serais très reconnaissant d'une réponse, merci d'avance))))

Je pense que cela a plus de sens

if (d==0)
{ 
  if (StringFind(sy, "JPY")<0)
  {
    d=4;
  } 
  else
  {
    d=2;
  }
}

d - précision du devis (chiffres après la virgule)

s'il y a une paire JPY, alors le taux pour les majors est xxx.xx

s'il n'y a pas de JPY dans la paire, alors le taux pour les majors sera de x.xxxx (d'où le nom"quatre chiffres")

 
r772ra:

Oui, avant la boucle for, nous devons remettre les compteurs de commandes à zéro.


Un autre point m'a échappé :

- dans votre version, il n'y a pas de diminution des paramètres OrdB et OrdS pour l'ouverture ultérieure des ordresif (OrdB<=OrederBuy),if (OrdS<=OrederSell).

Dans la nouvelle version, nous avons, par exemple, ouvert 5 ordres, les avons recalculés, mais la condition if ne nous permet pas d'ouvrir d'autres ordres. Dans mon ancienne variante, OrdB-- et OrdS--

ont été utilisés.

 
GaryKa:

Je pense que cela a plus de sens

d - précision du devis (chiffres après la virgule)

s'il y a une paire JPY, alors le taux pour les majors est xxx.xx

s'il n'y a pas de JPY dans la paire, alors les taux pour les majors sont approximativement de x.xxxx (d'où le nom "quatre chiffres")

GaryKa, merci pour la réponse, c'est un peu flou de savoir comment d peut être 0, car la fonction
 d=MarketInfo(sy, MODE_DIGITS)
renvoie le nombre de décimales, donc d sera toujours supérieur à 0 et la condition sera toujours fausse.
Raison: