MT5 y la velocidad en acción - página 44

 
fxsaber:

Más de una vez he visto situaciones en las que el Terminal carga tanto la CPU al 100% que no reacciona a nada.

Entonces miré los registros y vi que había saltos salvajes de ticks en OnTick. Sin embargo, si escribo correctamente un EA, esta situación desastrosa no afectará a los resultados de las operaciones. Lo he analizado específicamente, todo está claro.

Me pregunto hasta qué punto están extendidos los mecanismos para hacer frente a los retrasos en los productos de mercado. No he visto ni una sola vez que se mencione la potencia de la máquina para funcionar. El ping mínimo es un sí.

¿Dónde los lanzabas?

Si en VPS por 2-5 dólares, entonces los retrasos en decenas y cientos de milisegundos son fácilmente atrapados en cualquier función WinAPI apenas seria. Todo se ralentiza a partir del nivel del hipervisor, convirtiendo una máquina virtual en un espectáculo de diapositivas.

Explicado arriba.

 
Renat Fatkhullin:

No es GetMicrosecondsCount el que se está ralentizando, es el SO el que está cuantificando los recursos de la CPU para cualquier hilo en tu VPS estrangulado. Para cualquier función, cualquier acción, cualquier programa dentro de su UPU.

Bueno, ningún shell de la CPU puede cortar y asignar los recursos de manera justa cuando tiene 20 (eso sigue siendo respetable) sistemas operativos con 1500 hilos de ejecución por copia. Tome 8-16 núcleos y distribúyalos en 20 * 1.500 = 30.000 (treinta mil pistas físicas).

En mi caso (caja virtual con vin7 + 2 núcleos + 16 GB de RAM en un hardware totalmente propio sin nada más en marcha), ¿de dónde salen las 2-3 µs periódicas?

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

MT5 y la velocidad en el combate

Andrey Khatimlianskii, 2020.10.05 10:19

No es realmente una UPU, sino una máquina virtual en un hardware alquilado:

2020.09.29 00:11:11.350 Terminal        MetaTrader 5 x64 build 2615 started for MetaQuotes Software Corp.
2020.09.29 00:11:11.352 Terminal        Windows 7 Service Pack 1 build 7601 on Virtual Box, Intel Core i7-4770  @ 3.40 GHz, 14 / 15 Gb memory, 4 / 31 Gb disk, IE 11, Admin, GMT+2
2020.10.05 11:11:25.340 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:11:31.308 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:12:34.699 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 3 mсs.
2020.10.05 11:13:04.388 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:13:58.116 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:14:08.388 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:14:14.975 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:14:19.095 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:15:28.814 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:15:55.814 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:15:56.814 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:16:27.818 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 9 mсs.
2020.10.05 11:16:35.275 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:16:45.775 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 27 mсs.
2020.10.05 11:16:51.715 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:17:30.477 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 5 mсs.
2020.10.05 11:18:25.081 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.

 
Andrey Khatimlianskii:

En mi caso (caja virtual con win7 + 2 núcleos + 16GB de RAM en su propio hardware sin nada más girando), ¿de dónde salen las 2-3 µs periódicas?

Ese es el precio de la doble virtualización.

Sobre todo porque VirtualBox no es un hipervisor de tipo Hyper-V en toda regla, sino que vive encima de tu actual sistema operativo de escritorio (¿también de Windows 7?), que tiene una cáscara de la CPU preparada para un caso de uso diferente.

Así que tienes: Windows 7/10 -> VirtualBox -> Windows 7. Esencialmente, dos niveles de virtualización, con el primero que no conoce las aspiraciones de VirtualBox, viéndolo como un programa normal. La asignación de recursos de la CPU (el threadsheduler) está claramente jodida.

Debería serlo: Hyper-V 2016/2019 -> Windows 2016/2019

 
Renat Fatkhullin:

No es GetMicrosecondsCount lo que se está ralentizando, es el SO el que está cuantificando los recursos de la CPU para cualquier hilo en tu VPS estrangulado. Para cualquier función, cualquier acción, cualquier programa dentro de su UPU.

Creo que un argumento como este te hará pensar. Asesor.

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

// Сделал действия по этой ссылке: https://www.mql5.com/ru/forum/342090/page41#comment_18597040

void OnStart()
{
  _BV(
  for (int i = 0; i < 1 e6; i++)
    GetMicrosecondCount();
      , 1)
      
  _BV(
  for (int i = 0; i < 1 e6; i++)
    GetTickCount();
      , 1)      
}



2020.10.06 00:24:26.779 Alert: Time[Test6.mq5 52: for(inti=0;i<1 e6;i++)GetMicrosecondCount();] = 16289902 mсs.
2020.10.06 00:24:26.784 Alert: Time[Test6.mq5 57: for(inti=0;i<1 e6;i++)GetTickCount();] = 4300 mсs.


Así que lejos de ralentizarlo todo. Por eso pude cambiar a winmm::timeBeginPeriod(1)+winmm::timeGetTime() de forma bastante inofensiva, consiguiendo una velocidad como la de GetTickCount, pero sin el temido límite de 16 ms. Sin embargo, los productores del mercado no pueden hacerlo, ya que se trata de una DLL. Es poco probable que hagas una versión regular de un milisegundo.

 
Renat Fatkhullin:

La función MQL5 para minimizar todas las ventanas y la propia aplicación es una gran idea. Trabajaremos en ello.

Aquí hay otra cosa.

terminal en un VPS, entonces se opondrá fuertemente a que todo se vuelque abruptamente. Él mismo puede y debe minimizar las ventanas si sale de la sesión RDP.

Actualmente estoy usando WinAPI para minimizar por tecla de acceso rápido. Muy conveniente y mucho más inofensivo que el TerminalClose estándar.
 
Renat Fatkhullin:


Este es un ejemplo de lo que quería decir.
Ambos servidores son diferentes corredores, están en la misma zona, pueden estar en la misma ubicación.
La tarjeta de servicio sugiere que AMP se encuentre en el Reino Unido.
Y para Just por alguna razón ofrece en NL.
¿Por qué? Si hay un vpc más cercano.

dfgh

jt

 
fxsaber:

Creo que encontrarás un argumento que te hará pensar. Consejero.


Así que lejos de ralentizar las cosas. Por eso pude cambiar a winmm::timeBeginPeriod(1)+winmm::timeGetTime() de forma bastante inofensiva, consiguiendo una velocidad como la de GetTickCount, pero sin el temido límite de 16ms. Sin embargo, los productores del mercado no pueden hacerlo, ya que se trata de una DLL. Es poco probable que hagas una versión regular de un milisegundo.

Pues eres un maestro de las pruebas de estrés de carrera sin correlación ni control de razonabilidad.

Por supuesto, la medición de microsegundos requiere recursos para poder medir intervalos 1000 veces más pequeños que un milisegundo.

Si de vez en cuando necesitas medir intervalos con mucha precisión, utiliza microsegundos. Y le costará 0 microsegundos.

Si estás preparado para llamar a los millones de veces auto-medida, probablemente estás participando en un auto-engaño.


En un VPS asfixiado, el overclocking del temporizador del sistema a través de timeBeginPeriod es arriesgado. Sólo aumentará la sobrecarga de la CPU:

Esta función afecta a una configuración global de Windows. Windows utiliza el valor más bajo (es decir, la resolución más alta) solicitado por cualquier proceso. Establecer una resolución más alta puede mejorar la precisión de los intervalos de tiempo de espera en las funciones de espera. Sin embargo, también puede reducir el rendimiento general del sistema, ya que el programador de hilos cambia de tareas con más frecuencia. Las altas resoluciones también pueden impedir que el sistema de gestión de energía de la CPU entre en los modos de ahorro de energía. La configuración de una resolución más alta no mejora la precisión del contador de rendimiento de alta resolución.

De lo contrario, el sistema operativo debería haber hecho un GetTickCount/GetTickCount64 preciso hace tiempo y alegrarse de la precisión gratuita. Pero no, tendrás que pagar por la precisión de este temporizador.

 
Por favor, elimine los frenosCHART_IS_MAXIMIZED. La solución WinAPI no es ahora un orden de magnitud más rápida que la solución de stock.
 
Roman:

Este es un ejemplo de lo que quería decir.
Ambos servidores son de diferentes corredores, están en la misma zona, pueden estar en la misma ubicación.
La tarjeta de servicio sugiere que AMP se encuentre en el Reino Unido.
Y para Just por alguna razón ofrece en NL.
¿Por qué? Si hay una RTPC más cerca.

Conocemos los puntos geográficos de los servidores, y aquí las posiciones de los servidores broker se construyen a partir de bases GeoIP.

Y a menudo ocurre que la información no se corresponde con la realidad. Por lo tanto, nunca debemos suponer que la posición del corredor es exacta.

Mañana estudiaremos esto con más detalle, porque tenemos que volver a comprobar y escanear todo manualmente para responder a la pregunta.

 
Renat Fatkhullin:

Ese es el precio de la doble virtualización.

Especialmente porque VirtualBox no es un hipervisor completo del tipo Hyper-V, sino que vive sobre su actual sistema operativo de escritorio (¿también Windows 7?) que tiene un shell de CPU adaptado para un caso de uso diferente.

Así que tienes: Windows 7/10 -> VirtualBox -> Windows 7. Esencialmente, dos niveles de virtualización, con el primero que no conoce las aspiraciones de VirtualBox, viéndolo como un programa normal. La asignación de recursos de la CPU (el threadsheduler) está claramente jodida.

Debería serlo: Hyper-V 2016/2019 -> Windows 2016/2019

No, tengo virtualizadores dando vueltas en mi CentOS. Pero no soy competente para continuar este diálogo.

Razón de la queja: