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

 
dimkh87:
Après-midi. Pouvez-vous me dire si MT4 et MT5 ont la possibilité de superposer les graphiques d'un instrument avec différentes échéances, et les indicateurs pour ces échéances ? Par exemple, je veux afficher dans une fenêtre 3 graphiques de la paire EUR/USD avec des TFs : jour, 4h et heure, et également superposer les indicateurs glissants de ces TFs. Est-ce possible ? Je me réjouis de toute aide.

Que faire de la ligne de temps ? Ou dessiner des barres à partir d'échelles de temps plus petites, de quelques barres de large ?

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

Messieurs, veuillez me conseiller, j'ai pris une fonction de Kim qui retourne le numéro de la barre de la dernière position ouverte ou -1.

J'appelle cette fonction et j'écris une condition

J'ai regardé dans Print et je vois que cette fonction renvoie -1, au début je pensais qu'il n'y avait pas d'ordre mais après un moment l'ordre est réapparu et sur la même barre une transaction a été ouverte après le stop.

static datetime time_open = 0;
if(Open[2]>Close[2] && Open[1]>Close[1] && Close[1]<Low[2])
     {
      Comment("цена входа = ",DoubleToStr(Low[2],Digits));
      if( Open[0] != time_open )
         if(NumberOfBarOpenLastPos("",0,-1,-1)!=0)//вызвал здесь
            ticket=OrderSend(Symbol(),OP_SELLLIMIT,0.1,Low[2],2,0,0,magic,0);

      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
        {
         time_open = Open[0];
         TP=NormalizeDouble(OrderOpenPrice()-tp*Point,Digits);
         SL=NormalizeDouble(OrderOpenPrice()+sl*Point,Digits);
         modify=OrderModify(ticket,OrderOpenPrice(),SL,TP,0);
       }
      }
 
Konstantin Nikitin:
erreur indiquantif( iOpen[0] != time_open )'iOpen' - identifiant non déclaré

 
Вадим Мотеюнас:
une erreur est écrite pointant versif( iOpen[0] != time_open )'iOpen' - identifiant non déclaré

Kim fait fonctionner toutes les fonctions ! Vous ne l'avez pas appliqué correctement.

 
Vitaly Muzichenko:

Kim fait fonctionner toutes les fonctions ! Vous ne l'avez pas appliqué correctement.

Personne ne discute, je veux juste comprendre comment je l'ai mal appliqué.

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

Personne ne discute, j'aimerais comprendre comment je l'applique mal.

Imprimez tout - c'est la bonne chose à faire pour identifier les erreurs et les lacunes :

Print( NumberOfBarOpenLastPos("",0,-1,-1) );
 
Vitaly Muzichenko:

Imprimez tout - c'est la meilleure solution pour identifier les erreurs et les déficiences :

Je disais qu'elle renvoie -1, c'est-à-dire que la dernière barre à laquelle l'ordre a été ouvert n'est pas trouvée par la fonction, je crains que je ne passe pas les bons paramètres.

 
int NumberOfBarOpenLastPos(string sym="",int tf=0,int op=-1,int mn=-1)
  {
   datetime oot;
   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()==OP_BUY || OrderType()==OP_SELL)
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime();//что означает это строка?что текущее время раньше цены открытия ордера, это как?
                    }
                 }
              }
           }
        }
     }
 
Вадим Мотеюнас:

La ligne signifie que vous passez en revue toutes les positions, et choisissez/mémorisez la plus récente, et travaillez avec elle. Ceci au cas où les positions ne seraient pas dans l'ordre, mais dispersées.

 

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

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()==OP_BUY || OrderType()==OP_SELL)
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime(); // Ищем последнюю позицию
                    }
                 }
              }
           }
        }
     }
   return(iBarShift(sym, tf, oot, True));
  }

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.

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