有点惊讶 :)我想我应该分享并提出一个非反问的问题。 - 页 23

 
Urain:

你要用一个(不一定是2的倍数)除以另一个(不一定是2的倍数)的位移吗?

好吧,我把我得到的东西扔进去,然后你可以自己决定是否需要它。

约瑟夫-斯坦恩(1961)。

gcd(n,0) = gcd(0, n) = n

gcd(n,n) = n

gcd(2n,2m) = 2gcd(n, m)

gcd(2n,2m + 1) = gcd(n, 2m + 1)

gcd(2n + 1, 2m) = gcd(2n + 1, m)

gcd(2n + 1, 2(n + k) + 1) = gcd(2(n + k) + 1, 2n + 1) = gcd(2n + 1, k)

--

STL创建者Alexander Stepanov在Yandex的两次讲座

// 关于计算NOD的问题--第二讲。但我建议去看看/听听他们两个人的意见。很酷的讲座,聪明的人,只是令人愉快。是的,而且很有用。
附加的文件:
gcd_ru.zip  365 kb
 
MetaDriver:
如果有位子转移,就去做吧。如果用模除法,不要。

除以连续的偏移量

文章结尾处的有趣数字。

这个算法在最坏的情况下将在(n-1)!迭代中执行,其中n是被除数的位深度。总之,与顺序加法算法相比,该算法对8位数产生的增益高达9倍,对16位数的增益高达546倍。

 

因此,这是我得到的东西。

long gcd(long m, long n) 
{
  if (m<0) m=-m; 
  if (n<0) n=-n;
  if (m==0) return n; 
  if (n==0) return m;
  int d = 0;
  while ((m & 1)==0 && (n & 1)==0) { m >>= 1; n >>= 1; ++d; }
  while ((m & 1)==0) m >>= 1;
  while ((n & 1)==0) n >>= 1;
  while (m!=n)   //  while (true)  // старый вариант 
    if (m < n) 
    {
      n -= m;
      do  n >>= 1;  while ((n & 1)==0);
    } 
    else       // if (n < m) это теперь без надобности
    {
      m -= n;
      do  m >>= 1;  while ((m & 1)==0);
    } 
//    else break;  // старый вариант
    return (m <<= d);
}

它似乎工作得很好。请测试所有的孔。

//对它进行了调整,这样更漂亮。
附加的文件:
gcd.zip  1 kb
 

这很奇怪,它不是非常快。

2011.04.03 22:56:59 gcdSpeedTest (EURUSD,M20) 公共时间 GreatestCommonDivisor(random(),random())= 7656ms; // 10000000次调用
2011.04.03 22:56:51 gcdSpeedTest (EURUSD,M20) 普通时间gcd(随机(),随机())= 5234ms; // 10000000次调用

附加的文件:
gcd.zip  2 kb
 
MetaDriver:

这很奇怪,它没有那么快。

2011.04.03 22:56:59 gcdSpeedTest (EURUSD,M20) 公共时间 GreatestCommonDivisor(random(),random())= 7656ms; // 10000000次调用
2011.04.03 22:56:51 gcdSpeedTest (EURUSD,M20) 普通时间gcd(随机(),随机())= 5234ms; // 10000000次调用

我有一个更大的区别。你的速度是3-4倍,但别忘了,在C++中,差异会减少2-2.5倍,所以说实话,你的速度是1.5倍。

void OnStart()
  {
//---
   int total=1000000;
   long x=2*3*5*7*9*11*13*17*19*21*23*29;
   long m=55*x,n=34*x;
   uint start=GetTickCount();
   for(int i=0;i<total;i++)x=gcd(m,n);      
   Print("MetaDriver gcd time=",GetTickCount()-start," x=",x);
   start=GetTickCount();
   for(int i=0;i<total;i++)x=GreatestCommonDivisor(m,n); 
   Print("Urain       GCD time=",GetTickCount()-start," x=",x);
  }
2011.04.03 22:35:41     Черновик 30 (EURUSD,M1) Urain       GCD time=1313 x=1222772020470
2011.04.03 22:35:40     Черновик 30 (EURUSD,M1) MetaDriver  gcd time= 312 x=1222772020470
 
Urain:

我有一个更大的区别。你的速度是3-4倍。

但别忘了,在C++中,差异会减少2-2.5倍,所以 你老老实实地领先1.5倍。


我们会看到。

到目前为止,我们在mql5中有一个初步的版本。友好测试,寻找bug。

我已经把它作为一个结构。

struct Rational
  {
   long              n;
   long              m;
   void ErrDZ() { Print("Rational error: zero-denominator!"); }
   void Neg() { n=-n; }
   void Norm() { long d=gcd(n,m); n/=d; m/=d; if (m<0) { n=-n; m=-m; } }
   void Assign(long a,long b) { if (b==0) { n=0; m=1; ErrDZ(); } if (b<0) { n=-a; m=-b; } else { n=a; m=b; } }
   void nAssign(long a,long b) { Assign(a,b); Norm(); }
   void Assign(long a) { Assign(a,1); }  // {n=a;m=1;}
   void Add(Rational &a) { if(m==a.m) n+=a.n; else { n*=a.m; n+=m*a.n; m*=a.m; } }
   void nAdd(Rational &a) { Add(a); Norm(); }
   void Add(long a) { n+=a*m; }
   void nAdd(long a) { Add(a); Norm(); }
   void Sub(Rational &a) { if(m==a.m) n-=a.n; else { n*=a.m; n-=m*a.n; m*=a.m; } }
   void nSub(Rational &a) { Sub(a); Norm(); }
   void Sub(long a) { n-=a*m; }
   void nSub(long a) { Sub(a); Norm(); }
   void Mul(Rational &a) { n*=a.n; m*=a.m; }
   void nMul(Rational &a) { Mul(a); Norm(); }
   void Mul(long a) { n*=a; }
   void nMul(long a) { Mul(a); Norm(); }
   void Div(Rational &a) { n*=a.m; m*=a.n; }
   void nDiv(Rational &a) { Div(a); Norm(); }
   void Div(long a) { m*=a; }
   void nDiv(long a) { Div(a); Norm(); }
   string ToString() {return "("+IntegerToString(n)+"/"+IntegerToString(m)+")";}
  };

我将所有操作分为两种形式--有规范化和无规范化。我已经获得了一个灵活的结构。

如果你怀疑有溢出的可能--你使用有规范化的版本,不用担心--你会节省时间(规范化可以在以后进行,当泡沫积累到一定程度时)。

档案中有一个简单的测试,但最好能更努力地测试。

附加的文件:
 
IgorM:

谢谢你至少承认--你删除了表情符号,但谁会删除整个帖子呢?

关于这一点,学术界 我认为你有一个所谓的 "计算器 "是很好的,但我想弄清楚你是否可以在交易过程中自动优化它?

是的,这只是一个程序,如果你运行它,它就会工作并给你提供最佳参数。
 
对EMA进行检查将是一个好主意。
 

特别是为了这个主题,我发布了最新的MT5测试器结果(任何人都可以在下次更新后重复测试)。

这就是MetaTrader 5测试器能做的,更有完整的基础设施布局(报告、图表、结果、可视化)。

 
Renat:

特别是为了这个主题,我发布了MT5测试器的最新结果(任何人都可以在下次更新后重复测试)。

这就是MetaTrader 5测试器能做的,甚至有完整的布局(报告、图表、结果、可视化)。

7个符号,所有的ticks,自2000年以来,两个参数( variants 200 * 200 )- 40000次,每个符号每天有一百个订单。

这需要多长时间?

用10年时间 - 356 * 10 * 100 * 7 = 25 000 000笔交易

我们每分钟大约需要10次点击

和10年--365*10*1440*10=52 000 000次,一个符号。如果我们说实话,他们在每个符号上都在打钩。 所以,我们应该诚实地再乘以7。而且它不是每分钟10次。而有时是300。


这需要多长时间?