Experts: Exemplos do livro "Redes neurais e negociação algorítmica no MQL5" - página 2

 

Boa tarde,

Estou tentando executar o primeiro script do livro, que gera um arquivo csv.

Ele se chama initial_data.mq5.

Ao executar o script na primeira etapa:

If(CopyClose(_Symbol, PERIOD_M5, Start, End, close) <= 0 ||

CopyOpen(_Symbol, PERIOD_M5, Start, End, open) <= 0 ||

CopyHigh(_Symbol, PERIOD_M5, Start, End, high) <= 0 ||

CopyLow(_Symbol, PERIOD_M5, Start, End, low) <= 0)

retornar;

CopyClose é sempre igual a -1

e o script trava, as repetições não ajudam e, como li nos comentários

essa é uma situação normal e significa que não há dados do servidor.

No entanto, não entendo completamente como o caminho para os arquivos de dados é escrito nesse script.

Ele está escrito na documentação da MQL5:


Por exemplo, os dados do símbolo EURUSD do servidor de negociação MetaQuotes-Demo estarão localizados na pastaterminal_directory\bases\MetaQuotes-Demo\history\EURUSD\.


E eu tenho arquivos com resolução .hcc e um subdiretório \cache com arquivos como H4.hc


Mas no script initial_data.mq5, há apenas um lugar onde o caminho está escrito.

PrintFormat("Coeficientes de correlação salvos no arquivo %s\\\\Files\\\\%s",

TerminalInfoString(TERMINAL_DATA_PATH), FileName);


Eu produzo TERMINAL_DATA_PATH

2024.06.16 22:53:39.982 path (EURUSD,M5) dataPath =C:\Users\HPAppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075


O que devo fazer para especificar corretamente o caminho para esses arquivos ou ele deve conectá-los automaticamente do diretório do terminal de acordo com a lógica MQL5?

Como fazer download de dados para um arquivo csv?


 
bobozel1 #:

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Qualquer dúvida de iniciantes sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos

Aleksey Vyazmikin, 2024.06.18 06:28 pm

#define FileName  "correlation.csv"
//+------------------------------------------------------------------+
//| Parâmetros externos|
//+------------------------------------------------------------------+
input datetime Start = D'2015.01.01 00:00:00';  // Início do período
input datetime End = D'2020.12.31 23:59:00';    // Fim do período
//--- Abra o arquivo para gravar dados
   int handle = FileOpen(FileName, FILE_WRITE | FILE_CSV | FILE_ANSI, "\t", CP_UTF8);
   if(handle == INVALID_HANDLE)
     {
      PrintFormat("Error of open file %s: %d", FileName, GetLastError());
      return;
     }
FileOpen

Parâmetros

open_flags

[ combinação de sinalizadores que definem o modo de trabalho com o arquivo. Os sinalizadores são definidos da seguinte forma:
FILE_READ arquivo aberto para leitura
FILE_WRITEarquivo aberto para gravação
FILE_BINmodo binário de leitura e gravação (sem conversão de e para cadeia de caracteres)
FILE_CSVarquivo do tipo csv (todos os elementos escritos são convertidos em cadeias de caracteres do tipo apropriado, unicode ou ansi, e separados por um delimitador)
FILE_TXTarquivo de texto simples (o mesmo csv, mas o separador não é levado em conta)
FILE_ANSIcadeias de caracteres do tipo ANSI (caracteres de byte único)
FILE_UNICODEcadeias de caracteres do tipo UNICODE (caracteres de byte duplo)
FILE_SHARE_READacesso de leitura compartilhado por vários programas
FILE_SHARE_WRITEacesso de gravação compartilhado por vários programas
FILE_COMMONlocal do arquivo na pasta comum de todos os terminais clientes \Terminal\Common\Files.

FileOpen

Observação

Por motivos de segurança, o trabalho com arquivos é estritamente controlado na linguagem MQL5. Os arquivos, que são usados para operações de arquivo usando as ferramentas da linguagem MQL5, não podem ser localizados fora da "sandbox" de arquivos.

Se um arquivo precisar ser lido em uma determinada codificação (o parâmetro codepage com o valor codepage é especificado), o sinalizador FILE_ANSI deve ser definido. Sem especificar o sinalizador FILE_ANSI, o arquivo de texto será lido em Unicode sem nenhuma conversão.

O arquivo é aberto na pasta do terminal do cliente na subpasta MQL5\Files (ou no diretório testing agent_agent\MQL5\Files em caso de teste). Se FILE_COMMON for especificado entre os sinalizadores, o arquivo será aberto na pasta comum de todos os terminais de cliente \Terminal\Common\Files.

Você pode abrir "canais nomeados" de acordo com as seguintes regras:

  • O nome do canal é uma cadeia de caracteres que deve ter o formato: "\\servername\pipe\pipename", em que servername é o nome do servidor na rede e pipename é o nome do canal. Se os canais forem usados no mesmo computador, o nome do servidor poderá ser omitido, mas, em vez disso, deverá ser usado um ponto: "\\.\pipe\pipename". O cliente que está tentando se conectar ao canal deve saber o nome do canal.
  • FileFlush() e FileSeek() devem ser chamados no início do arquivo entre operações sucessivas de leitura do canal e gravação no canal.

Nas linhas acima, o caractere especial de barra invertida '\' é usado, portanto, ao escrever o nome no programa MQL5, o '\' deve ser duplicado, ou seja, o exemplo acima deve ser escrito no código como "\\\\servername\\pipe\\\pipename".

Para obter mais detalhes sobre como trabalhar com canais nomeados, leia o artigo "Comunicação com o MetaTrader 5 via canais nomeados sem DLL".


 
Aleksey Vyazmikin #

Honestamente, não entendi nada da resposta, como se um robô estivesse escrevendo. Sei onde o arquivo a ser criado é gravado, mas ele não é criado.

Tenho uma pergunta específica: como obter dados de arquivos .hcc e .hc para gravar em .csv?

Como resultado, estou executando o script initial_data.mq5 do livro:

CopyClose é sempre -1. Como corrigir isso?

Suspeito que ele simplesmente não vê esses arquivos porque o caminho para os arquivos de dados não está escrito corretamente.

Como faço para escrever corretamente o caminho para os arquivos de dados?

No meu caso, os arquivos de dados estão na pasta terminal_directory\bases\MetaQuotes-Demo\history\EURUSD\ dentro da sandbox.

Estou tendo dificuldades com isso há uma semana, li tudo, mas não encontrei uma solução. Por favor, me ajude.

 
bobozel1 #:

Sinceramente, não entendi nada da resposta, como se um robô estivesse escrevendo. Eu sei onde o arquivo a ser criado é gravado, mas ele não é criado.

Tenho uma pergunta específica: como obter dados de arquivos .hcc e .hc para gravar em .csv?

Como resultado, estou executando o script initial_data.mq5 do livro:

CopyClose é sempre -1. Como corrigir isso?

Suspeito que ele simplesmente não vê esses arquivos, porque o caminho para os arquivos de dados não está escrito corretamente.

Como especificar corretamente o caminho para os arquivos de dados?

No meu caso, os arquivos de dados estão localizados na pasta terminal_terminal_directory\bases\MetaQuotes-Demo\history\EURUSD\ dentro da sandbox.

Estou tendo dificuldades com isso há uma semana, li tudo, mas não encontrei uma solução. Por favor, me ajude.

Todos os dados são obtidos da plataforma, o usuário não se importa de onde o terminal os obtém - de qual arquivo.

O script funciona com os dados que são refletidos no gráfico.

Verifique se há datas no gráfico para as quais você está solicitando cotações.

 
Aleksey Vyazmikin #:

Todos os dados são obtidos da plataforma, o usuário não se importa de onde o terminal os obtém - de qual arquivo.

O script funciona com os dados refletidos no gráfico.

Verifique se há datas no gráfico para as quais você está solicitando cotações.

Por favor, explique o que isso significa.

No script, há um intervalo

input datetime Start = D'2015.01.01.01 00:00:00'; // Início do período

input datetime End = D'2020.12.31 23:59:00'; // Fim do período

no M5

Devo pegar o gráfico EURUSD no M5, rolar até 2015.01.01 e depois executar o script nele?

Ou posso executar o script no MN? E com novos ticks ele volta ao início?
 
bobozel1 #:

Você pode explicar o que isso significa?

No script, há um intervalo

input datetime Start = D'2015.01.01.01 00:00:00'; // Início do período

input datetime End = D'2020.12.31 23:59:00'; // Fim do período

no M5

Preciso pegar o gráfico EURUSD no M5, rolar até 2015.01.01 e depois executar o script nele?

Ou posso executar o script no MN? E com novos ticks ele se move para o início novamente?

Leia a ajuda no terminal. E aqui está outra coisa.

Você descobrirá que há uma configuração da profundidade do histórico por meio do número máximo de barras na janela. Você precisa recarregar o terminal para que as alterações tenham efeito.

Portanto, é necessário definir a profundidade máxima do histórico para todos os TFs de uma só vez pelo menor TF necessário para o trabalho.

É claro que 100 barras para dias e 100 barras para minutos darão a mesma profundidade em barras, mas não em datas.

Quando você definir o valor necessário ou "Unlimited" (Ilimitado) e recarregar o terminal, se o histórico estiver disponível para o período necessário, você poderá executar o script no TF mensal.


 
Aleksey Vyazmikin #:

Leia a ajuda do terminal. E aqui está outra.

Você aprenderá que há uma configuração da profundidade do histórico por meio do número máximo de barras na janela. Para que as alterações tenham efeito, você precisa recarregar o terminal.

Portanto, é necessário definir a profundidade máxima do histórico para todos os TFs de uma só vez pelo menor TF, o que é necessário para o trabalho.

É claro que 100 barras para dias e 100 barras para minutos darão a mesma profundidade em barras, mas não em datas.

Quando você definir o valor necessário ou "Unlimited" (Ilimitado) e recarregar o terminal, se o histórico estiver disponível para o período necessário, você poderá executar o script no TF mensal.


Obrigado! Tudo funcionou.
 
bobozel1 #:
Obrigado! Funcionou.

Não tem de quê.

 
O mais problemático não é isso. O mais problemático é que, após a otimização dos parâmetros, você só pode ganhar por um ano. Altere-o para outro ano e ele não funcionará novamente. Isso significa que a ideia do autor não é viável. Os parâmetros podem variar muito de ano para ano. Talvez não exista um conjunto de parâmetros que possa ser lucrativo todo ano!
 

Obrigado , Dmitry , por todo o seu empenho neste livro. Ele é realmente útil.

Em neuronbase.mqh, você implementa o método ElasticNet Regularization conforme abaixo, sem explicação em seu livro.

m_cWeights.m_mMatrix -= m_cWeights.m_mMatrix * Lambda[1] + Lambda[0]

Mas isso é diferente da fórmula básica (+) ou do código-fonte do Keras (+), por exemplo.

Explique seu método de implementação. Por que você usa apenas lambdas em vez da fórmula completa e por que multiplica os pesos com um deles e soma com outro.

Dmitriy Gizlyk
Dmitriy Gizlyk
  • 2024.07.15
  • www.mql5.com
Trader's profile