Попробуй через GlobalAddAtom.
1) Импортируешь GlobalAddAtom.
2) Пишешь все данные в строку через разделитель.
3) Вызываешь GlobalAddAtom и получаешь значение атома.
4) Через SendMessage отсылаешь значение, поместив его в wParam.
5) По получении сообщения удаляешь атом.
Попробуй через GlobalAddAtom.
1) Импортируешь GlobalAddAtom.
2) Пишешь все данные в строку через разделитель.
3) Вызываешь GlobalAddAtom и получаешь значение атома.
4) Через SendMessage отсылаешь значение, поместив его в wParam.
5) По получении сообщения удаляешь атом.
Yeeeeeeeees!
Спасибо огромаднейшее, а то я уже начал "кодировать тики".
(Сам, когда натыкался на эти "Атомы", "пролистывал" - думал не про меня).
Попробуй через GlobalAddAtom.
1) Импортируешь GlobalAddAtom.
2) Пишешь все данные в строку через разделитель.
3) Вызываешь GlobalAddAtom и получаешь значение атома.
4) Через SendMessage отсылаешь значение, поместив его в wParam.
5) По получении сообщения удаляешь атом.
Тезка, извини, не понял, что у тебя не получалось с SendMessageA? Тебе посоветовали ниже Атомы какие-то, но не избавили от работы с сообщениями: их нужно принимать!
Получалось без проблем?
У меня похожая задача. Только принимать я хочу не в некоторой внешней программе а в МTrader4.
Как это сделать? Можно ли это сделать в коде советника, прикрепленного к окну на чей хэндл я шлю сообщение?
Или нужно принимать в коде библиотеки *.ex4?
Вопрос по тому как встретить сообщение посланное окошку с данными по торговому инсттрументу с помощью SendMessageA как бы не только к тебе, ко всем)
А что Вы собираетесь отправить в МТ с помощью SendMessageA,и откуда. Я что то не совсем понял.
Если ещё раз объясните постараюсь помочь.
Спасибо.
Попробуй через GlobalAddAtom.
1) Импортируешь GlobalAddAtom.
2) Пишешь все данные в строку через разделитель.
3) Вызываешь GlobalAddAtom и получаешь значение атома.
4) Через SendMessage отсылаешь значение, поместив его в wParam.
5) По получении сообщения удаляешь атом.
Тезка, извини, не понял, что у тебя не получалось с SendMessageA? Тебе посоветовали ниже Атомы какие-то, но не избавили от работы с сообщениями: их нужно принимать!
Получалось без проблем?
У меня похожая задача. Только принимать я хочу не в некоторой внешней программе а в МTrader4.
Как это сделать? Можно ли это сделать в коде советника, прикрепленного к окну на чей хэндл я шлю сообщение?
Или нужно принимать в коде библиотеки *.ex4?
Вопрос по тому как встретить сообщение посланное окошку с данными по торговому инсттрументу с помощью SendMessageA как бы не только к тебе, ко всем)
Никак. Средствами MQL вы не примете оконное сообщение. А если использовать внешнюю длл которая будет перехватывать сообщения посланные терминалу и каким либо иным способом передавать советнику, то теряется смысл всей идеи... Да и советник может обрабатывать информацию только по приходу нового тика а не real time. Поэтому и используется связка Windows Messages + Global Atom.
Из советника можно слать сообщение во внешнюю прогу с идентификатором атома. Из внешней проги читать инфу из атома и удалять его. При необходимости во внешней проге опять создавать атом и отправлять его идентификатор ответом на сообщение из советника... Что то типа того, по крайней мере как я это понимаю.
embezz писал (а):
Никак. Средствами MQL вы не примете оконное сообщение. А если использовать внешнюю длл которая будет перехватывать сообщения посланные терминалу и каким либо иным способом передавать советнику, то теряется смысл всей идеи... Да и советник может обрабатывать информацию только по приходу нового тика а не real time. Поэтому и используется связка Windows Messages + Global Atom.
Из советника можно слать сообщение во внешнюю прогу с идентификатором атома. Из внешней проги читать инфу из атома и удалять его. При необходимости во внешней проге опять создавать атом и отправлять его идентификатор ответом на сообщение из советника... Что то типа того, по крайней мере как я это понимаю.
А вот и не правда, сообщения можно слать(конечно не совсем окнонные но очень на них похожие). Можно посылать сообщения потоку в котором выполняется советник, только в нем нужно организовать прием этих сообщений.
Ниже приведены два исходника скриптов один шлет сообщения из одного терминала в скрипт запущенный в другом терминале
Этот шлет
//+------------------------------------------------------------------+ //| Sender.mq4 | //| Jhonny | //| jhonnyfx@mail.ru | //+------------------------------------------------------------------+ #property copyright "Jhonny" #property link "jhonnyfx@mail.ru" #property show_inputs extern int threadId=0; #define WM_USER 0x0400 #define WM_QUIT 0x0012 #import "user32.dll" bool PostThreadMessageA( int idThread, // thread identifier int Msg, // message to post int wParam, // first message parameter int lParam // second message parameter ); int start() { while(!IsStopped()) { PostThreadMessageA(threadId,WM_USER,0,0); Sleep(1000); } PostThreadMessageA(threadId,WM_QUIT,0,0); return(0); } //+------------------------------------------------------------------+
Этот принимает
//+------------------------------------------------------------------+ //| test.mq4 | //| Jhonny | //| jhonnyfx@mail.ru | //+------------------------------------------------------------------+ #property copyright "Jhonny" #property link "jhonnyfx@mail.ru" #define WM_USER 0x0400 #import "kernel32.dll" int GetCurrentThreadId(); #import "user32.dll" bool GetMessageA( int& lpMsg[7], // address of structure with message int hWnd, // handle of window int wMsgFilterMin, // first message int wMsgFilterMax // last message ); //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { int A[7]; Alert("CurrentThreadId = " + GetCurrentThreadId()); while(!IsStopped() && GetMessageA(A,0,WM_USER,WM_USER)) { Alert("Получено сообщение!"); } return(0); } //+------------------------------------------------------------------+
ЗЫ тамм конечно есть некоторые тонкости но все они уже решаемы просто.
для передачи данных используется структура
typedef struct tagMSG { // msg HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG;
У меня это int A[7]
ЗЫ тамм конечно есть некоторые тонкости но все они уже решаемы просто.
Как тогда можно привязать все это к советнику (не скрипту)? В советник функцию GetMessageA просто так не сунешь, иначе он просто не будет работать пока не придет сообщение.
p.s. насчет PostThreadMessageA я сам не додумался... возьму на заметку...
Есть функция PeekMessage
Здесь подробно написано
http://www.firststeps.ru/mfc/winapi/r.php?52
Есть функция PeekMessage
Здесь подробно написано
http://www.firststeps.ru/mfc/winapi/r.php?52
Все это потрясно. только жаль, что с приходом нового тика в эксперт, вложенная в Start() GetCurrentThreadId() выдает новый идентификатор.
Получается, что настроить связь между, например, терминалами или терминалом и чем- либо еще, и забыть про настройки не получится.
Т.е советник должен с приходом тика отсылать свой ThreadId источнику, для того, что чтобы ему на этот Id из источника получить что- нибудь. Получается проще эксперту самому забирать уже подготовленную для него инфу где- нибудь в условленном и неизменном месте.
P.S. Идентификатор окна в этом отношении лучше, чем идентификатор нити: он неизменен.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Не нашел ничего лучше, как передавать тиковые данные из MT4 во внешнюю программу через
SendMessageA c сообщением "типа" WM_COPYDATA.
Сообщение WM_COPYDATA передается тогда, когда одна программа пересылает данные в другую программу.
Синтаксис
Параметры
hwndИдентифицирует окно, которое передает данные.
pcds
Указывает на структуру COPYDATASTRUCT, которая содержит данные для передачи.
Соответственно ничего не у меня не получается, ИМХО, в связи с тем, что:
Структура COPYDATASTRUCT содержит данные, которые будут переданы в другую прикладную программу в соответствии с сообщением WM_COPYDATA.
Синтаксис
Элементы
dwData
Устанавливает до 32 битов данных, которые будут переданы в принимающую прикладную программу.
cbData
Устанавливает размер, в байтах, данных, указанных элементом структуры lpData.
lpData
Указывает на данные, которые будут переданы в принимающую прикладную программу. Этот элемент структуры может быть значением ПУСТО (NULL).
Может быть кто-нибудь что-нибудь посоветует.
("Пользовательские сообщения" с двумя "целыми" передаются успешно и успешно обрабатываются).
ЗЫ. DLL просьба не предлагать, т.к. занаю и буду вешать на 56 чартов, что, по моим оценкам, вызовет "отказ в обслуживании".