Возможность обмена информацией между экспертом и индикатором

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vladimir Karputov
Модератор
161512
Vladimir Karputov  
В эту тему были перенесены комментарии, не относящиеся к "ФОРТС Прошу помощи".
Andrey Miguzov
1925
Andrey Miguzov  

Не считаю себя нормальным программистом, даже склонен относить себя к “быдлокодерам”, но всё же вставлю и свои 5 копеек :)

Mikalas вскользь упомянул достаточно важную (для меня) проблему.

Суть проблемы: отсутствие штатной возможности обмениваться информацией между индикатором и экспертом.

Поясню: Мне, для построения линий индикатора нужно работать с глубокой историей. И с этой историей проводить достаточно долгие вычисления (10-15 сек.) Если я сделаю такой индикатор – то он будет тормозить чат, со всем что на нем висит, на эти 10-15 сек. И в Маркете меня закидают тухлыми помидорами комментариями…

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

Ок-ей вынесли, всё летает. Но как мне теперь построить линии в подокне? Глобальные переменные? Их слишком мало… Остается один выход – протирать дырку в винте писать в файл. И хорошо, что не так часто приходится их передавать.

Это всего-лишь один пример, могу ещё привести... + если проследить историю тем на форуме – то можно понять что эта проблема касается достаточно большого количества пользователей, и обмен информацией без использования ДЛЛ – тема очень даже актуальная...

ИМХО конечно, но была бы возможность передавать данные из эксперта в индикатор (или другой эксперт) – этой темы не было бы, ну или она была бы значительно короче :) 

Nikolay Kositsin
429666
Nikolay Kositsin  


Можно не протирать дырку в винте, а создать виртуальный раздел в оперативной памяти и писать файл на него.
Andrey Miguzov
1925
Andrey Miguzov  
GODZILLA:
Можно не протирать дырку в винте, а создать виртуальный раздел в оперативной памяти и писать файл на него.
Штатно? Без использования системных ДЛЛ? Если у Вас есть информация о том как это сделать - поделитесь пожалуйста. Буду очень благодарен!!!
Nikolay Kositsin
429666
Nikolay Kositsin  
MigVRN:
Штатно? Без использования системных ДЛЛ? Если у Вас есть информация о том как это сделать - поделитесь пожалуйста. Буду очень благодарен!!!
Ну как штатно? Сторонней прогой создаём виртуальный жёсткий диск, благо есть даже бесплатные проги, а потом пишем файл на этот раздел через Windows API. Всё летает. Но проще через глобальные переменные проводить последовательную передачу данных. Несколько глобальных переменных для хранения данных, номера передачи, флага передачи, флага приёма да и всё. И по одной ячейке массива через глобальные переменные скидывать.
Andrey Miguzov
1925
Andrey Miguzov  
GODZILLA:
Ну как штатно? Сторонней прогой создаём виртуальный жёсткий диск, благо есть даже бесплатные проги, а потом пишем файл на этот раздел через Windows API. Всё летает. 

Есть такой вариант, вполне рабочий - но он не для маркета. Есть ещё в кодбазе очень удачные примеры решения данной проблемы, статья есть - но всё это не для маркета.

GODZILLA:
Но проще через глобальные переменные проводить последовательную передачу данных. Несколько глобальных переменных для хранения данных, номера передачи, флага передачи, флага приёма да и всё. И по одной ячейке массива через глобальные переменные скидывать.

 Вполне рабочий вариант. Реально, причем не так сложно. Флаги проверять таймером или через события?

Vladimir Karputov
Модератор
161512
Vladimir Karputov  
MigVRN:

Есть такой вариант, вполне рабочий - но он не для маркета. Есть ещё в кодбазе очень удачные примеры решения данной проблемы, статья есть - но всё это не для маркета.

 Вполне рабочий вариант. Реально, причем не так сложно. Флаги проверять таймером или через события?

Логичней через пользовательское событие. Никаких потерь времени не будет.
Andrey Miguzov
1925
Andrey Miguzov  
barabashkakvn:
Логичней через пользовательское событие. Никаких потерь времени не будет.
Сейчас код набросаю, проверим быстродействие...
Andrey Miguzov
1925
Andrey Miguzov  
GODZILLA:
проще через глобальные переменные проводить последовательную передачу данных. Несколько глобальных переменных для хранения данных, номера передачи, флага передачи, флага приёма да и всё. И по одной ячейке массива через глобальные переменные скидывать.

Вообщем, используя этот принцип, получилось передать крупную структуру с данными из эксперта в другого эксперта/индикатор. По скорости пока не анализировал...

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

Andrey Khatimlianskii
54574
Andrey Khatimlianskii  

Давно уже обсуждали. И давно надо было это реализовать. Только все некому было )

Но я бы все-таки через события графика попробовал, мне кажется должно быть быстрее.

Andrey Miguzov
1925
Andrey Miguzov  
komposter:
barabashkakvn:
GODZILLA:

Вообщем - доделал :) Общий алгоритм работы очень простой:

1) Создаем структуру достаточного для нас размера в советнике и индикаторе - дальше буду называть их "Буфер советника" и  "Буфер индикатора". Общий объем передаваемых данных ("Данные из советника") должен быть меньше размера "Буфера советника".

2) Создаем N-ое количество глобальных переменных - "Промежуточный буфер". Сколько именно, в принципе не важно, но на скорость влияет сильно. Чем больше переменных - тем выше скорость передачи. Какой-то разумный предел должен быть - нужно тестировать под конкретные задачи :)

3) Далее цикл - разбиваем "Данные из советника" на части (количество частей зависит от размера "Данных из советника" и  "Промежуточного буфера") и записываем эти части в "Промежуточный буфер".

4) В индикаторе считываем данные из  "Промежуточного буфера" в "Буфер индикатора". Как все части считаем - цикл закончился. Цикл организован через пользовательские события.

5)  Переписываем данные из "Буфера индикатора" в структуру данных индикатора.

Всё... 

Написал класс, который скрывает весь этот процесс от пользователя. С помощью данного класса, можно достаточно легко передавать из эксперта в индикатор (и наоборот) данные любого размера и типа. Скорость передачи - для меня - вполне приемлемая.

Сначала думал, что придется делать выравнивание в структуре, но как оказалось всё работает и без выравнивания. Почему - сам пока не пойму :)

Прикрепляю пример работы с классом - эксперт, индикатор ну и сам класс с передаваемой структурой. 

Ниже видео того, как это работает у меня:

 

Теперь вопрос - какие ещё есть варианты по штатной передаче данных между экспертом и индикатором? 

Файлы:
khmz4.zip 7 kb
123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий