Características del lenguaje mql5, sutilezas y técnicas - página 200

 
fxsaber:
Las funciones de los objetos son muy lentas si se arrastra el gráfico con el ratón.
¿No pueden volver a dibujar?
 
Nikolai Semko:
¿Se pueden volver a dibujar?

ObjectFind, por ejemplo, ¿qué tiene que ver con el redibujado?

 
fxsaber:

ObjectFind, por ejemplo, ¿qué tiene que ver con el redibujado?

Ah, eso no es lo que tenía en mente.
 

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Peculiaridades de mql5, consejos y trucos

fxsaber, 2020.03.04 08:58

Antes sólo sospechaba, ahora se confirma. Es fácil tener fugas de memoria cuando se trabaja con recursos.

El script a través de SB emite un gráfico de una matriz numérica en el gráfico. A continuación, puede eliminar manualmente este gráfico (objeto), pero el recurso asignado a este gráfico permanecerá para siempre colgado en la memoria en modo de sólo lectura. No puede ser borrado, porque sólo el script propietario puede borrarlo (ver la línea resaltada).


No hay ninguna funcionalidad en MQL para liberar la memoria tan ocupada. Tenga especial cuidado con esto en VPS.


¿Cómo puedo liberar la memoria en Terminal después de los scripts que no se limpian a sí mismos (o después de paradas anormales)?

// После окончания работы скрипта Терминал потребляет дополнительные 4 Gb. Как освободить?
void OnStart()
{
  uint Data[];
  
  ArrayResize(Data, 1 e6);
  
  for (int i = 0; i < 1000; i++)  
    ResourceCreate("::" + (string)i, Data, ArraySize(Data), 1, 0, 0, ArraySize(Data), COLOR_FORMAT_ARGB_NORMALIZE);
}

En el TaskManager (F2) se muestra muy bien el consumo de memoria. Ahora sólo sirve reiniciar el Terminal.

 
fxsaber:

¿Cómo liberar memoria en el Terminal después de ejecutar scripts que no se limpian a sí mismos (o después de una parada anormal)?

En el TaskManager (F2) el consumo de memoria es perfectamente visible. Por el momento sólo ayuda el reinicio de la terminal.

Normalmente, es necesario llamar a ResourceFree para cada recurso.

En los choques no hay nada que hacer. La única manera de hacerlo es crear tu propia dll que se utilizará para crear recursos y limpiarlos después de la desconexión del hilo.

 
Vladimir Simakov:

Normalmente, hay que llamar a ResourceFree para cada recurso.

No hay nada que pueda hacer en caso de cierre de emergencia. Sólo si haces tu propia dll, a través de la cual crear recursos, que, cuando el hilo se apague, los borrará él mismo.

La parada de emergencia también incluye la interrupción de la depuración.

 
fxsaber:

El fallo incluye una interrupción de depuración.

Por medio de mql estándar - fuga de memoria. Sólo su propia implementación de todo esto debe ser escrita de forma madura. Dado que no es probable que se llame a DllMain con DLL_THREAD_DETACH cuando ese hilo termina, no es la tarea más trivial, pero es manejable.

UPD: Este hilo debería ir en el hilo de errores. IMHO
 

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Nueva versión de MetaTrader 5 build 2650: Carga de gráficos en segundo plano y mejoras en el MQL5 Code Profiler

fxsaber, 2020.10.23 18:44

Ahora en la barra de gráficos no se puede ver en qué gráfico se está ejecutando el Asesor Experto y en cuál no.

¿Es posible añadir un signo distintivo? Por ejemplo, si el gráfico EURUSD está trabajando con un EA, entonces añada un asterisco al final: EURUSD*. En general, algo que pueda ser visualmente pegadizo.

Un montón de gráficos, algunos están ejecutando EAs en algunos. Probablemente también sea útil para los indicadores, pero yo no lo uso. Por eso no lo sé.


Por alguna razón no hay una tecla de acceso directo para la lista de EAs en ejecución. Sólo se puede abrir con el ratón.

F2 ahora. Pulse ENTER en un EA - cambiaremos a su gráfico y se abrirá un árbol con la ruta hacia él en el Navegador. Segunda vez ENTER - fuente en ME.

 
Anteriormente, un error interno en el EA no provocaba su cierre.
2021.03.18 11:41:47.413 zero divide in 'Test9.mq5' (550,5)
2021.03.18 11:42:26.619 array out of range in 'Test9.mq5' (550,8)

Más recientemente, está causando el problema.


Anteriormente, un cliente de Market podía evitar el problema reiniciando el terminal. Ahora no lo hace.

 

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Nueva versión de MetaTrader 4 build 1330

fxsaber, 2021.04.03 00:21

// Конструкция обнаружения бесконечных циклов.
class LOOP
{
private:
  static int PrevLine;    
  static uint PrevTime;
  
public:
#define  LOOP_CHECKTIME 100000 // Максимальная длительность (в миллисекундах) выполнения цикла

  static bool CheckFirst( const int Line )
  {
    if (Line != PrevLine)
    {
      LOOP::PrevTime = ::GetTickCount();
      LOOP::PrevLine = Line;
    }
      
    return(!::IsStopped() && ::GetTickCount() - LOOP::PrevTime < LOOP_CHECKTIME);
  }
  
  static bool Description( const string Str )
  {
    if (!::IsStopped() && (::GetTickCount() - LOOP::PrevTime > LOOP_CHECKTIME))
    {
      ::MessageBox("Endless loop:\n" + Str);
  
      LOOP::PrevTime = ::GetTickCount();
    }
    
    return(!::IsStopped());
  }
#undef  LOOP_CHECKTIME
};

static int LOOP::PrevLine = 0;
static uint LOOP::PrevTime = 0;


#define _CS(A) ((LOOP::CheckFirst(__LINE__) || LOOP::Description(__FILE__ + "\n" + (string)__LINE__ + "\n" + __FUNCSIG__ + "\nCondition: " + #A)) && (A))


Ejemplo de uso.

void OnInit()
{
  for (uint i = 5; _CS(i >= 0); i--)
    ;
}