Errores, fallos, preguntas - página 2676

 
Sergey Dzyublik:

MT5 (build 2347) ¿Por qué una sobrecarga tan grande cuando se añade un elemento a la vez a una matriz utilizando ArrayResize, si la memoria se ha reservado para ellos de antemano?

Por favor, considere la posibilidad de mejorar el algoritmo de reserva interna con ArrayResize.

Por ejemplo, para las clases podemos suponer que realizan algún tipo de "registro interno en listas" además de la llamada al constructor.
Y en el marco de la reserva con ArrayResize, además de la asignación directa de memoria, se puede intentar optimizar el proceso:
- tomar datos del elemento adyacente creado (por ejemplo, puntero a una tabla de funciones virtuales);
- preejecutar o reservar espacio para la "inscripción interna" de las clases que aún no han sido creadas;

Gracias por el mensaje.

El código de ArrayResize está protegido de ser llamado vacío (cuando no hay cambio en el número de elementos), por lo que el código de la función no funciona.

Mientras que un cambio real en el número de elementos activa una u otra parte de la función ArrayResize, dependiendo del array


Gracias al código que has presentado, he podido reducir la complejidad de una parte de ArrayResize a cero, esto acelerará la función para arrays de objetos
 
Ilyas:

¿Pueden decirme cómo reducir el consumo de memoria del terminal? Cuando ejecuto un EA, solicito unos cuantos millones de ticks. Hago cálculos con ellos y ya no los necesito. Sólo utilizo las funciones de garrapata para cargar garrapatas frescas para que no haya espacios en blanco.


Debido a ese millón de ticks el terminal consume 500 Mb de memoria y no se apresura a liberarla. Para ser más exactos, simplemente no lo libera. ¿Es posible forzar a Terminal a borrar todas sus cachés para minimizar el consumo? Para un VPS, 0,5 GB por terminal es demasiado.

 
fxsaber:

¿Pueden decirme cómo reducir el consumo de memoria del terminal? Cuando ejecuto un EA, solicito unos cuantos millones de ticks. Hago cálculos con ellos y ya no los necesito. Sólo utilizo las funciones de garrapata para cargar garrapatas frescas para que no haya huecos.


Debido a ese millón de ticks el terminal consume 500 Mb de memoria y no se apresura a liberarla. Para ser más exactos, simplemente no lo libera. ¿Es posible forzar a Terminal a borrar todas sus cachés para minimizar el consumo? Para el VPS, 0,5 GB por terminal es demasiado.

ArrayFree

Si su programa necesita gestionar la memoria en entornos dinámicos complejos, la función ArrayFree() le permite liberar explícitamente y de forma inmediata la memoria ocupada por un array dinámico que ya no se necesita.

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

ArrayFree

Gratis, por supuesto. El propio terminal almacena ticks en su caché, que no necesito durante el funcionamiento.

Es mejor que vuelva a criar estas garrapatas cuando tenga frío. Necesito un mecanismo para "enfriar" el Terminal.

 

Hola, he encontrado un problema que CopyTicks y CopyTicksRange en el probador no puede obtener datos de otras herramientas... Cuando se añade al gráfico, todo funciona.

Construir 2363 (y lo mismo fue en 2361)

¿He cometido un error? Por favor, ayuda, ¡gracias!

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

Hola, he encontrado un problema que CopyTicks y CopyTicksRange en el probador no puede obtener datos de otras herramientas... Cuando se añade al gráfico, todo funciona.

Bild 2363 (y lo mismo ocurría en el 2361)

¿Me habré equivocado? Por favor, ayuda, ¡gracias!

CopyTicks no inicia una carga de datos en el probador

Solicite primero los CopyRates del instrumento deseado. Al menos 1 bar. A continuación, se producirá el bombeo y la generación de la secuencia de garrapatas.

Después de eso, en silencio solicitar garrapatas

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

Gracias por el mensaje.
El código de ArrayResize tiene protección contra una llamada vacía (cuando no hay cambio en el número de elementos), por lo que el código de la función no funciona.
Mientras que un cambio real en el número de elementos, activa una u otra parte de la función ArrayResize, dependiendo del array

Gracias al código que has presentado, he conseguido reducir la complejidad de una parte de ArrayResize a cero, esto agilizará la función para arrays de objetos

Buenas tardes, muchas gracias.
No he utilizado el operador new antes, ya que debe ser más lento por lógica que ArrayResize con memoria reservada.
Pero estoy impresionado con los resultados obtenidos, resulta que es al revés, el array nativo mediante el operador new es más rápido.

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 no inicia una carga de datos en el probador

Solicite primero los CopyRates del instrumento deseado. Al menos 1 bar. A continuación, se producirá el bombeo y la generación de la secuencia de garrapatas.

Después de eso, en silencio solicitar garrapatas

Muchas gracias, eso ayudó. No encontré eso en la documentación... ¿O es que no he buscado lo suficiente? No estaría mal escribir sobre ello allí :)
 
LittleBitTime:
Muchas gracias, me ha servido de ayuda. No pude encontrarlo en la documentación... ¿O he buscado mal? Sería bueno escribir sobre ello allí :)

Sería mejor hacer subidas automáticas como en CopyRates.

 

Ayer limpié la lista de "viejos" agentes inactivos en mi perfil

Un día después voy al perfil y veo que la lista de agentes ha sido restaurada con las entradas que fueron borradas.

Y se ha modificado la fecha de creación y actividad de los agentes

Existe una suposición (posiblemente errónea) de que la lista se restablece después de ver las estadísticas de los agentes en cloud.mql5.com