Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
não se chama fechar o registro, mas sim fechar e excluir o arquivo.
e é por isso que
você está tentando abrir algo que não existe mais.Analisando o código da biblioteca, vi que o arquivo é excluído não apenas quando a função Close() da classe CMemMapFile é chamada diretamente, mas também quando o ponteiro para o objeto dessa classe é excluído, porque essa função é chamada no destrutor da classe. Estou um pouco perplexo. Acontece que o método dinâmico de criação de objetos de classe não pode ser usado se a gravação e a leitura de um arquivo forem usadas em diferentes contextos de chamada (escopos). Por exemplo, um gráfico do terminal grava dados em um arquivo, o segundo lê dados e exclui esse arquivo. Acontece que a variável de objeto deve sempre ser mantida no nível global, para que o arquivo não seja excluído à força. Também não está claro se é possível fazer isso sem especificar o tamanho dos dados lidos. Ou seja, sabemos o tamanho dos dados ao escrevê-los, mas ao lê-los em outro gráfico, talvez não saibamos o tamanho dos dados com antecedência, como, por exemplo, no caso de valores de cadeia de caracteres. É provável que eu tenha entendido algo errado ou que haja algo mais a ser ajustado na biblioteca.
Erro meu. Verifiquei novamente sem usar o ponteiro e, portanto, sem usar delete. Nesse caso, ao sair do escopo (de uma função), a variável local do objeto de classe é destruída sem uma chamada explícita ao destrutor.
Ainda há uma dúvida sobre o tamanho dos dados recebidos no lado do receptor.
Agradeço ao autor pela biblioteca!
Criei funções para transferir quaisquer dados. O script abaixo mostra o trabalho delas no exemplo dos ticks
Resultado
Excelente! Por analogia com seu código, simplifiquei o uso da biblioteca para mim.
Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação
NamedPipes para o metatrader 4
fxsaber, 2017.11.30 14:18
Exchange_Data.mqh
PriceGiver.mq4
PriceTaker.mq4
Execute PriceGiver.ex4 e PriceTaker.ex4.
Resultado
A biblioteca tem um pequeno erro no método CMemMapFile::Open. Ele deveria retornar o identificador de arquivo (tipo HANDLE64), mas, em vez disso, retorna 0 ou um código de erro.
Além disso, os métodos de leitura e gravação CMemMapApi::Write e CMemMapApi::Read, por algum motivo, duplicam a recopiagem de dados (e os bytes são repetidos!) e, além disso, o arquivo é sobrescrito/lido em sua totalidade, embora apenas uma parte específica seja necessária.
Em geral, eu os fiz parecer normais, as coisas desnecessárias estão comentadas:
Para que a primeira função seja compilada, você precisa definir const para matrizes nas funções memcpyX e memcpy, o que o autor não se preocupou em definir.Erro ao copiar tamanhos grandes, devido à passagem de zero em dwMaximumSizeHigh
Corrigido desta forma:
Esse tamanho - 6 mb, é transferido sem problemas:
Corrigido desta forma:
Passe corretamente os 4 bytes superiores do tamanho de 8 bytes para lá.
Ok, agora temos todos os raites no programa C# e podemos analisar tudo o que precisamos usando o LINQ.
Mas há uma questão: como organizar o mecanismo de comandos entre o terminal e o aplicativo.
Do terminal: nova vela, novos raites - pegue o arquivo
Do aplicativo: cálculo concluído, pegar o resultado (desenhar no gráfico, abrir uma transação).
Alguém tem experiência em tal implementação de interação entre o terminal e o código?
Ok, agora temos todos os requisitos em um programa C# e podemos usar o LINQ para analisar tudo perfeitamente.
Mas há uma questão: como organizar o mecanismo de comandos entre o terminal e o aplicativo.
No terminal: new candle, new rates - obter o arquivo
Do aplicativo: cálculo concluído, pegue o resultado (desenhe-o no gráfico, abra uma transação).
Alguém tem experiência com essa implementação de interação entre o terminal e o código?
Por favor, informe o que fazer nessa situação.
1. abri um novo arquivo na memória com 100 bytes.
2. Escrevi 100 bytes nele.
3. Li 100 bytes em outro Expert Advisor. Tudo está funcionando bem.
4. Agora, como escrever 50 ou 200 bytes no mesmo arquivo?