Especialistas: Monitoramento de Cotações (arquivo de memória mapeada) - página 2

 
sergeev:

1) somente o servidor tem o direito de modificar a memória. os clientes a leem.

2) - Veja o Pipe. Lá, os "eventos" de chegada de dados são implementados de forma autoexplicativa - você tem dados, nós os pegamos, esperamos por eles.

3) Sim, você terá que escrever um servidor ou copiá-lo do MSDN, mas os clientes prontos podem ser usados diretamente na MQL5.

4) infelizmente, não é possível resolver esse problema com a periodicidade de polling. O Sleep(1) não deve fazer barulho mesmo quando se trabalha com memória. Você deve verificar o tempo das funções, talvez haja passagens extras e carga em algum lugar.

1 - apenas um servidor (escrito por mim a partir de seu trabalho)

2 - interessante, vou dar uma olhada, só que tenho uma tarefa "o mais oportuna possível" para transferir dados de 4(8) bytes, ou seja, o ciclo inteiro (deve ser executado com muita frequência)

3 - Acho que, por analogia com o artigo, vou criar o meu próprio, mas até agora o problema nem mesmo o exemplo de teste funciona.

4 - sim, reescrevi algumas coisas, otimizei o código e ele parece estar melhor.

 

Tentei adicionar sua dll ao mt4.

2013.04.01 00:03:49     _tradeBuySell_mt4 GBPCHF,H1: -unknow err(0)  h=0
2013.04.01 00:03:49     _tradeBuySell_mt4 GBPCHF,H1: function 'MemOpen' call from dll 'MemMap32.dll' critical error c0000005 at 666013E6.
Aqui está o código
#include <stdlib.mqh>

#define modeOpen                                                        0 // bandeira aberta
#define modeCreate                                                      1 // sinalizador de criação

#import "MemMap32.dll"
int MemOpen(string path,int size,int mode,int &err); // abrir/criar arquivo na memória, obter o identificador
void MemClose(int hmem); // fechar o arquivo na memória
int MemGrows(int hmem,string path,int newsize,int &err); // aumentar o tamanho do arquivo na memória
int MemWrite(int hmem,int &v[], int pos, int sz, int &err); // gravar o vetor int(4) v na memória a partir da posição especificada pos, tamanho sz
int MemRead(int hmem, int &v[], int pos, int sz, int &err); // ler o vetor v da posição especificada pos com o tamanho sz

#import


int hmem,err; // 
string file; // nome do arquivo na memória


int init()
   {
   file="Local\\123"; // nome do arquivo na memória

   hmem=MemOpen(file,-1,modeOpen,err); // abrir um arquivo existente
   if(hmem>0) // se aberto
     {
      Print("open OK h="+hmem);
     }
   else
   if(err==-2) // se não estiver aberto,
     {
      Print("-err("+err+") memfile not found.");

     }
   else
     {
      Print("-unknow err("+err+")  h="+hmem);
      return(0);
     }
   Print("OK ("+err+") h="+hmem);   
 
      return(0);
   }
 

gire a chave de fenda para a direita

 
sergeev:

girar a chave de fenda corretamente

Seu exemplo no link usa MemMap.dll

Ele não está lá, é MEmMap32.dll.

Ele funciona no mt5, mas no mt4 ele não encontra o arquivo.

Inicialmente, o err foi declarado incorretamente e deveria ser uma matriz, obrigado por isso

 
Você pode me dizer como contornar isso?
OK      1       01:10:31        tradeBuySell    'D:\MT5******\MQL5\Libraries\MemMap32.dll' is not 64-bit version
JF      1       01:10:37        tradeBuySell (GBPUSD,H1)        Cannot load 'D:\******\MQL5\Libraries\MemMap32.dll'

A versão x64 do terminal mt5 é instalada automaticamente no servidor.

Tenho o Win7x64 em meu laptop, mas tenho uma versão normal de 32 bits do terminal e ele não tenta atualizar para x64.