Especialistas: Monitoramento de Cotações (arquivo de memória mapeada)

 

Monitoramento de Cotações (arquivo de memória mapeada):

Este Expert Advisor é um exemplo de uso do Mapeamento de Memória DLL para trabalhar com Funções de Mapeamento de arquivo.

Neste exemplo, o Expert Advisor cria um arquivo virtual (de memória mapeada) e inicia a atualização das cotações nos ativos. Desta forma, os Expert Advisors podem trocar dados (por exemplo, dados de cotações) usando o arquivo de memória mapeada comum.

Monitoramento de cotações (arquivo de memória mapeada)

Autor: o_O

 

Boa tarde

Não consigo me conectar a partir do projeto C++ Builder .

Aqui está o código

void __fastcall TForm1::FormActivate(TObject *Sender)
{

        AnsiString path_MemMap32=ExtractFileDir(ParamStr(0)) + "\\dll\\MemMap32.dll";

        AnsiString  path_file="Local\\Monitor_USDCHF";
        wchar_t * UnicodeString = new wchar_t[path_file.WideCharBufSize()]; 
        path_file.WideChar(UnicodeString,path_file.WideCharBufSize());

        delete [] UnicodeString;


        int  (__stdcall *MemOpen) (char * path,int size,int mode,int &err);
        void (__stdcall *MemClose)(int hmem);
        int  (__stdcall *MemRead)(int hmem, int v[], int pos, int sz, int &err);

        HINSTANCE hDLL= LoadLibrary(path_MemMap32.c_str());

        if(!hDLL)       {StatusBar1->SimpleText="I can't load dll";}
        else            {StatusBar1->SimpleText="path_MemMap32.dll load";}

        MemOpen= (int(__stdcall *)(char * path,int size,int mode,int &err))  GetProcAddress(hDLL,"MemOpen");
        MemClose=(void(__stdcall*)(int hmem)) GetProcAddress(hDLL,"MemClose");
        MemRead= (int(__stdcall *)(int hmem, int v[], int pos, int sz, int &err))  GetProcAddress(hDLL,"MemRead");
        hmem=MemOpen(path_file.c_str(),-1,0,err);
        StatusBar1->SimpleText=err;

}

A barra de status diz 2, ou seja, arquivo não encontrado. Tentei enviar o caminho para o arquivo tanto em ansi quanto em unicode

No arquivo MT5, o Expert Advisor criou um arquivo e atualiza as cotações nele.

 

Se você tem C++, por que decidiu usar uma DLL?

O código-fonte está totalmente disponível lá.

 
sergeev:

Se você tem C++, por que decidiu usar uma DLL?

O código-fonte está totalmente disponível.

Eu queria usar uma DLL pronta.

para que não houvesse problemas com o MT4-5.

... Vou tentar ver o código-fonte da dll

 
olyakish:

Eu queria usar a dll pronta.

para que não houvesse problemas com o sparring no MT4-5.

... Vou tentar ver o código-fonte da dll.

Qual é o seu Windows?
 
Dima_S:
Qual é o seu Windows?

win7x64

Não consigo escrever no builder.

E não consigo escrever assim.

#include <vcl.h>
#include <stdafx.h>

#include "BuySell.h"
Eu entendi.
[C++ Fatal Error] afxv_w32.h(14): F1003 Error directive: WINDOWS.H already included.  MFC apps must not #include <windows.h>

Tentei me conectar primeiro

afxv_w32.h

não ajudou

Tentei conectar o afxwin.h primeiro - isso também não ajudou.

 
olyakish:

Tentei conectar o afxwin.h primeiro, mas isso também não ajudou.

Procure outra opção: afx.h conectado
 
sergeev:
procure o afx.h conectado como outra opção.

Sim, então ele está conectado sem erros, vou continuar tentando. Obrigado.

...

Consegui, tudo funciona.

Mas o CloseHandle não fecha por algum motivo.

Tenho um servidor no exe (cria atualizações e deve fechar) e no terminal há um receptor, portanto, após o CloseHandle no servidor, ele vê o objeto com falha na memória.

 
olyakish:

Tenho um servidor no eco (ele o atualiza e fecha) e um receptor no terminal, portanto, após o CloseHandle no servidor, ele vê o objeto com falha na memória.

Você espera que a memória seja completamente limpa ao fechar um handle?
 
sergeev:
e você espera que a memória seja completamente limpa quando a alça for fechada?

Boa tarde

Por favor, diga-me a direção do desenvolvimento do pensamento.

Há uma tarefa para distribuir sinais em um computador (servidor) em muitos terminais, com atrasos críticos de mais de 1-3 ms.

Implementado em um pacote de cliente-servidor, 1-2 contas funcionam de forma aceitável e não penduram o terminal, fazendo a leitura da memória usando Sleep(1) em um loop - se a memória tiver o valor necessário, execute alguma ação. Mas quando se trata de terminais com até 5 terminais, 1 ms aqui não é possível, caso contrário o cooler do processador começa a uivar...

Não acompanho as notícias há muito tempo. Talvez no mt5 existam eventos personalizados semelhantes ao OnTrade para que possam ser vinculados à modificação da memória.

Tentei ler sem atrasos 100.000 ciclos (8 bytes cada) em 670 ms.

... talvez eu devesse reduzir os dados para 4 bytes.

... provavelmente há outra opção para reconstruir sua dll para fazer um loop interno - não retornando dados até que eles não tenham os valores necessários. mas como o MT5 reagirá a uma espera tão longa pelo retorno de uma função externa é outra questão.

 
olyakish:

Há uma tarefa para distribuir sinais em um computador (servidor) para muitos terminais; atrasos de mais de 1-3 ms são críticos.

Implementado no pacote cliente-servidor, 1-2 contas funcionam de forma aceitável e não penduram o terminal feito com a leitura da memória usando Sleep(1) em um loop - se a memória tiver o valor necessário, executamos alguma ação. Mas quando se trata de terminais, mesmo 5 terminais, 1 ms aqui não é possível, caso contrário o cooler do processador começa a uivar...

Não acompanho as notícias há muito tempo. Talvez no mt5 existam eventos de usuário semelhantes ao OnTrade, de modo que possam ser vinculados à modificação da memória.

No seu caso, somente o servidor tem o direito de modificar a memória. Os clientes a leem.

- Observe a direção do Pipe. Lá, os "eventos" de chegada de dados são realizados de forma autoexplicativa - se houver dados, nós os pegamos; se não, esperamos.

Sim, o servidor terá que ser escrito ou copiado do MSDN, mas os clientes prontos podem ser usados diretamente na MQL5.

Infelizmente, também não há como lidar com a periodicidade da sondagem aqui. O Sleep(1) em um número tão grande de Expert Advisors não deve fazer barulho, mesmo quando se trabalha com memória. Você precisa verificar o tempo das funções, talvez haja passagens extras e carga em algum lugar.