Ошибки, баги, вопросы - страница 1124
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Хотя размеры обеих структур одинаковые и их копирование друг в друга происходит без потерь, предупреждение всё же получаем.
Так это же отлично. Сделать явный каст не так уж и сложно. А разбираться где что присвоил когда баги полезут, не особо приятно
Копипаст из заявки в СД:
Версия и битность терминала
910 32 bit
Описание проблемы
Здравствуйте, уважаемые разработчики!
В языке MQL5 для получения данных таймсерии предназначен ряд системных функциий, таких как CopyRates, CopyTime, CopyOpen и т.д.
При вызове любой из этих функций происходит загрузка затребованной таймсерии в ОЗУ в пределах параметра "Max bars in chart" .
Однако, сочетание таких факторов как:
1. Достаточно глубокая доступная история по символу или полностью загруженная с сервера.
2. Параметр "Max bars in chart" равен "Unlimited".
3. Затребованы данные самого маленького таймфрейма M1.
Происходит очень большое потребление оперативной памяти.
Проблему усугубляет ещё и тот факт, что в логике работающей программы MQL5 (например, если это мультивалютный эксперт или индикатор)
может быть заложено поочерёдное обращение к данным младших таймфреймов нескольких символов(например, однократный перебор).
В результате потребление ОЗУ возрастает в разы.
Получение данных нужного таймфрейма из промежуточных данных
Служебные файлы в формате HCC исполняют роль источника данных для построения ценовых данных по запрошенным таймфреймам в формате HC. Данные в формате HC являются таймсериями, максимально подготовленными для быстрого доступа. Они создаются только по запросу графика или mql5-программы в объеме, не превышающем значения параметра "Max bars in charts", и сохраняются для дальнейшего использования в файлах с расширением hc.
Для экономии ресурсов данные по таймфрейму загружаются и хранятся в оперативной памяти только по необходимости, при длительном отсутствии обращений к данным происходит выгрузка их из оперативной памяти с сохранением в файл. Для каждого таймфрейма данные подготавливаются независимо от наличия уже готовых данных для других таймфреймов. Правила формирования и доступности данных одинаковы для всех таймфреймов. Т.е. не смотря на то, что единицей хранения данных в формате HCC является минутный бар, наличие данных в формате HCC не означает наличие и доступность в том же объеме данных таймфрейма М1 в формате HC.
Получение новых данных с сервера вызывает автоматическое обновление используемых ценовых данных в формате HC по всем таймфреймам и перерасчет всех индикаторов, которые явно используют их в качестве входных данных для расчета.
Тайминг процесса, выделенного жёлтым цветом на приведённой цитате из документации довольно большой: около получаса (по моим наблюдениям).
В результате все затребованные таймсерии "ютятся" в "оперативке" не понятно для чего.
Если "оперативка" ещё и не "резиновая" , а "ненасытный" эксперт/индикатор требует всё больше и больше таймсерий, то терминалу ничего больше не остаётся,
кроме как начать экстренно "скидывать" лишние таймсерии обратно в файл(кэш). Так вот, при этом экстренном сбросе терминал может сбросить таймсерию в
"битый кэш" т.е. потеряет "добрую половину" данных. А при следующем обращении к этой таймсерии терминал загружает этот "битый кэш" под видом нормального.
В результате на графике терминала нужная таймсерия отображается с огромной "дырой" в истории.
Ожидаемый результат
В языке MQL5 наблюдается склонность к экономии ресурсов среды выполнения. Примером может служить следующее:
1. функция ArrayFree
2. функция ResourceFree
3. оператор delete
4. параметр "Max bars in charts"
Возможно ли добавить в функционал языка MQL5 системную функцию, которая будет форсировать то, что делает сам терминал с неиспользуемой более таймсерией
по окончании тайминга, если, например не открыт ни один чарт с этой таймсерией?
Например, функцию:
bool SeriesFlush(
string symbol_name, // имя символа
ENUM_TIMEFRAMES timeframe, // период
);
Это позволило бы:
1. не опасаться за переполнение оперативной памяти.
2. не опасаться за появление "битых кэшей", от которых можно избавиться лишь при ручном удалении файлов *.hc при выключенном терминале.
3. не быть привязанным к разрядности операционной системы и размеру оперативной памяти.
4. при разработке программного продукта не применять "костыли", которые пытаются обойти недостатки, описанные выше.
Копипаст из заявки в СД:
Подскажете как получить данные индикатора у которого положительное смещение? интересуют данные на -1 баре?
Для этого нужно знать настройки смещения для интересуемой линии индикатора. Это пример из технического индикатора iAlligator
Это именно смещение, а не расчет индикатора на будущем.
Копипаст из заявки в СД:
Версия и битность терминала
910 32 bit
Описание проблемы
Здравствуйте, уважаемые разработчики!
Одной из рекомендаций по улучшению качества кода при проектировании циклов с большим количеством итераций
является встраивание проверки на факт принудительной остановки MQL5 программы при помощи системной
функции bool IsStopped();
Однако, как показывает практика, эта проверка не работает в индикаторах (в скриптах и экспертах - работает)
Вот краткий код индикатора, отражающий суть проблемы:
Если попытаться удалить этот индикатор с чарта, то сам процесс "вычисления индикатора" как таковой не останавливается,
хотя должен бы из-за проверки флага остановки программы.
Об этом легко можно узнать, наблюдая за процессом terminal.exe в диспетчере задач. На четырёхъядерном процессоре
это около 25% загрузки ЦП. Кроме того, загрузка терминала вообще не снижается со временем вплоть до выключения
терминала. И даже после выключения терминала процесс terminal.exe ещё висит в диспетчере. И, такое чувство,
что выгружается операционной системой как "зависший".
Ожидаемый результат
Пожалуйста, исправьте данную проблему.
Для этого нужно знать настройки смещения для интересуемой линии индикатора. Это пример из технического индикатора iAlligator
Это именно смещение, а не расчет индикатора на будущем.
вот именно у меня расчет в будующее, а что бы отрисовать применяю смещение, как из эксперта считать значения -1 бара???
если кому понадобится можно вот так CopyBuffer(Handle_original,0,-2,10,Data_Ind )
Вот именно у меня расчет в будущее, а что бы отрисовать применяю смещение, как из эксперта считать значения -1 бара???