MT5 und Geschwindigkeit in Aktion - Seite 52

 

Umgestaltet für ein Makro

#define  µsSLEEP(µsRange)                              \
        {                                             \
           ulong c = GetMicrosecondCount() + µsRange; \ 
           while(GetMicrosecondCount() < c);          \
        }


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   while(!_StopFlag)
   {
      µsSLEEP(5000000);
      Print("Прошло 5000000 микросекунд");
   }
}
 
Roman:

Natürlich kann er mehr als nur einen Kern bedienen.

Ich meinte, während ohne Schlaf.

Es ist klar, dass Schlupf hier nicht geeignet ist, weil wir Mikrosekunden brauchen. Aber es wird auch ohne sie brummen...

 
Andrey Khatimlianskii:

Ich meinte, während ohne Schlaf.

Es ist klar, dass Schlupf hier nicht funktioniert, denn wir brauchen Mikrosekunden. Aber es brummt auch ohne sie.

Natürlich brummt es ohne Schlupf.
Der ZählerGetMicrosecondCount läuft

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   ulong µs = 0;
   
   while(!_StopFlag)
   {
      µs = GetMicrosecondCount();
      
      Comment((string)µs);
      ChartRedraw();      
   }
   
   Comment("");   
}
 
Roman:

Natürlich dreht es sich ohne Schlupf.
Der Zähler GetMicrosecondCount läuft.

Es ist nicht nur der Zähler, der belastet wird. Eine leere Endlosschleife lädt sie ebenfalls. Das ist es, was ich meine.

Generell eine schlechte Lösung. Aber ich werde es nicht besser vorschlagen.

 
Andrey Khatimlianskii:

Es ist nicht nur der Zähler, der belastet wird. Eine leere Endlosschleife wird ebenfalls geladen. Das ist es, was ich meine.

Alles in allem ist das eine schlechte Lösung. Aber ich werde es nicht besser vorschlagen.

Eine leere Schleife schöpft also das volle Potenzial der Taktzyklen des Prozessors aus.
Ich verstehe die Beschwerde über eine schlechte Lösung nicht. Wenn es für Ihre Ressourcen nicht geeignet ist, bedeutet das nicht, dass es schlecht ist.
µsSLEEP gibt Ihnen eine geringere Schleifenlatenz als der Standard-Sleep(1), d.h. in Mikrosekunden, nicht in Millisekunden.
Die 5000000 in den obigen Beispielen sind nur ein Beispiel, die tatsächliche Häufigkeit im Kampf würde weniger als 1 ms betragen.

Ich verstehe Ihr Problem nicht.
Brauchen
Sie es, um frei von Stress zu sein?
Setzen Sie ein regelmäßiges Sleep(20); in Millisekunden

 
Roman:

So kann der Leerlauf verständlicherweise das volle Potenzial der Prozessortaktzyklen ausschöpfen.
Ich verstehe die Beschwerde über eine schlechte Lösung nicht. Wenn es nicht zu Ihren Ressourcen passt, bedeutet das nicht, dass es schlecht ist.
µsSLEEP gibt Ihnen eine geringere Schleifenlatenz als der Standard-Sleep(1), d.h. in Mikrosekunden, nicht in Millisekunden.
Die 5000000 in den obigen Beispielen sind nur ein Beispiel, die tatsächliche Häufigkeit im Kampf würde weniger als 1 ms betragen.

Ich verstehe Ihr Problem nicht.
Brauchen
Sie es, um frei von Stress zu sein?
Put regular Sleep(20); in Millisekunden.

Es gab keine Beanstandungen.
Ich brauche so einen Timer nicht, ich habe ihn nur aus Interesse studiert. Ich halte dies jedoch für eine schlechte Lösung, da sie den Prozessor unnötig belastet.

Und wozu brauchen Sie den Mikrosekundenschlupf?

 
Andrey Khatimlianskii:

Es gab keine Beschwerde.
Ich brauche einen solchen Timer nicht, ich habe ihn nur aus Interesse studiert. Aber ich finde die Lösung schlecht, da sie den Prozessor unnötig belastet.

Wozu brauchen Sie einen Mikrosekundenzettel?

Wenn Sie sich fragen würden, warum er lädt, und herausfinden würden, warum, hätten Sie diese Meinung nicht.
Wenn Sie weniger als 1 ms wollen, müssen Sie dafür mit Ressourcen bezahlen.
Und es scheint mir, dass man es nicht entladen kann, weil man einen Mikrosekunden-Timer braucht, um das Intervall zu zählen.
Auf der anderen Seite, wenn Mikrosekunden-Timer läuft ständig und gibt Last gleich leer, während,
dann gibt es eine Frage, warum diese Verzögerung dann setzen, und verwenden Mikrosekunden-Timer. Aber das macht nichts, es ist lyrisch.
Ich pinge also den Server mit einer bestimmten Frequenz an, und zwar ohne Verzögerung.
Und ich brauche Mikrosekunden-Sampling, weil es unnötige Anrufe geben wird.
Ich verwende die erste Lösung, die ich bereits gepostet habe, und ich habe auch µsSleep geschrieben, das könnte sich als nützlich erweisen.


 
Andrey Khatimlianskii:


Wofür brauchen Sie einen Mikrosekundenzettel?

Hier ist eine fertige Lösung.
Print() ersetzen Sie natürlich durch Ihren eigenen Code.

#define  SEND_PING                                           \
{                                                           \   
   ulong currCount = GetMicrosecondCount();                 \
   switch((currCount - prevCount) > 5000000)                \
   {                                                        \
      case 0:                                               \
         break;                                             \
      case 1:                                               \
         prevCount = currCount;                             \
         Print("ping");                                     \
         break;                                             \
   }                                                        \
}
       

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   ulong  prevCount = 0;
   
   while(!_StopFlag)
   {
      SEND_PING;
   }  
 
}
 
Renat Fatkhullin:
In dem neuen Tester, den wir gerade schreiben, werden wir versuchen, dies zu ändern.
fxsaber:

An die PM gesendet.

Im Tester generiert dieser EA Millionen von Datensätzen mit vollständigen und sinnvollen (kein Spam) Handelsaufträgen in Form von Änderungen. Aus diesem Grund wird das Protokoll des Testers katastrophal schnell verstopft.

Diese Protokolle werden in 99 % der Fälle nicht benötigt, aber wir brauchen oft, was der Expert Advisor über Print ausgibt. Daher möchte ich Sie erneut bitten, die Möglichkeit zu prüfen, die automatische Generierung von Einträgen für jedes OrderSend-Paket im Tester zu deaktivieren.

Wenn ich das richtig verstanden habe, führt die Deaktivierung der Erzeugung solcher Strings zu einer Leistungssteigerung bei einzelnen Läufen. Das heißt, der Nutzen ist zweifach.

 
Renat Fatkhullin:


Aber AMPGlobalEU-Live (eigentlich ist es besser, danach als AMPGlobalUSA-Live zu suchen) für MetaTrader 5 mit einem physischen Plattformkern in Chicago ist tatsächlich 19,53 ms, da unsere nächsten Server in New York stehen:

Speziell gescannt alle ihre Punkte manuell - das Minimum ist 19 ms.

Wir werden versuchen, in den nächsten Tagen Server in Chicago aufzustellen. Ich bin noch nicht dazu gekommen.

Der Server in Chicago wurde in Betrieb genommen.

Innerhalb von 24 Stunden werden alle Server gescannt und mit der Verteilung der Daten begonnen.