Ein wenig überrascht :) Ich dachte, ich teile das und stelle eine NICHT rhetorische Frage. - Seite 23

 
Urain:

Wollen Sie einen Wert (nicht unbedingt ein Vielfaches von 2) durch einen anderen Wert (nicht unbedingt ein Vielfaches von 2) durch eine Bitverschiebung dividieren?

Ok, ich gebe Ihnen, was ich habe, und dann können Sie selbst entscheiden, ob Sie es brauchen oder nicht.

Joseph Stein (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)

--

Zwei Vorträge von STL-Schöpfer Alexander Stepanov auf Yandex

// Zum Thema Berechnung der NOD - zweiter Vortrag. Aber ich empfehle, beide zu sehen/zu hören. Coole Vorträge, kluger Mann, einfach nett. Ja, und nützlich.
Dateien:
gcd_ru.zip  365 kb
 
MetaDriver:
Wenn mit Bit-Verschiebungen, gehen Sie für sie. Wenn mit Modulo-Division, dann nicht.

Dividieren durch aufeinanderfolgende Offsets

interessante Zahlen am Ende des Artikels:

Dieser Algorithmus wird im schlimmsten Fall in (n-1)! Iterationen ausgeführt, wobei n die Bittiefe des Teilers ist. Zusammenfassend lässt sich sagen, dass dieser Algorithmus im Vergleich zum sequentiellen Additionsalgorithmus bei 8-Bit-Zahlen einen bis zu 9-fachen und bei 16-Bit-Zahlen einen bis zu 546-fachen Gewinn bringt.

 

Ich habe also Folgendes bekommen:

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

Es scheint gut zu funktionieren. Bitte testen Sie alle Löcher.

// Ich habe es überarbeitet, so ist es schöner.
Dateien:
gcd.zip  1 kb
 

Das ist seltsam, es ist nicht sehr schnell.

2011.04.03 22:56:59 gcdSpeedTest (EURUSD,M20) Gemeinsame Zeit GreatestCommonDivisor(random(),random()) = 7656ms; // 10000000 Aufrufe
2011.04.03 22:56:51 gcdSpeedTest (EURUSD,M20) Gemeinsame Zeit gcd(random(),random()) = 5234ms; // 10000000 Aufrufe

Dateien:
gcd.zip  2 kb
 
MetaDriver:

Das ist seltsam, so viel schneller ist es nicht.

2011.04.03 22:56:59 gcdSpeedTest (EURUSD,M20) Gemeinsame Zeit GreatestCommonDivisor(random(),random()) = 7656ms; // 10000000 Aufrufe
2011.04.03 22:56:51 gcdSpeedTest (EURUSD,M20) Gemeinsame Zeit gcd(random(),random()) = 5234ms; // 10000000 Aufrufe

Ich habe einen größeren Unterschied. Ihr Programm ist 3-4 mal schneller, aber vergessen Sie nicht, dass in C++ der Unterschied um den Faktor 2-2,5 reduziert wird, so dass Sie wirklich 1,5 mal schneller sind.

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:

Ich habe einen größeren Unterschied. Ihre ist 3-4 Mal schneller,

aber vergessen Sie nicht, dass in C++ die Differenz um das 2-2,5-fache verringert wird, so dass Sie ehrlich gesagt um das 1,5-fache im Vorteil sind.


Und wir werden sehen.

Bislang haben wir eine vorläufige Version in mql5. Freundliche Tests, Suche nach Fehlern.

Ich habe sie als Struktur erstellt.

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

Ich habe alle Operationen in zwei Formen durchgeführt - mit und ohne Normalisierung. Ich habe eine flexible Struktur erhalten.

Wenn Sie die Möglichkeit eines Überlaufs vermuten, verwenden Sie eine Version mit Normalisierung, ohne Angst - Sie sparen Zeit (die Normalisierung kann später erfolgen, wenn sich der Schaum angesammelt hat).

Es gibt einen einfachen Test im Archiv, aber es ist wünschenswert, einen härteren Test durchzuführen.

Dateien:
 
IgorM:

Danke, dass Sie es wenigstens zugeben - Sie haben Emoticons entfernt, aber wer entfernt ganze Beiträge?

Zu diesem Thema, Academic, Ich finde es großartig, dass Sie einen so genannten "Rechner" haben, aber ich würde gerne klären, ob Sie ihn im Laufe des Handels automatisch optimieren können?

Ja, es ist nur ein Programm, wenn Sie es laufen lassen, wird es funktionieren und Ihnen die optimalen Parameter liefern.
 
Eine Überprüfung der EMA wäre eine gute Idee.
 

Speziell für diesen Thread habe ich die neuesten Ergebnisse des MT5-Testers veröffentlicht (jeder wird die Tests nach dem nächsten Update wiederholen können).

Das ist es , was der MetaTrader 5-Tester kann, und das sogar mit einer vollständigen Infrastruktur (Berichte, Charts, Ergebnisse, Visualisierung).

 
Renat:

Speziell für diesen Thread habe ich die neuesten Ergebnisse des MT5-Testers veröffentlicht (jeder wird die Tests nach dem nächsten Update wiederholen können).

Das kann der MetaTrader 5-Tester, und zwar sogar mit einem vollständigen Layout (Berichte, Charts, Ergebnisse, Visualisierung).

7 Symbole, alle Ticks, seit 2000, zwei Parameter ( Varianten 200 * 200 )- 40000 Durchläufe, mit hundert Aufträgen pro Tag für jedes Symbol.

Wie lange dauert es?

10 Jahre dauern - 356 * 10 * 100 * 7 = 25 000 000 Geschäfte

wir nehmen etwa 10 Ticks pro Minute

und 10 Jahre - 365 * 10 * 1440 * 10 = 52 000 000 Ticks auf ein Symbol. Und wenn wir ehrlich sind, ticken sie auf jedem Symbol, also sollten wir ehrlich gesagt mit 7 multiplizieren. Und es sind keine 10 Ticks pro Minute. Und manchmal sind es 300.


Wie lange dauert es?

Grund der Beschwerde: