好的,我终于想出了如何使用gitHub。我有一个隐藏的文件夹,它破坏了我之前设置的所有设置。现在它已启动并运行,我将使用它来更新代码,并在此处发布解决方案背后的原因。 *编辑 - 添加链接*:gitHub链接:
https://github.com/jasonforex/MetaTraderBridge
好的,我终于想出了如何使用gitHub。我有一个隐藏的文件夹,它破坏了我之前设置的所有设置。现在它已启动并运行,我将使用它来更新代码,并在此处发布解决方案背后的原因。 *编辑 - 添加链接*:gitHub链接:
https://github.com/jasonforex/MetaTraderBridge
杰森,你有没有想过如何创建你的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我!
FXEZ,我正在取得一些进展。我已经能够调用一个像你所示的简单函数,但打开一个命名管道仍然无法正常工作。我确实从RGiesecke的出口方式切换到了Selvin(
http://www.codeproject.com/Articles/...on-to-Unmanage)。两者都很相似,但我发现Selvin的方法更容易上班。该解决方案包括构建.exe和依赖dll所需的文件。我的进步是在GitHub(
https://github.com/jasonforex/MetaTraderBridge)所以任何人都可以下载项目的压缩档案,或贡献。一旦我完成所有工作,我将在此处重新发布最终的代码,项目也将保留在GitHub上。我仍然每天检查这个帖子,以防任何贡献或想法在这里弹出。我需要添加到我的存储库的唯一东西是我正在使用的测试MT5脚本,但这非常简单。
我们似乎正处于类似的发展道路上。但是,我打算为我的实现使用套接字而不是命名管道。这时我正在考虑在C#DLL中实现套接字而不是直接在MQL4中实现套接字。我计划让MT4不时连接到DLL以检查是否收到了任何新消息。如果是这样,将从MT4调用DLL以检索该信息,然后根据检索到的指令放置交易/调整位置。收到填充后,该信息将传递给DLL,然后通过套接字发送回我的控制程序,该程序也在C#中实现套接字。Originally Posted by ;
杰森,你还在继续这个项目吗?我尝试通过DLL实现套接字实现,但是我只想说我可能必须再次回来并再次使用它。
我现在正把目光放在命名管道上。
关于C#dll to Metatrader项目的主题,我终于使用Robert Giesecke的Unmanaged C#DLL导出方法完成了一个示例项目。
http://vb6-to-csharp.blogspot.com/20...etatrader.html有人可能觉得有用。它包含一个带有代码的可下载示例项目。你是正确的,处理他的非托管模板在使用.Net 4.0进行编译时有点棘手。
我休息了一段时间,但回到这个项目并让它工作。它现在仍然非常粗糙,但我会清理它。我将尝试描述我用来使其工作的步骤。 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的路径
谢谢你的回顾,杰森。我不知道字符串传递(stringbuilder)约定或点#5,这可能是我使用此模板的一些问题的原因。这是个好消息!我能够让自己的C#命名管道项目成功运行。我在管道安全方面遇到了一些初步问题,但在添加了权限后,设法让命名管道在本地网络上工作。
你也见过这个吗?
http://beathespread.com/blog/view/14...ngodb-encog-ea可能值得寻找实现订单传递协议的想法和方法,以及在C#中包含其他功能(如数据库)以及访问数学函数(如NN)的方法。