Adicionado suporte nativo para bibliotecas .NET com importação "inteligente" de funções. Agora você pode usar as bibliotecas .NET sem escrever invólucros especiais - o MetaEditor se encarrega disso.
Para trabalhar com as funções da biblioteca .NET, basta importar a própria DLL sem especificar funções específicas. O MetaEditor importa automaticamente todas as funções com as quais é possível trabalhar: .
Estruturas simples (POD, plain old data) - estruturas que contêm apenas tipos de dados simples.
Funções estáticas públicas, nos parâmetros das quais são usados apenas tipos simples e estruturas POD ou suas matrizes .
Para chamar funções da biblioteca, basta importá-las: .
#import "TestLib.dll"//+------------------------------------------------------------------+//| Função de início do programa de script|//+------------------------------------------------------------------+voidOnStart()
{
int x=41;
TestClass::Inc(x);
Print(x);
}
O código C# da função Inc da classe TestClass tem a seguinte aparência: .
O trabalho de suporte às bibliotecas .NET está em andamento, e futuras versões estão planejadas para expandir seu uso.
O suporte para trabalhar com funções WinAPI foi adicionado à biblioteca padrão. Agora não é mais necessário importar manualmente as bibliotecas e descrever as assinaturas das funções para usar as funções do sistema operacional em um programa MQL5. Basta conectar o arquivo de cabeçalho do catálogo MQL5\Include/WinAPI.
As funções WinAPI são agrupadas em arquivos separados por finalidade:
.
libloaderapi.mqh - trabalhando com recursos
memoryapi.mqh - manipulação de memória
processenv.mqh - trabalho com o ambiente
processthreadsapi.mqh - trabalho com processos
securitybaseapi.mqh - trabalha com o sistema de segurança do sistema operacional
sysinfoapi.mqh - obter informações do sistema
winbase.mqh - funções gerais
windef.mqh - constantes, estruturas e enumerações
wingdi.mqh - trabalhando com objetos gráficos
winnt.mqh - tratamento de exceções
winreg.mqh - trabalho com registro
winuser.mqh - gerenciamento de janelas e interfaces
errhandlingapi.mqh - tratamento de erros
fileapi.mqh - manipulação de arquivos
handleapi.mqh - manipulação de alças
winapi.mqh - conexão de todas as funções (arquivos de cabeçalho WinAPI).
A associação funciona somente com arquitetura de 64 bits.
Теперь вы можете выносить графики финансовых инструментов за пределы окна торгового терминала. Это удобно при работе с несколькими мониторами. Например, на одном можно расположить основное окно платформы и следить за состоянием счета, а на другом — графики для оценки ситуации на рынке. Чтобы отделить график от терминала, отключите опцию...
Nextor o Visual Studio 2022, criei um formulário com um botão, executei-o no MetaTrader 5 e recebi um erro....
Na comunidadedo Visual Studio 2019, tudo funciona como o autor fez, mas quando ele escreve:
"Cada formulário tem uma lista pública de elementos que ele contém. Percorrendo a lista de elementos, o método encontra aqueles que o controlador é capaz de suportar e assina os eventos de que precisa. Se um elemento do formulário não for compatível com o controlador, ele será simplesmente ignorado. "
Infelizmente, se você colocar um SplitContainer ou DataGridView no formulário de teste, o formulário não iniciará, não está claro por que, mas um componente tão complexo como o Chart STARTED.
Incluo um exemplo de teste de quais componentes podem ser usados para modificação (embora o formulário seja iniciado!).
ao tentar criar um controlador GuiController controller = new GuiController(assembly, form, m_global_events); dá Unexpected exception: The key with this name already exists (for DataGridView) e o controlador NÃO é criado (o formulário é criado, provavelmente pode ser exibido, mas sem o controlador como controlá-lo?)
Mais uma vez, tudo está OK se não houver componentes SplitContainer e/ou DataGridView.
"Como você pode ver, o compilador entende as enumerações externas definidas nas bibliotecas de rede e sabe como trabalhar com elas."
Não sei por qual motivo, mas o compilador se recusa obstinadamente a entender as enumerações do C#, então arrastamos a enumeração do C# para o Mql5 e tudo funciona.
Só que, Vasily, você colocou os botões Comprar e Vender no painel de negociação ao contrário))
Mas, em geral, o resultado foi muito legal. Obrigado por seu trabalho árduo!)
Eu tive o mesmo problema.
Resolvi o problema de forma um pouco diferente: em vez de ClickOnElement, escrevi GuiEventType::ClickOnElement. Depois disso, ele compila e funciona sem problemas. Mas, se esse for o caso, não está claro como funcionou para o Vasily. Talvez eu tenha feito algo errado...
Mas, fora isso, a coisa é realmente necessária e útil. É uma pena que a MQL5 não tenha algo semelhante (embutido).
Resolvi o problema de forma um pouco diferente: em vez de ClickOnElement, escrevi GuiEventType::ClickOnElement. E depois disso ele compila e funciona sem problemas. Mas, se esse for o caso, não está claro como funcionou para o Vasily. Talvez eu tenha feito algo errado...
Mas, fora isso, a coisa é realmente necessária e útil. É uma pena que a MQL5 não tenha algo semelhante (embutido).
Eu tive um erro desse tipo:
@MQL_User, fiz como você fez: " ...instead of ClickOnElement wrote GuiEventType::ClickOnElement" - tudo funcionou!
Sou relativamente novo em MQL5 e aprendi muito com este artigo! Muito obrigado!
Tenho uma pergunta. Nos últimos dois dias, tenho me esforçado um pouco para entender isso.
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.
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,
Li que você precisa declarar os enums também no arquivo MQH da mesma forma exata que foram declarados na DLL.
Um exemplo é fornecido no anúncio https://www.metatrader5.com/ru/releasenotes/terminal/1898.
MQL5
Para trabalhar com as funções da biblioteca .NET, basta importar a própria DLL sem especificar funções específicas. O MetaEditor importa automaticamente todas as funções com as quais é possível trabalhar:
.
.
Para chamar funções da biblioteca, basta importá-las:
. O código C# da função Inc da classe TestClass tem a seguinte aparência:
. O script retornará o valor 42.
O trabalho de suporte às bibliotecas .NET está em andamento, e futuras versões estão planejadas para expandir seu uso.
As funções WinAPI são agrupadas em arquivos separados por finalidade:
.
A associação funciona somente com arquitetura de 64 bits.
Na comunidadedo Visual Studio 2019, tudo funciona como o autor fez, mas quando ele escreve:
"Cada formulário tem uma lista pública de elementos que ele contém. Percorrendo a lista de elementos, o método encontra aqueles que o controlador é capaz de suportar e assina os eventos de que precisa. Se um elemento do formulário não for compatível com o controlador, ele será simplesmente ignorado. "
Infelizmente, se você colocar um SplitContainer ou DataGridView no formulário de teste, o formulário não iniciará, não está claro por que, mas um componente tão complexo como o Chart STARTED.
Incluo um exemplo de teste de quais componentes podem ser usados para modificação (embora o formulário seja iniciado!).
ao tentar criar um controlador GuiController controller = new GuiController(assembly, form, m_global_events);
dá Unexpected exception: The key with this name already exists (for DataGridView) e o controlador NÃO é criado (o formulário é criado, provavelmente pode ser exibido, mas sem o controlador como controlá-lo?)
Mais uma vez, tudo está OK se não houver componentes SplitContainer e/ou DataGridView.
talvez outra pessoa tropece
este é o local no artigo
"Como você pode ver, o compilador entende as enumerações externas definidas nas bibliotecas de rede e sabe como trabalhar com elas."
Não sei por qual motivo, mas o compilador se recusa obstinadamente a entender as enumerações do C#, então arrastamos a enumeração do C# para o Mql5 e tudo funciona.
Só que, Vasily, você colocou os botões Comprar e Vender no painel de negociação ao contrário))
Mas, em geral, o resultado foi muito legal. Obrigado por seu trabalho árduo!)
Eu tive o mesmo problema.
Resolvi o problema de forma um pouco diferente: em vez de ClickOnElement, escrevi GuiEventType::ClickOnElement. Depois disso, ele compila e funciona sem problemas. Mas, se esse for o caso, não está claro como funcionou para o Vasily. Talvez eu tenha feito algo errado...
Mas, fora isso, a coisa é realmente necessária e útil. É uma pena que a MQL5 não tenha algo semelhante (embutido).
Eu tive o mesmo problema.
Resolvi o problema de forma um pouco diferente: em vez de ClickOnElement, escrevi GuiEventType::ClickOnElement. E depois disso ele compila e funciona sem problemas. Mas, se esse for o caso, não está claro como funcionou para o Vasily. Talvez eu tenha feito algo errado...
Mas, fora isso, a coisa é realmente necessária e útil. É uma pena que a MQL5 não tenha algo semelhante (embutido).
Eu tive um erro desse tipo:
@MQL_User, fiz como você fez: " ...instead of ClickOnElement wrote GuiEventType::ClickOnElement" - tudo funcionou!
Isso não funciona no MT4. Tentei sem nenhum resultado.
Sou relativamente novo em MQL5 e aprendi muito com este artigo! Muito obrigado!
Tenho uma pergunta. Nos últimos dois dias, tenho me esforçado um pouco para entender isso.
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.
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,
Li que você precisa declarar os enums também no arquivo MQH da mesma forma exata que foram declarados na DLL.
string ReceiveEvent(int event_n); // Returns JSON string.. Use JAson.mqh to Deserialize objectsComo faço para usar isso dentro de OnTimer()?
Estou usando a mesma abordagem explicada no artigo
Minha pergunta é: qual int preciso passar dentro da função ReceiveEvent?Desculpe minha ignorância, mas não entendi.
Você pode me dizer o que há de errado com o programa GuiMtController.mq5 que relata um erro ao ser executado?