Probador de Estrategias de MetaTrader 5: errores, fallos, sugerencias de mejora - página 34

 
Artyom Trishkin:

Yo tampoco lo miro nunca. Pero ocupa un espacio útil...

Sin embargo, me ha resultado útil.

 
Artyom Trishkin:

Yo tampoco lo miro nunca. Pero ocupa un espacio útil...

Nadie se escandaliza cuando primero hay mensajes del probador sobre la sincronización, la carga del Asesor Experto, etc. con la hora local, y luego hay mensajes del Asesor Experto y del servidor de operaciones de prueba con la hora de prueba, a veces intercalados con mensajes del probador con la hora local?
 
Encontré uno de los lugares donde se puede acelerar el Tester. Resulta que cada vez que Tester compara dos precios (por ejemplo, BuyLimit y Tick.ask), lo hace mediante una costosa normalización. No hay necesidad de hacerlo.
 
Slava:
¿Nadie se escandalizará cuando primero haya mensajes del probador sobre la sincronización, la carga del Asesor Experto, etc. con la hora local, y luego haya mensajes del Asesor Experto y del Servidor de Operaciones de Prueba con la hora de prueba, a veces intercalados con mensajes del probador con la hora local?

Slava, he estado pensando en la mejor manera de organizarlo. Quería sugerir que la hora de inicio, la sincronización, etc. se enviaran primero, y luego el resto - del experto y del probador con mensajes importantes.

Me parece lo mismo que has sugerido :)

 
fxsaber:
Encontré uno de los lugares donde se puede acelerar el Tester. Resulta que cada vez que Tester compara dos precios (por ejemplo, BuyLimit y Tick.ask), lo hace mediante una costosa normalización. No hay necesidad de hacerlo.

Los precios en el historial de la Terminal no están normalizados.

bool IsNorm( const double Price )
{
  return(NormalizeDouble(Price, _Digits) == Price);
}

#define  TOSTRING(A) #A + " = " + DoubleToString(A, 16) + " "
#define  PRINT(A) Print(TOSTRING(A) + TOSTRING(NormalizeDouble(A, _Digits)))
#define  ISNORM(A) if (!IsNorm(A)) { PRINT(A); Count++; };

void OnStart()
{
  MqlTick Ticks[];
  
  const int Size = CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, 1000 * (long)D'2019.12.01');
  Print(Size);
  
  for (int i = 0, Count  = 0; (i < Size) && (Count < 10); i++)
  {
    ISNORM(Ticks[i].bid)
    ISNORM(Ticks[i].ask)
    ISNORM(Ticks[i].last)
  }
}


Resultado (EURUSD, MQ-Beta)

Ticks[i].bid = 1.1024100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1024099999999999 
Ticks[i].bid = 1.1024100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1024099999999999 
Ticks[i].bid = 1.1024100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1024099999999999 
Ticks[i].bid = 1.1024100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1024099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 


¿Cómo es posible? ¿Un error en el servidor de comercio?

Como consecuencia, el Probador está manejando EAs a precios torcidos incluso en símbolos reales.


Parece que el problema es que los desarrolladores utilizaron un algoritmo de normalización diferente.

 
Andrey Khatimlianskii:

Se ha reproducido un error con un valor vacío en los parámetros intu.

1. Ensamblar el EA:

2. optimizar en cualquier caso ambos parámetros:

3. Desmarca enam y optimiza sólo x:

4. Cargue la 1ª caché de optimización, luego la 2ª caché de optimización, ejecute una única ejecución a partir de los resultados. En lugar de -1 obtenemos INT_MAX:


Relevante para todos los enums que empiezan por -1.

Existe la sospecha de que cuando se desmarca t, la entrada se desactiva por completo
y la variable t contiene un valorINT_MAX no inicializado en lugar de uno vacío.

 
fxsaber:

Los precios en el historial de la Terminal no están normalizados.


Resultado (EURUSD, MQ-Beta)


¿Cómo es posible? ¿Un error en el servidor de comercio?

Como consecuencia, el Probador está manejando EAs a precios torcidos incluso en símbolos reales.


Parece que el problema es que los desarrolladores utilizaron un algoritmo de normalización diferente.

No se trata de precios abusivos. Están bastante normalizados. Esto está muy claro en su impresión

El servidor de operaciones siempre utiliza un épsilon para comparar el precio entrante con el precio actual al negociar.

¿Eres consciente de que el resultado de <un_número_real>*0,5 puede ser diferente del resultado de <el_mismo_número_real>/2,0?

¿Sabe que algunos compiladores pueden sustituir una operación por otra al optimizar el código? Además, en un caso se sustituye y en otro no, dentro del mismo proyecto. Sin declarar una guerra.

 
Roman:

Existe la sospecha de que cuando se desmarca t, la entrada se desactiva por completo
y la variable t contiene un valor INT_MAX no inicializado en lugar de uno vacío.

No importa cuál sea el motivo en el interior.

Lo importante es que lo reproduzcan y lo arreglen. El error es antiguo.

 
Slava:

No se trata de precios abusivos. Están bastante normalizados. Esto está muy claro en su impresión

El precio se normaliza sólo si supera esta condición.

Foro sobre trading, sistemas de trading automatizados y comprobador de estrategias

Probador de estrategias de MetaTrader 5: errores, fallos, sugerencias de mejora

fxsaber, 2019.12.11 07:47

bool IsNorm( const double Price )
{
  return(NormalizeDouble(Price, _Digits) == Price);
}

El servidor de operaciones siempre utiliza el épsilon al negociar para comparar el precio entrante y el precio actual.

Es cierto que el servidor de comercio hace exactamente eso.

¿Es consciente de que el resultado <número_real>*0,5 puede ser diferente del resultado <el_mismo_número_real>/2,0?

¿Sabe que algunos compiladores pueden sustituir una operación por otra al optimizar el código? Además, en un caso sustituir y en otro no, dentro del mismo proyecto. Sin declarar la guerra.

La respuesta a ambas preguntas es afirmativa: soy consciente.


Una vez más, los precios originales de la Terminal no están normalizados. De ahí que esta situación se produzca fácilmente.

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Precios no normalizados en MT4

fxsaber, 2019.02.20 23:03

Pero la situación es mucho peor, y al mismo tiempo en MQ-Demo
// 15326434
// wmefo5sa
// MetaQuotes-Demo
void OnStart()
{
  const double Price1 = HistoryOrderSelect(356138100) ? HistoryOrderGetDouble(HistoryOrderGetTicket(0), ORDER_PRICE_CURRENT) : 0;
  const double Price2 = PositionSelectByTicket(356138100) ? PositionGetDouble(POSITION_PRICE_OPEN) : 0;  
  
  Print(Price1 - Price2); // -2.220446049250313e-16
}


El precio de apertura de la posición actual no es igual al precio de su orden/operación.

Razón de la queja: