Советники: Мониторинг котировок (пример для маппинга)

 

Мониторинг котировок (пример для маппинга):

Пример использования DLL для работы с функциями File Mapping.

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

Таким образом, эксперты через один общий файл обмениваются своими котировками.

Автор: Alex Sergeev

Мониторинг котировок (пример для маппинга)

 

Добрый день

Никак не могу подключиться из проекта с++ Builder

Вот код

void __fastcall TForm1::FormActivate(TObject *Sender)
{

        AnsiString path_MemMap32=ExtractFileDir(ParamStr(0)) + "\\dll\\MemMap32.dll";

        AnsiString  path_file="Local\\Monitor_USDCHF";
        wchar_t * UnicodeString = new wchar_t[path_file.WideCharBufSize()]; 
        path_file.WideChar(UnicodeString,path_file.WideCharBufSize());

        delete [] UnicodeString;


        int  (__stdcall *MemOpen) (char * path,int size,int mode,int &err);
        void (__stdcall *MemClose)(int hmem);
        int  (__stdcall *MemRead)(int hmem, int v[], int pos, int sz, int &err);

        HINSTANCE hDLL= LoadLibrary(path_MemMap32.c_str());

        if(!hDLL)       {StatusBar1->SimpleText="I can't load dll";}
        else            {StatusBar1->SimpleText="path_MemMap32.dll load";}

        MemOpen= (int(__stdcall *)(char * path,int size,int mode,int &err))  GetProcAddress(hDLL,"MemOpen");
        MemClose=(void(__stdcall*)(int hmem)) GetProcAddress(hDLL,"MemClose");
        MemRead= (int(__stdcall *)(int hmem, int v[], int pos, int sz, int &err))  GetProcAddress(hDLL,"MemRead");
        hmem=MemOpen(path_file.c_str(),-1,0,err);
        StatusBar1->SimpleText=err;

}

В статус бар пишет 2 тоесть файл не найден, пробовал как в анси так и в юникоде отправлять путь к файлу

В МТ5 файл эксперт создал файл и обновляет в нем котировки

 

если у вас C++ - так зачем же вы решили DLL использовать?

там ведь исходный код есть полностью.

 
sergeev:

если у вас C++ - так зачем же вы решили DLL использовать?

там ведь исходный код есть полностью.

Хотел уже готовособранную длл поюзать

причем так чтобы не было проблем со спрариванием в МТ4-5

... попробую посмотреть исходники от длл

 
olyakish:

Хотел уже готовособранную длл поюзать

причем так чтобы не было проблем со спрариванием в МТ4-5

... попробую посмотреть исходники от длл

Какой у Вас виндоус?
 
Dima_S:
Какой у Вас виндоус?

win7x64

В билдере что то не получается написать

икнлюду вот так

#include <vcl.h>
#include <stdafx.h>

#include "BuySell.h"
Получаю 
[C++ Fatal Error] afxv_w32.h(14): F1003 Error directive: WINDOWS.H already included.  MFC apps must not #include <windows.h>

Пробовал сначала подключать

afxv_w32.h

не помогло

пробовал сначала подключать afxwin.h - тоже не помогло.

 
olyakish:

пробовал сначала подключать afxwin.h - тоже не помогло.

поищите еще как вариант подключенный afx.h
 
sergeev:
поищите еще как вариант подключенный afx.h

Да так заинклюдилась без ошибок буду дальше пробовать. Спасибо

...

Получилось - работает все 

а на CloseHandle почему то не закрывается

у меня в ехе сервер (создает обновляет, и закрывать должен) а в терминале стоит приемник так вот  он после CloseHandle в сервере видит неудаленный объект в памяти

 
olyakish:

у меня в ехе сервер (создает обновляет, и закрывать должен) а в терминале стоит приемник так вот  он после CloseHandle в сервере видит неудаленный объект в памяти

а вы ожидаете, что память должна полностью очищаться при закрытии хендла?
 
sergeev:
а вы ожидаете, что память должна полностью очищаться при закрытии хендла?

Добрый день

Скажите пожалуйста направление развития мысли.

Есть задача раздавать сигналы внутри одного компьютера (сервера) на много терминалов, критичны задержки более 1-3 мс

реализовал в связки клиент сервер,  1-2 счета работают приемлемо причем чтобы не вешать терминал сделал чтение из памяти с использованием Sleep(1)  в цикле - если память принимает необходимое значение то выполняем некоторое действие. Но когда терминалов даже 5 то 1 мс тут уже не обойдешься иначе начитает кулер на процессоре завывать ...

я давно не следил за новостями может в мт5 появились пользовательские события по аналогии OnTrade чтобы можно было их привязать к модификации памяти

а так пробовал считывать без задержек 100 000 циклов (по 8 байт) проходит за 670 мс

... может еще убавить данных до 4 байт.

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

 
olyakish:

Есть задача раздавать сигналы внутри одного компьютера (сервера) на много терминалов, критичны задержки более 1-3 мс

реализовал в связки клиент сервер,  1-2 счета работают приемлемо причем чтобы не вешать терминал сделал чтение из памяти с использованием Sleep(1)  в цикле - если память принимает необходимое значение то выполняем некоторое действие. Но когда терминалов даже 5 то 1 мс тут уже не обойдешься иначе начитает кулер на процессоре завывать ...

я давно не следил за новостями может в мт5 появились пользовательские события по аналогии OnTrade чтобы можно было их привязать к модификации памяти

у вас ведь память модифицировать имеет право только сервер. клиенты её читают.

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

да, сервер придется написать или содрать с MSDN, а клиенты готовые можно использовать прямо в MQL5

с периодичностью опроса тут к сожалению тоже никак нельзя разрулить.  При Sleep(1) в таком количестве экспертов шуметь не должно даже при работе с памятью.  Вам надо проверить тайминг работы функций может где то лишние проходы имеются и нагрузка.