Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 88

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

fxsaber, 2016.07.19 12:41

Wozu gibt esENUM_DEAL_PROPERTY_INTEGER::DEAL_TICKET, wenn die einzige Stelle, an der es angewendet werden kann, HistoryDealGetInteger(TicketDeal, DEAL_TICKET) ist?

Am Beispiel von ORDER_TICKET sollte die Idee deutlich werden.

Forum zum Thema Handel, automatische Handelssysteme und Testen von Handelsstrategien

OrderCloseTime () in MQL5?

fxsaber, 2018.07.18 03:51

datetime OrderCloseTime( const ulong Ticket )
{
  return((HistoryOrderGetInteger(Ticket, ORDER_TICKET) == Ticket) || HistoryOrderSelect(Ticket) ? (datetime)HistoryOrderGetInteger(Ticket, ORDER_TIME_DONE) : 0);
}

So können wir überprüfen, ob die aktuelle History-Tabelle, die zuvor mit der HistorySelect-Funktion erstellt wurde, den benötigten Datensatz enthält. Dasselbe gilt für DEAL_TICKET.

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Speichern des Preisniveaus der Position durch Clearing (ist das möglich?)

fxsaber, 2018.07.17 20:45

// Возвращает цену открытия выбранной позиции без учета клиринга
double GetSummaryPositionPrice()
{
  double TotalVolume = 0;
  double TotalDealPrice = 0;
  
  if (HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER)))
  {
    const int DealsTotal = HistoryDealsTotal();
    
    for (int i = 0; i < DealsTotal; i++)
    {
      const ulong DealTicket = HistoryDealGetTicket(i);
      
      if (HistoryDealGetInteger(DealTicket, DEAL_ORDER))
      {
        const double DealVolume = (HistoryDealGetInteger(DealTicket, DEAL_TYPE) ? -1 : 1) * HistoryDealGetDouble(DealTicket, DEAL_VOLUME);
        const double DealPrice = HistoryDealGetDouble(DealTicket, DEAL_PRICE);
  
        if (TotalVolume * DealVolume >= 0)
          TotalDealPrice = (TotalDealPrice * TotalVolume + DealPrice * DealVolume) / (TotalVolume + DealVolume);
        else if (MathAbs(DealVolume) - MathAbs(TotalVolume) > 0.005)
          TotalDealPrice = DealPrice;
          
        TotalVolume += DealVolume;
      }      
    }
  }
  
  return(TotalDealPrice);
}
 

Nicht jeder weiß, dass die Funktion GetMicrosecondCount im Gegensatz zu GetTickCount an die lokale Computerzeit gekoppelt ist, d.h. wenn sich diese Zeit ändert (z.B. durch die Synchronisation mit der Internet-Zeit), ändern sich auch die GetMicrosecondCount-Werte um einen entsprechenden Wert.Dies ist zu beachten, wenn diese Funktion zur Messung von Zeitintervallen verwendet wird; eigentlich sollte sie für diesen Zweck nicht verwendet werden. GetTickCount hingegen hat diese Probleme nicht.

Zu Demonstrationszwecken können Sie diesen Code ausführen und die Uhrzeit des Computers ändern, während er läuft.

  datetime time= TimeLocal();
  ulong    microsec= GetMicrosecondCount();
  uint     ticks= GetTickCount();
  
  while(!IsStopped())
  {
    Comment(int(TimeLocal()-time),"   ",(GetMicrosecondCount()-microsec)/1000000,"   ",(GetTickCount()-ticks)/1000);
    Sleep(10);
  }
 
Alexey Navoykov:

Vielleicht weiß nicht jeder, dass die Funktion GetMicrosecondCount im Gegensatz zu GetTickCount an die lokale Computerzeit gebunden ist.

Das wusste ich nicht, vielen Dank!

 

Eine Variante der Funktion GetTickCount, die Überläufe vermeidet (vorausgesetzt, das Intervall zwischen den Aufrufen der Funktion beträgt nicht mehr als 50 Tage)

ulong GetTickCountLong()
{
  static ulong sum=0;
  static uint  lasttickcount=0;
  uint tickcount= GetTickCount();
  if (tickcount<lasttickcount) sum+=0x100000000;
  lasttickcount= tickcount;
  return sum + tickcount;
}
 
Alexey Navoykov:

Es ist vielleicht nicht bekannt, dass die Funktion GetMicrosecondCount im Gegensatz zu GetTickCount an die lokale Computerzeit gekoppelt ist, d.h. wenn sich diese Zeit ändert (z.B. durch Synchronisation mit der Internet-Zeit), ändern sich auch die GetMicrosecondCount-Werte um einen entsprechenden Wert.Dies ist zu beachten, wenn diese Funktion zur Messung von Zeitintervallen verwendet wird; eigentlich sollte sie für diesen Zweck nicht verwendet werden. GetTickCount hingegen hat diese Probleme nicht.

Um dies zu demonstrieren, können Sie diesen Code ausführen und die Zeit des Computers während der Ausführung des Codes ändern.

Nun, dies ist ein Fehler, den die Entwickler beheben sollten. Die Funktion entspricht dann nicht der Beschreibung:

Функция GetMicrosecondCount() возвращает количество микросекунд, прошедших с момента начала работы MQL5-программы.
Der Wert dieser Funktion im Vergleich zu GetTickCount ist Mikrosekunden, nicht Millisekunden (1000-mal höhere Genauigkeit). Außerdem ist sie nicht aufblasbar.
Deshalb ist es nicht ganz richtig, von seiner Substituierbarkeit zu sprechen.
 
Alexey Navoykov:

Nicht jeder weiß, dass die Funktion GetMicrosecondCount im Gegensatz zu GetTickCount an die lokale Computerzeit gekoppelt ist, d.h. wenn sich diese Zeit ändert (z.B. durch die Synchronisation mit der Internet-Zeit), ändern sich auch die GetMicrosecondCount-Werte um einen entsprechenden Wert.Dies ist zu beachten, wenn diese Funktion zur Messung von Zeitintervallen verwendet wird; eigentlich sollte sie für diesen Zweck nicht verwendet werden. GetTickCount hingegen hat diese Probleme nicht.

Um dies zu demonstrieren, können Sie diesen Code ausführen und die Uhrzeit des Computers ändern, während er läuft.

Eine weitere wichtige Beobachtung - daraus folgt, dass es absolut unangebracht ist, die Funktion GetTickCount anstelle von GetMicrosecondCount zu verwenden.
Ich denke, es wird für viele eine Überraschung sein.

Untersuchen Sie die Funktionsweise eines einfachen Skripts:

void OnStart()
  {
   uint i=GetTickCount();
   uint i0=GetTickCount();
   while(i==i0) i0=GetTickCount(); 
   
   int N1=1;
   ulong t1=GetMicrosecondCount();
   uint i1=GetTickCount();
   uint i2=GetTickCount();
   while(i1==i2) { i2=GetTickCount(); N1++;}
   t1=GetMicrosecondCount()-t1;
   
   ulong t=GetMicrosecondCount();
   ulong t0=GetMicrosecondCount();
   while(t==t0) t0=GetMicrosecondCount(); 
   int N2=1;
   ulong t2=GetMicrosecondCount();
   ulong t3=GetMicrosecondCount();
   while(t2==t3) { t3=GetMicrosecondCount(); N2++;}
   ulong t4=t3-t2;

   Print("1 значение в милисекундах:  " +(string)i1+", следующее значение   "+ (string)i2 + ", разница - " +(string)t1 + 
   " микросекунд, время выполнения функции GetTickCount (одного прохода цикла) = " +DoubleToString((double)t1*1000.0/N1,3)+ " наносекунды");
   
   Print("1 значение в микросекундах: " +(string)t2+", следующее значение   "+ (string)t3 + ", разница - " +(string)t4 + 
   " микросекунд, время выполнения функции GetMicrosecondCount (одного прохода цикла) = " +DoubleToString((double)t4*1000.0/N2,3)+ " наносекунды");
  }

Das Ergebnis der Arbeit:

2018.07.27 00:23:02.261 TestTimeCount   1 значение в милисекундах:  25225093, следующее значение   25225109, разница - 15663 микросекунд, время выполнения функции GetTickCount (одного прохода цикла) = 2.323 наносекунды
2018.07.27 00:23:02.261 TestTimeCount   1 значение в микросекундах: 20247, следующее значение   20248, разница - 1 микросекунд, время выполнения функции GetMicrosecondCount (одного прохода цикла) = 33.333 наносекунды
2018.07.27 00:23:03.590 TestTimeCount   1 значение в милисекундах:  25226421, следующее значение   25226437, разница - 15586 микросекунд, время выполнения функции GetTickCount (одного прохода цикла) = 2.324 наносекунды
2018.07.27 00:23:03.590 TestTimeCount   1 значение в микросекундах: 22835, следующее значение   22836, разница - 1 микросекунд, время выполнения функции GetMicrosecondCount (одного прохода цикла) = 30.303 наносекунды
2018.07.27 00:23:04.920 TestTimeCount   1 значение в милисекундах:  25227750, следующее значение   25227765, разница - 15657 микросекунд, время выполнения функции GetTickCount (одного прохода цикла) = 2.309 наносекунды
2018.07.27 00:23:04.920 TestTimeCount   1 значение в микросекундах: 23701, следующее значение   23702, разница - 1 микросекунд, время выполнения функции GetMicrosecondCount (одного прохода цикла) = 27.027 наносекунды

können wir die folgenden Schlussfolgerungen ziehen:

  • Der Wert der Funktion GetTickCount() ändert sich nicht jede Millisekunde, sondern alle 15,625Millisekunden(1/64 einer Sekunde, 64=2^6), während sich der Wert der Funktion GetMicrosecondCount() alle Mikro zweitens. Das bedeutet, dass die Funktion GetMicrosecondCount 15625 Mal genauer ist als GetTickCount, nicht 1000 Mal.
  • aber die Funktion GetTickCount() ist etwa 12-15 Mal schneller als GetMicrosecondCount().
 
Nikolai Semko:

Das ist ein Fehler, der von den Entwicklern behoben werden sollte. Denn dann entspricht die Funktion nicht der Beschreibung:

Der Wert dieser Funktion im Vergleich zu GetTickCount ist Mikrosekunden, nicht Millisekunden (1000 mal genauer). Außerdem ist er nicht aufblasbar.
Deshalb ist es nicht ganz richtig, von seiner Substituierbarkeit zu sprechen.

Wenn Sie die Ausführungszeit einiger Programmabschnitte messen, gleichen Schwankungen in der Systemleistung diese Genauigkeit aus, und es ergibt sich ein Fehler in Millisekunden oder sogar Zehntelmillisekunden. Wenn Sie sehr kleine Segmente mit einer Dauer von weniger als 1 Millisekunde messen, ist das sinnlos. Der Anteil des Messfehlers wird sehr hoch sein.

 
Alexey Navoykov:

Ich habe noch keine praktische Anwendung von Mikrosekunden gesehen. Wenn Sie die Ausführungszeit einiger Programmabschnitte messen, werden Schwankungen in der Systemleistung all diese Genauigkeit zunichte machen, und der Fehler liegt bei Millisekunden oder sogar einigen zehn Millisekunden. Wenn Sie sehr kleine Segmente mit einer Dauer von weniger als 1 Millisekunde messen, ist das sinnlos. Der Messfehler wird sehr hoch sein.

  1. siehe meinen vorherigen Beitrag
  2. Ich habe viele Beispiele für die praktische Anwendung von Mikrosekunden.

 
Nikolai Semko:

Eine weitere wichtige Beobachtung legt nahe, dass die Verwendung der Funktion GetTickCount anstelle von GetMicrosecondCount völlig ungeeignet ist.
Ich denke, es wird für viele Programmierer eine Überraschung sein.

Untersuchen Sie die Funktionsweise eines einfachen Skripts:

können die folgenden Schlussfolgerungen gezogen werden:

  • Der Wert der Funktion GetTickCount () ändert sich alle 15,6 Millisekunden statt jede Millisekunde, während sich der Wert der Funktion GetMicrosecondCount() alle Mikro zweitens. Das bedeutet, dass GetMicrosecondCount 15600 Mal genauer ist als GetTickCount, nicht 1000 Mal.
  • aber GetTickCount() ist etwa 12-15 Mal schneller als GetMicrosecondCount().

Das wesentliche Argument

Grund der Beschwerde: