Mein Ansatz. Der Kern ist der Motor. - Seite 126

 
Nikolai Semko:
Wenn es MT4 ist, dann ja.
Soweit ich weiß, unterstützt MT5 im Gegensatz zu MT4 Multi-Core und Multi-Threading vollständig.

Es scheint, dass Sie OpenCL verwenden müssen, um die Last zu verringern. Aber MT4 hat sie nicht. Oder Sie können sich einfach damit abfinden.

Eine andere Variante besteht darin, dem Benutzer die Möglichkeit zu geben, die Geschwindigkeit des Neuaufbaus der Animation einzustellen. In diesem Fall kann er die Belastung des Prozessors bei Bedarf verringern und bei Bedarf wieder erhöhen.

 
Реter Konow:

Es sieht so aus, als müssten Sie OpenCL verwenden, um die Last zu verringern. Aber MT4 hat sie nicht. Oder sich einfach damit abfinden.

Eine weitere Möglichkeit besteht darin, dem Benutzer die Möglichkeit zu geben, die Geschwindigkeit des Neuaufbaus der Animation einzustellen. In diesem Fall kann er die Belastung des Prozessors bei Bedarf verringern und bei Bedarf wieder erhöhen.

Ich habe bereits zu MT5 gewechselt.
Es ist interessant, die Arbeit von zwei EAs in MT5 zu testen, die auf verschiedenen Fenstern installiert sind, aber mit den Ressourcen von nur einem Fenster arbeiten. Schließlich hat jeder EA seinen eigenen Thread, und wie Sie wissen, können Sie nicht mehr als einen EA in ein Fenster stellen.
 
Nikolai Semko:
Es ist interessant, in MT5 die Arbeit von zwei EAs zu testen, die auf verschiedenen Fenstern installiert sind, aber nur mit den Ressourcen eines Fensters arbeiten. Denn jeder EA hat seinen eigenen Thread und wie Sie wissen, können Sie nicht mehr als einen Expert Advisor in einem Fenster platzieren.

In MT4 hat jeder EA auch seinen eigenen Thread. Wenn ich mich nicht täusche...

Das Gewinde ist unterschiedlich, aber der Prozessor ist für alle derselbe...

Ich denke, das ist der Grund für die Erstellung eines Diagramms.

 

Es gibt noch eine weitere Nuance.

Wenn die Animation zyklisch ist (wie ein Gif), müssen Sie das Pixel-Array nicht ständig neu initialisieren. Sie können einen Zyklus des Zeichnens der Animation durchlaufen und jedes Bild in einer Ressource speichern. Als Nächstes schalten Sie einfach das Bild um. Teilweise habe ich dies umgesetzt und dadurch mehrere Animationsgeschwindigkeiten erreicht (am Anfang war die Animationsgeschwindigkeit schrecklich, weil ich jedes Mal das Originalbild neu gezeichnet habe und dann ein neues Bild darauf gezeichnet habe).

 
Реter Konow:

In MT4 hat jeder EA auch seinen eigenen Thread. Wenn ich mich nicht täusche...

Das Gewinde ist unterschiedlich, aber der Prozessor ist für alle derselbe...

Ich glaube, deshalb haben sie eine grafische Karte erstellt.

Um den Unterschied zwischen MT4 und MT5 zu verdeutlichen, lassen Sie diesen Code auf beiden Plattformen laufen (der Code funktioniert dort und dort) und Sie werden sehen, dass er auf MT4 viel langsamer läuft:

#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:

Um den Unterschied zwischen MT4 und MT5 zu verdeutlichen, führen Sie diesen Code auf beiden Plattformen aus (der Code funktioniert dort und dort) und Sie werden sehen, dass er im MT4 um eine Größenordnung langsamer ist:

Ja, legen Sie sie dort und dort ab. Der Unterschied beträgt etwa den Faktor 10. Genau, denn in MT5 werden die Arrays 10 Mal oder schneller initialisiert. Ich habe es überprüft.

