从MT5调用命名管道dll。如何? - Page 3
3 页面的第 524 页 FirstFirst 1234 上一个上一个
Results 21 to 30 of 31

Thread: 从MT5调用命名管道dll。如何?

  1. #21
    好的,我终于想出了如何使用gitHub。我有一个隐藏的文件夹,它破坏了我之前设置的所有设置。现在它已启动并运行,我将使用它来更新代码,并在此处发布解决方案背后的原因。 *编辑 - 添加链接*:gitHub链接:
    https://github.com/jasonforex/MetaTraderBridge

  2. #22
    杰森,你有没有想过如何创建你的C#DLL并从MT4调用它?我刚刚过去几个小时修补它,如果你愿意,可以分享一些代码:MT4脚本'testDLL'代码如下:文件testUMD.dll添加到expertlibraries文件夹中插入代码#import testUMD.dll int AddInteger(int Value1,int Value2); double AddDouble(double Value1,double Value2); string AddDoubleString(double Value1,double Value2); string returnString(string Input); #import/ --------------------------------------------- --------------------- /|脚本程序启动功能|/ ----------------------------------------------- ------------------- int start(){//---- Print(AddInteger: AddInteger(250,750)); double a = AddDouble(250,750);打印(AddDouble: NormalizeDouble(a,4)); double d = StrToDouble(AddDoubleString(250,750));打印(AddDoubleString: NormalizeDouble(d,4)); string temp =发送到DLL; string recv = returnString(temp);打印(RECV);/---- return(0);下面的'testUMD.dll'的C#代码使用我在此帖子中的前一篇文章中引用的RGiesecke的非托管DLL模板。使用System插入代码;使用System.Text;使用RGiesecke.DllExport;使用System.Runtime.InteropServices;使用System.Windows.Forms; namespace testUnmanagedDLL {class Test {#91; DllExport(AddInteger,CallingConvention = CallingConvention.StdCall)#93; public static int AddInteger(int Value1,int Value2){MessageBox.Show(Add Integers: Value1.ToString() Value2.ToString()); return(Value1 Value2); }#91; DllExport(AddDouble,CallingConvention = CallingConvention.StdCall)#93; public static double AddDouble(double Value1,double Value2){MessageBox.Show(AddDouble: Value1.ToString() Value2.ToString()); double Value3 = Value1 Value2; return(Value3); }#91; DllExport(AddDoubleString,CallingConvention = CallingConvention.StdCall)#93; public static string AddDoubleString(double Value1,double Value2){MessageBox.Show(AddDoubleString: Value1.ToString() Value2.ToString()); double Value3 = Value1 Value2; return(Value3.ToString()); }#91; DllExport(returnString,CallingConvention = CallingConvention.StdCall)#93; public static string returnString(string Input){MessageBox.Show(Received: Input);返回(发送到MT4);粗略总结:整数传递=成功,双重传递MT4到C#=成功,双重传递从C#到MT4 =失败,字符串传递=成功。我还没有尝试过数组。用VS 10 .NET 4.0编写的示例代码。如果有人知道如何在没有成功转换为从C#到MT4的字符串的情况下传递双打,请在此主题中删除注释或PM我!

  3. #23
    FXEZ,我正在取得一些进展。我已经能够调用一个像你所示的简单函数,但打开一个命名管道仍然无法正常工作。我确实从RGiesecke的出口方式切换到了Selvin(
    http://www.codeproject.com/Articles/...on-to-Unmanage)。两者都很相似,但我发现Selvin的方法更容易上班。该解决方案包括构建.exe和依赖dll所需的文件。我的进步是在GitHub(
    https://github.com/jasonforex/MetaTraderBridge)所以任何人都可以下载项目的压缩档案,或贡献。一旦我完成所有工作,我将在此处重新发布最终的代码,项目也将保留在GitHub上。我仍然每天检查这个帖子,以防任何贡献或想法在这里弹出。我需要添加到我的存储库的唯一东西是我正在使用的测试MT5脚本,但这非常简单。

  4. #24

    Quote Originally Posted by ;
    ,我正在取得一些进展。我已经能够调用一个像你所示的简单函数,但打开一个命名管道仍然无法正常工作。我确实从RGiesecke的出口方式切换到了Selvin(
    http://www.codeproject.com/Articles/...on-to-Unmanage)。两者都很相似,但我发现Selvin的方法更容易上班。该解决方案包括构建.exe和依赖dll所需的文件。我的进步是在GitHub(
    https://github.com/jasonforex/MetaTraderBridge)...
    我们似乎正处于类似的发展道路上。但是,我打算为我的实现使用套接字而不是命名管道。这时我正在考虑在C#DLL中实现套接字而不是直接在MQL4中实现套接字。我计划让MT4不时连接到DLL以检查是否收到了任何新消息。如果是这样,将从MT4调用DLL以检索该信息,然后根据检索到的指令放置交易/调整位置。收到填充后,该信息将传递给DLL,然后通过套接字发送回我的控制程序,该程序也在C#中实现套接字。

  5. #25
    FXEZ,我同意。我只是想从命名管道开始,因为它们简单。一旦我开始工作,我的计划是实现几种IPC类型(套接字,共享内存和远程处理)。

  6. #26
    嗨,大家好,所以你们都有这个工作?这太酷了。那么脚本代码也可以应用于MT4吗?请让我知道我正在做什么,以及如此多,并在这里与社区其他人分享您的代码。

  7. #27
    杰森,你还在继续这个项目吗?我尝试通过DLL实现套接字实现,但是我只想说我可能必须再次回来并再次使用它。
    我现在正把目光放在命名管道上。
    关于C#dll to Metatrader项目的主题,我终于使用Robert Giesecke的Unmanaged C#DLL导出方法完成了一个示例项目。
    http://vb6-to-csharp.blogspot.com/20...etatrader.html有人可能觉得有用。它包含一个带有代码的可下载示例项目。你是正确的,处理他的非托管模板在使用.Net 4.0进行编译时有点棘手。

  8. #28
    我休息了一段时间,但回到这个项目并让它工作。它现在仍然非常粗糙,但我会清理它。我将尝试描述我用来使其工作的步骤。 1)
    https://sites.google.com/site/robert...managedexports。按照他的步骤放置.zip文件的位置,非常简单。 2)
    https://sites.google.com/site/robert...ds#TOC-Samples。确保在解决方案中包含项目(右键单击,添加现有项目)。该项目将提供.exe来执行所有vtable修正(以下更多内容)3)使用您在#1上安装的Unmanaged Export Library模板打开一个新的解决方案。 4)用适当的指令编码你的函数,即[DllExport,FunctionName]]我的建议是开始非常简单,以确保你正确设置了所有东西。 5)见最后一个陈述。如果您没有正确执行此操作,您将收到错误FunctionName在xxxx.dll中找不到。这一步实际上允许托管代码被非托管代码使用,并且我遇到的问题最多,甚至没有意识到。 RGiesecke提供的示例很适合让你前进,但缺少几个领域,主要是字符串。如果要将字符串传递给C#函数,则传递字符串的地址,而不是字符串本身,即void Function(string str)。棘手的部分是你需要在.Net中使用StringBuilder作为参数的类型,而不是字符串。插入的代码#91; DllExport(SetPipeName,CallingConvention.StdCall)#93; static bool SetPipeName(#91; In,MarshalAs(UnmanagedType.LPWStr)#93;#91; b#93;#91; u#93; StringBuilder#91;u#93;#91;b#93; name ){PipeName = name.ToString();返回true;想要访问代码中的属性字段?这是如何做。插入代码私有静态字符串_serverName; public static string ServerName {#91; return:MarshalAs(UnmanagedType.LPWStr)#93; get {return _serverName; } set {_serverName = value;一个返回字符串的字符串函数怎么样?只需添加Out参数Inserted Code#91; DllExport(UpdatePipeName,CallingConvention.StdCall)#93;静态字符串UpdatePipeName(#91; In,#91; b#93;#91; u#93; Out,#91;u#93;#91;b#93; MarshalAs(UnmanagedType.LPWStr)#93; StringBuilder名称)#91;返回:MarshalAs(UnmanagedType.LPWStr)#93; {PipeName = name.ToString(); return PipeName;出现的另一个问题是在管道的另一端,服务器端(我将我的MT45终端视为我的客户端)。确保使用正确的PipeTransmissionMode设置服务器管道。您希望.Message处于活动状态。如果不这样做,您的管道可能会连接但行为不正常。服务器端确定模式,而.Message允许消息和字节操作。我引用的其他链接:
    http://www.mql5.com/en/docs/basis/preprosessor/import
    http://docs.mql4.com/basis/variables/extfunctions
    http://www.mql5.com/en/articles/115?print=
    http://www.codeproject.com/Articles/...oduction-and-S* 5)最后也是最重要的:确保正确设置post build事件。如果您的目录位置包含空格,请在路径周围添加引号。对我来说,我从我的项目/Debug或/Release中获得了编译的DllExport.exe到我的.dll的路径

  9. #29
    谢谢你的回顾,杰森。我不知道字符串传递(stringbuilder)约定或点#5,这可能是我使用此模板的一些问题的原因。这是个好消息!我能够让自己的C#命名管道项目成功运行。我在管道安全方面遇到了一些初步问题,但在添加了权限后,设法让命名管道在本地网络上工作。

  10. #30
    你也见过这个吗?
    http://beathespread.com/blog/view/14...ngodb-encog-ea可能值得寻找实现订单传递协议的想法和方法,以及在C#中包含其他功能(如数据库)以及访问数学函数(如NN)的方法。

发布权限

  • 您不可发布新主题
  • 您不可回复
  • 您不可发布附件
  • 您不可编辑您的帖子
  •  
  • BB代码是打开的
  • 表情符号是打开的
  • [IMG]代码是打开的
  • [视频]代码是打开的
  • HTML代码是关闭的
histoforex网站使用cookie 文字跟踪
histoforex网站使用cookie 文字跟踪,某些设定已经固定。您可以点击此处阅读我们的Cookie使用说明。 请点击右键接受我们的cookies。如果您选择继续使用histoforex网站,我们将认为您接受我们的cookies。