初学者的问题 MQL5 MT5 MetaTrader 5 - 页 1501

 
Sergey Voytsekhovsky #:

晚上好。

能告诉我在哪里可以找到、查看、阅读等信息吗?

我需要一个函数。输入是一个正好大于 3 的正整数数组,输出是 NOD(最大公约数)。

我试着根据欧几里得算法自己写,但写着写着就糊涂了。总的来说,我缺乏经验。

如果有人通过,请与我分享信息,不要认为这是劳动。谢谢

算法本身并不复杂。在纸上或计算器上很容易计算,但我无法将其翻译成 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 #:

根据我在论坛上的交流实践,我可以告诉你,如果你一次性展示你已经写好的代码,他们会更快地回答你,并告诉你代码中的错误在哪里。

再见,弗拉基米尔

好的,非常感谢你的意见。让我们试试吧。简单介绍一下背景,以便理解。我计划在一个基于 Renko 的指标中使用该功能,并将其叠加在主图表上。需要确定当前砖块的大小。ZigZag 是在 Renko 图表的基础上构建的,它有两个数组,一个是顶部数组,一个是底部数组。现在,我需要确定它们之间距离的最大公约数,以便自动调整砖块的大小。

目前,我已经勾勒出了这样的 krakozabra,仅此而已,我被难住了,我想不出下一步该怎么做。

//+------------------------------------------------------------------+
//| Вычисляем значение НОД(НаибольшийОбщийДелитель)=размера кирпичика|
//+------------------------------------------------------------------+
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 #:
当然,这只是一个草稿,请勿妄加评论。我想我在某个地方出错了,这一切都有点乱,我需要找到一个更简单明了的解决方案,但我还没有想到....。
谢尔盖,把你想找到 NOD 的数字组成一个数组,然后把它传给我上一篇文章中的 ArrayGcd() 函数。

但我不确定在这种情况下能否使用 NOD。看起来你想计算的是那些之间没有任何刚性关系的数字,确保存在一个非三乘的公因子。
那么你很有可能总是得到 NOD = 1。
 
Yuriy Bykov #:
谢尔盖,请将您要查找 NOD 的数字组成一个数组,然后将其传递给我上一篇文章中的 ArrayGcd() 函数。

谢谢,我是在发完上一个帖子后才看到你的留言的,现在我正在试着修改它。

 
Sergey Voytsekhovsky #:

谢谢,我在发完上一条信息后才看到你的留言,现在我正在试着修改它。

你可以在代码的所有地方用 int 代替 ulong,但必须确保数组中的所有数字都是正数。
 
Yuriy Bykov #:
谢尔盖,请将您希望找到 NOD 的数字组成一个数组,并将其传递给我上一篇文章中的 ArrayGcd() 函数。 。

但我不确定在这种情况下你是否能使用 NOD。看起来你想计算的是那些之间没有任何刚性关系的数,但前提是存在一个非三乘的公因子。
那么你很有可能总是得到 NOD = 1。

也许你需要检查一下,而且只有在编码算法后才能检查。感谢您的反馈。

 

大家好,请问是否可以将一个 EA 的功能导入 另一个 EA?

例如,有一个 EA 可以打开订单,还有一个 EA 可以监控账户状态,其中指定了缩水等参数、

我需要当达到第二个 EA 的缩减时,第一个 EA 不打开订单....。

如何举例说明?