Fehler, Irrtümer, Fragen - Seite 2099

 
Vladimir Pastushak:
Leute, ich habe es satt, meinen Benutzernamen und mein Passwort von www.mql5.com in android in mt5 einzugeben.
Warum verlieren sie ständig ihren Benutzernamen und ihr Passwort?

Ich werde auch regelmäßig gefragt, aber ich gebe meinen Benutzernamen und mein Kennwort nicht ein, sondern drücke einfach auf die Schaltfläche "Zurück", und es stellt sich heraus, dass ich angemeldet bin.

 
Nikolai Semko:

Warum ist eine sehr nützliche Funktion wie ChartXYToTimePrice() so teuer in der Ausführungszeit?

Ich habe eine Funktion analog zu XYToTimePrice() geschrieben und sie läuft viel schneller. Bis zu mehreren hundert Mal schneller.

Aber es gibt auch ChartID_in mit SubWindow_out in der ursprünglichen Funktion. Erstellen Sie eine vollständige Analogie.

 
fxsaber:

Im Original gibt es also auch ChartID_in mit SubWindow_out. Erstellen Sie eine vollständige Analogie.


DasHinzufügen von ChartID_in und SubWindow_out ist überhaupt nicht schwierig. Aber ich habe nicht vor, ein vollständiges Analogon zu erstellen, ich habe diese Funktion nur erstellt, um die Langsamkeit von ChartXYToTimePrice() zu zeigen.

void XYToTimePrice(long chart_id,int x,int y,int& sub_window,datetime &time,double &price,int id)
  {
   static int left_bar; // номер самого левого бара на экране
   static int WidBar;
   static int Wid;
   static int Hei;
   static double y_min;
   static double y_max;
   static int PerSec=PeriodSeconds();
   static bool ChartChange=true;
   if(id==CHARTEVENT_CHART_CHANGE) { ChartChange=true; return; } 
   if(ChartChange) // если было изменение чатра после последнего вычисления
     {
      left_bar=(int)ChartGetInteger(chart_id,CHART_FIRST_VISIBLE_BAR, sub_window);        // номер самого левого бара на экране
      Wid=(int)ChartGetInteger(chart_id,CHART_WIDTH_IN_PIXELS, sub_window);               // ширина экрана в пикселях
      WidBar=(int)ChartGetInteger(chart_id,CHART_WIDTH_IN_BARS, sub_window);              // ширина экрана в барах
      Hei=(int)ChartGetInteger(chart_id,CHART_HEIGHT_IN_PIXELS, sub_window);              // высота экрана в пикселях
      y_min=ChartGetDouble(chart_id,CHART_PRICE_MIN, sub_window);                         // макс. цена на экране
      y_max=ChartGetDouble(chart_id,CHART_PRICE_MAX, sub_window);                         // мин. цена на экране
     }
   if(x>Wid || x<0 || y<0 || y>Hei) return;  // выходим если точка (x,y) за пределами экрана
   price=y_min+(Hei-y)*(y_max-y_min)/Hei;
   int NrBar=left_bar-(int)((double)x/((double)Wid/(double)WidBar)); 
   datetime T[1];
   if(NrBar>=0) CopyTime(NULL,0,NrBar,1,T);
   else { CopyTime(NULL,0,0,1,T); T[0]+=fabs(NrBar)*PerSec;}
   ChartChange=false;
   time=T[0];
  }

Aber es stimmt, meine Funktion benötigt einen zusätzlichen Parameter event id. Bisher funktioniert diese Funktion mehr oder weniger genauso wie die ursprüngliche Kerzenstärke von einem Pixel, aber Sie können sie bei Bedarf verbessern.

 
Nikolai Semko:

Das Hinzufügen von ChartID_in und SubWindow_out ist überhaupt nicht schwierig. Aber ich habe nicht vor, ein vollständiges Analogon zu erstellen, ich habe diese Funktion nur erstellt, um die Langsamkeit von ChartXYToTimePrice() zu zeigen.

Aber es stimmt, meine Funktion benötigt einen zusätzlichen Parameter event id. Diese Funktion funktioniert zwar mehr oder weniger genauso wie die ursprüngliche Kerzenstärke von einem Pixel, aber Sie können sie bei Bedarf verbessern.


Und ich habe auch eine seltsame Eigenschaft von ChartXYToTimePrice bemerkt. Seine Ausführungszeit ist direkt proportional zur Anzahl der Balken im Diagramm.

