Experts: Suivi des offres (exemple de cartographie)

 

Suivi des offres (exemple de cartographie):

Exemple d'utilisation d'une DLL pour travailler avec des fonctions de mappage de fichiers. Dans cet exemple, le conseiller expert lancé crée un fichier virtuel dans la mémoire et commence à mettre à jour la cotation du symbole dans ce fichier. Lorsque des conseillers experts sont lancés sur d'autres terminaux, ils ouvrent le fichier créé et commencent à y mettre à jour leurs cotations. Ainsi, les conseillers experts échangent leurs cotations par le biais d'un fichier commun.

Suivi des offres (exemple de cartographie)

Author: ---

 

Bonjour, je n'arrive pas à me connecter à partir d'un projet C++ Builder.

Je n'arrive pas à me connecter à partir d'un projet C++ Builder.

Voici le code

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 barre d'état indique 2 c'est à dire fichier non trouvé, j'ai essayé à la fois en ansi et en unicode d'envoyer le chemin d'accès au fichier.

Dans le fichier MT5, Expert Advisor a créé un fichier et met à jour les cotations dans ce fichier.

 

Si vous avez C++, pourquoi avez-vous décidé d'utiliser une DLL ?

Le code source est entièrement disponible ici.

 
sergeev:

Si vous avez C++, pourquoi avez-vous décidé d'utiliser une DLL ?

Le code source est entièrement disponible.

Je voulais utiliser une DLL prête à l'emploi.

pour qu'il n'y ait pas de problèmes avec MT4-5.

... Je vais essayer de voir le code source de la DLL.

 
olyakish:

Je voulais utiliser la dll prête à l'emploi.

pour qu'il n'y ait pas de problèmes avec le sparring dans MT4-5.

... Je vais essayer de voir le code source de la dll.

Quel est votre Windows ?
 
Dima_S:
Quel est votre Windows ?

win7x64

Je ne peux pas écrire en builder.

et je ne peux pas l'écrire comme ça.

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

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

J'ai d'abord essayé de me connecter

afxv_w32.h

ça n'a pas aidé

J'ai essayé de brancher afxwin.h en premier - ça n'a pas aidé non plus.

 
olyakish:

J'ai d'abord essayé d'insérer afxwin.h - cela n'a pas aidé non plus.

Cherchez une autre option : plugged afx.h
 
sergeev:
chercher le fichier afx.h connecté comme autre option.

Oui, donc c'est sans erreur, je vais essayer plus loin. Je vous remercie.

...

J'ai réussi, tout fonctionne.

Mais CloseHandle ne se ferme pas pour une raison quelconque.

J'ai un serveur dans l'exe (qui crée des mises à jour et devrait se fermer) et dans le terminal il y a un récepteur, donc après CloseHandle dans le serveur il voit l'objet échoué dans la mémoire.

 
olyakish:

J'ai un serveur dans l'écho (il le met à jour et le ferme) et un récepteur dans le terminal, donc après CloseHandle dans le serveur, il voit l'objet échoué dans la mémoire.

Pensez-vous que la mémoire devrait être complètement vidée lors de la fermeture d'un handle ?
 
sergeev:
et vous vous attendez à ce que la mémoire soit complètement effacée lorsque la poignée est fermée ?

Bonjour

Veuillez m'indiquer la direction du développement de la pensée.

Il s'agit de distribuer des signaux à l'intérieur d'un ordinateur (serveur) sur de nombreux terminaux, avec des délais critiques de plus de 1-3 ms.

La mise en œuvre dans un ensemble de client-serveur, 1-2 comptes fonctionnent acceptable et ne pas accrocher le terminal fait la lecture de la mémoire en utilisant Sleep(1) dans une boucle - si la mémoire prend la valeur nécessaire alors exécuter une certaine action. Mais lorsque les terminaux même 5 terminaux, 1 ms ici ne peut plus s'en passer, sinon le refroidisseur du processeur se met à hurler ?

Je n'ai pas suivi l'actualité depuis longtemps, peut-être que dans mt5 il y a des événements personnalisés similaires à OnTrade pour qu'ils puissent être liés à la modification de la mémoire.

J'ai essayé de lire sans délai 100 000 cycles (8 octets chacun) passe en 670 ms.

... je devrais peut-être réduire les données à 4 octets.

... Il y a probablement une autre option pour reconstruire votre dll afin de la boucler à l'intérieur - ne renvoyant pas les données jusqu'à ce qu'elles n'acceptent pas les valeurs requises. mais comment MT5 réagira à une attente aussi longue pour le retour d'une fonction externe est une autre question.

 
olyakish:

Il s'agit de distribuer des signaux à l'intérieur d'un ordinateur (serveur) à de nombreux terminaux, des délais de plus de 1-3 ms sont critiques.

Implémenté dans le bundle client-serveur, 1-2 comptes fonctionnent de manière acceptable et ne pas bloquer le terminal fait la lecture de la mémoire en utilisant Sleep(1) dans une boucle - si la mémoire prend la valeur nécessaire, nous effectuons une certaine action. Mais quand les terminaux sont même 5, 1 ms ici n'est pas faisable sinon le refroidisseur sur le processeur commence à hurler ...

Je n'ai pas suivi l'actualité depuis longtemps, peut-être que dans mt5 il y a des événements utilisateurs similaires à OnTrade pour qu'ils puissent être liés à la modification de la mémoire.

Dans votre cas, seul le serveur a le droit de modifier la mémoire, les clients la lisent.

- Regardez du côté de Pipe. Les "événements" d'arrivée des données y sont réalisés de manière explicite - s'il y a des données, nous les prenons, sinon, nous attendons.

Oui, le serveur devra être écrit ou copié à partir de MSDN, mais les clients prêts à l'emploi peuvent être utilisés directement dans MQL5.

Malheureusement, il n'y a aucun moyen de gérer la périodicité de l'interrogation ici non plus. Sleep(1) dans un tel nombre d'Expert Advisors ne devrait pas faire de bruit, même en travaillant avec la mémoire. Vous devez vérifier le timing des fonctions, peut-être qu'il y a des passes et des chargements supplémentaires quelque part.