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

 
Renat Akhtyamov:
Caballeros del prog...
Lea primero acerca de la asignación de memoria en el ordenador, a continuación, cómo y por qué medios se hace, a continuación, cómo limpiar y leer desde y hacia no es difícil. Al menos es posible hacer sugerencias más razonables a los desarrolladores

¿No lo sabrás en mt4?
¿Utiliza usted mismo la oferta de compra predefinida?
En mt5 para toda laestructura MqlTick faltan por alguna razón.
Llame a la función, llene la estructura, y sólo entonces obtener el valor.
O inmediatamente obtener el valor, ¿hay alguna diferencia?

¿O no está en mi dirección?
Al menos deberías indicar a quién le escribes ))

 
Roman:

Las variables predefinidas, para el tick actual, serían probablemente mejores.

Los promotores han explicado previamente que existe una limitación fundamental para el acceso directo

void f()
{
        MqlTick t1 = _Tick;
        MqlTick t2 = _Tick;
}

y en general, t1 no es igual a t2. Además, los valores del campo dentro de t1 y t2 pueden terminar refiriéndose a diferentes ticks en absoluto

 
A100:

Los promotores han explicado previamente que existe una limitación fundamental para el acceso directo

y en general t1 no es igual a t2. Además, los valores de los campos dentro de t1 y t2 pueden referirse a diferentes ticks, aunque sean campos vinculados (deberían referirse al mismo tick).

Brr, ¿cuál es la limitación fundamental?
La estructura de tu ejemplo es innecesaria, no necesita ser rellenada.

Un valor vino del socket y fue escrito en la variable _Ask, _Bid, etc. de acuerdo a la estructura.
¿Preguntar? = ¿Preguntar en su opinión?
Se produce una restricción si se llena la estructura, lo que lleva algún tiempo.
No es necesario rellenarla, sino dar directamente_Pregunta, _Oferta, etc.

 
Roman:

Brr, ¿cuál es la principal limitación?
La estructura de su ejemplo es innecesaria aquí, no es necesario rellenarla.

void f()
{
        double ask1 = _Ask;
        double ask2 = _Ask;
}

Puedes reescribirlo sin la estructura. En el caso general ask1 no es igual a ask2

 
A100:

También se puede reescribir sin la estructura. En el caso general ask1 no es igual a ask2

Es decir, ¿se trata de peticiones al entorno no sincrónico, y la respuesta la recibe el estado actual del entorno? Y OnTick es la captura de la garrapata actual y la elaboración de la EA, pero al mismo tiempo las solicitudes de la estructura de la garrapata cuando la EA está trabajando a cabo puede obtener respuestas de los próximos ticks?

 
A100:

También se puede reescribir sin la estructura. En general, ask1 no es igual a ask2

Así que no tienes que usar 100500 dígitos, donde el último dígito de un número real difiere 0.000000000000000001
Para cada variable un dígito diferente, para el precio doble máximo 8.

 
Renat Fatkhullin:

Lanzamiento de la beta 2652, de importancia:

  • mejora de las interrupciones de compilación (en un 22%)
  • Acceso a SymbolInfoTick mucho más rápido.

El 22% es bueno.

SymbolInfoTick - en mi máquina de casa, me di cuenta a ojo de que no alertaba. Sin embargo, hice un filtro sobre estas alertas en el Registro y vi que había muchas más que las 2650 emitidas durante el mismo periodo hace veinticuatro horas.

Envié ambos registros al PM.

 
Valeriy Yastremskiy:

Es decir, ¿se trata de peticiones a un entorno no sincrónico, y la respuesta se basa en el estado actual del entorno? Y OnTick es la captura de la garrapata actual y la elaboración de la EA, pero las solicitudes de la estructura de la garrapata cuando la EA está trabajando a cabo puede obtener respuestas de los próximos ticks?

Sí.

 
Renat Fatkhullin:

Para trabajar en masa, pon más memoria.

4gb (precio de 20 euros) no es nada bueno en 2020 cuando se trata de análisis e investigación.

Estamos hablando de una llamada puntual a CopyTicks. Se hace para hacer un backtest virtual sobre estos ticks en OnInit, y luego continuarlo en tiempo real, alimentando sólo ticks frescos.

Como compromiso, propongo liberar la memoria en la Terminal inmediatamente después del CopyTicks llamado en OnInit. Entonces no tenemos que introducir una función de enfriamiento forzado para CopyTicks.

Ahora mismo la versión de refrigeración en sueño es muy muleta. Pero ya he mostrado más arriba cómo esta muleta ahorra memoria.


Ahora resulta que 20 Asesores Expertos funcionan rápido incluso en VPS lentos. Pero ponerlos en marcha es un problema serio.


Aquí hay un Asesor Experto que muestra el problema.

// Демонстрация 10-ти секундного удержания в памяти ненужных данных CopyTicks.
#define  PRINT(A) Print(#A + " = " + (string)(A))

input datetime inFrom = D'2020.06.01'; // С какой даты анализировать историю

int OnInit()
{
  MqlTick Ticks[];
  
  Print("Before CopyTicks:");
  PRINT(MQLInfoInteger(MQL_MEMORY_USED));     
  PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));
  
  PRINT(CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, (long)inFrom * 1000));
  ArrayFree(Ticks);
  
  Print("After CopyTicks:");
  
  for (int i = 0; i < 10; i++)
  {
    PRINT(i);
    PRINT(MQLInfoInteger(MQL_MEMORY_USED));    
    PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));
    
    Sleep(1000);
  }
  
  return(INIT_FAILED);
}


Resultado.

2020.10.14 08:49:24.016 Before CopyTicks:
2020.10.14 08:49:24.016 MQLInfoInteger(MQL_MEMORY_USED) = 0
2020.10.14 08:49:24.031 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 864
2020.10.14 08:49:25.399 CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 14372119
2020.10.14 08:49:25.465 After CopyTicks:
2020.10.14 08:49:25.465 i = 0
2020.10.14 08:49:25.465 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:25.499 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:26.594 i = 1
2020.10.14 08:49:26.594 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:26.630 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:27.729 i = 2
2020.10.14 08:49:27.729 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:27.762 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:28.852 i = 3
2020.10.14 08:49:28.852 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:28.884 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:29.977 i = 4
2020.10.14 08:49:29.977 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:30.009 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:31.102 i = 5
2020.10.14 08:49:31.102 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:31.136 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:32.224 i = 6
2020.10.14 08:49:32.225 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:32.257 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:33.348 i = 7
2020.10.14 08:49:33.348 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:33.381 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:34.468 i = 8
2020.10.14 08:49:34.468 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:34.501 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:35.593 i = 9
2020.10.14 08:49:35.593 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:35.605 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 860
 
fxsaber:

22% - bien.

SymbolInfoTick - en la máquina de casa me di cuenta a ojo de que no había alertas. Sin embargo, hice un filtro sobre estas alertas en el Registro y vi que había muchas más que las 2650 emitidas durante el mismo periodo hace veinticuatro horas.

Envié ambos registros al PM.

Aceleración por un factor de diez en los casos de acceso paralelo masivo.

En otros casos, sólo se actualiza el procesador, la memoria y el sistema operativo.