Dies deutet auf einen "seltsamen" Algorithmus für seine Berechnung hin. Es handelt sich nämlich um eine zyklische Summierung, die für die optimale Lösung eines solchen Problems recht ungewöhnlich ist.

Die Geschwindigkeit der Funktion XYToTimePrice ist unabhängig von der Anzahl der Balken die gleiche.

Und um ehrlich zu sein, wird die Geschwindigkeit der Funktionen ChartGetInteger und ChartGetDouble auch deutlich überschätzt und hat sehr seltsame Eigenschaften. Zum Beispiel kann die Funktion

ChartGetDouble(0,CHART_PRICE_MAX);

ist 20-100 mal schneller als die Funktion

ChartGetDouble(0,CHART_PRICE_MIN);          

wenn MAX nach MIN liegt:

aber wenn man sie vertauscht, kehrt sich die Situation um.


D.h. es erscheint logisch - dieselbe Funktion, die wiederholt berechnet wird, verwendet bereits berechnete und gespeicherte Daten aus einem früheren Funktionsaufruf. Aber es zeigt nur einige verrückte Berechnungen und die Erstellung einer Menge von Zwischendaten und vielleicht sogar Arrays, um einen einfachen doppelten Wert des maximalen (oder minimalen) Chartpreises zu berechnen, der wahrscheinlich bereits in einer Variablen gespeichert ist und nur noch entnommen werden muss.

Ich schließe allerdings nicht aus, dass dieser Effekt auf einige Besonderheiten der Profilerstellung zurückzuführen ist und nur vorgetäuscht wird. Aber die Trägheit dieser Funktionen ist nicht nur vorgetäuscht.

 
Nikolai Semko:

sie kann bei Bedarf verfeinert werden.

Es ist wahrscheinlich immer noch gültig zu sagen, dass es richtig ist, die Geschwindigkeitscharakteristiken der beiden Funktionen zu vergleichen, wenn ihre Ergebnisse übereinstimmen. Bitte füllen Sie es aus.

 
Vladimir Pastushak:
Leute, ich bin es leid, meinen Benutzernamen und mein Passwort von www.mql5.com auf Android in mt5 einzugeben.
Warum verlieren sie ständig ihren Benutzernamen und ihr Passwort?

Schreiben Sie an servicedesk. Bitte fügen Sie die Protokolle bei. Tut mir leid. Danke.

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

fxsaber, 2017.10.04 09:13

Darüber ist schon oft geschrieben worden. Aus irgendeinem Grund nicht korrigiert.

Sieht so aus, als hätten sie das Problem bereits behoben. In Build 1730 habe ich dieses Problem nicht mehr.
 
Nikolai Semko:

Ich habe auch eine seltsame Funktion von ChartXYToTimePrice bemerkt. Seine Ausführungszeit ist direkt proportional zur Anzahl der Balken im Diagramm.

Dies zeigt die "Seltsamkeit" des Berechnungsalgorithmus. Es handelt sich nämlich um eine zyklische Summierung, die für die optimale Lösung eines solchen Problems recht ungewöhnlich ist.

Die Geschwindigkeit der Funktion XYToTimePrice ist unabhängig von der Anzahl der Balken die gleiche.

Und um ehrlich zu sein, wird die Geschwindigkeit der Funktionen ChartGetInteger und ChartGetDouble auch deutlich überschätzt und hat sehr seltsame Eigenschaften. Zum Beispiel kann die Funktion

ist 20-100 mal schneller als die Funktion

wenn MAX nach MIN liegt:

aber wenn man sie vertauscht, kehrt sich die Situation um.


D.h. es erscheint logisch - dieselbe Funktion, die wiederholt berechnet wird, verwendet bereits berechnete und gespeicherte Daten aus einem früheren Funktionsaufruf. Aber es zeigt nur einige verrückte Berechnungen und die Erstellung einer Menge von Zwischendaten und vielleicht sogar Arrays, um einen einfachen doppelten Wert des maximalen (oder minimalen) Chartpreises zu berechnen, der wahrscheinlich bereits in einer Variablen gespeichert ist und nur noch entnommen werden muss.

Ich schließe jedoch nicht aus, dass dieser Effekt auf einige Besonderheiten der Profilerstellung zurückzuführen ist und nur vorgetäuscht wird. Aber die Trägheit dieser Funktionen ist nicht nur vorgetäuscht.

Die Langsamkeit der Funktionen zur Anforderung von Diagrammdaten liegt in der Art und Weise, wie die Informationen gesendet und empfangen werden, und nicht in der Implementierung selbst. Die Implementierung dieser Funktionen selbst ist primitiv und hängt nicht von der Anzahl der Balken im Diagramm ab.

Da es sich bei der Karte jedoch um ein Objekt handelt, dessen Informationen auf viele Quellen verteilt sind, basiert die gesamte Steuerung auf Nachrichtenwarteschlangen. Bis die vorherige Anfrage bearbeitet ist, wartet die nächste.

Wenn Sie jedoch mehrere Anfragen für dasselbe Diagramm hintereinander haben, werden diese aufeinander folgenden Anfragen sehr schnell ausgeführt. Das liegt daran, dass niemand Zeit hatte, sich zwischen sie und den ersten Antrag zu schieben.

 
Slava:

Der Engpass bei den Funktionen zur Anforderung von Diagrammdaten liegt in der Art und Weise, wie die Informationen gesendet und empfangen werden, und nicht in der Implementierung selbst. Die Implementierung dieser Funktionen selbst ist primitiv und hängt nicht von der Anzahl der Balken im Diagramm ab.

Da es sich bei der Karte jedoch um ein Objekt handelt, dessen Informationen auf viele Quellen verteilt sind, basiert die gesamte Steuerung auf Nachrichtenwarteschlangen. Bis die vorherige Anfrage bearbeitet ist, wartet die nächste.

Wenn Sie jedoch mehrere Anfragen für dasselbe Diagramm hintereinander haben, werden diese aufeinander folgenden Anfragen sehr schnell ausgeführt. Das liegt daran, dass niemand Zeit hatte, sich zwischen sie und die erste Anfrage zu stellen.


So soll es sein. Aber diese Erkenntnis macht es nicht leichter. Slava, verstehen Sie einen einfachen Programmierer nicht falsch. Mein Beispiel eines Testindikators aus früheren Meldungen zeigt deutlich, dass die durchschnittliche Laufzeit einerChartXYToTimePrice()-Anfrage 5000 - 10000 Mikrosekunden beträgt (bei der Dicke einer Kerze von 1 Pixel und dem Standard-MT-Fenster auf dem FullHD-Bildschirm). Was kann man in dieser Zeit tun?

In dieser Zeit können Sie zum Beispiel ein Bild mit 500 schattierten Kreisen auf demselben Bildschirm erstellen und auf dem Bildschirm anzeigen:

Auch wenn es eine Warteschlange gibt, aber warum ist sie so lang in der Warteschlange?
Auf der einen Seite der Skala werden Pixel für Pixel 500 Kreise erzeugt und auf dem Bildschirm ausgegeben, und auf der anderen Seite wird eine einfache Abfrage nach zwei Ziffern durchgeführt. Und es wiegt dasselbe.
Ein einfacher Programmierer sitzt da, kratzt sich am Kopf und kann die Puzzles nicht zusammensetzen.

 
Nikolai Semko:

So soll es sein. Aber das macht die Sache nicht einfacher. Slava, verstehen Sie einen einfachen Programmierer nicht falsch. Mein Beispiel eines Testindikators aus den vorangegangenen Nachrichten zeigt deutlich, dass die durchschnittliche Ausführungszeit derChartXYToTimePrice() Anfrage5000 - 10000 Mikrosekunden beträgt (bei einer Kerzenbreite von 1 Pixel und MT-Standardfenster auf FullHD-Bildschirm). Was kann man in dieser Zeit tun?

In dieser Zeit ist es beispielsweise möglich, auf demselben Bildschirm ein Bild mit 500 schattierten Kreisen zu erstellen und diese auf dem Bildschirm anzuzeigen:

Auch wenn es eine Warteschlange gibt, aber warum ist die Schlange so lang?
Auf der einen Seite der Skala werden Pixel für Pixel 500 Kreise gebildet und auf dem Bildschirm angezeigt, auf der anderen Seite eine einfache zweistellige Abfrage. Und es wiegt dasselbe.
Ein einfacher Programmierer sitzt da und kratzt sich am Kopf und kann die Puzzles nicht zusammensetzen.

Sie haben den Unterschied zwischen einem synchronen Befehl und einem asynchronen Befehl erkannt.