Erros, bugs, perguntas - página 2676

 
Sergey Dzyublik:

MT5 (build 2347) Porquê uma sobrecarga tão grande ao adicionar um elemento de cada vez a um array usando o ArrayResize, se a memória foi reservada para eles com antecedência?

Por favor, considere melhorar o algoritmo de reserva interna com o ArrayResize.

Por exemplo, para as classes, podemos assumir que elas realizam algum tipo de "registo interno em listas" para além da chamada do construtor.
E no âmbito da reserva com ArrayResize, para além da alocação directa de memória, pode tentar optimizar o processo:
- retirar dados do elemento criado adjacente (por exemplo, ponteiro para uma tabela de funções virtual);
- pré-executar ou reservar espaço para "inscrição interna" de aulas que ainda não foram criadas;

Obrigado pela mensagem.

O código ArrayResize está protegido de ser chamado vazio (quando não há alteração no número de elementos), pelo que o código de função não funciona.

Considerando que uma mudança real no número de elementos desencadeia uma ou outra parte da função ArrayResize, dependendo da matriz


Graças ao código que apresentou, consegui reduzir a complexidade de uma parte do ArrayResize a zero, isto irá acelerar a função para as matrizes de objectos
 
Ilyas:

Pode dizer-me como reduzir o consumo de memória do terminal? Quando dirijo uma EA, peço alguns milhões de carraças. Eu faço cálculos sobre eles e já não preciso deles. Utilizo apenas funções de carraças para carregar carraças frescas, para que não haja lacunas.


Devido a esses milhões de carrapatos, o terminal consome 500 Mb de memória e não tem pressa em libertá-la. Para ser mais exacto, simplesmente não o liberta. É possível forçar o Terminal a limpar todas as suas caches para minimizar o consumo? Para um VPS, 0,5 GB por terminal é demasiado.

 
fxsaber:

Pode dizer-me como reduzir o consumo de memória do terminal? Quando dirijo uma EA, peço alguns milhões de carrapatos. Eu faço cálculos sobre eles e já não preciso deles. Utilizo apenas funções de carraças para carregar carraças frescas, para que não haja lacunas.


Devido a esses milhões de carrapatos, o terminal consome 500 Mb de memória e não tem pressa em libertá-la. Para ser mais exacto, simplesmente não o liberta. É possível forçar o Terminal a limpar todas as suas caches para minimizar o consumo? Para VPS, 0,5 GB por terminal é demasiado.

ArrayFree

Se o seu programa precisa de gerir a memória em ambientes dinâmicos complexos, a função ArrayFree() permite-lhe libertar explícita e imediatamente a memória ocupada por uma matriz dinâmica que já não é necessária.

Документация по MQL5: Операции с массивами / ArrayFree
Документация по MQL5: Операции с массивами / ArrayFree
  • www.mql5.com
//| Класс диалога для работы с памятью                               | //| Освобождение памяти текущего массива                             | //| Попытка добавления памяти для текущего массива                   | //| Обработка событий                                                |...
 
Slava:

ArrayFree

Grátis, claro. O próprio terminal armazena carraças na sua cache, das quais não preciso durante a operação.

É melhor para mim levantar estas carraças novamente quando tenho frio. Preciso de um mecanismo para "arrefecer" o Terminal.

 

Olá, encontrei um problema que o CopyTicks e o CopyTicksRange no testador não conseguem obter dados de outras ferramentas... Quando adicionado ao gráfico, tudo funciona.

Build 2363 (e o mesmo foi em 2361)

Posso ter cometido um erro? Por favor, ajudem, obrigado!

#property copyright "Copyright 2020, LittleBitTime"
#property link      "https://login.mql5.com/ru/users/LittleBitTime"
#property version   "1.00"

int OnInit() {
   return INIT_SUCCEEDED;
}

void OnDeinit(const int reason) {
}

void OnTick() {
   MqlTick LastTick;
   if (SymbolInfoTick(Symbol(), LastTick)) {
      //Print("START");
      
      if (GetTicks("RTS-3.20", LastTick.time_msc) && GetTicks("RTS-6.20", LastTick.time_msc)) {
         Print("История загружена");
      } else {
         Print("Ошибка загрузки истории");
      }
      //Print("END");
   } else {
      Print("Ошибка получения последнего тика, для получения последнего известного времени");
   }
}

bool GetTicks(string symbol, ulong TimeEnd) {
   ulong TimeStartPeriod = TimeEnd-(60*1000);
   
   MqlTick ticks[];
   bool success = false; //флаг успешного выполнения копирования тиков
   uint start = GetTickCount(); //замерим время старта перед получением тиков
   
   int received = CopyTicksRange(symbol, ticks, COPY_TICKS_ALL, TimeStartPeriod, TimeEnd);
   if (received != -1) {
      //выведем информацию о количестве тиков и затраченном времени времени
      PrintFormat("%s: received %d ticks in %d ms", symbol, received, GetTickCount()-start);
      //если тиковая история синхронизирована, то код ошибки равен нулю
      if (GetLastError() == 0)
         success = true;
      else
         PrintFormat("%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d", symbol, received, GetTickCount()-start, _LastError);
   }
   
   if (!success) {
      PrintFormat("Ошибкаp загрузки тиков! " + symbol);
      
      return false;
   }
   
   
   return true;
}
Arquivos anexados:
terminal.png  59 kb
tester.png  25 kb
tester_log.png  41 kb
 
LittleBitTime:

Olá, encontrei um problema que o CopyTicks e o CopyTicksRange no testador não conseguem obter dados de outras ferramentas... Quando adicionado ao gráfico, tudo funciona.

Bild 2363 (e o mesmo foi em 2361)

Posso ter cometido um erro? Por favor, ajudem, obrigado!

CopyTicks não inicia um carregamento de dados no testador

Pedir primeiro CopyRates do instrumento desejado. Pelo menos 1 barra. Em seguida, a bombagem e a geração da sequência de carraças terão lugar.

Depois disso, pedir calmamente carraças

Основы тестирования в MetaTrader 5
Основы тестирования в MetaTrader 5
  • www.mql5.com
Идея автоматической торговли привлекательна тем, что торговый робот может без устали работать 24 часа в сутки и семь дней в неделю. Робот не знает усталости, сомнений и страха,  ему не ведомы психологические проблемы. Достаточно четко формализовать торговые правила и реализовать их в виде алгоритмов, и робот готов неустанно трудиться. Но прежде...
 
Ilyas:

Obrigado pela mensagem.
O código ArrayResize tem protecção contra uma chamada vazia (quando não há alteração no número de elementos), pelo que o código de função não funciona.
Considerando que uma mudança real no número de elementos, desencadeia uma ou outra parte da função ArrayResize, dependendo da matriz

Graças ao código que apresentou, consegui reduzir a complexidade de uma parte do ArrayResize a zero, o que acelerará a função para as matrizes de objectos

Boa tarde, muito obrigado.
Nunca tinha utilizado o novo operador antes, porque logicamente deveria ser mais lento do que o ArrayResize com memória reservada.
Mas estou impressionado com os resultados obtidos, acontece que é o contrário, a matriz nativa através do novo operador é mais rápida.

MT5 (construir 2363):

#define  K 1000
#define  M (1000 * K)

#define    SpeedTest(test_count,msg,EX)        {uint mss=GetTickCount(); ulong count=test_count;for(ulong ii=0;ii<count&&!_StopFlag;ii++){EX;} \
                                              printf("%-60s: loops=%i ms=%u",msg,count,GetTickCount()-mss);}
                                              
class A{
public:
   int data;
};


template<typename T>
void test1(const int test_count, const int array_size){
   SpeedTest(
   test_count,"Test Class ArrayResize all",
   {
      T class_array[];
      ArrayResize(class_array, array_size);
   }
   )
};

template<typename T>
void test2(const int test_count, const int array_size){
   SpeedTest(
   test_count,"Test Class ArrayResize one by one with reserved memory",
   {
      T class_array[];
      ArrayResize(class_array, 1, array_size - 1);
      for(int i = 2; i <= array_size; i++){
         ArrayResize(class_array, i);
      }
   }
   )
};

template<typename T>
void test3(const int test_count, const int array_size){
   SpeedTest(
   test_count,"Test Class ArrayResize one by one with new operator",
   {
      T* class_array[];
      ArrayResize(class_array, array_size);
      for (int i = 0; i < array_size; ++i){
         class_array[i] = new T();
      }
      for (int i = 0; i < array_size; ++i){
         delete class_array[i];
      }
   }
   )
};


void OnStart()
{
  const int test_count = 1*K;
  const int array_size = 25*K;  
  
   printf("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
   test1<A>(test_count, array_size);              // Avg time: release( 730) / debug( 830)
   test2<A>(test_count, array_size);              // Avg time: release(1540) / debug(1720)
   test3<A>(test_count, array_size);              // Avg time: release(1200) / debug(1470)
   test1<A>(test_count, array_size);
   test2<A>(test_count, array_size);
   test3<A>(test_count, array_size);
   test1<A>(test_count, array_size);
   test2<A>(test_count, array_size);
   test3<A>(test_count, array_size);
   test1<A>(test_count, array_size);
   test2<A>(test_count, array_size);
   test3<A>(test_count, array_size);
}
  
 
Slava:

CopyTicks não inicia um carregamento de dados no testador

Pedir primeiro CopyRates do instrumento desejado. Pelo menos 1 barra. Em seguida, a bombagem e a geração da sequência de carraças terão lugar.

Depois disso, pedir calmamente carraças

Muito obrigado, isso ajudou. Não encontrei isso na documentação... Ou não procurei o suficiente? Não seria uma coisa má escrever sobre isso lá :)
 
LittleBitTime:
Muito obrigado, ajudou. Não consegui encontrá-lo na documentação... Ou procurei mal? Seria bom escrever sobre isso aí :)

Seria melhor fazer carregamentos automáticos como em CopyRates.

 

Limpei ontem a lista de "velhos" agentes inactivos no meu perfil

Um dia depois vou ao perfil e vejo que a lista de agentes foi restaurada às entradas que foram eliminadas.

E a data de criação e actividade dos agentes foi alterada

Há um pressuposto (possivelmente errado) de que a lista é restaurada após a visualização das estatísticas dos agentes em cloud.mql5.com