Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1501

 
Sergey Voytsekhovsky #:

Buona sera.

Per favore, potete dirmi dove posso trovare, guardare, leggere, ecc.

Ho bisogno di una funzione. l'input è un array di numeri interi positivi, esattamente maggiori di 3, e l'output è NOD (Greatest Common Divisor).

Ho provato a scriverla da solo sulla base dell'algoritmo di Euclide, ma mi sono confuso. In generale, mi manca l'esperienza.

Se qualcuno è passato, per favore condivida le informazioni, non consideratelo un lavoro. Grazie!!!

L'algoritmo in sé non è complicato. È facile da calcolare su un foglio di carta o su una calcolatrice, ma non riesco a tradurlo in linguaggio MQL5!

 

Sergey Voytsekhovsky #:

... Ho provato a scrivere io stesso sulla base dell'algoritmo di Euclide, ma mi sono confuso. In generale, manca l'esperienza...

... L'algoritmo in sé non è complicato. È semplice da calcolare su un foglio di carta o su una calcolatrice, ma non riesco a tradurlo in linguaggio MQL5!

Sulla base della mia pratica di comunicazione sul forum, posso dirvi che se mostrate il codice che avete già scritto, allora vi risponderanno più velocemente e vi diranno dove si trova l'errore nel codice.

Saluti, 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 #:

In base alla mia pratica di comunicazione sul forum, posso dirvi che se mostrate subito il codice che avete già scritto, vi risponderanno più velocemente e vi diranno dove si trova l'errore nel codice.

Saluti, Vladimir.

Ok, grazie mille per il tuo parere. Proviamo. Un breve background per capire. Ho intenzione di utilizzare la funzione in un indicatore basato su Renko, sovrapposto al grafico principale. C'è la necessità di determinare la dimensione attuale dei mattoni. ZigZag è costruito sulla base del grafico Renko, ha, tra le altre cose, due array - uno con i top e uno con i bottom. Ora ho bisogno di determinare il GreatestCommonDivider delle distanze tra loro per regolare automaticamente le dimensioni dei mattoni.

Al momento ho abbozzato questa specie di krakozabra e basta, sono perplesso, non riesco a pensare a cosa fare dopo.

//+------------------------------------------------------------------+
//| Вычисляем значение НОД(НаибольшийОбщийДелитель)=размера кирпичика|
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
 
Naturalmente questa è solo una bozza, non giudicate severamente. Credo di aver sbagliato qualcosa, è tutto un po' disordinato, devo trovare una soluzione più semplice e chiara, ma non riesco ancora a metterla in testa.....
 
Sergey Voytsekhovsky #:
Naturalmente questa è solo una bozza, non giudicate severamente. Credo di aver sbagliato qualcosa, è tutto un po' confuso, devo trovare una soluzione più semplice e chiara, ma non mi viene ancora in mente....
Sergey, forma un array di numeri per i quali vuoi trovare il NOD e passalo alla funzione ArrayGcd() del mio post precedente.

Ma non sono sicuro che si possa usare NOD in questo caso. Sembra che vogliate calcolarlo per numeri che non hanno relazioni rigide tra loro, assicurando la presenza di un divisore comune non banale.
Allora, con alta probabilità, si otterrà sempre NOD = 1.
 
Yuriy Bykov #:
Sergey, forma un array di numeri per i quali vuoi trovare il NOD e passalo alla funzione ArrayGcd() del mio post precedente.

Grazie, ho visto il tuo messaggio dopo aver inviato il mio ultimo, ora sto cercando di adattarlo.

 
Sergey Voytsekhovsky #:

Grazie, ho visto il tuo messaggio dopo aver inviato il mio ultimo, ora sto cercando di adattarlo.

Puoi sostituire ulong con int ovunque nel codice, ma poi devi essere sicuro che tutti i numeri nell'array siano positivi.
 
Yuriy Bykov #:
Sergey, forma un array di numeri per i quali vuoi trovare il NOD e passalo alla funzione ArrayGcd() del mio post precedente.

Ma non sono sicuro che sia possibile utilizzare il NOD in questo caso. Sembra che tu voglia calcolarlo per numeri che non hanno relazioni rigide tra loro, a condizione che ci sia un divisore comune non banale.
In questo caso, con alta probabilità, si otterrà sempre NOD = 1.

Forse è necessario verificare, e questo solo dopo aver codificato l'algoritmo. Grazie per il vostro feedback.

 

Ciao a tutti, sapete dirmi se è possibile importare una funzione da un EA ad un altro?

Ad esempio, c'è un EA che apre gli ordini, e c'è un EA che monitora lo stato del conto, dove sono specificati i parametri drawdown, ecc,

Ho bisogno che quando il drawdown del secondo EA viene raggiunto, il primo EA non apra ordini....

Come fare per esempio?

Motivazione: