Особенности языка mql5, тонкости и приёмы работы - страница 200

 
fxsaber:
Object*-функции сильно лагают, если мышкой дергать график.
Можете они просто перерисовываются?
 
Nikolai Semko:
Можете они просто перерисовываются?

ObjectFind, например, какое отношение имеет к перерисовке?

 
fxsaber:

ObjectFind, например, какое отношение имеет к перерисовке?

А, не о том подумал.
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2020.03.04 08:58

Раньше только подозревал, теперь подтвердилось. При работе с ресурсами легко получить утечку памяти.

Скрипт через СБ выводит график числового массива на чарт. Вы можете потом руками удалить этот график (объект), но ресурс, закрепленный за этим графиком, останется висеть навсегда в памяти в режиме read-only. Его нельзя будет удалить, т.к. удалять его может (см. выделенную строку) только скрипт-хозяин.


В MQL отсутствует функционал для высвобождения так занятой памяти. Будьте с этим особенно аккуратны на VPS.


Как освободить память в Терминале после работы скриптов, которые не подчищают за собой (или после нештатной остановки)?

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

В TaskManager (F2) отлично видно потребление памяти. Сейчас только перезагрузка Терминала помогает.

 
fxsaber:

Как освободить память в Терминале после работы скриптов, которые не подчищают за собой (или после нештатной остановки)?

В TaskManager (F2) отлично видно потребление памяти. Сейчас только перезагрузка Терминала помогает.

Штатно - надо ResourceFree вызывать для каждого ресурса.

При аварийном завершении - ничего не сделаешь. Только если свою dll сваять, через которую и создавать ресурсы, которая, при отключении потока, их сама и очистит.

 
Vladimir Simakov:

Штатно - надо ResourceFree вызывать для каждого ресурса.

При аварийном завершении - ничего не сделаешь. Только если свою dll сваять, через которую и создавать ресурсы, которая, при отключении потока, их сама и очистит.

В аварийное завершение входит и прерывание дебага.

 
fxsaber:

В аварийное завершение входит и прерывание дебага.

Штатными средствами mql - утечка памяти. Только свою реализацию всего этого писать по взрослому. Учитывая, что, скорее всего, DllMain с DLL_THREAD_DETACH, при завершении такого потока, вызываться не будет, не самая тривиальная задача, но, вполне решаемая.

UPD: в ветку о багах эта тема напрашивается. ИМХО
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 2650: Фоновая загрузка графиков и улучшения в профилировщике MQL5-кода

fxsaber, 2020.10.23 18:44

Сейчас на панели переключения графиков нельзя увидеть, на каком чарте работает советник, а на каком - нет.

Возможно ли добавлять отличительный знак? Например, если EURUSD-чарт работает с советником, то в конце добавлять звездочку: EURUSD*. В общем, что-то, чтобы визуально можно было зацепиться.

Много чартов, на каких-то запущены советники. Возможно, это полезно и для индикаторов, но не использую. Поэтому не знаю.


По какой-то причине нет горячей клавиши для списка работающих советников. Только мышкой его можно открыть.

F2 теперь. Нажимаем ENTER на советнике - переключаемся на его чарт, и в Навигаторе открывается дерево с путем к нему. Второй раз ENTER - исходник в ME.

 
Раньше внутренняя ошибка в советнике не вызывала его закрытие.
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)

С недавнего времени - вызывает.


Раньше клиент Маркета мог обойти проблему перезагрузкой Терминала. Сейчас - нет.

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы 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))


Пример использования.

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