Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 1501

 
Sergey Voytsekhovsky #:

İyi akşamlar.

Lütfen bana nerede bulabileceğimi, bakabileceğimi, okuyabileceğimi vb. söyleyebilir misiniz?

Bir fonksiyona ihtiyacım var. girdi, 3'ten tam olarak büyük pozitif tamsayılardan oluşan bir dizi ve çıktı NOD (En Büyük Ortak Bölen).

Öklid'in algoritmasını temel alarak kendim yazmaya çalıştım ama kafam karıştı. Genel olarak, deneyim eksikliğim var.

Birisi tarafından geçilirse lütfen bilgi paylaşın, bunu bir emek olarak görmeyin. Teşekkürler!!!

Algoritmanın kendisi karmaşık değil. Bir kağıt veya hesap makinesi üzerinde hesaplamak kolaydır, ancak bunu MQL5 diline çeviremiyorum!

 

Sergey Voytsekhovsky #:

... Öklid'in algoritmasını temel alarak kendim yazmaya çalıştım ama kafam karıştı. Genel olarak, deneyim eksik ...

... Algoritmanın kendisi karmaşık değil. Bir kağıt veya hesap makinesi üzerinde hesaplamak basit, ancak bunu MQL5 diline çeviremiyorum!

Forumdaki iletişim pratiğime dayanarak, size daha önce yazdığınız kodu gösterirseniz, daha hızlı yanıt alacağınızı ve hatanın kodda nerede olduğunu size söyleyeceklerini söyleyebilirim.

Saygılarımla, 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 #:

Forumdaki iletişim pratiğime dayanarak size şunu söyleyebilirim ki, önceden yazdığınız kodu bir kerede gösterirseniz, size daha hızlı cevap verecekler ve hatanın kodun neresinde olduğunu söyleyeceklerdir.

Saygılarımla, Vladimir.

Tamam, fikriniz için çok teşekkür ederim. Hadi deneyelim. Anlamak için kısa bir arka plan. İşlevi, ana grafiğin üzerine yerleştirilmiş Renko'ya dayalı bir göstergede kullanmayı planlıyorum. Mevcut tuğla boyutunu belirlemeye ihtiyaç vardır. ZigZag, Renko grafiği temelinde oluşturulmuştur, diğer şeylerin yanı sıra, biri üstleri ve diğeri altları olan iki diziye sahiptir. Şimdi tuğlaların boyutunu otomatik olarak ayarlamak için aralarındaki mesafelerin GreatestCommonDivider'ını belirlemem gerekiyor.

Şu anda bu tür bir krakozabra çizdim ve hepsi bu, afalladım, bundan sonra ne yapacağımı düşünemiyorum.

//+------------------------------------------------------------------+
//| Вычисляем значение НОД(НаибольшийОбщийДелитель)=размера кирпичика|
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
 
Bu tabii ki sadece bir taslak, kesinlikle yargılamayın. Sanırım bir yerde yanlış yaptım, her şey biraz dağınık, daha basit ve net bir çözüm bulmam gerekiyor, ama henüz kafama giremiyorum.....
 
Sergey Voytsekhovsky #:
Bu tabii ki sadece bir taslak, kesinlikle yargılamayın. Sanırım bir yerde yanlış yaptım, her şey biraz dağınık, daha basit ve net bir çözüm bulmam gerekiyor, ancak henüz düşünemiyorum....
Sergey, NOD'u bulmak istediğiniz sayılardan bir dizi oluşturun ve önceki yazımdaki ArrayGcd() fonksiyonuna aktarın.

Ancak bu durumda NOD'u kullanabileceğinizden emin değilim. Görünüşe göre, aralarında herhangi bir katı ilişki olmayan sayılar için hesaplamak istiyorsunuz ve önemsiz olmayan bir ortak bölenin varlığını garanti ediyorsunuz.
O zaman yüksek olasılıkla her zaman NOD = 1 elde edersiniz.
 
Yuriy Bykov #:
Sergey, NOD'u bulmak istediğiniz sayılardan bir dizi oluşturun ve önceki mesajımdaki ArrayGcd() fonksiyonuna aktarın.

Teşekkürler, son mesajımı gönderdikten sonra mesajınızı gördüm, şimdi onu uyarlamaya çalışıyorum.

 
Sergey Voytsekhovsky #:

Teşekkürler, mesajınızı son mesajımı gönderdikten sonra gördüm, şimdi onu uyarlamaya çalışıyorum.

Kodun her yerinde ulong yerine int kullanabilirsiniz, ancak o zaman dizideki tüm sayıların pozitif olduğundan emin olmanız gerekir.
 
Yuriy Bykov #:
Sergey, NOD'u bulmak istediğiniz sayılardan bir dizi oluşturun ve bunu önceki yazımdaki ArrayGcd() fonksiyonuna aktarın.

Ancak bu durumda NOD'u kullanabileceğinizden emin değilim. Görünüşe göre, önemsiz olmayan bir ortak bölenin varlığını sağlayarak, aralarında herhangi bir katı ilişki bulunmayan sayılar için hesaplamak istiyorsunuz.
O zaman yüksek olasılıkla her zaman NOD = 1 elde edersiniz.

Belki de kontrol etmeniz gerekir ve bu sadece algoritmayı kodladıktan sonra olur. Geri bildiriminiz için teşekkürler.

 

Merhabalar, bir işlevi bir EA'dan diğerine aktarmanın mümkün olup olmadığını söyleyebilir misiniz?

Örneğin, emir açan bir EA var ve hesabın durumunu izleyen bir EA var, burada parametreler düşüş vb. belirtiliyor,

İkinci EA'nın düşüşüne ulaşıldığında, ilk EA'nın siparişleri açmamasına ihtiyacım var....

Örneğin bunu nasıl yapabilirim?