Questions des débutants MQL5 MT5 MetaTrader 5 - page 1501

 
Sergey Voytsekhovsky #:

Bonsoir.

Pouvez-vous m'indiquer où je peux trouver, regarder, lire, etc... ??

J'ai besoin d'une fonction. L'entrée est un tableau d'entiers positifs, exactement plus grand que 3, et la sortie est NOD (Greatest Common Divisor).

J'ai essayé de l'écrire moi-même sur la base de l'algorithme d'Euclide, mais je me suis embrouillé. En général, je manque d'expérience.

Si quelqu'un l'a fait, merci de partager l'information, ne considérez pas que c'est un travail. Je vous remercie !

L'algorithme lui-même n'est pas compliqué. Il est facile à calculer sur une feuille de papier ou une calculatrice, mais je ne peux pas le traduire en langage MQL5 !

 

Sergey Voytsekhovsky #:

... J'ai essayé de m'écrire sur la base de l'algorithme d'Euclide, mais je me suis embrouillé. En général, l'expérience manque ...

... L'algorithme lui-même n'est pas compliqué. Il est simple à calculer sur une feuille de papier ou une calculatrice, mais je ne peux pas le traduire en langage MQL5 !

D'après ma pratique de la communication sur le forum, je peux vous dire que si vous montrez le code que vous avez déjà écrit, on vous répondra plus rapidement et on vous dira où se trouve l'erreur dans le code.

Cordialement, Vladimir.

 
ulong gcd(ulong a, ulong b) {
   ulong c;
   if(a < b) {
      c = a;
      a = b;
      b = c;
   }

   while(b > 0) {
      c = a % b;
      a = b;
      b = c;
   }

   return a;
}

ulong ArrayGcd(ulong &a[]) {
   int n = ArraySize(a);
   if(n == 1) {
      return 0;
   }
   ulong c = gcd(a[0], a[1]);

   for(int i = 2; i < n; i++) {
      c = gcd(a[i], c);
      if(c == 1) {
         break;
      }
   }
   return c;
}

int OnInit() {
   PrintFormat("gcd(35, 140) = %d", gcd(35, 140));
   PrintFormat("gcd(35, 147) = %d", gcd(35, 147));
   PrintFormat("gcd(35, 149) = %d", gcd(35, 149));
   
   ulong a1[] = {35, 140, 28, 7};
   ulong a2[] = {35, 140, 28, 6};
   ulong a3[] = {32, 140, 28, 16};
   PrintFormat("gcd(35, 140, 28, 7) = %d", ArrayGcd(a1));
   PrintFormat("gcd(35, 140, 28, 6) = %d", ArrayGcd(a2));
   PrintFormat("gcd(32, 140, 28, 16) = %d", ArrayGcd(a3));
   return(INIT_SUCCEEDED);
}
 
MrBrooklin #:

D'après ma pratique de la communication sur le forum, je peux vous dire que si vous montrez le code que vous avez déjà écrit en une seule fois, ils vous répondront plus rapidement et vous diront où se trouve l'erreur dans le code.

Cordialement, Vladimir.

D'accord, merci beaucoup pour votre avis. Essayons. Un bref historique pour mieux comprendre. J'envisage d'utiliser la fonction dans un indicateur basé sur Renko, superposé au graphique principal. Il est nécessaire de déterminer la taille actuelle des briques. ZigZag est construit sur la base du graphique Renko, il a, entre autres, deux tableaux - un avec les hauts et un avec les bas. J'ai maintenant besoin de déterminer le GreatestCommonDivider des distances qui les séparent afin d'ajuster automatiquement la taille des briques.

Pour l'instant, j'ai esquissé cette sorte de krakozabra et c'est tout, je suis bloqué, je ne sais pas quoi faire ensuite.

