Errori, bug, domande - pagina 2676

 
Sergey Dzyublik:

MT5 (build 2347) Perché un overhead così grande quando si aggiunge un elemento alla volta a un array usando ArrayResize, se la memoria è stata riservata per loro in anticipo?

Si prega di considerare il miglioramento dell'algoritmo interno di prenotazione con ArrayResize.

Per esempio, per le classi possiamo supporre che eseguano qualche tipo di "registrazione interna in liste" oltre a chiamare il costruttore.
E nel quadro della prenotazione con ArrayResize, oltre all'allocazione diretta della memoria, si può cercare di ottimizzare il processo:
- prendere i dati dall'elemento creato adiacente (ad esempio il puntatore a una tabella di funzioni virtuali);
- pre-eseguire o riservare spazio per la "registrazione interna" di classi che non sono ancora state create;

Grazie per il messaggio.

Il codice ArrayResize è protetto dall'essere chiamato vuoto (quando non c'è cambiamento nel numero di elementi), quindi il codice della funzione non funziona.

Mentre un cambiamento reale nel numero di elementi innesca una o l'altra parte della funzione ArrayResize, a seconda dell'array


Grazie al codice che hai presentato, sono riuscito a ridurre la complessità di una parte di ArrayResize a zero, questo accelererà la funzione per gli array di oggetti
 
Ilyas:

Potete dirmi come ridurre il consumo di memoria del terminale? Quando eseguo un EA, richiedo alcuni milioni di tick. Ci faccio dei calcoli e non ne ho più bisogno. Uso le funzioni tick solo per caricare tick freschi, così non ci sono lacune.


A causa di questi milioni di tic il terminale consuma 500 Mb di memoria e non si affretta a liberarla. Per essere più precisi, semplicemente non lo libera. È possibile forzare Terminal a cancellare tutte le sue cache per minimizzare il consumo? Per un VPS, 0,5 GB per terminale è troppo.

 
fxsaber:

Potete dirmi come ridurre il consumo di memoria del terminale? Quando eseguo un EA, richiedo alcuni milioni di tick. Ci faccio dei calcoli e non ne ho più bisogno. Uso le funzioni tick solo per caricare tick freschi, così non ci sono lacune.


A causa di questi milioni di tic il terminale consuma 500 Mb di memoria e non si affretta a liberarla. Per essere più precisi, semplicemente non lo libera. È possibile forzare Terminal a cancellare tutte le sue cache per minimizzare il consumo? Per i VPS, 0,5 GB per terminale è troppo.

ArrayFree

Se il vostro programma ha bisogno di gestire la memoria in ambienti dinamici complessi, la funzione ArrayFree() vi permette di liberare esplicitamente e immediatamente la memoria occupata da un array dinamico che non è più necessario.

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

ArrayFree

Gratis, ovviamente. Il terminale stesso memorizza i tick nella sua cache, che non mi serve durante il funzionamento.

È meglio per me sollevare di nuovo queste zecche quando ho freddo. Ho bisogno di un meccanismo per "raffreddare" il terminale.

 

Ciao, ho riscontrato un problema che CopyTicks e CopyTicksRange nel tester non possono ottenere dati da altri strumenti... Quando viene aggiunto al grafico, tutto funziona.

Costruire 2363 (e lo stesso era nel 2361)

Posso aver commesso un errore? Per favore aiutatemi, grazie!

#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;
}
File:
terminal.png  59 kb
tester.png  25 kb
tester_log.png  41 kb
 
LittleBitTime:

Ciao, ho riscontrato un problema che CopyTicks e CopyTicksRange nel tester non possono ottenere dati da altri strumenti... Quando viene aggiunto al grafico, tutto funziona.

Costruire 2363 (e lo stesso era nel 2361)

Posso aver commesso un errore? Per favore aiutatemi, grazie!

CopyTicks non avvia un caricamento di dati nel tester

Richiedi prima i CopyRate dello strumento desiderato. Almeno 1 bar. Poi il pompaggio e la generazione della sequenza di tick avranno luogo.

Dopo di che, in silenzio la richiesta ticchetta

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

Grazie per il messaggio.
Il codice ArrayResize ha una protezione contro una chiamata vuota (quando non c'è cambiamento nel numero di elementi), quindi il codice della funzione non funziona.
Mentre un cambiamento reale nel numero di elementi, innesca una o l'altra parte della funzione ArrayResize, a seconda dell'array

Grazie al codice che hai presentato, sono riuscito a ridurre la complessità di una parte di ArrayResize a zero, questo accelererà la funzione per gli array di oggetti

Buon pomeriggio, grazie mille.
Non ho mai usato l'operatore new, perché dovrebbe essere più lento per logica di ArrayResize con memoria riservata.
Ma sono impressionato dai risultati ottenuti, si scopre che è viceversa, l'array nativo tramite il nuovo operatore è più veloce.

MT5 (build 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 non avvia un caricamento di dati nel tester

Richiedi prima i CopyRate dello strumento desiderato. Almeno 1 bar. Poi il pompaggio e la generazione della sequenza di tick avranno luogo.

Dopo di che, in silenzio la richiesta ticchetta

Grazie mille, mi ha aiutato. Non l'ho trovato nella documentazione... O non ho cercato abbastanza? Non sarebbe male scriverci sopra :)
 
LittleBitTime:
Grazie mille, mi ha aiutato. Non l'ho trovato nella documentazione... O ho cercato male? Sarebbe bello scriverci sopra :)

Sarebbe meglio fare degli upload automatici come su CopyRates.

 

Pulito l'elenco dei "vecchi" agenti inattivi nel mio profilo ieri

Un giorno dopo vado sul profilo e vedo che l'elenco degli agenti è stato ripristinato con le voci che erano state cancellate.

E la data di creazione e di attività degli agenti è stata cambiata

C'è un presupposto (forse errato) che l'elenco viene ripristinato dopo aver visualizzato le statistiche degli agenti su cloud.mql5.com