Discusión sobre el artículo "Desarrollando las interfaces gráficas para los Asesores Expertos e indicadores a base de .Net Framework и C#" - página 10

 
¡impresionante! funciona a las mil maravillas. ¡muchas gracias!
 
¿Se puede utilizar esta biblioteca con MT4 también?
 
¿Podemos adjuntar esta aplicación .Net al gráfico?
 

Para MT4, tenemos que hacer algunos cambios en MtGuiController.dll. como DLLEXPORT utilizando RGiesecke.DllExport y marshalling parámetros de entrada y salida.

 // 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
 

¡Soy relativamente nuevo en MQL5 y he aprendido mucho de este artículo! ¡Muchas gracias!


Tengo una pregunta. He estado luchando un poco durante los últimos 2 días para averiguar esto a continuación.


He completado con éxito cada paso un par de veces, incluso en otro equipo, pero cada vez que intento compilar el código me sale un mensaje de error.


El compilador MQL estados : "Identificador no declarado" para cualquiera de las enumeraciones de abajo.


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

Si "comento" estas enumeraciones fuera de MQL5 entonces funciona en consecuencia, lo cual es interesante, ya que esto significa que el código funciona, pero no puede leer las enumeraciones que es mi suposición?

Si alguien me puede ayudar se lo agradeceria mucho :)


Gracias,

 

También estoy intentando importar un ensamblado C#. Puedo compilar con éxito, incluso con una llamada a un método importado de la asamblea, por lo que durante el tiempo de compilación, todo parece estar bien.

Pero durante la ejecución en el Probador de Estrategias, falla al cargar el EA con un simple "No se puede cargar 'MyDll.dll' [0]".

Puse el DLL en MQL5\Libraries. También traté de ponerlo en el GAC, pero nada ayudó.

¿Algún consejo sobre cómo solucionar este problema?

 
dhilgarth:

También estoy intentando importar un ensamblado C#. Puedo compilar con éxito, incluso con una llamada a un método importado de la asamblea, por lo que durante el tiempo de compilación, todo parece estar bien.

Pero durante la ejecución en el Probador de Estrategias, falla al cargar el EA con un simple "No se puede cargar 'MyDll.dll' [0]".

Puse el DLL en MQL5\Libraries. También traté de ponerlo en el GAC, pero nada ayudó.

¿Algún consejo sobre cómo solucionar este problema?

Llame a la referencia MQL en el editor (en la "Ayuda"), vaya a la pestaña Buscar y escriba Dll, Enter.

Luego hay una página sobre cómo importar dlls (y otros).

Sin embargo, este artículo es probablemente mejor: https://www.mql5.com/es/articles/18

o este otro: https://www.mql5.com/es/docs/runtime/testing#dll

Si no, introduce tester dll en la búsqueda de la parte superior derecha.
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...
 

¿alguien ha podido averiguar por qué se produce el siguiente error?

El compilador MQL estados : "Undeclared Identifier" para cualquiera de las enumeraciones de abajo.

También estoy recibiendo el mismo error.

 
Con los controles, es mucho más fácil desarrollar en C# en comparación con el desarrollo de EA, y los cálculos de datos, etc se han mejorado, gracias por compartir.
 
sachnyc:

¿alguien ha podido averiguar por qué se produce el error de abajo?

El compilador MQL estados : "Identificador no declarado" para cualquiera de las enumeraciones de abajo.

También estoy recibiendo el mismo error.

Puede utilizar la representación numérica de cada Tipo de Evento:

Tipo de evento ID
Excepción 0
ClickOnElement 1
CambioTexto 2
CambioDesplazamiento 3

Aquí hay un ejemplo con la función SendEvent (Este código es de TardePanel EA):

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

Cambias la representación del evento TextChange por su ID que es 2, y lo haces para toda la función que lo necesite.