创建您自己的MetaTrader扩展(dll)。 - 页 3

 

真正的C++问题...MT4的外部DLL

大家好。

我有一个用C++编写的外部DLL。然而,我对C++还很陌生,所以我想这可能是我遇到这个问题的原因。我有另一个用C#编写的版本,工作得很好,只是为了使C# DLLs可以被MQL调用,我必须改变它们,而这种改变似乎会导致小的内存泄漏。我希望这里有人能帮助我解决C++版本的问题。情况是这样的。

我一直在慢慢开发各种交易策略编程库。我想做的事情之一是为各种事情开发一套一致的服务,如记录、锁定(对资源的线程安全访问)和事件通知。因此,基本上,我正试图把MQL拉到一个更现代的编程范式中。总之,目前我正在开发一个库,它将允许EA接收各种交易事件 的通知(放置、填充、关闭)。这些事件可能是由事件订阅的EA或其他EA进行的交易的结果。为了实现这一目标,我使用了一个外部DLL,它基本上通过消息传递促进EA之间的通信。有一个发布EA,它只是寻找新的交易事件,当一个事件发生时,它把消息放到订阅EA的队列中(每个订阅者都有自己的队列)。

所以问题是这样的......只要每次只传递一条消息,一切都能正常工作。很明显,这完全不能接受。当一次传递多条消息时,我发现第一条消息被破坏了(它一直将消息返回为 "1",而它应该是 "FILLED,1005167 "这样的消息)。第二条信息是好的,但第一条却不是。我还没有测试过两条以上的信息,但估计我们还是会看到同样的情况。

如果有人知道我做错了什么,并能为我的问题提供一些启示,我将非常高兴。有几点说明。1)我最终将在Apache 2.0下发布这段代码,所以这个源文件也是在Apache 2.0下发布的......我打算在它工作得相当顺利的时候向社区发布。2)我在这里反复说'队列',但如果你看一下源代码,你会发现我用一个向量来代替,基本上像堆栈一样使用它。最初我有一个队列,但把它改成了矢量,只是担心我在STL队列中做了一些我没有意识到的错误。没有这样的运气。真正的实现将是一个队列,但现在队列和矢量都没有为我正确工作。

提前感谢你的任何见解。

Brandon Wilhite

附加的文件:
 

既然我在这里,我想我应该分享我的经验。 你想做的事当然可以做,我自己也做过很多次。

当我第一次开始写DLLs用于MT4时,我无法在C++中工作。 我认为问题在于我的项目设置在Visual Studio中总是不正确(有那么多的d@$%)。 最近,我从CodeGuru那里找到了一个例子,我确实能够编译和使用它。 现在我基本上把那个项目清理掉了,把它作为一个模板。

同时,我一直在写C# DLLs,并使用这里的 这个优秀工具。 基本上,它采取了IL,并改变了它,使它可以从非托管代码中调用。 唯一的问题是,这样做时,MT4似乎出现了内存泄漏。 我还没有确定是由于MT4还是改变了IL,还是什么原因,但它发生了。

下一步,我将学习在C++上编写包装器和/或直接去学习C++。 希望这能解决内存的问题。

总之,你想做的事情肯定是可以完成的。 我已经设法用C#为MT4编写了一些相当复杂的DLL,包括像远程、原始套接字、http、WinForms等东西。 几乎所有你能用.NET做的事情都可以通过这种方式从MT4调用(你说的,我可能已经做过了)。 而且它非常可靠。 唯一的问题是内存泄漏比较慢。

Magick:
谢谢你,帕特里克

这是一个非常有趣的想法,使用FTP。

然而,我确实希望能够与MT互动--将tick和candle信息发送到.net应用程序,而这个应用程序则向MT反馈何时进行交易。

我发现了这个,我想可能会有帮助 -简化的包装和界面生成器

然而,我是一个相当初级的程序员,并不完全了解有一个C++包装的中间层所涉及的内容。

我很想听听你的意见,如果你认为这是一个有用的工具,可以用来帮助在c++和.net之间建立桥梁?
 
bwilhite:
既然我在这里,我想我应该分享我的经验。 你想做的事当然可以做到,我自己也做过很多次。

当我第一次开始写DLLs用于MT4时,我无法在C++中工作。 我认为问题在于我在Visual Studio中的项目设置总是不正确(有很多这样的项目)。 最近,我从CodeGuru那里找到了一个例子,我确实能够编译和使用它。 现在我基本上把那个项目清理掉了,把它作为一个模板。

同时,我一直在写C# DLLs,并使用这里的 这个优秀工具。 基本上,它采取了IL,并改变了它,使它可以从非托管代码中调用。 唯一的问题是,这样做时,MT4似乎出现了内存泄漏。 我还没有确定是由于MT4还是改变了IL,还是什么原因,但它发生了。

下一步,我将学习在C++上编写包装器和/或直接去学习C++。 希望这能解决内存的问题。

总之,你想做的事情肯定可以完成。 我已经设法用C#为MT4编写了一些相当复杂的DLL,包括像远程、原始套接字、http、WinForms等东西。 几乎所有你能用.NET做的事情都可以通过这种方式从MT4调用(你说的,我可能已经做了)。 而且它非常可靠。 唯一的问题是内存泄漏比较慢。

bwilhite 你是个救世主! 这看起来是个不错的工具。你是否有一个c#项目来演示从c#中与MT进行通信?我想做的是让我的.net应用程序告诉MT何时交易。或者你可以推荐一个可以帮助我的链接。如果有任何帮助,我将不胜感激。

 

非常非常感谢!

 

Dll

你好。

DLL是否可以用来通过excel电子表格 发送和接收订单?

我在哪里可以了解到DLL的这个方面。

尊敬的先生

拉蒂诺

 
codersguru:
任何对创建他/她自己的MetaTrader扩展(dll)感兴趣的人可以去。

创建您自己的MetaTrader扩展(dll) - 第一部分

创建您自己的MetaTrader扩展(dll) - 第二部分

还会有另一部分(或两部分),我正在写这些内容

希望你能喜欢它们!

请将您的课程更新为Visual C++ 2008 Express Edition。

 
bwilhite:
既然我在这里,我想我应该分享我的经验。 你想做的事当然可以做,我自己也做过很多次。

当我第一次开始写DLLs用于MT4时,我无法在C++中工作。 我认为问题在于我在Visual Studio中的项目设置总是不正确(有很多这样的项目)。 最近,我从CodeGuru那里找到了一个例子,我确实能够编译和使用它。 现在我基本上把那个项目清理掉了,把它作为一个模板。

同时,我一直在写C# DLLs,并使用这里的 这个优秀工具。 基本上,它采取了IL,并改变了它,使它可以从非托管代码中调用。 唯一的问题是,这样做时,MT4似乎出现了内存泄漏。 我还没有确定是由于MT4还是改变了IL,还是什么原因,但它发生了。

下一步,我将学习在C++上编写包装器和/或直接去学习C++。 希望这能解决内存的问题。

总之,你想做的事肯定可以完成。 我已经设法用C#为MT4编写了一些相当复杂的DLL,包括像远程、原始套接字、http、WinForms等东西。 几乎所有你能用.NET做的事情都可以通过这种方式从MT4调用(你说的,我可能已经做了)。 而且它非常可靠。 唯一的问题是内存泄漏比较慢。

你能确定这个缓慢泄漏的来源吗,bwilhite? 如果你还愿意的话,我很感谢你在这方面的帮助。 目前,我正在寻找一个简单的mql dll,它可以让我通过socket发送和接收消息。 我对c#的基础知识很熟悉,所以如果我能够找到一种方法来利用,那就更好了。

谢谢。

 
Magick:
bwilhite 你是一个生命的救星! 这看起来是个不错的工具。你是否有一个c#项目来演示从c#中与MT进行通信?我想做的是让我的.net应用程序告诉MT何时进行交易。或者你可以推荐一个可以帮助我的链接。如果有任何帮助,我将不胜感激。

你对这个马吉克有什么收获吗? 这正是我想做的事情--让.net应用程序告诉MT什么时候和什么交易。 如果你已经找到了解决方案,请让我知道。

我也很欣赏并希望从bwihite那里听到更多。 你是否有任何可以分享的c# dlls样本。

谢谢!

 

我一直在研究自己的DLL,遇到了127个错误。

.cpp文件包含(除其他外)。

MT4_EXPFUNC char* _stdcall DLLtest() {

return("testing!");

}

[/CODE]

header file contains:

#define MT4_EXPFUNC __declspec(dllexport)

MT4 file:

[CODE]

#import "mydll.dll"

string DLLtest();

当然这并不是所有的内容,但这是相关的信息。现在,根据我的理解,我已经有了一切,可以尝试从MT4调用该函数

由于某些原因,它只是没有 "看到 "它的存在。我以为是我的 DLL 缺少一个 .def 文件,但即使手动创建了一个文件,仍然无法工作。另外,我相信MT4_EXPFUNC一行意味着该函数无论如何都会被导出,所以.def文件是不必要的。整个编译过程很顺利,EA运行良好,直到我试图调用该函数(因为它看不到),然后它就停止了。

我一筹莫展。我真的认为这是一个.def的问题,但我越想越觉得不是这样的。

顺便说一下,我使用的是Visual C++ 2008 Express...

谢谢你的任何见解。

-杰森

 

我在使用Visual C++ 2008 Express时也出现了同样的127错误。目前还没有解决方案,如果我找到了,我会把它贴出来。