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

 
fxsaber:
El matiz de la comparación de enteros en un ejemplo real

¿Vas a medir exactamente un segundo con Sleep(1000)?

¿Y no sabes que el temporizador del procesador tiene un error de 15 ms?

 
Slava:

¿Vas a deslizar Sleep(1000) para medir exactamente un segundo?

¿Sabes que el temporizador de la CPU tiene un margen de error de 15 ms?


Hola, ¿podríais decirme si hay alguna forma de restablecer el buffer del temporizador para eliminar el error de ajuste del temporizador?

 
Vladislav Andruschenko:

Hola, ¿podríais decirme si hay alguna forma de restablecer el buffer del temporizador para evitar un error de ajuste del mismo?

Se produce un error de configuración del temporizador porque la cola de mensajes del sistema está llena. Puede haber muchas razones para ello. Normalmente, el desbordamiento de la cola es temporal (si no lo es, no podrás trabajar en tu ordenador)

Utilice OnTick para controlar el temporizador. Si el temporizador no está configurado, ponlo en OnTick

Mientras tanto, estamos trabajando para que la configuración del temporizador sea independiente del estado de la cola de mensajes.

PS La activación del temporizador del sistema y el ajuste del temporizador de una aplicación no están relacionados

 
Slava:

¿Vas a deslizar Sleep(1000) para medir exactamente un segundo?

No, se trata de estas dos líneas de comparación de enteros.

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

Características del lenguaje mql5, sutilezas y trucos

fxsaber, 2018.01.24 21:48

El matiz de la comparación de enteros con un ejemplo real
//  if (GetMicrosecondCount() > StartTime + 1000000) // Неправильно
  if (GetMicrosecondCount() - StartTime > 1000000) // Правильно

A primera vista, ambas líneas deberían dar los mismos resultados. Pero no es así. El primero a veces da un resultado erróneo.

El ejemplo con el tiempo se ha elegido sólo por claridad.
Slava:

Y el hecho de que el temporizador del procesador tenga un error de 15 ms, ¿lo desconoces?

Es extraño que sigas usando GetTickCount. Se ha demostrado en el foro (demasiado perezoso para buscar) que un temporizador de microsegundos no es más lento que un temporizador de milisegundos. Al mismo tiempo, no tiene un error salvaje.

 
fxsaber:

No, se trata de estas dos cadenas de comparaciones de enteros.

A primera vista, ambas cadenas deberían dar los mismos resultados. Pero este no es el caso. El primero a veces da un resultado erróneo.

El ejemplo con el tiempo se ha elegido sólo por claridad.

Es extraño que sigas usando GetTickCount. Se demostró en el foro (me da pereza buscarlo) que el temporizador de microsegundos no es más lento que el de milisegundos. Al mismo tiempo, no tiene ningún error salvaje.

Me refiero a Sleep(1000)
 
Slava:

Se produce un error del temporizador porque la cola de mensajes del sistema está llena. Esto puede deberse a varias razones. Un desbordamiento de la cola suele ser temporal (si no lo es, no podrás trabajar en tu ordenador).

Utilice OnTick para controlar el temporizador. Si el temporizador no está configurado, ponlo en OnTick

Mientras tanto, estamos trabajando para que la configuración del temporizador sea independiente del estado de la cola de mensajes.

PS La activación del temporizador del sistema y la configuración del temporizador de una aplicación son cuestiones distintas


Eso es exactamente lo que hago,

El error del temporizador se produce después de algún tiempo - no inmediatamente. y exactamente por desbordamiento - cuando hay muchos datos, por ejemplo, el historial de pedidos, o los pedidos actuales de 50 o más.

Ya lo he probado y sigo intentando utilizarlo, pero tengo la sensación de que, a pesar de todo, resolveré el problema.

 
Slava:
Me refiero a Sleep(1000).

Sí, has empantanado el tema de la comparación de enteros.

 
fxsaber:

Sí, estás hablando de comparar enteros.

No hay ningún problema en comparar números enteros.

Mostrar lo mismo sin deslizamiento y sin GetMicrosecondsCount

 
Slava:

No hay ningún problema en comparar números enteros.

Mostrar lo mismo sin el deslizamiento y sin GetMicrosecondsCount

ulong GetMicrosecondCount2()
{
  static ulong StartTime = 0;
  
  if (StartTime)
    StartTime += 1000001;            // При повторном - добавляем больше "секунды"
  else
    StartTime = ULONG_MAX - 1000000; // При первом запуске возвращаем это "время"
    
  return(StartTime);
}

void OnStart()
{
  const ulong StartTime = GetMicrosecondCount2();
  
//  Sleep(1000);
  
//  if (GetMicrosecondCount2() > StartTime + 1000000) // Неправильно
  if (GetMicrosecondCount2() - StartTime > 1000000) // Правильно
    Print("Прошло больше секунды.");
  else
    Print("Прошло меньше секунды."); 
}
Y no es un problema, es una sutileza.
 

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

Discusión sobre "Sistema de contabilidad de posiciones de cobertura añadido a MetaTrader 5"

fxsaber, 2018.01.25 10:14

  1. Muestra un ejemplo de una situación comercial que Andrew señaló al leer este artículo.
  2. HistorySelectByPosition puede no seleccionar la orden que causó la operación.
  3. La orden y el acuerdo que generó pueden tener diferentes identificaciones.
El segundo y el tercer punto deberían, al menos, expresarse en alguna parte. Y así fue.

Estamos hablando de análisis de la historia del comercio incluso manual, no estamos hablando de escribir TS.

Por ejemplo, queremos entender cómo se ha producido el fracaso del acuerdo.