Características da linguagem mql5, subtilezas e técnicas - página 200

 
fxsaber:
As funções objecto* são muito atrasadas se se arrastar o gráfico com o rato.
Não podem eles simplesmente redesenhar?
 
Nikolai Semko:
Podem apenas ser redesenhadas?

ObjectFind, por exemplo, o que é que tem a ver com o redesenho?

 
fxsaber:

ObjectFind, por exemplo, o que é que tem a ver com o redesenho?

Ah, não era isso que eu tinha em mente.
 

Fórum sobre comércio, sistemas automatizados de comércio e teste de estratégias comerciais

Peculiaridades de mql5, dicas e truques

fxsaber, 2020.03.04 08:58

Antes eu só desconfiava, agora está confirmado. É fácil obter fugas de memória quando se trabalha com recursos.

O guião via SB emite um gráfico de uma matriz numérica para o gráfico. Poderá então apagar manualmente este gráfico (objecto), mas o recurso atribuído a este gráfico permanecerá para sempre pendurado na memória em modo apenas de leitura. Não pode ser apagado, porque apenas o guião do proprietário o pode apagar (ver a linha realçada).


Não há nenhuma funcionalidade no MQL que liberte uma memória tão ocupada. Tenha especial cuidado com isto no VPS.


Como posso libertar a memória no Terminal após os guiões que não se limpam a si próprios (ou após paragens anormais)?

// После окончания работы скрипта Терминал потребляет дополнительные 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);
}

No TaskManager (F2) o consumo de memória é mostrado muito bem. Agora só o reinício do Terminal ajuda.

 
fxsaber:

Como libertar memória no Terminal depois de executar scripts que não se limpam a si próprios (ou depois de uma paragem anormal)?

No TaskManager (F2) o consumo de memória é perfeitamente visível. Neste momento, só o reinício do terminal ajuda.

Normalmente, é necessário chamar ResourceFree para cada recurso.

Em acidentes não há nada que se possa fazer. A única forma de o fazer é fazer um dll que será utilizado para criar recursos e limpá-los após o encerramento do thread.

 
Vladimir Simakov:

Normalmente, é necessário chamar ResourceFree para cada recurso.

Não há nada que se possa fazer em caso de paragem de emergência. Só se fizer a sua própria dll, através da qual criar recursos, que, quando o fio for desligado, os limpará por si próprio.

O encerramento de emergência inclui também a interrupção de depuração.

 
fxsaber:

O acidente inclui uma interrupção de depuração.

Por mql padrão significa - fuga de memória. Apenas a sua própria implementação de tudo isto deve ser escrita de uma forma madura. Dado que o DllMain com DLL_THREAD_DETACH não é susceptível de ser chamado quando tal thread termina, não é a tarefa mais trivial, mas é controlável.

UPD: Este fio deve ir para o fio dos insectos. IMHO
 

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Nova versão do MetaTrader 5 build 2650: Background Loading of Charts and Improvements in the MQL5 Code Profiler

fxsaber, 2020.10.23 18:44

Agora na barra do gráfico não se pode ver em que gráfico o Expert Advisor está a correr e qual não está.

É possível acrescentar um sinal distintivo? Por exemplo, se o gráfico EURUSD estiver a trabalhar com um EA, então adicione um asterisco no final: EURUSD*. Em geral, algo que poderia ser visualmente cativante.

Muitos gráficos, alguns estão a correr EAs em alguns. Provavelmente também é útil para indicadores, mas não o uso. É por isso que não sei.


Por alguma razão, não existe uma tecla de atalho para a lista de EAs em funcionamento. Só se pode abri-lo com o rato.

F2 agora. Prima ENTER numa EA - mudaremos para a sua carta e uma árvore com o caminho para ela abrirá no Navegador. Segunda vez ENTER - fonte em ME.

 
Anteriormente, um erro interno na EA não provocava o seu encerramento.
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)

Mais recentemente, está a causar o problema.


Antes, um cliente do Mercado podia contornar o problema, reiniciando o terminal. Agora não.

 

Fórum sobre comércio, sistemas de comércio automatizados e testes estratégicos

Nova versão do 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))


Exemplo de utilização.

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