Mon approche. Le noyau est le moteur. - page 126

 
Nikolai Semko:
Si c'est MT4, alors oui.
MT5, d'après ce que j'ai compris, prend pleinement en charge le multi-core et le multi-threading, contrairement à MT4.

Il semble que pour alléger la charge, il faille utiliser OpenCL. Mais MT4 ne l'a pas. Ou tu peux juste le supporter.

Une autre variante consiste à permettre à l'utilisateur de régler la vitesse de redécoupage de l'animation. Dans ce cas, il pourra réduire la charge du processeur lorsque cela est nécessaire et l'augmenter à nouveau s'il le souhaite.

 
Реter Konow:

Il semble que vous deviez utiliser OpenCL pour alléger la charge. Mais MT4 ne l'a pas. Ou juste le supporter.

Une autre option consiste à permettre à l'utilisateur de régler la vitesse de redécoupage de l'animation. Dans ce cas, il pourra réduire la charge du processeur en cas de besoin, et l'augmenter à nouveau s'il le souhaite.

Je suis déjà passé à MT5.
Il est intéressant de tester le travail de deux EAs dans MT5 qui sont installés sur des fenêtres différentes mais qui fonctionnent avec les ressources d'une seule fenêtre. Après tout, chaque EA a son propre fil de discussion et, comme vous le savez, vous ne pouvez pas mettre plus d'une EA dans une fenêtre.
 
Nikolai Semko:
Il est intéressant de tester dans MT5 le travail de deux EAs qui sont installés sur des fenêtres différentes mais qui fonctionnent avec les ressources d'une seule fenêtre. Parce que chaque EA a son propre fil et, comme vous le savez, vous ne pouvez pas mettre plus d'un Expert Advisor dans une fenêtre.

Dans MT4, chaque EA a également son propre fil de discussion. Si je ne me trompe pas...

Le fil est différent, mais le processeur est le même pour tous...

Je pense que c'est la raison de la création d'un tableau.

 

Il y a une autre nuance.

Si l'animation est cyclique (comme un gif), il n'est pas nécessaire de réinitialiser le tableau de pixels en permanence. Vous pouvez passer par un cycle de dessin de l'animation et stocker chaque image dans une ressource. Ensuite, il suffit de basculer l'image. En partie, j'ai implémenté cela et grâce à cela, j'ai obtenu plusieurs vitesses d'animation (au début, la vitesse d'animation était terrible, car à chaque fois je redessinais l'image originale, puis je dessinais une nouvelle image dessus).

 
Реter Konow:

Dans MT4, chaque EA a également son propre fil de discussion. Si je ne me trompe pas...

Le fil est différent, mais le processeur est le même pour tous...

Je pense que c'est pour cela qu'ils ont créé une carte graphique.

Juste pour apprécier la différence entre MT4 et MT5, exécutez ce code sur les deux plateformes (le code fonctionne ici et là) et vous verrez que dans MT4 il s'exécute beaucoup plus lentement :

#define protected public
#include <Canvas\Canvas.mqh>
#undef protected
#property script_show_inputs 
input uint N=8; // количество центов гравитации
void OnStart()
  {
   ChartSetInteger(0,CHART_FOREGROUND,true);
   CCanvas C;
   int Width=(ushort)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);                               // get Window width
   int Height=(ushort)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS);                             // get Window height 
   if(!C.CreateBitmapLabel(0,0,"CanvasExamlple",0,0,Width,Height,COLOR_FORMAT_XRGB_NOALPHA)) // create canvas with the size of the current window
      Print("Error creating canvas: ",GetLastError());
   uint i=0,j=100000;
   int size=Width*Height;
   uchar h[25600];
   ArrayInitialize(h,0);
   uint w;
   for(w=0;w<25600;w++) h[w]=uchar(128+128*sin(double(w)/256)); //create an array to speed up the work
   double SQRT[];
   uint ss=Width*Width+Height*Height;
   Print(ss);
   ArrayResize(SQRT,ss);
   for(w=0;w<ss;w++) SQRT[(int)w]=sqrt(w); //create an array to speed up the work 
   int k[]; ArrayResize(k,N*2);
   for(w=0;w<N*2;w++) k[w]=20+rand()%200;
   double XP[],YP[],D[],D1[];
   ArrayResize(XP,N);
   ArrayResize(YP,N);
   ArrayResize(D,N);
   ArrayInitialize(XP,0);
   ArrayInitialize(YP,0);
   ulong t=0,sum=0, f=0;
   C.FontSet("Verdana",50,FW_MEDIUM);
   while(!IsStopped())
     {
      int pos=int(i%size);
      if(pos==0)
        {
         //Sleep(20); //For those who have a too powerful computer.
         if (i>0) {t=GetMicrosecondCount()-t; sum+=t; f++; 
         C.TextOut(Width/2,Height/2,"Время формирования кадра = "+IntegerToString(sum/f)+" мкс",clrBlueViolet,TA_CENTER|TA_VCENTER);}
         C.Update();
         t=GetMicrosecondCount();
         for(w=0;w<N;w++)
           {
            XP[w]= Width/2-(sin((double)j/k[2*w])*(double)Width/2);
            YP[w]= Height/2-(cos((double)j/k[2*w+1])*(double)Height/2);
           }
         j++;
        }
      int X=pos%Width;
      int Y=int(pos/Width);
      
     // for(int w=0;w<N;w++) D1[w]=SQRT[int((XP[w]-X)*(XP[w]-X)+(YP[w]-Y)*(YP[w]-Y))];
      for(w=0;w<N;w++) D[w]=    sqrt((XP[w]-X)*(XP[w]-X)+(YP[w]-Y)*(YP[w]-Y));
      double S1=0,S2;
      for(w=0;w<N/2;w++) S1+=D[w];
      S2=S1;
      for(w=N/2;w<N;w++) S2+=D[w];
      double d=S1/S2;
      
      //double d= (D[0]+D[1]+D[2]+D[3])/(D[0]+D[1]+D[2]+D[3]+D[4]+D[5]+D[6]+D[7]);
       //d= (D[0]+D[1])/(D[0]+D[1]+D[2]+D[3]);
      C.m_pixels[pos]=XRGB(h[int(d*11520)],h[int(d*17920)],h[int(d*6400)]);// works a little faster, but requires transferring the array m_pixels from protected to public in Canvas.mqh
      //C.PixelSet(X,Y,XRGB(h[int(d*11520)],h[int(d*17920)],h[int(d*6400)]));
      i++;
     }
   C.Destroy();
  }
//+------------------------------------------------------------------+
 
Nikolai Semko:

Juste pour apprécier la différence entre MT4 et MT5, exécutez ce code sur les deux plateformes (le code fonctionne ici et là) et vous verrez qu'il est un ordre de grandeur plus lent dans MT4 :

Oui, mettez-le là et là. La différence est d'environ un facteur 10. Exactement parce que dans MT5 les tableaux sont initialisés 10 fois ou plus rapidement. J'ai vérifié.

Cependant, même sur MT4, tout devrait être beaucoup plus rapide. Après tout, vous ne faites que redessiner l'image. C'est différent si vous le traitez de manière répétée dans un tableau.

Je ne sais pas pourquoi c'est si lent sur MT4.

 

Cependant, le problème est peut-être que vous réinitialisez CHAQUE pixel de l'espace kanvas entier de la taille du graphique.

Dans mon animation, seules les zones individuelles sont dessinées, et la partie principale de l'image est entièrement tirée de la ressource. Vous n'avez pas la partie principale, et l'image est entièrement créée. Par conséquent, il ralentit.

C'est la taille du dessin.

 
Реter Konow:

Cependant, c'est peut-être parce que vous réinitialisez CHAQUE pixel de tout l'espace du canevas de la taille du graphique.

Dans mon animation, seules les zones individuelles sont dessinées, et la partie principale de l'image est entièrement tirée de la ressource. Vous n'avez pas la partie principale, et l'image est entièrement créée. Par conséquent, il ralentit.

C'est la taille du dessin.

Quelle différence. Il s'agit d'un exemple volontairement extrême qui démontre clairement les avantages de mt5 en termes de vitesse de kanvas. Et ce numéro est une archive de votre invention. C'est pourquoi je dis depuis longtemps : allez au MQL5.
Le fait demeure. Le cadrage des images sur mt5 est 10 fois plus rapide que sur mt4. Et c'est un argument très convaincant.
 
Nikolai Semko:
Quelle différence. Il s'agit d'un exemple volontairement extrême qui démontre clairement les avantages de mt5 dans la vitesse des kanvas. Et ce numéro est une archive de votre invention. C'est pourquoi je dis depuis longtemps : allez au MQL5.
Le fait demeure. L'imagerie sur MT5 est 10 fois plus rapide que sur MT4. Et c'est un argument très valable.

Les inconvénients de MT4, sont ce qui est nécessaire dans le développement. Vous n'avez pas à les fuir. Ils vous obligent à réfléchir et à améliorer vos solutions.

Sur MT5, vous n'avez pas besoin de faire beaucoup d'efforts non plus. Tout fonctionne assez vite comme ça. Par conséquent, la migration vers MT5 est prévue pour la phase finale.

 
Реter Konow:

Enfin, le tableau dynamique est terminé. Je dois dire que ce n'était pas facile. Il s'avère qu'il y a beaucoup de nuances.

De plus, ce tableau est dynamique "conditionnellement". C'est-à-dire que le nombre maximal de rangées est prédéterminé. Il n'était pas encore possible de rendre "absolument" dynamique.

Ce tableau comporte 20 lignes possibles. Ainsi, il peut afficher 20 positions ouvertes. Nous pourrions en faire plus, mais c'est juste une démonstration pour le moment.

Cliquez pour voir.

Voici les fichiers de connexion (mis dans l'inclusion), le moteur (dans le dossier indicateurs), et le test.EA (dans le dossier experts) :

Peter, désolé mais votre travail n'est pas accepté car ce que vous avez envoyé est un rare travail d'amateur. Je suis désolé mais il semble que je sois le seul à avoir analysé ce que vous avez envoyé et à part moi, personne ne l'examinera.

Donc, dans l'ordre, la mission était la suivante :

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

Mon approche. Core - Moteur.

Vasiliy Sokolov, 2018.12.26 13:29

Peter, voici la mission. Créez un panneau montrant les ouvertures d'ordres en cours dans MT4. Pas besoin de faire une copie complète du panneau du système, affichez le tableau le plus simple avec les propriétés de base des ordres ouverts : prix d'ouverture, direction, profit. Le reste dépend de vous. L'essentiel est que lorsqu'une commande est clôturée, son indication dans votre tableau disparaît également. Et vice versa, elle apparaîtrait dans ce tableau lorsqu'une nouvelle commande est ouverte.

Ce que je vois à la place :

Tout d'abord, les transactions ne peuvent être ouvertes dans votre panel qu'en cliquant sur le bouton acheter/vendre. Si une position est ouverte par la fenêtre standard, la transaction n'apparaît pas.

Deuxièmement, certains ordres sont affichés avec des valeurs vides. Ils sont présents dans le tableau, mais les lignes sont vides.

Troisièmement, (c'est vraiment effrayant), si nous fermons un ordre par le biais du dialogue standard, il ne disparaît pas dans le tableau. Mais le plus triste, c'est que lorsque vous rechargez le panneau, les ordres fermés sont à nouveau affichés comme prétendument ouverts ! Qu'est-ce que c'est ? Pourquoi stockez-vous des informations non pertinentes quelque part et essayez-vous ensuite de les charger ?

Quatrièmement, qu'est-ce que c'est que 20 ordres ? Je n'ai pas un mot sur cette restriction dans ma mission ! Cela a été fait exprès, pour tester votre moteur à travailler dans un environnement dynamique et inconnu jusqu'alors. Le travail n'a pas été choisi au hasard, vous avez modifié mes exigences, afin qu'il cache tous les "angles aigus" de votre moteur. Mais la tâche a été donnée afin de montrer ces angles.

Cinquièmement, vous n'avez pas besoin de le faire si vous fixez un stop loss ou un take profit. Laissez ces champs vides.

Et oui, le bouton pour fermer la position (croix) dans votre panneau ne fonctionne pas non plus.

En bref, Peter. Je suis désolé, mais votre outil est un travail de pirate total. Veuillez le réparer selon les spécifications.

Je vais clarifier la tâche une fois de plus, pour qu'il n'y ait pas de questions :

  1. Le tableau est dynamique et présente les mêmes ordres que dans l'onglet Commerce. S'il n'y a pas de commandes sur l'onglet, votre tableau ne les affiche pas non plus.
  2. Le nombre d'ordres affichés dans votre tableau doit être quelconque. Il n'y a pas de limitations venant d'en haut.
  3. L'ouverture d'un ordre via la fenêtre de dialogue standard devrait faire apparaître l'ordre dans votre tableau. La clôture de la commande par des moyens standards devrait entraîner la disparition de la commande dans votre table.
  4. Un état non cohérent n'est pas acceptable! Si votre tableau indique une chose, mais que l'onglet Commerce en indique une autre, il s'agit d'une erreur.

Jusqu'à présent, un gros non. J'attends vos raffinements. Et pas de rendu 3D avant d'avoir trouvé la solution !
Raison: