Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1264

 
Roman:

Können Sie mir bitte sagen, wie ich die minimale Abtastrate bei einer Iteration einer while-Schleife messen kann?
Ich versuche es mit diesem Code, aber ich bin nicht sicher, ob ich richtig messe.


void OnStart()
{
   ulong time[]; 
   ulong t = 0;  
   int   i = 0;
   ArrayResize(time, 30);      
   ulong startTime=GetTickCount64();
   uint iterations=0;
   while(i < 30 && !_StopFlag )
   {
      //t = GetMicrosecondCount();
      //t = GetMicrosecondCount() - t;      
      iterations++;
      
      ArrayFill(time, i, 1, t);
      i++;   
   }
   if (iterations) {
      ulong endTime=GetTickCount64();
      ulong avgTime=(startTime-endTime)/iterations; // среднее время 1-й итерации
   }
   ArrayPrint(time);
}
 
Maxim Kuznetsov:

Ah, ich verstehe, was Sie meinen.
Ich habe es ein wenig anders geschrieben.

void OnStart()
{   
   uint  iterations = 1;   
   ulong startTime  = GetMicrosecondCount();   
   
   while(iterations == 1 && !_StopFlag )
   {            
      iterations++;         
   }
   
   ulong endTime = GetMicrosecondCount() - startTime;
   
   Print(IntegerToString(fabs(endTime)));
}

Es stellt sich heraus, dass es sich um 0 oder 1 Mikrosekunde handelt.
Unterhalb von Mikrosekunden kann sie nicht überprüft werden.

 
Roman:

Ah, ich verstehe, was Sie meinen.
Ich habe es ein wenig anders geschrieben.

Es stellt sich heraus, dass es sich um 0 oder 1 Mikrosekunde handelt.
Unterhalb von Mikrosekunden können Sie nicht prüfen.

Es wäre besser, die Anzahl der Iterationen zu zählen. Bei den heutigen CPU-Frequenzen wird das natürlich weniger als eine Mikrosekunde sein. Zum Beispiel, zwischen den Zecken)

void OnStart()                                  // Спец. функция OnStart()
  {
   int i, Count;                             // Объявление переменных
   for (i=1; i<=5; i++)                      // Покажем для 5 тиков
     {
      Count=0;                               // Сброс счётчика
      while(RefreshRates()==false)           // До тех пор, пока..
        {                                   //..придёт новый тик
         Count = Count+1;                    // Счётчик итераций 
        }
      Alert("Тик ",i,", циклов ",Count);     // После каждого тика
     }
   return;                                   // Выход из start()
  }
//--------------------------------------------------------------------
 
Valeriy Yastremskiy:

Es ist besser, die Anzahl der Iterationen zu zählen. Bei den heutigen CPU-Frequenzen wird das natürlich weniger als eine Mikrosekunde sein. Zum Beispiel zwischen Zecken)

Wahrscheinlich besser, aber das ist nicht der Punkt.
Wir müssen auf Nanosekunden heruntergehen, also sollten wir eine DLL mit eigenen Funktionen für Zeitprüfungen schreiben.
Ich frage mich nur, mit welcher Diskretion sich die Schleife dreht.

 

Wie kann ich feststellen, welcher Auftrag zuletzt abgeschlossen wurde?

Oder wie hoch war der Gewinn bei den letzten 5 abgeschlossenen Aufträgen?


OrdersHistoryTotal()-1 - gibt die Position der Bestellung in der Historie mit dem höchsten Ticket zurück.


Wenn ein Geschäft mit dem Ticket 100 geschlossen wird und eine Stunde später ein Geschäft mit dem Ticket 99 geschlossen wird, dann zeigt OrdersHistoryTotal()-1 auf#100, aber wie können wir Informationen über den Auftrag #99 erhalten?

---

Das Dümmste, was mir einfällt, ist, die Historie in einem Array zu speichern, es nach Abschlusszeit zu sortieren und aus dem Array zu lesen, was ich brauche. Aber das ist super suboptimal.

 
Roman:

Wahrscheinlich besser, aber das ist nicht der Punkt.
Wenn wir auf Nanosekunden heruntergehen müssen, sollten wir eine DLL mit eigenen Zeitprüfungsfunktionen schreiben.
Ich bin nur neugierig auf die Abtastrate, mit der die Schleife läuft.

mit der Frequenz eines freien Kerns multipliziert mit der Anzahl der freien Kerne. 2 - 10 Gigahertz sollten es schon sein, wenn keine anderen Aufgaben anstehen und die Schleife nur zählt. Die Geschwindigkeit hängt von der CPU- und Speicherauslastung, der Priorität der externen Aktionen zum Zeitpunkt der Schleifenausführung sowie von den internen Aktionen in der Schleife ab. Außerdem sind Additions- und Zuweisungsoperationen schneller als das Lesen und Schreiben in/aus einem Array, soweit ich weiß.

 
Valeriy Yastremskiy:

mit der Frequenz der freien Kerne multipliziert mit der Anzahl der freien Kerne. 2 - 10 Gigahertz irgendwo, wenn es keine anderen Aufgaben gibt und die Schleife nur zählt. Außerdem sind Additions- und Zuweisungsoperationen schneller als das Lesen oder Schreiben in/aus Arrays.

Ich danke Ihnen. Ich hab's.

 
Wer kann beim Schreiben eines Handelsroboters helfen?
 
paradisehell1:
Wer kann beim Schreiben eines Handelsroboters helfen?

von diesen Robotern sind schon so viele geschrieben worden - ich glaube nicht, dass es keinen gibt, den Sie haben wollen.

 

Guten Morgen zusammen!


Frage: Wie kann man am einfachsten die Höchst- und Tiefstwerte eines Balkens ermitteln?

DieÖffnungs-/Schließungszeit der Bar ist uninteressant.

Auf MT4.

Ich danke Ihnen!

Grund der Beschwerde: