Échange de données entre deux EAs fonctionnant dans des terminaux différents - page 2

 

Puisque l'EA gère l'événement sur une base tick-by-tick, j'ai opté pour cette direction.

La différence entre écrire l'un et lire l'autre à partir d'un tick, en théorie sur le tick suivant...

 

Une idée m'est venue, pourquoi ne pas échanger des données par le biais du registre ? Créer une clé, supprimer une clé, toutes les API pour cela semblent être là. Je ne sais pas à quel point c'est lent, mais il semble que la partie à laquelle accèdent les applications puisse toujours être en RAM.

Cela a-t-il déjà traversé l'esprit de quelqu'un ? Il ne fonctionne que pour les terminaux situés sur la même machine.

Je vais creuser dans cette direction :-).

 
Andres писал(а) >>

Une idée m'est venue, pourquoi ne pas échanger des données par le biais du registre ? Créer une clé, supprimer une clé, toutes les API pour cela semblent être là. Je ne sais pas à quel point c'est lent, mais il semble que la partie à laquelle accèdent les applications puisse toujours être en RAM.

Cela a-t-il déjà traversé l'esprit de quelqu'un ? Il ne fonctionne que pour les terminaux situés sur la même machine.

Je vais creuser dans cette direction :-).

Veuillez me donner un lien vers l'API pour travailler avec le registre.

Pour l'instant, j'envisage la variante basée sur l'échange d'informations via des fichiers sur disque. Les deux terminaux fonctionnent bien sûr sur le même ordinateur.

J'ai fait quelques tests, et il me semble que la vitesse est plus que suffisante pour échanger des données entre les terminaux en moins d'une seconde, ce qui me semble suffisant pour gérer les deux comptes (comptes ACHAT et VENTE).

Cependant, j'ai été très occupé au travail ces derniers temps, et je n'ai pas eu à m'occuper de ce problème depuis quelques semaines.

J'ai déjà demandé à un collègue programmeur, mais il m'a déconseillé de jouer avec le registre pour résoudre le problème. Il m'a fortement conseillé d'utiliser le partage de fichiers sur le disque dur.

C'est là que je me suis arrêté pour le moment. Dès que j'aurai assez de temps libre, j'essaierai de réaliser cette variante avec fichier.

 

http://yandex.ru/yandsearch?text=CreateFileMapping&stpar2=%2Fh0%2Ftm123%2Fs1&stpar4=%2Fs1

L'avantage est qu'il existe une référence à la mémoire partagée dans la dll.

Cette adresse peut être utilisée comme une adresse de structure. En outre, votre imagination est la seule limite :)

 
solandr >> :

Veuillez me donner un lien vers une API permettant de travailler avec le registre.

Exemple de lecture du registre.

 

J'ai déjà écrit une petite bibliothèque, et mes EA modifient déjà les informations par le biais du registre. En fait, ils sont modifiés par la RAM, pas de lecture-écriture sur le disque que je n'observe pas. Dans le MSDN, il est écrit qu'il est préférable de ne pas insérer des données de plus de quelques centaines de Ko dans le registre.

La bibliothèque est configurée de telle manière que toutes les clés et tous les paramètres sont créés dans la zone de registre temporaire et ne sont pas écrits dans le registre permanent. Après le redémarrage, ces clés ont disparu.

Un MAIS, la bibliothèque ne fonctionne qu'avec des paramètres de type chaîne de caractères, dont la longueur ne dépasse pas 255 caractères (limitation dans MQL). Mais c'est bien suffisant. En général, les paramètres dans le registre peuvent être de différents types, pas seulement des chaînes de caractères, mais pour l'instant, d'autres types ne sont pas nécessaires à mon avis. Pour l'instant, j'ai deux EA échangées par le biais du registre, mais d'autres peuvent être nécessaires :-). Une autre bonne chose est que dans Win API il est possible de se connecter au registre du réseau. Si quelqu'un a besoin d'échanger des informations entre des EA fonctionnant sur différents ordinateurs du même réseau, il peut regarder dans cette direction. A mon avis, il est rapide, simple et fiable, et sans aucune dll ni fichier. Vous mettez une chaîne, vous obtenez une chaîne.

#include "RegLib.mqh"

int hKey;

int init()
{
   // инициализируем дефайны
   InitRegDefines();

   // создаём тестовый ключ
   hKey = CreateKey( HKEY_CURRENT_USER, "!MT4TestKey" );

   // создаём поля по умолчанию
   SetStringValue( hKey, "Bid", "0.0" );
   SetStringValue( hKey, "Ask", "0.0" );

   return( 0 );
}

int start()
{
   // записываем цены в реестр
   SetStringValue( hKey, "Bid", DoubleToStr( Bid, Digits ) );
   SetStringValue( hKey, "Ask", DoubleToStr( Ask, Digits ) );

   // получаем цены в виде строк из реестра
   string BidStr = GetStringValue( hKey, "Bid" );
   string AskStr = GetStringValue( hKey, "Ask" );

   // выводим цены из реестра
   Print( "Bid = ", BidStr, " ", "Ask = ", AskStr );
}

int deinit()
{
   // закрываем ключ
   CloseKey( hKey );
   
   return( 0 );
}
Dossiers :
reglib.zip  4 kb
 
Andres писал(а) >>

Une idée m'est venue, pourquoi ne pas échanger des données par le biais du registre ? Créer une clé, supprimer une clé, toutes les API pour cela semblent être là. Je ne sais pas à quel point c'est lent, mais il semble que la partie à laquelle accèdent les applications puisse toujours être en RAM.

Cela a-t-il déjà traversé l'esprit de quelqu'un ? Il ne fonctionne que pour les terminaux situés sur la même machine.

Je vais creuser dans cette direction :-).

Vous pouvez également essayer de planter un clou avec une ampoule électrique. Cela fonctionne pour certaines personnes.

 
Integer >> :

Vous pouvez aussi essayer de planter un clou avec une ampoule électrique. Certaines personnes peuvent le faire.

Mais c'est beau, tu ne trouves pas ? Vous pouvez également essayer d'utiliser les variables du système d'exploitation.

 
granit77 писал(а) >>

Mais c'est magnifique, vous ne trouvez pas ? Vous pouvez également essayer d'utiliser les variables du système d'exploitation.

Vous pouvez également essayer de régler l'heure du système.

 
:))))))))))))))
Raison: