Как получить доступ к GlobalVariables MT4 из других приложений?

 

Работать с глобальными переменными иногда очень удобно!

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

На сколько я понимаю, данные глобальных переменных хранятся в определенных участках памяти во время работы и после завершения работы MT сохраняются в gvariables.dat.
1. А нельзя ли теоретически найти и получить доступ к значениям глобальных переменных в памяти?
2. Насколько проблематично организовать такой доступ с возможностью изменять их содержимое?
3. С какими аспектами проблем придется столкнуться решая эту задачу?

При решении этого вопроса открываются огромные возможности использования своих наработок без каких либо задержек и других проблем связанных,
к примеру, с использованием внешних DLL с разделяемой памятью, которые ранее досконально были описаны в других ветках форума.

 
То есть, Вы хотите получить доступ к переменным при выключенном терминале?
1)Если терминал включен, то это не проблема - получаем доступ к глобальным переменным через эксперта, к нему подгружаем внешнюю dll и через разделяемую область данных/файлы передаем в нужное приложение. Как простейший вариант - можно просто экспертом сбрасывать глобальные переменные в какой-либо файл, который в данном случае будет являться альтернативой файлу gvariables.dat. Естественно, при знании структуры этого файла, мы сможем его и модифицировать, передавая обратно в MT4, хотя без dll, кажется, не обойтись все равно.
2)Что касается файла gvariables.dat - то для работы с ним нужно спросить разработчиков о структуре файла, скорее всего, они Вам ответят. Если нет, то можно попытаться угадать структуру, например, (id, name,value). Когда будет ясна структура файла, его можно будет без проблем модифицировать файл.
3) Проблемы при использовании - бывают косяки при работе со структурированными файлами. Ну и, конечно, без знания сильного языка программирования типа С++ ничего не получится.
 
VBAG:

Работать с глобальными переменными иногда очень удобно!

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

На сколько я понимаю, данные глобальных переменных хранятся в определенных участках памяти во время работы и после завершения работы MT сохраняются в gvariables.dat.
1. А нельзя ли теоретически найти и получить доступ к значениям глобальных переменных в памяти?
2. Насколько проблематично организовать такой доступ с возможностью изменять их содержимое?
3. С какими аспектами проблем придется столкнуться решая эту задачу?

При решении этого вопроса открываются огромные возможности использования своих наработок без каких либо задержек и других проблем связанных,
к примеру, с использованием внешних DLL с разделяемой памятью, которые ранее досконально были описаны в других ветках форума.



Вы хотите менять глобальные переменные непосредсвенно в памяти из внешнего приложения ?
не понятно зачем? их можно менять из кода эксперта
если так стоит задача
то можно решить через сброс переменных из кода эксперта через DLL во внешнее приложение
или писать в виде файла
и читать из внешнего приложения

к примеру файловый обмен

start
{
итаем переменную -
сбрасываем в фалй
формируем флаг для приложения
}


ПРИЛОЖЕНИЕ
получило флаг
считало файл что то сделало с этими данными
скинуло в виде файла обратно
сформировало флаг
- эксперт може забирать данные


Аналогично можно через DLL без файла

на MQL4 можно сотворить практически что угодно в том числе вызывать собсвенные DLL
в которых можно творить что угодно
какой смысл во внешнем приложении
 
favoritefx:
То есть, Вы хотите получить доступ к переменным при выключенном терминале?
1)Если терминал включен, то это не проблема - получаем доступ к глобальным переменным через эксперта, к нему подгружаем внешнюю dll и через разделяемую область данных/файлы передаем в нужное приложение. Как простейший вариант - можно просто экспертом сбрасывать глобальные переменные в какой-либо файл, который в данном случае будет являться альтернативой файлу gvariables.dat. Естественно, при знании структуры этого файла, мы сможем его и модифицировать, передавая обратно в MT4, хотя без dll, кажется, не обойтись все равно.
2)Что касается файла gvariables.dat - то для работы с ним нужно спросить разработчиков о структуре файла, скорее всего, они Вам ответят. Если нет, то можно попытаться угадать структуру, например, (id, name,value). Когда будет ясна структура файла, его можно будет без проблем модифицировать файл.
3) Проблемы при использовании - бывают косяки при работе со структурированными файлами. Ну и, конечно, без знания сильного языка программирования типа С++ ничего не получится.


Естесственно, имеет смысл читать и записывать в переменные при работе терминала.
В том то и смысл идеи, чтобы не связываться с экспертами и DLL -ками которые из них работают, а напрямую работать с содержимым GlobalVariables в памяти компьютера напрямую. Чем прямее, тем надежнее и быстрее.

Это позволит сэкономить ресурсы, разгрузить советников, а главное сигналы гарантировно будут приходить без возможных задержек, о которых было описано господином Минаев Ю.Л на http://www.min2006.ru/_sgt/m1_1.htm и которые были им не описаны, но обсуждались у них на форуме. И критика была справедливой если кто читал.

Понятно, что замут с этой идеей не малый, но, если это сделать, то таким образом можно решить сразу массу проблем и игра стоит свеч.
Хотелось бы оценить с точки зрения программирования под виндой, какие будут трудности и позволит ли MT4 выполнять эти операции. И какой кровью можно будет обойти возможные проблемы.
Спасибо.

 

Безусловно, при реализации придется прибегать к помощи программистов отлично владеющих техникой программирования под виндой на низком уровне, возможно и с использования ассемблера. Но, повторюсь, на мой взгляд, оно того стоит. Это делается один раз, а потом с удовольствием пользуй наздоровье.

 

favoritefx,

я думал по поводу спользования gvariables.dat, но заметил, что он обновляется, только при закрытии терминала и поэтому решил что оперативные данные в нем не присутствуют. Возможно я ошибаюсь. Интересно бы знать точно. Но есть еще одна проблема при работе с этим файлом- он при работающем терминале защищен от записи. Поэтому мне и пришла в голову мысль напрямую с памятью работать, а не с файлом. Да и работа с файлол-это по-хорошему не очень правильно.

YuraZ, Вам то же спасибо за поддержку.

 
Да, вашу идею я понял. Работать с глобальными переменными в распределяемой памяти - это по-нашему :)
Вопрос в том, где эти переменные хранятся. Если в списках, массивах и т.д. во время работы терминала, а сбрасываются в файл после его выключения, то к ним получить доступ почти нереально, разве что супер-программисты на ассемблере это смогут реализовать.
Если в распределяемой памяти, то реализовать идею можно.
но для этого надо
во-первых, знать заголовоки распределяемой памяти и семафоров, чтобы знать, ГДЕ работать с данными
во-вторых, нужно знать структуры, чтобы узнать, КАК работать с данными. ОБ этом можно только у разраобтчиков узнать, но я бы на их месте не предоставлял такую информацию, поскольку она даст потенциальную возможность написать вирус, который будет злостно портить работу терминалов - например, заблокировать семафоры.
Работать с файлами, безусловно, не очень хорошо.

Есть выход - создать свою область с глобальными переменными в памяти и работать через нее. И ассемблер для этого не потребуется - все на С++ реализуемо, но dll здесь будет обязательно. Тем не менее, dll не приведет ни к каким задержкам, если все правильно реализовать. Вопрос в том, под какие реальные цели это нужно? Потому что программирование потребуется действительно жесткое. Что такое работа в распределяемой памяти между разными процессами знаю прекрасно! Камней навалом будет...
 

Спасибо Вам за столь обстоятельный ответ. Я относительно недавно занимаюсь с MT4 и хочу, прежде чем броситься с головой программировать советники, хочу до конца понять ограничения и возможности.
Сразу выяснился серьезный недостаток применения DLL для передачи информации от своего приложения в MT4:
-если DLL вызывается из советника, подгруженного на одном инструменте, то информация из моего приложения будет обработана только в момент прихода тика поэтому инструменту. Нет тика - нет информации, а на других инструментах жизнь продолжается, а сигнал к ним не пришел, поскольку тика на советник не поступало. При такой схеме, существует потенциальная возможность задержки сигнала.
В этой связи, возникает вопрос. Возможен ли вызов одной DLL из разных советников одновременно? При такой возможности можно развесить советники, которые будут обращаться к одной DLL по разным инструментам, что позволит снизить вероятность задержки сигнала. Кузяво как-то?...
Интересно, есть ли альтернативные способы загнать извне сигнал в MT4?
А на круг получается, что проще всего будет банально из советника читать сигнал и реал-тайм файла. Как вы думаете?

 
VBAG:

А на круг получается, что проще всего будет банально из советника читать сигнал и реал-тайм файла. Как вы думаете? 

Файлы в этом случае рулят :) Проблем - 0, два уровня кеширования защищают от тормозов, а адекватность данных гарантируется ОС. Сам юзаю ;)
 
magiXpert:
VBAG:

А на круг получается, что проще всего будет банально из советника читать сигнал и реал-тайм файла. Как вы думаете?

Файлы в этом случае рулят :) Проблем - 0, два уровня кеширования защищают от тормозов, а адекватность данных гарантируется ОС. Сам юзаю ;)

Спасибо. Похоже, что ориентироваться буду на файловый способ, но если найдутся единомышленники, а главное программер готовый взаться за решение этой идеи(естесственно не бесплатно), то хотелось бы её реализовать.
 
Глабольные переменные в памяти не находятся, они из файла читаются и сразу в файл записываются.
Причина обращения: