ちょっとびっくり :)私は、共有し、NOT修辞的な質問をすることを考えました。 - ページ 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での2つの講演会

// NODの計算を題材に-2回目の講義。でも、両方見る・聴くことをお勧めします。かっこいい講義、賢い人、とにかく素敵です。はい、そして便利です。
ファイル:
gcd_ru.zip  365 kb
 
MetaDriver:
ビットシフトがあれば、それでいい。モジュロ割り算の場合、しない。

連続したオフセットによる除算

最後に興味深い数字を紹介します。

このアルゴリズムは最悪の場合、(n-1)!の繰り返しで実行される。ここでnはdivisibleのビット深度である。まとめると、逐次加算アルゴリズムと比較して、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(random(),random())= 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(random(),random())= 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で暫定版を作っています。バグを探す、フレンドリーなテスト。

構造体として作りました。

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)+")";}
  };

すべての操作を正規化あり、なしの2形態にしました。柔軟な体制を手に入れた。

オーバーフローの可能性を疑えば - 恐れずに正規化したバージョンを使用する - 時間を節約する(正規化は、泡が蓄積されたときに、後で行うことができます)。

アーカイブには簡単なテストがありますが、もっと難しいテストをすることが望まれます。

ファイル:
 
IgorM:

顔文字だけならまだしも、記事まで削除するのはどうかと思います。

そのことについては、アカデミック いわゆる「計算機」があるのは素晴らしいと思うのですが、はっきりさせたいのは、取引中に自動的に最適化できるのかどうかということです。

そうですね、あくまでプログラムなので、実行すれば動いて最適なパラメーターを出してくれます。
 
EMAのチェックがあると良い。
 

特にこのスレッドのために、最新のMT5テスターの結果を公開しました(次のアップデート後に誰でもテストを繰り返すことができるようになります)。

これはMetaTrader 5テスターができる ことであり、さらに完全なインフラストラクチャーレイアウト(レポート、チャート、結果、視覚化)を備えています。

 
Renat:

特にこのスレッドのために、MT5テスターの最新の結果を公開しました(次のアップデート後に誰でもテストを繰り返すことができるようになります)。

それがMetaTrader 5のテスターでは、フルレイアウト(レポート、チャート、結果、視覚化)でも可能なのです。

7シンボル、すべてのティック、2000年以降、2つのパラメータ(バリアント200 * 200 ) - 40000パス、各シンボルのために一日あたり百順序を持つ。

どのくらいかかるの?

10年かかる - 356 * 10 * 100 * 7 = 25 000 000 ディール

1分間に約10ティック取ります

と10年 - 365 * 10 * 1440 * 10 = 52 000 000 ticks on one symbol.そして、正直に言えば、すべてのシンボルでカチカチになっている。 だから、素直に7を掛けるべきだろう。しかも、1分間に10回の刻みではありません。そして、時には300になることもあります。


どのくらいかかるの?

理由: