Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 232

 

Erläuterung der Definition von DBL_EPSILON:

void OnStart()
  {
   double epsilon = 1.0;
   while(1.0 + epsilon != 1.0)
      epsilon /= 2;
   epsilon *= 2;

   Print(epsilon);  // 2.220446049250313e-16
  }
 
fxsaber # :

Dies ist eine schlechte Erklärung, denn

Es handelt sich um einen Beweis dafür, dass die mathematischen Standardeigenschaften bei der Verdopplung nicht gewährleistet sind.

Das von Ihnen angeführte Beispiel verwendet die "distributive" Eigenschaft für die Multiplikation.
 

Ein anderer Weg, die Bedeutung von DBL_EPSILON zu erklären:

//+------------------------------------------------------------------+
//| Returns the size of a unit in the last place (machine epsilon)   |
//| for a specified double value. This is the positive distance      |
//| between this double value and the representable value next       |
//| larger in magnitude.                                             |
//+------------------------------------------------------------------+
double machine_eps(const double value)
  {
   union _d {double value; long bits;} dbl;
   dbl.value = value;
   dbl.bits++;

   return dbl.value - value;
  }

void  OnStart()
  {
   double epsilon = machine_eps(1.0);

   Print(epsilon);   // 2.220446049250313e-16
  }

DBL_EPSILON ist einfach die Größe der Lücke zwischen aufeinanderfolgenden Doppelzahlen in [1,2).

https://www.exploringbinary.com/the-spacing-of-binary-floating-point-numbers/

https://en.wikipedia.org/wiki/Machine_epsilon

 

Um DBL_EPSILON besser zu verstehen, betrachten Sie das Inkrementieren eines Gleitkommazählers:

//+------------------------------------------------------------------+
//| Advances a fp double value by a specified number of epsilons.    |
//+------------------------------------------------------------------+
double DoubleAdvance(const double value, const long distance)
  {
   union _d {double value; long bits;} dbl;
   dbl.value = value;
   dbl.bits += distance;

   return dbl.value;
  }

void OnStart()
  {
   double myvalue = 1.0;
   //doubel myvalue = 1024.0;

   // Print the first 10 representable numbers from the counter
   for (int i = 0; i < 10; i++)
     {
      myvalue = DoubleAdvance(myvalue, 1);  // Increment the integer representation by 1 bit
      Print(myvalue);
     }
  }

Wenn der Anfangswert des Zählers 1,0 ist, beträgt die Schrittweite (Epsilon) des Zählers 2,220446049250250313e-16 (DBL_EPSILON) ≈ 2 an der 16.

/*
1.0000000000000002
1.0000000000000004
1.0000000000000007
1.0000000000000009
1.000000000000001
1.0000000000000013
1.0000000000000016
1.0000000000000018
1.000000000000002
1.0000000000000022
*/

Beträgt der Anfangswert des Zählers 1024, so beträgt die Schrittweite (Epsilon) des Zählers 2,2737363675443232321e-13 (1024 * DBL_EPSILON) ≈ 2 an der 13.

/*
1024.0000000000002
1024.0000000000005
1024.0000000000007
1024.000000000001
1024.0000000000011
1024.0000000000014
1024.0000000000016
1024.0000000000018
1024.000000000002
1024.0000000000023
*/

Wenn der Anfangswert des Zählers 4503599627370496 (2^52) ist, beträgt die Schrittweite des Zählers 1,0 (2^52 * DBL_EPSILON)= 1. In diesem Bereich verhält sich ein Double wie ein Integer-Zähler, es können keine Brüche dargestellt werden.

/*
 4503599627370497.0
 4503599627370498.0
 4503599627370499.0
 4503599627370500.0
 4503599627370501.0
 4503599627370502.0
 4503599627370503.0
 4503599627370504.0
 4503599627370505.0
 4503599627370506.0
*/

Sie können sehen, dass die kleineren Zahlen kleinere Lücken zwischen sich haben, und die größeren Zahlen haben größere Lücken zwischen sich.

DBL_EPSILON ist also die relative Fehlerrate. Relativ bedeutet in Bezug auf die Größe der Zahl.

bei 1,0 ist der absolute Fehler = 1 * 2,2204460492503131e-016 (DBL_EPSILON).

bei d, der absolute Fehler ≈ d * DBL_EPSILON.

(DBL_EPSILON ist ein Referenzzinssatz bei 1,0, etwa der jährliche Zinssatz der Bank, und er ist gleich 2^-52).


Eine Randbemerkung: Wenn Sie versuchen, 1024.0000000000003 zu drucken, wird stattdessen 1024.0000000000002 gedruckt (Aufrundung auf die nächste darstellbare Zahl), weil 1024.0000000000003 keine darstellbare Zahl ist (nicht existierende fp-Zahl).

Dies wird als Darstellungsfehler bezeichnet:

void OnStart()
  {
   Print(1024.0000000000003);  // 1024.0000000000002
  }

Die vorherigen/nächsten darstellbaren Zahlen werden durch Bitmanipulation (enum wie zuvor: DoubleAdvance(value, -1)) oder durch Verwendung von DBL_EPSILON erreicht:

void OnStart()
  {
   double myvalue = 1024.0000000000014;
   Print( myvalue * (1 - DBL_EPSILON) );  // 1024.0000000000011
   Print( myvalue * (1 + DBL_EPSILON) );  // 1024.0000000000016
  }

DBL_EPSILON wird hauptsächlich verwendet, um Rundungsfehler von fp nach mathematischen Operationen auf Doubles abzuschätzen (oder zu korrigieren) (numerische Analyse):

|wahres Ergebnis - fp-Ergebnis| / wahres Ergebnis <= DBL_EPSILON

 

Wird der OnTester()-Aufruf im MT5-Tester deaktiviert, wenn es einen genetischen Optimierungsalgorithmus und KEIN benutzerdefiniertes Optimierungskriterium gibt?

Ich glaube nicht. Aber ich würde es gerne... Vorzugsweise ohne Parsing der Konfiguration.

PS. CARAUL!!! Alles ist weg! Bei jedem Durchlauf der Optimierung (sollte/sollte nicht) - wird OnTester() aufgerufen, was die Gesamtzeit der Optimierung stark erhöhen kann!

Hilfe wer kann... )))))

 
Können Sie mir sagen, wie man IP_ADAPTER_INFO definiert? Dies ist die Definition des Wertes ist nicht korrekt
struct IP_ADAPTER_INFO {
// struct _IP_ADAPTER_INFO *Next; // Nächste NIC-Informationen.
uint ComboIndex; // Combo-Index & nbsp;
uchar AdapterName[256]; // NIC-Name
uchar Description[256]; // Beschreibung der NIC.
uchar Address[6]; // MAC-Adresse &nbsp uchar Adresse[6]; // MAC-Adresse.
uint AddressLength; // Länge der MAC-Adresse
uint Index; // NIC-Index
uint Typ; // NIC-Typ NIC-Typ; // NIC-Typ
bool DhcpEnabled; // Ob DHCP aktiviert ist oder nicht. nbsp;; DhcpEnabled
uchar CurrentIpAddress[16];// aktuelle IP-Adresse
uchar IpAddressList[16]; // Liste der IP-Adressen.
uchar GatewayList[16]; // Standard-Gateway
uchar DhcpServer[16]; // DHCP-Server
datetime LeaseObtained; // Lease-Zeit abrufen
datetime LeaseExpires; // Lease-Ablaufzeit
}; datetime LeaseObtained; // LeaseObtained.

#import "iphlpapi.dll"
int GetAdaptersInfo(IP_ADAPTER_INFO &AdapterInfo[], int &Size);
#import
 
Eine geringfügige Abweichung von der Ortszeit führt sofort zum Abbruch der Verbindung mit dem Handelsserver.
2023.05.24 11:11:15.645 '4999464569': connection to MetaQuotes-Demo lost
 

Bei meiner Suche bin ich auf eine interessante undokumentierte Funktion gestoßen

Sie können den Eingabekommentar für ein Dialogfeld ausblenden

input int  param=0;  /* показываемый комментарий */   // комментарий для программиста

Originalbeitrag hier

https://www.mql5.com/ru/forum/1271#comment_9019

Предложение по комментариям к внешним переменным
Предложение по комментариям к внешним переменным
  • 2010.06.30
  • www.mql5.com
Общее обсуждение: Предложение по комментариям к внешним переменным
 
lynxntech #:

Bei meiner Suche bin ich auf eine interessante undokumentierte Funktion gestoßen

Sie können den Eingabekommentar für ein Dialogfeld ausblenden

Originalbeitrag hier

https://www.mql5.com/ru/forum/1271#comment_9019

Danke, habe es übersehen... Nützlich.
 

Im Tester wird die Tabelle History nur in zwei Fällen überschrieben.

  1. Aufruf von HistorySelect.
  2. Aufruf von OnTrade (auch wenn es nicht angegeben ist).
Dies geschieht, um Ressourcen zu sparen. Aus diesem Grund kann es zu solchen Unklarheiten kommen.

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnTick()
{
  const ulong Ticket1 = OrderSend(_Symbol, OP_BUYLIMIT, 1, Ask - 1000 * _Point, 0, 0, 0);
  const ulong Ticket2 = OrderSend(_Symbol, OP_BUYLIMIT, 1, Ask - 1000 * _Point, 0, 0, 0);

  OrderDelete(Ticket2);
  HistorySelect(0, INT_MAX); // Если убрать эту строку, то конечный Print-результат будет иным.
  
  OrderDelete(Ticket1);    
  HistorySelect(0, INT_MAX);
  
  for (int i = 0; i < HistoryOrdersTotal(); i++)
    Print(HistoryOrderGetTicket(i)); // 2 3 или 3 2.
      
  TesterStop();
}
Suchbegriff: Uluchshenie 064.