Caractéristiques du langage mql5, subtilités et techniques - page 232

 

Explication de la définition de DBL_EPSILON:

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

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

Il s'agit d'une mauvaise explication, car

Il s'agit d'une preuve que les propriétés mathématiques standard ne sont pas garanties pour les doubles.

L'exemple que vous avez donné utilise la propriété "distributive" pour la multiplication.
 

Une autre façon d'expliquer la signification de DBL_EPSILON:

//+------------------------------------------------------------------+
//| 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 est simplement la taille de l'écart entre les doubles consécutifs dans [1,2).

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

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

 

Pour mieux comprendre DBL_EPSILON, considérons l'incrémentation d'un compteur à virgule flottante:

//+------------------------------------------------------------------+
//| 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);
     }
  }

Si la valeur initiale du compteur est de 1,0, la taille du pas (epsilon) du compteur sera de 2,220446049250250313e-16 (DBL_EPSILON) ≈ 2 à la 16e décimale.

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

Si la valeur initiale du compteur est 1024, la taille de pas (epsilon) du compteur sera 2.273736754432321e-13 (1024 * DBL_EPSILON) ≈ 2 à la 13ème décimale.

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

Si la valeur initiale du compteur est 4503599627370496 (2^52), la taille du pas du compteur sera de 1,0 (2^52 * DBL_EPSILON)= 1. Dans cette plage, un double se comporte comme un compteur d'entiers, aucune fraction ne pouvant être représentée.

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

Vous pouvez constater que les petits nombres sont séparés par des intervalles plus petits et que les grands nombres sont séparés par des intervalles plus grands.

Par conséquent, DBL_EPSILON est le taux d'erreur relatif. Relatif signifie relatif à l'ampleur du nombre.

à 1,0, l'erreur absolue = 1 * 2,2204460492503131e-016 (DBL_EPSILON).

à d, l'erreur absolue ≈ d * DBL_EPSILON.

(DBL_EPSILON est un taux de référence à 1,0, quelque chose comme le taux d'intérêt annuel de la banque, et il est égal à 2^-52).


Remarque : si vous essayez d'imprimer 1024.0000000000003, vous obtiendrez 1024.0000000000002 à la place (en arrondissant au nombre représentable le plus proche), car 1024.0000000000003 n'est pas un nombre représentable (nombre fp inexistant).

C'est ce qu'on appelle une erreur de représentation :

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

Les nombres représentables précédents/suivants sont obtenus par manipulation de bits (enum comme précédemment : DoubleAdvance(value, -1)) ou en utilisant DBL_EPSILON :

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

DBL_EPSILON est principalement utilisé pour estimer (ou corriger) les erreurs d'arrondi fp après des opérations mathématiques sur des doubles (analyse numérique) :

|résultat vrai - résultat fp| / résultat vrai <= DBL_EPSILON

 

L'appel OnTester() est-il désactivé dans le testeur MT5 lorsqu'il y a un algorithme d'optimisation génétique et NON un critère d'optimisation personnalisé?

Je pense que non. Mais j'aimerais bien... De préférence sans analyse de la configuration.

PS. CARAUL !!! Tout est parti ! A chaque passage de l'optimisation (devrait/ne devrait pas) - OnTester() est appelé, ce qui peut augmenter considérablement le temps total de l'optimisation !

Aidez qui peut... )))))

 
Pouvez-vous me dire comment définir IP_ADAPTER_INFO ? La définition de la valeur n'est pas correcte
struct IP_ADAPTER_INFO {
// struct _IP_ADAPTER_INFO *Next ; // Informations sur le prochain NIC.
uint ComboIndex ; // Index du combo & nbsp ;
uchar AdapterName[256] ; // Nom du NIC
uchar Description[256] ; // Description de la carte d'interface réseau.
uchar Address[6] ; // Adresse MAC &nbsp uchar Address[6] ; // Adresse MAC.
uint AddressLength ; // Longueur de l'adresse MAC
uint Index ; // Index NIC
uint Type ; // Type de NIC NIC Type ; // Type de NIC
bool DhcpEnabled ; // Si le DHCP est activé ou non. nbsp; ; DhcpEnabled
uchar CurrentIpAddress[16];// adresse IP actuelle
uchar IpAddressList[16] ; // Liste des adresses IP.
uchar GatewayList[16] ; // Passerelle par défaut
uchar DhcpServer[16] ; // Serveur DHCP
datetime LeaseObtained ; // Obtenir la durée du bail
datetime LeaseExpires ; // Date d'expiration du bail
} ; datetime LeaseObtained ; // Date d'obtention du bail.

#import "iphlpapi.dll"
int GetAdaptersInfo(IP_ADAPTER_INFO &AdapterInfo[], int &Size) ;
#import
 
Un léger décalage par rapport à l'heure locale entraîne immédiatement une déconnexion du serveur commercial.
2023.05.24 11:11:15.645 '4999464569': connection to MetaQuotes-Demo lost
 

Au cours de mes recherches, je suis tombé sur une fonction non documentée intéressante

vous pouvez cacher les commentaires d'entrée pour une boîte de dialogue

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

l'article original est ici

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

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

Au cours de mes recherches, je suis tombé sur une fonction non documentée intéressante

vous pouvez cacher les commentaires d'entrée d'une boîte de dialogue

post original ici

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

Merci, je l'avais raté... Utile.
 

Dans Tester, la table Historique n'est écrasée que dans deux cas.

  1. Appel de HistorySelect.
  2. Appel de OnTrade (même s'il n'est pas spécifié).
Ceci est fait pour économiser des ressources. C'est la raison pour laquelle vous pouvez rencontrer une telle ambiguïté.

#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();
}
Chaîne de recherche: Uluchshenie 064.
Raison: