![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
А если использовать:
то сколько будет? ))))
хм, не знаю, я об этой директиве прекомпилятора вот только и узнал (((
Стек
В каждой MQL4-программе под хранение локальных автоматически создаваемых переменных функций выделяется специальная область памяти, называемая стеком. Стек выделяется один на все функции и по умолчанию размер стека составляет 256 kb, размером стека можно управлять директивой компилятора #property stacksize.
Статические локальные переменные размещаются там же, где и другие статические и глобальные переменные, в специальной области памяти, существующей отдельно от стека. Динамически создаваемые переменные также используют отдельную от стека область памяти.
При каждом вызове функции для внутренних нестатических переменных отводится место на стеке. При выходе из функции память становится доступной для повторного использования.
Если из первой функции производится вызов второй функции, то та в свою очередь занимает на стеке необходимый объем под свои переменные из оставшейся стековой памяти. Таким образом при вложенных вызовах функций на стеке будет заниматься память последовательно под каждую функцию. Это может привести к нехватке памяти при очередном вызове функции, такая ситуация называется переполнением стека.
Поэтому для больших локальных данных лучше использовать динамическую память - при входе в функцию память под локальные нужды выделять в системе (new, ArrayResize()), а при выходе из функции производить освобождение памяти (delete, ArrayFree()).
попробовал добавить
#property stacksize 999999999
все равно ругается компилятор на массив более 512 кб
512 кБ = 524288 байт
double 8 байт
524288 / 8 = 65536
для double максимальный массив может быть лишь такой:
но компилятор с таким объявлением массива не пропускает, методом научного тыка было найдено вот такое максимальное значение:
Как глобальную переменную пропускает. А зачем вообще на стеке создавать большие массивы, это же тяжелый маразм.
А зачем вообще на стеке создавать большие массивы, это же тяжелый маразм.
ну как бы топикстартер решил крешить терминал вот таким изящным способом, а мы все стараемся ему помочь
))))
ЗЫ: тики писать нужно примерно так: пишем новые тики в массив на пару килобайт, и делаем инкремент счетчика следующего элемента массива, и при заполнении массива сбрасываем массив в файл, ну и я бы вообще сбрасывал бы массив в файл через OnTimer() один раз несколько в минут -и система не перегружена и данные сохранены. Тики обычно один тик в секунду, ну пусть с запасом на экстренные ситуации берем по 200 тиков в минуту - т.е. массива на 1000 элементов все равно хватит.
А если использовать:
то сколько будет? ))))
Вопрос хороший
Сколько, если не секрет?
512 кБ = 524288 байт
double 8 байт
524288 / 8 = 65536
для double максимальный массив может быть лишь такой:
но компилятор с таким объявлением массива не пропускает, методом научного тыка было найдено вот такое максимальное значение:
если предположить, что один тик в секунду прилетает в среднем, то за сутки будет 86 400 секунд , даже такой массив double не пропустит компилятор
Насколько я помню 4кб *.txt - это одна страница
то есть 65536 - максимум?
Насколько я помню 4кб *.txt - это одна страница
то есть 65536 - максимум?
Только в 1-байтовой ANSI кодировке.
Зачем Вам много курсов в памяти скрипта MQL? Складывайте сразу на диск, в выходные обработаете как надо. И необязательно в MQL, есть языки, где можно спокойно поднять в память 400 Мб одним сплошным куском. А все значащие цифры курса помещаются с запасом в три байта, если курсы умножать на миллион (на 10 тыс. для йены).
предполагается обработка всех значений цены из массива на текущий момент времени в комплексе
и чем больше значений, тем лучше
подгрузить можно, не спорю
но какой смысл постоянно перезаписывать файл?
значит если умножать на миллион то можно создать массив примерно в 170 тысяч строк?
Здесь написано, что максимальный размер массива 2 147 483 647 элементов.
ок, спасибо
это очень круто!
2 с лишним миллиарда !!!!