Скачать MetaTrader 5

16xxxxxx bytes not avalibale. Как выгрузить всю лишнюю информацию ?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Justinas Shimkus
179
Justinas Shimkus  

Добрый день.

Имеется советник, внутри которого есть пользовательская функция. Ее входные данные - MqlRates и несколько переменных, которые вычисляются в советнике. На выходе число типа uint. В процессе работы вычисляются несколько индикаторов (они есть только в функции,  не в советнике) и большой цикл в цикле в цикле. В конце работы функции через IndicatorRelease освобождаются все индикаторы. При работе советника в реальном времени проблем не возникает, хоть и процессор на пару минут загружается под 100%, ввиду массы простых вычислений и обращений к массивам (которые существуют только в функции). Но если запустить советник в тестере стратегий работа завершается не успев начаться, а в журнале тестера появляется много строчек 16xxxxxx bytes not avalibale. Вероятно, это из-за того что после работы функции в памяти остаются промежуточные результаты ее работы. Вот вопрос - что бы мне сделать чтобы в конце ее работы в памяти остался только return()-результат и ничего более ?

Уже спасибо. 

Vladislav Andruschenko
106517
Vladislav Andruschenko  

Приветствую, 

Как ВЫ думаете, что Вам должны ответить на Ваш вопрос?

 думаю так:

int start()

{

 return(0);

} 

 

судя по тому коду, что Вы выложили ответ, ответ только такой.

хоть бы что-то..... 

Justinas Shimkus
179
Justinas Shimkus  
Быть может существуют что-нибудь, вроде исполняемого файла отдельного от советника, который по завершению работы возвращает значение советнику, а затем полностью выгружается из памяти ? И все же неясно, почему в реальном времени советник работает без проблем (съедая вроде 1,5 Гб оперативки на весь терминал), а в тестере тут же жалуется на нехватку памяти.
Vladislav Andruschenko
106517
Vladislav Andruschenko  

судя по количеству хххххх ему не хватает всего 16 мегабайт?

 

stacksize

int

Указывает размер стека для MQL4 программы, стек достаточного объема требуется в случае выполнения рекурсивных вызовов функций.

При запуске скрипта или эксперта на графике выделяется стек не менее 8Мб, для индикаторов свойство не работает  - стек всегда фиксированного объема в 1Мб.

При запуске в тестере программе всегда выделяется стек в размере 8 Мб.

Justinas Shimkus
179
Justinas Shimkus  

Еще раз проверил, да, выглядит как 16 Мб. Но система видит 16 Гб. Сейчас еще строчку терминал написал too low available memory, 3947 Mb used. Хотя даже это раза в три больше, чем он использует при реалтайм работе.

Не знаю как влияет, но пользуюсь MQL5. 

Vladislav Andruschenko
106517
Vladislav Andruschenko  

stacksize

int

MQL5 program stack size. The stack of sufficient size is necessary when executing function recursive calls.

When launching a script or an Expert Advisor on the chart, the stack of at least 8 MB is allocated. In case of indicators, the stack size is always fixed and equal to 1 MB.

When a program is launched in the strategy tester, the stack of 16 MB is always allocated for it.



Vladislav Andruschenko
106517
Vladislav Andruschenko  

Stack

In every MQL5 program, a special memory area called stack is allocated for storing local function variables that are created automatically. One stack is allocated for all functions. The default stack size is 256 kb, the stack size can be managed using the #property stacksize compiler directive.

Static local variables are stored in the same place where other static and global variables are stored - in a special memory area, which exists separately from the stack. Dynamically created variables also use a memory area separate from the stack.

With each function call, a place on the stack is allocated for internal non-static variables. After exiting the function, the memory is available for use again.

If from the first function the second one is called, then the second function occupies the required size from the remaining stack memory for its variables. Thus, when using included functions, stack memory will be sequentially occupied for each function. This may lead to a shortage of memory during one of the function calls, such a situation is called stack overflow.

Therefore, for large local data you should better use dynamic memory - when entering a function, allocate the memory, which is required for local needs, in the system (new, ArrayResize()), and when exiting the function, release the memory (delete, ArrayFree()).

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий