Errores, fallos, preguntas - página 1850

 
¿Es un error?
struct STRUCT
{
  int a;
  
  STRUCT() {} // Если закомментировать, ошибка пропадает
};

void OnStart()
{
  STRUCT Struct = {1}; // cannot be initialized with initializer list
}
 

¿un error al utilizar un estilizador?

Supongamos que escribimos utilizando la pestaña.

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
   input int x=0;
   #define  TWO_DIM (10000)
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double      massive[][TWO_DIM];
  }
//+------------------------------------------------------------------+

No hay ningún error.

entonces utilizamos el estilizador, obtenemos

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
input int x=0;
#define  TWO_DIM(10000)
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double      massive[][TWO_DIM];
  }
//+------------------------------------------------------------------+
'10000' - unexpected in macro formal parameter list     bug.mq5 7       17
'[' - invalid index value       bug.mq5 13      25

es decir, el estilizador borra el espacio entre elTWO_DIM(10000)

 
Error de compilación
template <typename T>
struct STRUCT
{
  template <typename T1>  
  STRUCT( T1 Value ) {} // 'STRUCT<int><int>' - declaration without type

};

void OnStart()
{
  STRUCT<int> Struct(0); // 'STRUCT<int>' - cannot to apply function template
}
 
Un poco de sombrero. Evitar el operador de asignación
template <typename T>
struct STRUCT_COPY
{
  T Value;
  
  STRUCT_COPY( const T& tValue)
  {
    this = (STRUCT_COPY)tValue;
  }  
};

struct STRUCT
{
  int i;
  
  void operator =( const STRUCT& )
  {
    this.i = 5;
  }
};

#define  PRINT(A) ::Print(#A + " = " + (string)(A));

void OnStart()
{
  STRUCT Struct;  
  Struct.i = 1;  
  PRINT(Struct.i);
  
  STRUCT StructCopy1 = Struct;
  PRINT(StructCopy1.i);
  
  // Обходим void STRUCT::operator=(const STRUCT&)
  STRUCT_COPY<STRUCT> StructCopy2(Struct);
  PRINT(StructCopy2.Value.i);  
}

Resultado

Struct.i = 1
StructCopy1.i = 5
StructCopy2.Value.i = 1
 

¿Cuál es el camino correcto?

struct STRUCT
{
  template <typename T>
  void operator []( int ) {}
};

void OnStart()
{
  STRUCT Struct;
  
  Struct.operator[]<int>(0); // Нормально
  Struct[0]<int>;            // Ошибка
}
 
otra pregunta - Entiendo, que en MT5 el primer tiempo de copia del buffer CopyClose depende de:

1. si antes no recibía cotizaciones de un ticker en absoluto, no abría un gráfico, etc. (depende del ping, de la velocidad de Internet, del disco duro, de la preparación del archivo Bases/Broker/history/ticker/cache/)

2017.04.11 11:27:38.828 время копирования буфера (EURUSD,M1)    проход = 0  время= 8355581
2017.04.11 11:27:38.828 время копирования буфера (EURUSD,M1)    проход = 1  время= 1083

2. si las cotizaciones se han recibido previamente y luego se ha recargado el terminal, siempre que no se haya abierto ningún gráfico de este ticker (preparación del fichero Bases/Broker/Historia/Ticker/Cache/)

2017.04.11 11:29:14.672 время копирования буфера (EURUSD,M1)    проход = 0  время= 599396
2017.04.11 11:29:14.734 время копирования буфера (EURUSD,M1)    проход = 1  время= 259
/////////////////////////////
2017.04.12 19:32:46.489 время копирования буфера (FULT,M5)      проход = 0  время= 98167
2017.04.12 19:32:46.557 время копирования буфера (FULT,M5)      проход = 1  время= 155
2017.04.12 19:32:46.557 время копирования буфера (FULT,M5)      проход = 2  время= 14

el tiempo es 10-15 veces menor que p.1


para comparar el tiempo de acceso en МТ4 según el punto 2, es decir, después del reinicio del terminal

2017.04.12 19:30:38.831 время копирования буфера EURUSD,M1: проход = 2  время= 276
2017.04.12 19:30:38.831 время копирования буфера EURUSD,M1: проход = 1  время= 434
2017.04.12 19:30:38.831 время копирования буфера EURUSD,M1: проход = 0  время= 2260
2017.04.12 19:30:38.816 время копирования буфера EURUSD,M1: initialized
2017.04.12 19:30:38.666 время копирования буфера EURUSD,M1 inputs: Pair=USDCAD;

es decir, el tiempo tras el reinicio del terminal MT4 es unos cuantos órdenes de magnitud menos.

Esta vez he comprobado todo en el Windows, ¡sin SSD!

Cuando obtuve las cotizaciones, el terminal no se reinició, se accedió a los datos

2017.04.11 11:35:30.648 время копирования буфера (EURUSD,M1)    проход = 0  время= 89
2017.04.11 11:35:30.648 время копирования буфера (EURUSD,M1)    проход = 1  время= 42

¿He entendido bien que después de cargar la caché, el terminal necesita bastante menos tiempo para las siguientes peticiones (a partir de la segunda petición)?

¿Podemos reducir de alguna manera el tiempo de la primera llamada tras el reinicio del terminal para que sea como en MT4?

El código estaba en https://www.mql5.com/ru/forum/1111/page1870#comment_4856899

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум алго-трейдеров MQL5
 
kaus_bonus:
Tengo otra pregunta - Tengo entendido que en MT5 el tiempo de la primera copia del mismo buffer CopyClose depende de:

Tienes un método de prueba muy sucio, ya que no hay ninguna descripción del entorno y del método de reproducción.

No se especifica:

  • Límites de las barras en la ventana
  • volúmenes de datos reales en las bases de datos de los terminales
  • ¿exactamente en qué servidor, están las bases de datos en el disco? se debe garantizar que todos los datos estén en el disco.
  • plataforma y tasa de bits de la prueba (¿bajo vino? hay que especificar en detalle)
  • ventanas abiertas

Sin esto, las conclusiones son infundadas.


Por ejemplo, mira el EURUSD M1 - MT5 tiene más de 6 millones de barras allí (si el modo ilimitado en los gráficos), pero MT4 tiene cuántos? ¿Un par de decenas de miles de barras M1 en la base de datos real?
 
Renat Fatkhullin:

Tienes un método de prueba muy desordenado, ya que no hay ninguna descripción del entorno ni del método de reproducción.

No se especifica:

  • límites de las barras en la ventana

  • volúmenes de datos reales en las bases de datos de los terminales
  • ¿qué es exactamente el servidor, están las bases en el disco? se debe garantizar que todos los datos estén en el disco.
  • plataforma y tasa de bits de las pruebas (¿bajo vino? hay que especificar en detalle)
  • disponibilidad de ventanas abiertas

Sin eso, las conclusiones son infundadas.


Me han hecho la mayoría de las preguntas de mi post, no hay problema, ahora te doy todos los datos.

en primer lugar la respuesta a la

какой точно сервер, находятся ли базы на диске? все данные обязаны быть гарантированно на диске.

En el servidor MQ-demo se cargan los datos, tal y como hemos comentado en los puntos 2 y 3 del post anterior. Con el punto 1 todo está claro y no hay preguntas allí - como fue escrito - los datos se cargan, la caché se forma en la ruta especificada.

лимиты баров в окне

MT4

MT5

фактические объемы данных в базах терминалов

MT4

MT5

платформа и битность тестирования (под вайном? нужно указывать детально)

win XP 32bit, todos los builds de MT todos los últimos

наличие открытых окон

MT4 - abrir 1 gráfico, comprobar con otro símbolo

MT5 - 1 gráfico abierto, comprobar con otro símbolo

repetir, recargar el terminal, enviar el script al gráfico, seleccionar OTRO símbolo, cuyos datos se han cargado ANTES de recargar el terminal

MT4

2017.04.12 21:18:31.575 время копирования буфера EURUSD,M1: проход = 2  время= 36
2017.04.12 21:18:31.575 время копирования буфера EURUSD,M1: проход = 1  время= 282
2017.04.12 21:18:31.575 время копирования буфера EURUSD,M1: проход = 0  время= 1871
2017.04.12 21:18:31.575 время копирования буфера EURUSD,M1: initialized
2017.04.12 21:18:31.405 время копирования буфера EURUSD,M1 inputs: Pair=GBPUSD; 

MT5

2017.04.12 21:19:47.735 время копирования буфера (EURUSD,H1)    проход = 0  время= 303951
2017.04.12 21:19:47.735 время копирования буфера (EURUSD,H1)    проход = 1  время= 29
2017.04.12 21:19:47.735 время копирования буфера (EURUSD,H1)    проход = 2  время= 25
 

Aquí está mi prueba con más detalle y más precisión:

Descripción de las condiciones
MetaTrader 4 build 1065
MetaTrader 5 x64 build 1580
Sistema de hardware y funcionamiento
Windows 10 Pro x64, Intel Xeon E5-2690 v3 a 2,60 GHz, RAM: 32 Gb, Disco SSD
Servidor de comercio
MetaQuotes-Demo
MetaQuotes-Demo
Limitar las barras en los gráficos en la configuración
10 000
10 000
Barras de límite en la configuración del historial 10 000 000
Sin límite
Número real de barras en el EURUSD, M1
3,382 millones de euros
6,538 millones de euros
Símbolo verificado y punto
EURUSD, M1
EURUSD, M1
Gráficos abiertos
GBPUSD, sólo M1, el script también se lanza sobre él
sólo GBPUSD, M1, la misma secuencia de comandos se lanza en él
Los resultados son en frío, después de la puesta en marcha del terminal
#0 pass, 1000 records in 680 msc
#1 pass, 1000 records in 2 msc
#2 pass, 1000 records in 2 msc

#0 pass, 1000 records in 113497 msc
#1 pass, 1000 records in 3 msc
#2 pass, 1000 records in 3 msc

Los resultados están calientes, la segunda corrida es inmediatamente después de la primera
#0 pass, 1000 records in 13 msc
#1 pass, 1000 records in 2 msc
#2 pass, 1000 records in 2 msc
#0 pass, 1000 records in 14 msc
#1 pass, 1000 records in 2 msc
#2 pass, 1000 records in 2 msc

Se adjuntan los archivos de prueba y todos los tiempos están en microsegundos (no en milisegundos, 1 milisegundo = 1000 microsegundos).

Ahora las conclusiones:

  1. La única diferencia es la velocidad de inicialización de la caché de gráficos: 0,6 ms para MT4 frente a 113 ms para MT5

    Aquí no hay problema: levantar siempre cuesta recursos.
    Especialmente cuando se utilizan arquitecturas conceptualmente diferentes: MT5 tiene cachés más complejas (los archivos *.hc de la caché se construyen a partir de los *.hcc originales) en aras del escalado + control obligatorio de la sincronización completa con los datos del servidor (trozos binarios *.hcc).

  2. Las solicitudes repetidas muestran una velocidad idéntica: 2-3 microsegundos por copia de datos

    No hay fallos en la implementación de ambos terminales y todo funciona rápidamente.
Archivos adjuntos:
 

Gracias por su respuesta.

En general, los resultados son los que he mostrado en mis posts.

He estado probando en uno normal.

Y, sin embargo, los resultados entre MT4 y MT5 son casi 200 veces diferentes (debido a -debe controlar la sincronización completa con los datos del servidor? y el ping? ).

Me he acostumbrado antes de publicar aquí que probablemente sea una característica del terminal. Incluso puedo vivir con ello, pero es difícil en algunos momentos. Por ejemplo, los precios sólo están disponibles a través de CopyClose, no están disponibles a través de SymbolInfoDouble o a través de MqlTick hasta que el símbolo se añada a la vigilancia del mercado, por lo que este script se ejecuta "infinitamente" mucho después del inicio de la terminal. Esto es sólo un ejemplo.