Características del lenguaje mql5, sutilezas y técnicas - página 232

 

Explicación de la definición 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 # :

Esta es una mala explicación, porque

Es una prueba de que las propiedades matemáticas estándar no están garantizadas para los dobles.

El ejemplo que has proporcionado utiliza la propiedad "distributiva" para la multiplicación.
 

Otra forma de explicar el significado 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 es simplemente el tamaño del hueco entre dobles consecutivos en [1,2).

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

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

 

Para comprender mejor DBL_EPSILON, considere la posibilidad de incrementar un contador de coma flotante:

//+------------------------------------------------------------------+
//| 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 el valor inicial del contador es 1,0, el tamaño de paso (épsilon) del contador será 2,220446049250250313e-16 (DBL_EPSILON) ≈ 2 en el decimosexto decimal.

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

Si el valor inicial del contador es 1024, el tamaño de paso (é psilon) del contador será 2,2737363675443232321e-13 (1024 * DBL_EPSILON) ≈ 2 en el decimotercer decimal.

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

Si el valor inicial del contador es 4503599627370496 (2^52), el tamaño de paso del cont ador será 1,0 (2^52 * DBL_EPSILON)= 1. En este rango, un doble se comporta como un contador de enteros, no se podrían representar fracciones.

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

Puedes ver que los números más pequeños tienen espacios más pequeños entre ellos, y los números más grandes tienen espacios más grandes entre ellos.

Por lo tanto, DBL_EPSILON es el porcentaje de error relativo. relativo significa relativo a la magnitud del número.

a 1,0, el error absoluto = 1 * 2,2204460492503131e-016 (DBL_EPSILON).

en d, el error absoluto ≈ d * DBL_EPSILON

(DBL_EPSILON es un tipo de referencia a 1,0, algo así como el tipo de interés anual del banco, y es igual a 2^-52).


Una nota al margen: si intenta imprimir 1024.0000000000003, imprimirá 1024.0000000000002 en su lugar (redondeando al número representable más cercano), porque 1024.0000000000003 no es un número representable (número fp inexistente).

Esto se denomina error de representación:

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

Los números representables anteriores/siguientes se alcanzan mediante la manipulación de bits (enum como antes: DoubleAdvance(value, -1)) o utilizando DBL_EPSILON:

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

DBL_EPSILON se utiliza principalmente para estimar (o corregir) errores de redondeo fp después de operaciones matemáticas sobre dobles (análisis numérico):

|resultado verdadero - resultado fp| / resultado verdadero <= DBL_EPSILON

 

¿Se desactiva la llamada OnTester() en el probador de MT5 cuando hay un algoritmo de optimización genética y NO un criterio de optimización personalizado?

Creo que no. Pero me gustaría... Preferiblemente sin config parsing.

PD. ¡¡¡CARAUL!!! ¡Todo se ha ido! En cada pasada de optimización (debería/no debería) - se llama a OnTester(), ¡lo que puede aumentar mucho el tiempo total de optimización!

Ayuda quien pueda... )))))

 
¿Puede decirme cómo definir IP_ADAPTER_INFO ? Esta es la definición del valor no es correcta
struct IP_ADAPTER_INFO {
// struct _IP_ADAPTER_INFO *Next; // Información del siguiente NIC.
uint ComboIndex; // Índice del combo & nbsp;
uchar AdapterName[256]; // Nombre NIC
uchar Description[256]; // Descripción del NIC.
uchar Address[6]; // Dirección MAC &nbsp uchar Address[6]; // Dirección MAC.
uint AddressLength; // Longitud de la dirección MAC
uint Index; // Índice NIC
uint Type; // Tipo de NIC NIC Type; // Tipo de NIC
bool DhcpEnabled; // Si DHCP está habilitado o no. nbsp;; DhcpEnabled
uchar CurrentIpAddress[16];// Dirección IP actual
uchar IpAddressList[16]; // Lista de direcciones IP.
uchar GatewayList[16]; // Puerta de enlace por defecto.
uchar DhcpServer[16]; // Servidor DHCP
datetime LeaseObtained; // Obtener hora de alquiler
datetime LeaseExpires; // Hora de expiración del alquiler
}; datetime LeaseObtained; // Fecha de obtención del contrato.

#import "iphlpapi.dll"
int GetAdaptersInfo(IP_ADAPTER_INFO &AdapterInfo[], int &Size);
#Importar
 
Adelantarse ligeramente a la hora local provoca inmediatamente la desconexión del servidor comercial.
2023.05.24 11:11:15.645 '4999464569': connection to MetaQuotes-Demo lost
 

En mi búsqueda me encontré con una interesante función no documentada

puede ocultar comentario de entrada para un cuadro de diálogo

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

post original aquí

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

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

En mi búsqueda me encontré con una interesante función no documentada

puede ocultar el comentario de entrada de un cuadro de diálogo

post original aquí

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

Gracias, lo echaba de menos... Útil.
 

En Tester, la tabla Historial sólo se sobrescribe en dos casos.

  1. Llamada de HistorySelect.
  2. Llamada de OnTrade (aunque no se especifique).
Esto se hace para ahorrar recursos. Por eso puedes encontrarte con tanta ambigüedad.

#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();
}
Cadena de búsqueda: Uluchshenie 064.