Matlab subtrama posição tamanho em forex


Nota: Este problema ocorre em 2017b no meu caso. Eu tento fazer uma figura com subtramas 3x4 juntas, com rótulos de marca apenas nas subtramas esquerda e inferior. No entanto, quando eu executo o código abaixo, o primeiro gráfico parece alterar o tamanho: Observe que estou imprimindo pos. A saída para a primeira subtração é, porém, quando eu verificar novamente a posição da primeira subtração. Além disso, tentei manipular a posição da primeira subtração depois, mas isso piora, veja abaixo: Toda ajuda apreciadaMetaTrader 5 - Exemplos MetaTrader 5 e Interação MATLAB Introdução Meu primeiro artigo Interação entre MetaTrader 4 e MATLAB Engine (Virtual MATLAB Máquina) foi percebida pela comunidade MQL. Alguns leitores (1Q2W3E4R5T) conseguiram mover esse projeto de Borland para VS2008. Mas o tempo corre implacavelmente e (triste, mas verdadeiro) o MetaTrader 4 está desaparecendo, dando lugar ao seu sucessor MetaTrader 5 com o MQL5, que introduziu ponteiros e memória dinâmica. Graças a essas inovações, temos a oportunidade de escrever uma biblioteca universal de interação com a máquina virtual do MATLAB Engine e de vincular diretamente bibliotecas, geradas pelo MATLAB, com o MetaTrader 5. Este artigo aborda essa funcionalidade. Este artigo continua logicamente o anterior e abrange mais profundamente o problema da interação entre MetaTrader 5 e MATLAB. Para tornar o alcance deste artigo mais compreensível para leitores despreparados, dividi-lo-emos em três partes: teoria, referência e prática. A teoria irá abranger os tipos de dados utilizados no MQL5 e MATLAB, bem como a sua conversão mútua. Em Referência você aprenderá as estruturas linguísticas e a sintaxe das funções, necessárias para criar uma DLL. E na prática, analisaremos as armadilhas desta interação. Leitores experientes podem ignorar Teoria e Referência e começar com a Prática. Outros são instados a ler Teoria e Referência, e só então prosseguem para a Prática. Também vale a pena ler livros mencionados na seção Literatura. 1.1 Tipos de dados em MATLAB e MQL5 1.1.1 Tipos de dados simples Em primeiro lugar, precisamos nos familiarizar com os mundos internos do MQL5 e MATLAB. Após a inspeção superficial de tipos de variáveis, concluímos que eles são quase idênticos: Tabela 1. Tipos de dados em MATLAB e MQL5 Há uma diferença importante: as variáveis ​​em MQL5 podem ser simples ou compostas (complexas), e em MATLAB todas as variáveis ​​são multidimensionais (Complexo) - ou seja, matriz. Você deve sempre lembrar sobre esta diferença 1.1.2 Tipos de dados complexos No MQL5 existem 4 tipos complexos de dados: arrays, strings, estruturas e classes. O tipo de dados complexo é definido de vários tipos de dados simples, combinados em blocos de memória de certo comprimento. Ao lidar com esses dados, você sempre precisa saber o tamanho do bloco de memória em bytes ou o número de elementos (exceto as classes). Estamos interessados ​​apenas em arrays e strings, porque a apresentação de classes e estruturas MQL5 para MATLAB não faz sentido. Ao passar arrays de qualquer tipo que você precisa saber: tipo (dimensão) e número de elementos usando a função ArraySize (). Deve ser dada especial atenção à indexação no MetaTrader 5 - geralmente é para trás (ou seja, o primeiro elemento contém dados mais recentes do que o próximo). Verifique isso usando a função ArrayIsSeries (). E MATLAB tem a seguinte indexação: o primeiro elemento contém os dados mais antigos do que o próximo - então você deve reverter suas matrizes antes de enviá-las para o MATLAB, se a bandeira ASSERIES TRUE. Com base no acima, concordamos com o seguinte: Arrays reversos invisivelmente para programas MQL5, exceto para matrizes do tipo char e arrays bidimensionais - deixe-os inalterados. Inverte invisivelmente todos os arrays do MATLAB e atribua o flag ASSERIES com TRUE, exceto para matrizes do tipo char e arrays bidimensionais - deixe-os inalterados. Em todas as matrizes no programa MQL5, criadas de acordo com a indexação para trás, o sinalizador ASSERIES deve ser VERDADEIRO, exceto para matrizes do tipo char e arrays bidimensionais - deixe-os inalterados. Mas esta não é a única limitação ao trabalhar com arrays. Quando você trabalha com matrizes multidimensionais, ou matrizes para serem mais corretas, especialmente do MATLAB, apresentamos a restrição para não mais do que arrays bidimensionais. Aqui, o sinalizador ASSERIES não pode ser VERDADEIRO e, portanto, tais matrizes não são revertidas. Não esqueça que as strings no MQL5 não são arrays dos elementos do tipo char. Então, quando passar strings vem um pequeno problema: em seqüências de caracteres MQL5 codificadas usando Unicode e MATLAB usa codificação ANSI. Então, antes de passar uma string, ele deve ser convertido em matriz de caracteres ANSI usando a função StringToCharArray (). E, vice-versa, quando você obtém uma matriz de caracteres do MATLAB, converta-a usando a função CharArrayToString () (veja a Tabela 2). Para evitar confusão, concorde: armazene todas as strings nos programas MQL5 usando Unicode, sem matrizes do tipo char. 1.2 Comparação dos tipos de dados MQL5 e MATLAB Para reduzir a quantidade de funções e simplificar o algoritmo da biblioteca, reduziremos a quantidade de tipos por meio da conversão automática, que não deve afetar a integridade dos dados. A tabela a seguir ilustra a regra da conversão do tipo de dados do MQL5 em MATLAB: com este tipo de conversão há uma perda de precisão. Não vamos usá-lo, mas você pode usar essa conversão em seus programas. Tabela 2. Comparação dos tipos de dados MQL5 e MATLAB Agora você está familiarizado com os tipos de dados usados ​​no MQL5 e no MATLAB. Você sabe o que as armadilhas esperam na passagem de dados e como ignorá-los com competência. Você ainda precisa saber MATLAB Engine API e se familiarizar com MATLAB Compiler 4. 2. MATLAB Engine API Reference, MATLAB Compiler 4 Reference e C InputOutput Library Reference Esta seção apresenta as funções mais importantes da MATLAB Engine API, recursos do MATLAB Compiler 4 e número de funções úteis da biblioteca de entrada de entrada padrão C. Então, vamos começar. 2.1 MATLAB Engine API e MCR Functions MATLAB Engine - é uma interface externa que permite que outros programas usem o desktop MATLAB. Ele fornece um trabalho totalmente funcional de todos os pacotes MATLAB sem restrições. Embora não seja dito na documentação, mas em termos de programador de sistema - é apenas uma máquina virtual, como PHP, MySQL, etc., que suporta uma maneira simples e relativamente rápida de trocar dados entre MetaTrader 45 e MATLAB. Esse método de conexão de programas externos com o pacote MATLAB é recomendado pelos desenvolvedores. A interface consiste em seis funções: Engine pEng engOpen (NULL) esta função chama a área de trabalho MATLAB, o parâmetro é sempre NULL, retorna um ponteiro para o descritor da área de trabalho. Int exitCode engClose (Engine pEng) esta função fecha a área de trabalho, retorna o número de usuários restantes da área de trabalho MATLAB, onde: Engine pEng apontar para o descritor da área de trabalho. MxArray mxVector mxCreateDoubleMatrix (int m, int n, int ComplexFlag) esta função cria uma variável (matriz) da área de trabalho MATLAB, retorna um ponteiro para variável (matriz), onde: mxArray mxVector ponteiro para matriz variável. Int m número de linhas. Int n número de colunas. Tipo ComplexFlag de número complexo, para MetaTrader 45 mxREAL. Void mxDestroyArray (mxArray mxVector) esta função destrói a matriz MATLAB, é necessário para limpar a memória, onde: mxArray mxVector ponteiro para matriz variável. Int engPutVariable (Engine pEng, char Name, mxArray mxVector) esta função envia variável para área de trabalho. Você não deve apenas criar variáveis ​​do tipo mxArray, mas também enviá-las para MATLAB, onde: Engine pEng ponteiro para o descritor da área de trabalho. Char Name nome variável do tipo char na área de trabalho MATLAB. MxArray mxVector ponteiro para matriz variável. MxArray mxVector engGetVariable (Engine pEng, char Name) esta função obtém variável da área de trabalho - o inverso da função anterior. Somente são aceitas variáveis ​​do tipo mxArray, onde: mxArray mxVector ponteiro para matriz variável. Ponteiro pEng do mecanismo para o descritor da área de trabalho. Char Name nome variável do tipo char na área de trabalho MATLAB. Duplo p mxGetPr (mxArray mxVector), esta função obtém ponteiro para uma matriz de valores, é usada para copiar dados junto com memcpy () (ver 2.3 C Standard InputOutput Library), onde: ponteiro duplo para matriz do tipo duplo. MxArray mxVector ponteiro para matriz variável. Int engEvalString (Engine pEng, char Command) esta função envia comandos para a área de trabalho MATLAB, onde: Engine pEng ponteiro para o descritor da área de trabalho. Comando de comando char para MATLAB, string do tipo char. Você provavelmente percebeu que o MATLAB Engine API permite que você crie a estrutura mxArray somente para o tipo duplo. Mas essa restrição não afeta suas possibilidades, mas afetará o algoritmo de sua biblioteca. MCR (instância MCR) é a biblioteca especial do pacote MATLAB, que permite a execução de bibliotecas públicas de aplicativos independentes, geradas pelo ambiente MATLAB em qualquer computador. Note-se que, mesmo que você tenha um pacote MATLAB completo, você ainda precisa instalar a biblioteca MCR executando o arquivo MCRInstaller. exe, localizado na pasta ltMATLABgtToolboxcompilerdeploywin32. Portanto, antes de chamar qualquer função de biblioteca pública, criada pelo ambiente MATLAB, você precisa chamar a função de inicialização MCR: bool mclInitializeApplication (const char option, int count) retorna TRUE se MCR start foi bem-sucedido, caso contrário FALSE, onde: const char option string of As opções, como no mcc - R geralmente são NULL int count size options string, normalmente 0. No final do trabalho da biblioteca pública, você deve chamar: bool mclTerminateApplication (void) retorna TRUE se MCR foi fechado com sucesso. 2.2 MATLAB Compiler 4 O MATLAB Compiler permite que você crie o seguinte a partir das funções M: Aplicativos autônomos que são executados mesmo que o MATLAB não esteja instalado. CC compartilham bibliotecas, que podem ser usadas sem MATLAB em sistemas de usuários finais. O compilador suporta a maioria dos comandos e pacotes do MATLAB, mas não todos. A lista completa de restrições pode ser encontrada no site MATLAB. Este método permite que você crie pacote independente de software do MetaTrader 5 e MATLAB, mas, em contraste com o mecanismo MATLAB, requer um programador bem treinado e um conhecimento profundo da compilação. O compilador MATLAB requer pelo menos um dos seguintes compiladores CC: Lcc C (geralmente vem com MATLAB). Seu único compilador C. Borland C versões 5.3, 5.4, 5.5, 5.6. Microsoft Visual CC versões 6.0, 7.0, 7.1. O MATLAB Compiler 4, em contraste com seus predecessores, gera apenas o código de interface (wrapper), isto é, não traduz m-functions em código binário ou CC, mas cria um arquivo especial com base na tecnologia de Arquivo de Tecnologia de Componentes (CTF), que inclui Integrações de vários pacotes, necessárias para suportar m-funções. O compilador MATLAB também criptografa esse arquivo com uma chave única (não repetida) de 1024 bits. Agora, vamos considerar o algoritmo do MATLAB Compiler 4 funcionar, uma vez que a ignorância deste tópico levará a muitos erros estúpidos no momento da compilação: a análise de dependências nesta etapa determina todas as funções, arquivos MEX e arquivos P, que as m-funções compiladas dependem de . Criando arquivo - O arquivo CTF é criado, é criptografado e compactado. Gerando o código do objeto do wrapper nesta etapa, todos os códigos-fonte são criados, necessários para o componente: código de interface CC para m-funções especificadas na linha de comando (NameFilemain. c). Arquivo de componente (NameFilecomponent. dat), que contém todas as informações necessárias para executar m-code (incluindo chaves de criptografia e caminhos, armazenados no arquivo CTF). Tradução CC. Nesta fase, os arquivos de código-fonte CC são compilados em arquivos de objeto. Ligação. A fase final do projeto de construção. Agora, quando você está familiarizado com o comportamento do algoritmo do compilador MATLAB, você precisa aprender mais sobre chaves para ter um plano detalhado de ações, ao usar o compilador (mcc): Tabela 4. Teclas Matlab mbuild Linker (versão 4) A Tabela 4 lista As chaves principais. Para obter mais informações, use os comandos mbuild ou doc ​​mbuild da ajuda. 2.3 C Biblioteca InputOutput Padrão A utilização da Biblioteca InputOutput Padrão fornece a cópia de dados correta. Seu uso irá salvá-lo de erros estúpidos que surjam durante a fase de projeto do programa (por exemplo: muitos programadores novatos copiam apenas o ponteiro para o bloco de memória em vez de copiar todo o bloco de memória). De toda a biblioteca InputOutput estamos interessados ​​apenas em uma função: void pIn memcpy (void pIn, void pOut, int nSizeByte) esta função copia (clones) variávelrayar de pOut para pIn com tamanho de bytes nSizeByte, onde: void pIn ponteiro para matriz, Onde copiar. Anula pOut ponteiro para matriz, a partir do qual a cópia é feita. Int nSizeByte o tamanho dos dados copiados, não deve exceder o tamanho da matriz pIn, caso contrário, o erro de acesso à memória ocorrerá. 3. Prática Agora, terminamos com a teoria e podemos prosseguir com a realização da interação MATLAB MetaTrader 5 amp. Como você provavelmente adivinhou, isso será feito de duas maneiras: usando a máquina virtual MATLAB Engine e usando bibliotecas geradas pelo compilador MATLAB. Primeiro, considere uma maneira simples, rápida e versátil de interação via MATLAB Engine. Esta parte do artigo deve ser lida do início ao fim, uma vez que, apesar da aparente diferença entre os métodos de interação, eles têm uma filosofia e sintaxe familiar de construções de linguagem, e aprender algo novo é mais fácil com exemplos simples. 3.1 Desenvolvimento da biblioteca universal do MetaTrader 5 amp. Interação do mecanismo MATLAB Este método de interação não pode ser chamado de elegante e rápido, mas é o mais confiável e cobre todo o pacote MATLAB. Claro, devemos mencionar a velocidade do desenvolvimento do modelo final. A essência do desenvolvimento é escrever um invólucro de biblioteca universal para a interação MetaTrader 45 amp MATLAB Engine. Após este script do MetaTrader 45, o scriptindicatorexpert pode gerenciar a área de trabalho virtual do MATLAB. E todo o algoritmo matemático pode ser armazenado no programa MQL como seqüências de caracteres, para que você possa usá-lo para proteger sua propriedade intelectual (para obter mais detalhes, consulte o artigo Proteja-se, Desenvolvedores). Também pode ser armazenado em m-functions ou arquivos separados por funções P na pasta ltMetaTrader 5gtMQL5Libraries. Possíveis áreas de aplicação dessa interação: testar ou demonstrar modelos matemáticos sem ter que escrever programas complexos (a proteção da propriedade intelectual pode ser organizada como no programa MQL e por meio do pacote MATLAB - usando funções P). Para escrever modelos matemáticos complexos usando todos os recursos do MATLAB. Para todos aqueles que não vão distribuir seus scriptsindicatorsexperts. Vamos prosseguir. Espero que você tenha lido os 1.1 tipos de dados em MATLAB e MQL5. 1.2 Comparação dos tipos de dados MQL5 e MATLAB. 2.1 MATLAB Engine API e MCR Functions e 2.3 C Standard InputOutput Library seções, pois não vamos pausar e analisá-las mais. Leia cuidadosamente o seguinte esquema de bloco, que ilustra o algoritmo da futura biblioteca: Figura 1. Esquema do bloco do algoritmo da biblioteca Como visto na Figura 1, a biblioteca consiste em três blocos principais. Considere os seus propósitos: bloco MQL5, preparação preliminar de dados enviados: Arrays reversos. Conversão de tipos. Conversão de codificações de strings. Bloco CC: converte matriz na estrutura mxArray. Passa os comandos do motor MATLAB. Sistema de cálculo de blocos de motor MATLAB. Agora, vamos lidar com algoritmos. Bem, comece com o bloco MQL5. O leitor atento já percebeu que se concentrará na implementação do que foi escrito nos Tipos de Dados na seção MATLAB e MQL5. Se você perdeu isso, dificilmente entenderá por que tudo isso é necessário. Algoritmo das funções mlInput ltvariabletypegt é quase idêntico. Vamos discutir seu trabalho usando a função mlInputDouble () que fornece entrada de variáveis ​​do tipo duplo para a máquina virtual MATLAB. Bool mlInputDouble (double amparray, int sizeArray, string NameArray). Onde: referência de matriz para variável ou matriz do tipo duplo. SizeArray tamanho da matriz (número de elementos, não bytes). Seqüência de caracteres NameArray, contendo nome de variável exclusivo para a máquina virtual MATLAB (o nome deve corresponder aos requisitos do MATLAB). Converta String NameArray para char array usando a função StringToCharArray (). Verifique o tipo de indexação usando a função ArrayIsSeries (). Se o tipo de indexação for normal para a função mlxInputDouble (). ELSE indexação da matriz de timeseries: inverter matriz e valor de passagem para a função mlxInputDouble (). End função, passar o valor retornado para a função mlxInputDouble (). Algoritmo das funções mlGet ltvariabletypegt também é quase idêntico. Vamos discutir o seu trabalho usando a função mlGetDouble (), que retorna a variável do tipo duplo da máquina virtual MATLAB. Int mlGetDouble (double amparray, int sizeArray, string NameArray). Onde: referência de matriz para variável ou matriz do tipo duplo. SizeArray tamanho da matriz (número de elementos, não bytes). Seqüência de caracteres NameArray, contendo nome de variável exclusivo para a máquina virtual MATLAB. Converta String NameArray para char array usando a função StringToCharArray (). Encontre o tamanho da matriz usando a função mlxGetSizeOfName (). SE o tamanho é MAIS DO QUE ZERO. Aloque a matriz de destinatários de tamanho necessário usando a função ArrayResize (), obtenha dados de mlxGetDouble (). Retorne o tamanho da matriz. O tamanho do IF é ZERO. Erro de retorno, ou seja, valor nulo. É isso que as funções mlGetInt () e mlGetLogical () produzem a conversão de sombra dos tipos double-gt intbool. Para este propósito, essas funções criam um buffer de memória temporário em seus corpos. Esta é uma medida forçada, porque, infelizmente, a API MATLAB não permite criar estruturas mxArray para tipos de dados diferentes do dobro. No entanto, isso não significa que o MATLAB opera exclusivamente os tipos duplos. O bloco CC é muito mais fácil: ele deve fornecer a tradução de dados do tipo duplo para a estrutura mxArray. É feito usando o mxCreateDoubleMatrix (). Funções mxGetPr () e memcpy (). Então, usando a função engPutVariable (), ele passa dados para a máquina virtual MATLAB e, para extrair dados, ele usa a função engGetVariable (). Novamente, preste atenção às funções com prefixos Int e Logical como visto no esquema de bloco, eles não interagem diretamente com MATLAB, mas use as funções mlxInputDoublemlxGetDouble e mlxInputChar (). Algoritmo de seu comportamento é simples: chamar os valores de saída de entrada da função mlxInputDoublemlxGetDouble como duplo () e enviar o comando MATLAB de sombra para converter o tipo de dados pela função mlxInputChar (). MATLAB O bloco do motor é ainda mais fácil. Ele fornece apenas funções matemáticas. Seu comportamento depende dos seus comandos e suas funções de mp. Agora, quando todos os detalhes do projeto são claros, é hora de lidar com a construção de projetos. Qualquer tipo de construção começa com a criação da biblioteca principal no nosso caso, é bloqueio CC. Para esse fim, em qualquer editor de texto ANSI (Bloco de notas, Bred, etc.), crie um arquivo com a extensão DEF. É desejável que o nome deste arquivo consista em caracteres latinos sem espaços e pontuação, caso contrário você ouvirá muitas palavras lisonjeiras do seu compilador. Este arquivo fornece a permanência de suas funções. Se este arquivo estiver ausente, o compilador CC inventará seus próprios nomes exóticos para exportar funções. Este arquivo contém: palavra de controle LIBRARY, LibMlEngine nome da biblioteca, e EXPORTS segunda palavra de controle, então venha o nome das funções. Como você provavelmente sabia, os nomes das funções de exportação não podem ter espaços e pontuação. Aqui está o texto do arquivo DllUnit. def do arquivo MATLABEngine. zip: LIBRARY LibMlEngine EXPORTS mlxClose mlxInputChar mlxInputDouble mlxInputInt mlxInputLogical mlxGetDouble mlxGetInt mlxGetLogical mlxGetSizeOfName mlxOpen Então, temos o primeiro arquivo do projeto. Agora abra o Windows Explorer e vá para a pasta ltMATLABgtExterninclude. Copie o arquivo engine. h (arquivo de cabeçalho da máquina virtual MATLAB) para a pasta, onde você foi projetado (se você não fizer isso, você precisará especificar manualmente o caminho para o arquivo no estágio da compilação). Agora é hora de criar um bloco CC. Não incluiremos todo o código-fonte do programa no artigo, porque este arquivo pode ser encontrado em MATLABEngine. zip como DllUnit. cpp e é bem comentado. Note-se que é melhor criar funções usando a convenção stdcall, ou seja, os parâmetros são passados ​​através da pilha e a função limpa a pilha. Esse padrão é nativo para a API Win3264. Considere como declarar uma função: extern C declspec (dllexport) ltvariabletypegt stdcall Função (lttypegt ltnamegt) extern C declspec (dllexport) informa ao compilador C que essa função é externa. O tipo de variável retornado de ltvariabletypegt pode ser: void, bool, int, double. Tipos compostos (conhecidos não apenas da Dll, mas também do programa de chamada) e ponteiros. A declaração do stdcall sobre a passagem de parâmetros para funcionar e voltar, é um padrão para a API Win3264. Funcion o nome da sua função. Lttypegt ltnamegt tipo e nome da variável de entrada, o número máximo de variáveis ​​é 64. Bloco de blocos CC: para isso, você precisa incluir biblioteca de entrada e saída padrão para adicionar os arquivos a seguir (no seu compilador: Project-gtAdd Project): DllUnit. def Na pasta ltMATLABgtExternlibltwin3264gtltcompilergt, onde: ltMATLABgt MATLAB pasta principal. Ltwin3264gt seja uma pasta win32 para sistema operacional de 32 bits, ou win64 para sistema operacional de 64 bits. Ltcompilergt a pasta borland para Borland CC ver. 5-6, a pasta Microsoft para Microsoft Visual C: libeng. lib libmx. lib Uma pergunta comum como essa pode surgir: eu tenho uma versão diferente do compilador ou não um tal compilador na lista (muito raramente não existem tais arquivos). Permite ver como criar manualmente uma biblioteca pública. Consideraremos como é feito no Visual C e no Borland C: Na FAR, abra a pasta ltMATLABgtBinltwin3264gt, onde: ltMATLABgt MATLAB pasta principal. Ltwin3264gt seja uma pasta win32 para sistema operacional de 32 bits, ou win64 para sistema operacional de 64 bits. Para Borland C digite: implib libeng. lib libeng. dll. O mesmo para libmx. dll. Para Visual C digite: lib libeng. dll. O mesmo para libmx. dll. Se outro compilador. Qualquer compilador de qualquer linguagem de programação deve ter esse utilitário - o Gerenciador de Biblioteca, geralmente este é um programa de console ltcompiler foldergtbinlib. exe. A propósito, eu esqueci de avisá-lo - não tente fazer o LIB de 64 bits para o compilador de 32 bits. Primeiro, descubra se há suporte de endereçamento de 64 bits na ajuda do compilador. Se não, procurando por DLL MATLAB de 32 bits, ou escolha outro compilador CC. Chegando à compilação, depois do qual obtemos uma biblioteca, que deve ser colocada na pasta terminalfolderMQL5Libraries. Agora vamos começar com o bloco MQL. Execute o MetaEditor, clique em Novo e faça como nas figuras a seguir: Figura 2. Assistente MQL5: Criar Biblioteca Figura 3. Assistente MQL5: Propriedades Gerais da Biblioteca Agora, quando o Assistente MQL5 criou um modelo, proceda à sua edição: Note que o MQL 5 você Pode passar ponteiros de duas maneiras: void NameArray Este método de passagem da matriz permite apenas ler dados. No entanto, se você tentar usar essa referência para editar seu conteúdo, você obterá um erro de acesso à memória (no melhor caso para você, o MetaTrader 5 solucionará silenciosamente o erro no quadro SEH, mas HAVENT WRITE a SEH-frame, então Podemos perder o motivo do erro). Voidamp NameArray Este método de passagem permite que você leia e edite o conteúdo da matriz, mas você deve manter o tamanho da matriz. Se a função não aceita ou não passa parâmetros, especifique sempre o tipo de vazio. 2. Nós não descreveremos todas as funções do bloco MQL, porque você pode encontrar o código fonte MatlabEngine. mq5 em MATLABEngine. zip. Portanto, considere os detalhes de declaração e definição de funções externas no MQL5: conforme visto no exemplo, a declaração e a definição da função são combinadas. Nesse caso, declaramos uma função chamada mlInputChar () como externa (exportação), que retorna o valor do tipo bool e aceita a seqüência de matriz como parâmetro. Agora compile. Agora que completamos o último bloco da biblioteca e compilamos, é hora de testá-lo em condições reais. Para fazer isso, escreva um script de teste simples (ou tire-o de MATLABEngine. zip, arquivo: TestMLEngine. mq5). O código de script é simples e bem comentado: conforme visto no script, estamos entrando valores e depois obtemos valores. No entanto, em contraste com o MetaTrader 4, onde precisávamos conhecer o tamanho do buffer no estágio de design, no MetaTrader 5 não é necessário, pois usamos buffers dinâmicos. Agora que você finalmente entendeu a máquina virtual MATLAB, você pode começar a usar a DLL construída no ambiente MATLAB. 3.2 Diretrizes técnicas de construção de DLL geradas pelo MATLAB Compiler 4 Na seção anterior, você aprendeu a criar uma biblioteca para interação universal com o pacote MATLAB. No entanto, esse método tem uma desvantagem: requer o pacote MATLAB do usuário final. Esta restrição cria uma série de dificuldades na distribuição de produtos de software finalizados. É por isso que o pacote matemático MATLAB possui um compilador integrado, que permite que você crie aplicativos independentes independentes do pacote MATLAB. Vamos ver isso. Por exemplo, considere um indicador simples - média móvel (SMA). Aumente a atualização adicionando um filtro de rede neural (GRNN), que permite alisar o ruído branco (rajadas aleatórias). Nomeie o novo indicador como NeoSMA e filtre como GRNNFilter. Assim, temos duas m-funções, das quais queremos criar uma DLL, que pode ser chamada do MetaTrader 5. Agora lembre-se de que o MetaTrader 5 procura em DLLs nas seguintes pastas: ltterminaldirgtMQL5Libraries ltterminaldirgt Pasta atual Diretório do sistema ltwindowsdirgtSYSTEM32 ltwindowsdirgt Diretórios listados no Variável de ambiente do sistema PATH. Portanto, coloque em um desses diretórios duas m-funções (NeoSMA. m e GRNNFilter. m), onde vamos construir DLL. Eu chamo sua atenção para este fato de colocação, pois isso não é feito por acidente. O leitor atencioso já conhece o recurso do compilador MATLAB - preserva os caminhos ao compilar (consulte 2.2 MATLAB Compiler 4). Antes de começar a compilar o projeto, você deve configurar o compilador. Para fazer isso, siga estas etapas: Na linha de comando MATLAB, digite: mbuild - setup Pressione y para confirmar a localização dos compiladores CC compatíveis instalados em seu sistema. Escolha o compilador padrão do Lcc-win32 C. Pressione y para confirmar o compilador selecionado. Figura 4. Compilando o projeto Agora estamos prontos para passar para o processo de compilação m-functions. Mcc - N - W lib: NeoSMA - T link: lib NeoSMA. m GRNNFilter. m Explique as chaves: - N para pular todos os caminhos desnecessários - W lib: NeoSMA diz ao compilador que o NeoSMA é o nome da biblioteca - T link: lib diz Compilador para criar biblioteca pública com links para nomes de funções de NeoSMA. m e GRNNFilter. m m-functions Agora, vamos ver o compilador criado: mccExcludedFiles. log log-file contendo ações de compiladores NeoSMA. c C versão da biblioteca (contém - code do wrapper) NeoSMA. ctf arquivo CTF (ver 2.2 MATLAB Compiler 4) seção NeoSMA. h arquivo de cabeçalho (contém declarações de bibliotecas, funções, constantes) NeoSMA. obj arquivo de objeto (arquivo de origem contendo máquina e pseudo-código) NeoSMA. exports exportou nomes de funções NeoSMA. Dll Dll para continuar a ligar a NeoSMA. lib Dll para usar em projetos CC NeoSMAmcccomponentdata. c Versão C no componente (usado para conformidade com o arquivo CTF, contém caminhos, etc.) NeoSMAmcccomponentdata. obj versão do objeto do componente (arquivo fonte contendo máquina e pseudo Código) Então vamos lidar com sagacidade H DLL, precisamente com sua estrutura interna. Consiste em (funções básicas apenas) de: Função principal de qualquer DLL - BOOL WINAPI DllMain (). Que (de acordo com a especificação da Microsoft) lida com eventos que ocorrem em DLL: carregamento de DLL no espaço de endereço do processo, criando um novo fluxo, excluindo o fluxo e descarregando Dll da memória. Funções de serviço de inicialização de DLL desinitialização. BOOL ltNameLibgtInitialize (void) void ltNameLibgtTerminate (void) são necessários para iniciar o ambiente de Matemática antes de usar as funções da biblioteca e no final da sua utilização. As m-funções exportadas void mlfltNameMfilegt (int ltnumberofreturnvaluesgt, mxArray ltreturnvaluesgt, mxArray ltinputvaluesgt.), Onde: ltnumberofreturnvaluesgt número de variáveis ​​retornadas (não confundem com o tamanho da matriz, etc.). MxArray ltreturnvaluesgt endereço da estrutura mxArray onde os resultados do trabalho m-function serão retornados. MxArray ltinputvaluesgt ponteiro para mxArray estrutura da m-função variável de entrada. Como você pode ver, as m-funções exportadas contêm endereços e ponteiros para a estrutura mxArray e você não pode chamar diretamente essas funções do MetaTrader 5, pois não entenderá esse tipo de dados. Nós não descreveremos a estrutura do mxArray no MetaTrader 5, porque os desenvolvedores do MATLAB não garantem que não vai mudar ao longo do tempo, mesmo dentro da mesma versão do produto, então você precisa escrever um adaptador DLL simples. Seu esquema de bloco é mostrado abaixo: Figura 5. Esquema de bloco do adaptador DLL É muito semelhante ao lado direito da DLL para o MATLAB Engine, portanto, não analisamos seu algoritmo e seguimos diretamente para o código. Para fazer isso, crie dois pequenos arquivos em seu compilador CC: nSMA. cpp (de DllMatlab. zip): nSMA. def (de DllMatlab. zip): LIBRARY nnSMA EXPORTS IsStartSMA nSMA Crie o projeto em seu compilador CC: para isso, você precisa Para incluir biblioteca de entrada de entrada padrão e adicionar para projetar os seguintes arquivos (no seu compilador: Project-gtAdd Project): nSMA. def Na pasta ltMATLABgtExternlibltwin3264gtltcompilergt, onde: ltMATLABgt pasta principal do MATLAB. Ltwin3264gt seja uma pasta win32 para sistema operacional de 32 bits, ou win64 para sistema operacional de 64 bits. Ltcompilergt a pasta borland para Borland CC ver. 5-6, a pasta Microsoft para o Microsoft Visual C (eu tenho arquivos para a versão 6): libmx. lib mclmcr. lib NeoSMA. lib criam manualmente (consulte 3.1 Desenvolvimento da Biblioteca Universal do MetaTrader 5 amp MATLAB Engine Interaction). O último, o que eu quero lhe dizer nesta seção, é sobre arquivos necessários ao mover projeto para outro computador, onde não há MATLAB instalado. Aqui está uma lista de arquivos e caminhos na máquina de destino: MCRInstaller. exe qualquer pasta (instalador MCR) extractCTF. exe qualquer pasta (para o instalador MCR) MCRRegCOMComponent. exe qualquer pasta (para o instalador do MCR) unzip. exe qualquer pasta (para MCR Instalador) NeoSMA. dll ltterminaldirgtMQL5Libraries NeoSMA. ctf ltterminaldirgtMQL5Libraries nnSMA. dll ltterminaldirgtMQL5Libraries Muitos programadores avançados já adivinharam que é aconselhável usar um programa de instalação (SETUP). Existem muitos deles através da Internet, incluindo produtos gratuitos. Agora, temos que testar esta DLL no MetaTrader 5. Para fazer isso, escreveremos um script simples (TestDllMatlab. mq5 do DllMatlab. zip): Conclusão Então, você sabe como criar uma biblioteca universal para a interação MATLAB MetaTrader 5 amp e Como conectar a DLL construída no ambiente MATLAB. Mas ainda há interfaces de MetaTrader 5 amp MATLAB interação para ser descrita, mas isso está além do escopo deste artigo. O tópico deste artigo é abordado em detalhes. Eu escolhi as formas mais eficazes de interação, não exigindo um tipo especial de adaptadores. Embora você possa ir de outra forma, como a tecnologia - Como exportar cotações do MetaTrader 5 para aplicativos usando os serviços do WCF. Muitos leitores podem ter uma pergunta: qual método escolher. A resposta é simples - ambos, porque durante a concepção do modelo matemático não é necessária a velocidade. Mas você precisará do poder total do MATLAB sem custos especiais de produção para programação. MATLAB Engine will help here, of course. However, when the mathematical model is debugged and ready to use, youll need speed, multitasking (work of indicator andor trade system at several price charts) - here without a doubt youll need a DLL, built in MATLAB environment. But all this does not oblige you to follow it. Everybody will give the answer to this question himself, relying primarily on the proportion of programming cost to the scale of the project (number of indicator andor trade system users). It makes no sense to create Dll in the MATLAB environment for one or two users (its easier to install MATLAB on two computers). Many readers, who are unfamiliar with MATLAB, probably have a question: why all of this MQL5 has already mathematical functions The answer is that use of MATLAB enables you to effortlessly implement your mathematical ideas, here is just a partial list of possibilities: dynamic algorithm of fuzzy logic in the indicator andor mechanical trade system dynamic genetic algorithm in mechanical trade system (dynamic strategy tester) dynamic neural network algorithm in the indicator andor mechanical trade system three dimensional indicators simulation of nonlinear management systems So, all in your hands, and do not forget: Mathematics has always been the queen of sciences, and MATLAB package is your scientific calculator. Literature Translated from Russian by MetaQuotes Software Corp. Original article: mql5ruarticles44

Comments

Popular Posts