Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1499

 
EgorKim #:

У демо аккаунтов на сервере метаквотов есть срок жизни ?

А то спустя приблизительно месяц слетел и открылся автоматом новый счет.

Бред какой то

Есть срок бездействия, после которого демка аннулируется. У большинства пара недель. Если пользоваться счётом то у большинства нет срока. 
 

Добрый вечер.

Подскажите пожалуйста знающие - где можно найти, подсмотреть, почитать и тд.???

Нужна функция. на входе массив целых положительных чисел, точно больше 3-х, а на выходе НОД (Наибольший общий делитель).

Пробовал написать сам на основе алгоритма Евклида, но запутался. В общем опыта не хватает.

Если пробегала мимо кого, поделитесь плиз информацией, не сочтите за труд. Спасибо!!!

Как найти наибольший общий делитель (НОД) + свойства, формулы
Как найти наибольший общий делитель (НОД) + свойства, формулы
  • 2020.11.20
  • Лидия Казанцева Автор Skysmart
  • skysmart.ru
Для начала разберемся, что такое общий делитель. У целого числа может быть несколько делителей. А сейчас нам особенно интересно, как обращаться с делителями сразу нескольких целых чисел. Делитель натурального числа — это такое целое натуральное число, на которое делится данное число без остатка. Если у натурального числа больше двух делителей...
 
Sergey Voytsekhovsky #:

Добрый вечер.

Подскажите пожалуйста знающие - где можно найти, подсмотреть, почитать и тд.???

Нужна функция. на входе массив целых положительных чисел, точно больше 3-х, а на выходе НОД (Наибольший общий делитель).

Пробовал написать сам на основе алгоритма Евклида, но запутался. В общем опыта не хватает.

Если пробегала мимо кого, поделитесь плиз информацией, не сочтите за труд. Спасибо!!!

Сам алгоритм не сложный. На листике или калькуляторе считается просто, а вот переложить на язык MQL5 меня не получается!

 

Sergey Voytsekhovsky #:

... Пробовал написать сам на основе алгоритма Евклида, но запутался. В общем опыта не хватает ...

... Сам алгоритм не сложный. На листике или калькуляторе считается просто, а вот переложить на язык MQL5 меня не получается!

Исходя из моей практики общения на Форуме, могу подсказать, что если сразу покажете тот код, который уже написали, то тогда Вам быстрее ответят и подскажут, где в коде ошибка.

С уважением, Владимир.

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

Исходя из моей практики общения на Форуме, могу подсказать, что если сразу покажете тот код, который уже написали, то тогда Вам быстрее ответят и подскажут, где в коде ошибка.

С уважением, Владимир.

Ок, большое спасибо за Ваше мнение. Давайте попробуем. Краткая предыстория для понимания. Функцию планирую использовать в индикаторе, основанном на Ренко, наложенном на основной график. Возникает необходимость определять текущий размер кирпичиков. На основе ренко-графика строится ЗигЗаг, он имеет, кроме всего прочего, два массива - один с верхушками и один с донышками. Теперь мне нужно определить НаибольшийОбщийДелитель расстояний между ними, чтобы подкорректировать автоматически размер кирпичиков. 

На данный момент набросал вот такую кракозябру и все, затупил, совершенно не складывается в голове что дальше.

//+------------------------------------------------------------------+
//| Вычисляем значение НОД(НаибольшийОбщийДелитель)=размера кирпичика|
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
 
Это конечно просто еще заготовка, не судите строго. Мне кажется я вообще куда-то не туда пошел, все как-то каряво, нужно найти более простое и понятное решение, но в голове не укладывается пока....
 
Sergey Voytsekhovsky #:
Это конечно просто еще заготовка, не судите строго. Мне кажется я вообще куда-то не туда пошел, все как-то каряво, нужно найти более простое и понятное решение, но в голове не укладывается пока....
Сергей, сформируйте массив чисел, для которых вы хотите найти НОД и передайте его в функцию ArrayGcd() из моего предыдущего поста. 

Только вот не уверен, что вам получится использовать НОД в данном случае. Похоже, что вы хотите считать его для чисел, которые не имеют между собой каких-то жёстких связей, обеспечивающих наличие нетривиального общего делителя.
Тогда с высокой вероятностью вы всегда будете получать НОД = 1. 
 
Yuriy Bykov #:
Сергей, сформируйте массив чисел, для которых вы хотите найти НОД и передайте его в функцию ArrayGcd() из моего предыдущего поста. 

Спасибо, увидел Ваше сообщение уже после того, как отправил свое крайнее, сейчас пробую приладить.

 
Sergey Voytsekhovsky #:

Спасибо, увидел Ваше сообщение уже после того, как отправил свое крайнее, сейчас пробую приладить.

Можно заменит в коде везде ulong на int, но тогда надо быть уверенным, что числа в массиве все положительные