Новая версия платформы MetaTrader 5 build 5120: улучшения и исправления - страница 7

 
Вот скрины графиков золота и канадского доллара.

Последняя цена явно оторвалась от графика. Свечу последнюю не показывает. Тики с фризом в минуту две.
П.С. я не знаю почему фотки поворачиваются. Снято правильно.
Файлы:
 
Можно ли рабочий билд с сервера просто скопировать без установщика?
Что настроить надо?
На одной локальной машине знаю что можно так копировать. А с другой машины как переместить без установщика ?
 
Sergei Samokhin #:

Приложение "Ножницы" найдите в Windows, там выбрать область, скопируется в буфер, и потом тут Shift+Insert вставить

 
Renat Fatkhullin #:

Спасибо, разберемся.

Для чего перед выходом из функции вызывать ArrayFree(), передавая туда локальный динамический массив? Разве это не бессмысленно? Я думал, что память под локальный динамический массив всегда освобождается после выхода из функции.

Следующий тест показывает, что ArrayFree в подобных местах лишен смысла. Там test2() использует ArrayFree, а test1() не использует. И разницы при этом никакой.

void OnStart()
  {
   printMemoryUsed("start");
   test1();
   printMemoryUsed("after test1");
   test2();
   printMemoryUsed("after test2");
   CAvoidCompilerOptimization::print();
  }

void test1()
  {
   long arr[];
   ArrayResize(arr, (int)1e6);
   CAvoidCompilerOptimization::run(arr);
   printMemoryUsed("before exiting test1()");
  }

void test2()
  {
   long arr[];
   ArrayResize(arr, (int)1e6);
   CAvoidCompilerOptimization::run(arr);
   ArrayFree(arr);
  }

class CAvoidCompilerOptimization
  {
private:
   static long sum;
   static long numOfTimesSumChanged;
public:
   static void print() { PrintFormat(__FUNCTION__": sum = %I64i, changed %I64i times", sum, numOfTimesSumChanged); }
   
   static void run(long &arr[])
     {
      const int rand1 = 100 + (MathRand() % 100);
      for(int i = ArraySize(arr) - 1; i >= 0; i--)
         arr[i] = 1 + (i % rand1);
      const int rand2 = 10 + (MathRand() % 100);
      for(int i = ArraySize(arr) - 1; i >= 0; i--)
         if(arr[i] % rand2 < 2)
           {
            numOfTimesSumChanged++;
            sum += 1 + (i % arr[i]);
           }
     }
  };

long CAvoidCompilerOptimization::sum = 0;
long CAvoidCompilerOptimization::numOfTimesSumChanged = 0;

void printMemoryUsed(string prefix) { Print(prefix, ": ", MQLInfoInteger(MQL_MEMORY_USED)); }
 

Я добавил ArrayFree из-за того, что в массиве появляются значения тогда, когда их не должно быть, сразу после его объявления, но и ArrayFree никак не изменила ситуацию. 

На память я вообще не смотрел.

 
Andrei Iakovlev #:

У меня были те значения в массиве тогда, когда их не должно быть, и я решил добавить ArrayFree, но и она никак не изменила ситуацию.

Что вы ожидаете там увидеть, кроме кроме случайных мусорных значений? Для чего там ArrayFree?

 
Vladislav Boyko #:

Что вы ожидаете там увидеть, кроме кроме случайных мусорных значений?

Всегда 0 до цикла for, как и при первом объявлении массива (при запуске терминала) до смены ТФ или перекомпиляции эксперта.

А почему там могут быть мусорные значения в этом момент после объявления?

Vladislav Boyko #:
Для чего там ArrayFree?

Для этого: освобождает буфер любого динамического массива и устанавливает размер нулевого измерения в 0. Я думал, после ArrayFree ложные значения появляться не будут.

 
Vladislav Boyko #:
Я думал, что память под локальный динамический массив всегда освобождается после выхода из функции.

А, ну вот же

https://www.mql5.com/ru/docs/basis/types/dynamic_array

Динамические массивы автоматически освобождаются при выходе за пределы области видимости блока, в котором они объявлены.

Для чего тогда там ArrayFree и с чем именно будут разбираться MQ?


Andrei Iakovlev #:
А почему там могут быть мусорные значения в этом момент после объявления?

Вот косвенное свидетельство:

https://www.mql5.com/ru/docs/array/arrayinitialize

При последующих увеличениях размера  массива array функцией ArrayResize() в пределах текущего резерва, в конец массива добавляются элементы, значения которых не определены и, чаще всего, не равны init_val.

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

По поводу использования ArrayFree. Я подозреваю (но это не точно), что ArrayFree просто помечает память как свободную, не изменяя то, что в этой памяти лежит. Если даже представить, что ArrayFree "обнулял" бы содержимое освобождаемой памяти, то почему вы думаете, что при следующем вызове функции вы получите под массив ровно тот-же кусок памяти? К стати, по поводу того-же куска памяти:

https://www.mql5.com/ru/docs/basis/variables/object_live

При работе с динамическими массивами освобожденная память сразу же возвращается в систему.

Менеджер памяти возвращает память в систему сразу после выхода из функций-обработчиков событий: OnInit(), OnDeinit(), OnStart(), OnTick(), OnCalculate(), OnTimer(), OnTrade(), OnTester(), OnTesterInit(), OnTesterPass(), OnTesterDeinit(), OnChartEvent(), OnBookEvent().

Ладно, на этом мои полномочия все. Я могу ошибаться. У меня недостаточно квалификации, чтобы рассуждать о том, что именно происходит с памятью под капотом.

 

https://www.mql5.com/ru/docs/basis/variables/local#stack

Поэтому для больших локальных данных лучше использовать динамическую память - при входе в функцию память под локальные нужды выделять в системе (new, ArrayResize()), а при выходе из функции производить освобождение памяти (delete, ArrayFree()).

Локальные данные (объявлены внутри функции), размещены в куче, память под которые необходимо освобождать с помощью ArrayFree при выходе из функции... MQ, можно, пожалуйста, пример, демонстрирующий такую необходимость?

[edit] То есть, речь идет об объявленном локально динамическом массиве. Разве нет противоречия с цитатой ниже?

https://www.mql5.com/ru/docs/basis/types/dynamic_array

Динамические массивы автоматически освобождаются при выходе за пределы области видимости блока, в котором они объявлены.

 
geritretar #:

MetaTrader 5 x64 build 5120 started for MetaQuotes Ltd.

Windows 11 build 22631

Терминал игнорирует то, что в Windows установлена темная тема и при включенной в терминале теме "Системная" отображается в светлой теме.

И файл terminal.ini удалял. Ситуацию не исправляет. В terminal.ini в разделе [Settings] параметр Theme=0

Build 5125.

Если в терминале выставлена цветовая тема "Системная", а в винде стоит "Темная", то терминал не отображается в темной теме.

На выставление в терминале Светлой или Темной темы терминал реагирует. Работает только ручное изменение темы в терминале.

Поясните, пожалуйста, какой (чьей) Системной теме терминал соответствует?

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