Discussão do artigo "Criando interfaces gráficas para EAs e indicadores baseados no .Net Framework e C#" - página 10

 
Fantástico! Funciona como um encanto. Muito obrigado!
 
Essa biblioteca também pode ser usada com o MT4?
 
Podemos anexar esse aplicativo .Net ao gráfico?
 

Para o MT4, precisamos fazer algumas alterações no MtGuiController.dll, como DLLEXPORT usando RGiesecke.DllExport e parâmetros de entrada e saída de 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
 

Sou relativamente novo em MQL5 e aprendi muito com este artigo! Muito obrigado!


Tenho uma pergunta. Nos últimos dois dias, tenho tido um pouco de dificuldade para entender o que está descrito abaixo.


Concluí cada etapa com êxito algumas vezes, mesmo em outro computador, mas sempre que tento compilar o código, recebo uma mensagem de erro.


O compilador MQL afirma : "Undeclared Identifier" (Identificador não declarado) para qualquer uma das enumerações abaixo.


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

Se eu "comentar" essas enumerações no MQL5, ele funcionará de acordo, o que é interessante, pois isso significa que o código funciona, mas não consegue ler as enumerações, o que eu acho?

Se alguém puder me ajudar, ficarei muito grato :)


Obrigado,

 

Também estou tentando importar um assembly C#. Consigo compilar com êxito, mesmo com uma chamada para um método importado do assembly, portanto, durante o tempo de compilação, tudo parece estar bem.

Mas durante a execução no Strategy Tester, ele não consegue carregar o EA com uma simples mensagem "Cannot load 'MyDll.dll' [0]".

Coloquei a DLL em MQL5\Libraries. Também tentei colocá-la no GAC, mas nada adiantou.

Alguma dica sobre como solucionar o problema?

 
dhilgarth:

Também estou tentando importar um assembly C#. Posso compilar com êxito, mesmo com uma chamada para um método importado do assembly, portanto, durante o tempo de compilação, tudo parece estar bem.

Mas durante a execução no Strategy Tester, ele não consegue carregar o EA com uma simples mensagem "Cannot load 'MyDll.dll' [0]".

Coloquei a DLL em MQL5\Libraries. Também tentei colocá-la no GAC, mas nada adiantou.

Alguma dica de como solucionar o problema?

Abra a referência MQL no editor (na "Ajuda"), vá para a guia Pesquisar e digite Dll, Enter.

Em seguida, há uma página sobre como importar dlls (e outros).

Entretanto, este artigo provavelmente é melhor: https://www.mql5.com/pt/articles/18

ou este: https://www.mql5.com/pt/docs/runtime/testing#dll

Caso contrário, digite tester dll na pesquisa no canto superior direito.
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...
 

Alguém conseguiu descobrir o motivo do erro abaixo?

O compilador MQL declara : "Undeclared Identifier" (Identificador não declarado) para qualquer uma das enumerações abaixo.

Também estou recebendo o mesmo erro.

 
Com os controles, é muito mais fácil desenvolver em C# em comparação com o desenvolvimento do EA, e os cálculos de dados etc. foram aprimorados.
 
sachnyc:

Alguém conseguiu descobrir o motivo do erro abaixo?

O compilador MQL declara : "Undeclared Identifier" (Identificador não declarado) para qualquer uma das enumerações abaixo.

Também estou recebendo o mesmo erro.

Você pode usar a representação numérica de cada Event Type:

Tipo de evento ID
Exceção 0
ClickOnElement 1
Mudança de texto 2
ScrollChange 3

Aqui está um exemplo com a função SendEvent (esse código é do TardePanel EA):

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

Você altera a representação do evento TextChange para seu ID, que é 2, e faz isso para todas as funções que precisam dele.