Впорос по "SendMessageA" и ... "адресам переменных"

 
Памажите люди добрые!

Не нашел ничего лучше, как передавать тиковые данные из MT4 во внешнюю программу через
SendMessageA c сообщением "типа" WM_COPYDATA.


Сообщение 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
Устанавливает до 32 битов данных, которые будут переданы в принимающую прикладную программу.
cbData
Устанавливает размер, в байтах, данных, указанных элементом структуры lpData.
lpData
Указывает на данные, которые будут переданы в принимающую прикладную программу. Этот элемент структуры может быть значением ПУСТО (NULL).


Может быть кто-нибудь что-нибудь посоветует.
("Пользовательские сообщения" с двумя "целыми" передаются успешно и успешно обрабатываются).

ЗЫ. DLL просьба не предлагать, т.к. занаю и буду вешать на 56 чартов, что, по моим оценкам, вызовет "отказ в обслуживании".

 

Попробуй через GlobalAddAtom.

1) Импортируешь GlobalAddAtom.
2) Пишешь все данные в строку через разделитель.
3) Вызываешь GlobalAddAtom и получаешь значение атома.
4) Через SendMessage отсылаешь значение, поместив его в wParam.
5) По получении сообщения удаляешь атом.

 
Браво, я вот тормоз, до сих пор через файло данные передавал. Пацаны глубокий респект!
 
RickD писал (а):

Попробуй через GlobalAddAtom.

1) Импортируешь GlobalAddAtom.
2) Пишешь все данные в строку через разделитель.
3) Вызываешь GlobalAddAtom и получаешь значение атома.
4) Через SendMessage отсылаешь значение, поместив его в wParam.
5) По получении сообщения удаляешь атом.


Yeeeeeeeees!
Спасибо огромаднейшее, а то я уже начал "кодировать тики".
(Сам, когда натыкался на эти "Атомы", "пролистывал" - думал не про меня).
 
RickD:

Попробуй через GlobalAddAtom.

1) Импортируешь GlobalAddAtom.
2) Пишешь все данные в строку через разделитель.
3) Вызываешь GlobalAddAtom и получаешь значение атома.
4) Через SendMessage отсылаешь значение, поместив его в wParam.
5) По получении сообщения удаляешь атом.

Тезка, извини, не понял, что у тебя не получалось с SendMessageA? Тебе посоветовали ниже Атомы какие-то, но не избавили от работы с сообщениями: их нужно принимать!

Получалось без проблем?

У меня похожая задача. Только принимать я хочу не в некоторой внешней программе а в МTrader4.

Как это сделать? Можно ли это сделать в коде советника, прикрепленного к окну на чей хэндл я шлю сообщение?

Или нужно принимать в коде библиотеки *.ex4?

Вопрос по тому как встретить сообщение посланное окошку с данными по торговому инсттрументу с помощью SendMessageA как бы не только к тебе, ко всем)


 

А что Вы собираетесь отправить в МТ с помощью  SendMessageA,и откуда. Я что то не совсем понял.

Если ещё раз объясните постараюсь помочь.

Спасибо.

 
Siarhei:
RickD:

Попробуй через 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]

 
Jhonny:
ЗЫ тамм конечно есть некоторые тонкости но все они уже решаемы просто.

Как тогда можно привязать все это к советнику (не скрипту)? В советник функцию GetMessageA просто так не сунешь, иначе он просто не будет работать пока не придет сообщение.

p.s. насчет PostThreadMessageA я сам не додумался... возьму на заметку...

 

Есть функция PeekMessage  

Здесь подробно написано

http://www.firststeps.ru/mfc/winapi/r.php?52

 
Jhonny:

Есть функция PeekMessage  

Здесь подробно написано

http://www.firststeps.ru/mfc/winapi/r.php?52

Все это потрясно. только жаль, что  с приходом нового тика в эксперт,  вложенная в Start()  GetCurrentThreadId()  выдает новый идентификатор.

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

Т.е  советник должен с приходом тика отсылать  свой ThreadId  источнику, для того, что чтобы ему на этот Id из источника получить что- нибудь. Получается проще эксперту самому забирать уже подготовленную для него инфу где- нибудь в условленном и неизменном месте.

P.S. Идентификатор окна в этом отношении лучше, чем идентификатор нити: он неизменен.


 

Причина обращения: