Ошибки, баги, вопросы - страница 2646

 

поиском по форуму и докам не нашел, вопрос назрел:

1. какой максимальный размер string может хранить MQL5

2. какой максимальный размер string может хранить MQL4

3. если будет нехватка памяти этот максимальный размер будет уменьшен (или будет не выделена память для string) или будет runtime error ?

 

Дефекты:
(не исправлено MT5(build 2319)) баг в работе кеша шаблонного класса: "Создаешь сложный несколько раз обернутый объект с внутренним типом "С", а там оказывается совсем другой тип данных, может "B", может "int", что хочешь...".
(не исправлено MT5(build 2319)) баг с генерацией кода шаблонного класса при использовании internal class.
(не исправлено MT5(build 2319)) баг при определении internal class - отсутствует возможность явно сослаться на глобальное пространство имен при указании базового класса.


Предложения:
ссылка - о необходимости введения в MQL typedef declaration функциональности.
ссылка - о предоставлении возможности принудительной генерации дефолтных конструкторов копирования и операторов присвоения.

 
Sergey Dzyublik:

Дефекты:

Хорошо, что отслеживаете свои баг-репорты. Я так не делал, от того все безвозвратно затерялось на форуме.

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

 
Igor Makanu:

поиском по форуму и докам не нашел, вопрос назрел:

1. какой максимальный размер string может хранить MQL5

2. какой максимальный размер string может хранить MQL4

3. если будет нехватка памяти этот максимальный размер будет уменьшен (или будет не выделена память для string) или будет runtime error ?

попробовал потестировать string в МТ4

void OnTick()
  {
   static bool frun = true;
   uchar u_arr[102400];
   if(frun)
     {
      frun = false;
      string s = "";
      while(!IsStopped())
        {
         ArrayInitialize(u_arr, uchar(rand() % 255));
         s += CharArrayToString(u_arr);
         printf("StringLen = %i , m_physical = %i, m_total = %i, m_available = %i, m_used = %i", StringLen(s), TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL), TerminalInfoInteger(TERMINAL_MEMORY_TOTAL),
                TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE), TerminalInfoInteger(TERMINAL_MEMORY_USED));
         Sleep(150);
        }
     }
  }
//+------------------------------------------------------------------+

в диспетчере Вин память по не многу течет (5,1 из 11,9) , в МТ4 в логе:

StringLen = 221696000 , m_physical = 12157, m_total = 4095, m_available = 3365, m_used = 729


в целом, для разумных задач можно большие string использовать, может чуть позже файл через string скопирую проверю

UPD: заменил uchar u_arr[102400]; на  uchar u_arr[524224]; чтобы ускорить процесс

итог: в МТ4 примерный максимум, что можно положить в string это:

2020.02.13 21:11:24.177 tst_string EURUSD,H1: out of memory

2020.02.13 21:11:24.024 tst_string EURUSD,H1: StringLen = 640601728 , m_physical = 12157, m_total = 4095, m_available = 2556, m_used = 1539


т.е. около 640 Мб

ЗЫ: МТ5

2020.02.13 21:56:12.964 tst_string (EURUSD,H1) StringLen = 1073610752 , m_physical = 12157, m_total = 24314, m_available = 21975, m_used = 2339

2020.02.13 21:56:13.140 tst_string (EURUSD,H1) out of memory in 'tst_string.mq5' (41,12)

т.е. около 1Гб
 
Igor Makanu :

попробовал потестировать string в МТ4

в диспетчере Вин память по не многу течет (5,1 из 11,9) , в МТ4 в логе:

StringLen = 221696000 , m_physical = 12157, m_total = 4095, m_available = 3365, m_used = 729


в целом, для разумных задач можно большие string использовать, может чуть позже файл через string скопирую проверю

UPD: заменил  uchar u_arr[ 102400 ]; на  uchar u_arr[524224]; чтобы ускорить процесс

итог: в МТ4 примерный максимум, что можно положить в string это:

2020.02.13 21:11:24.177 tst_string EURUSD,H1: out of memory

2020.02.13 21:11:24.024 tst_string EURUSD,H1: StringLen = 640601728 , m_physical = 12157, m_total = 4095, m_available = 2556, m_used = 1539


т.е. около 640 Мб

ЗЫ: МТ5

2020.02.13 21:56:12.964 tst_string (EURUSD,H1) StringLen = 1073610752 , m_physical = 12157, m_total = 24314, m_available = 21975, m_used = 2339

2020.02.13 21:56:13.140 tst_string (EURUSD,H1) out of memory in 'tst_string.mq5' (41,12)

т.е. около 1Гб

Это длина строки для Unicode, поэтому в МБ это как минимум double. 1,3 Гб для MT4, что имеет смысл, так как вам нужен непрерывный буфер памяти, а MT4 - 32-битное приложение. Таким образом, ограничение mql4 само по себе не является ограничением, а ограничено только доступной памятью.

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

 
Alain Verleyen:

Это длина строки для Unicode, поэтому в МБ это как минимум double. 1,3 Гб для MT4, что имеет смысл, так как вам нужен непрерывный буфер памяти, а MT4 - 32-битное приложение. Таким образом, ограничение mql4 само по себе не является ограничением, а ограничено только доступной памятью.

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

у меня памяти 12 Гб, ОС Windows 10 , свободной памяти около 8 Гб


этот тест мне нужен был, чтобы определить максимально допустимые длины строк в терминалах МТ4/МТ5

я сейчас хочу наладить обмен между терминалами через базу данных Redis 

Redis очень простая база данных и работает исключительно со строками (ключ - значение  --> strin - string)

вчера я сделал сериализацию POD-структур в Base64, при этом размер данных увеличивается примерно на 1/3 

я считаю, что даже в этом случае у меня есть возможность обмениваться структурами с размером по 400 Мб за одну транзакцию - это более чем достаточно для любых целей!  ;)

 

Сейчас в MetaEditor при работе над проектом для перемещения файлов проекта во вкладке "Project", например в новосозданную подпапку, необходимо выполнить целый "ритуал":

- нужно убедиться, что все изменения, внесенные в файлы для переноса, были сохранены, иначе проделанная работа может быть утеряна;
- перетащить файлы во вкладке "Project" на новое место;
- закрыть все вкладки с файлами которые переносились, так как они используют уже некорректный путь;
- заново открыть закрытые вкладки, только теперь они будут использовать новый путь расположения.
- расположить открытые вкладки в той же последовательности, что и до закрытия.

Предложение:
При перемещении файлов проекта во вкладке "Project", например в новосозданную подпапку:
- для открытых но неизмененных файлов автоматически обновлять их путь расположения.
- для измененных файлов - дополнительно запрашивать подтверждение: "Перенести с сохранением", "Перенести с потерей изменений" или же "Отменить операцию переноса".


 
Igor Makanu :

у меня памяти 12 Гб, ОС Windows 10 , свободной памяти около 8 Гб


этот тест мне нужен был, чтобы определить максимально допустимые длины строк в терминалах МТ4/МТ5

я сейчас хочу наладить обмен между терминалами через базу данных Redis 

Redis очень простая база данных и работает исключительно со строками (ключ - значение  --> strin - string)

вчера я сделал сериализацию POD-структур в Base64, при этом размер данных увеличивается примерно на 1/3 

я считаю, что даже в этом случае у меня есть возможность обмениваться структурами с размером по 400 Мб за одну транзакцию - это более чем достаточно для любых целей!  ;)

Интересно, я проверю этот "Redis", я этого не знаю.

Поэтому я проверил ваш код на своей стороне, я остановил его через 1 минуту, слишком медленно. Так что я немного изменил ;-)

#define STEP      1000000     // 1 million
#define MILLION   1000000
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
  printf("m_physical = %i MB, m_total = %i MB, m_available = %i MB, m_used = %i MB, limit = %i MB, used = %i MB",
         TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL), TerminalInfoInteger(TERMINAL_MEMORY_TOTAL),
         TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE), TerminalInfoInteger(TERMINAL_MEMORY_USED),
         MQLInfoInteger(MQL_MEMORY_LIMIT),MQLInfoInteger(MQL_MEMORY_USED));

  string s = "";
  int size=INT_MAX;

  do
    {
    size-=STEP;
    }
  while(!StringInit(s,size,USHORT_MAX));

  long length = StringLen(s);
  printf("StringLen = %lli millions characters, m_used = %i MB, used = %i MB", length/MILLION, TerminalInfoInteger(TERMINAL_MEMORY_USED),MQLInfoInteger(MQL_MEMORY_USED));
  }

2020.02.13 15: 50: 51.199 1111R-2646 (EURUSD, M1) m_physical = 16230 МБ, m_total = 32460 МБ, m_available = 31786 МБ, m_used = 674 МБ, лимит = 8388608 МБ, используется = 0 МБ
2020.02.13 15: 50: 51.763 1111R-2646 (EURUSD, M1) StringLen = 1073 миллиона символов , m_used = 2722 МБ, использовано = 2048 МБ

Менее 1 секунды. Наконец, существует ограничение mql5, которое составляет 2 ГБ или около 1,073 миллиарда символов.

 

Поясните, почему в кодебазу нельзя загрузить ico-файлы? Они являются стандартной частью программы, подключаются средствами MQL. То, что они запрещены, явно неправильно. Но дальше больше.

Правильно приготовленный ico можно переименовать в png без ущерба для работы: он по-прежнему нормально линкуется в программу (с помощью #property icon "mql5pack.png") и отображается в диалоге свойств. Но все это прокатывает только локально. Я загрузил такой png в кодебазу и при проверке исходника получил ошибку:

mql5pack.mq5(27,11) : error 341: cannot open icon file 'mql5pack.png'
main file not found

Прошу администрацию mql5 починить загрузку или/и хотя бы проверку иконок.

ПС. Поправочка, похоже, что сайт молча съедает png-файл, то есть дает его загрузить, но потом его нет в списке компилируемых файлов. Пробовал MQL5\Images, MQL5\Files - ничего на сервер не грузится, но молча, без ошибок. Ошибку выдает уже при проверке.

 
Подскажите, как обойти ошибку компиляции?
struct STRUCT
{
  static const int Array[];
  int Array2[sizeof(STRUCT::Array)]; // unresolved static variable 'STRUCT::Array'
};

static const int STRUCT::Array[] = {1, 2};

void OnStart()
{
  static const int Array[] = {1, 2};
  
  int Array2[sizeof(Array)]; // OK
}