FileWrite em descritor de arquivo retornado por FileOpen (). In A lista de parâmetros separados por vírgulas, para gravar no arquivo. O número de parâmetros escritos pode ser até 63. Número de bytes escritos ou 0 em caso de erro. Para obter informações sobre o erro, chame a função GetLastError (). Os números serão convertidos em um texto na saída (consulte a função Print ()). Os dados do tipo duplo são emitidos com a precisão de 16 dígitos após o ponto decimal, e os dados podem ser exibidos no formato tradicional ou científico - dependendo de qual formato será o mais compacto. Os dados do tipo float são mostrados com 5 dígitos após o ponto decimal. Para produzir números reais com precisão diferente ou num formato claramente especificado, utilize DoubleToString (). Os números do tipo bool são exibidos como quottruequot ou quotfalsequot strings. Os números do tipo de data e hora são exibidos como quotYYYY. MM. DD HH: MI: SSquot. // ------------------------------------------------ ------------------ // DemoFileWrite. mq4 // Copyright 2014, MetaQuotes Software Corp. // mql5 // ------------- -------------------------------------------------- --- propriedade copyright quotCopyright 2014, MetaQuotes Software Corp. quot propriedade link quotmql5quot propriedade versão quot1.00quot propriedade strict // --- mostra a janela de parâmetros de entrada ao iniciar o script propriedade scriptshowinputs // --- parâmetros para receber dados de a cadeia de entrada do terminal InpSymbolName quotEURUSDquot // 1057urrency de entrada par ENUMTIMEFRAMES InpSymbolPeriod PERIODH1 // Time de entrada quadro int InpFastEMAPeriod12 // rápido EMA entrada período int InpSlowEMAPeriod26 // EMA lenta entrada período int InpSignalPeriod9 // Diferença média de entrada período ENUMAPPLIEDPRICE InpAppliedPrice PRICECLOSE // tipo de preço // --- parâmetros para gravar dados na seqüência de entrada do arquivo InpFileName quotMACD. csvquot // Seqüência de entrada do nome do arquivo InpDirectoryName quotDataquot // Nome da pasta // ------------------- ----------------------------------------------- // Script Função de início do programa // --------------------------------------------- --------------------- void OnStart () bool signbuff // sinal array (true - comprar, false-sell) datetime timebuff // array de sinais39 aparecem tempo int signsize0 // sinal tamanho da matriz dupla macdbuff // matriz de valores do indicador de data e hora datebuff // array de indicador de lançamento int macdsize0 // tamanho de matrizes de indicador // --- conjunto de indexação como o tempo ArraySetAsSeries série (signbuff, true) ArraySetAsSeries (timebuff, True) ArraySetAsSeries (macdbuff, true) ArraySetAsSeries (datebuff, true) // --- redefinir o último código de erro ResetLastError () // --- copiando o tempo das últimas 1000 barras int copiado CopyTime (NULL, 0,0,1000, Datebuff) if (copiedlt0) PrintFormat (quotFailed para copiar valores de tempo. Código de erro dquot. GetLastError ()) return // --- preparar matriz macdbuff ArrayResize (macdbuff, copiado) // --- copiar os valores da linha principal do indicador IMACD for (int i0iltcopiedi) macdbuffi IMACD (InpSymbolName, InpSymbolPeriod, InpFastEMAPeriod, InpSlowEMAPeriod, InpSignalPeriod, InpAppliedPrice, MODEMAIN, i) // --- macdsize tamanho get ArraySize (macdbuff) // --- analisar os dados e salvar os sinais de indicador para as matrizes ArrayResize (signbuff, macdsize-1) ArrayResize (timebuff, macdsize - 1) for (int i1iltmacdsizei) // --- sinal de compra if (macdbuffi-1lt0 ampamp macdbuffigt0) signbuffsignsize verdadeira timebuffsignsizedatebuffi signsize // --- sinal de venda if (macdbuffi-1gt0 ampamp macdbuffilt0) signbuffsignsize signsize timebuffsignsizedatebuffi false // --- abrir o arquivo para escrever os valores do indicador (se o arquivo estiver ausente, ele será criado automaticamente) ResetLastError () int filehandle FileOpen (InpDirectoryName quot // quot InpFileName, FILEREAD FILEWRITE FILECSV) se o arquivo (INVALIDHANDLE filehandle) PrintFormat (quots está disponível Para writingquot, InpFileName) PrintFormat (quotFile caminho: sFilesquot. TerminalInfoString (TERMINALDATAPATH)) // --- primeiro, escreva o número de sinais FileWrite (filehandle, signsize) // --- escrever o tempo e os valores de sinais para o arquivo for (int i0iltsignsizei) FileWrite (filehandle, timebuffi, signbuffi ) // --- fechar o FileClose arquivo (PrintFormat filehandle) (quotData está escrito, s arquivo é closedquot, InpFileName) else PrintFormat (quotFailed abrir o arquivo s, dquot código de erro, InpFileName, GetLastError ()) MetaTrader 4 - Exemplos de Interação Entre MetaTrader 4 e Matlab via Arquivos CSV Introdução O poder computacional dos ambientes Matlab é conhecido por ser consideravelmente superior ao de qualquer linguagem de programação incluindo MQL4. Ampla gama de funções matemáticas fornecidas pela Matlab permite executar cálculos complexos, negligenciando completamente as bases teóricas das operações realizadas. No entanto, a interação em tempo real entre um terminal de negociação e Matlab representa uma tarefa não trivial. Neste artigo, sugiro uma maneira de organizar a troca de dados entre o MetaTrader 4 eo Matlab via arquivos CSV. 1. Interfuncionamento Suponha que, na entrada de cada nova barra, o MetaTrader 4 deve enviar dados sobre as últimas 100 barras para o Matlab e ser respondido com seus resultados de processamento. Para resolver esse problema, precisamos criar um indicador no MetaTrader 4 que poderia gravar dados em um arquivo de texto e ler os resultados de processamento de outro arquivo de texto criado pelo Matlab. O MetaTrader 4 deve formar seu arquivo de dados na entrada de cada nova barra. Ele deve tentar ler os resultados em cada ponto, também. Para não ler o resultado antes do Matlab atualizá-lo, teremos apagado o arquivo contendo o resultado antes de formarmos nosso arquivo de saída. Neste caso, a tentativa de leitura terá êxito somente após o Matlab terminar sua computação e formar um novo arquivo. O Matlab deve analisar os atributos de arquivo criados no MetaTrader 4 a cada segundo e iniciar o processamento quando seu tempo de criação mudar. Após o processamento ter terminado, o arquivo excluído pelo MetaTrader 4 antes do início da gravação de dados é recriado. MetaTrader 4 exclui-lo com êxito, carrega novos dados e aguarda responder. 2. Formação de um arquivo de dados de saída Existem muitos artigos dedicados a salvar dados como arquivos, por isso não trabalharei aqui. Vou apenas deixar claro que escrevemos dados em 7 colunas: DATE, TIME, HI, LOW, CLOSE, OPEN, VOLUME. O caractere separador é. Prioridade da barra é de mais cedo para mais tarde, isto é, a linha que contém as características de barra zero deve ser gravada a última. O arquivo será fornecido com uma linha contendo nomes de colunas. O nome do arquivo consistirá no nome do símbolo e no cronograma. Não precisamos de todos esses dados, é claro, mas é sempre melhor ter um arquivo significativo do que apenas um conjunto de colunas com números desconhecidos. 3. Criação da interface gráfica do usuário (GUI) Assim, o arquivo está pronto. Vamos começar Matlab. Devemos desenvolver um aplicativo que iria ler dados de texto de arquivo, processar e gravar os resultados em outro arquivo. Teremos que criar uma GUI para especificar o nome do arquivo, visualizar gráficos e iniciar o processamento. Vamos começar agora. Para criar a GUI, vamos iniciar o GUIDE Quick Start digitando o guia no console ou pressionando no painel principal do Matlab. Na caixa de diálogo apareceu, selecione Criar nova GUI --Gt em branco GUI (padrão). Agora podemos ver a interface para a criação de uma GUI com um formulário vazio. Nesta forma, vamos colocar os seguintes objetos: Editar texto, botão, texto estático, eixos, botão. Como resultado, ele deve procurar algo assim: Agora, devemos chamar o construtor de propriedades visuais para cada objeto e definir as propriedades da seguinte maneira: Texto estático. HorizontalAlignment à esquerda, Tag textInfo, String - Info. Editar texto: HorizontalAlignment à esquerda, Tag editPath, String Path select. Botão: Tag pushBrowse, String Procurar. Eixos: Caixa em, FontName MS Sans Serif, FontSize 8, Tag - axesChart. Botão: Tag pushSrart, String Start. Ao alterar a propriedade Tag, selecionamos um nome exclusivo para cada objeto. Alterando os outros, modificamos a aparência. Quando tudo estiver pronto, vamos lançar a interface pressionando Executar, confirmar o arquivo de interface salvar e salvar o arquivo M, dar um nome (por exemplo, FromTo) e pressionar Salvar. Depois disso, a GUI será lançada e aparecerá como ela aparece durante seu trabalho. Matlab gera o M-arquivo para ser a base do nosso programa futuro e abre-lo no editor incorporado. Se a aparência não se encaixa por algum motivo, feche a GUI de trabalho e arranjo de objeto correto usando o editor. Meu distributivo, por exemplo, não mostrar MS Sans Serif corretamente. Então eu tive que mudá-lo para Sans Serif. 4. Construção da interface do usuário O comportamento da interface pode ser programado no M-file Editor usando a linguagem Matlab. O programa de esqueleto gerado pelo Matlab representa uma lista de funções a serem chamadas pelo usuário ao trabalhar com os objetos de interface. As funções estão vazias, então GUI não faz nada ainda. É nossa tarefa preencher as funções com os conteúdos necessários. 4.1 Programar o botão Browse Primeiro de tudo, precisamos de acesso a um arquivo gerado pelo MetaTrader 4, então vamos começar com a função chamada pressionando Browse. O nome da função chamada pressionando o botão consiste no nome do botão (definido pela propriedade Tag) e no Retorno de chamada do postfix. Vamos localizar a função pushBrowseCallback no texto do arquivo ou simplesmente pressionar Mostrar Funções na barra de ferramentas e selecionar pushBrowseCallback na lista. A sintaxe da linguagem de programação Matlab difere das regras convencionais de codificação nas linguagens C e C. Particularmente, não é necessário marcar o corpo da função com chaves ou especificar o tipo de dados a serem passados para a função, os índices de matriz (vetor) começam com um eo caractere de comentário é. Assim, todo o texto verde acima não é um programa, mas um comentário feito pelos desenvolvedores Matlab para que possamos entender o caso. Será necessário criar uma caixa de diálogo para inserir o nome completo do arquivo. Para isso, vamos usar a função uigetfile: handles aqui é uma estrutura que armazena descritores de todos os objetos em nossa GUI incluindo o da forma, em que os colocamos. A estrutura é passada de uma função para outra e permite o acesso aos objetos. HObject é um descritor do objeto que chamou a função. Set ajuda a definir o valor do objeto para um determinado valor e tem a seguinte sintaxe: set (objectdescriptor, objectpropertyname, propertyvalue). Você pode encontrar o valor das propriedades do objeto usando a seguinte função: propertyvalue get (objectdescriptor, objectdescriptorname). Mas não esqueça que o nome é um valor do tipo de seqüência de caracteres, portanto, ele deve estar em aspas simples. A última coisa que temos de saber sobre os objetos e suas propriedades. O formulário, no qual colocamos os elementos GUI, é em si um objeto colocado no objeto raiz (seu descendente). Ele também tem um conjunto de propriedades que podem ser modificadas. As propriedades podem ser visualizadas usando a ferramenta denominada Object Editor para ser chamada a partir da barra de ferramentas principal do editor de interface. A raiz do objeto, como o termo sugere, é a raiz da hierarquia de objetos gráficos e não tem nenhuma ascendência. Agora vamos verificar o que temos como resultado. Vamos agora iniciar nossa GUI pressionando Executar na barra de ferramentas principal do M-file Editor. Tente clicar em Procurar e selecionar nosso arquivo. É em Então feche a GUI de trabalho e vá em frente. 4.2 Programação do Botão Iniciar, Desenho Gráfico Agora vamos atribuir o botão Iniciar com chamar a função que leria os dados do arquivo e mostrá-los em um gráfico. Primeiro, vamos criar a função em si. Precisaremos da estrutura dos manipuladores de descritores de objetos como entradas. Tendo acesso a objetos, poderemos lê-los e definir suas propriedades. Dlmread lê dados do arquivo de texto com separadores e tem a seguinte sintaxe: dlmread (fullfilename, separator, skipstrings, skipcolumns) comprimento (qqq) o tamanho maior da matriz qqq agora hora atual e data datestr (now) transforma hora e data em um Texto Você deve saber, também, que Matlab fornece informações de ajuda enorme com teoria e exemplos. Vamos colocar a nossa função no final do programa (será mais fácil encontrá-lo lá) e adicionar a sua chamada em pushStartCallback: Lançá-lo usando Run, selecione um arquivo, pressione Iniciar e aproveite o resultado. 4.3 Guardar o caminho para um ficheiro Tudo está tudo bem agora, mas é um pouco chato clicar permanentemente com o rato a seleccionar um ficheiro depois de ter pressionado Browse. Vamos tentar salvar o caminho uma vez selecionado. Começaremos com a leitura. O nome de um arquivo que armazena o caminho consistirá no nome GUI e no postfix saveparam e terá extensão de. mat. A função FromToOpeningFcn é executada diretamente após a criação do formulário GUI. Vamos adicionar lá a tentativa de ler o caminho a partir do arquivo. Se a tentativa falhar, o valor padrão será usado. Outras seqüências de função FromToOpeningFcn serão deixadas inalteradas. Vamos modificar a função pushBrowseCallback da seguinte maneira: 4.4 Processamento de dados Como um processo exemplar, vamos interpolar a coluna OPEN por uma função polinomial de quarta ordem. Vamos adicionar o seguinte código no final da nossa função, processo: Vamos tentar iniciar e pressione Iniciar. Se você tiver aproximadamente o mesmo resultado como mostrado acima, é muito tempo começar a salvar dados como um arquivo. 4.5 Salvando dados como um arquivo Salvar dados não é mais complicado do que lê-los. A única vantagem é que o fresult do vetor deve ser contado para baixo, isto é, do mais recente para o primeiro. Isso é feito para simplificar a leitura do arquivo no MetaTrader 4, a partir da barra zero e até o arquivo terminar. Vamos complementar o processo de função pelo seguinte código: Agora, verifique se o arquivo contendo o resultado foi criado, localizado no mesmo local onde há o arquivo inicial, e tem o mesmo nome complementado pelo resultado do postfix. 4.6 Controle do Temporizador Esta é a parte mais difícil do trabalho. Teremos de criar um timer que verifique o tempo de criação do arquivo MetaTrader 4-formado a cada segundo. Se o tempo mudar, o processo de função deve ser iniciado. O timer stop-start será executado usando Start. Quando a GUI é aberta, vamos apagar todos os temporizadores criados anteriormente. Vamos criar um temporizador colocando o seguinte código na função FromToOpeningFcn: O código acima deve ser inserido imediatamente após nossa inserção anterior nesta função, ou seja, antes de strings handles. output hObject e guidata (hObject, handles). Ao executar esse código, o Matlab, imediatamente após a criação da GUI, verificará a disponibilidade de temporizadores, excluirá os existentes e criará um novo cronômetro. O timer chamará checktime de função a cada segundo e passará a lista de descritores identificados nela. Além de alças, o temporizador passará seu próprio descritor para a função, bem como a estrutura que contém tempo de chamada e razão. Não podemos influenciar isso, mas devemos considerar isso ao codificar a função a ser chamada pelo temporizador. Você pode localizar a função em si onde quiser. Deixe-o escrever na barra de status Matlab o momento em que foi chamado: Em sua criação, o timer é parado, agora devemos lançá-lo. Vamos localizar a função pushStartCallback. Vamos comentar o processo de chamada (alças) colocado nele e escrever o gerenciamento de temporizador para ele: Agora vamos verificar como tudo funciona. Vamos tentar ativar e desativar o temporizador usando Iniciar. Se o timer estiver ativado, o relógio acima do campo de entrada do caminho deve funcionar. Seria mais correto excluir o temporizador usando o botão X ao fechar a GUI. Se você quiser fazer isso, adicione no início da função figure1CloseRequestFcn. Esta função será chamada no fechamento de GUI. Você pode acessá-lo a partir do editor GUI: Mas, por favor, leve em consideração que agora, se você pressionar Executar o editor sem ter fechado o GUI operacional, o timer antigo não será excluído enquanto o novo será criado. E na próxima vez haverá mais um criado, etc. Você pode lidar com temporizadores inutilizados usando o comando delete (timerfind) do console do Matlab. Agora, se tudo estiver funcionando bem, criaremos uma função para verificar a hora da última modificação do arquivo do MetaTrader 4: Function dir (fullfilename) retorna uma estrutura que contém as informações do arquivo (nome, data, bytes, isdir). As informações sobre o tempo de criação do arquivo anterior serão armazenadas na propriedade Userdata do objeto temporizador. Seu descritor é passado para o checktime da função nomeado como obj. Agora, ao alterar um arquivo criado pelo MetaTrader 4, nosso programa substituirá o resultado. Você pode verificar isso modificando o arquivo manualmente (por exemplo, excluindo as últimas strings) e monitorando as alterações no gráfico ou arquivo resultante. Claro, o botão Iniciar deve ser pressionado. Se uma janela extra que contém a cópia de gráfico é criada durante a operação de programas, adicione a seguinte seqüência no início do processo de função: 5. Desenho dos resultados no MetaTrader 4 Agora vamos voltar ao MetaTrader 4. Temos de complementar nosso indicador com um Função que iria ler o resultado do arquivo e desenhá-lo em um gráfico. O comportamento do programa será descrito da seguinte forma: 1. Se uma nova barra é recebida: Exclua o arquivo de resultado antigo, Apague o gráfico, Salve o arquivo de dados. 2. Se o arquivo de resultado é legível: Leia o arquivo, Desenhe um gráfico, Exclua o arquivo de resultado. Eu não vou descrever aqui como o código abaixo funciona desde a leitura de dados de arquivo e desenho indicadores podem ser encontrados em outros artigos. Eu só aviso que o arquivo de resultado aqui é excluído imediatamente após ele foi colocado no gráfico. Portanto, não se preocupe se você ver várias mensagens de erro de leitura. Erros de leitura ocorrem em dois casos: 1. Imediatamente após uma nova barra tem renda, uma vez que o arquivo de resultado ainda não foi criado. 2. Imediatamente após o resultado foi lido eo gráfico foi desenhado, uma vez que o arquivo foi excluído, a fim de não voltar a ler os mesmos dados. Assim, o programa mantém seu status de erro de leitura praticamente o tempo todo. ) Abaixo está o meu resultado final. Espero não ter cometido erros e você será capaz de reproduzi-lo. Conclusão Neste artigo, descrevemos a maneira de organizar uma interação entre MetaTrader 4 e Matlab via arquivos CSV. Este método não é nem original nem ideal. O valor desta abordagem é que ele ajuda a trocar arrays de dados sem habilidades especiais de operar com qualquer outra ferramenta de programação além de MetaTrader 4 e Matlab. How para escrever / ler variáveis para / a partir de um arquivo Se você usar a abordagem com mklink mt4 Ser capaz de lidar com 1 r ead amp escreva e 1 acesso só de leitura simultaneamente Estou escrevendo para um arquivo csv com um mt4 ea tenho uma conexão somente leitura aberta com Java ao mesmo tempo sem problemas, mas você tem a experiência o que acontece se Você usa 2 EAs para que eu não tenho experiência específica com MT4 e EAs tentando acessar o mesmo arquivo, mas eu tenho experiência com aplicativos do Windows tentando acessar o mesmo arquivo e eu sei que pode ser problemático se não tratadas com cuidado, por exemplo, A leitura do aplicativo não deve tentar fazê-lo até que o aplicativo de escrita tenha terminado, parece trivial, mas isnt. Mesmo abrir o arquivo com acesso exclusivo não resolveu todos os problemas por conta própria. Talvez as coisas estejam melhores nestes dias, foi há alguns anos quando eu estava envolvido com isso. 20 pips um dia isnt muito pedir. A ferramenta simples copia o arquivo em um NAS em intervall (cada segundo.). Outra ferramenta no outro computador ler em intervall do NAS. Problemas com acesso simultâneo não existem porque o NAS regula isso. Com o exemplo i get it, o arquivo é criado e os valores vêm dentro Mas os valores 82038203are sempre adicionados em uma nova linha. Gradualmente o arquivo está ficando maior e maior. Eu só preciso dos valores atuais. Seria possível sobregravar os valores 82038203so há sempre apenas uma linha real desculpe por erros de ortografia meu inglês ainda está em fase de desenvolvimento)
No comments:
Post a Comment