Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
il ne s'agit pas de fermer l'enregistrement, mais de fermer et d'effacer le fichier.
c'est pourquoi
vous essayez d'ouvrir quelque chose qui n'existe plus.En examinant le code de la bibliothèque, j'ai vu que le fichier est supprimé non seulement lorsque la fonction Close() de la classe CMemMapFile est appelée directement, mais aussi lorsque le pointeur sur l'objet de cette classe est supprimé, parce que cette fonction est appelée dans le destructeur de la classe. Je suis un peu perplexe. Il s'avère que la méthode dynamique de création d'objets de classe ne peut pas être utilisée si l'écriture et la lecture d'un fichier sont utilisées dans des contextes d'appel différents (scopes). Par exemple, une carte du terminal écrit des données dans un fichier, la seconde lit des données et supprime ce fichier. Il s'avère que la variable objet doit toujours être conservée au niveau global, afin que le fichier ne soit pas supprimé de force. Il n'est pas non plus évident de savoir s'il est possible de ne pas spécifier la taille des données lues. En d'autres termes, nous connaissons la taille des données lorsque nous les écrivons, mais lorsque nous les lisons sur un autre graphique, il se peut que nous ne connaissions pas la taille des données à l'avance, comme c'est le cas, par exemple, pour les valeurs des chaînes de caractères. Il est probable que j'ai mal compris quelque chose ou qu'il y a quelque chose d'autre à régler dans la bibliothèque.
C'est une erreur. J'ai revérifié sans utiliser le pointeur et donc sans utiliser delete. Dans ce cas, en quittant le scope (depuis une fonction), la variable locale de l'objet de classe est détruite sans appel explicite au destructeur.
Il y a toujours un problème avec la taille des données reçues du côté du récepteur.
Merci à l'auteur pour la bibliothèque !
J'ai créé des fonctions pour transférer n'importe quelle donnée. Le script ci-dessous montre leur travail sur l'exemple des ticks
Résultat
Super ! Par analogie avec votre code, je me suis simplifié l'utilisation de la bibliothèque.
Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading
NamedPipes pour metatrader 4
fxsaber, 2017.11.30 14:18
Exchange_Data.mqh
PriceGiver.mq4
PriceTaker.mq4
Exécutez PriceGiver.ex4 et PriceTaker.ex4.
Résultat
La bibliothèque a une petite erreur dans la méthode CMemMapFile::Open. Elle devrait retourner le handle du fichier (type HANDLE64), mais à la place elle retourne 0 ou un code d' erreur.
De plus, les méthodes de lecture et d'écriture CMemMapApi::Write et CMemMapApi::Read, pour une raison quelconque, recopient deux fois les données (et les octets sont bouclés !), et de plus, le fichier est écrasé/lu dans son intégralité, alors que seule une partie spécifiée est requise.
En général, j'ai fait en sorte qu'ils aient l'air normaux, les choses inutiles sont commentées :
Pour que la première fonction compile, il faut mettre const pour les tableaux dans les fonctions memcpyX et memcpy, ce que l'auteur n'a pas pris la peine de faire.Erreur lors de la copie de grandes tailles, due à la transmission d'un zéro dans dwMaximumSizeHigh
Je l'ai corrigé comme suit :
Cette taille - 6 mb, se transfère sans problème :
Je l'ai corrigé comme suit :
Passer correctement les 4 premiers octets de la taille de 8 octets.
Ok, maintenant nous avons tous les raites dans le programme C# et nous pouvons analyser tout ce dont nous avons besoin en utilisant LINQ.
Mais il y a une question, comment organiser le mécanisme des commandes entre le terminal et l'application.
Depuis le terminal : nouvelle bougie, nouvelles règles - prendre le fichier
Depuis l'application : calcul terminé, prendre le résultat (dessiner sur le graphique, ouvrir une transaction).
Quelqu'un a-t-il de l'expérience dans ce type de mise en œuvre de l'interaction entre le terminal et le code ?
Ok, maintenant nous avons tous les raites dans un programme C# et nous pouvons utiliser LINQ pour tout analyser parfaitement.
Mais il y a une question, comment organiser le mécanisme des commandes entre le terminal et l'application.
Depuis le terminal : new candle, new rates - obtenir le fichier
Depuis l'application : calcul terminé, prendre le résultat (le dessiner sur le graphique, ouvrir une transaction).
Est-ce que quelqu'un a de l'expérience avec une telle implémentation de l'interaction entre le terminal et le code ?
Merci de m'indiquer ce qu'il faut faire dans cette situation.
1. j'ai ouvert un nouveau fichier en mémoire avec 100 octets.
2. J'ai écrit 100 octets dans ce fichier.
3. J'ai lu 100 octets dans un autre Expert Advisor. Tout se passe bien.
4. Maintenant, comment écrire 50 ou 200 octets dans le même fichier ?