Errores, fallos, preguntas - página 1593

 
el mensaje de retirada del producto aparece en el smartphone, en la LC y en la parte superior de la página web μl no lo hace.
 


El guión mágico invierte el tiempo ;-)

El guión mágico invierte el tiempo ;-)

 
Vladimir Pastushak:
El smartphone recibe un mensaje sobre una reseña del producto, pero no en la LC ni en la parte superior del sitio web de mcl.
Siempre ha sido así, recuerdo que incluso pidieron ponerlo en la web porque es extraño cuando dejan comentarios, y aunque te pregunten enseguida y te enteres sólo después de 2 meses. :-)
 

No es un error, pero no puedo evitar compartirlo

Escribir

if((!IsRunOnTester() && TimeCurrent() >= D'2016.06.31 23:59'))// для тестировщиков, ограничение работы по времени

El compilador emite una advertencia

fecha no válida *****.mq4 115 46

También comprueba que las fechas de las cadenas sean válidas, estoy sorprendido ) (30 días de junio)

 

Aparentemente a nadie le importa esto, pero voy a escribir de nuevo.

La verdadera tarea consiste en crear matrices con un tamaño total de aproximadamente el 100% de la memoria libre, llenarlas rápidamente con números, realizar cálculos y liberarlas.

Intento obtener el tamaño de la memoria libre con

int mem_free_mb=(int)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE);

resultado : 23987 MB, mi memoria física es de 12141 MB, es decir, la mitad.

Entiendo que esta cifra es para los marcianos, pero aún así me lo creo y escribo un script para probarlo:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
#define  PARTS 5

   srand(GetTickCount());
//---
   int mem_free_mb=(int)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE);
   //mem_free_mb=5300;//<--- Столько показывает 'Доступной' в диспетчере задач.
   long mem_for_calc=(long)((double)mem_free_mb*1024*1024);
   long mem_one_part=(long)floor((double)mem_for_calc/PARTS);
   if(mem_one_part>=INT_MAX-1)
      mem_one_part=INT_MAX-1;
//---
   printf("Memory for calc: %0.f MB, parts: %d, part: %0.f MB",mem_for_calc/1024/1024,PARTS,mem_one_part/1024/1024);
   char array1[];
   char array2[];
   char array3[];
   char array4[];
   char array5[];

   int res=ArrayResize(array1,(int)mem_one_part);
   Print("Array1 Resize: ",res);
   if(res<1)return;
   printf("Reserved: %0.f MB",1.0*mem_one_part/1024/1024);

   res=ArrayResize(array2,(int)mem_one_part);
   Print("Array2 Resize: ",res);
   if(res<1)return;
   printf("Reserved: %0.f MB",2.0*mem_one_part/1024/1024);

   res=ArrayResize(array3,(int)mem_one_part);
   Print("Array3 Resize: ",res);
   if(res<1)return;
   printf("Reserved: %0.f MB",3.0*mem_one_part/1024/1024);

   res=ArrayResize(array4,(int)mem_one_part);
   Print("Array4 Resize: ",res);
   if(res<1)return;
   printf("Reserved: %0.f MB",4.0*mem_one_part/1024/1024);

   res=ArrayResize(array5,(int)mem_one_part);
   Print("Array5 Resize: ",res);
   if(res<1)return;
   printf("Reserved: %0.f MB",5.0*mem_one_part/1024/1024);

   uint gtc=GetTickCount();
   for(int i=0;i<mem_one_part;i++)
     {
      char ch=(char)rand();
      array1[i]=ch;
      array2[i]=ch;
      array3[i]=ch;
      array4[i]=ch;
      array5[i]=ch;
     }
//---
   printf("Spent time: %d ms",GetTickCount()-gtc);
  }

Obtengo un resultado lógico: es imposible asignar array3 porque la memoria se ha agotado.

Luego descomento la línea, donde especifico cuánta memoria está disponible ahora:

mem_free_mb=5300;//<--- Столько показывает 'Доступной' в диспетчере задач.

Después de eso, el script se ejecuta con éxito.

No quiero ser una molestia para los desarrolladores, pero es importante saber cuánta memoria está disponible.

Por favor, haga posible conocerlo a través de TerminalInfoInteger.

 

¿Sabe que en la mayoría de los casos no podrá recuperar toda la memoria disponible?

Existe la fragmentación de la memoria. Has decidido dividir toda la memoria en 5 fragmentos - y el sistema no tiene un solo fragmento ininterrumpido de memoria del tamaño que necesitas.

 
Slawa:

¿Sabe que en la mayoría de los casos no podrá recuperar toda la memoria disponible?

Existe esta noción: la fragmentación de la memoria. Has decidido dividir toda la memoria en 5 fragmentos - pero el sistema no tiene un solo fragmento de memoria continua del tamaño que necesitas.

1. ¿Puede averiguar primero qué significa físicamente el parámetro TERMINAL_MEMORY_AVAILABLE?

2. En cuanto a los fragmentos, creo que esto debería ser manejado por el administrador de memoria de Windows, no por el programador.

Necesito saber cuánto puedo utilizar en un momento dado, por ejemplo, quiero utilizar el 50% de la memoria disponible.

Otra tarea real es la solicitud de CopyTicks. Si solicita más ticks que la memoria disponible, se queda "sin memoria".

 
Andrey Voytenko:

Otro verdadero reto es la solicitud de CopyTicks. Si solicita más ticks que la memoria disponible, se queda "sin memoria".

Alternativamente, descargue los datos en un archivo y tómelos de allí en los segmentos requeridos
 
coderex:
Alternativamente, cargue los datos en un archivo y tome los segmentos requeridos desde allí

Eso es lento para mí. Quiero hacerlo todo a través de la memoria. En realidad se está haciendo ahora, pero tengo que llamar a GlobalMemoryStatusEx para averiguar el tamaño de la memoria disponible.


	          
 
Andrey Voytenko:

Este problema es especialmente grave cuando se optimiza sobre agentes en la nube, de cuyas capacidades no se sabe nada desde el principio. Es imposible determinar la cantidad real de memoria disponible allí, ni a través de MQL, ni a través de WinApi (porque las llamadas a dlls están prohibidas).

Realmente no está claro qué sentido práctico tiene entonces TERMINAL_MEMORY_AVAILABLE... ¿Por qué lo introducimos si no nos hace ni felices ni infelices?