文章 "基于 .Net 框架和 C# 为 EA 交易和指标开发图形界面" - 页 10

 
非常感谢!
 
这个库也能用于 MT4 吗?
 
我们能否将此 .Net 应用程序附加到图表中?
 

对于 MT4,我们需要对 MtGuiController.dll 进行一些更改,如使用 RGiesecke.DllExport 进行 DLLEXPORT,并对输入和输出参数 进行 marshalling。

 // add reference using nuget 
using RGiesecke.DllExport;

        [DllExport("ShowForm", CallingConvention = CallingConvention.StdCall)]
        public static void ShowForm([MarshalAs(UnmanagedType.LPWStr)] string assembly_path, [MarshalAs(UnmanagedType.LPWStr)] string form_name)
        {
            try
            {
                GuiController controller = GetGuiController(assembly_path, form_name);
                string full_path = assembly_path + "/" + form_name;
                m_controllers.Add(full_path, controller);
                controller.RunForm();
            }
            catch(ArgumentException e)
            {
                Type t = e.GetType();
                SendExceptionEvent(e);
            }
        }
        [DllExport("HideForm", CallingConvention = CallingConvention.StdCall)]
        public static void HideForm([MarshalAs(UnmanagedType.LPWStr)] string assembly_path, [MarshalAs(UnmanagedType.LPWStr)] string form_name)
        {
            try
            {
                string full_path = assembly_path + "/" + form_name;
                if (!m_controllers.ContainsKey(full_path))
                    return;
                GuiController controller = m_controllers[full_path];
                controller.DisposeForm();
                m_controllers.Remove(full_path);
            }
            catch(Exception ex)
            {
                SendExceptionEvent(ex);
            }
        }
        [DllExport("SendEvent", CallingConvention = CallingConvention.StdCall)]
        public static void SendEvent([MarshalAs(UnmanagedType.LPWStr)] string el_name, [MarshalAs(UnmanagedType.U4)] int id, [MarshalAs(UnmanagedType.U8)] long lparam, [MarshalAs(UnmanagedType.R8)] double dparam, [MarshalAs(UnmanagedType.LPWStr)] string sparam)
        {            
            SendEventRef(el_name, ref id, ref lparam, ref dparam, sparam);
        }
        [DllExport("ReceiveEvent", CallingConvention = CallingConvention.StdCall)]
        [return: MarshalAs(UnmanagedType.LPWStr)]
        public static string ReceiveEvent([MarshalAs(UnmanagedType.I4)] int event_n)
        {
            string json = "";
            int id=0;
            string el_name="", sparam="";
            long lparam=0;
            double dparam=0.0;
            GetEvent(event_n,ref el_name, ref id, ref lparam, ref dparam, ref sparam);
            json = "{ \"el_name\":\"" + el_name + "\",\"id\":" + id + ",\"lparam\":" + lparam + ",\"dparam\":" + dparam + ",\"sparam\":\"" + sparam + "\" }"; 
            return json;
        }
        public static void GetEvent(int event_n, ref string el_name,ref int id,  ref long lparam, ref double dparam, ref string sparam)
        {         
                GuiEvent e = m_global_events[event_n];
                el_name = e.el_name;
                id = (int)e.id;
                lparam = e.lparam;
                dparam = e.dparam;
                sparam = e.sparam;
            
        }
       
        [DllExport("EventsTotal", CallingConvention = CallingConvention.StdCall)]
        public static int EventsTotal()
        {
            return m_global_events.Count;
        }
      


MQL4


#import  "MtGuiController.dll"
void ShowForm(string assembly_path, string form_name);
void HideForm(string assembly_path, string form_name);
void SendEvent(string el_name, int id, long lparam, double dparam, string sparam);
string ReceiveEvent(int event_n); // Returns JSON string.. Use JAson.mqh to Deserialize objects
int EventsTotal();
#import
 

我是 MQL5 的新手,从这篇文章中学到了很多!非常感谢!


我有一个问题。在过去的两天里,我一直在苦苦思索下面的问题。


即使在另一台计算机上,我也成功地完成了几个步骤,但每次当我尝试编译代码时,都会收到一条错误信息。


MQL 编译器指出 :下面任何一个枚举的 "未声明标识符"。


public enum GuiEventType
{
    Exception,
    ClickOnElement,
    TextChange,
    ScrollChange
}

如果我将这些枚举从 MQL5 中 "注释 "掉,它就会相应地工作,这很有趣,因为这意味着代码可以工作,但无法读取枚举,这是我的猜测吗?

如果有人能帮助我,我将不胜感激 :)


谢谢、

 

我还在尝试导入一个 C# 程序集。我可以成功编译,甚至可以调用从程序集导入的方法,因此在编译期间,一切似乎都很顺利。

但在策略测试器中执行时,却无法加载 EA,并显示 "无法加载 'MyDll.dll' [0]"。

我把 DLL 放到了 MQL5\Libraries 中。我还尝试将其放入 GAC,但都无济于事。

有什么解决方法吗?

 
dhilgarth:

我还在尝试导入一个 C# 程序集。即使调用从程序集导入的方法,我也能成功编译,因此在编译期间,一切似乎都很顺利。

但在策略测试器中执行时,加载 EA 失败,提示 "无法加载 'MyDll.dll' [0]"。

我把 DLL 放到了 MQL5\Libraries 中。我还尝试将其放入 GAC,但都无济于事。

有什么解决方法吗?

在编辑器中调用 MQL 引用(在 "帮助 "中),转到 "搜索 "选项卡,输入 Dll,回车。

然后会有一页介绍如何导入 dll(及其他)。

不过,这篇文章可能更好: https://www.mql5.com/zh/articles/18

或这篇文章: https://www.mql5.com/zh/docs/runtime/testing#dll

否则,请在右上角的搜索中输入tester dll
Datenaustausch: Erstellen einer DLL für MQL5 in 10 Minuten
Datenaustausch: Erstellen einer DLL für MQL5 in 10 Minuten
  • www.mql5.com
Tatsächlich erinnern sich nicht viele Entwickler daran, wie eine simple DLL-Bibliothek geschrieben wird und was die Merkmale der unterschiedlichen Systemanbindungen sind. Anhand mehrerer Beispiele werde ich versuchen, Ihnen den gesamten Prozess zur Erstellung einer simplen DLL in 10 Minuten zu zeigen, sowie einige technische Einzelheiten der...
 

有人能找出为什么会出现以下错误吗?

MQL 编译器指出 :下面任何枚举的 "未声明标识符"。

我也遇到了同样的错误。

 
有了控件,相比开发EA,C#开发起来方便很多,数据计算等方面已有所提高,谢谢共享。
 
sachnyc:

有人能找出为什么会出现以下错误吗?

MQL 编译器指出 :对于下面的任何枚举,"未声明标识符"。

我也遇到了同样的错误。

您可以使用每个事件类型 的数字表示

事件类型 ID
异常 0
点击元素 1
文本更改 2
滚动变化 3

下面是一个使用 SendEvent 函数的示例(代码来自 TardePanel EA):

GuiController::SendEvent("CurrentVolume", TextChange, 0, 0.0, corr_vol);
GuiController::SendEvent("CurrentVolume", 2, 0, 0.0, corr_vol);

您可以更改事件 TextChange 的表示方法,使其 ID 变为 2,并对所有需要它的函数执行此操作。