Aber auch auf MT4 sollte alles viel schneller gehen. Schließlich wird das Bild nur neu gezeichnet. Anders verhält es sich, wenn Sie die Daten wiederholt in einem Array verarbeiten.

Ich weiß nicht, warum es auf MT4 so langsam ist.

 

Vielleicht liegt es aber auch daran, dass Sie JEDES Pixel im gesamten Canvas-Bereich in der Größe des Diagramms neu initialisieren.

In meiner Animation werden nur einzelne Bereiche gezeichnet, und der Hauptteil des Bildes wird vollständig aus der Ressource übernommen. Der Hauptteil entfällt, und das Bild wird vollständig erstellt. Daher verlangsamt sie sich.

Das liegt an der Größe der Zeichnung.

 
Реter Konow:

Vielleicht geht es aber auch darum, dass Sie JEDES Pixel im gesamten Canvas-Bereich in der Größe des Diagramms neu initialisieren.

In meiner Animation werden nur einzelne Bereiche gezeichnet, und der Hauptteil des Bildes wird vollständig aus der Ressource übernommen. Der Hauptteil entfällt, und das Bild wird vollständig erstellt. Deshalb verlangsamt sie sich.

Das liegt an der Größe der Zeichnung.

Was für ein Unterschied. Dies ist ein absichtlich extremes Beispiel, das die Vorteile von mt5 in Bezug auf die Geschwindigkeit von Kanvas deutlich macht. Und dieses Thema ist in Ihrem Kopf archiviert. Deshalb sage ich schon seit langem: Gehen Sie zu MQL5.
Es bleibt eine Tatsache. Das Framing von Bildern ist bei mt5 10 Mal schneller als bei mt4. Und das ist ein sehr überzeugendes Argument.
 
Nikolai Semko:
Was für ein Unterschied. Dies ist ein absichtlich extremes Beispiel, das die Vorteile von mt5 bei der Geschwindigkeit des Kanvas deutlich macht. Und dieses Thema ist in Ihrem Kopf archiviert. Deshalb sage ich schon seit langem: Gehen Sie zu MQL5.
Die Tatsache bleibt bestehen. Das Imaging auf MT5 ist 10 Mal schneller als auf MT4. Und das ist ein sehr stichhaltiges Argument.

Die Nachteile von MT4, sind das, was in der Entwicklung benötigt wird. Sie müssen nicht vor ihnen weglaufen. Sie zwingen Sie zum Nachdenken und zur Verbesserung Ihrer Lösungen.

Auf MT5 müssen Sie sich auch nicht besonders anstrengen. Alles funktioniert auch so schon schnell genug. Daher ist die Umstellung auf MT5 in der letzten Phase geplant.

 
Реter Konow:

Schließlich ist die dynamische Tabelle fertig. Ich muss sagen, dass es nicht einfach war. Es stellt sich heraus, dass es eine Menge Nuancen gibt.

Außerdem ist diese Tabelle "bedingt" dynamisch. Das heißt, die maximale Anzahl von Zeilen ist vorgegeben. Es war noch nicht möglich, "absolut" dynamisch zu sein.

Diese Tabelle hat 20 mögliche Zeilen. Es können also 20 offene Positionen angezeigt werden. Wir könnten noch mehr machen, aber das ist erst einmal nur eine Demonstration.

Klicken Sie zur Ansicht.

Hier sind die Verbindungsdateien (in der Aufnahme), die Engine (im Indikatorenordner) und die test.EA (im Expertenordner):

Peter, es tut mir leid, aber Ihre Arbeit wird nicht akzeptiert, da das, was Sie geschickt haben, ein seltener Hackjob ist. Es tut mir leid, aber es scheint, dass ich der Einzige bin, der das, was Sie geschickt haben, überprüft hat, und außer mir wird es niemand überprüfen.

Die Aufgabenstellung lautete also der Reihe nach wie folgt:

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Mein Ansatz. Kern - Motor.

Vasiliy Sokolov, 2018.12.26 13:29

Peter, hier ist die Aufgabe. Erstellen Sie ein Panel, das die aktuellen Auftragseröffnungen im MT4 anzeigt. Es ist nicht nötig, eine vollständige Kopie des Systempanels zu erstellen, sondern es wird nur eine einfache Tabelle mit den grundlegenden Eigenschaften der offenen Aufträge angezeigt: Eröffnungskurs, Richtung, Gewinn. Der Rest ist Ihnen überlassen. Das Wichtigste ist, dass mit dem Abschluss eines Auftrags auch dessen Anzeige in Ihrer Tabelle verschwindet. Umgekehrt würde sie in dieser Tabelle erscheinen, wenn ein neuer Auftrag eröffnet wird.

Was ich stattdessen sehe:

Erstens können Geschäfte in Ihrem Panel nur durch Klicken auf die Schaltfläche Kaufen/Verkaufen eröffnet werden. Wenn eine Position über das Standardfenster eröffnet wird, wird der Handel nicht angezeigt.

Zweitens werden einige Aufträge mit leeren Werten angezeigt. Sie sind in der Tabelle vorhanden, aber die Zeilen sind leer.

Drittens (und das ist wirklich gruselig), wenn wir einen Auftrag über den Standarddialog schließen, verschwindet er nicht aus der Tabelle. Aber das Traurigste ist, dass, wenn Sie das Panel neu laden, die geschlossenen Aufträge wieder als angeblich offen angezeigt werden! Was ist das? Warum speichern Sie irrelevante Informationen irgendwo und versuchen dann, sie zu laden?

Viertens: Was zum Teufel sind 20 Aufträge? Ich habe kein Wort über diese Einschränkung in meinem Auftrag! Das wurde absichtlich so gemacht, um zu testen, ob Ihr Motor mit einer dynamischen und bisher unbekannten Umgebung arbeiten kann. Der Auftrag wurde nicht willkürlich ausgewählt, sondern Sie haben meine Anforderungen so geändert, dass er alle "scharfen Ecken" Ihres Motors verdeckt. Aber die Aufgabe wurde gestellt, um diese Winkel zu zeigen.

Fünftens brauchen Sie das nicht zu tun, wenn Sie einen Stop-Loss oder Take-Profit setzen. Lassen Sie diese Felder leer.

Und ja, die Schaltfläche zum Schließen der Position (Kreuz) in Ihrem Panel funktioniert auch nicht.

Kurz gesagt, Peter. Es tut mir leid, aber was Sie mir geschickt haben, ist ein totaler Reinfall. Reparieren Sie es bitte gemäß der Spezifikation.

Ich werde die Aufgabe noch einmal erläutern, damit es keine Fragen gibt:

  1. Die Tabelle ist dynamisch und zeigt die gleichen Aufträge wie auf der Registerkarte Handel. Wenn keine Bestellungen auf der Registerkarte vorhanden sind, werden sie auch nicht in der Tabelle angezeigt.
  2. Die Anzahl der angezeigten Aufträge in Ihrer Tabelle sollte alles sein. Es gibt keine Einschränkungen von oben.
  3. Wenn Sie einen Auftrag über das Standarddialogfenster öffnen, sollte der Auftrag in Ihrer Tabelle erscheinen. Das Abschließen des Auftrags mit den üblichen Mitteln sollte dazu führen, dass der Auftrag in Ihrer Tabelle verschwindet.
  4. Ein nicht konsistenter Zustand ist nicht akzeptabel! Wenn Ihre Tabelle etwas anzeigt und die Registerkarte "Handel" etwas anderes, ist dies ein Fehler.

Bislang ein fettes No-Go. Ich warte auf Ihre Verfeinerungen. Und keine 3D-Renderings, bis Sie es herausgefunden haben!
Grund der Beschwerde: