Un peu surpris :) J'ai pensé que je devais partager et poser une question NON rhétorique. - page 23

 
Urain:

Allez-vous diviser un nombre (pas nécessairement un multiple de 2) par un autre (pas nécessairement un multiple de 2) par un décalage de bits ?

Ok, je vais vous donner ce que j'ai, et ensuite vous pourrez décider par vous-même si vous en avez besoin ou pas.

Joseph Stein (1961) :

pgcd(n,0) = pgcd(0, n) = n

pgcd(n,n) = n

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

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

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

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

--

Deux conférences du créateur de la STL, Alexander Stepanov, sur Yandex

// Sur le thème du calcul du NOD - deuxième conférence. Mais je suggère de voir/écouter les deux. Des conférences sympas, un homme intelligent, tout simplement agréable. Oui, et utile.
Dossiers :
gcd_ru.zip  365 kb
 
MetaDriver:
Si c'est le cas, allez-y. Si avec la division modulo, ne le faites pas.

Diviser par des décalages successifs

des chiffres intéressants à la fin de l'article :

Cet algorithme s'exécutera dans le pire des cas en (n-1) ! itérations, où n est la profondeur binaire du divisible. En résumé, par rapport à l'algorithme d'addition séquentielle, cet algorithme produit un gain allant jusqu'à 9 fois pour les nombres de 8 bits, et jusqu'à 546 fois pour les nombres de 16 bits.

 

Alors voilà ce que j'ai :

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

il semble fonctionner correctement. veuillez tester tous les trous.

// Je l'ai modifié, c'est plus joli comme ça.
Dossiers :
gcd.zip  1 kb
 

C'est bizarre, ce n'est pas très rapide.

2011.04.03 22:56:59 gcdSpeedTest (EURUSD,M20) Temps commun GreatestCommonDivisor(random(),random()) = 7656ms ; // 10000000 appels
2011.04.03 22:56:51 gcdSpeedTest (EURUSD,M20) Temps commun gcd(random(),random()) = 5234ms ; // 10000000 appels

Dossiers :
gcd.zip  2 kb
 
MetaDriver:

C'est bizarre, ce n'est pas beaucoup plus rapide.

2011.04.03 22:56:59 gcdSpeedTest (EURUSD,M20) Temps commun GreatestCommonDivisor(random(),random()) = 7656ms ; // 10000000 appels
2011.04.03 22:56:51 gcdSpeedTest (EURUSD,M20) Temps commun gcd(random(),random()) = 5234ms ; // 10000000 appels

J'ai une plus grande différence. La vôtre est 3 à 4 fois plus rapide, mais n'oubliez pas qu'en C++, la différence est réduite par un facteur de 2 à 2,5, de sorte que vous êtes honnêtement 1,5 fois plus rapide.

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:

J'ai une plus grande différence. Le vôtre est 3-4 fois plus rapide,

mais n'oubliez pas qu'en C++, la différence est réduite de 2 à 2,5 fois, de sorte que vous êtes honnêtement en avance de 1,5 fois.


Et nous verrons.

Jusqu'à présent, nous avons une version préliminaire dans mql5. Test amical, recherche de bogues.

J'en ai fait une structure.

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

J'ai effectué toutes les opérations sous deux formes - avec et sans normalisation. J'ai obtenu une structure flexible.

Si vous soupçonnez la possibilité d'un débordement - vous utilisez une version avec normalisation, sans crainte - vous gagnez du temps (la normalisation peut être effectuée plus tard, lorsque la mousse s'est accumulée).

Il existe un test simple dans les archives, mais il est souhaitable de faire des tests plus poussés.

Dossiers :
 
IgorM:

merci de l'admettre au moins - vous supprimez les émoticônes, mais qui supprime des messages entiers ?

en soi, académique, Je pense que c'est génial que vous ayez une "calculatrice", mais je voudrais savoir si vous pouvez l'optimiser automatiquement au cours du trading ?

Oui, c'est juste un programme, si vous l'exécutez, il fonctionnera et vous donnera les paramètres optimaux.
 
Une vérification de l'EMA serait une bonne idée.
 

J'ai publié spécialement pour ce fil de discussion les derniers résultats du testeur MT5 (tout le monde pourra répéter les tests après la prochaine mise à jour).

C'est ce que peut faire le testeur MetaTrader 5, et encore plus avec une infrastructure complète (rapports, graphiques, résultats, visualisation).

 
Renat:

J'ai publié spécialement pour ce fil de discussion les derniers résultats du testeur MT5 (tout le monde pourra répéter les tests après la prochaine mise à jour).

C'est ce que peut faire le testeur MetaTrader 5, et même avec une mise en page complète (rapports, graphiques, résultats, visualisation).

7 symboles, tous les ticks, depuis 2000, deux paramètres ( variantes 200 * 200 )- 40000 passages, avec une centaine d'ordres par jour pour chaque symbole.

Combien de temps cela prend-il ?

prendre 10 ans - 356 * 10 * 100 * 7 = 25 000 000 de transactions

nous prenons environ 10 ticks par minute

et 10 ans - 365 * 10 * 1440 * 10 = 52 000 000 ticks sur un symbole. Et si nous sommes honnêtes, ils cochent sur tous les symboles. Donc, nous devrions honnêtement multiplier par 7. Et ce n'est pas 10 tics par minute. Et parfois, c'est 300.


Combien de temps cela prend-il ?

Raison: