Новая версия платформы MetaTrader 5 build 2280 - страница 6

 
Slava:

Из документации

В вышеуказанном примере удаляется таймер. Нет обработчика OnTick. Нет обработчика OnChartEvent. Вообще нет других обработчиков. Это значит, что данный эксперт после удаления таймера больше не получит событий.

Во-вторых, какой смысл удалять таймер тут же, если был вызов ExpertRemove?

В-третьих, в документации явно даны рекомендации по удалению таймера. Если таймер запущен в OnInit, то лучше его удалять в OnDeinit.

Я согласен, что эксперт не получит событий в этой сессии. Но после рестарта MT он снова окажется на графике, будет загружен и выполнять своё дело. А я этого явно не ожидаю, ибо в прошлый раз его вроде как удалил.

Удалять таймер хотя бы для аккуратности. Занял ресурс-изволь освободить. Раскидываться ресурсами и надеяться, что за тобой уберёт кто-то другой, не очень хорошо.

Рекомендации есть. Но это не требования. А по факту получаются вроде как требования.

 
Перестали компилироваться .cpp файлы созданные в папке Libraries для создания DLL.
 
traveller00:

Я согласен, что эксперт не получит событий в этой сессии. Но после рестарта MT он снова окажется на графике, будет загружен и выполнять своё дело. А я этого явно не ожидаю, ибо в прошлый раз его вроде как удалил.

Удалять таймер хотя бы для аккуратности. Занял ресурс-изволь освободить. Раскидываться ресурсами и надеяться, что за тобой уберёт кто-то другой, не очень хорошо.

Рекомендации есть. Но это не требования. А по факту получаются вроде как требования.

Ну и удаляйте таймер в OnDeinit

Только что специально проверил.

Ваш эксперт выгружается с графика ровно через минуту после выставления флага удаления эксперта.

Минута - это таймаут ожидания какого либо события во внутреннем цикле обработки эксперта. Видимо, была какая-то причина для такой отложенной выгрузки эксперта.

Посмотрим, что можно сделать для более оперативной выгрузки эксперта

Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Каждый скрипт, сервис и эксперт работает в собственном отдельном потоке. Все индикаторы, рассчитываемые на одном символе, даже если они запущены на разных графиках, работают в одном потоке. Таким образом, все индикаторы на одном символе делят между собой ресурсы одного потока. В одном потоке с индикаторами также последовательно выполняются...
 
Slava:

Только что специально проверил.

Ваш эксперт выгружается с графика ровно через минуту после выставления флага удаления эксперта.

Минута - это таймаут ожидания какого либо события во внутреннем цикле обработки эксперта. Видимо, была какая-то причина для такой отложенной выгрузки эксперта.

Посмотрим, что можно сделать для более оперативной выгрузки эксперта

Спасибо.

 
Slava:

Вы какую задачу хотите решить? Однократное выполнение кода?

Для этого есть специальный тип mql5-программ - скрипты

Есть статистические программы, которые должны делать расчет один раз. Но при этом мочь делать это и в Тестере.

void OnInit()
{
  if (!MQLInfoInteger(MQL_TESTER))
  {
    Research();
    
    ExpertRemove();
  }
}

double OnTester()
{
  return(Research());
}

Поэтому приходится обходить невозможность запуска скриптов в Тестере, создавая такие странные конструкции в советнике

Этот код сделает один раз расчет и в Тестере и в Терминале.


Почему нужен Тестер? В нем есть замечательный режим по всем символам из Обзора рынка. И когда нужно сделать стат. исследование всех символов, ускорив еще параллельными вычислениями, то годится именно запуск в Тестере, а не множественный запуск в Терминале.

 
SEM:

Например ваш сервер. Такое расхождение минимум у трех брокеров. До обновления этой проблемы не было.

Маловероятно что это ошибка брокеров.


Что показывает Ваша картинка?

Текущий спред 240. Минимальный спред в текущем минутном баре 170.

Что не так?

 
Roffild:

Систему скомпилированных библиотек сломали совсем.

До последних обновлений поиск библиотеки проходил сначала в папке эксперта, а потом в Libraries. Сейчас изначально в Libraries ищет и поэтому не находит.

А еще увеличилось время передачи структур в библиотечную функцию аж в 2 раза.

Вы как проверяли порядок поиска библиотек?

Только что проверил.

1. Создал библиотеку с одной функцией (фактически раскомментировал пример)

#property library
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| My function                                                      |
//+------------------------------------------------------------------+
int MyCalculator(int value,int value2) export
  {
   return(value);
  }
//+------------------------------------------------------------------+

2. Скомпилировал её.

3. Сохранил как... в папку с вызывающим экспертом

4. Заменил функцию

int MyCalculator(int value,int value2) export
  {
   return(value2);
  }
//+------------------------------------------------------------------+

5. Организовал вызов

void OnTimer()
  {
   Print(__FUNCTION__);
   int res=MyCalculator(InpInteger1,InpInteger2);
   PrintFormat("InpInteger1=%d  InpInteger2=%d  res=%d",InpInteger1,InpInteger2,res);
  }

Вот логи

2019.12.16 12:50:41.144 TestEnums (EURUSD,M1)   OnTimer
2019.12.16 12:50:41.144 TestEnums (EURUSD,M1)   InpInteger1=11  InpInteger2=22  res=22
2019.12.16 12:50:51.152 TestEnums (EURUSD,M1)   OnTimer
2019.12.16 12:50:51.152 TestEnums (EURUSD,M1)   InpInteger1=11  InpInteger2=22  res=22
2019.12.16 12:51:01.145 TestEnums (EURUSD,M1)   OnTimer
2019.12.16 12:51:01.146 TestEnums (EURUSD,M1)   InpInteger1=11  InpInteger2=22  res=22

Видно, что вызывается "локальный" экземпляр библиотеки

 

Кто-нибудь начиная с билда 2265 замечал в индикаторах при изменении входных параметров мертвое зависание терминала?

Наблюдается именно при изменении входных параметров (НО НЕ ВСЕГДА!). Один индикатор на графике. Индикатор работает с графическими объектами. Удаляет все при деинициализации (при нажатии на кнопку обновить - все норм, хотя объекты также удаляются и перестраиваются). Количество объектов около 4000 (зависание наблюдалось также с меньшим числом объектов).

Используются только обработчики OnInit(), OnDeinit(), OnCalculate(). Индикатор с тиками не работает.

Макс. баров в окне = 10000.

Пока ни на что не намекаю, никого ни в чем не обвиняю. Возможно ошибка у меня... но очень странно это.

 
Alexey Kozitsyn:

Кто-нибудь начиная с билда 2265 замечал в индикаторах при изменении входных параметров мертвое зависание терминала?

раньше началось. я замечал, и были сообщения от других форумчан. у меня это чаще случается если индикатор объекты создаёт (не обязательное условие).

 
Igor Zakharov:

раньше началось. я замечал, и были сообщения от других форумчан. у меня это чаще случается если индикатор объекты создаёт (не обязательное условие).

Раньше проблема была, например, если второй индикатор ловил события удаления объектов и получалось переполнение по количеству событий. Но там проблема воспроизводилась со 100% вероятностью. И ее пофиксили. Сейчас же какая-то плавающая проблема.

И в данной ситуации у меня индикатор тоже создает объекты.

Причина обращения: