Erros, bugs, perguntas - página 1593

 
a mensagem de recall para o produto chega no smartphone, não no LC e no topo do sítio web do µl.
 


O guião mágico inverte o tempo ;-)

O guião mágico inverte o tempo ;-)

 
Vladimir Pastushak:
O smartphone recebe uma mensagem sobre uma revisão do produto, mas não no LC ou no topo do sítio web do mcl.
Sempre foi assim, lembro-me que até pediram para o colocar no website porque é estranho quando deixam feedback, e mesmo que lhe façam perguntas logo de seguida e só se descobre ao fim de 2 meses. :-)
 

Não é um insecto, mas não pode deixar de partilhar

Escrevendo

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

O compilador emite um aviso

data inválida .mq4 115 46

Também verifica as datas válidas das cordas, estou chocado ) (30 de Junho de 30 dias)

 

Aparentemente ninguém se preocupa com isto, mas eu vou escrever novamente.

A verdadeira tarefa é criar matrizes com um tamanho total de cerca de 100% de memória livre, preenchê-las rapidamente com números, realizar cálculos e libertá-las.

Tento obter tamanho de memória livre com

int mem_free_mb=(int)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE);

resultado : 23987 MB, a minha memória física é de 12141 MB, ou seja, metade do valor.

Compreendo que esta figura é para marcianos, mas ainda acredito nela e escrevo um guião para a testar:

//+------------------------------------------------------------------+
//| 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);
  }

Obtenho um resultado lógico - é impossível atribuir array3 porque a memória se esgotou.

Depois descomento a linha, onde especifico quanta memória está disponível agora:

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

Depois disso, o guião é executado com sucesso.

Não quero ser um incómodo para os criadores, mas é importante saber quanta memória está disponível.

Por favor, torne possível conhecê-lo através do TerminalInfoInteger.

 

Está ciente de que na maioria dos casos não será capaz de recuperar toda a memória disponível?

Existe algo como a fragmentação da memória. Decidiu dividir toda a memória em 5 fragmentos - e o sistema não tem um único fragmento ininterrupto de memória do tamanho que necessita.

 
Slawa:

Está ciente de que na maioria dos casos não será capaz de recuperar toda a memória disponível?

Existe tal noção - fragmentação da memória. Decidiu dividir toda a memória em 5 fragmentos - mas o sistema não tem uma única peça de memória contínua do tamanho que necessita.

1. Pode descobrir primeiro o que significa fisicamente o parâmetro TERMINAL_MEMORY_AVAILABLE?

2. Em relação aos fragmentos, penso que isto deveria ser tratado pelo gestor da memória do Windows, e não pelo programador.

Preciso de saber quanto posso usar num dado momento, por exemplo, quero usar 50% da memória disponível.

Outra verdadeira tarefa é o pedido do CopyTicks. Se solicitar mais carraças do que a memória disponível, obtém-se 'fora da memória'.

 
Andrey Voytenko:

Outro verdadeiro desafio é o pedido do CopyTicks. Se solicitar mais carraças do que a memória disponível, obtém-se 'fora da memória'.

Em alternativa, descarregar os dados para um ficheiro e levá-los de lá nos segmentos necessários
 
coderex:
Em alternativa, carregue os dados para um ficheiro e retire daí os segmentos necessários

Isso é lento para mim. Quero fazer tudo através da memória. Na verdade, está a ser feito agora, mas tenho de ligar à GlobalMemoryStatusEx para saber o tamanho da memória disponível.


	          
 
Andrey Voytenko:

Este problema é especialmente agudo quando se optimiza em agentes de nuvens, cujas capacidades nada sabe desde o início. É impossível determinar a quantidade real de memória disponível, nem através de MQL, nem através de WinApi (porque as chamadas dll são proibidas).

Não está realmente claro qual o sentido prático que TERMINAL_MEMORY_AVAILABLE tem então? Porque o introduziríamos se não nos faz nem felizes nem infelizes?