Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 1501

 
Sergey Voytsekhovsky #:

Guten Abend.

Können Sie mir bitte sagen, wo ich etwas finden, nachschauen, lesen usw. kann?

Ich brauche eine Funktion. Die Eingabe ist ein Array von positiven ganzen Zahlen, genau größer als 3, und die Ausgabe ist NOD (Greatest Common Divisor).

Ich habe versucht, die Funktion auf der Grundlage von Euklids Algorithmus selbst zu schreiben, aber ich bin durcheinander gekommen. Im Allgemeinen fehlt es mir an Erfahrung.

Wenn es jemandem gelungen ist, teilen Sie bitte die Informationen mit, betrachten Sie es nicht als Arbeit. Vielen Dank!!!

Der Algorithmus selbst ist nicht kompliziert. Es ist einfach, auf einem Blatt Papier oder einem Taschenrechner zu berechnen, aber ich kann es nicht in MQL5 Sprache übersetzen!

 

Sergey Voytsekhovsky #:

... Ich habe versucht, mich auf der Grundlage von Euklids Algorithmus zu schreiben, aber ich war verwirrt. Im Allgemeinen fehlt es an Erfahrung ...

... Der Algorithmus selbst ist nicht kompliziert. Er ist einfach auf einem Blatt Papier oder einem Taschenrechner zu berechnen, aber ich kann ihn nicht in die Sprache MQL5 übersetzen!

Basierend auf meiner Praxis der Kommunikation auf dem Forum, kann ich Ihnen sagen, dass, wenn Sie den Code zeigen Sie bereits geschrieben haben, dann werden Sie schneller beantwortet werden und sie werden Ihnen sagen, wo der Fehler im Code ist.

Mit freundlichen Grüßen, 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 #:

Aus meiner Praxis der Kommunikation im Forum kann ich Ihnen sagen, dass man Ihnen schneller antwortet und Ihnen sagt, wo der Fehler im Code liegt, wenn Sie den Code, den Sie bereits geschrieben haben, sofort zeigen.

Mit freundlichen Grüßen, Vladimir.

Ok, vielen Dank für deine Meinung. Lass es uns versuchen. Ein kurzer Hintergrund zum Verständnis. Ich habe vor, die Funktion in einem auf Renko basierenden Indikator zu verwenden, der dem Hauptchart überlagert ist. Es besteht die Notwendigkeit, die aktuelle Größe der Ziegelsteine zu bestimmen. ZigZag ist auf der Basis des Renko-Charts aufgebaut, er hat u.a. zwei Arrays - eines mit Tops und eines mit Bottoms. Nun muss ich den GreatestCommonDivider der Abstände zwischen ihnen bestimmen, um die Größe der Ziegel automatisch anzupassen.

Im Moment habe ich diese Art von Krakozabra skizziert und das war's, ich bin ratlos, ich weiß nicht, was ich als nächstes tun soll.

//+------------------------------------------------------------------+
//| Вычисляем значение НОД(НаибольшийОбщийДелитель)=размера кирпичика|
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
 
Dies ist natürlich nur ein Entwurf, urteilen Sie nicht streng. Ich glaube, ich habe etwas falsch gemacht, es ist alles irgendwie chaotisch, ich muss eine einfachere und klarere Lösung finden, aber ich kann es nicht in meinen Kopf bekommen noch.....
 
Sergey Voytsekhovsky #:
Das ist natürlich nur ein Entwurf, bitte nicht streng urteilen. Ich glaube, ich habe etwas falsch gemacht, es ist alles irgendwie unübersichtlich, ich muss eine einfachere und klarere Lösung finden, aber mir fällt sie noch nicht ein....
Sergey, bilden Sie ein Array von Zahlen, für die Sie den NOD finden wollen, und übergeben Sie es an die Funktion ArrayGcd() aus meinem vorherigen Beitrag.

Ich bin mir aber nicht sicher, ob Sie NOD in diesem Fall verwenden können. Es sieht so aus, als ob Sie ihn für Zahlen berechnen wollen, die keine starren Beziehungen zwischen ihnen haben, um das Vorhandensein eines nicht-trivialen gemeinsamen Teilers sicherzustellen.
Dann werden Sie mit hoher Wahrscheinlichkeit immer NOD = 1 erhalten.
 
Yuriy Bykov #:
Sergey, bilden Sie ein Array von Zahlen, für die Sie den NOD finden wollen, und übergeben Sie es an die Funktion ArrayGcd() aus meinem vorherigen Beitrag.

Danke, ich habe Ihre Nachricht gesehen, nachdem ich meinen letzten Beitrag abgeschickt hatte, jetzt versuche ich, ihn anzupassen.

 
Sergey Voytsekhovsky #:

Danke, ich habe Ihre Nachricht gesehen, nachdem ich meine letzte abgeschickt hatte, jetzt versuche ich, sie anzupassen.

Sie können ulong überall im Code durch int ersetzen, aber dann müssen Sie sicher sein, dass alle Zahlen im Array positiv sind.
 
Yuriy Bykov #:
Sergey, bilden Sie ein Array von Zahlen, für die Sie den NOD finden wollen, und übergeben Sie es an die Funktion ArrayGcd() aus meinem vorherigen Beitrag.

Ich bin mir aber nicht sicher, ob Sie den NOD in diesem Fall verwenden können. Es sieht so aus, als ob Sie ihn für Zahlen berechnen wollen, die keine starren Beziehungen zwischen ihnen haben, vorausgesetzt, es gibt einen nicht-trivialen gemeinsamen Teiler.
Dann werden Sie mit hoher Wahrscheinlichkeit immer NOD = 1 erhalten.

Vielleicht müssen Sie das überprüfen, und zwar erst nach der Codierung des Algorithmus. Vielen Dank für Ihr Feedback.

 

Hallo zusammen, können Sie mir sagen, ob es möglich ist, eine Funktion von einem EA in einen anderen zu importieren?

Zum Beispiel gibt es einen EA, der Aufträge öffnet, und es gibt einen EA, der den Zustand des Kontos überwacht, wo die Parameter Drawdown, etc. angegeben sind,

Ich möchte, dass, wenn der Drawdown des zweiten EAs erreicht ist, der erste EA keine Aufträge eröffnet....

Wie kann man das zum Beispiel machen?