| / | Форум |
|
SergNF
08.06.2006 15:59
Памажите люди добрые!
Не нашел ничего лучше, как передавать тиковые данные из MT4 во внешнюю программу через SendMessageA c сообщением "типа" WM_COPYDATA.
Синтаксис WM_COPYDATA wParam = (WPARAM) (HWND) hwnd; // дескриптор передающего окна lParam = (LPARAM) (PCOPYDATASTRUCT) pcds; // указатель на структуру с данными Параметры hwndИдентифицирует окно, которое передает данные. pcds Указывает на структуру COPYDATASTRUCT, которая содержит данные для передачи. Соответственно ничего не у меня не получается, ИМХО, в связи с тем, что: Структура COPYDATASTRUCT содержит данные, которые будут переданы в другую прикладную программу в соответствии с сообщением WM_COPYDATA. Синтаксис typedef struct tagCOPYDATASTRUCT
{
DWORD dwData;
DWORD cbData;
PVOID lpData;
} COPYDATASTRUCT;
Элементы dwData |
|
Организуйте багтрекинг и техсаппорт для своей компании В TeamWox имеются все для того чтобы организовать багтрекинг. Интегрировав модуль Сервисдеск с веб-сайтом, Вы сможете получать заявки своих клиентов напрямую в TeamWox. Более того, вся переписка с клиентами автоматически распознается и попадает в архив, где ее без труда можно найти в будущем. |
|
RickD
08.06.2006 16:50
Попробуй через GlobalAddAtom. |
|
njel
08.06.2006 16:56
Браво, я вот тормоз, до сих пор через файло данные передавал.
Пацаны глубокий респект!
|
|
SergNF
08.06.2006 17:17
RickD писал (а): Попробуй через GlobalAddAtom. Yeeeeeeeees! Спасибо огромаднейшее, а то я уже начал "кодировать тики". (Сам, когда натыкался на эти "Атомы", "пролистывал" - думал не про меня). |
|
Siarhei
19.05.2008 13:15
RickD писал (а): Попробуй через GlobalAddAtom. Тезка, извини, не понял, что у тебя не получалось с SendMessageA? Тебе посоветовали ниже Атомы какие-то, но не избавили от работы с сообщениями: их нужно принимать! |
|
zhuki
19.05.2008 18:51
А что Вы собираетесь отправить в МТ с помощью SendMessageA,и откуда. Я что то не совсем понял. Если ещё раз объясните постараюсь помочь. Спасибо. |
|
embezz
19.05.2008 21:14
Siarhei писал (Р°): RickD писал (а): Попробуй через GlobalAddAtom. Тезка, извини, не понял, что у тебя не получалось с SendMessageA? Тебе посоветовали ниже Атомы какие-то, но не избавили от работы с сообщениями: их нужно принимать! Никак. Средствами MQL вы не примете оконное сообщение. А если использовать внешнюю длл которая будет перехватывать сообщения посланные терминалу и каким либо иным способом передавать советнику, то теряется смысл всей идеи... Да и советник может обрабатывать информацию только по приходу нового тика а не real time. Поэтому и используется связка Windows Messages + Global Atom. Из советника можно слать сообщение во внешнюю прогу с идентификатором атома. Из внешней проги читать инфу из атома и удалять его. При необходимости во внешней проге опять создавать атом и отправлять его идентификатор ответом на сообщение из советника... Что то типа того, по крайней мере как я это понимаю. |
|
Jhonny
20.05.2008 08:58
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] |
|
embezz
20.05.2008 23:45
Jhonny писал (а): ЗЫ тамм конечно есть некоторые тонкости но все они уже решаемы просто. Как тогда можно привязать все это к советнику (не скрипту)? В советник функцию GetMessageA просто так не сунешь, иначе он просто не будет работать пока не придет сообщение. p.s. насчет PostThreadMessageA я сам не додумался... возьму на заметку... |
|
Jhonny
21.05.2008 00:17
Есть функция PeekMessage Здесь подробно написано http://www.firststeps.ru/mfc/winapi/r.php?52 |
|
Siarhei
21.05.2008 11:06
Jhonny писал (а): Есть функция PeekMessage Здесь подробно написано http://www.firststeps.ru/mfc/winapi/r.php?52 Все это потрясно. только жаль, что с приходом нового тика в эксперт, вложенная в Start() GetCurrentThreadId() выдает новый идентификатор. Получается, что настроить связь между, например, терминалами или терминалом и чем- либо еще, и забыть про настройки не получится. Т.е советник должен с приходом тика отсылать свой ThreadId источнику, для того, что чтобы ему на этот Id из источника получить что- нибудь. Получается проще эксперту самому забирать уже подготовленную для него инфу где- нибудь в условленном и неизменном месте. P.S. Идентификатор окна в этом отношении лучше, чем идентификатор нити: он неизменен. |
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий