Errores, fallos, preguntas - página 1124

 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
  struct ARGB
  {
    uchar blue;
    uchar green;
    uchar red;
    uchar alpha;
  };
  
  struct N
  {
    uint num;
  };
  
  N n={100288};
  ARGB c;
  c=n;         //так получаем предупреждение implicit struct cast       sample.mq5      22      4
  c=(ARGB)n;   //а так всё в порядке
}
Aunque ambas estructuras tienen el mismo tamaño y se copian la una a la otra sin pérdida, seguimos recibiendo un aviso.
 
Fleder:
Aunque ambas estructuras tienen el mismo tamaño y se copian la una a la otra sin pérdida, seguimos recibiendo un aviso.
Bueno, eso es genial. No es tan difícil hacer un reparto explícito. Pero no es tan agradable intentar averiguar qué se ha asignado cuando se producen fallos.
 
TheXpert:
Así que eso es genial. No es tan difícil hacer una casta evidente. Y averiguar dónde asignar cada cosa cuando empiezan a aparecer los fallos no es muy agradable.
Parece que el lema del compilador es: "Más vale prevenir que curar".
 

Copia de la aplicación al SR:

Capacidad de autodescarga de series temporales desde la RAM a la caché *.hc
Errores, MetaTrader 5 MQL, Abierto, Iniciado: 2014.04.12 06:04, #995430

Versión y bit del terminal

910 32 bits

Descripción del problema

¡Hola, queridos desarrolladores!

En MQL5 una serie de funciones del sistema comoCopyRates,CopyTime,CopyOpen, etc. están destinadas a recibir datos de series temporales.

Cuando se llama a cualquiera de estas funciones, la serie temporal solicitada se carga en la memoria RAM dentro del parámetro "Max bars in chart".

Sin embargo, la combinación de factores como:

1. Historial suficientemente profundo disponible en el símbolo o completamente cargado desde el servidor.

2. El parámetro "Max bars in chart" es "Unlimited".

3. Se solicitan datos de la franja temporal más pequeña M1.

Se está consumiendo una gran cantidad de memoria.

El problema se agrava por el hecho de que la lógica del programa que ejecuta MQL5 (por ejemplo, si es un Asesor Experto multidivisa o un indicador)

puede establecerse para el acceso alternativo a los datos de las franjas horarias de bajo nivel de varios símbolos (por ejemplo, la búsqueda individual).

Como resultado, el consumo de RAM se multiplica.

Получение данных нужного таймфрейма из промежуточных данных

Los archivos de servicios en el formato HCC desempeñan el papel de fuente de datos para construir los datos de precios por los plazos solicitados en el formato HC. Los datos en el formato HC son series temporales que están preparadas al máximo para un acceso rápido. Se crean sólo a petición de un gráfico o programa mql5 en el volumen que no exceda el parámetro "Barras máximas en los gráficos", y se guardan para su posterior uso en archivos con la extensión hc.

Para ahorrar recursos, los datos del marco temporal se cargan y almacenan en la RAM sólo cuando se necesitan.En caso de ausencia prolongada de solicitudes, los datos se descargan de la RAM guardándolos en un archivo. Los datos de cada marco temporal se preparan independientemente de los datos listos para otros marcos temporales. Las normas de preparación y disponibilidad de los datos son las mismas para todos los plazos. Es decir, a pesar de que la unidad de almacenamiento de datos en el formato HCC es la barra de minutos, la disponibilidad de los datos en el formato HCC no significa la disponibilidad y accesibilidad de los datos en formato HC para el marco temporal M1 en el mismo volumen.

La recepción de nuevos datos del servidor provoca la actualización automática de los datos de precios utilizados en formato HC para todos los plazos y el recálculo de todos los indicadores, que los utilizan explícitamente como datos de entrada para el cálculo.

El tiempo del proceso resaltado en amarillo en la cita de la documentación es bastante grande: alrededor de media hora (según mis observaciones).

Como resultado, todas las series temporales solicitadas están "sentadas" en la "RAM" sin ninguna razón.

Si la "RAM" no es de "goma Y el "voraz" Asesor Experto/indicador demanda más y más series de tiempo, el terminal no tiene otra cosa que hacer

excepto para un "volcado" urgente del exceso de series temporales al archivo (caché). Así, en este reinicio de emergencia, el terminal puede restablecer las series de tiempo a

un "caché roto", es decir, perderá "una buena mitad" de los datos. Y la próxima vez que se acceda a esta serie de tiempo, el terminal carga esta "caché rota" como una normal.

Como resultado, el gráfico del terminal muestra las series temporales necesarias con un enorme agujero en el historial.

Resultado esperado

El lenguaje MQL5 tiende a ahorrar recursos del entorno de ejecución. Un ejemplo de ello es el siguiente:

1. la funciónArrayFree

2. funciónresourceFree

3.borrar el operador

4. Parámetro"Barras máximas en los gráficos

¿Es posible añadir una función del sistema a la funcionalidad del lenguaje MQL5 que obligue al terminal a realizar operaciones con las series de tiempo que ya no se utilizan?

¿Si no hay un gráfico abierto con esta serie temporal, al final de la temporización?

Por ejemplo, una función:

bool SeriesFlush(
   string           symbol_name,       // имя символа
   ENUM_TIMEFRAMES  timeframe,         // период
   );

Esto permitiría:

1. No preocuparse por el desbordamiento de la RAM.

2. no te preocupes por los "cachés rotos" de los que sólo puedes deshacerte borrando manualmente los archivos *.hc cuando el terminal está apagado.

3. No tienes que depender del modo de bits de tu sistema operativo ni del tamaño de la RAM.

4. Cuando desarrolle un producto de software, no utilice "muletas" que traten de eludir las desventajas descritas anteriormente.

 
Fleder:

Copia de la aplicación al SR:

Posibilidad de autodescargar las series de tiempo de la RAM a la caché *.hc
Es una gran idea.
 
¿Puedes decirme cómo obtener los datos de un indicador que tiene un sesgo positivo? Me interesan los datos de la barra -1?
 
dentraf:
¿Puedes decirme cómo obtener los datos del indicador con un desplazamiento positivo? Me interesan los datos de la barra -1?

Para ello, es necesario conocer la configuración del desplazamiento de la línea indicadora de interés. Este es un ejemplo del indicador técnicoiAlligator

//--- зададим смещение для каждой линии
   PlotIndexSetInteger(0,PLOT_SHIFT,jaw_shift);

Se trata de una compensación, no de un cálculo de indicadores para el futuro.

 

Copiar de la aplicación a la SD:

Funcionamiento incorrecto de la función del sistema IsStopped en los indicadores
Errores, MetaTrader 5 MQL, Abierto, Iniciado: 2014.04.12 07:59, #995480

Versión del terminal y modo de bits

910 32 bits

Descripción del problema

¡Hola, queridos desarrolladores!

Una de las recomendaciones para mejorar la calidad del código cuando se diseñan bucles con un gran número de iteraciones

es incorporar la verificación de una parada forzada de un programa MQL5 utilizando el sistema

Función del sistemaIsStopped();

Sin embargo, en la práctica, esta comprobación no funciona en los indicadores (sí en los scripts y en los Asesores Expertos)

Aquí está el código corto del indicador que muestra la esencia del problema:

#property  indicator_plots 0
//=====================================================================
// Custom indicator initialization function
//=====================================================================
int OnInit()
{
  return(INIT_SUCCEEDED);
}
//=====================================================================
// Custom indicator iteration function
//=====================================================================
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
  long n=0;
  for(int i=0;i<1 e+10 && !IsStopped();i++) {n++;}
  Print("OnCalculate End");
  return(rates_total);
}

Si intenta eliminar este indicador del gráfico, el proceso de "cálculo del indicador" no se detendrá como tal,

aunque debería, debido a la comprobación de la bandera de parada del programa.

Puede averiguarlo fácilmente supervisando el proceso terminal.exe en el Administrador de tareas. En un procesador de cuatro núcleos

es alrededor del 25% de la carga de la CPU. Además, la carga terminal no disminuye en absoluto con el tiempo hasta que el

cierre de la terminal. E incluso después de cerrar el terminal, el proceso terminal.exe sigue colgado en el gestor. Y, se siente como,

que es descargado por el sistema operativo como "colgado".


Resultado esperado

Por favor, arreglen este problema.

 
barabashkakvn:

Para ello, es necesario conocer la configuración del desplazamiento de la línea indicadora de interés. Este es un ejemplo del indicador técnicoiAlligator

Se trata de una compensación, no del cálculo del indicador para el futuro.

Tengo un cálculo de futuro, pero utilizo un desplazamiento para rendirlo, ¿cómo calculo -1 barra del Asesor Experto?

Si alguien lo necesita, utilice CopyBuffer(Handle_original,0,-2,10,Data_Ind )

 
dentraf:
Exactamente, tengo un cálculo en el futuro, pero para dibujar un desplazamiento, ¿cómo puedo leer -1 bar del Asesor de Expertos?
No hay cotización para el bar -1. El desplazamiento es: el cálculo para una barra que existe (por ejemplo, la barra número 2) y luego este valor calculado se traza en la barra 2 menos el desplazamiento. Es decir, si el desplazamiento es 5, el valor calculado en la barra 2 se dibuja en la barra "-3".
Razón de la queja: