Обновление платформы MetaTrader 4 build 670: виртуальный хостинг, web-запросы и работа с сигналами из MQL-программ - страница 24

 
В справке для  ArraySort:

https://docs.mql4.com/ru/array/arraysort

Параметры:


array[]

[in][out]  Числовой массив для сортировки.


count

[in]  Числовой массив для сортировки.

 

Функция iCustom содержит неопределённое количество входных параметров.

Можно ли ухитриться написать подобную функцию на новом mql4?

 
Ещё прошу вспомнить об обещании добавить возможность сохранения внешних настроек индикаторов в файл.
 

Доброго времени суток!

Народ объясните как работают классы в MQL4, а именно, как происходит инициализация новых объектов класса на глобальном уровне? Вот код:

void OnTick()
  {
      static int kbars;
      if (kbars == Bars) return;
      else kbars = Bars;

      char gotrade = objIndicator.TradeAllow();
      return;
  }

class Indicator
   {
      private:
      double qqe_val[10][2];

      void GetIndicatorData()
         {
            for (char i = 1; i < 6; i++)
               {
                  qqe_val[i][0] = iCustom(_Symbol, _Period, "ххх", 60, 5, 0, 0, i);
                  qqe_val[i][1] = iCustom(_Symbol, _Period, "ххх", 60, 5, 0, 2, i);
               }
         }

      public:
      Indicator(void)
         {
            ArrayInitialize(qqe_val, 0.0);
         }

       char TradeAllow()
         {
            GetIndicatorData();
            
            if (qqe_val[1][0] > qqe_val[1][1] && qqe_val[3][0] < qqe_val[3][1])
               {
                  return 0;
               }
            else if (qqe_val[1][0] < qqe_val[1][1] && qqe_val[3][0] > qqe_val[3][1])
                    {
                       return 1;
                    }
            return(-1);
         }
   };

Indicator objIndicator();

Простой класс, в котором содержатся показания индикатора и методы по работе с ними. По логике вещей, экземпляр класса Indicator - objIndicator, объявлен на глобальном уровне, следовательно он должен быть создан при инициализации эксперта и потом уже больше не создаваться, однако он почему - то создается при каждом тике, сжирая память, за минут 5 терминал потребляет 1.5гб оперативы, мне кажется что это немного не правильное поведение. Для чистоты эксперимента решил создать динамический объект на глобальном уровне, который принудительно инициализирую при инициализации эксперта:


int OnInit()
  {
      objIndicators = new Indicators();
      return(INIT_SUCCEEDED);
  }

void OnTick()
  {
      static int kbars;
      if (kbars == Bars) return;
      else kbars = Bars;

      char gotrade = objIndicator.TradeAllow();
      return;
  }

class Indicator
   {
      private:
      double qqe_val[10][2];

      void GetIndicatorData()
         {
            for (char i = 1; i < 6; i++)
               {
                  qqe_val[i][0] = iCustom(_Symbol, _Period, "ххх", 60, 5, 0, 0, i);
                  qqe_val[i][1] = iCustom(_Symbol, _Period, "ххх", 60, 5, 0, 2, i);
               }
         }

      public:
      Indicator(void)
         {
            ArrayInitialize(qqe_val, 0.0);
         }

       char TradeAllow()
         {
            GetIndicatorData();
            
            if (qqe_val[1][0] > qqe_val[1][1] && qqe_val[3][0] < qqe_val[3][1])
               {
                  return 0;
               }
            else if (qqe_val[1][0] < qqe_val[1][1] && qqe_val[3][0] > qqe_val[3][1])
                    {
                       return 1;
                    }
            return(-1);
         }
   };

Indicator *objIndicator;


Однако ситуация не изменилась. Нутром чую что создается туча экземпляров класса, в каждом экземпляре происходит вызов индикатора ххх, благодаря чему память исчезает за считанные минуты. В спокойном состоянии терминал сжирает с 4-мя графиками на которых есть индикатор xхх - 100мб, те при каждом тике, создается экземпляр класса и инициализируется этот индикатор, а на каждом новом баре происходит запрос к объекту и исчезает 100Мб памяти.


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

 

Пытаюсь хоть куда-набудь подсунуть макроподстановку __DATETIME__ (к #property description, к #property copyright) и ничего не выходит. Интересно, что в справке по #property фигурирует пример с скриншотом, перекочевавший из справки по MQL5, в котором дата и время отображаются в скобках после номера версии вообще без каких-либо команд:

Пример задания описания и номера версии

#property version     "3.70"      // текущая версия эксперта
#property description "ZigZag универсальный с паттернами Песавенто"
#property description "В настоящий момент в индикатор встроены несколько ZigZag с различными алгоритмами"
#property description "Имеется возможность встраивать большое количество других индикаторов, показывающих максимумы и "
#property description "минимумы и автоматически строить от этих минимумов и максимумов различные графические инструменты"

Пример отображения описания и версии при запуске программы

Может быть в MQL5 это и так, но в MQL4 ничего подобного я не наблюдаю, а попытки вставить его хотя бы отдельной строкой в #property description натыкаются на ошибку

'description' - invalid property value

Подскажите пожалуйста, как правильно сделать, если это вообще возможно.

 

Я правильно понимаю, что во вкладке ""Эксперты" логи пишет терминал, а не эксперт? Так вот, есть зацикленный эксперт, после обновления билда на 670 вкладка завалена сообщениями, что MarketInfo желает видеть переменную типа string. Ну ладно бы только вкладка, папка с терминалом моментально разбухает на всё доступное дисковое пространство. Сделайте ограничение на логи, пожалуйста, пусть старые логи удаляет при достижении некоего объема или новые не пишет, раз такое безобразие... Этож вроде некие гигиенические правила программирования не заваливать всю память или весь диск своими продуктами жизнедеятельности?


Поиск в коде не выявил проблемы в MarketInfo, везде string вроде ему подают, где функцией, где переменной string, а где элементом массива string. Возможно, ошибка таки не в коде.

Попытка перекомпиляции под 670 билдом не удалась в том плане, что эксперт вообще не работает после перекомпиляции.


Файл что-то не могу к сообщению прилепить, выбрать дает, прилепить не дает...
 
ttl:

Я правильно понимаю, что во вкладке ""Эксперты" логи пишет терминал, а не эксперт? ...


Вот простой код для эксперта или для скрипта:

Print("Вывод сообщений осуществляется во вкладке:  ");

Увидите, что в папку "Эксперты" пишут сообщения программы пользователя (скрипты и эксперты).


Из справки терминала:

Во вкладке "Эксперты" содержится вся информация о работе прикрепленного эксперта, включая открытие/закрытие позиций, модификацию ордеров, собственные сообщения советника и другие.

 
barabashkakvn:


Вот простой код для эксперта или для скрипта:

Увидите, что в папку "Эксперты" пишут сообщения программы пользователя (скрипты и эксперты).


Из справки терминала:

Во вкладке "Эксперты" содержится вся информация о работе прикрепленного эксперта, включая открытие/закрытие позиций, модификацию ордеров, собственные сообщения советника и другие.


А разве не во вкладку "Журнал" это попадает? Но не суть, про несоответствие переменной пишет явно терминал. Но и в случае если косой эксперт много пишет, неправильно весь диск занимать логами его писанины...
 
ttl:
А разве не во вкладку "Журнал" это попадает? Но не суть, про несоответствие переменной пишет явно терминал. Но и в случае если косой эксперт много пишет, неправильно весь диск занимать логами его писанины...



Если "... косой эксперт..." то жесткий диск не должен терпеть такие издевательства над собой - нужно доводить эксперта до кондиции.
 

artsnz:

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

После экспериментов выяснилось, что в 670 билде, при обращении к индикатору через iCustom из советника, каждый раз создается новый экземпляр индикатора, а старый остается в памяти, что приводит к переполнению памяти и не работоспособности советника. Тесты проводились с разными пользовательскими индикаторами, исход один и тот же. Кто - то сталкивался с чем - то подобным?
Причина обращения: