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

 
Andrey Sokolov:

Pouvez-vous me dire ce qu'il faut entendre dans l'entrée

int i,limit=prev_calculated==0 ? rates_total-1 : rates_total-prev_calculated ;

"==" , " ?" , " : "

?

Документация по MQL5: Основы языка / Операторы / Условный оператор ?:
Документация по MQL5: Основы языка / Операторы / Условный оператор ?:
  • www.mql5.com
В качестве первого операнда – "выражение1" – может быть использовано любое выражение, результатом которого является значение типа bool. Если результат равен , то выполняется третий операнд – "выражениеЗ". Второй и третий операнды, то есть "выражение2" и "выражениеЗ", должны возвращать значения одного типа и не должны иметь тип void...
 
C'est juste horrible ! Si je peux encore retracer la logique dans les Expert Advisors, corriger certaines choses, en ajouter d'autres... Je ne comprends pas du tout le code des indicateurs(
 
prom18:

Merci, Igor. Je ne l'ai pas exprimé correctement. L'indicateur est calculé et dessiné pour un nombre de barres spécifié (50 dans ce cas) et dans une fenêtre séparée. Il n'a pas besoin du prix d'ouverture mais de la première barre du jour pour indiquer la MA. Mais en tout cas, merci.

read SetIndexDrawBegin() - il s'agit d'une restriction pour dessiner le tampon de l'indicateur, jamais utilisée.

ou dans mon exemple, vous pouvez le faire de cette façon :

input int BarCount = 50;
....

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int i,limit;
   static double dayopen=0.0;
   static int lastday=0;
   if(prev_calculated==0)
     {
      limit=rates_total-1;
      dayopen=0.0;
      lastday=0;
     }
   else limit=rates_total-prev_calculated;
   limit = fmin(BarCount,limit);
   for(i=limit; i>=0; i--)
     {
      if(TimeDay(time[i])!=lastday)
        {
         dayopen=open[i];
         lastday= TimeDay(time[i]);
        }
      Label1Buffer[i]=dayopen;
     }
   return(rates_total);
  }

c'est-à-dire limiter le calcul des buffers d'indicateurs au paramètreBarCount

 
Andrey Sokolov:

Pouvez-vous me dire ce qu'il faut entendre dans l'entrée

int i,limit=prev_calculated==0 ? rates_total-1 : rates_total-prev_calculated ;

"==" , " ?" , " : "

?

https://docs.mql4.com/ru/basis/operators/ternary


J'ai réécrit mon exemple, dans la première version il ne fonctionnait pas correctement lors du changement de TFs, vous devez réinitialiser dayopen et lastday, ils sont décrits avec le modificateur static.

Условный оператор ?: - Операторы - Основы языка - Справочник MQL4
Условный оператор ?: - Операторы - Основы языка - Справочник MQL4
  • docs.mql4.com
В качестве первого операнда – "выражение1" – может быть использовано любое выражение, результатом которого является значение типа bool. Если результат равен , то выполняется третий операнд – "выражениеЗ". Второй и третий операнды, то есть "выражение2" и "выражениеЗ", должны возвращать значения одного типа и не должны иметь тип void...
 
Artyom Trishkin:

Retourne également l'index dans le paramètre de la fonction passé par référence.

Retourné :

double GetPatt5barsDN()
{
double low3 = 0 ;
int index = 0 ;
for(int i=1 ; i<20 ; i++)
{
si
((Close[i] > Open[i]) &&
(Close[i+1] > Open[i+1]) &&
(Close[i+2] > Open[i+2]) && //Low[i+2] est nécessaire sur cette bougie
(Close[i+3] < Open[i+3]) &&
(Close[i+4] < Open[i+4])

low3 = Low[i+2] ;
indice = i+2 ;
}

retour(low3) ;
return(index) ;
}


Que dois-je faire ensuite ?

 
Sfinks35:

Retourné :

double GetPatt5barsDN()
{
double low3 = 0 ;
int index = 0 ;
for(int i=1 ; i<20 ; i++)
{
si
((Close[i] > Open[i]) &&
(Close[i+1] > Open[i+1]) &&
(Close[i+2] > Open[i+2]) && //Low[i+2] est nécessaire sur cette bougie
(Close[i+3] < Open[i+3]) &&
(Close[i+4] < Open[i+4])

low3 = Low[i+2] ;
indice = i+2 ;
}

retour(low3) ;
return(index) ;
}


Que dois-je faire ensuite ?

Ce n'est pas une façon de le récupérer.


Comme ça.

int GetPatt5barsDN()
      {
       double low3 = 0;
       int index = 0;
       for(int i=1; i<20; i++)
          {
            if
            ((Close[i] > Open[i]) &&  
            (Close[i+1] > Open[i+1]) &&
            (Close[i+2] > Open[i+2]) && //На этой свече нужен Low[i+2]
            (Close[i+3] < Open[i+3]) &&  
            (Close[i+4] < Open[i+4]))
             
            low3 = Low[i+2];
            index = i+2;
          } 
           
          return(index);
      }


Plus d'informations sur

double min = Low[GetPatt5barsDN()];
 
Sfinks35:

Retourné :

double GetPatt5barsDN()
{
double low3 = 0 ;
int index = 0 ;
for(int i=1 ; i<20 ; i++)
{
si
((Close[i] > Open[i]) &&
(Close[i+1] > Open[i+1]) &&
(Close[i+2] > Open[i+2]) && //Low[i+2] est nécessaire sur cette bougie
(Close[i+3] < Open[i+3]) &&
(Close[i+4] < Open[i+4])

low3 = Low[i+2] ;
indice = i+2 ;
}

retour(low3) ;
return(index) ;
}


Que dois-je faire ensuite ?

Où est le retour de l'indice via un paramètre par référence ?

Et veuillez insérer le code correctement :


 
Existe-t-il une fonction dans MQL4 qui peut détecter si une cotation est à 5 ou 4 décimales, combien de décimales un actif a par exemple EURJPY a 2 décimales, EURUSD a 4 décimales ?
 
Seric29:
Y a-t-il une fonction dans MQL4 qui peut identifier les cotations d'un type de compte, comme 5 ou 4 décimales, quelles sont les façons d'identifier combien de zéros un actif a après la virgule par exemple EURJPY a 2 décimales, EURUSD a 4 décimales ?

https://docs.mql4.com/ru/predefined/digitsvar

Digits - Предопределенные переменные - Справочник MQL4
Digits - Предопределенные переменные - Справочник MQL4
  • docs.mql4.com
Digits - Предопределенные переменные - Справочник MQL4
 
Artyom Trishkin:

Où est le retour de l'indice via un paramètre par référence ?

Et veuillez insérer le code correctement :


Bonjour !
Il me semble que j'ai bien compris maintenant :
double GetPatt5barsDN(int &index)
      {
       double low3 = 0;
       for(int i=1; i<20; i++)
          {
            if
            ((Close[i] > Open[i]) &&  
            (Close[i+1] > Open[i+1]) &&
            (Close[i+2] > Open[i+2]) && //На этой свече нужен Low[i+2]
            (Close[i+3] < Open[i+3]) &&  
            (Close[i+4] < Open[i+4]))
             
            low3 = Low[i+2];
            index = i+2;
          }           
     return(low3);
     }

Mais à la compilation, il génère un avertissement : perte possible de données en raison de la conversion de type en ligne :
index = GetPatt5barsDN(index) ;

double low3 = 0;
   int index = 0;
   low3 = GetPatt5barsDN(index);
   index = GetPatt5barsDN(index);
   Print("low3= ", low3);
   Print("index= ", index);

Il n'y a pas d'erreur dans l'en-tête de la fonction (ou dans la fonction elle-même) pendant la compilation.

Raison: