Скачать MetaTrader 5

Запуск скриптов извне

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Скачай мобильную версию MetaTrader 5 и торгуй из любой точки мира!
Vladimir Kustikov
1588
Vladimir Kustikov 2012.01.25 21:22 

Сам не сумел ответить на этот вопрос, поэтому прошу помощи более знающих людей.

Есть ли возможность запускать советники и скрипты MQL на выполнение из внешней программы?

o_o
Модератор
23700
o_o 2012.01.25 21:44  

не сумели ответить, так как не поставили правильно.

вам что надо - запустить ex5 код в обычном приложени  или дать команду терминалу чтоб он запустил ex5 ?

первое нельзя, второе можно, но как то недокументированно через API.

Nikolay Khrushchev
19185
Nikolay Khrushchev 2012.01.26 00:34  
Есть
Vladimir Kustikov
1588
Vladimir Kustikov 2012.01.26 06:13  
sergeev:

не сумели ответить, так как не поставили правильно.

вам что надо - запустить ex5 код в обычном приложени  или дать команду терминалу чтоб он запустил ex5 ?

первое нельзя, второе можно, но как то недокументированно через API.

Неполнота вопроса скорее всего от того, что я не до конца понимаю всех возможностей платформы.

У меня есть самописное приложение, которому хотелось бы дать возможность взаимодействовать с терминалом, т.е. открывать/закрывать позиции по рынку, делать обработки данных и прочее. Для меня видятся несколько вариантов:

  1. реализовать внешний функционал средствами mql - сейчас это будет слишком затратно и неоптимально, так как пришлось бы переносить несколько десятков тысяч строк кода с ассемблерными вставками.
  2. обернуть внешнее приложение в dll и периодически дергать его, получая данные и реагируя на них уже из скрипта - тут вопрос об оптимальном периоде дерганья, данные меняются непериодически.
  3. вариант №2 можно расширить реализовав обмен через сокеты или named pipes - но это уже огород получается.
  4. сделать на mql5 скрипты, дергать их их внешнего приложения через API (есть ли такое? и если есть, то где посмотреть), либо через командную строку (а так можно?) - видится мне наиболее оптимальным вариантом.
Возможно, есть какие-то другие методы, но мне больше всего нравится вариант №4 - вопрос, как это реализуется?

И еще один вопрос - все то же самое, только для MQL4 

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о запущенной MQL5-программе
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о запущенной MQL5-программе
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация о запущенной MQL5-программе - Документация по MQL5
220Volt
1175
220Volt 2012.01.26 06:37  
А разве нельзя сделать DLL, с которой будет работать и приложение и эксперт? В ней что-то типа флагов открывать ли, сколько и чего.
o_o
Модератор
23700
o_o 2012.01.26 07:05  
Vladix:

Неполнота вопроса скорее всего от того, что я не до конца понимаю всех возможностей платформы.

У меня есть самописное приложение, которому хотелось бы дать возможность взаимодействовать с терминалом, т.е. открывать/закрывать позиции по рынку

не проблема

  1. реализовать внешний функционал средствами mql - сейчас это будет слишком затратно и неоптимально, так как пришлось бы переносить несколько десятков тысяч строк кода с ассемблерными вставками.

делайте DLL и обращайтесь к ней. Затрат временных и производственных нет.

  1. обернуть внешнее приложение в dll и периодически дергать его, получая данные и реагируя на них уже из скрипта - тут вопрос об оптимальном периоде дерганья, данные меняются непериодически.

боятся нечего, можете дергать сам МТ, посылая ему сообщение на окно чарта. Он будет перехватывать его через ObChartEvent. Вам надо определиться только какое из виндовых сообщений МТ выкидывает в эту функцию.

  1. вариант №2 можно расширить реализовав обмен через сокеты или named pipes - но это уже огород получается.

а этого вообще нет смысла.

  1. сделать на mql5 скрипты, дергать их их внешнего приложения через API (есть ли такое? и если есть, то где посмотреть), либо через командную строку (а так можно?) - видится мне наиболее оптимальным вариантом.

если знаете Spy++ и WinAPI и умеете посылать сообщения окнам, то разобраться можно.

Возможно, есть какие-то другие методы, но мне больше всего нравится вариант №4 - вопрос, как это реализуется?

И еще один вопрос - все то же самое, только для MQL4 

4 вариант на МТ4 сделать тоже можно. так как тоже WinAPI и теже сообщения.
Dmitriy Skub
11635
Dmitriy Skub 2012.01.26 08:33  

Попробуйте использовать для обмена с Вашим приложением вот эту библиотеку: https://www.mql5.com/ru/code/816

Проверено - работает как часы (швейцарские) и практически без накладных расходов.
Memory Mapping
Memory Mapping
  • голосов: 7
  • 2012.01.13
  • o_O
  • www.mql5.com
DLL (проект VC++ 2010) для работы с Memory Mapping.
Vladimir Kustikov
1588
Vladimir Kustikov 2012.01.26 12:55  
sergeev

Dima_S

Спасибо за ответы! 

Мапить файлы и дергать dll - хорошие варианты, только один минус - терминал не знает, когда обращаться к моему приложению за очередной порцией данных. Именно поэтому я идеальным вижу вариант, когда мое приложение является ведущим, а терминал - ведомым. Т.е. терминал должен был бы каким-то образом принимать realtime нотификации.

Насколько я понял из Ваших ответов, нужно посылать сообщения окну чарта, на котором будет запущен эксперт Далее система ретранслирует его в событие OnChartEvent, которое и может быть обработано в скрипте. Но для MT4 разве есть подобные события? (прошу прощения за свою темноту) А если нет, то какие могут быть альтернативы named pipe? (tcp, udp и другие протоколы сложнее в реализации и использовании)

o_o
Модератор
23700
o_o 2012.01.26 16:21  
Vladix:
sergeev

Dima_S

Спасибо за ответы! 

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

а вам и знать не надо. Дергаете в цикле каждую секунду/минуту

Именно поэтому я идеальным вижу вариант, когда мое приложение является ведущим, а терминал - ведомым. Т.е. терминал должен был бы каким-то образом принимать realtime нотификации.

Насколько я понял из Ваших ответов, нужно посылать сообщения окну чарта, на котором будет запущен эксперт Далее система ретранслирует его в событие OnChartEvent, которое и может быть обработано в скрипте. Но для MT4 разве есть подобные события?

для МТ4 нету. только WInAPI по запуску требуемого скрипта


Vladimir Gomonov
8277
Vladimir Gomonov 2012.01.26 20:41  

sergeev:

боятся нечего, можете дергать сам МТ, посылая ему сообщение на окно чарта. Он будет перехватывать его через ObChartEvent. Вам надо определиться только какое из виндовых сообщений МТ выкидывает в эту функцию.

а этого вообще нет смысла.

если знаете Spy++ и WinAPI и умеете посылать сообщения окнам, то разобраться можно.

Идея интересная. Тут возможен некоторый прорыв. Создание call-back функций вызываемых из внешних приложений (в частности из другого терминала, в том числе MT4). Типа: пишем в в map-файл  номер чарта, имя функции и параметры, потом засылаем внешнее сообщение в чарт, эксперт-драйвер перехватывает, парсит map-файл и уже адресно засылает в соответствующий чарт юзерское сообщение с именем функции и параметрами.

Щупать надо.

220Volt
1175
220Volt 2012.01.26 20:45  
Проясните пожалуйста. Я пологал что dll загружается в память всего один раз, не зависимо от того сколько приложений загрузило. И вот например такая схема: два приложения, одна длл, в длл у нас переменные, вопрос - переменные одни для двух приложений или разные? А одно приложение и одна длл, возможно ли при каждом следующем вызове не терять содержание переменных (не впихивая их в память насильно)? И еще: когда эксперт инициирует вызов длл, вызов происходит от имени терминала или эксперта? т.е. как следствие отсюда - будут ли одними глобальные переменные длл для разных экспертов, загрузивших одну и ту же длл?
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий