Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1501

 
Sergey Voytsekhovsky #:

Boa noite.

Por favor, poderia me dizer onde posso encontrar, olhar, ler, etc.???

Preciso de uma função. A entrada é uma matriz de números inteiros positivos, exatamente maior que 3, e a saída é NOD (Maior Divisor Comum).

Tentei escrevê-la eu mesmo com base no algoritmo de Euclides, mas fiquei confuso. Em geral, não tenho experiência.

Se alguém tiver passado por isso, por favor, compartilhe suas informações, não considere isso um trabalho. Obrigado!!!

O algoritmo em si não é complicado. É fácil de calcular em uma folha de papel ou em uma calculadora, mas não consigo traduzi-lo para a linguagem MQL5!

 

Sergey Voytsekhovsky #:

... Tentei me escrever com base no algoritmo de Euclides, mas fiquei confuso. Em geral, falta experiência ...

... O algoritmo em si não é complicado. É simples de calcular em uma folha de papel ou em uma calculadora, mas não consigo traduzi-lo para a linguagem MQL5!

Com base na minha prática de comunicação no Fórum, posso dizer que, se você mostrar o código que já escreveu, receberá uma resposta mais rápida e eles dirão onde está o erro no código.

Saudações, 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 #:

Com base na minha prática de comunicação no Fórum, posso dizer que, se você mostrar o código que já escreveu de uma vez, eles responderão mais rapidamente e dirão onde está o erro no código.

Saudações, Vladimir.

Ok, muito obrigado por sua opinião. Vamos tentar. Um breve histórico para compreensão. Pretendo usar a função em um indicador baseado no Renko, sobreposto ao gráfico principal. É necessário determinar o tamanho atual dos tijolos. O ZigZag é construído com base no gráfico Renko e tem, entre outras coisas, duas matrizes - uma com os topos e outra com os fundos. Agora preciso determinar o GreatestCommonDivider das distâncias entre eles para ajustar o tamanho dos tijolos automaticamente.

No momento, fiz um esboço desse tipo de krakozabra e é isso, estou perplexo, não consigo pensar no que fazer em seguida.

//+------------------------------------------------------------------+
//| Вычисляем значение НОД(НаибольшийОбщийДелитель)=размера кирпичика|
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
 
É claro que isso é apenas um rascunho, não julgue com rigor. Acho que errei em algum ponto, está tudo meio bagunçado, preciso encontrar uma solução mais simples e clara, mas não consigo colocá-la na minha cabeça ainda.....
 
Sergey Voytsekhovsky #:
É claro que isso é apenas um rascunho, não julgue com rigor. Acho que errei em algum ponto, está tudo meio bagunçado, preciso encontrar uma solução mais simples e mais clara, mas ainda não consegui pensar nela....
Sergey, forme uma matriz de números para a qual você deseja encontrar o NOD e passe-a para a função ArrayGcd() da minha postagem anterior.

Mas não tenho certeza de que você poderá usar o NOD nesse caso. Parece que você quer calculá-lo para números que não têm nenhuma relação rígida entre si, garantindo a presença de um divisor comum não trivial.
Então, com alta probabilidade, você sempre obterá NOD = 1.
 
Yuriy Bykov #:
Sergey, forme uma matriz de números para a qual você deseja encontrar o NOD e passe-a para a função ArrayGcd() da minha postagem anterior.

Obrigado, vi sua mensagem depois de ter enviado a última, agora estou tentando adaptá-la.

 
Sergey Voytsekhovsky #:

Obrigado, vi sua mensagem depois de ter enviado a última, e agora estou tentando adaptá-la.

Você pode substituir ulong por int em qualquer parte do código, mas então terá que ter certeza de que todos os números na matriz são positivos.
 
Yuriy Bykov #:
Sergey, forme uma matriz de números para os quais você deseja encontrar o NOD e passe-a para a função ArrayGcd() da minha postagem anterior.

Mas não tenho certeza de que você poderá usar o NOD nesse caso. Parece que você deseja calculá-lo para números que não têm nenhuma relação rígida entre si, desde que haja um divisor comum não trivial.
Então, com alta probabilidade, você sempre obterá NOD = 1.

Talvez você precise verificar, e isso somente depois de codificar o algoritmo. Obrigado por seu feedback.

 

Olá a todos, vocês podem me dizer se é possível importar uma função de um EA para outro?

Por exemplo, há um EA que abre ordens e há um EA que monitora o estado da conta, onde os parâmetros drawdown etc. são especificados,

Preciso que, quando o drawdown do segundo EA for atingido, o primeiro EA não abra ordens....

Como fazer isso, por exemplo?

Razão: