Вопрос по массивам

 
Сколько элементов массива может быть максимум и какое количество операций возможно над таким массивом произвести за 1 тик?
 
Renat Akhtyamov:
Сколько элементов массива может быть максимум и какое количество операций возможно над таким массивом произвести за 1 тик?

за один тик операций сколько хотите - но не получите второй тик, по документации MQL разработчики пишут, чтобы передать управление терминалу нужно сделать Sleep() не менее 100 мсек, значит пока будет работать Ваш советник/скрипт/индикатор то в этот поток не будет поступать новых тиков (будут ли пачками поступать пропущенные тики - нужно проверять, но сомневаюсь, думаю будут пропущенные тики на этом окне графика)

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

 
Igor Makanu:

за один тик операций сколько хотите - но не получите второй тик, по документации MQL разработчики пишут, чтобы передать управление терминалу нужно сделать Sleep() не менее 100 мсек, значит пока будет работать Ваш советник/скрипт/индикатор то в этот поток не будет поступать новых тиков (будут ли пачками поступать пропущенные тики - нужно проверять, но сомневаюсь, думаю будут пропущенные тики на этом окне графика)

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

Заинтересовало "чтобы передать управление терминалу нужно сделать Sleep() не менее 100 мсек", не встречал такого требования, дайте, пожалуйста, ссылку.

 
Vladimir:

Заинтересовало "чтобы передать управление терминалу нужно сделать Sleep() не менее 100 мсек", не встречал такого требования, дайте, пожалуйста, ссылку.

в справке МТ4 точно есть, пробовал найти с ходу не нашел, где то между разделов есть такая фраза: что функция Slepp() при паузе более 100 мс передаст управление терминалу, пару лет назад точно не видел такого описания, но из опыта на МТ4 если делать зацикленный скрипт или советник и делать Sleep() менее 150 мс, то раньше терминал жестко тормозил, я пробовал перебором что Sleep(50), что Sleep(10) - разицы никакой не было - терминал тормозит, а вот если сделать Sleep(150) или Sleep(200) ...(500) - то визуально терминал не тормозит, все работает в штатном режиме

 
Igor Makanu:

в справке МТ4 точно есть, пробовал найти с ходу не нашел, где то между разделов есть такая фраза: что функция Slepp() при паузе более 100 мс передаст управление терминалу, пару лет назад точно не видел такого описания, но из опыта на МТ4 если делать зацикленный скрипт или советник и делать Sleep() менее 150 мс, то раньше терминал жестко тормозил, я пробовал перебором что Sleep(50), что Sleep(10) - разицы никакой не было - терминал тормозит, а вот если сделать Sleep(150) или Sleep(200) ...(500) - то визуально терминал не тормозит, все работает в штатном режиме

Спасибо. А сколько при этом у Вас было запущенных терминалов и сколько процессоров у компьютера?

У меня один и тот же зацикленный скрипт с задержкой цикла на Sleep(11) нормально собирает котировки 25 инструментов в 37 терминалах при 8 процессорах, бывало и 67 терминалов на 6 процессорах. Они успевали дождаться прихода свой очереди в планировщике потоков и взять каждый свою порцию процессорного времени, наряду с еще десятками работающих на компьютере служб. 100 мс при 2ГГц это 200 миллионов тактов каждого из процессоров, кому требуется такое ожидание...

 

И все таки не понятно по максимальному количеству элементов массива

Могу ли я объявить массив следующим образом:

double Ticks[10000000000000];

?

 
Renat Akhtyamov:

И все таки не понятно по максимальному количеству элементов массива

Могу ли я объявить массив следующим образом:

double Ticks[10000000000000];

?

Сразу говорю, для проверки надо теперь его заполнить какими-либо значениями, потому что при таком объявлении физически выделяется 0 байт памяти. И только при заполнении Винда начинает реально выделять память блоками по 4Кб. Я проверял.

Сделайте вы эксперимент за 5 минут, чего 3 дня простейшие вопросы-то задавать?

 
Renat Akhtyamov:

И все таки не понятно по максимальному количеству элементов массива

Могу ли я объявить массив следующим образом:

double Ticks[10000000000000];

?

я же писал, что компилятор контролирует ситуацию с размерами переменных, будут вот такие сообщения:

the size of local variables is too large (more than 512kb)

'x' - array is too large

'x' - local variables section is too large

 
Renat Akhtyamov:

И все таки не понятно по максимальному количеству элементов массива

Могу ли я объявить массив следующим образом:

double Ticks[10000000000000];

?

Такой массив объявлять - моветон. Ведь он при этом размещается в стековой памяти.

Для массивов нужно использовать динамическое распределение памяти:

double g_arrfMyArray[];

int OnInit()
{
...
   if (ArrayResize(g_arrfMyArray, 10000000) != 10000000)
   { 
      // Не хватает памяти
   }
...
}

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

P. S. Выделять памяти на 10 триллионов вещественных чисел точно никто не даст. Ведь это 80 Тб памяти. Об оперативке такого объема еще не слышал. Будет наверное когда-то, но сейчас пока нет.

 

512 кБ = 524288 байт 

double 8 байт

524288 / 8 = 65536 

для double максимальный массив может быть лишь такой: 

double Ticks[65536];

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

double Ticks[65524];

Ihor Herasko: сколько памяти требуется резервировать для тиков, число которых заранее неизвестно.

если предположить, что один тик в секунду прилетает в среднем, то за сутки будет 86 400 секунд , даже такой массив double не пропустит компилятор

 
Igor Makanu:

512 кБ = 524288 байт 

double 8 байт

524288 / 8 = 65536 

для double максимальный массив может быть лишь такой: 

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

А если использовать:

#property stacksize

то сколько будет? ))))