Новая версия платформы MetaTrader 5 build 2007: Экономический календарь, MQL5-программы в виде сервисов - страница 35

 
Renat Fatkhullin:

Не странно. Вы просто не задумываетесь, какие портянки пишут некоторые люди.

Резать многотысячно строковые функции на более мелкие - это правильно. Я же не говорю резать на микрофункции по 5-10 строк.

Мне тоже странно.

Портянка, порезанная на функции, разве не будет собрана обратно в портянку инлайном при компиляции?

 
fxsaber:

По коду не увидел криминала. Поясните, пожалуйста.

В функцию:

bool ProcessElement(MyStruct &stStruct)
{
   MyStruct stNewStruct;
   if (!AddElementToArray(g_arrstStruct, stNewStruct))
      return false;
   
   stStruct.dtTime = 0;
   return true;
} 

передается ссылка на элемент массива. Внутри функции этот же массив изменяет свой размер. В большинстве случаев изменение размера массива не приводит к изменению места расположения его элементов в памяти. Но иногда, когда для выделения очередной порции памяти не хватает существующего фрагмента памяти, массив меняет свое местоположение. Старый кусок памяти освобождается, выделяется новый и в него копируется весь массив. В итоге ссылка показывает в пустоту, что и приводит к Access violation.

 
Andrey Khatimlianskii:

Мне тоже странно.

Портянка, порезанная на функции, разве не будет собрана обратно в портянку инлайном при компиляции?

Нет.

Инлайнинг работает до определенного размера функций. Разумно инлайнить микрофункции.

 
Andrey Khatimlianskii:

Мне тоже странно.

Портянка, порезанная на функции, разве не будет собрана обратно в портянку инлайном при компиляции?

думаю тут все завязано на возможность правильно загружать память кэша процессора

 
Ilya Baranov:

Билд 2007

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

Вызов iBarShift() возвращает -1, GetLastError() - 4401 ERR_HISTORY_NOT_FOUND (Запрашиваемая история не найдена)

А если переключить график на символ, который ранее не подгружался, то сначала случается вызов OnCalculate() с некоторым числом в rates_total, например, 10 000, а функция Bars( Symbol() , PERIOD_CURRENT ) возвращает 0.

Приходится все контролировать вручную, очень громоздко.

 
Renat Fatkhullin:

Нет.

Инлайнинг работает до определенного размера функций. Разумно инлайнить микрофункции.

Теперь ясно.

Было бы полезно знать примерный размер таких функций.

 
Renat Fatkhullin:

Вы просто не задумываетесь, какие портянки пишут некоторые люди.

Есть какой-нибудь автоматизированный критерий оценки "портяночности" кода и "микрофункчиновщины"?

Мнение по поводу КБ-индикаторов и КБ-советников (специально отдельно выделил их) по этой теме озвучите?

 
fxsaber:

Есть какой-нибудь автоматизированный критерий оценки "портяночности" кода и "микрофункчиновщины"?

Мнение по поводу КБ-индикаторов и КБ-советников (специально отдельно выделил их) по этой теме озвучите?

Общие рекомендации хорошего кода описаны для любого языка. Они универсальны.

В такие базовые моменты программирования мы вдаваться не будем.

 
Renat Fatkhullin:
Отобразится в лучшую сторону.

Хочется проверить, но никак не могу дождаться окончания оптимизации, после последних веяний раздачи задач.

Жду уже не первый час окончания оптимизации, и ещё 1 час 30 минут предлагается ждать, при этом агенты явно простаивают.

Почему нельзя как то оценивать время оптимизации, и если оно явно превышает 1 минуту на проход(или дать пользователям возможность самостоятельной настройки времени, после которой происходит перераспределение заданий, если агенты простаивают), то перераспределять задания на свободные агенты - ну хотя бы для своих сетей. Очень прошу оптимизировать этот процесс! У меня 4300 проходов рассчитываются 51 час (13 ядер), поэтому такие нерациональные распределения ресурсов критичны.

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

 
Aleksey Vyazmikin:

Если сейчас отключить первого агента, его задания, по идее, распределятся остальным.