Sistemi Esperti: Monitoraggio dei preventivi (esempio di mappatura)

 

Monitoraggio dei preventivi (esempio di mappatura):

Un esempio di utilizzo della DLL per lavorare con le funzioni di File Mapping. In questo esempio, l'Expert Advisor lanciato crea un file virtuale in memoria e inizia ad aggiornare la quotazione del simbolo. Quando si lanciano gli EA in altri terminali, questi aprono il file creato e iniziano ad aggiornarvi le loro quotazioni. In questo modo, gli Expert Advisor scambiano le loro quotazioni attraverso un file comune.

Monitoraggio dei preventivi (esempio di mappatura)

Author: ---

 

Buon pomeriggio

Non riesco a connettermi da un progetto C++ Builder .

Ecco il codice

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;

}

La barra di stato dice 2, cioè file non trovato, ho provato sia in ansi che in unicode a inviare il percorso del file.

Nel file MT5 Expert Advisor ha creato un file e aggiorna le quotazioni in esso.

 

Se avete il C++, perché avete deciso di usare una DLL?

Il codice sorgente è completamente disponibile.

 
sergeev:

Se avete il C++, perché avete deciso di usare una DLL?

Il codice sorgente è completamente disponibile.

Volevo utilizzare una DLL già pronta.

in modo da non avere problemi con la MT4-5.

... Cercherò di vedere il codice sorgente della DLL.

 
olyakish:

Volevo utilizzare la dll già pronta.

in modo che non ci fossero problemi con l'uso di sparring in MT4-5.

... Cercherò di vedere il codice sorgente della dll.

Qual è il tuo Windows?
 
Dima_S:
Qual è il vostro Windows?

win7x64

Non riesco a scrivere in builder.

e non posso scrivere in questo modo.

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

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

Ho provato a connettermi prima

afxv_w32.h

non ha aiutato

Ho provato a collegare afxwin.h prima - non ha aiutato nemmeno.

 
olyakish:

Ho provato a inserire prima afxwin.h, ma non è servito.

Cercare un'altra opzione: afx.h tappato
 
sergeev:
cercare afx.h collegato come altra opzione.

Sì, quindi è senza errori proverò ulteriormente. Grazie.

...

Ho capito, tutto funziona.

Ma CloseHandle non si chiude per qualche motivo.

Ho un server nell'exe (crea aggiornamenti e dovrebbe chiudere) e nel terminale c'è un ricevitore, quindi dopo CloseHandle nel server vede l'oggetto fallito in memoria.

 
olyakish:

Ho un server nell'eco (lo aggiorna e lo chiude) e un ricevitore nel terminale, quindi dopo CloseHandle nel server vede l'oggetto fallito in memoria.

vi aspettate che la memoria venga completamente svuotata quando si chiude un handle?
 
sergeev:
e si prevede che la memoria debba essere completamente cancellata quando la maniglia viene chiusa?

Buon pomeriggio

Vi prego di indicarmi la direzione dello sviluppo del pensiero.

C'è un compito di distribuire i segnali all'interno di un computer (server) su molti terminali, ritardi critici di più di 1-3 ms.

implementato in un pacchetto di client-server, 1-2 conti lavoro accettabile e non appendere il terminale fatto lettura dalla memoria utilizzando Sleep(1) in un ciclo - se la memoria prende il valore necessario quindi eseguire qualche azione. Ma quando i terminali anche 5 terminali, 1 ms qui non è più fare a meno, altrimenti il raffreddatore sul processore inizia a ululare ...

Non ho seguito le novità per molto tempo, forse in mt5 ci sono eventi personalizzati simili a OnTrade in modo che possano essere collegati alla modifica della memoria.

Ho provato a leggere senza ritardi 100 000 cicli (8 byte ciascuno) in 670 ms.

... forse dovrei ridurre i dati a 4 byte.

... probabilmente c'è un'altra opzione per ricostruire la tua dll in modo che vada in loop all'interno - non restituendo i dati fino a quando non accettano i valori richiesti. ma come MT5 reagirà a un'attesa così lunga per il ritorno da una funzione esterna è un'altra domanda.

 
olyakish:

C'è un compito da svolgere per distribuire segnali all'interno di un computer (server) a molti terminali, ritardi di più di 1-3 ms sono critici.

implementato nel bundle client-server, 1-2 conti funzionano in modo accettabile e per non bloccare il terminale fatto leggere dalla memoria utilizzando Sleep(1) in un ciclo - se la memoria prende il valore necessario si esegue qualche azione. Ma quando i terminali anche 5 terminali, 1 ms qui non è fattibile altrimenti il raffreddatore sul processore inizia a ululare ...

Non ho seguito le novità per molto tempo, forse in mt5 ci sono eventi utente simili a OnTrade in modo che possano essere collegati alla modifica della memoria.

Nel tuo caso, solo il server ha il diritto di modificare la memoria. I clienti la leggono.

- Guardate in direzione di Pipe. lì gli "eventi" di arrivo dei dati sono realizzati come autoesplicativi - i dati sono disponibili, non ci sono dati, aspettiamo.

Certo, il server dovrà essere scritto o copiato da MSDN, ma i client già pronti possono essere utilizzati direttamente in MQL5.

Purtroppo, anche in questo caso non c'è modo di gestire la periodicità del polling. Sleep(1) in un numero tale di Expert Advisor non dovrebbe fare rumore nemmeno quando si lavora con la memoria. È necessario controllare la tempistica delle funzioni, forse ci sono passaggi e carichi extra da qualche parte.