//+------------------------------------------------------------------+
//| Вычисляем значение НОД(НаибольшийОбщийДелитель)=размера кирпичика|
//+------------------------------------------------------------------+
int CalculateBrickSize(int &size_brick, double &Arr_PeakBuff[], double &Arr_BottomBuff[])
  {
   int    size_zigbuf = 0;
   double peak        = 0.0;
   double bottom      = 0.0;

   int zigLag   = 0.0;
   int Arr_ZigLag[];

   if(!ArrayGetAsSeries(Arr_PeakBuff))
      ArraySetAsSeries(Arr_PeakBuff,   true);
   if(!ArrayGetAsSeries(Arr_BottomBuff))
      ArraySetAsSeries(Arr_BottomBuff, true);
   ArrayInitialize(Arr_ZigLag, 0.00);

   size_zigbuf = MathMin(ArraySize(Arr_PeakBuff), ArraySize(Arr_BottomBuff));
   size_zigbuf = MathMin(size_zigbuf, ChartVisibleBars()) - 1;

   if(size_zigbuf > 0)
      ArrayResize(Arr_ZigLag, size_zigbuf);
   for(int i = 0; i < size_zigbuf; i++)
     {
      if(Arr_PeakBuff[i] != EMPTY_VALUE)
         peak = NormalizeDouble(Arr_PeakBuff[i], _Digits);
      if(Arr_BottomBuff[i] != EMPTY_VALUE)
         bottom = NormalizeDouble(Arr_BottomBuff[i], _Digits);
      if(peak == 0 || bottom == 0)
        {
         zigLag = 1;
        }
      else
         zigLag = (int)DoubleToString(MathAbs(peak - bottom)*100000, 0);
      Arr_ZigLag[i] = zigLag;
     }
//---
   int delimoe = 0;
   int delitel = 1;
   int ostatok = 1;
   ArraySort(Arr_ZigLag);

   for(int i = ArraySize(Arr_ZigLag)-1; i > 0; i--)
     {
      if(Arr_ZigLag[i] != Arr_ZigLag[i-1])
        {
         if(delimoe == 0)
            delimoe = MathMax(Arr_ZigLag[i], Arr_ZigLag[i-1]);
         if(delitel == 1)
            delitel = MathMin(Arr_ZigLag[i], Arr_ZigLag[i-1]);
         ostatok = (int)MathMod(delimoe, delitel);
         if(ostatok == 0)
           {
            delimoe = delitel;
            delitel = 1;
            ostatok = 1;
            continue;
           }
         else
            while(ostatok != 0)
              {
               ostatok = (int)MathMod(delimoe, delitel);
               delimoe = delitel;
               delitel = ostatok;
              }
        }
     }
   //Print("delimoe = ", delimoe);
   //Print("delitel = ", delitel);
   //Print("ostatok = ", ostatok);
   return(size_brick);
  }
//+------------------------------------------------------------------+
 
Ce n'est bien sûr qu'une ébauche, ne jugez pas sévèrement. Je pense que je me suis trompé quelque part, c'est un peu brouillon, il faut que je trouve une solution plus simple et plus claire, mais je n'arrive pas à me la mettre dans la tête encore.....
 
Sergey Voytsekhovsky #:
Il ne s'agit bien sûr que d'une ébauche, ne jugez pas sévèrement. Je pense que je me suis trompé quelque part, c'est un peu fouillis, il faut que je trouve une solution plus simple et plus claire, mais je n'y pense pas encore....
Sergey, formez un tableau de nombres pour lesquels vous voulez trouver le NOD et passez-le à la fonction ArrayGcd() de mon post précédent.

Mais je ne suis pas sûr que vous puissiez utiliser le NOD dans ce cas. Il semble que vous vouliez le calculer pour des nombres qui n'ont pas de relations rigides entre eux, en assurant la présence d'un diviseur commun non trivial.
Dans ce cas, avec une forte probabilité, vous obtiendrez toujours NOD = 1.
 
Yuriy Bykov #:
Sergey, formez un tableau de nombres pour lesquels vous voulez trouver le NOD et passez-le à la fonction ArrayGcd() de mon post précédent.

Merci, j'ai vu votre message après avoir envoyé mon dernier, j'essaie maintenant de l'adapter.

 
Sergey Voytsekhovsky #:

Merci, j'ai vu votre message après avoir envoyé le dernier, et j'essaie maintenant de l'adapter.

On peut remplacer ulong par int partout dans le code, mais il faut alors s'assurer que tous les nombres du tableau sont positifs.
 
Yuriy Bykov #:
Sergey, formez un tableau de nombres pour lesquels vous voulez trouver le NOD et passez-le à la fonction ArrayGcd() de mon post précédent.

Mais je ne suis pas sûr que vous puissiez utiliser le NOD dans ce cas. Il semble que vous vouliez le calculer pour des nombres qui n'ont pas de relations rigides entre eux, à condition qu'il y ait un diviseur commun non trivial.
Dans ce cas, avec une forte probabilité, vous obtiendrez toujours NOD = 1.

Vous devrez peut-être vérifier, et cela seulement après avoir codé l'algorithme. Merci pour vos commentaires.

 

Bonjour à tous, pouvez-vous me dire s'il est possible d'importer une fonction d'un EA vers un autre ?

Par exemple, il y a un EA qui ouvre des ordres, et il y a un EA qui surveille l'état du compte, où les paramètres drawdown, etc. sont spécifiés,

J'ai besoin que lorsque le drawdown du second EA est atteint, le premier EA n'ouvre pas d'ordres....

Comment faire par exemple ?