Wednesday 5 February 2020

Automated trading system matlab


MetaTrader 5 - Sistemas de Negociação Simulink: um Guia para os Desenvolvedores de Expert Advisers Introdução Existem vários artigos que descrevem as vastas possibilidades do Matlab. Para ser mais preciso, a maneira que este software é capaz de expandir as ferramentas de programadores, que ele usa para desenvolver um Expert Advisor. Neste artigo, vou tentar ilustrar o trabalho de um pacote matlab tão poderoso como o Simulink. Gostaria de oferecer uma maneira alternativa para desenvolver o sistema de negociação automatizada para os comerciantes. Fiquei inspirado a recorrer a este tipo de método devido à complexidade do problema que o comerciante enfrenta - a criação, verificação e teste do sistema de comércio automatizado. Eu não sou um programador profissional. E assim, o princípio de ir do simples para o complexo é de primordial importância para mim no desenvolvimento do sistema de negociação automatizado. O que exatamente é simples para mim Primeiro de tudo, esta é a visualização do processo de criação do sistema ea lógica do seu funcionamento. Além disso, é um mínimo de código manuscrito. Estas expectativas são silenciosas consistentes com as capacidades do pacote Simulink, um bem conhecido produto MATLAB, que é um líder mundial entre os instrumentos de visualização de cálculos matemáticos. Neste artigo, vou tentar criar e testar o sistema de negociação automatizado, com base em um pacote Matlab e, em seguida, escrever um Expert Advisor para MetaTrader 5. Além disso, todos os dados históricos para backtesting será usado a partir MetaTrader 5. Para evitar Confusão terminológica, chamarei o sistema de negociação, que funciona em Simulinik, com uma palavra MTS espaçoso, e aquele que funciona em MQL5, simplesmente um Expert Advisor. 1. Os fundamentos de Simulink e Fluxo de Estado Antes de prosseguir com ações específicas, é necessário introduzir alguma forma de um mínimo teórico. Com a ajuda do pacote Simulink, que é parte do MATLAB, o usuário pode modelar, simular e analisar sistemas dinâmicos. Além disso, é possível levantar a questão sobre a natureza do sistema, simulá-lo, e depois observar o que ocorre. Com o Simulink, o usuário pode criar um modelo a partir do zero ou modificar um modelo já existente. O pacote suporta o desenvolvimento de sistemas lineares e não-lineares, que são criados com base em comportamento discreto, contínuo e híbrido. As principais propriedades do pacote são apresentadas no site dos desenvolvedores: Bibliotecas extensivas e expansíveis de blocos predefinidos Editor gráfico interativo para montar e gerenciar diagramas de blocos intuitivos Capacidade de gerenciar projetos complexos segmentando modelos em hierarquias de componentes de projeto Explorer Modelo para navegar, Configurar e pesquisar todos os sinais, parâmetros, propriedades e código gerado associado ao seu modelo APIs que permitem a conexão com outros programas de simulação e incorporação de código escrito à mão Embedded MATLAB Blocos funcionais para trazer algoritmos MATLAB para o Simulink e incorporados (Normal, Acelerador e Acelerador Rápido) para executar simulações de forma interpretativa ou em velocidades de código C compiladas usando solucionadores de passo fixo ou variável Depurador gráfico e analisador de perfil para examinar os resultados da simulação e depois diagnosticar desempenho e comportamento inesperado em seu projeto Acesso total a MATLAB para analisar e visualizar resultados, personalizar o ambiente de modelagem e definir dados de sinal, parâmetro e teste Ferramentas de análise e diagnóstico de modelos para garantir a consistência do modelo e identificar erros de modelagem. Então vamos começar a revisão imediata do ambiente Simulink. Ele é inicializado de uma janela Matlab já aberta em duas das seguintes maneiras: usando o comando Simulink na janela de comando usando o ícone Simulink na barra de ferramentas. Figura 1. Inicialização do Simulink Quando o comando é executado, a janela de navegação das bibliotecas (Simulink Library Browser) é exibida. Figura 2. Navegador de Biblioteca A janela do navegador contém uma árvore de componentes de bibliotecas do Simulink. Para exibir uma seção específica da biblioteca, basta selecioná-la com o mouse, após a qual um conjunto de componentes de ícones, da seção ativa da biblioteca, aparecerá na seção direita da janela Navegador da Biblioteca Simulink. FIG. 2 mostra a seção principal da biblioteca Simulink. Usando o menu do navegador ou os botões de sua barra de ferramentas, você pode abrir uma janela para criar um novo modelo ou para fazer o upload de um existente. Devo notar que todos os trabalhos com o Simulink ocorrem junto com um sistema MATLAB aberto, no qual é possível monitorar a execução de operações, desde que sua saída seja fornecida pelo programa de modelagem. Figura 3. Janela em branco do Simpulink Primeiro de tudo, vamos mudar alguns parâmetros de nosso modelo. Permite abrir a Simulação --gt Parâmetros de Configuração. Esta janela tem um número de guias com muitos dos parâmetros. Estamos interessados ​​na guia Solver padrão, onde você pode definir os parâmetros do solver do sistema de modelagem Simulink. No tempo de simulação o tempo de modelagem é definido pela hora de início - Hora de início (geralmente 0) e tempo de término - Hora de parada. Para a nossa tarefa, vamos atribuir a hora de início um valor de 1. Vamos deixar o tempo de parada como está. Nas opções de resolução, eu também mudei o Tipo para Fixo-passo, o próprio solucionador para para discreto eo passo (tamanho de passo fixo) para 1. Figura 4. Janela Parâmetros de Configuração O ambiente Simulink é concluído com êxito pelo subsistema Stateflow , Que é um pacote de modelagem baseado em eventos, baseado na teoria de automatas de estados finitos. Permite-nos representar o trabalho do sistema, baseado em uma cadeia de regras, que especificam os eventos e ações como resposta a esses eventos. A interface gráfica do usuário do pacote Stateflow tem os seguintes componentes: Um editor gráfico de SF-charts Stateflow Findflow Stateflow Finder para procurar os objetos necessários no SF-charts Um depurador de SF-models Real Time Workshop, um gerador de código em tempo real . O diagrama de bloco mais comumente usado (Gráfico), que está localizado na seção Stateflow. Vamos examiná-lo. Vamos mover o bloco da biblioteca e clique duas vezes nele para abrir o diagrama. Será exibida uma janela em branco de um editor de gráficos SF. Ele pode ser usado para criar SF-charts e sua depuração, a fim de obter as funções necessárias. A barra de ferramentas está localizada na posição vertical do lado esquerdo. Há 9 botões: Junção de Histórico de Estado Transição Padrão Junção Conectiva Tabela de Verdade Função Caixa de Função Embedded MATLAB Função Simulink Chamada. Infelizmente, é impossível considerar cada elemento em detalhes no contexto deste artigo. Portanto, limitar-me-ei a uma breve descrição desses elementos, que precisaremos para nosso modelo. Informações mais detalhadas podem ser encontradas na seção de Ajuda Matlab, ou no site do desenvolvedor. Figura 5. A vista do SF-chart no editor O objeto-chave dos SF-charts é o Estado. É apresentado por um retângulo com cantos arredondados. Pode ser exclusivo ou paralelo. Cada estado pode ser o pai e tem herdeiros. Os estados podem ser ativos ou não-ativos, os estados podem executar certos procedimentos. A transição é representada como uma linha curvada, seta, conecta os estados e outros objetos. Uma transição pode ser feita clicando com o botão esquerdo do mouse sobre o objeto de origem e direcionando o cursor para o objeto de destino. A transição pode ter suas próprias condições, que são registradas entre parênteses. O procedimento de transição é indicado dentro dos parênteses, ele será executado se a condição for satisfeita. O procedimento, executado durante a confirmação do objeto alvo, é denotado por uma barra. O nó alternativo (junção conectiva) tem a forma de um círculo, e permite a transição para o caminho através dos caminhos diferentes, cada um dos quais é definido por uma condição específica. Nesse caso, a transição, que corresponde à condição especificada, é selecionada. A função representada como um gráfico de fluxo com as declarações da linguagem processual Stateflow. Um gráfico de fluxo reflete a estrutura lógica de uso de transições e nós alternativos. Um evento é outro objeto importante de Stateflow, pertencente ao grupo de objetos não-gráficos. Este objeto pode iniciar os procedimentos do SF-chart. O procedimento (ação) também é objeto não gráfico. Ele pode chamar a função, atribuir um evento específico, transição, etc. Os dados no modelo SF são representados por valores numéricos. Os dados não são representados como objetos gráficos. Eles podem ser criados em qualquer nível da hierarquia de modelos e ter propriedades. 2. Descrição da estratégia de negociação Agora, brevemente sobre a negociação. Para os nossos propósitos de formação, o Expert Advisor será muito simples, se não dizer, primitivo. O sistema automatizado de negociação abrirá posições com base no sinal, basicamente, após o cruzamento dos Movimentos Exponenciais, com um período de 21 e 55 (números Fibonacci), calculado a preços médios. Assim, se o EMA 21 atravessa o EMA 55 a partir do fundo, uma posição longa é aberta, caso contrário - um curto. Para a filtragem de ruído, a posição será aberta na barra K-th pelo preço da abertura da barra após a aparência da cruz 2155. Negociaremos no EUR / USD H1. Apenas uma posição será aberta. Ele será fechado somente ao atingir o nível Take Profit ou Stop Loss. Gostaria de mencionar que, durante o desenvolvimento do sistema de negociação automatizada e do backtesting histórico, algumas simplificações do quadro geral do comércio são admitidos. Por exemplo, o sistema não verificará a execução do corretor de um sinal. Além disso, vamos adicionar as restrições de negociação para o núcleo do sistema em MQL5. 3. A modelagem de uma estratégia de negociação no Simulink Para começar, precisamos fazer o upload dos dados históricos de preços para o ambiente Matlab. Vamos fazê-lo usando um script MetaTrader 5, que irá salvá-los (testClose. mq5). No Matlab, esses dados (Open, High, Low, Close, Spread) também serão carregados usando um m-script simples (priceTxt. m). Usando o movavg (função Matlab padrão) vamos criar matrizes de médias móveis exponenciais: ema21, ema55 movavg (close, 21, 55, e) Bem como um array auxiliar dos índices barra: K3 sl0.0065 tp0.0295 Vamos começar O processo de modelagem. Crie uma janela em branco do Simulink e chame-a mts ao salvá-la. Todas as ações a seguir foram duplicadas em um formato de vídeo. Se algo não é muito claro, ou mesmo não está claro em tudo, você pode olhar minhas ações, vendo o vídeo. Ao salvar o modelo, o sistema pode imprimir o seguinte erro: Arquivo C: Simulinkmts. mdl contém caracteres incompatíveis com a codificação de caracteres atual, o windows-1251. Para evitar esse erro, siga um destes procedimentos: 1) Use a função slCharacterEncoding para alterar a codificação de caracteres atual para: ShiftJIS, windows-1252, ISO-8859-1. 2) Remova os caracteres não suportados. Para eliminar isso, basta fechar todas as janelas de modelos e alterar a codificação usando os seguintes comandos: bdclose all setparam (0, CharacterEncoding, windows-1252) Permite especificar a fonte de informações do nosso modelo. O papel dessa fonte de informação será os dados históricos do MetaTrader 5, que contêm os preços de abertura, máximo, mínimo e de fechamento. Além disso, vamos levar em conta o Spread, mesmo que ele se tornou flutuante relativamente recentemente. Finalmente, gravamos o tempo de abertura da barra. Para fins de modelagem, algumas matrizes de dados iniciais serão interpretadas como um sinal, isto é, como um vetor de valores de uma função de tempo em pontos discretos no tempo. Permite criar um subsistema FromWorkspace para recuperar os dados do espaço de trabalho Matlab. Selecione a seção Ports amp Subsystems no navegador de bibliotecas Simulink. Arraste o bloco Subsystem para a janela do modelo Simulink, usando o mouse. Renomeie-o para FromWorkspace, clicando no Subsistema. Em seguida, faça login clicando duas vezes no botão esquerdo do mouse no bloco, para criar as variáveis ​​de entrada e saída e as constantes do sistema. Para criar as fontes de sinal no Library Browser, escolha o Blockset de Processamento de Sinal e as fontes (Signal Processing Sources). Usando o mouse, arraste o sinal do bloco de espaço de trabalho para a janela do subsistema do modelo FromWorkspace. Uma vez que o modelo terá 4 sinais de entrada, simplesmente duplicar o bloco, e criar mais 3 cópias dele. Permite especificar imediatamente quais variáveis ​​serão processadas por bloco. Para fazer isso, clique duas vezes no bloco e insira o nome da variável nas propriedades. Essas variáveis ​​serão: open, ema21, ema55, num. Nós nomearemos os blocos o seguinte: sinal aberto, sinal ema21, sinal ema55, sinal num. Agora, a partir da seção Commonly used blocks Simulink, adicionaremos um bloco para criar um canal (Bus Creator). Abra o bloco e altere o número de entradas para 4. Conecte o sinal aberto, sinal ema21, sinal ema55, blocos de sinal num com as entradas do bloco Bus Creator. Além disso, teremos mais 5 constantes de entrada. O bloco Constante é adicionado da seção Blocos comumente usados. Como valor (valor constante), especificamos os nomes das variáveis: spread, high, low, tp, sl: spread - este é um array de valores de spread alto - este é um array de valores de preço máximo baixo - este é um Matriz de valores de preço mínimo tp - Take Lucro valor em termos absolutos sl - o Stop Loss valor em termos absolutos. Nós chamaremos os blocos como segue: disposição dispersa, disposição elevada, disposição baixa, lucro da tomada, perda da parada. Selecione o bloco de porta de saída (Out1) na seção Simulações de subsistemas de amplificação de portas e mova-o para a janela do subsistema. Faça 5 cópias da porta de saída. O primeiro, bem conectado com o bloco Bus Creator, e outros - alternadamente, com os arrays espalhados, alto, baixo, Take Profit, e Stop Loss blocos. Bem renomear a primeira porta para o preço, e os outros - pelo nome da variável de saída. Para criar um sinal de negociação, vamos inserir o bloco de adição (Add) da seção Simulink Operações Matemáticas. Bem, chamá-lo de diferencial emas. Dentro do bloco vamos mudar a lista de sinais, c para -. Usando a combinação de teclas Ctrl K, gire o bloco em 90 no sentido horário. Conecte o bloco de sinal ema21 à entrada, eo sinal ema55 com o -. Em seguida, insira o bloco Delay, da seção Blockset de Processamento de Sinal, de Operações de Sinal. Bem, diga-o K Delay. No campo Delay (amostras) deste bloco, digite o nome da variável K. Ligue-o ao bloco anterior. Os blocos diferenciais emas e K Delay formatam a frente (diferença de nível) do sinal de controle para cálculos somente para o estágio de modelagem, onde houve mudança. O subsistema, que bem criará um pouco mais tarde, será ativado se pelo menos um elemento tiver uma alteração no seu nível de sinal. Então, a partir da seção Simulink comummente usado blocos, vamos adicionar um multiplexador com e (Mux) bloco. Da mesma forma, gire o bloco por 90 no sentido horário. Vamos dividir a linha de sinal do bloco de atraso em dois, e conectá-lo com os multiplexes. Na seção Stateflow, insira um bloco Chart. Insira o gráfico. Adicionar 2 eventos de entrada (Comprar e Vender) e 2 eventos de saída (OpenBuy e OpenSell). O valor de trigger (Trigger) para o evento Buy, vamos definir para Falling (ativação do subsistema por uma frente negativa), e para os eventos Sell, vamos definir para Rising (ativação do subsistema por uma frente positiva). O valor de trigger (Trigger) para os eventos OpenBuy e OpenSell, vamos definir para a posição de chamada de função (Calling), (a ativação do subsistema será determinada pela lógica do trabalho da função S dada). Bem, crie uma transição por padrão com 3 nós alternativos. O primeiro nó será conectado por uma transição para o segundo nó, definindo as condições eo procedimento para eles para comprar, e para o terceiro, definindo o procedimento para vender. Conecte a entrada de gráfico com o multiplex e as duas saídas - com outro multiplex, que pode ser copiado do primeiro. O último bloco será conectado à porta de saída, que será copiada de um análogo, e chamá-lo de BuySell. E eu quase esqueci Para que o modelo funcione corretamente, precisamos criar um objeto de canal virtual, que será localizado no espaço de trabalho do Matlab. Para fazê-lo, entramos no Editor de Bus pelo menu Ferramentas. No editor, selecione o item Adicionar barramento. Chame-o InputBus. Insira os elementos de acordo com os nomes das variáveis ​​de entrada: open, ema21, ema55 e num. Abra o criador de barramento e marque a caixa de seleção ao lado de Especificar propriedades através do objeto de barramento (defina as propriedades através do objeto de barramento). Em outras palavras, conectamos nosso bloco com o objeto de canal virtual que criamos. O canal virtual significa que os sinais são combinados apenas graficamente, sem afetar a distribuição da memória. Salve as alterações na janela do subsistema. Isso conclui nosso trabalho com o subsistema FromWorkspace. Agora vem a hora de criar a Caixa Preta. Será um bloco, com base nos sinais de entrada, ele vai processar as informações e tomar decisões comerciais. Claro, ele precisa ser criado por nós, ao invés de um programa de computador. Afinal, só podemos decidir sobre as condições, sob as quais o sistema deve fazer um comércio. Além disso, o bloco terá que exibir as informações sobre os negócios concluídos na forma de sinais. O bloco necessário é chamado de gráfico e localizado na seção Stateflow. Nós já estamos familiarizados com ele, não temos Usando o arrasto e solto nós movê-lo para a nossa janela de modelo. Figura 6. Os blocos do subsistema de entrada e do gráfico StateFlow Abra o gráfico e introduza nossos dados nele. Primeiro, vamos criar um objeto de canal, como fizemos no subsistema FromWorkspace. Mas ao contrário do anterior, que nos forneceu os sinais do espaço de trabalho, este retornará o resultado obtido. E assim, vamos chamar o objeto OutputBus. Seus elementos se tornarão: barOpen, OpenPrice, TakeProfit, StopLoss, ClosePrice, barClose, Comment, PositionDir, posN, AccountBalance. Agora vamos começar a construir. Na janela do gráfico, vamos mostrar a transição padrão (1). Para as condições e procedimentos indicaremos: Esta condição significa que os dados serão processados ​​se o número de barras de entrada for pelo menos 56, bem como se a barra de entrada será maior que a barra de fechamento da posição anterior. Em seguida, a barra de abertura (Output. barOpen) é atribuída o número da barra de entrada, por uma variável de índice de i - o índice (começando de 0) eo número de posições abertas aumenta em 1. A segunda transição é executada Somente se a posição aberta não for a primeira. Caso contrário, a terceira transição é executada, que atribuirá a variável de saldo da conta (Output. AccountBalance) o valor 100000. A 4ª transição será executada se o gráfico for iniciado pelo evento OpenBuy. Nesse caso, a posição estará direcionando para a compra (Output. PositionDir 1), o preço de abertura será igual ao preço da barra de abertura, levando em conta o spread (Output. OpenPrice spread. open spread i 1e-5). Os valores dos sinais de saída StopLoss e TakeProfit também serão especificados. Se ocorrer um evento OpenSell, o fluxo seguirá a 5ª transição e definirá seus valores para os sinais de saída. A 6 ª transição é realizada se a posição é longa, caso contrário, o fluxo segue para a sétima transição. A 8ª transição verifica se o preço máximo do bar atingiu o nível Take Profit ou se o preço mínimo do bar atingiu o nível de Stop Loss. Caso contrário, o valor da variável de índice i é aumentado em uma (9ª transição). A décima transição verifica as condições que surgem na Stop Loss: o preço mínimo da barra passou o nível Stop Loss. Se for confirmado, o fluxo seguirá até a 11ª transição e depois para a 12ª, onde são definidos os valores das diferenças de preço das posições de fechamento e abertura, o saldo da conta corrente e o índice da barra de fechamento. Se a 10ª transição não for confirmada, a posição será fechada no Take Profit (13ª transição). E então, a partir do dia 14, o fluxo seguirá para a 12ª transição. Os procedimentos e condições para as transições para uma posição curta são o oposto. Finalmente, weve criou novas variáveis ​​no gráfico. Para integrá-los automaticamente em nosso modelo, precisamos executar o modelo diretamente na janela do gráfico, clicando no botão Iniciar Simulação. Parece semelhante ao botão Reproduzir em tocadores de música. Neste ponto, o Stateflow Symbol Wizard (SF master objects) será iniciado, e ele irá sugerir para salvar os objetos criados. Pressione o botão Selecionar tudo e, em seguida, clique no botão Criar. Os objetos foram criados. Vamos agora abrir o navegador de modelos. À esquerda, clique em nosso Gráfico na Hierarquia de Modelos. Permite classificar os objetos pelo tipo de dados (DataType). Adicione mais dados usando os comandos de menu Adicionar e Dados. Bem, chame a primeira variável Input. Altere o valor dos Escopos para Entrada e o Tipo - para Bus: nome do objeto ltbus. Em seguida, digite o nome do canal criado anteriormente, InputBus, diretamente neste campo. Assim, nossa variável de entrada terá o tipo de InputBus. Permite definir o valor da porta para um. Complete a mesma operação com a variável Output. Somente ele deve ter o Escopo de Saída e o Tipo de Bus de Saída. Permite alterar o escopo das variáveis ​​high, low, sl, tp e spread para o valor de Input. Respectivamente, vamos definir os números de porta na seguinte ordem: 3, 4, 6, 5, 2. Também permite alterar o escopo da variável Lotes para Constante. Na guia Valores de Atributos, é possível inserir os eventos de entrada 1, OpenBuy e OpenSell - para Entrada no campo Inicial (à direita). Nos eventos, altere o valor de disparo para a chamada de função). Criar uma variável interna len, com um escopo constante. Na guia Value Attributes, no campo Valor inicial, digite bem um comprimento da função m (close). Assim, será igual ao comprimento do array de fechamento, que está localizado no espaço de trabalho do Matlab. Para as variáveis ​​alta e baixa, inserir um valor de len 1 no campo Tamanho. Assim, na memória, reservamos os tamanhos de matriz de alto e baixo como o valor de len 1. Além disso, vamos indicar para a variável K na aba Value Attributes, no campo Valor inicial (à direita) a variável real De K, retirado do espaço de trabalho. Como resultado, temos um subsistema Chart, com 7 portas de entrada e uma porta de saída. Permite posicionar o bloco de tal forma, de modo que a entrada de eventos de entrada () esteja na parte inferior. Bem, renomeie o bloco de controle de posição. No próprio gráfico, também exibir o nome do bloco. Combine os blocos do subsistema FromWorkspace eo Posicionamento através das portas apropriadas. E mudar a cor dos blocos. Note-se que o subsistema Manuseio de posição só funcionará se for acordado por eventos OpenBuy ou OpenSell. Dessa forma, otimizamos o funcionamento do subsistema para evitar cálculos desnecessários. Figura 7. FromWorkspace e Position handling Subsystems Agora temos que criar um subsistema para imprimir os resultados de processamento no espaço de trabalho Matlab e combiná-lo com o subsistema de manipulação de posição. Será a tarefa mais fácil. Permite criar um subsistema ToWorkspace para obter os resultados na área de trabalho. Repita os passos que tomamos quando criamos o subsistema FromWorkspace. No navegador da biblioteca, selecione a seção Simulink Ports amp Subsystems. Usando o mouse, arraste o bloco do Subsistema para a janela do modelo do Simulink. Renomeie-o para ToWorkspace clicando no Subsistema. Combine o bloco com o subsistema Manuseamento de posição. Para criar as variáveis ​​faça login clicando duas vezes no bloco com o botão esquerdo do mouse. Como o subsistema receberá dados do objeto OutputBus, que é um barramento não-virtual, então precisamos selecionar os sinais desse canal . Para fazê-lo, selecionamos a seção Simulink Commonly used blocks no Browser da biblioteca e adicionamos um Bus Selector. O bloco terá 1 entrada e 2 sinal de saída, enquanto que precisamos ter 10 desses sinais. Vamos conectar o bloco à porta de entrada. Pressione o botão Iniciar simulação (este é o nosso botão Reproduzir). O compilador começará a construir o modelo. Ele não será construído com sucesso, mas criará sinais de entrada para o bloco de seleção de barramento. Se entrarmos no bloco, veremos os sinais necessários aparecerem no lado esquerdo da janela, que são transmitidos via OutputBus. Todos eles precisam ser selecionados, usando o botão Selecionar, e movê-los para o lado direito - Sinais selecionados. Figura 8. Parâmetros do bloco do seletor de barramento Vamos nos referir novamente à seção de blocos comumente usados ​​do navegador de bibliotecas Simulink e adicionar o bloco de multiplexagem Mux. Indica o número de entradas, que é igual a 10. Em seguida, faça logon na seção Sinks do navegador da biblioteca Simulink e mova o bloco ToWorkspace para a janela do subsistema. Nela, vamos indicar o novo nome da variável AccountBalance e alterar o formato de saída (Save format) da estrutura para a matriz. Combine o bloco com o multiplex. Exclua a porta de saída, já que ela não será mais necessária. Personalize a cor dos blocos. Salve a janela. O subsistema está pronto. Antes de construir o modelo, devemos verificar a presença das variáveis ​​no espaço de trabalho. As seguintes variáveis ​​devem estar presentes: InputBus, K, OutputBus, close, ema21, ema55, alto, baixo, num, aberto, sl, spread, tp. Permite definir o valor Stop Time como parâmetro para definir num (end). Significando que o vetor processado terá o comprimento, que foi definido pelo último elemento da matriz num. Antes de começar a construir um modelo, precisamos escolher um compilador, usando o seguinte comando: Por favor, escolha o seu compilador para a construção de arquivos de interface externa (MEX): Você gostaria mex para localizar compiladores instalados yny Selecione um compilador: 1 Lcc-win32 C 2.4 .1 em C: PROGRA 2MATLABR2018asyslcc 2 Microsoft Visual C 2008 SP1 em C: Arquivos de programas (x 86) Microsoft Visual Studio 9.0 0 Nenhum Como você pode ver, eu selecionei o Microsoft Visual C 2008 compilador SP1. Vamos começar a construir. Pressione o botão Iniciar simulação. Ocorreu um erro: Stateflow Interface Error: Diferença de largura da porta. O spread de entrada (139) espera um escalar. O sinal é o vetor unidimensional com 59739 elementos. A propagação da variável não deve ter o tipo duplo, mas sim herdar seu tipo do sinal de Simulink. No Navegador de Modelos, para esta variável, especificamos Inherit: Same como Simulink e no campo Tamanho e especifique -1. Salve as alterações. Vamos executar o modelo novamente. Agora o compilador funciona. Ele irá mostrar algumas advertências menores. E em menos de 40 segundos o modelo processará os dados de quase 60.000 barras. O comércio é realizado a partir de 2001 .01.01 00:00 até 2018 .08.16 11:00. A quantidade total de posições abertas é 461. Você pode observar como o modelo funciona no clipe a seguir. 4. Implementação da Estratégia no MQL5 E assim, nosso sistema de negociação automatizado é compilado no Simulink. Agora precisamos transferir essa idéia de negociação para o ambiente MQL5. Tínhamos que lidar com blocos e objetos Simulink, através dos quais expressávamos a lógica de nosso Consultor Especialista em negociação. A tarefa atual é transferir o sistema de negociação de lógica para o MQL5 Expert Advisor. No entanto, deve-se notar que alguns blocos não necessariamente têm de ser de alguma forma definidos no código MQL5, porque suas funções podem ser ocultadas. Vou tentar comentar com uma quantidade máxima de detalhes sobre qual linha se refere a qual bloco, no código real. Às vezes, essa relação pode ser indireta. E às vezes pode refletir uma conexão de interface de blocos ou objetos. Antes de começar esta seção, deixe-me chamar sua atenção para um artigo passo a passo Guia para escrever Conselheiros Especialistas em MQL5 para Iniciantes. Este artigo fornece uma descrição facilmente compreensível das principais idéias e regras básicas de escrever um Expert Advisor em MQL5. Mas não vou me debruçar sobre eles agora. Vou usar algumas linhas de código MQL5 a partir daí. 4.1 Subsistema FromWorkspace Por exemplo, temos um bloco de sinal aberto no subsistema FromWorkspace. Em Simulink, é necessário para obter o preço da barra de abertura durante backtesting, e para abrir uma posição a esse preço, no caso de um sinal de negociação é recebido. Este bloco obviamente não está presente no código MQL5, porque o Expert Advisor solicita as informações de preço imediatamente após receber o sinal de negociação. No Expert Advisor precisamos processar dados, recebidos de médias móveis. Portanto, vamos criar para eles matrizes dinâmicas e correspondentes variáveis ​​auxiliares, como alças. Todas as outras linhas, que um pouco afetam o emo21 e ema55 em movimento, podem ser consideradas como auxiliares. Take Profit e Stop Loss são definidos como variáveis ​​de entrada: Tendo em conta que existem 5 dígitos significativos para EURUSD, o valor de TakeProfit e StopLoss terá de actualizar da seguinte forma: As matrizes spread, high e low são utilizadas para servir a , Uma vez que são responsáveis ​​pelo fornecimento de dados históricos, sob a forma de uma matriz dos dados de preços relevantes, a fim de identificar as condições de negociação. Eles não são explicitamente representados no código. No entanto, pode-se argumentar que a matriz de propagação, por exemplo, é necessária para formar um fluxo de preços perguntar. E os outros dois são necessários para determinar as condições para fechar uma posição, que não são especificados no código, uma vez que são executados automaticamente no MetaTrader 5, ao atingir um determinado nível de preço. O bloco de sinal num é auxiliar e não é exibido no código do Expert Advisor. O bloco diferencial emas verifica as condições para a abertura de posições curtas ou longas encontrando as diferenças. O K Delay cria um atraso para os arrays, que são a média para o valor de K. O evento Buy ou Sell é criado, é um evento de entrada para o subsistema de abertura de posição. No código, tudo é expresso da seguinte maneira: O subsistema de abertura de posição cria os eventos OpenBuy e OpenSell propriamente ditos, que são processados ​​no subsistema Manuseio de posição, usando as condições e os procedimentos. 4.2 Manipulação de posição Subsistema O subsistema começa a funcionar processando os eventos do OpenBuy OpenSell. Para a primeira transição do subsistema uma das condições é a presença de não menos de 56 barras, o que é indicado no código através da verificação de tais condições: A segunda condição para a transição: o número da barra de abertura deve ser Maior que a barra de fechamento (Input. num Output. barClose), ou seja, a posição foi fechada. No código é indicado da seguinte forma: A 4ª transição é responsável pela abertura de uma posição longa. Sua representada da seguinte forma: A 5 ª transição é responsável pela abertura de uma posição curta. Sua representação é a seguinte: Outras transições nas subcategorias não são claramente apresentadas no Expert Advisor, uma vez que os procedimentos apropriados (ativação de paradas ou realização de um nível Take Profit) são realizados automaticamente no MQL5. The ToWorkspace subsystem is not represented in the MQL5 code because its task is to present the output into the Matlab Workspaces. Conclusions Using a simple trading idea as an example, I have created the automated trading system in Simulink, in which I carried out a backtesting on historical data. At first I was bothered by the question: Is there a point in getting involved with all of this fuss when you can quickly implement a trading system through the MQL5 code Of course, you can do it without the visualization of the process of creating the system and the logic of its work. But most often than not, this is only for experienced programmers or simply talented people. When the trading system extends with new conditions and functions, the presence of the block diagram and its work will clearly the traders task. I would also like to mention that I did not try to oppose the Simulink language capabilities against the MQL5 language. I merely illustrated how you can create an automated trading system using a block design. Maybe, in the future, the MQL5 developers will create a visual constructor of strategies, which will facilitate the process of writing Expert Advisors. Automated Trading System Development with MATLAB Stuart Kozola, MathWorks Want to learn how to create an automated trading system that can handle multiple trading accounts, multiple asset classes, and trade across multiple trading venues Simultaneously In this webinar we will present an example workflow for researching, implementing, testing and deploying an automated trading strategy providing maximum flexibility in what and who you trade with. Você aprenderá como os produtos MATLAB podem ser usados ​​para coleta de dados, análise e visualização de dados, desenvolvimento de modelos e calibração, backtesting, testes de caminhada, integração com sistemas existentes e, em última instância, implantação para negociação em tempo real. Analisamos cada uma das partes deste processo e vemos como o MATLAB fornece uma única plataforma que permite a solução eficiente de todas as partes deste problema. Modelos e prototipagem de modelos no MATLAB Backtesting e calibração de um modelo Walk forward testing e validação de modelos Interagindo com bibliotecas existentes e software para execução comercial Implementação do aplicativo final Em vários ambientes, incluindo JAVA e Excel Tools para negociação de alta freqüência, incluindo computação paralela, GPUs e geração de código C a partir do MATLAB Foco no Produto Selecione seu PaísAutomado Desenvolvimento do Sistema de Negociação com MATLAB Stuart Kozola, MathWorks Quer aprender a criar Um sistema de negociação automatizado que pode lidar com várias contas de negociação, várias classes de ativos e comércio em vários locais de negociação Simultaneamente Neste webinar vamos apresentar um fluxo de trabalho de exemplo para pesquisar, implementar, testar e implantar uma estratégia de negociação automatizada proporcionando flexibilidade máxima no que e quem Com quem você troca. Você aprenderá como os produtos MATLAB podem ser usados ​​para coleta de dados, análise e visualização de dados, desenvolvimento de modelos e calibração, backtesting, testes de caminhada, integração com sistemas existentes e, em última instância, implantação para negociação em tempo real. Analisamos cada uma das partes deste processo e vemos como o MATLAB fornece uma única plataforma que permite a solução eficiente de todas as partes deste problema. Modelos e prototipagem de modelos no MATLAB Backtesting e calibração de um modelo Walk forward testing e validação de modelos Interagindo com bibliotecas existentes e software para execução comercial Implementação do aplicativo final Em vários ambientes, incluindo JAVA e Excel Tools para negociação de alta freqüência, incluindo computação paralela, GPUs e geração de código C a partir do MATLAB Foco de Produto Selecione seu país

No comments:

Post a Comment