реализация обратного вызова из DLL

 

Добрый день!

Поковыряв форум, так и не удалось найти полезной информации по теме, как обращаться из DLL к переменным и функциям терминала.

Создаем DLL, реализующую логику работы индикатора. При инициализации индикатора в терминале полностью выгружаем в DLL текущую таймсерию (High,Low,Close,Open,Volume,Time) - например, EURUSD H1. Далее при получении очередной котировки обновляем/достраиваем последний элемент таймсерии уже в самой DLL. Но вот беда, индикатору нужно знать несколько последних значений таймсерии другого таймфрейма - например, EURUSD M15. Неужели, придется вести в DLL полную копию всех используемых комбинаций таймсерий-таймфреймов? Это не эффективно с точки зрения памяти.

Возникает резонный вопрос - можно ли вызвать функцию терминала из DLL? Например, обратиться к iClose(...). Тогда не пришлось бы вести копию всех этих таймсерий в самой DLL. Кто что посоветует?

 
Нельзя. Таймсерии передаются по ссылке. Это не требует дополнительной памяти.
 

1.А как вы в DLL хранить, что то собираетесь?

2.Вообще вызывают функцию из DLL

Не совсем понятно,что работает и что кого вызывает.

 
Zhunko:
Нельзя. Таймсерии передаются по ссылке. Это не требует дополнительной памяти.


Ок. Правильно ли я понял:

1. Раз памяти не выделяется и это всего лишь ссылка, то ее можно передать в DLL один раз и использовать там вечно. Обращение по этой ссылке будет всегда выдавать актуальные текущие значения котировок.
2. В процессе получения новых котировок, размер таймсерий может измениться и только в этом случае следует обновить ссылку в DLL, еще раз выполнив ArrayCopyRates. Или в этом нет необходимости - массив ссылок тоже динамический?

Проще говоря - как часто нужно обновлять ссылку на таймсерии? И если актуализировать одновременно много таймсерий, то это не будет излишне нагружать терминал?

 
zhuki:

1.А как вы в DLL хранить, что то собираетесь?

2.Вообще вызывают функцию из DLL

Не совсем понятно,что работает и что кого вызывает.




1. Обычный динамический массив внутри класса. А как вы себе представляете вычисление сложного индикатора с 12 массивами? Очевидно, их нужно "засунуть" в класс, при каждой новой котировке корректировать размер всех массивов в соответствии с размерностью таймсерий котировок, далее выполнить пересчет последнего эл-та в массиве. Реально из этих 12 массивов будут выводиться в терминал 2-3. Для работы советника могут потребоваться все массивы.

2. Вызывают функцию в DLL, которая вызывает кого-то еще, кому нужно считать актуальное значение последних котировок из терминала. Тут либо заранее нужно передать ВСЕ котировки в DLL (методом ArrayCopyRates), либо обратиться из DLL к терминалу, чтобы считать ТОЛЬКО НЕОБХОДИМЫЕ котировки. Последнее не понятно, как сделать.
 
Всё это нужно для ускорения вычислений или для секретности?
 
zhuki:
Всё это нужно для ускорения вычислений или для секретности?

12 буферов? Их может быть и больше. Это нужно для масштабируемости и ускорения вычислений. Сейчас для EA на MQL4 приходится разбивать индикаторы на группы, выносить в библиотеки... Уперся в сложность, не читабельность и не масштабируемость кода. Без ООП труба.
Причина обращения: