Скачать MetaTrader 5

Обмен информацией между терминалами через разделяемую память - очень просто и наглядно.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Sergey Sartakov
1287
Sergey Sartakov  

В порядке изучения возможностей обмена информацией между советниками, работающими на разных терминалах

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


Советники (ExpertSharedMemory.mq4) запускаются на разных терминалах и обмениваются между собой информацией через доступную

для всех совместно используемую оперативную память. Доступ к этой памяти обеспечивается DLL-программой – SharedMemoryDLL.dll,

экспортируемой функцией – string GetStringValue(string).

Вы можете через extern – параметр задать функцию работы с разделяемой памятью-

Function_W_R = "R" - читать

Function_W_R = "W" – писать

Информацию для записи также задается через extern –параметр

Read_Write_Buffer.

Для любознательных привожу ссылку, где изложена теория этого подхода

http://msdn.microsoft.com/en-us/library/aa366791%28v=vs.85%29.aspx…….

А также прикрепляю файлы:

1. ExpertSharedMemory.mq4 – сам советник, запускаемый в МТ4

2. SharedMemoryDLL.cpp – исходник DLL –программы на c++

SharedMemoryDLL.def - файл с определениями функций, экспортируемых из DLL

3. SharedMemoryDLL.dll - собранная dll, ее необходимо поместить в каталог

…expert\libraries\

4. Программа Widows-установки SetupSharedMemoryDLL.dll , для тех, кто любит все делать по правилам.

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

Файлы:
IgorM М
4801
IgorM М  
Вы бы вместо выделения шрифтом своих изысканий приложили бы тесты скорости обмена, ибо я где-то читал на форуме, что вызов dll под МТ4 довольно медленный процесс, что успешно преодолели в МТ5. Тики можно передавать? не будет пропусков?
Sergey Sartakov
1287
Sergey Sartakov  
IgorM:
Вы бы вместо выделения шрифтом своих изысканий приложили бы тесты скорости обмена, ибо я где-то читал на форуме, что вызов dll под МТ4 довольно медленный процесс, что успешно преодолели в МТ5. Тики можно передавать? не будет пропусков?

Вот возьми, сам протестируй и приложи нам тесты скорости обмена, можешь и с тиками попробовать, потом расскажешь.
Alexey Subbotin
4998
Alexey Subbotin  
делали уже ведь маппинг...
Alexey Subbotin
4998
Alexey Subbotin  
more, не вижу у вас в исходнике функции, освобождающей ресурсы мап-файла после окончания использования. Или я чего-то недопонимаю?
Sergey Sartakov
1287
Sergey Sartakov  
alsu:
more, не вижу у вас в исходнике функции, освобождающей ресурсы мап-файла после окончания использования. Или я чего-то недопонимаю?

Дело в том, что долго не получалась связь, пока не вычитал такую фишку при описание функции OpenFileMapping(...) -

If there is an open handle to a file mapping object by this name and the security descriptor on the mapping object does not conflict

with the dwDesiredAccess parameter, the open operation succeeds. Здесь в выделенном тексте говорится о необходимости существования открытого хэндлера для данного

имени отображаемого объекта, причем на момент открытия нового хэндлера в другом процессе.


Как только я просек этот момент, сразу же закомментил освобождение ресурсов в функции создания отображаемого объекта и все заработало.

Вот это место - две строки перед return(nrue) :

//+------------------------------------------------------------------+
//|              WriteSharedMemory()                                 |
//+------------------------------------------------------------------+
bool WriteSharedMemory()
{
   HANDLE hMapFile;
   char *pBuf;

   hMapFile = CreateFileMapping(
                 INVALID_HANDLE_VALUE,    // use paging file
                 NULL,                    // default security 
                 PAGE_READWRITE,          // read/write access
                 0,                       // maximum object size (high-order DWORD) 
                 BUF_SIZE,                // maximum object size (low-order DWORD)  
           (LPCSTR) szName);                 // name of mapping object
 
   if (hMapFile == NULL)  return(false);

   pBuf = (char *) MapViewOfFile(hMapFile,   // handle to map object
                        FILE_MAP_ALL_ACCESS, // read/write permission
                        0,                   
                        0,                   
                        BUF_SIZE);           
 
   if (pBuf == NULL)  {CloseHandle(hMapFile); return(false);}

   for (i = 0;  szMsg[i]; i++) {pBuf[i] = szMsg[i];} pBuf[i] = szMsg[i];

//   UnmapViewOfFile(pBuf);
//   CloseHandle(hMapFile);
   return(true);
}
// bool WriteSharedMemory()

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

это просто демонстрация.

Одно понятно, при освобождение ресурса в приведенной выше функции, связь через память прекращается.

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

Alexey Subbotin
4998
Alexey Subbotin  

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

Что получается, когда работа с памятью ведется невнимательно, можно видеть на примере Висты и Вин7, если оставить их без перезагрузки денька на три. Сжирается почти вся виртуалка, причем какой процесс за ее выделение отвечал - не докопаться.

Vadim Zhunko
5226
Vadim Zhunko  

Чем это не понравилось?

Все проблемы решены. В том числе синхронизация.
IgorM М
4801
IgorM М  
more:

Вот возьми, сам протестируй и приложи нам тесты скорости обмена, можешь и с тиками попробовать, потом расскажешь.


спс - пока не до этой проблемы,

я почему то решил, что Вы на общественном форуме пытаетесь по взаимообмену полезную информацию дать/поделиться, а Вы моральным самоудовлетворением занимаетесь -не буду мешать, успехов

Sergey Sartakov
1287
Sergey Sartakov  
Zhunko:

Чем это не понравилось?

Все проблемы решены. В том числе синхронизация.


Работа конечно фундаментальная, но для меня, к примеру, неподъемная - 83 функции, разделенные на 10 групп....ну кто в этом будет разбираться ?

Мне, к примеру, легче было обратиться к первоисточнику и реализовать минимальную базовую версию этого подхода.

В этой базовой версии легко разобраться и на ее основе уже городить свой огород, кому что нравится.

Alexey Subbotin
4998
Alexey Subbotin  
Zhunko:

Чем это не понравилось?

Все проблемы решены. В том числе синхронизация.
лично мне это нравится.
123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий