专家: 行情监视 (内存映射文件)

 

行情监视 (内存映射文件):

这个 EA 是利用内存映射 DLL 与文件映射功能的例子。在此例中, EA 创建一个虚拟 (内存映射) 文件并开始更新符号行情。使用这种方式, EA 可以使用常用内存映射文件来交换数据 (例如, 行情)。

行情监视  (内存映射文件)

作者: o_O

 

下午好

我无法从 C++ 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,即未找到文件,我尝试用 ansi 和 unicode 发送文件路径。

在 MT5 文件中,Expert Advisor 创建了一个文件并更新了其中的报价。

 

如果您有 C++,为什么决定使用 DLL?

源代码完全可以在这里找到。

 
sergeev:

如果您有 C++,为什么决定使用 DLL?

源代码完全可用。

我想使用现成的 DLL。

这样在使用 MT4-5 时就不会有问题。

...我会试着查看 DLL 的源代码

 
olyakish:

我想使用现成的 dll。

这样在 MT4-5 中拼写就不会有问题。

...我会尝试查看 dll 的源代码。

您的 Windows 系统是什么?
 
Dima_S:
您的 Windows 系统是什么?

win7x64

我不能用 Builder 书写。

也不能这样写。

#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 没有关闭。

我的 exe 中有一个服务器(创建更新并应关闭),终端中有一个接收器,因此服务器中的 CloseHandle 关闭后,会在内存中看到失败的对象。

 
olyakish:

我在 echo 中有一个服务器(它更新并关闭服务器),在终端中有一个接收器,因此在服务器中关闭句柄后,接收器会在内存中看到失败的对象。

你是否认为在关闭句柄时内存应该完全清空?
 
sergeev:
您是否希望在关闭手柄时完全清除内存?

下午好

请告诉我思维发展的方向。

有一项任务是在一台计算机(服务器)内的许多终端上分发信号,关键延迟超过 1-3 毫秒。

在客户端-服务器的捆绑中实施,1-2 个账户的工作可以接受,并且不会挂起终端,从内存中使用 Sleep(1) 循环读取 - 如果内存需要必要的值,则执行某些操作。但当终端甚至是 5 个终端时,这里的 1 毫秒是不可行的,否则处理器上的冷却器就会开始嚎叫......

我很久没有关注新闻了,也许在 mt5 中会有类似 OnTrade 的自定义事件,这样它们就可以与内存修改联系起来。

我试过无延迟读取 100 000 个周期(每个周期 8 个字节),在 670 毫秒内通过。

...也许我应该将数据减少到 4 字节。

...也许还有另一种方法可以重建您的 dll,使其在内部循环 - 不返回数据,直到它们不接受所需的值。

 
olyakish:

有一项任务是将一台计算机(服务器)内的信号分配给许多终端,延迟超过 1-3 毫秒至关重要。

在客户机-服务器捆绑程序中,1-2 个账户的工作是可以接受的,而且不会挂起终端,因为在一个循环中使用 Sleep(1) 从内存中读取数据--如果内存需要必要的值,我们就会执行一些操作。但是,当终端甚至是 5 个终端时,这里的 1 毫秒是不可行的,否则处理器上的冷却器就会开始嚎叫......

我很久没有关注新闻了,也许在 mt5 中会有类似于 OnTrade 的用户事件,这样它们就可以与内存修改联系起来。

在您的情况下,只有服务器有权修改内存。

- 看看Pipe 的方向。那里数据到达的 "事件 "是不言自明的 - 如果有数据,我们就获取,如果没有,我们就等待。

是的,服务器需要编写或从 MSDN 复制,但现成的客户端可以直接在 MQL5 中使用。

不幸的是,这里也无法处理轮询的周期性问题。 即使在使用内存的情况下,如此多的智能交易系统中的 Sleep(1) 也不应该产生噪音。 您需要检查函数的时序,也许在某个地方有额外的传递和加载。