- adicionada suporte nativo a bibliotecas .NET com funções de importação inteligentes. Agora, as bibliotecas .NET podem ser usadas sem escrever 'wrappers' especiais — o MetaEditor toma conta disso por conta própria.
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 o trabalho:
- Estruturas simples (POD, plain old data), isto é, estruturas que contêm apenas tipos de dados simples.
- Funções estáticas públicas cujos parâmetros usam apenas tipos simples e estruturas de POD ou seus arrays
Para chamar funções da biblioteca, basta importá-la:
#import "TestLib.dll"
void OnStart()
{
int x=41;
TestClass::Inc(x);
Print(x);
}
O código C# para a função Inc da classe TestClass é semelhante ao seguinte:
public class TestClass
{
public static void Inc(ref int x)
{
x++;
}
}
Como resultado, o script retornará o valor 42.
O melhoramento do suporte a bibliotecas .NET continua, em versões futuras, planeja-se expandir suas possibilidades de uso.
- à biblioteca padrão foi adicionado o suporte para trabalhar com funções WinAPI. Agora, para usar as funções do sistema operacional no programa MQL5, não há necessidade de importar manualmente as bibliotecas e descrever as assinaturas de funções. Basta conectar o arquivo de cabeçalho do diretório MQL5\Include\WinAPI.
As funções WinAPI são agrupadas em arquivos separados por finalidade:
- libloaderapi.mqh — trabalho com recursos
- memoryapi.mqh — trabalho com memória
- processenv.mqh — trabalho com ambiente
- processthreadsapi.mqh — trabalho com processos
- securitybaseapi.mqh — trabalho com o sistema de segurança do sistema operacional
- sysinfoapi.mqh — obtenção de informações do sistema
- winbase.mqh — funções comuns
- windef.mqh — constantes, estruturas e enumerações
- wingdi.mqh — trabalho com objetos gráficos
- winnt.mqh — trabalho com exceções
- winreg.mqh — trabalho com o registro
- winuser.mqh — gerenciamento de janelas e interface
- errhandlingapi.mqh — processamento de erros
- fileapi.mqh — trabalho com arquivos
- handleapi.mqh — trabalho com identificadores
- winapi.mqh — conexão de todas as funções (arquivos de cabeçalho WinAPI)
A ligação funciona apenas com arquitetura de 64 bits.
- adicionado o suporte a qualificadores inline, __inline, __forceinline ao analisar o código. A presença desses qualificadores no código não causará erros e não afetará a compilação. No momento, isso torna mais fácil transferir código C++ para MQL5.
Mais informações sobre qualificadores estão disponíveis no MSDN.
- realizada uma otimização substancial da execução de programas MQL5. Em alguns casos, o ganho de desempenho pode chegar a 10%. Para obter um aumento de velocidade, recompile seus programas na nova versão do MetaEditor.
Infelizmente, otimização adicional levou à perda de compatibilidade de novos programas com versões anteriores do terminal. Todos os programas compilados no MetaEditor versão 1910 e superior não serão inicializados em terminais de versão inferior a 1880. Ao mesmo tempo, programas compilados anteriormente em versões anteriores do MetaEditor funcionarão em novos terminais.
- realizado trabalho de otimização de conjuntos de funções MQL5.
- adicionadas novas propriedades para ajustar/separar gráficos da janela principal do terminal e controlar sua posição.
À enumeração ENUM_CHART_PROPERTY_INTEGER adicionados:
- CHART_IS_DOCKED — janela do gráfico encaixada. Se definido como false, o gráfico pode ser arrastado para fora do terminal.
- CHART_FLOAT_LEFT — coordenada esquerda do gráfico desencaixado em relação à tela virtual.
- CHART_FLOAT_TOP — coordenada superior do gráfico desencaixado em relação à tela virtual.
- CHART_FLOAT_RIGHT — coordenada direita do gráfico desencaixado em relação à tela virtual.
- CHART_FLOAT_BOTTOM — coordenada inferior do gráfico desencaixado em relação à tela virtual.
À enumeração ENUM_TERMINAL_INFO_INTEGER foram adicionados:
- TERMINAL_SCREEN_LEFT — coordenada esquerda da tela virtual. A tela virtual é o retângulo que cobre todos os monitores. Se o sistema tiver dois monitores e sua ordem for definida da direita para a esquerda, a coordenada esquerda da tela virtual poderá estar na borda de dois monitores.
- TERMINAL_SCREEN_TOP — coordenada superior da tela virtual.
- TERMINAL_SCREEN_WIDTH — largura do terminal.
- TERMINAL_SCREEN_HEIGHT — altura do terminal.
- TERMINAL_LEFT — coordenada esquerda do terminal em relação à tela virtual.
- TERMINAL_TOP — coordenada superior do terminal em relação à tela virtual.
- TERMINAL_RIGHT — coordenada direita do terminal em relação à tela virtual.
- TERMINAL_BOTTOM — coordenada inferior do terminal em relação à tela virtual.
- adicionado o campo volume_real às estruturas MqlTick e MqlBookInfo. Ele é projetado para funcionar com maior precisão. O valor volume_real tem uma precedência mais alta do que o volume. O servidor usará esse valor, se especificado.
struct MqlTick
{
datetime time; // Hora da última atualização de preço
double bid; // Preço Bid atual
double ask; // Preço Ask atual
double last; // Preço atual da última transação (Last)
ulong volume; // Volume para o preço Last atual
long time_msc; // Hora da última atualização de preço em milissegundos
uint flags; // Sinalizadores de ticks
double volume_real; // Volume para o preço Last atual com alta precisão
};
struct MqlBookInfo
{
ENUM_BOOK_TYPE type;
double price;
long volume;
double volume_real;
};
- à enumeração ENUM_SYMBOL_INFO_DOUBLE foram adicionadas novas propriedades:
- SYMBOL_VOLUME_REAL — volume da última transação concluída;
- SYMBOL_VOLUMEHIGH_REAL — valor máximo do volume da transação concluída para o dia atual;
- SYMBOL_VOLUMELOW_REAL — valor mínimo do volume da transação concluída para o dia atual.
Para obter essas propriedades, use a função SymbolInfoDouble.
- à enumeração ENUM_MQL_INFO_INTEGER foi adicionada a propriedade MQL_FORWARD — um sinal de que o programa está no modo teste para frente.
- adicionada a propriedade pack( integer_value ) para estruturas. Permite definir o alinhamento da localização dos campos dentro da estrutura, é necessário quando se trabalha com uma DLL. Para integer_value, são possíveis os valores 1, 2 ,4 ,8 e 16.
Se a propriedade não estiver definida, por padrão é usado o alinhamento de 1 byte — pack(1).
Exemplo de uso:
struct A
{
char a;
int b;
};
struct B pack(4)
{
char a;
int b;
};
void OnStart()
{
Print("sizeof(A)=",sizeof(A));
Print("sizeof(B)=",sizeof(B));
}
Conclusão:
sizeof(A)=5
sizeof(B)=8
Mais informações sobre o alinhamento em estruturas estão disponíveis no MSDN.
- flexibilização dos requisitos para coerção de enumerações. Quando implicitamente convertido, o compilador substituirá automaticamente pelo valor da enumeração correta e exibirá um aviso.
Para o seguinte código:
enum Main
{
PRICE_CLOSE_,
PRICE_OPEN_
};
input Main Inp=PRICE_CLOSE;
void OnStart()
{
}
O compilador emitirá um aviso:
implicit conversion from 'enum ENUM_APPLIED_PRICE' to 'enum Main'
'Main::PRICE_OPEN_' instead of 'ENUM_APPLIED_PRICE::PRICE_CLOSE' will be used
Anteriormente, neste caso, era gerado o erro:
'PRICE_CLOSE' - cannot convert enum
Se enumerações são usadas incorretamente nos parâmetros de funções, o compilador ainda produzirá um erro.
- corrigidos erros de compilação de funções de modelo. Agora, ao usar funções de modelo sobrecarregadas, apenas a sobrecarga necessária é instanciada e não todas as existentes.
class X { };
void f(int) { }
template<typename T>
void a(T*) { new T(2); }
template<typename T>
void a() { f(0); }
void OnInit() { a<X>(); }
- otimizados alguns casos de acesso ao histórico de ticks através da função CopyTicks*.
- adicionada a nova função TesterStop que permite concluir o teste/otimização antes do planejado. Ao ser chamada, todo o histórico de negociação e o resultado do OnTester são transferidos para o terminal do cliente como durante a conclusão geral do teste/otimização.
- adicionada uma nova propriedade para indicadores personalizados #property tester_everytick_calculate. Ela é usada no testador de estratégias e permite ativar o cálculo de indicadores em cada tick.
Documentação atualizada.